У меня проблемы с семантическими предикатами в ANTLR 4. Моя грамматика синтаксически неоднозначна, и для устранения двусмысленности нужно смотреть вперед на один токен.
В качестве примера я хочу проанализировать «19 января 2012 г. до 9 вечера» как дату «19 января 2012 г.», оставив следующий токен анализатора на «до». И я хочу проанализировать «19 января, 7 до 9 вечера» как дату «19 января» со следующим токеном парсера в «7».
Поэтому мне нужно посмотреть на 3-й жетон и либо взять его, либо оставить.
Мой фрагмент грамматики:
date
: month d=INTEGER { isYear(getCurrentToken().getText())}? y=INTEGER
{//handle date, use $y for year}
| month d=INTEGER {//handle date, use 2013 for year}
;
Когда синтаксический анализатор запускается на любом примере ввода, я получаю это сообщение:
line 1:9 rule date failed predicate: { isYear(getCurrentToken().getText())}?
Он никогда не доходит до 2-го альтернативного правила, потому что (я предполагаю) он уже прочитал один дополнительный токен.
Может ли кто-нибудь показать мне, как это сделать?