问题描述
c++宏定义文件中关键字有#define, #undef #ifndef, #ifdef, #else,#endif, 处理注释,//,/*,*/, 解析文件,输出其中的宏定义
分析思路
文本分析基础是字符串处理,宏定义文件的处理需要对遇到的关键字执行特殊的处理。
文件定义的中间数据结构用嵌套列表,宏定义主要是顺序结构和分支结构,顺序结构好理解,一个宏定义作为一个字典,字典作为列表的元素;对于分支结构,用子列表表示它,这个子列表的结构如下
[
{ {'id': 1},{'parent': 0}, {'pos':0}}, # id给当前子列表编号,parent是子列表的父列表编号,pos是当前处理分支的左右分支,true是左,标记为1;false是右,标记为2.
{'macro_key': ''}, #macro_key是当前分支结构的条件
[], #表示左子列表
[],#表示右子列表
]
这样表示后,再定义当前分支子列表branch(这里利用了python的引用特征),当前列表编号node_id,父列表编号parent_id,左右分支位置pos,辅助对嵌套列表的遍历。
存储宏定义的格式是宏定义字典,键是宏名,值是宏定义值。还有一个辅助数据结构,预定义宏名列表,用于记录预定义的宏名。
下面对遇到的不同关键字作不同的分析:
1. 对注释的处理
注释有三种,//&#x