5.JavaCC官方入門指南-概述


一、前言

  在最開始使用JavaCC的時候,從網上查詢了許多資料,但是網上的資料水平是參差不齊的,走了許多彎路,不得已自己查閱了英文版官網文檔。令我傷心的是最后我回過頭來再看那些博客資料時,發現其實他們寫的都是沒錯的,只不過某些地方少了必要的講解,以至於新手剛接觸的時候是持續懵逼的。
  不管怎樣,下面內容是對官方文檔的翻譯,加上一些自己的理解。
  官方文檔連接:https://www.engr.mun.ca/~theo/JavaCC-Tutorial/javacc-tutorial.pdf
  這里所翻譯的部分是JavaCC的入門知識,通過由淺入深的幾個小例子,可以循序漸進的一步步了解JavaCC技術。

二、 JavaCC概述

  JavaCC全稱為Java Compiler Compiler,它是一個生成器,用於生成詞法分析器(lexical analysers)和語法分析器(parsers)。它可以通過讀取一個詞法和語法描述文件(即詞法和語法描述是寫在同一個文件中的),來生成一個java程序,這個java程序就包括了詞法分析器和語法分析器。接着就可以用生成的詞法分析器和語法分析器來對我們的輸入進行判斷,判斷輸入是否符合我們所要求的語法規則。
  編程語言中的編譯器,其實就包含了詞法分析器和語法分析器,編譯器便是通過這兩者來識別我們所編寫的代碼。除了在編譯器中的應用之外,詞法分析器和語法分析器在其他程序中也有着廣泛的應用。
  那么什么是詞法分析器和語法分析器呢?其中,詞法分析器可以將一個字符序列拆分為一個個的子單元,這些子單元,在JavaCC中被稱之為token——也就是說,詞法分析器可以將一個字符序列拆分為一個個的token。這個解釋可能依然有點讓人摸不着頭腦,下面看一個例子。
  假設我們要用詞法分析器來解析下面的一段C語言編寫的代碼:

int main() {
    return 0 ;
}

  那么C語言編譯器中的詞法分析器會將上述代碼拆分為如下的token序列:

“int”, “ ”, “main”, “(”, “)”,
“ ”, “{”, “\n”, “\t”, “return”
“ ”, “0”, “ ”, “;”, “\n”,
“}”, “\n”, “” .

  可以看到所謂的拆分就是把int、空格、main、左括號等等各種字符給拆開罷了。那么在JavaCC中,會給拆分后得到的一個個token取一個邏輯上的名字,比如在本例中,我們所取的名稱可以如下:

KWINT, SPACE, ID, OPAR, CPAR,
SPACE, OBRACE, SPACE, SPACE, KWRETURN,
SPACE, OCTALCONST, SPACE, SEMICOLON, SPACE,
CBRACE, SPACE, EOF .

  如此一來,KWINT這個token就表示“int”, SPACE這個token就表示“ ”, OPAR就表示左括號“(”等等。因此在JavaCC中,一般說到token的時候,一般指的是KWINT、SPACE、OPAR等這些東西。另外,EOF這個token表示“文件的末尾”。
經過詞法分析而得到的tokens序列,在之后將會被傳給語法分析器進行語法判斷。
在C語言的編譯器中,有時語法分析器在分析的時候是不需要所有的token的。比如在本例中,SPACE這個token就可以不用往下傳給語法分析器了,那么此時SPACE這個 token應該如何處理掉,將在后面說到。
  在本例中,語法分析器將會對拿到的tokens序列進行分析,判斷這些tokens序列是否符合c語言的語法結構。
  此外,詞法分析器和語法分析器在分析的時候,還有可能會產生錯誤信息,即當你的輸入並不符合你所定義的詞法和語法規范時,就會拋出錯誤信息。
  最后需要注意的是,JavaCC本身並不是詞法分析器和語法分析器,它是一個生成器!JavaCC通過讀取一個后綴為.jj的描述文件中的特定描述,來生成詞法分析器和語法分析器,並且生成的詞法分析器和語法分析器使用Java書寫的。)
  至此,已經簡單說明了JavaCC是什么,以及詞法分析器和語法分析器的作用,還引出了token的概念。下面將通過例子來一步一步進行講解。

三、示例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM