antlr listener...哪个产品?
antlr listener... which production?
考虑:
my_rule: a_thing 'as' zoot
| a_different_thing 'as' blurfl zoot
;
在我的听众中,如何区分匹配的特定作品?我是不是只能检查 blurfl 的存在,还是有更优雅的方法?
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_rule
和 exitMy_rule
。
标签是一种解决方案,但我认为测试特定的匹配元素并不少见,而且不需要更改语法。另请记住,当您在规则中标记一个备选方案时,您必须标记所有备选方案。此外,拥有两个不同的函数可能会导致代码重复,而不仅仅是检查 blurfl
或任何其他唯一的子项(例如 a_thing
),否则会遵循相同的代码路径。
考虑:
my_rule: a_thing 'as' zoot
| a_different_thing 'as' blurfl zoot
;
在我的听众中,如何区分匹配的特定作品?我是不是只能检查 blurfl 的存在,还是有更优雅的方法?
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_rule
和 exitMy_rule
。
标签是一种解决方案,但我认为测试特定的匹配元素并不少见,而且不需要更改语法。另请记住,当您在规则中标记一个备选方案时,您必须标记所有备选方案。此外,拥有两个不同的函数可能会导致代码重复,而不仅仅是检查 blurfl
或任何其他唯一的子项(例如 a_thing
),否则会遵循相同的代码路径。