Java 在ANTLR4中,如何一次修改所有规则的行为?
这是我的语法:Java 在ANTLR4中,如何一次修改所有规则的行为?,java,antlr,antlr4,Java,Antlr,Antlr4,这是我的语法: foo returns [Alpha ret] : { Alpha a = new Alpha(); } /* something specific for the rule foo */ { $ret = a; } ; 我有10条语法规则,看起来完全一样。它们之间的唯一区别在于“特定的东西”行。我如何避免反复重写此代码,并以某种方式在我的所有规则之间共享此Alpha实例化和返回行为?除非将各种解析器规则合并为一个规则,否则: merge
foo returns [Alpha ret]
:
{ Alpha a = new Alpha(); }
/* something specific for the rule foo */
{ $ret = a; }
;
我有10条语法规则,看起来完全一样。它们之间的唯一区别在于“特定的东西”行。我如何避免反复重写此代码,并以某种方式在我的所有规则之间共享此
Alpha
实例化和返回行为?除非将各种解析器规则合并为一个规则,否则:
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中没有很好的方法,那么语法中就没有方法
作为旁注:您是否考虑过将代码从语法转移到侦听器或访问者中?在我看来,将语法与特定于目标的代码分离通常会导致更少的错误,更好、更容易测试的代码。这看起来像是一个合成属性。如果不直接在语义谓词上使用,则应该考虑将所有这些代码移动到侦听器。您获得了目标独立性。您是对的,现在是将Java代码从语法中移开的时候了!很好的建议。