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

标签 c++ parsing serialization clang c-preprocessor

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

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

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

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 Serialised CursorKind.STRUCT_DECL
demo.h someTransientValue CursorKind.FIELD_DECL
demo.h aNumberToPersist CursorKind.FIELD_DECL

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

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

最佳答案

我可能会说:不是这样。

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

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

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

编辑:只是landed today ! Clang 现在将在其 AST 中保留所有属性(即使是它不理解的属性)。

关于c++ - 是否可以从 clang 的解析树中提取预处理器信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662540/

相关文章:

java - 为什么这个数字解析器不能正确解析 double ?

c# - 序列化/反序列化多个(不同类型的)对象

c++ - 通过引用传递对象函数

c++ - 需要帮助创建一个 24 分钟的时钟

c++ - 如何转发声明在命名空间中的类

c++ - 内联变量是否跨边界唯一?

java - 如何获取 XML 中特定标签的列表

xml - Android XML 解析省略 "&"

java - 如何使用特定注释将自定义序列化器设置为任意 API 端点(spring 应用程序)?

java - 删除android中json中的重复字段