【发布时间】:2016-05-05 14:22:22
【问题描述】:
我想对 C 源代码进行一些转换。 我需要一个在 linux 上从源代码生成完整 AST 的工具,以便我可以在此 AST 上应用我的转换,然后将其转换回 C 源代码。我试过ELSA,但它没有被编译。 (我使用的是 Ubuntu 8.4)。谁能推荐一个更好的工具/应用程序?
【问题讨论】:
-
我相信 OpenC++ 与您现在所获得的一样接近。
我想对 C 源代码进行一些转换。 我需要一个在 linux 上从源代码生成完整 AST 的工具,以便我可以在此 AST 上应用我的转换,然后将其转换回 C 源代码。我试过ELSA,但它没有被编译。 (我使用的是 Ubuntu 8.4)。谁能推荐一个更好的工具/应用程序?
【问题讨论】:
我会推荐clang。它有一个相当完整的 C 实现,带有大多数 gcc 扩展,并且代码非常易于理解。他们的 C++ 实现是不完整的,但如果您只关心从 C 代码生成 AST 应该没问题。根据您的需要,您可以使用 clang 作为库并直接使用 AST,或者让 clang 将它们转储到控制台。
【讨论】:
clang-cc -rewrite-blocks时发生的事情。
请参阅 pycparser - 用于 C 的纯 Python AST 生成器。
【讨论】:
我知道有两个项目对您有用:
它们都解析标准 C 源代码以允许进一步分析和转换。我没有使用它们,因此您必须自己检查它们是否符合您的需求。
当然,使用 GCC 的建议也是有效的。不过,我知道关于 gcc 这方面的文档并不多。
【讨论】:
要获得 AST XML 输出,您可以尝试使用来自 MarpaX::Languages::C::AST 的 cscan。输出将如下所示:
xml
<cscan>
<typedef_hash>
<typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/>
...
【讨论】:
www.antlr.org
【讨论】:
我们的DMS Software Reengineering Toolkit 已用于大型 C 系统,解析、分析、转换和重新生成 C 代码。在 Windows 上运行,并将在 Wine 下的 Linux 上运行,但它确实处理 Linux 风格 (GCC) C 代码。
我不能再强调往返 C 源代码的能力:解析、构建树、转换、重新生成可编译的 C 代码与 cmets 和漂亮打印或与原始程序员的缩进。这里很少有其他答案建议系统可以稳健地做到这一点。
DMS 旨在执行程序转换(与此处的答案中建议的其他系统相反)这一事实也是一个很大的优势。 DMS 提供树模式匹配和重写;它通过完全控制和数据流分析增强了这一点,用于扩展您想要匹配的条件。打算成为编译器的工具就是这样,您将很难说服它不是编译器,而是按照 OP 的要求成为转换引擎。
参见https://stackoverflow.com/a/2173477/120163,例如 DMS 生成的 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 下运行。
【讨论】:
使用 gcc 并为其编写自定义后端怎么样?我从来没有做过,也没有研究过 gcc 源代码,所以我不知道这有多难。
【讨论】: