我在ANTLR4中有这个非常简单的语法:
rule : 'SubRelationOf' LPAREN r COMMA r RPAREN
r: RN | 'RelationUnionOf' LPAREN (r COMMA)+ r RPAREN
//LEXER
RN : [a-z]+ ;
COMMA: ',';
LPAREN: '(';
RPAREN: ')';
我还使用带有堆栈的Listener实现来跟踪每个事件,因为语法是无上下文和递归的。 如您所见,规则由两个参数组成:第一个 r ,第二个 r 。 我强烈需要的是一种区分我完成第一个处理的方法。 由于Listener实现具有以下内容:
public void exitRule(Parser.RuleContext ctx) {
// do something
}
无法理解我何时处于规则的第一个r或第二个r中。 是否有一个触发器表示"好吧,你刚出第一个r,执行你的任意代码"? 有没有办法实现这个?
答案 0 :(得分:1)
在子规则或令牌出现多次的规则中,您将拥有一个返回列表而不是单个条目的函数。因此,您的.
有一个成员where
,它会返回一个列表。其中条目的顺序是您在语法中定义的。