[英]Parsing C files without preprocessing it
我想对C文件运行简单的分析(例如,如果你用INT_TYPE
作为参数调用foo
宏,然后将响应转换为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是经过预处理的。 我想访问宏和实际包含指令。
我们的C前端可以解析包含preprocesser元素的代码,可以在相当程度上做到这一点,并且仍然构建一个可用的AST。 (是的,解析树具有精确的文件/行/列号信息)。
有许多限制,允许它处理大多数代码。 在少数情况下,它无法处理,通常是对源文件的一个小的,简单的更改,给出等效的代码解决了问题。
这是一套粗略的规则和限制:
根据我们的经验,人们可以在几个小时内修改50,000行的代码库来解决这些问题。 虽然这看起来很烦人(而且确实如此),但替代方案是根本无法解析源代码,这比烦人的要糟糕得多。
您还需要的不仅仅是解析器。 请参阅解析后的生活 ,了解成功获取解析树后会发生什么。 我们在构建符号表方面做了一些额外的工作,其中声明是使用嵌入它们的预处理器上下文记录的,从而使类型检查能够包含预处理器条件。
你可以看看这个ANTLR语法 。 但是,您必须为预处理程序令牌添加规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.