代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何修改ANTLR4中所有标记的行为?

  •  0
  • yegor256  · 技术社区  · 5 年前

    这是我的语法:

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

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

    0 回复  |  直到 5 年前
        1
  •  2
  •   Bart Kiers    5 年前

    必须将各种解析器规则合并为一个,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中实现它,那么就没有方法在语法中实现它。