检测ANTLR4中的令牌触发规则



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

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中规则上下文的子类),其名称基于标签名称。以及相应的进入/退出侦听器方法。

相关内容

  • 没有找到相关文章

最新更新