天天看點

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

本節書摘來自華章計算機《antlr 4權威指南》一書中的第1章,第1.2節,作者[美] 特恩斯·帕爾(terence parr),張博 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

下面是一個簡單的、識别類似hello world和hello parrt的詞組的文法:

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

為整潔起見,我們把這個文法檔案放到它自己的目錄裡,如/tmp/test。接下來對該文法檔案運作antlr指令并編譯生成的結果。

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

對hello.g4運作antlr工具指令生成了一個由helloparser.java和hellolexer.java組成的、可以運作的文法識别程式,不過我們還缺一個main程式來觸發這個語言識别的過程。(文法分析器和詞法分析器的介紹詳見下一章。)這就是項目剛開始時的典型過程。在開始建構一個實際的程式之前,你可以先熟悉一下這些不同的文法。無須對每個新的文法都編寫一個main程式來測試。

antlr在運作庫中提供了一個名為testrig的友善的調試工具。它可以詳細列出一個語言類應用程式在比對輸入文本過程中的資訊,這些輸入文本可以來自檔案或者标準輸入。testrig使用java的反射機制來調用編譯後的識别程式。與之前一樣,最好通過别名或者批處理檔案來調用它。在本書中,我将會使用grun作為别名,你可以使用任何你喜歡的别名。

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

測試元件有點像是main()方法,接收一個文法名和一個起始規則名作為參數,此外,它還接收衆多的參數,通過這些參數我們可以指定輸出的内容。假設我們希望顯示識别過程中生成的詞法符号。詞法符号是類似于關鍵字hello和辨別符parrt的符号。可以通過以下指令啟動grun,測試之前的文法:

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

首先輸入上述grun指令,回車,然後輸入hello parrt,回車。這個時候,你必須手動輸入檔案結束符(end-of-file character)來阻止程式繼續讀取标準輸入,否則,程式将什麼都不做,靜靜等待你的下一步輸入。由于grun指令使用了-tokens選項,一旦識别程式讀取到全部的輸入内容,testrig就會列印出全部的詞法符号的清單。

每行輸出代表了一個詞法符号,其中包含了該詞法符号的全部資訊。例如,[@1, 6:10 = 'parrt', <2>, 1:6]表明,這個詞法符号位于第二個位置(從0開始計數),由輸入文本的第6個到第10個位置之間的字元組成(包含第6個和第10個,同樣從0開始計數);包含的文本内容是parrt;詞法符号類型是2(即id);位于輸入文本的第一行、第6個位置處(從0開始計數,tab符号被看作一個字元)。

我們可以很容易地列印出lisp風格文本格式的文法分析樹(根節點和子節點在同一行)。

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

要想知道識别程式是如何識别輸入文本的,最簡單的辦法是檢視可視化的文法分析樹。使用grun-gui運作testrig,即grun hello r-gui,将産生如圖1-1所示的對話框。

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

當不帶參數地運作testrig時,會産生一些幫助資訊:

《ANTLR 4權威指南》——1.2 運作ANTLR并測試識别程式

在本書中,我們将會使用其中的很多選項,下面是它們的簡單介紹:

-tokens 列印出詞法符号流。

-tree 以lisp格式列印出文法分析樹。

-gui 在對話框中以可視化方式顯示文法分析樹。

-ps file.ps 以postscript格式生成可視化文法分析樹,然後将其存儲于file.ps。本章中的文法分析樹的圖檔就是使用-ps選項生成的。

-encoding encodingname 若目前的區域設定無法正确讀取輸入,使用這個選項指定測試元件輸入檔案的編碼。例如,在12.4節中我們需要通過這個選項來解析日語xml檔案。

-trace 列印規則的名字以及進入和離開該規則時的詞法符号。

-diagnostics 開啟解析過程中的調試資訊輸出。通常僅在一些罕見情況下才使用它産生資訊,例如輸入的文本有歧義。

-sll 使用另外一種更快但是功能稍弱的解析政策。

現在,我們已經成功地安裝了antlr,并嘗試着用它分析了一個簡單的文法。在下一章中,讓我們後退一步,先縱觀全局,學習一些重要的術語。之後,我們将會嘗試建立一個簡單的入門工程來識别和翻譯一列形如{1, 2, 3}的數字。接下來,在第4章中我們将會學習一系列有趣的例子,這些例子展示了antlr的強大功能以及可被應用的領域。

繼續閱讀