JEP 236:Nashorn 的解析器 API
概括
为 Nashorn 的 ECMAScript 抽象语法树定义受支持的 API。
目标
-
提供接口类来表示 Nashorn 语法树节点。
-
提供一个工厂来创建已配置的解析器实例,并通过 API 传递 Nashorn 命令行选项来完成配置。
-
提供访问者模式 API 来访问 AST 节点。
-
提供使用 API 的示例/测试程序。
非目标
-
AST 节点将尽可能表示 ECMAScript 规范中的概念,但它们不会完全相同。只要有可能,
javac
ECMAScript 就会采用树 API 的接口。 -
不会使用外部解析器/树标准或 API。
-
不会有脚本级解析器 API。这是一个 Java API,尽管脚本可以调用 Java 并因此使用此 API。
动机
NetBeans 等 IDE 使用 Nashorn 进行 ECMAScript 编辑/调试以及 ECMAScript 代码分析。这些工具和框架目前使用 Nashorn 的内部 AST 表示进行代码分析。jdk.nashorn.internal.ir
包及其子包中内部类的这种使用阻止了 Nashorn 内部实现类的自由演化。该 JEP 将在公开的包 中定义 Nashorn 解析器 API jdk.nashorn.api.tree
。包及其子包javac
中已经支持类似的抽象语法树 API 。com.sun.source
解析器 API 将使 IDE 和服务器端框架等程序能够进行 ECMAScript 代码分析,而这些程序不必依赖于 Nashorn 的内部实现类。
描述
附加的 javadoc 文件包含新jdk.nashorn.api.tree
包的建议接口和类的文档。 API 的起点是ParserFactory
和ParserFactoryImpl
类。对象ParserFactory
接受字符串数组,这些字符串是配置解析器的选项。支持的选项与Nashorn shell工具支持的选项相同jjs
,以及nashorn.args
Nashorn脚本引擎的系统属性。
创建解析器实例后,可以将来自字符串、URL 或文件的 ECMAScript 源提交给解析器,解析器将返回一个CompilationUnitTree
对象。任何解析错误都会通过DiagnosticListener
调用者提供的对象报告。
测试
已经有超过 1,000 个 Nashorn 脚本测试。所有可解析的源都将被解析以检查解析器不会崩溃。将解析包含各种代码模式的选定文件,并将其 JSON 表示形式与预期结果进行比较。此外,还将添加一组具有解析错误的文件,以检查用户提供的文件是否DiagnosticListener
收到错误消息以及结果是否CompilationUnitTree
具有ErrorTree
所需的节点。