用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正则表达式中的一些常用语法格式,用于匹配字母.数字等,个人感觉 ...
随机推荐
- Oracle客户端连接数据库配置
配置文件和路径 配置文件:tnsnames.ora 默认路径:%ORACLE_HOME%\network\admin\tnsnames.ora,%ORACLE_HOME%通常在环境变量中使用. 我的路 ...
- deque源码2(deque迭代器、deque的数据结构)
deque源码1(deque概述.deque中的控制器) deque源码2(deque迭代器.deque的数据结构) deque源码3(deque的构造与内存.ctor.push_back.push_ ...
- Nexus私服搭建
maven私服的搭建 --> maven -->{ 1,本地仓库(从中央仓库下载保存到本地的或者自己到网上下载的jar文件包) 2,远程仓库 -->{ 1,中央仓库(maven官方j ...
- [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 1.1 前言 说起String,大家最熟悉不 ...
- 【原创】Python第二章——字符串
字符串是一个字符序列,(提醒:序列是Python的一个重要的关键词),其中存放UNICODE字符.Python中的字符串是不可变的(immutable),即对字符串执行操作时,总是产生一个新的字符串而 ...
- Mycat - 高可用与负载均衡实现,满满的干货!
前言 开心一刻 和朋友去吃小龙虾,隔壁桌一个小女孩问妈妈:"妈妈,小龙虾回不了家,它妈妈会不会着急?" 她妈妈愣住了,我扒虾的手停下了,这么善良的问题,怎么下得了口.这是老板急忙过 ...
- 【学习笔记】node.js重构路由功能
摘要:利用node.js模块化实现路由功能,将请求路径作为参数传递给一个route函数,这个函数会根据参数调用一个方法,最后输出浏览器响应内容 1.介绍 node.js是一个基于Chrome V8引擎 ...
- JAVA课程设计——一个简单的教务人事管理系统
大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...
- SpringCloud学习(一):微服务简介
一.前情概要 1.单体架构是什么 1).一个归档包包含了应用所有功能的应用程序, 我们通常称之为单体应用. 2).架构单体应用的架构风格, 我们称之为单体架构, 这是一种比较传统的架构风格. 2.单体 ...
- Spark学习(一)
一.启动Spark 1.standalone模式 方法一: (1)启动主节点 ./sbin/start-master.sh 访问http://127.0.0.1:8080,得到如下页面 注意标记到的链 ...