Как сопоставить фиксированное количество символов в ANTLR 3?

#antlr #grammar #antlr3

#antlr #грамматика #antlr3

Вопрос:

Я хочу проанализировать даты ISO 8601 в моей грамматике ANTLR.

 2001-05-03
  

В моем файле грамматики есть следующие записи:

 date    : FOUR_DIGIT ('-')? TWO_DIGIT ('-')? TWO_DIGIT ;

FOUR_DIGIT
    : TWO_DIGIT TWO_DIGIT ; 

TWO_DIGIT
    : DIGIT DIGIT ;

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

Я знаю, что могу сопоставить один или несколько с DIGIT и ноль или более с DIGIT*

Пока это работает, есть ли более простой синтаксис, чтобы указать, что я хочу сопоставить ровно 2 DIGIT ?

Комментарии:

1. просто для тех, кто проезжает мимо в будущем, я отказался от синтаксического анализа дат в моем анализаторе и решил, что лучше анализировать даты непосредственно в коде, пока я не смогу найти способ исходного анализа дат, который в конечном итоге не конфликтует с другими терминами, начинающимися с DIGIT шаблонов.

Ответ №1:

Джаррод Роберсон писал:

Пока это работает, есть ли более простой синтаксис, чтобы указать, что я хочу сопоставить ровно 2 ЦИФРЫ?

Нет, DIGIT DIGIT это единственный способ сопоставить ровно две цифры. ANTLR, к сожалению, не поддерживает что-то вроде DIGIT{2} .

Комментарии:

1. Я удалил month, это мне ничего не дало, поскольку это противоречит попытке ограничить количество дней таким же образом. Также 00 не был бы действительным месяцем.

2. Понятно. Да, так выглядит лучше: просто сопоставьте даты «свободно» и на более позднем этапе проверьте, является ли это допустимой датой или нет.

3. Возможно, вы знаете, но понимаете, что все 4 (и 2) значные числа теперь обозначаются как FOUR_DIGIT (или TWO_DIGIT). Таким образом, вызов DIGIT из любого из ваших правил синтаксического анализа никогда не сможет сопоставить ни четыре, ни две последовательные цифры.

4. @Jarrod, да, я это понял, но хотел убедиться.

Ответ №2:

Я почти уверен, что в ANTLR 3 нет кванторов, кроме * , и ? . DIGIT DIGIT DIGIT DIGIT кажется, это самый разумный способ добиться желаемого поведения.

Смотрите http://www.antlr.org/wiki/display/ANTLR3/Grammars