我在ANTLR4中生成了一个语法。样本摘录如下所示:
list : defunExpr # defun
: lambdaExpr # lambda
: condExpr # cond
...
: items # other
;
规则按优先级顺序列出,并在测试语法时适当调用。 #defun,#lambda,#second等所有优先级较高的规则也会匹配项目(#other),如果它们与较高的匹配(在较低优先级之前放置较高优先级规则的预期行为)。
然后我在Java中实现了一个简单的基于侦听器的应用程序,它简单地格式化已解析的代码并将其打印出控制台。我已经为#defun,#lambda,#second等覆盖了适当的进入/退出方法。我想对与更具体的规则不匹配的项目实现一般化的catch-all。但是,当我为#other实现进入/退出方法时,它会为每个匹配的规则执行更高优先级,有效地为#defun,#lambda,#second等规则输出格式化代码两次。
有没有办法实现这种行为?我有一些我想要实现的具体规则,然后有一个一般情况抓住其他规则。语法正确解析(测试装备显示了许多测试用例的预期行为),但是catch-all方法(enterOther)似乎也按照特定规则行事。
编辑:哇,经过所有这段时间并发布这个问题,我现在实际上认为这是一个语法错误。不过,我会一直打开这个问题,直到我确认。答案 0 :(得分:0)
感谢您的兴趣,伙计们。我没有评估任何东西,只是回显解析的输入,所以听众工作正常。语法实际上很好,没有模棱两可。这个包罗万象的规则(虽然没有在这里显示我的语法,但它是全能的)工作得很好。我的问题(令人尴尬)是,当我想写入/退出#other方法时,我实际上是在整个时间写入/退出Expr方法,这就是我们触发所有特定规则的原因(因为它们是Exprs)。令人尴尬,但吸取了教训。感谢您的想法并花时间。干杯!