24

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

4

11 回答 11

19

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

于 2008-10-30T07:23:55.950 回答
14

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

于 2009-02-14T10:34:30.387 回答
5

我知道有两个项目对您有用:

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

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

于 2008-10-27T14:15:48.677 回答
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"/> ...

于 2015-01-07T16:31:24.263 回答
2

Our DMS Software Reengineering Toolkit has been used on huge C systems, parsing, analyzing, transforming, and regenerating C code. Runs on Windows, and will run on Linux under Wine, but it does handle Linux-style (GCC) C code.

I can't emphasize enough the ability to round-trip the C source code: parse, build trees, transform, regenerate compilable C code with the comments and either prettyprinted or with the original programmer's indentation. Few of the other answers here suggest systems that can do that robustly.

The fact that DMS is designed to carry out program transformations (as opposed to other systems suggested in answers here) is also a great advantage. DMS provide tree-pattern matches and rewrites; it augments this with full control and data flow analyis to be used to extend the conditions that you'd like to match. A tool intending to be a compiler is just that, and you'll have a very hard time persuading it not to be a compiler, and an instead to be a transformation engine as the OP requested.

See https://stackoverflow.com/a/2173477/120163 for example ASTs produced by DMS.

于 2009-07-12T10:12:36.937 回答
2

www.antlr.org

于 2008-10-27T12:58:30.643 回答
2

http://ctool.sourceforge.net/

于 2009-07-12T10:32:34.010 回答
1

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

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

于 2009-07-12T11:20:09.373 回答
0

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

lex 和 yacc

从 lex 和 yacc 到 ast

于 2008-10-27T14:19:47.280 回答
0

“我尝试了 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 下工作。

于 2010-02-19T16:37:15.473 回答
-1

使用 gcc 并为其编写自定义后端怎么样?我从来没有做过,也没有研究过 gcc 源代码,所以我不知道这有多难。

于 2008-10-27T12:54:51.820 回答