天天看點

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

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

antlr的運作庫提供了兩種周遊樹的機制。預設情況下,antlr使用内建的周遊器通路生成的文法分析樹,并為每個周遊時可能觸發的事件生成一個文法分析樹監聽器接口(parse-tree listener interface)。監聽器非常類似于xml解析器生成的sax文檔對象。sax監聽器接收類似startdocument()和enddocument()的事件通知。一個監聽器的方法實際上就是回調函數,正如我們在圖形界面程式中響應複選框點選事件一樣。除了監聽器的方式,我們還将介紹另外一種周遊文法分析樹的方式:通路者模式(vistor pattern)。

1.文法分析樹監聽器

為了将周遊樹時觸發的事件轉化為監聽器的調用,antlr運作庫提供了parsetree-

walker類。我們可以自行實作parsetreelistener接口,在其中填充自己的邏輯代碼(通常是調用程式的其他部分),進而建構出我們自己的語言類應用程式。

antlr為每個文法檔案生成一個parsetreelistener的子類,在該類中,文法中的每條規則都有對應的enter方法和exit方法。例如,當周遊器通路到assign規則對應的節點時,它就會調用enterassign()方法,然後将對應的文法分析樹節點——assigncontext的執行個體——當作參數傳遞給它。在周遊器通路了assign節點的全部子節點之後,它會調用exitassign()。圖2-4用粗虛線辨別了parsetreewalker對文法分析樹進行深度優先周遊的過程。

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

圖2-4 parsetreewalker對文法分析樹進行深度優先周遊的過程

除此之外,圖2-4中還辨別出了周遊過程中parsetreewalker調用assign規則的enter和exit方法的時機(其中未顯示監聽器其他方法的調用)。圖2-5顯示了在我們的指派語句生成的文法分析樹中,parsetreewalker對監聽器方法的完整的調用順序。

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

監聽器機制的優秀之處在于,這一切都是自動進行的。我們不需要編寫對文法分析樹的周遊代碼,也不需要讓我們的監聽器顯式地通路子節點。

2.文法分析樹通路器

有時候,我們希望控制周遊文法分析樹的過程,通過顯式的方法調用來通路子節點。在指令行中加入-visitor選項可以訓示antlr為一個文法生成通路器接口(visitor interface),文法中的每條規則對應接口中的一個visit方法。圖2-6是使用常見的通路者模式對我們的文法分析樹進行操作的過程。

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

其中,粗虛線顯示了對文法分析樹進行深度優先周遊的過程。細虛線标示出通路器方法的調用順序。我們可以在自己的程式代碼中實作這個通路器接口,然後調用visit()方法來開始對文法分析樹的一次周遊。

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

antlr内部為通路者模式提供的支援代碼會在根節點處調用visitstat()方法。接下來,visitstat()方法的實作将會調用visit()方法,并将所有子節點當作參數傳遞給它,進而繼續周遊的過程。或者,visitmethod()方法可以顯式調用visitassign()方法等。

antlr會提供通路器接口和一個預設實作類,免去我們一切都要自行實作的麻煩。這樣,我們就可以專注于那些我們感興趣的方法,而無須覆寫接口中的方法。我們将在第7章中深入介紹通路器和監聽器。

《ANTLR 4權威指南 》一2.5 文法分析樹監聽器和通路器

迄今為止,我們已經大體上了解了antlr的工作原理。在本章中,我們認識了從字元序列到文法分析樹的整個流程,學習了antlr運作庫的一些關鍵類。此外,我們還簡單了解了監聽器和通路器機制,它們是連接配接文法分析器和特定程式代碼的橋梁。在下一章中,我們将通過一個實際的例子來使大家加深對上述概念的了解。