проверить предыдущий/левый токен в лексере

как я могу найти предыдущий/левый токен в lexer
например

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]*;
CARET  : '^';
RTN    : {someCond1}? CARET ID; // CARET not include this token
GLB    : {someCond2}? CARET ID; // CARET not include this token

и т.д


person DAiMor    schedule 09.01.2013    source источник
comment
Что ты пытаешься сделать ? Какой ввод вы хотите проанализировать? Почему только лексер? Какая версия ANTLR?   -  person BernardK    schedule 11.01.2013
comment
тег antlr4 и версия antlr 4 для подсветки синтаксиса   -  person DAiMor    schedule 11.01.2013


Ответы (2)


спасибо, я так и сделал

lexer grammar TLexer;

@lexer::members {
    int lastTokenType = 0;
public void emit(Token token) {
    super.emit(token);
    lastTokenType = token.getType();
}
}

CARET  : '^';
RTN    : {someCond1&&(lastTokenType==CARET)}? ID;
GLB    : {someCond2&&(lastTokenType==CARET)}? ID;
ID     : [a-zA-Z] [a-zA-Z0-9]*;
person DAiMor    schedule 12.01.2013

Я посмотрел на источник Lexer. Лексер отвечает на вызовы nextToken() (от парсера). Я не обнаружил, что он отслеживает предыдущие токены. И нет прямого доступа к CARET. Учитывая этот ввод:

xyz ^abc

и эта грамматика:

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]* {System.out.println("ID ");} ;
CARET  : '^'                   {System.out.println("CARET ");} ;
WS     : [ \r\n] ;
RTN    : CARET ID {System.out.println("RTN " + _tokenStartCharIndex);} ;

вывод:

$ antlr4 TLexer.g4 
$ javac TLexer.java 
$ grun TLexer tokens -tokens -diagnostics -trace input.txt 
ID 
RTN 4
[@0,0:2='xyz',<1>,1:0]
[@1,3:3=' ',<3>,1:3]
[@2,4:7='^abc',<4>,1:4]
[@3,8:8='\n',<3>,1:8]
[@4,9:8='<EOF>',<-1>,2:9]

Лексер дает вам один маркер типа ‹4> (RTN) для ввода ^abc.

person BernardK    schedule 11.01.2013
comment
Я знаю это, но мне нужно другое. мне нужны CARET и RTN как два токена - person DAiMor; 12.01.2013
comment
@BernardK Ссылка не работает, но у WaybackMachine есть копия, которая очень похожа на эта вики-страница. - person MvG; 01.03.2016