在 ANTLR4 中检测令牌触发规则

Detect tokens triggering rules in ANTLR4

我有这个非常简单的语法:

grammar DLR;
dlr : c 'sub' c ;
c  : CN | 'not' c | c 'and' c | c 'or' c ;
CN : [A-Z]+ ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

当我使用 antlr4 命令生成 java 代码时,我得到了 java 接口 DLRBaseListener:

public class DLRBaseListener implements DLRListener {

@Override public void enterDlr(DLRParser.DlrContext ctx) { }

@Override public void exitDlr(DLRParser.DlrContext ctx) { }

@Override public void enterC(DLRParser.CContext ctx) { }

@Override public void exitC(DLRParser.CContext ctx) { }

@Override public void enterEveryRule(ParserRuleContext ctx) { }

@Override public void exitEveryRule(ParserRuleContext ctx) { }

@Override public void visitTerminal(TerminalNode node) { }

@Override public void visitErrorNode(ErrorNode node) { }

}

可以扩展此接口,尤其是当您想要检测何时触发规则时。因此,enterDlr、exitDlr、enterC 和 exitC 等方法非常有用。 我的目标更具体:我想检测负责触发该规则的令牌。在我的例子中是'not'c,c'and'c,c'or'c。 如您所见,接口中没有这些方法。 有没有办法检测语法的那些部分?

ANTLR4提供"alternate labeling"(TDAR pg 117, 261)来实现这个功能:

c  : CN          # justCN 
   | 'not' c     # notC
   | c 'and' c   # andC 
   | c 'or' c    # orC
   ;

该工具将为每个标记的备选方案生成单独的解析器上下文(Java 中规则上下文的子类),名称基于标签名称。并且,相应的 enter/exit 侦听器方法。