Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ANTLR4中,如何一次修改所有规则的行为?_Java_Antlr_Antlr4 - Fatal编程技术网

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代码从语法中移开的时候了!很好的建议。