首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nashorn抽象语法树遍历

Nashorn抽象语法树遍历
EN

Stack Overflow用户
提问于 2018-02-13 22:34:49
回答 1查看 865关注 0票数 4

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

代码语言:javascript
复制
function someFunction() { return b + 1 };

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

下面的代码只打印:“函数{U%}someFunction = []函数{U%}someFunction()”

我如何“进入”函数节点到它的身体“返回b+ 1"?我想我需要和访客一起遍历树并得到子节点?

我一直在跟踪以下问题的第二个答案:Javascript parser for 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);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-19 14:21:11

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

您有两个选项可以使用nashorn解析javascript:

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

  • 对于jdk8,可以使用parser.js 负载(“nashorn:parser.js”);

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48776811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档