繁体   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