天天看點

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