7

我正在尝试学习构建一个简单的编译器作为爱好。我的目标是Java虚拟机。将抽象语法树转换为字节代码

我已经用Eclipse的ANTLR插件编写了一个简单的语法。

有人告诉我,Antlr生成的AST上有一些方法节点,必须调用它。 我打算使用ASM来生成字节码。 那么什么是方法节点以及如何从ASM中调用它并使其访问方法指令?

那么编译器的语义分析器呢。应该手动写入还是有任何生成器?

回答

3

你在这里问很多无关的问题。根据您定义的语言,您的语言中可能会有一个方法节点,或者如果您的语言无条件编译为main(String[])方法,则不会有任何方法节点。

有多种方法可将AST转换为目标语言。大多数情况下,您不会直接生成代码,而是为您的目标平台生成AST,并使用树行程器使用漂亮的打印机生成代码。

语义分析编译器的编程。在语法层次上阅读和理解输入是解析。你将需要自己编写语义分析器,否则你根本就没有编写过编译器。 ;-)

我推测你用Jasmin来编译汇编代码?一个很好的开始是为你的输入语言和目标语言(Jasmin)编写语法,并考虑哪些输入结构会呈现什么输出。如何在Jasmin中编写一个for i := 1 to 10循环?根据需要解决小问题并扩展编译器,但慢慢地,尽早彻底地测试新实施的转换。

一个非常良好的阅读:Let's Build a Compiler, by Jack Crenshaw

+1

最近,我得到了[stephen chin](http://steveonjava.com/)的几乎相同的答案,Jack Crenshaw的Let's Build a Compiler,看起来非常好,我将开始阅读它。 – Gautam