我试图通过Nashorn解析这个Javascript:
function someFunction() { return b + 1 };导航到所有语句。这包括函数内部的语句。
下面的代码只打印:“函数{U%}someFunction = []函数{U%}someFunction()”
我如何“进入”函数节点到它的身体“返回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);
}
}
}发布于 2018-02-19 14:21:11
使用nashorn引擎的私有/内部实现类不是个好主意。有了安全管理器,您将获得访问异常。使用jdk9和更高版本,您将得到模块访问错误w/没有安全管理器(如jdk.nashorn.inal.*包不是从nashorn模块导出的)。
您有两个选项可以使用nashorn解析javascript:
要使用Parser,您需要使用jdk9+。
并从脚本调用“解析”函数。此函数返回一个JSON对象,该对象表示解析的脚本的AST。
参见此示例:http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn/file/a6d0aec77286/samples/astviewer.js
https://stackoverflow.com/questions/48776811
复制相似问题