来自C代码的AST

时间:2008-10-27 12:31:29

标签: c abstract-syntax-tree

我想对C源代码执行一些转换。 我需要一个linux上的工具,它可以从源代码中生成一个完整的AST ,这样我就可以在这个AST上应用我的转换,然后将其转换回C源代码。我试过ELSA但是没有编译。 (我使用的是Ubuntu 8.4)。谁能建议更好的工具/应用程序?

11 个答案:

答案 0 :(得分:17)

我会推荐clang。它有一个相当完整的C实现,大多数gcc扩展,代码是非常容易理解的。他们的C ++实现是不完整的,但如果你只关心从C代码生成AST应该没问题。根据你想要做的事情你可以使用clang作为库并直接使用AST,或者让clang将它们转储到控制台。

答案 1 :(得分:10)

参见pycparser - 用于C的纯Python AST生成器。

答案 2 :(得分:5)

我知道有两个项目,你可以找到有用的东西:

它们都解析标准的C源代码,以允许进一步的分析和转换。我没有使用它们,所以你必须自己检查它们是否符合你的需要。

当然,使用GCC的建议也是有效的。我知道gcc的这方面文档不多。

答案 3 :(得分:4)

要获取AST XML输出,您可以尝试使用MarpaX::Languages::C::AST中的 cscan 。输出结果如下:

xml <cscan> <typedef_hash> <typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/> ...

答案 4 :(得分:2)

www.antlr.org

答案 5 :(得分:2)

我们的DMS Software Reengineering Toolkit已用于庞大的C系统,解析,分析,转换和重新生成C代码。在Windows上运行,并且将在Wine下的Linux上运行,但它确实处理Linux风格的(GCC)C代码。

我无法强调对C源代码进行往返的能力:解析,构建树,转换,使用注释重新生成可编译的C代码,并使用漂亮的程序员或缩进原始程序员的缩进。这里很少有其他答案表明系统可以做到这一点。

DMS旨在执行程序转换(与此处答案中建议的其他系统相反)也是一个很大的优势。 DMS提供树型匹配和重写;它通过完全控制和数据流分析来增强这一点,用于扩展您想要匹配的条件。打算成为编译器的工具就是这样,你将很难说服它不是编译器,而是要求OP成为转换引擎。

请参阅https://stackoverflow.com/a/2173477/120163,例如DMS生成的AST。

答案 6 :(得分:2)

答案 7 :(得分:1)

我在源到源转换方面做了很少的工作,我发现CIL对于这项任务来说非常强大。 CIL的优势在于它是专为静态源分析和转换而设计的框架。它还可以使用任何数量的丑陋的GCC特定扩展来处理代码(它已被用于处理Linux内核,作为一个例子。)不幸的是,它是用OCAML编写的,使用它构建的分析/转换也必须在OCAML中写入,如果您从未使用它,可能会出现问题。

或者,clang应该具有相对容易破解的代码库,它当然可以用于生成C AST。

答案 8 :(得分:0)

您可以尝试在Linux上使用Lex和Yacc生成AST(抽象语法树):

lex and yacc

from lex and yacc to ast

答案 9 :(得分:0)

  

“我试过艾尔莎但是没有得到   编译。 (我正在使用Ubuntu 8.4)“

来自scottmcpeak.com/elkhound/的Elkhound和Elsa源代码,版本2005.08.22b已过时(旧的C ++样式.h头文件)。

Elsa正在工作,是Oink的一部分:http://www.cubewano.org/oink/#Gettingthecode 我刚刚在Ubuntu 9.10下工作了。

答案 10 :(得分:-1)

如何获取gcc并为其编写自定义后端?我从来没有做过,甚至没有使用过gcc源代码,所以我不知道它会有多难。