是否可以从 clang 的解析树中提取预处理器信息?

Is it possible to extract preprocessor information from clang's parse tree?

本文关键字:提取 预处理 处理器 信息 clang 是否      更新时间:2023-10-16

考虑以下简单的头,demo.h:

#define PERSIST
struct Serialised
{
int someTransientValue ;
PERSIST int aNumberToPersist ;
};

我使用以下代码和Clang的python API来迭代头:

import sys, clang.cindex
def callexpr_visitor(node, parent, userdata):
if node.location.file: print node.location.file, node.displayname, node.kind
return 2
tu = clang.cindex.Index.create().parse(sys.argv[1], args=['-x', 'c++'])
clang.cindex.Cursor_visit(tu.cursor, clang.cindex.Cursor_visit_callback(callexpr_visitor), None)

这打印出Clang的AST的元素,产生以下输出:

demo.h串行化游标类型.STRUCT_DECL
demo.h someTransientValue游标类型.FIELD_DECL
demo.h aNumberToPersist游标类型.FIELD_DECL

有人知道我如何提取与名为"aNumberToPersist"的成员变量关联的预处理器声明吗?,有没有更好的方法可以在解析树中清楚地显示变量的"标记"?

Xubuntu 12.04,clang 3.1版(标签/RERELEASE_31/final),目标:x86_64-unknown-linux-gnu螺纹型号:posix。

我可能会说:不是这样。

宏本身不在AST中表示。类型、属性等。所有具有语义值的元素都表示(和注释),您可以查询其中一些元素是否是从宏中扩展的,并恢复原始宏拼写;然而宏本身根本没有出现在AST中。

如果可以的话,用新的属性扩展Clang可能会更有趣,尤其是在C++11:[[gearoid::persist]]中。C++11要求编译器忽略他们不知道的属性,所以通过"命名"自己的属性,你几乎可以保证只有你才会关心它们的含义。

不幸的是,我不知道你是否需要教Clang你的属性,让它们在AST中表现出来(Michael Han正在努力记住它们)。无论如何,您可能会在Clang DEV邮件列表中得到更多有用的答案(不幸的是,没有Clang Users邮件列表)。

编辑:今天刚刚登陆!Clang现在将在AST中保留所有属性(即使是它不理解的属性)。