将抽象语法树转换为字节码

7
我正在尝试作为一项爱好学习构建简单编译器的方法。我目标是Java虚拟机。
我使用Eclipse中的ANTLR插件编写了一个简单的语法。
有人告诉我,ANTLR生成的AST上有一种称为方法节点的东西,必须调用它。我计划使用ASM生成字节码。那么方法节点是什么?我如何从ASM中调用它并使其访问方法指令?
此外,编译器的语义分析器怎么办?应该手动编写还是有任何生成器可用?
1个回答

4

你在这里提出了许多无关的问题。根据你定义的语言,可能会有一个方法节点,也可能没有,比如,如果你的语言无条件地编译成一个 main(String[]) 方法。

将AST转换为目标语言有多种方法。通常你不会直接生成代码,而是为你的目标平台生成一个AST,并使用treewalker让一个漂亮的打印机将其转换为代码。

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

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

一本非常好的读物: 让我们构建一个编译器,作者Jack Crenshaw

1
非常感谢,最近 Stephen Chin 给了我几乎相同的答案。《Let's Build a Compiler》(作者:Jack Crenshaw)似乎很不错,我会开始阅读它。 - Gautam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接