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.
我可能会说:不是这样。
宏本身不在AST中表示。类型,属性等……所有具有语义值的元素都被表示(和注释),并且您可以选择查询其中某些元素是否从宏扩展而来,并获得原始的宏拼写;但是宏本身根本不会出现在AST中。
如果可以的话,用新属性扩展 Clang 可能会更有趣,尤其是在C ++ 11:中。C ++ 11要求编译器忽略他们不知道的属性,因此通过“命名”自己的属性,您几乎可以保证只有您会关心它们的含义。[[gearoid::persist]]
不幸的是,我不知道您是否需要教Clang有关您的属性的信息,以便它们在AST中表示出来(Michael Han一直在努力记住它们)。无论如何,您可能会在Clang DEV邮件列表中获得更多有用的答案(不幸的是,没有Clang Users邮件列表)。
编辑:今天刚降落!Clang现在将在其AST中保留所有属性(甚至包括它不了解的属性)。
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |