我们公司使用拥有(内置于此处)脚本语言进行编程,但他们希望创建将此脚本代码转换为Java的解释器。这种脚本语言非常严重,所以这不小。
我被问到这个任务,但这似乎不是一件小事。在我做任何愚蠢的事情并开始编写数十亿行解析之前,我应该知道什么?我应该从哪里开始做到这一点?
PS:我想将脚本文件转换为.java源代码,而不是直接转换为字节码。
答案 0 :(得分:5)
如果要将脚本转换为Java,它不是解释器,而是编译器。如果您正在考虑在阅读期间执行脚本,那么是解释器。
但是,您应该查看JavaCC或Antlr。它们都适用于编译或翻译任务。您必须指定语言的语法规则,并且必须在Java中编写一些额外的逻辑,实现脚本语言的语义。如果要创建解释器,您编写的Java代码将生成更多Java(或任何)代码。如果需要编译器,您编写的Java代码将直接执行脚本。
另一个值得了解的概念是Abstract Syntax Tree。
以下是关于更多lexer and parser generators的全面列表。
答案 1 :(得分:3)
这听起来像一个有趣的任务:-)你能描述一下脚本语言吗?
我会查看包javax.script
,可能有类似的脚本语言(我知道Scala用作脚本语言)。另外,我会看javax.tools.JavaCompiler
。我正在构建一个Java源代码生成器(在运行时创建和编译类代理)。生成Java源代码比生成字节码容易得多,这是肯定的。
至于解析,我首先要为你的语言创建一个好的BNF。有一个tool to generate HTML railroad图表。写BNF时会犯错误,但如果你看铁路图,你会发现它们。它将确保您不会制作无法解析的内容。
我知道大多数人会建议使用ANTLR或JavaCC,但我会编写你自己的递归 - 下降解析器,因为我觉得它更简单,更灵活(我已经做了几次,知道我在说什么)。一个例子是Jackrabbit SQL-2 parser。
答案 2 :(得分:2)
您可以尝试javacc解析器。
答案 3 :(得分:0)
我建议你在java中找一本关于编写器/解释器的书。 有一些是:Writing Compilers and Interpreters
在开始使用词法分析器/解析器等之前,最好先看一下大图。
或者如果你想直接跳进试试antlr
答案 4 :(得分:0)
我建议您使用用于语言识别的antlr java库。 它与大多数JVM语言使用的库相同。我没有使用过personnaly,但我知道Groovy是使用这个库构建的。