Skip to content
微信扫码关注公众号

JEP 236: Parser API for Nashorn | Nashorn 的解析器 API

摘要

定义一个支持 Nashorn ECMAScript 抽象语法树的 API。

目标

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

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

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

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

非目标

  • AST 节点将尽可能地表示 ECMAScript 规范中的概念,但它们不会完全相同。只要可能,将采用 javac 树 API 的接口来采用 ECMAScript 。

  • 不使用外部解析器/树标准或 API。

  • 不提供脚本级解析器 API。这是一个 Java API,虽然脚本可以调用 Java,因此可以使用此 API。

动机

IDE(例如 NetBeans)使用 Nashorn 进行 ECMAScript 编辑/调试以及 ECMAScript 代码分析。这些工具和框架目前使用 Nashorn 内部 AST 表示进行代码分析。在 jdk.nashorn.internal.ir 包及其子包中使用内部类的这种用法阻止了 Nashorn 内部实现类的自由演化。此 JEP 将定义 Nashorn 解析器 API,位于公开的包 jdk.nashorn.api.tree 中。javac 中已经支持了类似的抽象语法树 API,在 com.sun.source 包及其子包中。

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

描述

附加的 javadoc 文件包含新 jdk.nashorn.api.tree 包的建议接口和类的文档。API 的起点是 ParserFactoryParserFactoryImpl 类。ParserFactory 对象接受一个字符串数组,这些选项用于配置解析器。支持的选项与 Nashorn shell 工具 jjs 支持的选项相同,以及 Nashorn 脚本引擎的 nashorn.args 系统属性。

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

测试

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