【问题标题】:How to use Clang to obtain ASTs on the current versions?如何使用 Clang 获取当前版本的 AST?
【发布时间】:2012-06-08 18:51:36
【问题描述】:

我一直在尝试从 Clang 获取 AST,但到目前为止还没有成功。我在堆栈中发现了一个一岁的 question 这里提到了使用 Clang 获取 ast 的另外两种方法,它们是:

./llvmc -cc1 -ast-dump file.c

./llvmc -cc1 -ast-print file.c

在这个 question 上提到了 doxygen 和一个 representation,其中给出了一个 ast,但我主要是在寻找一些文本形式的,例如 XML,以便可以进行进一步的分析。

最后,堆栈上还有另一个 question 关于确切的 XML 导入,但由于还提到的几个原因而停止了。

因此我的问题是,哪个版本以及如何从控制台使用它来获取 C 中给定代码的 ast 相关信息?我相信这是一个非常轻松的单行命令代码像上面的那些,但文档索引并没有像我读过的那样引用任何关于 ast 的内容,而且我在 llvmc 发现的唯一一个是关于手动编写 AST,这并不是我真正想要的。

我尝试了上面的所有命令,但它们在 2.9 版上都已经失败了,而且我已经发现 llvm 在每个版本之间都发生了很大变化。

谢谢。

【问题讨论】:

  • Doxygen AFAIK 不会产生任何类似于 AST 的东西。
  • 您提到的其他答案说 XML 导出格式已从 Clang 中删除。恕我直言,这是一件好事,因为对于任何大小的 C 程序来说,真正的 XML 树都将是巨大的,而且 XML 操作起来也很尴尬;您想使用工具内置的工具来访问 AST。
  • ... Clang 是您唯一会考虑的工具吗?
  • 你能提供一些关于你想用 AST 做什么的细节吗?分析一些问题?转换?提炼? ...?
  • 我误解了你写的东西,对不起。我认为它的意思是 Doxygen-the-tool-itself 产生 AST。我认为您的意思是 Doxygen-output-from-Clang 包含对 AST 的描述。

标签: clang abstract-syntax-tree


【解决方案1】:

OP 说“也接受其他建议”。

他可能会考虑我们的DMS Software Reengineering Toolkit 及其C Front End

虽然展示由此生成的 C AST 很容易,但展示由 DMS 使用相同的 C 前端(ObjectiveC 是 C 的方言)生成的 ObjectiveC AST [已经在 SO] 更容易。 请参阅https://stackoverflow.com/a/10749970/120163 DMS 也可以生成与此等效的 XML。

我们不建议将树导出为文本,因为根据我们的经验,用于真实代码的真实树非常庞大,并且很难作为文本或 XML 对象进行操作。通常需要解析之外的机器。请参阅我关于Life After Parsing的讨论

【讨论】:

  • GCC、Clang、FramaC、CIL 是我所知道的 FOSS 解决方案。这些中的每一个都在一定程度上解决了“解析后的生活”问题。我构建 DMS 是因为我认为这些解决方案还不够;请注意,所有这些工具都是特定于 C 或 C++ 的,它们不能解决处理大型复杂软件系统的问题。这些是否足以解决您的问题需要您自己做出判断。
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2011-07-05
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多