用C++对C++语法格式进行分析
前言
最近C++项目需要用到脚本,这就关系到如何绑定对象到脚本运行环境。因使用到多套脚本语言,所以现有的绑定技术,都不能满足需求。所以只能寻求解析C++的头文件,再根据描述进行绑定。起初发现boost有一套,但boost实在太臃肿了,对项目之后开发环境的搭建有一定要求。我力求最简明的项目管理,boost不太适合。自己写套吧。
正文
C++的语法格式总结
- 除编译器指令#开头与函数外,均必须要求分号结尾
- 代码块除单条语句的if、do/while、for都必须在大括号/花括号“{}”
- 命名空间与全局相同,仅在声明前加“命名空间::”前缀
- 类声明块与全局块的区别有,友元声明,成员访问权限
- 模板支持类与函数
- 函数与模板有参数列表
- 分号结尾的声明可以是内置类型(int、double等)、类、模板类、typedef出来的类型、函数指针、lambda
- 函数可以重名
- 类的成员函数访问其他成员可以在此函数定义之后声明,并不像全局函数那样必须已经声明,所以用指针扫描一次C++文件是否合法是做不到的
- 若是类化的枚举(enum class),不需要对声明所在范围可见,否则同时要把成员也同时添加到所属范围
代码块有8种,命名空间,全局,类,结构,全局函数,成员函数,lambda,函数内无名代码块
我不打算支持的,对于需求没有必要性的
- 命名空间
- 模板
- 函数体
- 逗号分割的多个变量我不想很好的支持
- 类型的校验
- 默认参数
- 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++语法格式进行分析的更多相关文章
- Oracle Update 语句语法与性能分析 - 多表关联
Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...
- Lambda表达式的语法格式
Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...
- IIS rewrite映射规则语法格式
IIS rewrite映射规则语法格式,特殊符号:&请用& amp;代替,否则异常. <configuration> <system.webServer> &l ...
- bat 批处理获取时间语法格式
bat 批处理获取时间语法格式 取年份:echo %date:~0,4% 取月份:echo %date:~5,2% 取日期:echo %date:~8,2% 取星期:echo %date:~10 ...
- 转载:2.2.2 配置项的语法格式《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19627.html 从上文的示例可以看出,最基本的配置项语法格式如下: 配置项名 配置项值1 配置项值2 - ; 下面解释一下配置项的 ...
- (转) at&T语法格式 与 at&T - intel格式对比
原地址 示例: movl (%ebp), %eax, 等同于Intel格式中的 ] ,AT&T中,源操作数在左,目的操作数在右.“l”是Longword,相当于Intel格式中的dword p ...
- Atom打开txt文件中文乱码解决、指定文件的语法格式、win10中禁止睡眠
1.Atom中文乱码解决 首先保证打开的txt文件的编码格式为UTF-8无BOM编码格式,可以使用Notepad++更改,如下图所示: 然后再在atom中打开文件,并右键点击文件内容的任意位置,Cha ...
- MySQL的DML常用语法格式
MySQL的DML常用语法格式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道MySQL的查询大致分为单表查询,多表查询以及联合查询.多表查询,顾名思义,就是查询的结果可能 ...
- php正则表达式入门-常用语法格式
php正则表达式入门-常用语法格式 原文地址:http://www.jbxue.com/article/24467.html 分享下php正则表达式中的一些常用语法格式,用于匹配字母.数字等,个人感觉 ...
随机推荐
- Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)
不多说,直接上干货! 首先你需要一个Github账号,所以还没有的话先去注册吧! https://github.com/ 见 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件 ...
- jquery的jsonp的使用
客户端 $(function(){ $.ajax({ type: "get", async: false, url: "http://test.com/json_data ...
- Java——static关键字
前言 static关键字算是Java中比较复杂的关键字之一,它可以修饰变量.方法.类以及代码块.下面将介绍static的具体使用. static引入的目的 static的作用 static修饰变量 s ...
- SpringMVC学习(四)———— 数据回显与自定义异常处理器
一.数据回显技术 Springmvc默认支持对pojo类型的数据回显,默认不支持简单类型的数据回显 1.1.什么是数据回显? 在信息校验时,如果发生校验错误,那么把校验的数据信息,依然停留在当前页面, ...
- FMDB源码解析
上一篇博客讲述SQLite的使用,本篇将讲述FMDB源码,后面也会讲解SQLite在使用与FMDB的区别.本篇读下来大约20-30分钟,建议大家先收藏一下. FMDB是以OC方式封装SQLite中C语 ...
- IIS应用程序池_缓存回收
本人最近由于公司业务,需要把问卷的问题和答案存入缓存中已提高问卷加载速度,减少数据库压力. 缓存关键代码(公司代码已做封装,这里只贴出关键代码): HttpRuntime.Cache.Insert(k ...
- curl模拟请求常用参数
封装一个curl模拟浏览器请求的函数,如下: /** * curl模拟浏览器请求 * @param unknown $url 请求的地址 * @param array $params 请求地址所需要的 ...
- mysql全文索引之模糊查询
旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息大家可以随时关注官网, ...
- (6)Microsoft office Word 2013版本操作入门_文件封面,页首,页尾
1插入封面: 1.1光标移动到首段,按住 Ctrl+Enter键可以插入一个新页面. 1.2 插入--->封面 可以在封面插入一个文件封面,里面的图片可以自己修改,文字标题也可以自己修改. 1. ...
- js数据类型有哪些,js属性和方法的归属,
1.js的数据类型有哪些? 2.全局方法和全局属性? 一 1.js的本质就是处理数据,数据来自后台的数据库.所以变量就起到一个临时存储数据的作用. ECMAScript 制定了js的数据类型. 数据类 ...