跳到主要内容

JEP 236:Nashorn 的解析器 API

概括

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

目标

  • 提供接口类来表示 Nashorn 语法树节点。

  • 提供一个工厂来创建已配置的解析器实例,并通过 API 传递 Nashorn 命令行选项来完成配置。

  • 提供访问者模式 API 来访问 AST 节点。

  • 提供使用 API 的示例/测试程序。

非目标

  • AST 节点将尽可能表示 ECMAScript 规范中的概念,但它们不会完全相同。只要有可能,javacECMAScript 就会采用树 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 的起点是ParserFactoryParserFactoryImpl类。对象ParserFactory接受字符串数组,这些字符串是配置解析器的选项。支持的选项与Nashorn shell工具支持的选项相同jjs,以及nashorn.argsNashorn脚本引擎的系统属性。

创建解析器实例后,可以将来自字符串、URL 或文件的 ECMAScript 源提交给解析器,解析器将返回一个CompilationUnitTree对象。任何解析错误都会通过DiagnosticListener调用者提供的对象报告。

测试

已经有超过 1,000 个 Nashorn 脚本测试。所有可解析的源都将被解析以检查解析器不会崩溃。将解析包含各种代码模式的选定文件,并将其 JSON 表示形式与预期结果进行比较。此外,还将添加一组具有解析错误的文件,以检查用户提供的文件是否DiagnosticListener收到错误消息以及结果是否CompilationUnitTree具有ErrorTree所需的节点。