使用 Java V1.8 时,您可以使用一个技巧来解析现成的 Nashorn 实现。通过查看 OpenSDK 源代码中的单元测试,您可以了解如何仅使用解析器,而无需进行所有额外的编译等...
Options options = new Options("nashorn");
options.set("anon.functions", true);
options.set("parse.only", true);
options.set("scripting", true);
ErrorManager errors = new ErrorManager();
Context context = new Context(options, errors, Thread.currentThread().getContextClassLoader());
Source source = new Source("test", "var a = 10; var b = a + 1;" +
"function someFunction() { return b + 1; } ");
Parser parser = new Parser(context.getEnv(), source, errors);
FunctionNode functionNode = parser.parse();
Block block = functionNode.getBody();
List<Statement> statements = block.getStatements();
此代码运行后,您将拥有“语句”列表中 3 个表达式的抽象语法树 (AST)。
然后可以根据您的需要对其进行解释或操作。
前面的示例适用于以下导入:
import jdk.nashorn.internal.ir.Block;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.Statement;
import jdk.nashorn.internal.parser.Parser;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ErrorManager;
import jdk.nashorn.internal.runtime.Source;
import jdk.nashorn.internal.runtime.options.Options;
您可能需要添加访问规则以使 jdk/nashorn/internal/** 可访问。
在我的上下文中,我使用 Java 脚本作为我自己的领域特定语言 (DSL) 的表达式语言,然后我将在运行时将其编译为 Java 类并使用。 AST 让我可以生成适当的 Java 代码来捕捉 Java Script 表达式的意图。
Nashorn 在 Java SE 8 中可用。
获取 Nashorn 源代码的信息链接在这里:
https://wiki.openjdk.java.net/display/Nashorn/Building+Nashorn