JavaCC概览

肖钟城
  • 大数据技术栈
  • JavaCC
大约 6 分钟

JavaCC概览

Java Compiler Compiler(JavaCC)是用于 Java 应用程序的最流行的解析器生成器。

解析器生成器是一种读取语法规范并将其转换为可以识别与语法匹配的 Java 程序的工具。

除了解析器生成器本身之外,JavaCC 还提供与解析器生成相关的其他标准功能,例如树构建(通过 JavaCC 附带的名为 JJTree 的工具)、操作和调试。

运行 JavaCC 解析器所需要的只是 Java 运行时环境 (JRE)。

基本介绍

特征

JavaCC 生成自顶向下(递归下降)解析器,而不是由类似 YACC 的工具生成的自底向上解析器。 这允许使用更通用的语法,尽管不允许左递归。自顶向下解析器具有许多其他优点(除了更通用的语法),例如更容易调试,能够解析到语法中的任何非终结符,并且还能够向上传递值(属性) 并在解析过程中向下解析树。

默认情况下,JavaCC 生成一个 LL(1) 解析器。 但是,可能有部分语法不是 LL(1)。 JavaCC 提供了句法和语义超前的能力,以在这些点上解决本地的移位歧义。 例如,解析器仅在这些点为 LL(k),但在其他任何地方保持 LL(1) 以获得更好的性能。 移位归约和归约归约冲突对于自上而下的解析器来说不是问题。

JavaCC 生成 100% 纯 Java 的解析器,因此对 JavaCC 没有运行时依赖,也不需要在不同机器平台上运行所需的特殊移植工作。

JavaCC 允许在词汇和语法规范中扩展 BNF 规范,例如 (A)、(A)+ 等。 扩展的 BNF 在一定程度上减轻了对左递归的需求。 事实上,扩展的 BNF 通常更容易阅读,例如 A ::= y(x) 与 A ::= Ax|y。

词法规范(如正则表达式、字符串)和语法规范(BNF)都写在同一个文件中。 它使语法更易于阅读,因为可以在语法规范中内联使用正则表达式,并且更易于维护。

JavaCC 的词法分析器可以处理完整的 Unicode 输入,词法规范也可以包括任何 Unicode 字符。 这有助于描述语言元素,例如允许某些 Unicode 字符(不是 ASCII)但不允许其他字符的 Java 标识符。

JavaCC 提供类 Lex 的词法状态和词法动作功能。 JavaCC 中优于其他工具的特定方面是一流状态,它提供诸如 TOKEN、MORE、SKIP 和状态更改等概念。 这允许更清晰的规范以及来自 JavaCC 的更好的错误和警告消息。

词法规范中定义为特殊标记的标记在解析期间将被忽略,但这些标记可供工具处理。 一个有用的应用是处理评论。

词法规范可以在整个词法规范的全局级别或在单个词法规范的基础上定义不区分大小写的标记。

JavaCC 带有 JJTree,一个非常强大的树构建预处理器。

JavaCC 还包括 JJDoc,这是一种将语法文件转换为文档文件的工具,可选择采用 HTML 格式。

JavaCC 提供了许多选项来定制它的行为和生成的解析器的行为。 此类选项的示例是对输入流执行的 Unicode 处理的种类、要执行的歧义检查的标记数等。

JavaCC 错误报告在解析器生成器中名列前茅。 JavaCC 生成的解析器能够通过完整的诊断信息清楚地指出解析错误的位置。

使用选项 DEBUG_PARSER、DEBUG_LOOKAHEAD 和 DEBUG_TOKEN_MANAGER,用户可以深入分析解析和令牌处理步骤。

JavaCC 版本包含范围广泛的示例,包括 Java 和 HTML 语法。 这些示例及其文档是熟悉 JavaCC 的好方法。

示例

此示例识别匹配的大括号后跟零个或多个行终止符,然后是文件结尾。

此语法中合法字符串的示例是:

{}, }}} // … etc

非法字符串是:

{}{}, }{}}, { }, {x} // … etc

语法

PARSER_BEGIN(Example)

/** Simple brace matcher. */
public class Example {

  /** Main entry point. */
  public static void main(String args[]) throws ParseException {
    Example parser = new Example(System.in);
    parser.Input();
  }

}

PARSER_END(Example)

/** Root production. */
void Input() :
{}
{
  MatchedBraces() ("\n"|"\r")* <EOF>
}

/** Brace matching production. */
void MatchedBraces() :
{}
{
  "{" [ MatchedBraces() ] "}"
}

输出

$ java Example
<return>
$ java Example
{x<return>
Lexical error at line 1, column 2.  Encountered: "x"
TokenMgrError: Lexical error at line 1, column 2.  Encountered: "x" (120), after : ""
        at ExampleTokenManager.getNextToken(ExampleTokenManager.java:146)
        at Example.getToken(Example.java:140)
        at Example.MatchedBraces(Example.java:51)
        at Example.Input(Example.java:10)
        at Example.main(Example.java:6)
$ java Example
{}}<return>
ParseException: Encountered "}" at line 1, column 3.
Was expecting one of:
    <EOF>
    "\n" ...
    "\r" ...
        at Example.generateParseException(Example.java:184)
        at Example.jj_consume_token(Example.java:126)
        at Example.Input(Example.java:32)
        at Example.main(Example.java:6)

开始使用

按照此处的步骤开始使用 JavaCC。

本指南将引导您在本地构建项目、运行现有示例并进行设置以开始开发和测试您自己的 JavaCC 应用程序。

JavaCC 7.0.10 是我们最新的稳定版本。

JavaCC 7.0.10 -(源代码 (zip)open in new window源代码 (tar.gz)open in new window二进制文件open in new windowJavadocopen in new window发行说明open in new window) 所有 JavaCC 版本都可以通过 GitHub open in new windowMavenopen in new window 获得,包括校验和和加密签名。

对于所有以前的版本,请参阅稳定版本open in new window

GitHub 8.0 分支包含下一代 JavaCC,它将前端(JavaCC 解析器)与后端(针对 Java、C++ 和 C# 的代码生成器)分开。 JavaCC 的状态是实验性的,尚未准备好生产。

安装

要安装 JavaCC,请导航至下载目录并输入:

$ unzip javacc-7.0.10.zip
or
$ tar xvf javacc-7.0.10.tar.gz

然后将二进制 javacc-7.0.10.jar 放在一个新的 target/ 文件夹中,并重命名为 javacc.jar。

完成安装后,将 JavaCC 安装中的脚本/目录添加到您的 PATH 中。 JavaCC、JJTree 和 JJDoc 调用脚本/可执行文件驻留在这个目录中。

在基于 UNIX 的系统上,脚本可能无法立即执行。 这可以通过使用 javacc-7.0.10/ 目录中的命令来解决:

chmod +x scripts/javacc

源码编译JavaCC

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

构建 JavaCC 的先决条件: Git

Ant(我们需要 1.5.3 或更高版本 - 你可以从 http://ant.apache.orgopen in new window 获得 ant)

Maven

Java 8(尚不支持 Java 9 和 10)

$ git clone https://github.com/javacc/javacc.git
$ cd javacc
$ ant

这将在 target/ 目录中构建 javacc.jar 文件

IDEA与Eclipse插件

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.1