У меня есть следующее как часть моей грамматики (и здесь 'name' и 'value' просто статичны для простоты, на практике это не так):
test4 : 'name' CMPOP 'value';
CMPOP : EQUALS | NOTEQUALS;
EQUALS : '=';
NOTEQUALS : '!=';
Теперь я хочу по-разному обрабатывать разные CMPOP (возможно, с помощью переключателя). Есть ли способ получить int/enum-версию токена, лежащего в основе CMPOP (= или!=), пока я оцениваю выражение в реализации FilterListener? Я знаю, что могу получить строку с помощью getText(), но сравнение строк везде может быть медленным. например если у меня есть name=value, я вижу, что = TerminalNodeImpl и у него есть символ. Единственное, что здесь похоже, это свойство type, но оно, кажется, дает мне CMPOP.
public void exitTest4(@NotNull testParser.Test4Context ctx) {
System.out.println(ctx.CMPOP().getSymbol().toString());
int type = ctx.CMPOP().getSymbol().getType();
System.out.println(type + "," + testParser.tokenNames[type]);
}
Дает мне:
[@1,4:4='=',<6>,1:4]
6,CMPOP
Я хочу сделать что-то вроде:
switch ( ctx.CMPOP().something() ) {
EQUALS : //evaluate with = ; break
NOTEQUALS : //evaluate with != ; break
}
Или я иду об этом неправильно? Должен ли я переместить это в правила парсера, а не в правила лексера, например: 'name' (EQUALS | NOTEQUALS) 'value'?
Я использую antlr4.