如何在ANTLR4中一次修改所有规则的行为



这是我的语法:

foo returns [Alpha ret]
:
{ Alpha a = new Alpha(); }
/* something specific for the rule foo */
{ $ret = a; }
;

我有10条语法规则,看起来完全一样。它们之间的唯一区别在于;一些特定的";线如何避免一遍又一遍地重写此代码,并在所有规则之间以某种方式共享Alpha实例化和返回行为?

如果不将各种解析器规则合并为一个规则,AFAIK:

merged returns [Alpha ret]
: { Alpha a = new Alpha(); }
( foo /* something specific for the rule foo */
| bar /* something specific for the rule bar */
| mu  /* something specific for the rule mu  */
)
{ $ret = a; }
;

解析器规则在您所针对的特定ANTLR运行时中转换为普通方法。因此,在您的情况下,如果在Java中没有很好的方法来实现它,那么在语法中也没有方法。

附带说明一下:您是否考虑过将代码从语法转移到监听器或访问者中?在我看来,将语法与特定于目标的代码分离通常会减少错误,并使代码变得更好、更容易测试。

最新更新