Javascript parser for Java [已关闭]

2022-09-01 06:11:08

任何人都可以推荐一个像样的Javascript解析器来为Java?我相信可以使用Rhino,但是对于仅进行解析来说,这似乎有些过分,或者它是唯一体面的解决方案?任何建议将不胜感激。谢谢。


答案 1

https://github.com/google/caja/blob/master/src/com/google/caja/parser/js/Parser.java

下面的语法是此解析器解析的语法的上下文无关表示形式。它不同意 EcmaScript 262 Edition 3 (ES3),其中实现与 ES3 不一致。正确处理回溯所需的分号插入规则和表达式中可能的回溯在代码中进行了彻底的注释,因为分号插入需要来自词法分析器和解析器的信息,并且无法通过有限前瞻确定。

值得注意的功能

  1. 报告队列中的警告,其中错误不会阻止任何进一步的错误,因此我们可以在单个编译过程中报告多个错误,而不是强迫开发人员玩 whack-a-mole。
  2. 不解析Firefox样式,因为它们不适用于IE和许多其他解释器。catch (<Identifier> if <Expression>)
  3. 识别,因为许多解释器(不是IE)但警告。const
  4. 允许,但警告,在 和 构造函数中尾随逗号。ArrayObject
  5. 允许关键字作为标识符名称,但由于不同的解释器具有不同的关键字集,因此会发出警告。这允许我们使用广泛的关键字集。

要解析严格代码,请传入 将及以上转换为 .PedanticWarningMessageQueueMessageLevel#WARNINGMessageLevel#FATAL_ERROR


CajaTestCase.js展示了如何设置解析器,同一类中的 [] 和 [] 展示了如何获取正确类型的输入。fromResourcefromString


答案 2

使用 Java V1.8 时,您可以使用一个技巧来解析开箱即用的 Nashorn 实现。通过查看OpenSDK源代码中的单元测试,您可以看到如何仅使用解析器,而无需执行所有额外的编译等...

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   = new Source("test", "var a = 10; var b = a + 1;" +
            "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();

运行此代码后,您将拥有“语句”列表中 3 个表达式的抽象语法树 (AST)。

然后可以根据您的需求对其进行解释或操作。

前面的示例适用于以下导入:

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;

您可能需要添加访问规则才能使访问。jdk/nashorn/internal/**


在我的上下文中,我正在使用Java脚本作为我自己的域特定语言(DSL)的表达式语言,然后我将在运行时编译为Java类并使用。AST 允许我生成适当的 Java 代码来捕获 Java 脚本表达式的意图。


Nashorn 随 Java SE 8 一起提供。

有关获取 Nashorn 源代码的信息链接如下:https://wiki.openjdk.java.net/display/Nashorn/Building+Nashorn