Nashorn抽象语法树遍历



我正在尝试通过nashorn解析此JavaScript:

function someFunction() { return b + 1 };

并导航到所有语句。这包括功能中的语句。

下面的代码仅打印:"函数{u%} somefunction = []函数{u%} somefunction(("

我如何"进入"函数节点到它的身体"返回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);
        }
    }
}

使用Nashorn Engine的私人/内部实现类别不是一个好主意。在Security Manager开启的情况下,您将获得访问例外。使用JDK9及以后的情况,您将获得无安全管理器的模块访问错误(如jdk.nashorn.internal。

使用Nashorn分析JavaScript的两个选项:

  • nashorn parser api-> https://docs.oracle.com/javase/9/docs/api/jdk/nashorn/nashorn/api/tree/parser.html

要使用Parser API,您需要使用JDK9 。

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

    load(" nashorn:parser.js"(;

并从脚本调用"解析"函数。此函数返回一个表示脚本解析的AST的JSON对象。

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

最新更新