我有这个非常简单的语法:
grammar DLR;
dlr : c 'sub' c ;
c : CN | 'not' c | c 'and' c | c 'or' c ;
CN : [A-Z]+ ;
WS : [ trn]+ -> 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 '和' c, c 'or' c。正如您所看到的,在接口中没有这些方法。有没有一种方法可以检测到语法的这些部分?
ANTLR4提供"替代标注" (TDAR pg 117,261)来实现此功能:
c : CN # justCN
| 'not' c # notC
| c 'and' c # andC
| c 'or' c # orC
;
该工具将为每个标记的备选项生成单独的解析器上下文(Java中规则上下文的子类),其名称基于标签名称。以及相应的进入/退出侦听器方法。