预处理后解析C ++源文件

我正在尝试使用我自定义的解析器(用c++编写)来分析c++文件。 在开始解析之前,我想摆脱所有#define 。 我希望在预处理后可以编译源文件。 因此,最好的方法是在文件上运行C Preprocessor

 cpp myfile.cpp temp.cpp // or g++ -E myfile.cpp > templ.cpp 

[欢迎提出新建议。]

但由于这个原因,原始行和它们的行号将丢失,因为文件也将包含所有标题信息,我想保留行号。 所以我决定的出路是,

  1. 在源文件中的每一行之前添加一个特殊符号(预处理器除外)
  2. 运行预处理器
  3. 用该特殊符号提取线条并进行分析

例如,典型的源文件将如下所示:

 #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指令; 你也许可以用它们代替你的符号。