Как «пропустить» правило, чтобы отдать предпочтение одному правилу над другим? - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я создаю парсер дат, используя 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 и выбрасывать ошибки, но, похоже, ничего не работает.

Есть ли способ заставить оценщика пропустить это правило и перейти к альтернативе?

1 Ответ

0 голосов
/ 17 октября 2018

Почему бы вам не изменить определение года токена, чтобы оно содержало только 4 цифры?Это решит проблему.

Итак, ваш год и дата будут

numYear: [0-9] [0-9] [0-9] [0-9]
  numDayOfMonth: [0-9] | [0-9] [0-9]

В настоящее время они оба имеют одно и то же определение - поэтому анализатор не знает, какое правило выбрать при разборе иидет с первым, который соответствует входу.

...