我想解析一个 C 源文件并将其内容放入 AST(抽象语法树)。如果我将 AST 存储在 Java 对象中会非常好,类似于用 DOM 解析的 XML。Eclipse CDT 的概念似乎是我想要的,只是它被设计成一个插件库。有谁知道是否有独立的库,例如 XML 的 DOM?我已经在 stackoverflow 上阅读了关于 AST 等的其他主题,但我不太确定 ANTLR 或 JavaCC 是否适合我。提前致谢!
安德烈
我想解析一个 C 源文件并将其内容放入 AST(抽象语法树)。如果我将 AST 存储在 Java 对象中会非常好,类似于用 DOM 解析的 XML。Eclipse CDT 的概念似乎是我想要的,只是它被设计成一个插件库。有谁知道是否有独立的库,例如 XML 的 DOM?我已经在 stackoverflow 上阅读了关于 AST 等的其他主题,但我不太确定 ANTLR 或 JavaCC 是否适合我。提前致谢!
安德烈
您也许可以考虑自定义现有的编译器。例如,GCC 承认插件和MELT扩展。MELT 是一种高级领域特定语言,旨在轻松扩展 GCC,并且能够处理 GCC 内部表示(Gimple、Tree)。
我强烈建议您避免自己解析 C(例如,通过深入研究 ANTLR ...)。这是一个比你想象的更大的任务。
在一些现有的编译器框架(如 GCC 或 Clang/LLVM)中工作的一个优点是您可以立即受益于所有编译器的机制。此外,您可以(对于接受多种源语言的编译器,如 GCC)还可以处理 C 以外的其他语言(例如 C++、Go、Ada、Fortran、GCC 的 Objective C)。编译器会计算很多可能对您有用的东西(Use/Def 链、交叉引用、SSA 形式)。最后,您可以处理一些合适的预消化内部表示,这可能比普通的 C 抽象语法树对您更有用。(例如,您可能希望在函数内联之后使用 Gimple)。
最后但同样重要的是,通过扩展现有编译器,您可以改进其行为,例如提供更好的警告,甚至改进发出的代码。
但是我知道没有用 Java 编写的 C 编译器!
有几种可用的 Java 解析器生成器,请参阅:
http://java-source.net/open-source/parser-generators
您可能想查看解析器的类型——它们可以是 LL(K)、LALR 等。1960 年代和 70 年代开发的编译器理论概述了这些差异。您可能想阅读类似 Aho/Sethi/Ullmann - 该理论的编译器原理、技术和工具之类的内容。
一旦您选择了解析器技术,您就可以选择您的解析器 - 生成器工具。ANTLR (LALR) 和 JavaCC LL(k) 是我个人熟悉并可以推荐的两个。在 JavaCC 网页上,您可以找到 C 的语法示例,您可以从该示例开始。
LL(k) 语法有点难以处理,因为您需要处理冲突 - 但是如果语法完成并且可以工作,那么您应该可以使用这种方法。
我个人会选择 JavaCC 来解决您的问题。