我在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。
我强烈需要的是一种区分何时完成处理第一个的方法。
由于侦听器实现具有以下内容:

public void exitRule(Parser.RuleContext ctx) {
// do something
}


无法理解我何时处于规则的第一个r或第二个r中。
是否有一个触发器说“好,您刚走出第一个r,执行您的任意代码”?
有办法实现吗?

最佳答案

在子规则或令牌多次出现的规则中,您将具有一个返回列表而不是单个条目的函数。因此,您的RuleContext有一个成员r(),该成员返回一个列表。条目的顺序是您在语法中定义的。

关于java - ANTLR-处理一条规则后触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41022565/

10-09 15:54
查看更多