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
- 在队列中报告错误不会阻止任何进一步错误的警告,以便我们可以在单个编译过程中报告多个错误,而不是强迫开发人员玩重击。
- 不能parsingFirefox风格的
catch (<Identifier> if <Expression>)
因为这些在IE和其他解释器上不起作用。- 承认
const
因为许多解释器(不IE),但警告。- 允许,但警告在
Array
和Object
构造函数中的尾随逗号。- 允许使用关键字作为标识符名称,但会警告,因为不同的解释器有不同的关键字集 这使我们能够使用一个扩展的关键字集。
要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语法:
- http://www.antlr.org/grammar/1206736738015/JavaScript.g (不完整?)
- http://www.antlr.org/grammar/1153976512034/ecmascriptA3.g (越野车?)
来自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