![](/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.