用于将C ++解析为AST的工具

时间:2011-09-06 11:10:35

标签: c++ parsing abstract-syntax-tree

请建议一个现成的工具,用于将C ++代码解析为抽象语法树?基于Lex / Yacc的工具将是首选,但其他任何东西都是可以接受的。

10 个答案:

答案 0 :(得分:8)

您可以查看gccxml。但它只转储程序结构,而不是代码。

如果你想要更多,你最好的选择可能是CLang。

请注意,仅使用Lex / Yacc解析器无法轻松解析C ++语法。这太模棱两可了。

答案 1 :(得分:8)

clang怎么样?

  

Clang项目的目标是为LLVM编译器创建一个新的C,C ++,Objective C和Objective C ++前端。

答案 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开始