前言

最近C++项目需要用到脚本,这就关系到如何绑定对象到脚本运行环境。因使用到多套脚本语言,所以现有的绑定技术,都不能满足需求。所以只能寻求解析C++的头文件,再根据描述进行绑定。起初发现boost有一套,但boost实在太臃肿了,对项目之后开发环境的搭建有一定要求。我力求最简明的项目管理,boost不太适合。自己写套吧。

正文

C++的语法格式总结

  • 除编译器指令#开头与函数外,均必须要求分号结尾
  • 代码块除单条语句的if、do/while、for都必须在大括号/花括号“{}”
  • 代码块有8种,命名空间,全局,类,结构,全局函数,成员函数,lambda,函数内无名代码块

    • 命名空间与全局相同,仅在声明前加“命名空间::”前缀
    • 类声明块与全局块的区别有,友元声明,成员访问权限
  • 模板支持类与函数
  • 函数与模板有参数列表
  • 分号结尾的声明可以是内置类型(int、double等)、类、模板类、typedef出来的类型、函数指针、lambda
  • 函数可以重名
  • 类的成员函数访问其他成员可以在此函数定义之后声明,并不像全局函数那样必须已经声明,所以用指针扫描一次C++文件是否合法是做不到的
  • 若是类化的枚举(enum class),不需要对声明所在范围可见,否则同时要把成员也同时添加到所属范围

我不打算支持的,对于需求没有必要性的

  • 命名空间
  • 模板
  • 函数体
  • 逗号分割的多个变量我不想很好的支持
  • 类型的校验
  • 默认参数
  • union
  • 枚举不判断名称冲突
  • lambda
  • 变量名不能以数字开始
  • 类的继承
  • 函数指针

开发的原则

  • 暂不跨平台,仅VS,不使用系统API这样适于修改为跨平台
  • 使用C++
  • iter只进不退
  • 遇到语法错误或文件结尾,抛异常
  • 遇到{则进入块处理
  • 处理;结尾的语言单元,函数必须自己处理完;及之前的内容再返回
  • 成员函数定义代码不分析,因为第一条原则做不到,成员函数可能会引用还未声明的其他成员函数
  • 不为最好的性能,但可以在这个结构上优化到极致
  • 不求完整解析,但在这个框架上可以做到解析全部c++11与更高的版本特性
  • 无注释,英文不好,中文注释又不适合全球化

结构描述

variant,method,type,comment,enumeration,enumeration_value从object继承,它们都可以属于全局或类或结构体。

document表示一个c++编译单元。

context表示一个上下文,是一个可以向上查找的队列。document完成解析后存储解析出来的变量、函数、类型。

reader,文件读取器,一个向前的char迭代器,可以用istreambuf_iterator<char>(ifstream)替代。

使用

main函数有_DEBUG宏保护,建议编译为库release使用。

#include <cpp_analysis.h>

try

{
 auto result = cpp_analysis::analysis("[cpp_header_file]");

 // todo

}
catch (logic_error& e)
{

// todo:
}

项目位置

https://github.com/FettLuo/cpp_analysis[新标签打开]

用C++对C++语法格式进行分析的更多相关文章

  1. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

  2. Lambda表达式的语法格式

    Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...

  3. IIS rewrite映射规则语法格式

    IIS rewrite映射规则语法格式,特殊符号:&请用& amp;代替,否则异常. <configuration> <system.webServer> &l ...

  4. bat 批处理获取时间语法格式

    bat 批处理获取时间语法格式 取年份:echo %date:~0,4%  取月份:echo %date:~5,2%  取日期:echo %date:~8,2%  取星期:echo %date:~10 ...

  5. 转载:2.2.2 配置项的语法格式《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19627.html 从上文的示例可以看出,最基本的配置项语法格式如下: 配置项名 配置项值1 配置项值2 - ; 下面解释一下配置项的 ...

  6. (转) at&T语法格式 与 at&T - intel格式对比

    原地址 示例: movl (%ebp), %eax, 等同于Intel格式中的 ] ,AT&T中,源操作数在左,目的操作数在右.“l”是Longword,相当于Intel格式中的dword p ...

  7. Atom打开txt文件中文乱码解决、指定文件的语法格式、win10中禁止睡眠

    1.Atom中文乱码解决 首先保证打开的txt文件的编码格式为UTF-8无BOM编码格式,可以使用Notepad++更改,如下图所示: 然后再在atom中打开文件,并右键点击文件内容的任意位置,Cha ...

  8. MySQL的DML常用语法格式

    MySQL的DML常用语法格式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道MySQL的查询大致分为单表查询,多表查询以及联合查询.多表查询,顾名思义,就是查询的结果可能 ...

  9. php正则表达式入门-常用语法格式

    php正则表达式入门-常用语法格式 原文地址:http://www.jbxue.com/article/24467.html 分享下php正则表达式中的一些常用语法格式,用于匹配字母.数字等,个人感觉 ...

随机推荐

  1. STL::sort函数实现

    声明:本文参考链接:STL::sort实现. 排序是面试中经常被问及的算法基础知识点,虽然实际应用中不会直接使用,但是理解这些简单的算法知识对于更复杂更实用的算法有一定的帮助,毕竟面试总不能问的太过深 ...

  2. IntelliJ IDEA中用Git插件操作

  3. app 性能

    Android App优化之性能分析工具 https://www.jianshu.com/p/da2a4bfcba68 -------------- 系列文: 背景:Android App优化, 要怎 ...

  4. Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 本来准备讲 Map集合 ,还是喜欢学到哪里总结吧.最近面试期准备准备,我是一员,成功被阿里在线笔试秒杀 ...

  5. 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...

  6. Docker 简述

    转自:https://cloud.tencent.com/developer/article/1354393 虚拟机和 docker 的区别,如下图: Image (镜像) 镜像不包含任何动态数据,其 ...

  7. linux 命令 — split

    split 按照数据大小和行数来分割文件 指定分割文件后缀 split -b 10k data.file 按照每个文件10k分割文件(默认使用字母作为后缀) split -b 10k data.fil ...

  8. 数据库性能测试:sysbench用法详解

    1.简介和安装 sysbench是一个很不错的数据库性能测试工具. 官方站点:https://github.com/akopytov/sysbench/ rpm包下载:https://packagec ...

  9. ZooKeeper系列(5):ZooKeeper的日志和快照

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper有两种日志.一种快照.日志分为事务日志和Zoo ...

  10. 翻译:DECLARE HANDLER语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:DECLARE HANDLER的译文. 原文:https://mariadb.com/kb/en/library/declare-handler/我提交到MariaDB官 ...