JavaCC

2025年3月29日 | 阅读 6 分钟

与 YACC 类似,JavaCC 也是一个解析器。JavaCC 是 Java Compiler-Compiler 的缩写。它是由 Oracle Corporation 开发的一个开源的流行解析器生成器和词法分析器生成器工具。它使用 Java 编程语言 编写。它根据 BSD 许可证授权。它被广泛用于 Java 应用程序。它生成自顶向下的解析器。它主要用于 LL(K) 文法。它还生成由 lex 生成的词法分析器。

JavaCC 通过 Java 语言扩展提供了对编程语言语法的定义。

JavaCC

解析器生成

解析器词法分析器是处理字符序列输入的两个软件组件。编译器和解释器集成词法分析器和解析器。解析器用于解析包含程序的源文件。换句话说,解析器读取语法规范,并将它们转换为能够识别语法匹配的 Java 程序。

词法分析器将字符序列分解成称为标记 (tokens) 的子序列,并对这些标记进行分类。因此,词法分析器和解析器可用于各种程序。

JavaCC

JavaCC 还能执行标准的解析器功能,如树构建、调试和动作。树构建功能由 JavaCC 内置的名为 JJTree 的工具执行。

JavaCC 的设计

让我们通过下图了解 JavaCC 的设计。

下图描述了 JavaCC 生成的词法分析器(也称为标记管理器)和 JavaCC 生成的解析器之间的关系。只要我们向 JavaCC 描述了语言的规则,JavaCC 解析器就可以处理任何编程语言。但在下图,我们使用了 C 编程语言作为输入。

JavaCC

在上面的图中,我们看到标记管理器读取输入并生成一个称为标记 (tokens) 的对象序列。标记的生成取决于我们用来分解字符序列的语言规则。规则由用户提供,作为正则表达式的集合。

解析器消耗由标记管理器生成的标记。它分析标记的结构并生成用户定义的输出。

JavaCC 的特性

  • 它是一个自顶向下的 LL(K) 解析器生成器。
  • 它在一个文件中指定词法和语法规范。
  • 它使用功能强大的 JJTree 工具进行树构建。因此,它也是一个树构建处理器。
  • 它通过提供不同的选项是可定制的。
  • 它使用 JJDoc 工具生成文档。它将语法文件转换为文档文件。因此,它也是一个文档生成工具。
  • 它也支持国际化,因为它能处理完整的 Unicode 输入。
  • 它提供多个选项来自定义自身 (JavaCC) 和生成解析器的行为。
  • JavaCC 生成的解析器能够清晰地指出解析错误的位置,并提供完整的诊断信息。
  • 通过使用 DEBUG_PARSER、DEBUG_LOOKAHEAD 和 DEBUG_TOKEN_MANAGER 选项,我们可以深入分析标记处理步骤。
  • 它允许使用扩展的 BNF 规范,因为它更易于阅读。
  • 语法和语义前瞻(在 7.0.5 版本中已省略此功能)。

下载和安装 JavaCC

JavaCC 的最新版本是 7.0.9。所以,我们将下载并安装最新版本,并在本节中一直使用它。

注意:我们也可以将 JavaCC 与 Eclipse 和 IntelliJ IDEA 等 IDE 一起使用。如果将 JavaCC 与 IDE 一起使用,则需要下载 JavaCC 插件

步骤 1:https://bit.ly/39C5tGZ 下载 JavaCC 工具。它将开始下载文件 javacc-javacc-7.0.9.zip。

JavaCC

步骤 2:将文件解压到您想要的目录。在本例中,我们将其解压到 F:\javacc 文件夹。

JavaCC

步骤 3:创建一个 target 目录。我们在 F:\javacc\javacc-javacc-7.0.9\target 位置创建了一个 target 目录。

JavaCC

步骤 4:https://bit.ly/3nKU3G4 下载 javacc-7.0.9.jar 文件。

步骤 5:将 JAR 文件复制到新创建的 target 目录。

JavaCC

步骤 6:将 JAR 文件重命名为 javacc.jar。

JavaCC

现在,是时候验证安装了。

步骤 7:打开命令提示符,导航到目录 F:\javacc\javacc-javacc-7.0.9。

步骤 8:执行以下命令

执行上述命令后,我们会看到很多与 JavaCC 相关的内容,如下所示。

JavaCC

从源代码构建 JavaCC

源目录包含 JavaCC、JJTree 和 JJDoc 的源代码、启动脚本、示例语法和文档。它还包含构建 JavaCC 所需的引导程序版本的 JavaCC。

构建 JavaCC 的先决条件

使用 JavaCC 的步骤

步骤 1:编写 JavaCC 规范。这意味着我们需要创建一个 .jj 文件。在此文件中定义语法和动作。假设我们生成了 demo.jj。

步骤 2:运行 JavaCC,它会生成解析器和扫描器。我们使用 javacc 命令来执行 .jj 文件。

上述命令生成标记、扫描器和解析器。

步骤 3:创建一个使用解析器的 Java 程序。假设我们创建了一个名为 DemoParser.java 的程序。

步骤 4:最后,编译并运行我们在上一步中创建的 Java 程序。使用以下命令运行程序

JavaCC 的用途

JavaCC 已用于开发基于正式和专有规范的各种类型的解析器。

类型规范
编程语言Ada,CC++COBOL,cURL,JavaJavaScript,Oberon,PHPPython,Visual Basic
查询语言SQLPLSQL,SPARQL,OQL,XML-QL,XPathXQuery
文档模式JSONXML,DTD,HTML,RTF,XSLT
消息模式ASN.1,电子邮件,FIX,SWIFT,RPC
建模语言EXPRESS,IDL,MDL,STEP,ODL,VHDL,VRML
其他配置文件、模板、计算器等。

使用 JavaCC 构建的软件

以下软件是使用 JavaCC 开发的

  • JavaParser
  • PMD
  • Apache Derby
  • BeanShell
  • Apache Lucene
  • Vaadin
  • Judoscript

请记住

  • JavaCC 不会自动构建树。它有两个树构建工具 JJTree 和 JTB。
  • 它不构建符号表。
  • 它不生成输出语言。但是如果我们有树结构,我们可以从中生成输出。

JavaCC 生成的文件

JavaCC 是一个程序生成器工具。它读取 .jj 文件,如果没有错误,则生成多个 .java 文件。它使用默认选项生成以下文件。

模板文件

文件描述
SimpleCharStream.java该文件表示输入字符流。
Token.java该文件表示一个单独的输入标记。
TokenMgrError.java该文件表示由标记管理器抛出的错误(如果存在)。
ParseException.java该文件表示输入不符合解析器的语法。

上表中描述的文件仅在它们尚未生成时才生成。如果需要更改文件,我们应该在运行 JavaCC 之前进行更改。另外,请确保 JavaCC 不会覆盖它们。

自定义文件

文件描述
Demo.java这是解析器类。
DemoTokenManager.java这是标记管理器类。
DemoConstants.java这是一个接口,它将标记类与符号名称关联起来。

注意:在上表中,除了 Demo,您还可以选择任何名称。

JavaCC 默认选项

JavaCC 提供以下选项:

  • JAVA_UNICODE_ESCAPE:如果使用 JAVA_UNICODE_ESCAPE 选项,它不会生成 java 文件。它会生成 JavaCharStream.java 文件,而不是 SimpleCharStream.java 文件。
  • USER_CHAR_STREAM:如果使用 USER_CHAR_STREAM 选项,它会生成 CharStream.java 文件,而不是 java 文件。
  • USER_TOKEN_MANAGER:该选项会生成 java 文件,而不是生成具体的标记管理器。

标记管理器

标记管理器是一个词法分析器,它分析输入的字符,并将它们分解成称为标记的块。它还为每个标记分配类型。例如,考虑以下代码片段

上面的代码被标记管理器分解成如下标记

标记管理器不处理注释和空格。所以我们考虑它们。因此,在删除注释和空格后,我们得到以下标记

如上所述,每个标记都有一个类型。因此,上述标记可以分类如下

每个标记由 Token 类的对象表示。标记序列随后被传递给解析器进行进一步处理。


下一个主题Java 中的回车符