我在ANTLR4中生成了一个语法。摘录如下:
list : defunExpr # defun
: lambdaExpr # lambda
: condExpr # cond
...
: items # other
;
这些规则按优先级顺序列出,在测试语法时会根据需要调用。如果#defun、#lambda、#cond等的所有较高优先级规则与较高优先级规则不匹配(将较高优先级规则放在较低优先级规则之前的预期行为),则它们也将与项(#other)匹配。
然后,我用Java实现了一个简单的基于监听器的应用程序,它只需格式化解析后的代码并将其打印回控制台。我已经重写了#defun、#lambda、#cond等的适当的进入/退出方法。我想为与更具体的规则不匹配的项实现一个通用的catch-all。然而,当我为#other实现进入/退出方法时,它会为每个匹配的规则执行更高的优先级,有效地为#defun、#lambda、#cond等规则输出两次格式化代码。
有什么方法可以实现这种行为吗?我有一些具体的规则想要实现,然后用一个通用的案例来捕捉其他规则。语法解析正确(测试装备在许多测试用例中显示了预期的行为),但catch-all方法(enterOther)似乎也会根据特定规则进行操作。
编辑:哇,经过这么长时间发布这个问题,我现在真的相信这是一个语法错误。然而,在我核实之前,我将不回答这个问题。
谢谢大家的关注。我不评估任何内容,只是回显解析后的输入,所以侦听器工作得很好。语法实际上很好,没有歧义。包罗万象的规则(它是包罗万象的,尽管这里没有显示足够的语法)运行良好。我的问题(令人尴尬)是,虽然我想写enter/exit#其他方法,但实际上我一直在写enter/eexitExpr方法,这就是为什么我们也触发了所有特定规则(因为它们是Expr)。令人尴尬,但吸取了教训。谢谢你的想法和花时间。干杯