在最開始使用JavaCC的時候,從網上查詢了許多資料,可是網上的資料水平是良莠不齊的,走了許多彎路,不得已本身查閱了英文版官網文檔。令我傷心的是最後我回過頭來再看那些博客資料時,發現其實他們寫的都是沒錯的,只不過某些地方少了必要的講解,以致於新手剛接觸的時候是持續懵逼的。
無論怎樣,下面內容是對官方文檔的翻譯,加上一些本身的理解。
官方文檔鏈接:https://www.engr.mun.ca/~theo/JavaCC-Tutorial/javacc-tutorial.pdf
這裏所翻譯的部分是JavaCC的入門知識,經過由淺入深的幾個小例子,能夠按部就班的一步步瞭解JavaCC技術。html
JavaCC全稱爲Java Compiler Compiler,它是一個生成器,用於生成詞法分析器(lexical analysers)和語法分析器(parsers)。它能夠經過讀取一個詞法和語法描述文件(即詞法和語法描述是寫在同一個文件中的),來生成一個java程序,這個java程序就包括了詞法分析器和語法分析器。接着就能夠用生成的詞法分析器和語法分析器來對咱們的輸入進行判斷,判斷輸入是否符合咱們所要求的語法規則。
編程語言中的編譯器,其實就包含了詞法分析器和語法分析器,編譯器即是經過這二者來識別咱們所編寫的代碼。除了在編譯器中的應用以外,詞法分析器和語法分析器在其餘程序中也有着普遍的應用。
那麼什麼是詞法分析器和語法分析器呢?其中,詞法分析器能夠將一個字符序列拆分爲一個個的子單元,這些子單元,在JavaCC中被稱之爲token——也就是說,詞法分析器能夠將一個字符序列拆分爲一個個的token。這個解釋可能依然有點讓人摸不着頭腦,下面看一個例子。
假設咱們要用詞法分析器來解析下面的一段C語言編寫的代碼:java
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的概念。下面將經過例子來一步一步進行講解。翻譯