gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:19:38 26 4
gpt4 key购买 nike

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

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

[欢迎提出新建议。]

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

  1. 在前面加一个特殊符号源文件中的每一行(预处理器除外)
  2. 运行预处理器
  3. 提取具有特殊意义的行符号并分析它们

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

#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@};

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

这种方法是否正确?我是否遗漏了任何角落案例?

最佳答案

你意识到 g++ -E 将它自己的一些行添加到它的输出中,这些行指示原始文件中的行号吗?你会发现像这样的行

# 2 "foo.cc" 2

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

关于c++ - 预处理后解析 C++ 源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5864858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com