预处理后解析C ++源文件
我正在尝试使用我自定义的解析器(用c++
编写)来分析c++
文件。 在开始解析之前,我想摆脱所有#define
。 我希望在预处理后可以编译源文件。 因此,最好的方法是在文件上运行C Preprocessor
。
cpp myfile.cpp temp.cpp // or g++ -E myfile.cpp > templ.cpp
[欢迎提出新建议。]
但由于这个原因,原始行和它们的行号将丢失,因为文件也将包含所有标题信息,我想保留行号。 所以我决定的出路是,
- 在源文件中的每一行之前添加一个特殊符号(预处理器除外)
- 运行预处理器
- 用该特殊符号提取线条并进行分析
例如,典型的源文件将如下所示:
#include #include"xyz.h" int x; #define SOME value /* ** This is a test file */ typedef char* cp; void myFunc (int* i, ABC<int, X > o) { //... } class B { };
添加符号之后就会像,
#include #include"xyz.h" @3@int x; #define SOME value @5@/* @6@** This is a test file @7@*/ @8@typedef char* cp; @9@ @10@void myFunc (int* i, ABC<int, X > o) @11@{ @12@ //... @13@} @14@ @15@class B { @16@};
一旦删除了所有的宏和注释,我将留下数千行,其中几百个将是原始源代码。
这种方法是否正确? 我错过了任何角落案件吗?
您意识到g ++ -E会在其输出中添加一些自己的行,这些行指示原始文件中的行号? 你会找到像这样的行
# 2 "foo.cc" 2
这表明你正在查看文件foo.cc的第2行。 只要常规的行序列被中断,就会插入这些行。
过去与X11源一起使用的imake
程序使用了一个非常相似的系统,用@@
标记行的末尾,以便它可以正确地对它们进行后处理。
gcc -E
的输出通常包括#line
指令; 你也许可以用它们代替你的符号。