首页 > 解决方案 > 使用 ANTLR 创建 C 和 C++ 预处理器

问题描述

我想创建一个可以基于配置文件分析 C 和 C++ 代码并检测不需要的行为的工具。我考虑过使用 ANTLR 来完成这项任务,因为几年前我已经用它从头开始创建了一个简单的编译器(变量、条件、循环和函数)。

我从 ANTLR 语法库中获取了 C.g4 和 CPP14.g4。但是,我注意到它们不支持预处理解析,因为这是编译中的不同步骤。

我试图找到一个可以执行预处理部分(更新到 ANTLR4)的语法,但没有成功。此外,我还了解到,如果我使用两步解析,我将无法保留每个字符的原始位置,因为我已经修改了输入流。

我想知道是否有一个好的 ANTLR 语法或程序(最好是 Python,但也可以处理其他语言)可以帮助我预处理 C 代码。我也考虑过使用gcc -E,但是我将无法检查宏定义(例如,我想警告用户是否使用了#pragma GCC(我大学的一些学生,我为此编写了这个程序,用它来绕过一些课程编码风格限制)。此外,gcc -E将包含库头内容,我不想处理。

因此,我的问题是,您是否可以向我推荐一个可用于预处理 C 和 C++ 代码的语法/程序。或者,如果你能指导我如何自己创建一个完美的语法。我能够编写基本#define#pragma等处理,但我无法处理条件和宏函数,因为我不确定如何处理它们。

提前致谢!

标签: antlr4preprocessor

解决方案


这个问题几乎是题外话,因为它要求外部资源。但是,它也有值得关注的部分。

术语“预处理器”已经表明宏等的处理是关于什么的。解析器永远不会看到输入的禁用部分,这也意味着它可以是任何东西,这可能不是要解析的实际语言的一部分。因此,解析类 C 语言的一个好方法是通过预处理器(可以是专门的输入流)发送输入,以去除所有预处理结构,解析宏并删除禁用的文本。解析位置不是问题,因为您可以在打开新输入流之前推送当前标记位置,并在完成后恢复它。将报告的错误与您的输入流堆栈一起存储。这样您就可以保持正确的令牌位置。我已经在我的Windows 资源文件解析器中使用了这种方法。


推荐阅读