编译编译器的解释器

时间:2011-02-08 13:23:26

标签: java compiler-construction interpreter

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

我听说过使用Java Compiler API,这是一个好计划吗?

非常感谢你!

5 个答案:

答案 0 :(得分:3)

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

  1. 我猜你已经完成的前几个步骤(设计/描述语言语义,构造AST并执行所需的代码验证)
  2. 您需要生成字节代码,原始Java以完全相同的方式工作,它生成源代码的另一种表示形式,从人类可读到机器可读。 在这里,您可以看到Java字节代码的外观如何http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/
  3. 您需要实现虚拟的堆栈计算机,它读取字节代码并运行它以便执行。
  4. 因此,您可以看到您的任务应该有3个独立的组件(项目): 1.语言语法 2.编译器(字节码生成器) 3.虚拟机(字节码解释器)

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

答案 1 :(得分:2)

你真的需要阅读一些书籍和/或参加编程器课程 - 这不能通过关于SO的两段答案来解决。

答案 2 :(得分:1)

您可以创建一个交叉编译器来读取您的语言并输出Java代码来执行相同的操作。这可能是最简单的选择。

Java Compiler API可用于编译Java代码。您需要先将现有代码翻译为Java才能使用它。

这与编写解释器不同。这是家庭作业吗?该任务是否说您必须编写解释器,或者您可以以任何方式运行代码吗?

答案 3 :(得分:1)

很遗憾,您没有提到您计划支持哪种脚本语言。如果它是众所周知的语言之一,只需使用用纯java编写的现成解释器。请参阅BSF和Java 5脚本(http://www.ibm.com/developerworks/java/library/j-javascripting1/)

这是你自己的语言

  1. 三思:你真的需要吗?
  2. 如果您确定需要自己的语言,请考虑JavaCC

答案 4 :(得分:0)

首先,非常感谢您的快速回复。

作为我们编译器项目的一部分,我们需要能够编译和运行用我们自己的指定语言编写的程序。语言与C非常相似。我对解释器的工作原理感到困惑,有没有更简单的方法来实现它?没有生成字节码?我的想法是将每个语句翻译成Java等价语句,让Java处理字节码生成。

我会调查上面提到的主题。再次,非常感谢您的建议。