获取C ++的AST?

时间:2012-01-26 17:59:15

标签: c++ abstract-syntax-tree

我希望获得一个用于C ++的AST,然后我可以使用外部程序进行解析。哪些程序适合为C ++生成AST?我不关心它实现的语言或输出格式(只要它易于解析)。

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

3 个答案:

答案 0 :(得分:12)

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

  

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

答案 1 :(得分:6)

实际上,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

答案 2 :(得分:2)

构建在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,但我会感到惊讶。