ANTLR - 处理一条规则后触发
ANTLR - Trigger after processing one rule
我在 ANTLR4 中有这个非常简单的语法:
rule : 'SubRelationOf' LPAREN r COMMA r RPAREN
r: RN | 'RelationUnionOf' LPAREN (r COMMA)+ r RPAREN
//LEXER
RN : [a-z]+ ;
COMMA: ',';
LPAREN: '(';
RPAREN: ')';
我还使用带有堆栈的 Listener 实现来跟踪每个事件,因为语法是上下文无关和递归的。
如您所见,rule 由两个参数组成:第一个 r 和第二个 r .
我强烈需要的是一种区分我何时完成第一个处理的方法。
由于 Listener 实现具有以下内容:
public void exitRule(Parser.RuleContext ctx) {
// do something
}
无法理解我何时处于 规则 的第一个 r 或第二个 r。
是否有触发器显示 "ok you are just out of the first r, execute your arbitrary code"?
有办法实现吗?
在子规则或标记出现不止一次的规则中,您将拥有一个 returns 列表而不是单个条目的函数。因此,您的 RuleContext
有一个成员 r()
,其中 returns 是一个列表。其中条目的顺序是您在语法中定义的。
我在 ANTLR4 中有这个非常简单的语法:
rule : 'SubRelationOf' LPAREN r COMMA r RPAREN
r: RN | 'RelationUnionOf' LPAREN (r COMMA)+ r RPAREN
//LEXER
RN : [a-z]+ ;
COMMA: ',';
LPAREN: '(';
RPAREN: ')';
我还使用带有堆栈的 Listener 实现来跟踪每个事件,因为语法是上下文无关和递归的。 如您所见,rule 由两个参数组成:第一个 r 和第二个 r . 我强烈需要的是一种区分我何时完成第一个处理的方法。 由于 Listener 实现具有以下内容:
public void exitRule(Parser.RuleContext ctx) {
// do something
}
无法理解我何时处于 规则 的第一个 r 或第二个 r。 是否有触发器显示 "ok you are just out of the first r, execute your arbitrary code"? 有办法实现吗?
在子规则或标记出现不止一次的规则中,您将拥有一个 returns 列表而不是单个条目的函数。因此,您的 RuleContext
有一个成员 r()
,其中 returns 是一个列表。其中条目的顺序是您在语法中定义的。