Heim  >  Artikel  >  Backend-Entwicklung  >  用C++对C++语法格式进行分析

用C++对C++语法格式进行分析

高洛峰
高洛峰Original
2016-11-21 11:50:301445Durchsuche

前言

最近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(ifstream)替代。

 

使用

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

#include

try

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

 // todo

}
catch (logic_error& e)
{

// todo:
}

项目位置

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

 


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn