Как проверить диапазоны чисел в ANTLR 3? - PullRequest
1 голос
/ 03 мая 2011

Я знаю, что это может в конечном итоге зависеть от языка, поэтому приемлемо решение на Java или Python.

С учетом грамматики:

MONTH   : DIGIT DIGIT ;
DIGIT   : ('0'..'9') ;

Я хочу проверить ограничение на MONTH чтобы убедиться, что значение находится между 01 и 12.С чего мне начать искать и как мне указать это ограничение как правило?

Ответы [ 2 ]

1 голос
/ 03 мая 2011

Вы можете встроить пользовательский код, обернув { и } вокруг него. Таким образом, вы можете сделать что-то вроде:

MONTH 
  :  DIGIT DIGIT 
     {
       int month = Integer.parseInt(getText());
       // do your check here
     } 
  ;

Как видите, я позвонил getText(), чтобы взять совпавший текст токена.

Обратите внимание, что я предположил, что вы ссылаетесь на это правило MONTH из другого правила лексера. Если вы собираетесь выдать исключение, если 1 > month > 12, то всякий раз, когда ваш источник содержит недопустимое значение месяца, ни одно из правил синтаксического анализатора никогда не будет найдено. Хотя правила лексера и парсера могут быть смешаны в одном файле грамматики .g, входной источник сначала токенизируется на основе правил лексера, и как только это произойдет, только тогда правила парсера будут сопоставлены.

0 голосов
/ 03 мая 2011

Вы можете использовать эту бесплатную онлайн-утилиту Regex_For_Range , чтобы сгенерировать регулярное выражение для любого непрерывного целочисленного диапазона. Для значений 01-12 (с разрешенными ведущими 0) утилита выдает:

0*([1-9]|1[0-2])

Отсюда вы можете видеть, что если вы хотите ограничить это только 2-значными строками от «01» до «12», то настройте это следующим образом:

0[1-9]|1[0-2]

Для дней 01-31 мы получаем:

0*([1-9]|[12][0-9]|3[01])

А для 2000-2099 годов это выражение просто:

20[0-9]{2}
...