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

时间:2011-05-03 03:59:57

标签: c++ c parsing

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

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

[欢迎提出新建议。]

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

  1. 之前添加特殊符号 源文件中的每一行(预处理器除外)
  2. 运行预处理器
  3. 用特殊的线条提取线条 符号并分析它们
  4. 例如,典型的源文件如下所示:

    #include<iostream>
    #include"xyz.h"
    int x;    
    #define SOME value
    /*
    **  This is a test file
    */
    typedef char* cp;
    
    void myFunc (int* i, ABC<int, X<double> > o)
    {
      //...
    }
    
    class B {
    };
    

    添加符号后,就像是,

    #include<iostream>
    #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<double> > o)
    @11@{
    @12@  //...
    @13@}
    @14@
    @15@class B {
    @16@};
    

    删除所有宏和注释后,我将留下数千行,其中几百个将是原始源代码。

    这种做法是否正确?我错过了任何一个角落?

2 个答案:

答案 0 :(得分:3)

你意识到g ++ -E会在其输出中添加一些自己的行,这些行指示原始文件中的行号?你会找到像

这样的行
# 2 "foo.cc" 2

表示您正在查看文件foo.cc的第2行。只要常规的行序列中断,就会插入这些行。

答案 1 :(得分:1)

以前使用X11源的imake程序使用了一个非常相似的系统,用@@标记行的末尾,以便它可以正确地对它们进行后处理。

gcc -E的输出通常包括#line指令;你也许可以用它们代替你的符号。