Javacc入門筆記

一、什麼是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

Articles

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章