获取C++的抽象语法树?

13

我希望获得一个C++的AST,然后用外部程序解析它。有哪些程序可以很好地生成C++的AST?我不关心它是用什么语言实现的或者输出格式(只要它容易被解析即可)。

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


1
“关闭原因为不具建设性?” 问答者提出了非常明确的请求,而且实际上并没有太多的答案,因此也不可能有太多的争议。到目前为止提供的答案都是基于具体事实支持的。 - Ira Baxter
请查看以下链接:http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ - Janus Troelsen
有没有基于libclang的C/C++重构工具呢?(即使是最简单的“玩具示例”) - Janus Troelsen
3个回答

12
你可以使用clang和特别是libclang来解析C++代码。这是一个非常高质量的手写库,用于词法分析、语法分析和编译C++代码,但它也可以生成AST。

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


有什么理由使用“剧透”类型的引用块? - Bart
我无法弄清如何从clang获取AST。有没有关于如何做到这一点的教程? - Thomas Eding
1
我认为这些视频和幻灯片是一个非常好的开始。我学会了如何使用它们来实现语法高亮,但基本上是相同的,你可以用它来遍历AST。 - user142019
2
为了他人的利益:libclang(C绑定)非常糟糕且不完整。clang(C++绑定)则非常出色。 - Thomas Eding

8
实际上,GCC会在管道的任何阶段生成AST,包括通用和GIMPLE形式。请查看以-fdump-开头的(众多的)命令行开关,例如-fdump-tree-original-raw
这是一种较为简单的工作方式之一,因为您可以在任意代码上使用它;只需将适当的CFLAGSCXXFLAGS传递给大多数Makefile即可。
    make CXXFLAGS=-fdump-tree-original-raw all

更新:我在查看我的标志名称时,发现了这个基于GCC AST的漂亮小图形系统。Google太棒了。

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


2
我们的C++前端是建立在我们的DMS软件重构工具包之上的,它可以解析各种C++方言(包括C++11和ObjectiveC),并通过命令行开关将其AST导出为XML文档。请查看此前端生成的示例AST
实际上,您需要的不仅仅是AST;如果没有对每个标识符的含义和范围的理解,您实际上无法使用C++(或任何其他现代语言)。对于C++来说,意义/范围特别复杂。DMS C++前端可以处理所有这些问题;它可以构建完整的符号表,将标识符与显式的C++类型相关联。该信息不能通过命令行开关以XML格式转储,但在DMS中编写逻辑以遍历符号表并输出XML“技术上很容易”(有一种选项可以转储此信息,只是不以XML格式)。
我警告你不要试图操作(甚至只是分析)XML。首先,XSLT并不是理解AST的含义,更不用说转换AST的一种特别好的方式,因为AST代表上下文敏感的语言结构(这就是为什么你需要[必须有]符号表)。如果你愿意,你可以将XML读入类似于DOM的树中,并编写自己的过程代码来操作它。但源到源转换是一种更简单的方法; 你可以使用C++表示法编写你的转换,而不是使用大量的代码爬过树形数据结构。
你会遇到另一个问题:如何从转换后的XML生成有效的C++代码。如果你不介意输出原始文本,你可以以纯临时的方式解决这个问题,代价是除了汗水之外没有任何保证生成的代码在语法上是有效的。如果你想生成一个C++表示你最终结果的AST,并从那里重新生成有效的文本,你将需要一个prettyprinter,虽然这不是技术上很难,但对于像C++这样的语言来说仍然需要很多工作。
最后,像DMS这样的工具存在的原因是为了提供处理/操作复杂结构(如C ++ AST)所需的大量基础设施。(解析、分析、转换、美化)。你可以尝试自己复制所有这些机制,但这通常是一种时间/成本/生产力的不良权衡。声称最好留在工具生态系统内,而不是逃脱并自己构建不好的版本。如果你以前没有做过这个,你会痛苦地发现这一点。
顺便说一下,DMS已被用于对C++源代码进行大规模的分析和转换。请参见DMS上的出版物,并检查Akers关于“重新设计C ++组件模型”的论文。
Clang基于相同的哲学;有一个工具生态系统。
你的经验可能有所不同,但我会感到惊讶。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接