我在 ANTLR4 中有一个非常简单的语法:
rule : 'SubRelationOf' LPAREN r COMMA r RPAREN
r: RN | 'RelationUnionOf' LPAREN (r COMMA)+ r RPAREN
//LEXER
RN : [a-z]+ ;
COMMA: ',';
LPAREN: '(';
RPAREN: ')';
我还使用带有堆栈的监听器实现来跟踪每个事件,因为语法是上下文无关且递归的。 正如您所看到的,规则由两个参数组成:第一个r和第二个r。 我强烈需要的是一种区分何时完成第一个处理的方法。 由于监听器实现具有以下内容:
public void exitRule(Parser.RuleContext ctx) {
// do something
}
无法理解我何时位于规则的第一个 r 或第二个 r 中。。 是否有一个触发器说“好吧,你刚刚出了第一个 r,执行你的任意代码”? 有办法实现吗?
最佳答案
在子规则或标记出现多次的规则中,您将有一个返回列表而不是单个条目的函数。因此,您的 RuleContext
有一个返回列表的成员 r()
。其中条目的顺序是您在语法中定义的顺序。
关于java - ANTLR - 处理一条规则后触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41022565/