Nashorn抽象语法树遍历

时间:2018-02-13 22:34:49

标签: java tree nashorn

我试图通过Nashorn解析这个Javascript:

function someFunction() { return b + 1 };

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

下面的代码只是打印: " function {U%} someFunction = [] function {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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

使用nashorn引擎的私有/内部实现类不是一个好主意。启用安全管理器后,您将获得访问异常。使用jdk9及更高版本,如果没有安全管理器,您将获得模块访问错误(如jdk.nashorn.internal。*包未从nashorn模块导出)。

使用nashorn解析javascript有两种选择:

要使用Parser API,您需要使用jdk9 +。

  • 对于jdk8,您可以使用parser.js

    负载( “犀牛:parser.js”);

并从脚本中调用“parse”函数。此函数返回一个JSON对象,该对象表示已解析脚本的AST。

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