gpt4 book ai didi

java - Nashorn 抽象语法树遍历

转载 作者:行者123 更新时间:2023-12-05 01:07:20 25 4
gpt4 key购买 nike

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

function someFunction() { return b + 1 };

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

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

我如何“进入”函数节点到它的主体“return 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);
}
}
}

最佳答案

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

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

  • Nashorn 解析器 API -> https://docs.oracle.com/javase/9/docs/api/jdk/nashorn/api/tree/Parser.html

  • 要使用 Parser API,您需要使用 jdk9+。
  • 对于 jdk8,可以使用 parser.js

    加载(“nashorn:parser.js”);

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

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

    关于java - Nashorn 抽象语法树遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776811/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com