gpt4 book ai didi

javascript - 使用 Nashorn 将 JavaScript 解析成语法树

转载 作者:行者123 更新时间:2023-11-30 20:48:52 25 4
gpt4 key购买 nike

我正在编写一个需要将 JavaScript 解析为语法树的 Java 程序。试试 JDK 9 中的 Nashorn API,据说可以做到这一点。有关解析器返回的数据类型的文档看起来并不十分有启发性:https://docs.oracle.com/javase/9/docs/api/jdk/nashorn/api/tree/CompilationUnitTree.html

我尝试编写并运行一些如下所示的代码:

        Parser              parser = Parser.create();
CompilationUnitTree tree = parser.parse(file, new InputStreamReader(stream), null);
System.out.println(tree.getSourceElements());
for (Object o : tree.getSourceElements()) {
System.out.println(o);
}

但输出看起来像这样:

[jdk.nashorn.api.tree.ExpressionStatementTreeImpl@32eebfca]
jdk.nashorn.api.tree.ExpressionStatementTreeImpl@32eebfca

我错过了什么?

明确地说,我不是在问为什么输出只包含带有 @ 符号的符号 - 显然这只是默认的 toString - 我指出从返回的数据中获取信息的明显方法不会做任何事情,因此大概预期的方法是不明显的。

最佳答案

tree.getSourceElements()为您提供类型为 Tree 的元素列表它有方法 getKind​()这给了你 Tree.Kind元素的:

Parser parser = Parser.create();
CompilationUnitTree tree = parser.parse(file, new InputStreamReader(stream), null);

for (Tree tree : tree.getSourceElements()) {
System.out.println(tree.getKind());

switch(tree.getKind()) {
case FUNCTION:
[...]
}
}

如果你想运行 AST,你可以实现接口(interface) TreeVisitor<R,D>访问节点:

Parser parser = Parser.create();
CompilationUnitTree tree = parser.parse(file, new InputStreamReader(stream), null);

if (tree != null) {
tree.accept(new BasicTreeVisitor<Void, Void>() {
public Void visitFunctionCall(FunctionCallTree functionCallTree, Void v) {
System.out.println("Found a functionCall: " + functionCallTree.getFunctionSelect().getKind​());
return null;
}
}, null);
}

关于javascript - 使用 Nashorn 将 JavaScript 解析成语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48399399/

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