【问题标题】:Can I get an XML AST dump of C/C++ code with clang without using the compiler?我可以在不使用编译器的情况下使用 clang 获取 C/C++ 代码的 XML AST 转储吗?
【发布时间】:2011-07-15 15:06:13
【问题描述】:

我成功地使用 cmake 和 Visual Studio 10 为 windows 编译了 clang。我想获得一个 XML 文件作为源代码的 AST 表示。有一个选项可以在 linux (ubuntu) 下使用 gcc 提供结果,但在 windows 框上不起作用:

clang -cc1 -ast-print-xml source.c

但是,这是调用编译阶段(我想避免)。就我对clang很陌生,挖掘源代码对我没有帮助。我可以使用以下方法生成 AST 的二进制版本:

clang -emit-ast source.c

不幸的是,这种格式不能直接用于解析。是否有一些现有的方法可以直接生成 XML 树而不是 clang 中的二进制树?

目标是在 .NET 环境中的其他工具中使用 XML 表示,因此我需要围绕本机 clang 库进行一些包装以访问二进制 AST。如果有人已经为 .NET 编写了一些二进制 clang AST 解析器,也许还有第三种选择?

如果clang前端生成的AST不等同于编译阶段生成的AST,我是否可能遗漏了一些东西。

【问题讨论】:

  • 我的公司构建 C++ 前端,我们可以发出 AST 的完整 XML 转储。我们将此作为复选框项目,因为人们要求它。没有人真正使用它,因为真正的 C++ 程序(包括所有头文件)的输出量简直是巨大,这使得处理起来既慢又笨拙。真正的问题是,你为什么要这样做? Clang 可能已经提供了大量的机制来直接处理 C++ AST(就像我们相应的工具一样);你为什么要尝试复制所有这些工作?为什么不将 Clang 用于您的目的?
  • ... 在stackoverflow.com/a/17393852/120163 上查看 C++ 树转储。这不是 XML,但该工具也可以生成具有完全相同内容的 XML。

标签: xml clang code-generation abstract-syntax-tree


【解决方案1】:

请注意,Douglas Gregor(CLang FrontEnd 负责人)已从 2.9 版本中删除了 XML 打印机。

问题在于缺少 XML 打印机。许多 AST 节点从未在打印机中实现,以及一些节点的一些属性,导致源代码的表示不准确。

Douglas 提出的另一点是,输出不应该适合调试 CLang 本身(这就是 -emit-ast 的含义),而是适合外部工具使用。这要求输出从一个版本到另一个版本是稳定的。值得注意的是,它不应该是 CLang 内部的一对一映射,而是将源代码翻译成标准化语言。

除非打印机有大量工作(需要志愿者),否则它不会被集成回来...

【讨论】:

  • 有趣的是-emit-ast 漂亮地打印类型而不是表示它们的结构,因此绝对没用。只有使用 xml 打印机才能调试和自动验证声明中的类型。
  • @SK-logic:由于 xml 不再是一个选项,我们可能会看到 -emit-ast 行为的改进。
  • 感谢您提供所有这些有趣的信息。我将看看旧的 xml 打印机,并尝试看看我是否可以用它做一些有用的东西供我自己使用。有一些通用/标准化的方式来表示源代码确实是一件好事,但是一个共同点意味着抛弃特性并为各种语言保留特定的东西使得它过于复杂......一些可扩展的方法会很好......现在非常感谢这个答案。
  • 当前版本 (3.2) 似乎在调试模式下可用,我能够从中提取 xml。然而,2.9 似乎无法为我这样做。
  • @OeufcoquePenteano:怎么样?链接?
【解决方案2】:

我一直在研究我自己的从 Clang 的 AST 中提取 XML 的版本。我的代码使用 libclang 的 Python 绑定来遍历 AST。

我的代码位于https://github.com/BentleyJOakes/PCX

编辑:我应该补充一点,就为每个 AST 节点生成正确的源代码令牌而言,它是相当不完整的。不幸的是,这需要针对每种 AST 节点类型进行编码。但是,该代码应该为任何想要进一步追求这一点的人提供基础。

【讨论】:

    【解决方案3】:

    使用自定义的 ASTDumper 就可以完成这项工作,而无需使用 ofc 编译任何源文件。 (在前端部分停止叮当声)。但是您必须处理 llvm 的所有 C 和 C++ 代码源才能完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多