我想对C文件进行简单分析(例如,如果你以foo
为参数调用INT_TYPE
宏,然后将响应转换为int*
),我不想预处理文件,我只是想解析它(例如,我会有正确的行号)。
也就是说,我想从
获得#include <a.h>
#define FOO(f)
int f() {FOO(1);}
像
这样的令牌列表<include_directive value="a.h"/>
<macro name="FOO"><param name="f"/><result/></macro>
<function name="f">
<return>int</return>
<body>
<macro_call name="FOO"><param>1</param></macro_call>
</body>
</function>
无需设置包含路径等
有没有预先存在的解析器呢?我知道的所有解析器都假设C是经过预处理的。我想访问宏和实际包含说明。
答案 0 :(得分:1)
我们的C Front End可以解析包含preprocesser元素的代码,可以在合理范围内执行此操作,并且仍构建可用的AST。 (是的,解析树具有精确的文件/行/列号信息)。
有许多限制,允许它处理大多数代码。在少数情况下,它无法处理,通常是对源文件进行小的,简单的更改,从而提供等效的代码来解决问题。
这是一套粗略的规则和限制:
根据我们的经验,人们可以在几个小时内修改50,000行的代码库来解决这些问题。虽然这看起来很烦人(而且确实如此),但替代方案是根本无法解析源代码,这比烦人的要糟糕得多。
您还需要的不仅仅是解析器。请参阅Life After Parsing,了解成功获取解析树后会发生什么。我们在构建符号表方面做了一些额外的工作,其中声明是使用嵌入它们的预处理器上下文记录的,从而使类型检查能够包含预处理器条件。
答案 1 :(得分:0)
您可以查看此ANTLR grammar。但是,您必须为预处理程序令牌添加规则。
答案 2 :(得分:-1)