clang - 如何使用 Clang 获取当前版本的 AST?

标签 clang abstract-syntax-tree

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

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

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

在此question提到了 doxygen 和一个 representation给出了一个 ast,但我主要是在寻找某种文本形式(例如 XML)的 ast,以便可以执行进一步的分析。

最后还有一个question这里关于 XML 导入的堆栈,但由于还提到的几个原因而停止。

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

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

谢谢。

最佳答案

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 的讨论

关于clang - 如何使用 Clang 获取当前版本的 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954491/

相关文章:

c++ - 这种优化是否是编译器错误?

linux - 仅安装手册页和文档?

c++ - 从非类型模板参数声明 constexpr 数组的可移植方式

java - 将java代码解析成抽象语法树

java - 从 AST 生成代码的最佳设计?

c++ - 使用 lldb 调试时,较高的行号未解析为断点

python - 如何在 Python 中查找已安装库的版本?

typescript - 有没有办法从 typescript 编译器 API 获取节点的行号?

java - 如何在java swing中运行ANTLR GUI?

来自 ANTLR 解析树的 Python AST?