Nashorn抽象语法树遍历

4
我尝试通过Nashorn解析这段Javascript代码:
function someFunction() { return b + 1 };

导航到所有语句,包括函数内的语句。

以下代码只打印:"function {U%}someFunction = [] function {U%}someFunction()"

如何“进入”函数节点并获取其主体“return b + 1”?我想我需要使用访问器遍历树并获取子节点?

我一直在按照以下问题的第二个答案进行操作: Java的JavaScript解析器

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);
        }
    }
}
1个回答

4
使用nashorn引擎的私有/内部实现类并不是一个好主意。如果开启了安全管理器,您将会受到访问异常的限制。在jdk9及其以上版本中,您将会在/没有安全管理器的情况下得到模块访问错误(因为从nashorn模块未导出jdk.nashorn.internal.*包)。
您有两种选项来解析javascript使用nashorn:
1. Nashorn解析器API -> https://docs.oracle.com/javase/9/docs/api/jdk/nashorn/api/tree/Parser.html 要使用Parser API,您需要使用jdk9+。
2. 对于jdk8,您可以使用parser.js并从脚本中调用“parse”函数。此函数返回代表解析脚本的AST的JSON对象。

请查看此示例: http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn/file/a6d0aec77286/samples/astviewer.js


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接