2013-12-21 52 views
32

我在閱讀「The Definitive Antlr 4 Reference」,並瞭解Listeners and Visitors的工作原理。本書特別解釋了Listeners如何與SAX解析器相關,並在每個實現過程中調用方法時顯而易見。我還可以看到,監聽器對於將輸入轉換爲輸出非常有用,但是我希望能夠簡要說明何時使用監聽器以及何時使用Visitor(或者在某些情況下是否都使用它們?)。Antlr4聽衆和遊客 - 要實施?

我的特別意圖是創建一個解釋器(Cucumber-style/TinyBasic解釋器,帶有一些自定義調用),它將檢查語法錯誤並停止執行來自定製函數的錯誤而無需恢復 - 希望看到完整的實現antlr這樣的東西 - 如果有人碰巧知道一個。

在此先感謝您的任何建議。

+0

@OP你可能會發布更新 - 你實際上使用了什麼,以及任何外賣。謝謝 – Dinesh

回答

23

如果您打算直接使用解析器輸出進行解釋,那麼訪問者是一個不錯的選擇。你可以完全控制遍歷,所以在條件中只有一個分支被訪問,循環可以被訪問n次,等等。

如果您將輸入轉換爲較低級別,例如虛擬機指令,這兩種模式可能都有用。

你可以看看「語言實現模式」,它涵蓋了基本的解釋器實現。

我主要使用訪問者模式,因爲它更靈活。

37

這裏是一本書,我認爲是相關報價:

聽衆和觀衆機制之間的最大區別在於監聽方法由ANTLR提供的沃克對象調用,而訪問者方法必須走他們的孩子有明確的訪問電話。忘記調用節點的子節點上的visit()意味着這些子樹不會被訪問。

在訪客模式中,您可以指導樹行走,而在聆聽者中您只對樹步行者作出反應。

1

有這兩種模式之間的另一個重要區別:訪問者使用調用堆棧管理樹遍歷,而偵聽器使用在堆上分配的明確的堆棧,由沃克管理。這意味着對訪問者的大量輸入可能會使堆棧崩潰,而聽衆不會有任何問題。

如果您的輸入可能是無限的,或者您可能在呼叫樹中調用訪問者很深,應該使用Listener而不是Visitor,或者至少驗證分析樹不是太深。由於這個原因,一些公司的編碼實踐不鼓勵甚至徹底禁止非尾遞歸。