来自C代码的AST

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

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

请参阅pycparser – 一个用于C的纯Python AST生成器。

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

  • CIL
  • 变形金刚

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

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

要获得AST XML输出,您可以尝试使用MarpaX :: Languages :: C :: AST中的cscan 。 输出看起来像:

xml ...

我们的DMS软件再造工具包已用于大型C系统,解析,分析,转换和重新生成C代码。 在Windows上运行,并将在Wine下运行Linux,但它确实处理Linux风格(GCC)C代码。

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

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

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

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

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

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

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

lex和yacc

从lex和yacc到ast

“我尝试了ELSA,但它没有被编译。(我正在使用Ubuntu 8.4)”

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

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