【问题标题】:Is it possible to extract preprocessor information from clang's parse tree?是否可以从 clang 的解析树中提取预处理器信息?
【发布时间】:2012-09-21 16:02:42
【问题描述】:

考虑以下简单的头文件 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 序列化 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。

【问题讨论】:

  • 以防万一您没有收到关于答案更改的通知(我记不得了),从今天开始,由于Michael Han 的提交,Clang 的主干版本将保留所有已解析的属性。
  • 太棒了!谢谢你的记忆:)

标签: c++ parsing serialization clang c-preprocessor


【解决方案1】:

我可能会说:不是这样的。

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

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

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

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

【讨论】:

  • 根据clang's status page,clang 尚未实现通用属性。
  • @DietmarKühl:我必须承认,我不知道这是否意味着 Clang 的主干版本将拒绝未知属性,或者 Clang 是否无法解析该提案要插入它们的所有位置的属性.
  • @DietmarKühl:谢天谢地,看起来Michael Han 正在处理这个问题。显然 Clang 需要在两个方面都取得进展:未知属性被丢弃在地板上,并且属性不允许出现在任何可能出现的地方。
  • @DietmarKühl:Michael 的工作landed today,属性现在被解析(虽然被忽略了)。我不认为它完全涵盖了它们可能出现的所有地方,但这绝对是一个好的开始。
  • 虽然新闻很有趣,但我怀疑这个答案是模棱两可的;对我来说,它建议所有 C++11 属性都保存在 AST 中,无论它们是否被 clang 识别,也就是说,即使它们触发“未知属性 'xxx' 被忽略”警告。然而,一些实验表明情况并非如此。因此,我问了follow-up question,希望可以澄清这个问题。 (我选择不附加到这个讨论中,因为最初的问题涉及宏,而不是属性。)
猜你喜欢
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多