用Java生成C程序的对象模型/ AST

时间:2012-10-17 14:21:03

标签: java c object model abstract-syntax-tree

我想解析C源文件并将其内容放入AST(抽象语法树)。如果我将AST存储在Java对象中,就像使用DOM解析的XML一样,那将是非常好的。 Eclipse CDT的概念似乎是我想要的,除了它被设计成一个插件库。有没有人知道是否有独立的库,例如DOM for XML? 我已经在stackoverflow上阅读了其他主题,主题是AST等等,但我不太确定ANTLR或JavaCC是否适合我。 提前谢谢!

安德烈

2 个答案:

答案 0 :(得分:0)

您可以考虑自定义现有编译器。例如,GCC允许插件以及MELT扩展。 MELT是一种高级域特定语言,旨在轻松扩展GCC,并且能够处理GCC内部表示(Gimple,Tree)。

我强烈建议你不要自己解析C(例如潜入ANTLR ......)。这比你想象的更重要。

在一些现有的编译器框架(如GCC或Clang / LLVM)中工作的一个优点是,您可以立即受益于所有编译器的机制。此外,您可以(对于接受多种源语言的编译器,如GCC)也处理除C之外的其他语言(例如C ++,Go,Ada,Fortran,GCC的Objective C)。并且编译器会计算很多可能对您有用的东西(使用/ Def链,交叉引用,SSA形式)。最后,您可以使用一些合适的预先消化的内部表示,这可能比普通的C抽象语法树更有用。 (例如,您可能希望在函数内联后使用Gimple。)

最后但并非最不重要的是,通过扩展现有编译器,您可以改善其行为,例如:提供更好的警告,甚至改善发出的代码。

但我知道没有用Java编写的C编译器!

答案 1 :(得分:-1)

有几种适用于Java的分析器生成器,请参阅:

http://java-source.net/open-source/parser-generators

您可能想要查看解析器的类型 - 它们可以是LL(K),LALR等。在20世纪60年代和70年代开发的编译器理论中概述了这些差异。您可能希望阅读类似Aho / Sethi / Ullmann的内容 - 编译器原理,技术和工具。

选择解析器技术后,您可以选择解析器 - 生成器工具。 ANTLR(LALR)和JavaCC LL(k)是我个人所熟悉且可以推荐的两个。在JavaCC网页上,您可以找到C的语法示例,您可以从中开始。

LL(k)语法因为你需要冲突处理而有点难以处理 - 但是如果语法已经完成并且有效,那么你应该对这种方法很好。

就我个人而言,我会选择JavaCC来解决问题。

请参阅Source for parsing C grammar using JavaCC