是否可以从 clang 的解析树中提取预处理器信息?
Is it possible to extract preprocessor information from clang's parse tree?
考虑以下简单的头,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中保留所有属性(即使是它不理解的属性)。
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 如何在预处理时读取文件