Antlr4 如何在听众和访问者之间做出决定?

Antlr4 如何在听众和访问者之间做出决定?,antlr4,Antlr4,我使用的是Visual Studio下的Antlr4,C版本。工作得很好 AFAIK(但我可能错了)听众和访问者也被用于类似的任务 那么,如何在两者之间做出选择呢?或者我可以两者都用?请注意,我找到的所有示例都使用Listener或Visitor,但不是两者都使用…在我看来,Visitor是一个不错的选择,因为您可以完全控制遍历 这里引用的是《权威的ANTLR 4参考》一书 侦听器和访问者机制之间的最大区别在于,侦听器方法由ANTLR提供的walker对象调用,而访问者方法必须通过显式的访问调用

我使用的是Visual Studio下的Antlr4,C版本。工作得很好

AFAIK(但我可能错了)听众和访问者也被用于类似的任务


那么,如何在两者之间做出选择呢?或者我可以两者都用?请注意,我找到的所有示例都使用Listener或Visitor,但不是两者都使用…

在我看来,Visitor是一个不错的选择,因为您可以完全控制遍历

这里引用的是《权威的ANTLR 4参考》一书

侦听器和访问者机制之间的最大区别在于,侦听器方法由ANTLR提供的walker对象调用,而访问者方法必须通过显式的访问调用遍历其子对象。忘记对节点的子节点调用visit()意味着这些子树没有被访问


如果将输入转换到较低级别,例如虚拟机指令,这两种模式可能都很有用。

尝试其中一种,看看是否有效。如果没有,试试另一个。同时,我仍在使用遗留操作,但它们只是按照我的意愿工作。两者都有效。我在Antlr4上的最后一个项目是与Visitor一起完成的,并且工作正常。在另一个项目中,我使用了Listener,并且也使用了Listener。有些任务对于Listener来说更容易,而对于访客来说则更容易。使用最合适的。例如,对于树重写,您最好使用访问者。我想“您完全控制遍历”是这里的关键点。无论如何,我认为在某些情况下,听众是最理想的方式。谢谢你的回答,尿布男孩。