请建议一个现成的工具,用于将C ++代码解析为抽象语法树?基于Lex / Yacc的工具将是首选,但其他任何东西都是可以接受的。
答案 0 :(得分:8)
答案 1 :(得分:8)
答案 2 :(得分:5)
我们的DMS C++ Front End是一个完整的C ++ 11解析器,具有全名和类型解析。它解析C ++代码,构建AST和符号表,并使用其DMS Software Reengineering Toollkit可以对AST执行任意更改并重新生成有效代码。它处理GCC,MS Visual Studio的方言,并包含OpenMP。
使用带有C ++前端的DMS对大型代码系统进行了大量更改。
2013年6月编辑:见SO answer for examples of C++ ASTs produced by DMS.
2016年6月编辑:处理C ++ 14。
EDIT 2019年5月:处理C ++ 17
答案 3 :(得分:4)
-fdump-translation-unit编译器的选项GCC为输入文件生成抽象语法树:
将整个翻译单元的树结构表示转储到文件中。通过将.tu附加到源文件名来生成文件名。
答案 4 :(得分:2)
TXL用作嵌入生产商业IDE中的C ++解析器,该IDE已售出数十万份副本。所以是否 TXL可以做到这一点的问题是没有问题的。
但是,该产品中使用的TXL语法是专有的,不公开。正如Audrey154上面指出的那样,TXL网站上提供的免费C ++语法已被用于许多大型C ++改造项目,但不是商业质量,正如Ira Baxter指出的那样,并且经常需要进行一些修改以适应特别项目。
答案 5 :(得分:1)
尝试TXL(参见txl.ca)。 colm(抱怨)= / p>
答案 6 :(得分:1)
ROSE编译器基础结构也是一种选择。它是一个开源编译器基础架构,用于为大规模C(C89和C98),C ++(C ++ 98和C ++ 11),UPC,Fortran(77/95)构建源到源程序转换和分析工具。 / 2003),OpenMP,Java,Python和PHP应用程序。
因此它的优势在于具有蹩脚的OpenMP。
答案 7 :(得分:0)
编辑:我留下以下内容供参考,将来它可能会派上用场(如果只是针对ANTLR而不是针对C ++语法)。截至目前,请考虑Ira Baxter对其实际用途的评论。
[ ANTLR有一些C ++语法可用。 ANTLR本身可以生成一个所谓的“树解析器”,它允许您使用AST。话虽如此,我现在还不知道语法与C ++标准有多完整(或正确)。一如既往,YMMV。]
答案 8 :(得分:0)
eclipse CDT的API易于使用,您可以签出代码,并从unittests
获取有用的代码答案 9 :(得分:0)
来自https://github.com/eliben/pycparser的示例c_json.py可以执行此操作。
main()
{
printf("hello, world\n");
}
给出
{
"_nodetype": "FileAST",
"coord": null,
"ext": [
{
"_nodetype": "FuncDef",
"body": {
"_nodetype": "Compound",
"block_items": [
{
"_nodetype": "FuncCall",
"args": {
"_nodetype": "ExprList",
"coord": "hello.c:3",
"exprs": [
{
"_nodetype": "Constant",
"coord": "hello.c:3",
"type": "string",
"value": "\"hello, world\\n\""
}
]
},
"coord": "hello.c:3",
"name": {
"_nodetype": "ID",
"coord": "hello.c:3",
"name": "printf"
}
}
],
"coord": "hello.c:2"
},
"coord": "hello.c:1",
"decl": {
"_nodetype": "Decl",
"bitsize": null,
"coord": "hello.c:1",
"funcspec": [],
"init": null,
"name": "main",
"quals": [],
"storage": [],
"type": {
"_nodetype": "FuncDecl",
"args": null,
"coord": "hello.c:1",
"type": {
"_nodetype": "TypeDecl",
"coord": "hello.c:1",
"declname": "main",
"quals": [],
"type": {
"_nodetype": "IdentifierType",
"coord": "hello.c:0",
"names": [
"int"
]
}
}
}
},
"param_decls": null
}
]
}
您也可以以可解析的形式获取LLVM AST,从http://clang.llvm.org/docs/IntroductionToTheClangAST.html开始