天天看点

Javacc入门笔记一、什么是Javacc二、环境三、语法(jj文件)未完待续官方推荐资料参考文献

一、什么是Javacc

1.1 简介

Java Compiler Compiler (JavaCC) is the most popular parser generator for use with Java applications.

Java编译器编译器(JavaCC)是最流行的用于Java应用程序的解析器生成器。解析器生成器是一种工具,用于读取语法规范并将其转换为可以识别与语法匹配的Java程序。

JavaCC是一个词法分析生成器和语法分析生成器。词法分析和语法分析是处理输入字符序列的软件组件,编译器和解释器协同词法分析和语法分析来解码程序文件。词法分析器可以把一连串的字符序列划分成一个一个的叫做“Token”的子序列,同时它也可以把这些Token分类。这些Token序列将会传送给语法分析器以供其决定程序的结构。

JavaCC的输入文件是一个词法和语法的规范文件,其中也包括一些动作的描述,它的后缀应该是jj。

主要有以下功能:

  • JavaCC用来处理语法文件(jj)生成解析代码
  • JJTree 用来处理jjt文件,生成树节点代码和jj文件
  • JJDoc 根据jj文件,生成文本文件(Html)

运行JavaCC解析器所需的全部就是Java运行时环境(JRE)。

1.2 feature

  • TOP-DOWN:JavaCC产生自顶向下的语法分析器,而YACC等工具则产生的是自底向上的语法分析器。采用自顶向下的分析方法允许更通用的语法(但是包含左递归的语法除外)。自顶向下的语法分析器还有其他的一些优点,比如:易于调试,可以分析语法中的任何非终结符,可以在语法分析的过程中在语法分析树中上下传值等。
  • 默认的,javacc生成一个LL(1)解析器。但是,可能有一部分语法不是LL(1)。
  • JavaCC生成的解析器是100%纯Java的,因此对JavaCC没有运行时依赖性,并且不需要在不同的计算机平台上运行就需要进行特殊的移植工作。
  • JavaCC的允许扩展的BNF规格
  • 词汇规范(例如正则表达式,字符串)和语法规范(BNF)都一起写在同一文件中。由于可以在语法规范中内联使用正则表达式,并且易于维护,因此它使语法更易于阅读。
  • JavaCC 的词法分析器可以处理完整的Unicode输入,词法规范也可以包含任何Unicode字符。这有助于描述语言元素,例如允许某些Unicode字符(非ASCII)但不允许其他Unicode字符的Java标识符。
  • 在语法分析过程中,在词汇规范中定义为特殊标记的标记将被忽略,但是这些标记可供工具处理。这的一个有用的应用是在注释的处理中。
  • 词汇规范可以将标记定义为在整个词汇规范的全局级别或基于单个词汇规范的基础上都不区分大小写。
  • JavaCC带有JJTree,这是一种功能非常强大的树构建预处理器。
  • JavaCC还包括JJDoc,该工具可将语法文件转换为文档文件(可选地以HTML格式)。
  • JavaCC提供了许多选项来定制其行为和生成的解析器的行为。此类选项的示例是对输入流执行的Unicode处理的种类,要执行的歧义检查的令牌数等。
  • JavaCC错误报告是解析器生成器中最好的。JavaCC生成的解析器能够通过完整的诊断信息清楚地指出解析错误的位置。
  • 使用选项DEBUG_PARSER,DEBUG_LOOKAHEAD和和DEBUG_TOKEN_MANAGER,用户可以深入分析解析和令牌处理步骤。
  • JavaCC版本包含各种示例,包括Java和HTML语法。这些示例及其文档是熟悉JavaCC的好方法。

1.3 更新状态

开源项目一个重要评估就是社区是否更新。目前看起来近期有更新,而且更新速度较为友好。

JavaCC 7.0.5 is our latest stable release.

JavaCC 7.0.5 - 2019-10-14

1.4 License

JavaCC is an open source project released under the BSD License 2.0. The JavaCC project was originally developed at Sun Microsystems Inc. by Sreeni Viswanadha and Sriram Sankar.

1.5 同类和延伸项目

  • Javacc
  • lex
  • yacc
  • ANTLR
  • JavaParser:https://javaparser.org/

二、环境

2.1 maven

<!-- https://mvnrepository.com/artifact/net.java.dev.javacc/javacc -->
		<dependency>
			<groupId>net.java.dev.javacc</groupId>
			<artifactId>javacc</artifactId>
			<version>7.0.5</version>
		</dependency>
           

2.2 源码

javacc项目仓库 https://github.com/javacc/javacc

2.3 IDE支持(IntelliJ IDEA)

javacc的语法文件是

*.jj

所以创建一个.jj文件,IDEA检测到是javacc文件,自动提示安装插件。安装重启IDEA后就会更新对javacc的支持。

三、语法(jj文件)

3.1 结构

由四个部分组成:

  1. option参数配置
  2. 程序入口
  3. 词法声明
  4. 语法声明和动作代码

3.2 option

就是语法分析器的配置选项,每一个选项都有默认值,因此省略也没有问题。例如向前看的token的个数(用来解除冲突)。也可以把这些选项作为javacc命令的参数来启动javacc,可以达到同样的效果。

具体选项见:(TODO)

3.3 程序入口

这部分是必要的。我理解这部分就是语法文件的main函数。

要求:

  1. 开始标志符:PARSER_BEGIN(name)
  2. 结束标识符:PARSER_END(name)
  3. 解析器name和中间class的名称一样

下面是一个简单示例

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)
           

3.4 词法声明

这里面有四类:SKIP、TOKEN、SPECIAL_TOKEN、MORE。其中,SKIP用来说明被忽略的串

3.5 语法声明和动作代码

3.6 example

  1. java parser项目中的java语法文件:https://github.com/javaparser/javaparser/blob/master/javaparser-core/src/main/javacc/java.jj
  2. Apache Tomcat项目中的json语法文件:https://github.com/apache/tomcat/blob/master/java/org/apache/tomcat/util/json/JSONParser.jj
  3. Apache Calcite项目中的sql语法文件:https://github.com/apache/calcite/blob/master/core/src/main/codegen/templates/Parser.jj

未完待续

官方推荐资料

Resources

Books

  • Dos Reis, Anthony J., Compiler Construction Using Java, JavaCC, and Yacc., Wiley-Blackwell 2012. ISBN 0-4709495-9-7 (book, pdf).
  • Copeland, Tom, Generating Parsers with JavaCC., Centennial Books, 2007. ISBN 0-9762214-3-8 (book).

Tutorials

  • JavaCC tutorials.
  • Introduction to JavaCC by Theodore S. Norvell.
  • Incorporating language processing into Java applications: a JavaCC tutorial by Viswanathan Kodaganallur.

Articles

  • Looking for lex and yacc for Java? You don’t know Jack by Chuck Mcmanis.
  • Build your own languages with JavaCC by Oliver Enseling.
  • Writing an Interpreter Using JavaCC by Anand Rajasekar.
  • Building a lexical analyzer with JavaCC by Keyvan Akbary.

Parsing theory

  • Alfred V. Aho, Monica S. Lam, Ravi Sethi and Jeffrey D. Ullman, Compilers: Principles, Techniques, and Tools, 2nd Edition, Addison-Wesley, 2006, ISBN 0-3211314-3-6 (book, pdf).
  • Charles N. Fischer and Richard J. Leblanc, Jr., Crafting a Compiler with C., Pearson, 1991. ISBN 0-8053216-6-7 (book).

参考文献

  1. javacc项目仓库 https://github.com/javacc/javacc
  2. javacc官网 https://javacc.org/
  3. JavaCC的基本使用 https://blog.csdn.net/pngfiwang/article/details/49258989
  4. JavaCC 研究与应用https://www.cnblogs.com/Gavin_Liu/archive/2009/03/07/1405029.html
  5. CMM语言解释器构造实践(一)——前言 https://blog.csdn.net/TomMMRunNEr/article/details/78164796
  6. CMM语言解释器构造实践(二)——JavaCC等编译工具的使用 https://blog.csdn.net/TomMMRunNEr/article/details/78167855
  7. CMM语言解释器构造实践(三)——基于状态转换图的词法分析器 https://blog.csdn.net/TomMMRunNEr/article/details/78209649
  8. BNF 规则 https://blog.csdn.net/lengye7/article/details/89185041
  9. the javacc Tutorial (javacc教程) https://blog.csdn.net/yunfeng482/article/details/82716986