Java的JavaScriptparsing器

任何人都可以推荐一个体面的JavaScriptparsing器的Java? 我相信犀牛可以使用,但是这只是一个解决办法,或者它是唯一的体面的解决scheme? 任何build议将不胜感激。 谢谢。

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

下面的语法是这个parsing器parsing语法的上下文无关表示。 它不同意EcmaScript 262版本3(ES3)的实现不同意ES3。 由于分号插入需要来自词法分析器和分析器的信息,并且不能用有限的前瞻方法来确定,因此分号插入的规则和在正确处理回溯所需的expression式中可能的回溯都在代码中进行了彻底的评论。

值得注意的function

  1. 在队列中报告错误不会阻止任何进一步错误的警告,以便我们可以在单个编译过程中报告多个错误,而不是强迫开发人员玩重击。
  2. 不能parsingFirefox风格的catch (<Identifier> if <Expression>)因为这些在IE和其他解释器上不起作用。
  3. 承认const因为许多解释器(不IE),但警告。
  4. 允许,但警告在ArrayObject构造函数中的尾随逗号。
  5. 允许使用关键字作为标识符名称,但会警告,因为不同的解释器有不同的关键字集 这使我们能够使用一个扩展的关键字集。

要parsing严格的代码,传入一个PedanticWarningMessageQueue ,将MessageLevel#WARNING及以上转换为MessageLevel#FATAL_ERROR


CajaTestCase.js展示了如何设置一个parsing器,在同一个类中的[ fromResource ]和[ fromString ]展示了如何获得正确types的input。

使用Java V1.8时,有一个技巧可以用来parsingNashorn实现。 通过查看OpenSDK源代码中的unit testing,您可以看到如何仅使用parsing器,而无需执行所有额外的编译工作。

 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个expression式提供抽象语法树(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 Script作为我自己的域特定语言(DSL)的expression式语言,然后在运行时将其编译为Java类并使用。 AST让我生成适当的Java代码来捕捉Java Scriptexpression式的意图。


Nashorn与Java SE 8一起提供。

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

这里有两个ANTLR或多或less的工作或完成(见这篇文章的评论)的EcmaScript语法:

来自ANTLR 5分钟介绍 :

ANTLR读取一个名为语法的语言描述文件,并生成一些源代码文件和其他辅助文件。 ANTLR的大多数用途至less会生成一个(也常常是两个)这些工具:

  • 词法分析器:它读取input字符或字节stream(即字符,二进制数据等),使用您指定的模式将其分为令牌,并生成令牌stream作为输出。 它还可以使用ANTLRparsing器自动理解和尊重的协议将一些令牌(如空格和注释)标记为隐藏。

  • parsing器:读取令牌stream(通常由词法分析器生成),并通过您指定的规则(模式)匹配您的语言中的短语,并且通常对匹配的每个短语(或子短语)执行一些语义操作。 每个匹配都可以调用自定义动作,通过StringTemplate编写一些文本,或者生成一个抽象语法树来进行额外的处理。

以前的答案描述了一种在JDK 8的封面下parsingjavascript的方法。 他们现在正在用Java 9做主线程。很好!

这将意味着你不需要包含任何库,相反,我们可以依赖java官方的官方实现。 以编程方式parsingJavaScript更容易实现,而不必进入java代码的禁忌区域。

这个应用程序可能是你想要使用JavaScript的规则引擎,它在运行时被parsing并编译成其他语言。 AST让你“理解”用简洁的JavaScript语言编写的逻辑,然后在其他语言或框架中执行或评估时生成较less的逻辑。

http://openjdk.java.net/jeps/236

从上面的链接总结:

为Nashorn的ECMAScript抽象语法树定义支持的API。

目标

  • 提供接口类来表示Nashorn语法树节点。
  • 提供一个工厂来创build一个configuration的parsing器实例,configuration通过一个API传递Nashorn命令行选项来完成。
  • 提供访问者模式API来访问AST节点。
  • 提供样本/testing程序以使用API​​。

非目标

  • AST节点尽可能在ECMAScript规范中表示概念,但它们不会完全相同。 只要有可能,ECMAScript将采用javac树API的接口。
  • 不会使用外部parsing器/树标准或API。
  • 将不会有脚本级parsing器API。 这是一个Java API,尽pipe脚本可以调用到Java中,因此可以使用这个API。

对我来说,最好的解决scheme是使用橡子 – https://github.com/marijnh/acorn在犀牛下。;

我只是不认为caja已经得到了重视。

EcmaScript 5parsing器的Java https://github.com/DigiArea/es5-model