跳到主要内容

JEP 236:Nashorn 的解析器 API

QWen Max 中英对照

概述

定义 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 已经由 javaccom.sun.source 包及其子包 中支持。

解析器 API 将使 IDE 和服务器端框架等程序能够分析 ECMAScript 代码,而这些程序无需依赖 Nashorn 的内部实现类。

描述

附带的 javadoc 文件包含了新 jdk.nashorn.api.tree 包中提议的接口和类的文档。API 的起点是 ParserFactoryParserFactoryImpl 类。ParserFactory 对象接受一个字符串数组作为配置解析器的选项。支持的选项与 Nashorn 命令行工具 jjs 支持的选项相同,也包括 Nashorn 脚本引擎的 nashorn.args 系统属性。

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

测试

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