天天看點

《ANTLR 4權威指南》——3.1節ANTLR工具、運作庫以及自動生成的代碼

本節書摘來自華章社群《antlr 4權威指南》一書中的第3章,第3.1節antlr工具、運作庫以及自動生成的代碼,作者[美] 特恩斯·帕爾(terence parr),更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.1 antlr工具、運作庫以及自動生成的代碼

在開始前,我們先浏覽一下antlr的jar包中的内容。在antlr的jar包中存在兩個關鍵部分:antlr工具和antlr運作庫(運作時文法分析)api。通常,當說到“對一個文法運作antlr”時,我們指的是運作antlr工具,即org.antlr.v4.tool類來生成一些代碼(文法分析器和詞法分析器),它們能夠識别使用這份文法代表的語言所寫成的語句。詞法分析器将輸入的字元流分解為詞法符号序列,然後将它們傳遞給能夠進行文法檢查的文法分析器。運作庫是一個由若幹類和方法組成的庫,這些類和方法是自動生成的代碼(如parser,lexer和token)運作所必須的。是以,我們完成工作的一般步驟是:首先我們對一個文法運作antlr,然後将生成的代碼與jar包中的運作庫一起編譯,最後将編譯好的代碼和運作庫放在一起運作。

建構一個語言類應用程式的第一步是建立一個能夠描述這種語言的文法(即合法語句結構的集合)的文法。我們将在第5章中介紹如何編寫文法,現在我們先來看下面這個能夠滿足我們需求的文法。

《ANTLR 4權威指南》——3.1節ANTLR工具、運作庫以及自動生成的代碼

請将文法檔案arrayinit.g4放入一個單獨的檔案夾,例如/tmp/array(通過複制-粘貼或者從本書網站下載下傳)。然後我們對它運作antlr工具。

《ANTLR 4權威指南》——3.1節ANTLR工具、運作庫以及自動生成的代碼

3)arrayinit.tokens:antlr會給每個我們定義的詞法符号指定一個數字形式的類型,然後将它們的對應關系存儲于該檔案中。有時,我們需要将一個大型文法切分為多個更小的文法,在這種情況下,這個檔案就非常有用了。通過它,antlr可以在多個小型文法間同步全部的詞法符号類型。更多内容請參閱4.1節中的“文法導入”部分。

4)arrayinitlistener.java, arrayinitbaselistener.java:預設情況下,antlr生成的文法分析器能将輸入文本轉換為一棵文法分析樹。在周遊文法分析樹時,周遊器能夠觸發一系列“事件”(回調),并通知我們提供的監聽器對象。arrayinitlistener接口給出了這些回調方法的定義,我們可以實作它來完成自定義的功能。arrayinitbaselistener是該接口的預設實作類,為其中的每個方法提供了一個空實作。arrayinitbaselistener類使得我們隻需要覆寫那些我們感興趣的回調方法(詳見7.2節)。通過指定-visitor指令行參數,antlr也可以為我們生成文法分析樹的通路器(參閱7.5節“使用通路器周遊文法分析樹”部分)。

接下來,我們将使用監聽器來将short數組初始化語句轉換為字元串對象,不過在這之前,我們首先使用一些樣例輸入來驗證我們的文法分析器是否能正常進行比對工作。

antlr文法比正規表達式功能更強大

熟悉正規表達式的讀者可能會産生疑問,使用antlr來解決這麼簡單的識别問題是不是有點小題大做了?實際上,由于嵌套的花括号結構的存在,正規表達式無法識别這樣的初始化語句。正規表達式沒有存儲的概念,它們無法記住之前比對過的輸入。是以,它們不能将左右花括号正确配對。我們将在5.3節“嵌套模式”部分中予以詳細讨論。