![](/img/trans.png)
[英]How can I get queries in a SQL Server stored procedure text using antrl4 lexer and parser?
[英]What's the difference between ExitRule and EnterRule in Antrl4?
我一直在"the definitive antrl4 reference"
一書中尋找Listener中ExitRule和EnterRule的區別,但我仍然不明白其中的區別。 這兩者有什么區別? 聽者如何在樹上穿行?
簡單地說,這些是由 Antrl 創建的自動生成的事件,用於跟蹤步行者,可以這么說。
想象一下,你站在一個長長的地板中間,每個地方都有無數的門。 你必須打開和房間里的東西。 要跟蹤您已經訪問過的門,您可以用X和后面的遞增數字標記它們。
enterRule == 你打開一個房間的門。
你進入並搜索
exitRule == 離開房間並在門上塗上X和下一個數字。
現在您可以准確地說出您已經訪問過哪些房間,而且您還可以再次前往特定房間進行另一次搜索,而無需一路返回並重新開始。
更技術性地說。
Antrl 為定義的每個規則創建一個進入和退出方法。 這些方法,也稱為callbacks ,被 walker 用來遍歷給定的樹。
使用 * ParseTreeListener提供一個入口點,指示樹的開頭。 例如enterAssign 。 Walker 查找此事件並觸發它。 然后它尋找一個子enterRule來觸發這個事件,依此類推……
只要它發現進一步的輸入規則或觸發exitAssign並且步行者停止步行,它就會一直步行。
這里的關鍵點是自動或獨立的步行行為。
另一方面, ParseTreeVisitor不會生成進入/退出規則來遍歷樹。 它將生成visitRule 。 必須顯式調用訪問方法! 這意味着,如果您忘記調用訪問,則根本不會訪問其所有子項。
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.