Nashorn 抽象语法树遍历
Nashorn Abstract Syntax Tree Traversal
我正在尝试通过 Nashorn 解析此 Javascript:
function someFunction() { return b + 1 };
并导航到所有语句。这包括函数内的语句。
下面的代码只打印:
"function {U%}someFunction = [] function {U%}someFunction()"
我如何 "get inside" 函数节点到它的主体 "return b + 1"?我想我需要用访问者遍历树并获取子节点?
我一直在关注以下问题的第二个答案:
Javascript parser for Java
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;
import java.util.List;
public class Main {
public static void main(String[] args){
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 = Source.sourceFor("test", "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();
for(Statement statement: statements){
System.out.println(statement);
}
}
}
使用 private/internal 实现 类 的 nashorn 引擎不是一个好主意。启用安全管理器后,您将获得访问异常。使用 jdk9 及更高版本,您将收到模块访问错误 w/without 安全管理器(如 jdk.nashorn.internal.* 包未从 nashorn 模块导出)。
您有两个选项可以使用 nashorn 解析 javascript:
要使用解析器API,您需要使用jdk9+。
对于jdk8,可以使用parser.js
加载("nashorn:parser.js");
并从脚本调用 "parse" 函数。此函数 returns 一个 JSON 表示已解析脚本的 AST 的对象。
查看示例:http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn/file/a6d0aec77286/samples/astviewer.js
我正在尝试通过 Nashorn 解析此 Javascript:
function someFunction() { return b + 1 };
并导航到所有语句。这包括函数内的语句。
下面的代码只打印: "function {U%}someFunction = [] function {U%}someFunction()"
我如何 "get inside" 函数节点到它的主体 "return b + 1"?我想我需要用访问者遍历树并获取子节点?
我一直在关注以下问题的第二个答案: Javascript parser for Java
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;
import java.util.List;
public class Main {
public static void main(String[] args){
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 = Source.sourceFor("test", "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();
for(Statement statement: statements){
System.out.println(statement);
}
}
}
使用 private/internal 实现 类 的 nashorn 引擎不是一个好主意。启用安全管理器后,您将获得访问异常。使用 jdk9 及更高版本,您将收到模块访问错误 w/without 安全管理器(如 jdk.nashorn.internal.* 包未从 nashorn 模块导出)。
您有两个选项可以使用 nashorn 解析 javascript:
要使用解析器API,您需要使用jdk9+。
对于jdk8,可以使用parser.js
加载("nashorn:parser.js");
并从脚本调用 "parse" 函数。此函数 returns 一个 JSON 表示已解析脚本的 AST 的对象。
查看示例:http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn/file/a6d0aec77286/samples/astviewer.js