2016-07-04 3 views
0

есть ли способ «подделать» ретроспективный взгляд в Antlr4? Я хочу решить некоторую двусмысленность в соответствии с токеном прямо перед тем, где я.Lookback lexer member in antlr4

EDIT

read: STAR text STAR text STAR text 
| STAR text STAR KEY_WORD STAR text 

text: STR +; 

@lexer::members { 
    private boolean checkAhead(int maxAmountOfCharacters, String pattern) { 
    final Interval ahead = new Interval(this._tokenStartCharIndex, this._tokenStartCharIndex + maxAmountOfCharacters - 1); 
    return this._input.getText(ahead).matches(pattern); 
    } 

KEY_WORD: LETTER LETTER LETTER LETTER LETTER ; 
STAR :'*'; 

STR: {(!checkAhead(6, "([A-Z]){5}[*](\\D|$)") }? 
    (
     LETTER 
     | DIGIT 
    )+ 
; 

Я хочу, чтобы вход, который должен читаться как KEY_WORD только если это СТАР KEY_WORD СТАР сейчас, если последнее слово в тексте [AZ] {5} она согласована с KEY_WORD

+0

, пожалуйста, поделитесь частью грамматики роура и простым примером сценария вашей проблемы – ddb

+0

извините, вопрос и пример изменены –

+0

Нужно предоставить образец ввода, отмеченный ожидаемыми результатами. Непонятно, что вы просите от вашего описания. – GRosenberg

ответ

1

Вы можете использовать отрицательное смещение в функциях lookahead LA() и LT() (LA дает вам только токен, а LT дает вам весь токен). Примечание: LA (0) не определено, но вы можете использовать LA (-1), LA (-2), LT (5) и т.д.

Другое примечание: оглядываясь назад дальше, чем на один шаг работ только с буферизованными токенами. Небуферизованные потоки кэшируют только один токен (предыдущий).

Класс TokenStream (из которого получен ваш экземпляр this._input) определяет функцию LT(). LA() доступен в классе IntStream (который является предком для любого входного потока символов, например CharStream или ANTLRInputStream.

+0

- это LT() в antlr 4? Я не могу его использовать, по крайней мере из моего файла lexer, можете ли вы добавить маленький пример? спасибо –

+0

Добавлено немного больше информации, где можно найти LA + LT. –

+0

Я пытался получить доступ к LT в файле Lexer, поэтому я не мог использовать его в первую очередь. Спасибо! –