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