簡體   English   中英

Antrl4中的ExitRule和EnterRule有什么區別?

[英]What's the difference between ExitRule and EnterRule in Antrl4?

我一直在"the definitive antrl4 reference"一書中尋找ListenerExitRuleEnterRule的區別,但我仍然不明白其中的區別。 這兩者有什么區別? 聽者如何在樹上穿行?

簡單地說,這些是由 Antrl 創建的自動生成的事件,用於跟蹤步行者,可以這么說。

想象一下,你站在一個長長的地板中間,每個地方都有無數的門。 你必須打開和房間里的東西。 要跟蹤您已經訪問過的門,您可以用X和后面的遞增數字標記它們。

enterRule == 你打開一個房間的門。

你進入並搜索

exitRule == 離開房間並在門上塗上X和下一個數字。

現在您可以准確地說出您已經訪問過哪些房間,而且您還可以再次前往特定房間進行另一次搜索,而無需一路返回並重新開始。

更技術性地說。

Antrl 為定義的每個規則創建一個進入退出方法。 這些方法,也稱為callbacks ,被 walker 用來遍歷給定的樹。

使用 * ParseTreeListener提供一個入口點,指示樹的開頭。 例如enterAssign Walker 查找此事件並觸發它。 然后它尋找一個子enterRule來觸發這個事件,依此類推……

只要它發現進一步的輸入規則或觸發exitAssign並且步行者停止步行,它就會一直步行。

這里的關鍵點是自動或獨立的步行行為。

另一方面, ParseTreeVisitor不會生成進入/退出規則來遍歷樹。 它將生成visitRule 必須顯式調用訪問方法! 這意味着,如果您忘記調用訪問,則根本不會訪問其所有子項。

Antrl-Doc --> 解析樹監聽器

Antrl-Mega-Tutorial --> 大量信息,簡短准確

樹走

行走從一個根節點開始,一直走下去,直到找到最左邊的嵌套項。 然后返回直到到達第一個節點並在右側查找子樹。 如果找到,它將進入正確的樹。 或者,它在鏈上進一步尋找下一個節點。 ...

直到它再次到達根節點。 短圖:

            parent
           |
          /  \
         /    \
     Child1  Child2
      /          
     /
Grandchild

調用鏈:

enter parent
enter Child1
enter Grandchild
exit Grandchild
exit Child1
enter Child2
exit Child2
exit parent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM