#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
кажется, это самый разумный способ добиться желаемого поведения.