java - 为编译器编写解释器

标签 java compiler-construction interpreter

我正在用 Java 编写一个编译器程序的解释器。因此,在检查源代码、语法和语义之后,我希望能够运行源代码,这是我的编译器的输入。我只是想知道我是否可以翻译一些标记,例如 out (它在屏幕上打印内容),我可以将其替换为 System.out.print 吗?然后再次输入源代码以在java中运行它?

我听说过使用 Java 编译器 API,这是一个好的计划吗?

提前非常感谢您!

最佳答案

您要求的是虚拟机实现技术,要运行一般的Java代码,您应该实现以下内容:

  1. 我想您已经完成了前几个步骤(设计/描述语言语义、构建 AST 并执行所需的代码验证)
  2. 你需要生成你的字节码,原始Java的工作方式完全相同,它生成源代码的另一种表示形式,从人类可读到机器可读。 在这里您可以看到 Java 字节码的样子 http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/
  3. 您需要实现虚拟机(又名堆栈机)来读取字节代码并运行它以供执行。

如您所见,您的任务应该有 3 个独立的组件(项目): 1. 语言语法 2.编译器(字节码生成器) 3.虚拟机(字节码的解释器)

附注我有从头开始创建类似 Java 的小型编译器的经验(使用 ANTlr 定义语法、编译器的实现、虚拟机的实现),所以如果您需要特定的东西,我可能可以与您分享更多信息(甚至源代码)

关于java - 为编译器编写解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933548/

相关文章:

java - 为什么我不能在 Java 的内部类中创建枚举?

java - 将带有表情符号的字符串映射到 Array<String|Char>

c++ - 关于应用程序速度,最好的 C++ 编译器和 Windows 构建选项?

java - Jython 作为 Java 游戏的游戏内控制台

java - 如何在 spring 4.* 中通过注解创建多个字段的约束 validator

java - 这会导致可变参数造成堆污染吗?

c++ - 模板的循环包含

c++ - 何时/何地/为什么 size_t 不是 uint?

php - 为什么 php 在 die(); 之后继续解释?

c# - 如何构建 .NET 解释器(或者 Powershell 如何工作?)