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

标签 compiler-construction jvm antlr bytecode abstract-syntax-tree

我正在尝试学习构建一个简单的编译器作为一种爱好。我的目标是 Java 虚拟机。

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

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

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

最佳答案

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

有多种方法可以将 AST 转换为目标语言。大多数情况下,您不会直接生成代码,而是为您的目标平台生成一个 AST,并有一个 pretty-print 使用 treewalker 从中生成代码。

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

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

A 非常好文:Let's Build a Compiler, by Jack Crenshaw .

关于compiler-construction - 将抽象语法树转换为字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6722195/

相关文章:

java - 如何将 XML 中的函数式语言转换为 Java?

antlr - ANTLR4 中一个片段可以使用另一个片段吗

java - ANTLR4:消耗所有剩余输入直到 EOF

java - 在mac终端上编译并运行java程序

memory - 垃圾收集语言是否可以编译为非垃圾收集语言,而不在运行时包含垃圾收集器?

c# - IIS 6.0 64 位 : SysInterals Proc Explorer showing 32-bit DLLs loaded?

java - 第二次调用回调时 JVM 崩溃

java - 为什么java中方法的参数接受引用地址的副本?

java - 对于给定的内存大小,单个进程允许使用的最大堆内存?

C89 与 c99 GCC 编译器