antlr4 - 使用 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
等处理,但我无法处理条件和宏函数,因为我不确定如何处理它们。
提前致谢!
解决方案
这个问题几乎是题外话,因为它要求外部资源。但是,它也有值得关注的部分。
术语“预处理器”已经表明宏等的处理是关于什么的。解析器永远不会看到输入的禁用部分,这也意味着它可以是任何东西,这可能不是要解析的实际语言的一部分。因此,解析类 C 语言的一个好方法是通过预处理器(可以是专门的输入流)发送输入,以去除所有预处理结构,解析宏并删除禁用的文本。解析位置不是问题,因为您可以在打开新输入流之前推送当前标记位置,并在完成后恢复它。将报告的错误与您的输入流堆栈一起存储。这样您就可以保持正确的令牌位置。我已经在我的Windows 资源文件解析器中使用了这种方法。
推荐阅读
- python - 带单选按钮的委托
- reactjs - 在 reducer 之后调用 Redux 中间件
- rust - 如何使用将引用作为回调的 Rust 异步 fn?
- reactjs - 打字稿:如何将属性“类型”添加到从 React.forwardRef 返回的函数中
- wordpress - 为 .html 页面设置 301 重定向 Wordpress
- c++ - 奇怪的错误 C2039:'newFUN':无法在 DLL 类中添加新成员函数
- javascript - 如何找出哪个包正在使用 UNSAFE componentWillMount 方法?
- php - DataTable分页不适用于codeigniter
- azure - Azure Active Directory 应用程序无法按预期工作,策略不是默认的“真”到 org
- android - Android Studio 物理设备连接问题