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

Gea*_*phy 6 c++ serialization parsing clang c-preprocessor

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

#define PERSIST
struct Serialised
{
    int someTransientValue ;
    PERSIST int aNumberToPersist ;
};
Run Code Online (Sandbox Code Playgroud)

我使用以下代码和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)
Run Code Online (Sandbox Code Playgroud)

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

demo.h序列化CursorKind.STRUCT_DECL
demo.h someTransientValue CursorKind.FIELD_DECL
demo.h aNumberToPersist CursorKind.FIELD_DECL

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

Xubuntu 12.04,clang 3.1版(标签/ RELEASE_31/final),目标:x86_64-unknown-linux-gnu线程模型:posix.

Mat*_* M. 5

我可能会说:不是这样。

宏本身不在AST中表示。类型,属性等……所有具有语义值的元素都被表示(和注释),并且您可以选择查询其中某些元素是否从宏扩展而来,并获得原始的宏拼写;但是宏本身根本不会出现在AST中。

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

不幸的是,我不知道您是否需要教Clang有关您的属性的信息,以便它们在AST中表示出来(Michael Han一直在努力记住它们)。无论如何,您可能会在Clang DEV邮件列表中获得更多有用的答案(不幸的是,没有Clang Users邮件列表)。

编辑今天降落!Clang现在将在其AST中保留所有属性(甚至包括它不了解的属性)。