【问题标题】:Getting AST for C++?为 C++ 获取 AST?
【发布时间】:2012-01-26 17:59:15
【问题描述】:

我正在寻找一个用于 C++ 的 AST,然后我可以使用外部程序对其进行解析。有哪些适合为 C++ 生成 AST 的程序?我不在乎它以什么语言实现或输出格式(只要它易于解析)。

我的总体目标是将 C++ 单元测试台转换为其相应的 C# 包装器测试台。

【问题讨论】:

标签: c++ abstract-syntax-tree


【解决方案1】:

您可以使用clang 尤其是libclang 来解析C++ 代码。这是一个非常高质量的手写库,用于对 C++ 代码进行词法分析、解析和编译,但它也可以生成 AST。

Clang 支持 C、Objective-C 和 Objective-C++。 Clang 本身是用 C++ 编写的。

【讨论】:

  • “剧透”类型块引用的任何原因?
  • 我不知道如何从 clang 中获取 AST。有没有关于如何做到这一点的教程?
  • 我认为these videos and slides 是一个很好的开始。我学习了如何使用它们来实现语法高亮,但基本上是一样的,你可以用它来遍历 AST。
  • 为了他人的利益:libclang(C 绑定)很糟糕且不完整。 clang(C++ 绑定)很棒。
【解决方案2】:

实际上,GCC 会在您感兴趣的管道中的任何阶段发出 AST,包括 GENERIC 和 GIMPLE 表单。查看以-fdump- 开头的(过多的)命令行开关——例如-fdump-tree-original-raw

这是一种更容易 (...) 的工作方式,因为您可以在任意代码上使用它;只需将适当的 CFLAGSCXXFLAGS 传递到大多数 Makefile 中即可:

    make CXXFLAGS=-fdump-tree-original-raw all

……然后你就得到了“作品”。

更新:在检查我的标志名称时看到了这个基于 GCC AST 的简洁小图形系统 :-) Google FTW。

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

【讨论】:

    【解决方案3】:

    我们的C++ Front End 建立在我们的DMS Software Reengineering Toolkit 之上,可以解析各种C++ 方言(包括C++11 和ObjectiveC),并将该AST 导出为带有命令行开关的XML 文档。见example ASTs produced by this front end.

    实际上,您需要的不仅仅是 AST;如果不了解每个标识符的含义和范围,您将无法真正使用 C++(或任何其他现代语言)做很多事情。对于 C++,含义/范围特别难看。 DMS C++ 前端处理所有这些;它可以构建将标识符与显式 C++ 类型相关联的完整符号表。该信息不能通过命令行开关转储到 XML 中,但在 DMS 中编写逻辑以遍历符号表并输出 XML,这在“技术上很容易”。 (有一个选项可以转储此信息,但不是 XML 格式)。

    我提醒您不要考虑操纵(甚至只是分析)XML。首先,XSLT 并不是理解 AST 含义的特别好方法,更不用说转换 AST,因为 AST 表示上下文敏感的语言结构(这就是为什么你想要 [nee MUST HAVE] 符号表的原因)。如果愿意,您可以将 XML 读入类似 dom 的树中,并编写自己的过程代码来操作它。但是source-to-source transformations 是一种更简单的方法;您可以使用 C++ 符号来编写转换,而不是使用大量的代码爬上树形数据结构。

    您将遇到另一个问题:如何从转换后的 XML 生成有效的 C++ 代码。如果您不介意吐出原始文本,您可以以纯粹的临时方式解决这个问题,代价是除了汗水之外没有任何保证,即生成的代码在语法上是有效的。如果您想将最终结果生成为 AST 的 C++ 表示,并从中重新生成有效文本,则需要prettyprinter,这在技术上并不难,但仍然需要大量工作来构建,特别是对于一种语言和 C++ 一样大。

    最后,像 DMS 这样的工具之所以存在,是为了提供处理/操作复杂结构(如 C++ AST)所需的大量基础设施。 (解析、分析、转换、漂亮打印)。您可以尝试自己复制所有这些机器,但这通常是一个糟糕的时间/成本/生产力权衡。声称最好留在工具生态系统中,而不是逃避它并自己构建它的坏版本。如果你以前没有这样做过,你会很痛苦地发现这一点。

    FWIW,DMS 已被用于对 C++ 源代码进行大量分析和转换。请参阅 Publications on DMS 并查看 Akers 关于“重新设计 C++ 组件模型”的论文。

    Clang 是基于同一种哲学;有一个工具生态系统。

    YMMV,但我会感到惊讶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2011-08-04
      • 2013-06-27
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多