嗨,我正在使用 clang 从 c 文件中提取信息。我正在尝试提取宏的值。
例如,我想要值'13'或ast(+(* 3 4)1):
#define SOME_CONSTANT 3*4+1
或从宏函数,我想要一个 ast 例如 (SOME_MACROFUNC (xy) (+ (add4 x) (* y 9))) :
int add4(int q) {return q+4;}
#define SOME_MACROFUNC(x,y) add4(x)+y*9
到目前为止,我已经设法通过“预处理器”类的 macro_begin() 和 macro_end() 函数遍历所有宏。
然后我得到了宏名称,并且从“MacroInfo”类中我能够得到宏是否是函数式的(包括参数名称)。我还可以访问宏中的标记,但我只能获取标记类型,例如:string_literal、标识符、逗号、l_paren、r_paren 等。
所以有两件事:
我如何访问代币的实际价值,而不仅仅是它们的种类。
有没有办法从给定令牌的宏中生成 ast?我认为的一种方法是解析我的源代码,然后提取宏,并使用它们的名称,将包括这些宏的代码添加到我的源代码中,然后重新解析它以获得 ast。
例如:
char *tempSOME_CONSTANT = SOME_CONSTANT;
void tempSOME_MACROFUNC(char *x, char *y) {SOME_MACROFUNC(x,y);}
虽然这种方法看起来真的很hacky,并且可能会遇到不是语句或表达式的宏的问题。
谢谢。
编辑:澄清我主要想要每个宏的扩展主体(直到没有宏,只有非宏标记)。
edit2 解决了一些问题:
如果有人感兴趣,我打算手动扩展宏的主体。
"preprocessor.getSpelling(token)" 获取令牌值。
“preprocessor.getIdentifierTable().get(StringRef(spelling))”获取令牌的 identinfo。
并使用“clang\lib\Lex\PPMacroExpansion.cpp”作为参考。
仍在考虑如何在不重新解析整个源代码树的情况下将其传递给解析器,但这应该不难弄清楚。
感谢 Ira Baxter 的讨论,它帮助我解决了这个问题。