В настоящее время я создаю парсер дат, используя antlr.Входные данные:
year monthName numDayOfMonth era
numDayOfMonth monthName year era
Это все по правилу stringDate
, поэтому моя грамматика выглядит следующим образом
stringDate: year monthName numDayOfMonth
| numDayOfMonth monthName year;
numYear: NUMBER ;
strMonth: MONTH ;
numDayOfMonth: NUMBER ;
NUMBER: [0-9]+ ;
MONTH: 'jan' | 'feb' | 'mar' | 'apr' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' ;
В моих слушателях я проверяю, чтобы убедиться, что numDayOfMonth
находится в диапазоне [1, 31]
, чтобы убедиться, что число является действительной датой.Я делаю то же самое для месяцев (сначала я превращаю их в соответствующий месяц).
Проблема в том, что если ввести дату 2013 June 13
, дата будет проанализирована правильно.Однако, когда я ввожу 13 June 2013
, он анализируется неправильно, потому что синтаксический анализатор запутывается и думает, что 2013 год - это не год, и поэтому проверка завершается неудачно во время exitNumDayOfMonth
.Я почесал голову о том, как справиться с этим.По сути, я хочу, чтобы оценщик пропустил правило, с которым я сталкиваюсь num > 31
, но я не совсем уверен, как пропустить правило.Я пытался return
ING и выбрасывать ошибки, но, похоже, ничего не работает.
Есть ли способ заставить оценщика пропустить это правило и перейти к альтернативе?