在 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 侦听器方法。
我有这个非常简单的语法:
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 侦听器方法。