antlr listener...哪个产品?

antlr listener... which production?

考虑:

my_rule: a_thing 'as' zoot
       | a_different_thing 'as' blurfl zoot
;

在我的听众中,如何区分匹配的特定作品?我是不是只能检查 blurfl 的存在,还是有更优雅的方法?

Label the alternatives 像这样:

grammar T;

my_rule
 : a_thing 'as' zoot                  #AltWithoutBlurfl
 | a_different_thing 'as' blurfl zoot #AltWithBlurfl
 ;

...

这样,您的侦听器将包含如下方法:

public interface TListener extends ParseTreeListener {

    void enterAltWithoutBlurfl(TParser.AltWithoutBlurflContext ctx);
    void exitAltWithoutBlurfl(TParser.AltWithoutBlurflContext ctx);
    
    void enterAltWithBlurfl(TParser.AltWithBlurflContext ctx);
    void exitAltWithBlurfl(TParser.AltWithBlurflContext ctx);

    ...
}

请注意,不再有 enterMy_ruleexitMy_rule

标签是一种解决方案,但我认为测试特定的匹配元素并不少见,而且不需要更改语法。另请记住,当您在规则中标记一个备选方案时,您必须标记所有备选方案。此外,拥有两个不同的函数可能会导致代码重复,而不仅仅是检查 blurfl 或任何其他唯一的子项(例如 a_thing),否则会遵循相同的代码路径。