2011-07-28 39 views
3

我们公司使用自己的(这里内置的)脚本语言进行编程,但他们想创建解释器来将这个脚本代码翻译成Java。这种脚本语言相当严肃,所以这不是件小事。在Java中创建自定义解释器:从哪里开始?

我被问到这个任务,但它似乎并不像微不足道的挑战。在我做任何愚蠢的事情并开始写数十亿行解析之前,我应该知道什么?我应该从哪里开始做到这一点?

PS:我想将脚本文件翻译为.java源文件,而不是直接转换为字节码。

+1

直接转换为Java并且不通过Java解释器运行的任何特定原因(即用于脚本语言的基于Java的脚本引擎)? –

+0

@Charles是的,但很难解释 – Xorty

+0

那么很难回答... –

回答

5

如果您想将脚本翻译为Java,它不是解释器,而是编译器。如果你正在考虑正在执行这个脚本在阅读过程中,那么解释器。

但是,您应该看看JavaCCAntlr。它们甚至适用于编译或解释任务。您必须指定语言的语法规则,并且必须在Java中编写一些额外的逻辑,从而实现脚本语言的语义。如果你想做一个解释器,你编写的Java代码将会生成更多的Java(或任何)代码。如果你想要一个编译器,你编写的Java代码将直接执行脚本。

另一个值得了解的概念是Abstract Syntax Tree

这是一个关于更多lexer and parser generators的综合列表。

+0

因此,转换例如Groovy到Java是一个编译器?即使您必须将Java编译为byecode? –

+0

是的。维基百科:'编译器是一种将用编程语言编写的源代码转换为另一种计算机语言的计算机程序。' '...解释者通常意味着执行,即执行用编程语言编写的指令的计算机程序。' – pcjuzer

+0

@Charles嗯,这个问题有点学术。如果你从一种“高级”语言“转换”到另一种,它也可以被称为“源到源翻译”。这意味着它是一种“编译器”,但通常不像真正的编译器那么复杂。例如。如果您从C转换为Java,则可以“假设”C源代码在C编译器中编译。基于这个假设,你可以省略一个真正的编译器需要做的各种语义检查(例如类型检查)。 –

3

这听起来像一个有趣的任务:-)你能描述一下脚本语言吗?

我会看看包javax.script,可能有一个类似的脚本语言(我知道关于Scala用作脚本语言)。另外,我会看看javax.tools.JavaCompiler。我现在正在构建一个Java源代码生成器(在运行时创建和编译类代理)。生成Java源代码比生成字节码容易得多,这是肯定的。

至于解析,我会先为您的语言创建一个好的BNF。那里有一个tool to generate HTML railroad图。写BNF时你会犯错误,但如果你看铁路图,你会发现它们。它会确保你不会做出无法解析的东西。我知道大多数人会建议使用ANTLR或JavaCC,但我会编写自己的递归下降解析器,因为我认为它更容易,更灵活(我已经做了几次,并知道我在说什么) 。一个例子是Jackrabbit SQL-2 parser

+0

嗨,它是程序化的脚本语言 - 基本的语言结构(循环,结构,条件)以及许多调用的函数和过程。没有方法,没有类......它是程序性的,而不是OOP – Xorty

+0

@Xorty,如果没有那种语言的反射,没有类似eval的功能,也没有任何类型的宏,比你的任务是微不足道的。如果你已经有了一个正在工作的解释器,你可以很容易地修改它以发出Java代码而不是执行任何事情。你最大的痛苦就是将运行时(库,FFI等)转移到Java中,而不是语言本身。 –

0

我建议你拿一本关于java编译器/解释器的书。 THRE是相当长的一段即:Writing Compilers and Interpreters

这是更好地看到大局先用词法分析器出发前/分析器等

或者,如果你想跳直接尝试ANTLR

0

我建议你使用antlr用于语言识别的Java库。 这是与大多数JVM语言一起使用的库。我没有使用它personnaly,但我知道Groovy是使用这个库建立的。