【发布时间】:2016-02-23 14:31:15
【问题描述】:
我对 ANTLR 很陌生,我试图了解 Token 在 ATNLR4 中到底是什么。考虑以下非常荒谬的语法:
grammar Tst;
init: A token=('+'|'-') B;
A: .+?;
B: .+?;
ADD: '+';
SUB: '-';
ANTLR4 为其生成以下TstParser.InitContext:
public static class InitContext extends ParserRuleContext {
public Token token; //<---------------------------- HERE
public TerminalNode A() { return getToken(TstParser.A, 0); }
public TerminalNode B() { return getToken(TstParser.B, 0); }
public InitContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@Override public int getRuleIndex() { return RULE_init; }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof TstListener ) ((TstListener)listener).enterInit(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof TstListener ) ((TstListener)listener).exitInit(this);
}
}
现在,所有词法分析器规则都可以作为解析器类中的静态常量使用:
public static final int A=1, B=2, ADD=3, SUB=4;
我们如何使用它们来识别词法分析器规则?所有A、B 和ADD 规则都可以匹配'+'。那么在测试时我应该使用什么类型。
我的意思是:
TstParser.InitContext ctx;
//...
ctx.token.getType() == //What type?
//TstParse.A
//TstParse.B
//or
//TstParse.ADD?
一般来说,我想了解ANTLR4 是如何知道Token 的类型的?
【问题讨论】: