【发布时间】:2011-05-03 03:59:56
【问题描述】:
我正在尝试使用我的定制解析器(以c++ 编写)分析c++ 文件。在开始解析之前,我想摆脱所有#define。我希望源文件在预处理后可以编译。所以最好的方法是在文件上运行C Preprocessor。
cpp myfile.cpp temp.cpp
// or
g++ -E myfile.cpp > templ.cpp
[欢迎提出新建议。]
但是由于这个原因,原始行及其行号将丢失,因为文件还将包含所有标题信息,我想保留行号。所以我决定的出路是,
- 在前面添加一个特殊符号 源文件中的每一行(预处理器除外)
- 运行预处理器
- 提取带有特殊字符的行 符号并分析它们
例如,典型的源文件如下所示:
#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@};
一旦所有的宏和 cmets 被删除,我将留下数千行,其中几百行将是原始源代码。
这种方法正确吗?我错过了任何角落案例吗?
【问题讨论】:
-
你想完成什么?
-
@Michael,我想从源文件中删除宏(即
#define),然后再开始使用解析器分析它们。 -
我也不知道你的最终目标是什么。出于学术目的,您可能想看看 Clang 前端 (clang.llvm.org),它采用模块化设计,您可以将其集成到其他应用程序/工具中。
-
@Julio,不用于学术目的。解析完成后,我将以某种方式修改源代码。但是,解释所有内容将是太多了。我希望至少我的问题是解释性的。如果我遗漏了什么,请告诉我。
-
@iammilind:除非这是出于学术目的,否则我认为尝试编写自己的 C++ 前端有点疯狂。大量的东西,比如模板实例化和依赖于参数的查找,要正确实现可能非常复杂,并且至少有两个优秀且免费可用的 C++ 前端可供您使用(
g++和 LLVM 的clang),每个其中有 数百万 小时的开发时间,并且仍然经常包含严重的错误。