获取C+的AST+;? 我想获得一个C++的AST,然后我可以用外部程序解析它。哪些程序在那里有利于生成C++的AST?我不关心它是用什么语言实现的,也不关心它的输出格式(只要它易于解析) 我的总体目标是将C++单元测试床转换成相应的C++封装测试床。 ,您可以使用并特别解析C++代码。它是一个非常高质量的手写库,用于对C++代码进行词法分析、编译,但也可以生成AST。

获取C+的AST+;? 我想获得一个C++的AST,然后我可以用外部程序解析它。哪些程序在那里有利于生成C++的AST?我不关心它是用什么语言实现的,也不关心它的输出格式(只要它易于解析) 我的总体目标是将C++单元测试床转换成相应的C++封装测试床。 ,您可以使用并特别解析C++代码。它是一个非常高质量的手写库,用于对C++代码进行词法分析、编译,但也可以生成AST。,c++,abstract-syntax-tree,C++,Abstract Syntax Tree,Clang还支持C、Objective-C和Objective-C++。CLAN本身是用C++编写的。 实际上,GCC将在管道中您感兴趣的任何阶段发出AST,包括泛型和GIMPLE表单。查看从-fdump-开始的(过多)命令行开关,例如-fdump tree original raw 这是一种更简单的(…)工作方式,因为您可以在任意代码上使用它;只需将适当的CFLAGS或cxflags传递到大多数makefile: make CXXFLAGS=-fdump-tree-original-r

Clang还支持C、Objective-C和Objective-C++。CLAN本身是用C++编写的。
实际上,GCC将在管道中您感兴趣的任何阶段发出AST,包括泛型和GIMPLE表单。查看从
-fdump-
开始的(过多)命令行开关,例如
-fdump tree original raw

这是一种更简单的(…)工作方式,因为您可以在任意代码上使用它;只需将适当的
CFLAGS
cxflags
传递到大多数makefile:

    make CXXFLAGS=-fdump-tree-original-raw all
…你会得到“作品”

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

< P> > P>,我们可以在上面分析各种C++语言(包括C++ 11和ObjeVEC),并将AST作为命令行开关导出为XML文档。看

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

我警告您不要操纵(甚至只是分析)XML。首先,XSLT不是理解AST含义的特别好的方法,更不用说转换AST了,因为AST表示上下文敏感的语言结构(这就是为什么您希望[nee必须有]符号表)。如果愿意,可以将XML读入类似dom的树中,并编写自己的过程代码来操作它。但这是一种更简单的方法;您可以使用C++符号来编写转换,而不是通过树数据结构来爬行代码。p> <>你会遇到另一个问题:如何从转换的XML生成有效的C++代码。如果您不介意吐出原始文本,您可以用纯粹的临时方式来解决这个问题,代价是生成的代码在语法上是有效的。如果你想生成一个C++结果,表示AST的最终结果,并从中再生有效文本,你需要一个,这在技术上并不难,但仍然需要大量的工作来构建,尤其是对于一个和C++一样大的语言。p> 最后,像DMS这样的工具的原因是提供大量的基础设施来处理/操作复杂的结构,如C++ AST。(解析、分析、转换、预打印)。您可以尝试自己复制所有这些机器,但这通常是一个糟糕的时间/成本/生产率权衡。这种说法是,最好留在工具生态系统中,而不是逃避它,自己构建糟糕的版本。如果你以前没有这样做过,你会痛苦地发现这一点

fWW,已经用DMS对C++源代码进行了大量的分析和转换。查看和检查由“阿克”的“重新构建C++组件模型”的论文。 叮当是基于同样的哲学;有一个工具生态系统


YMMV,但我会感到惊讶。

有什么理由使用“扰流板”类型的blockquote吗?我不知道如何从clang获得AST。有关于如何做到这一点的教程吗?我认为这是一个很好的开始。我学会了如何使用它们来实现语法高亮显示,但基本上是一样的,你可以用它来遍历AST。CLAN(C++绑定)很好。“关闭不具有建设性”。OP有一个非常明确的请求,坦白地说,答案不多,因此不会有太多的争论。far提供的答案有具体的事实支持