Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Создание грамматик / Exercises / Разберите время
Решение: Разберите время
Вот один из возможных вариантов решения задачи.
Код
grammar Time {
token TOP { <hour> ':' <minute> ':' <second> }
token hour { \d ** 2 }
token minute { \d ** 2 }
token second { \d ** 2 }
}
say Time.parse('09:30:45')<second>;🦋 Исходный код можно найти в файле parse-a-time.raku.
Вывод
「45」Комментарии
TOPописывает время целиком как три токена, разделённых двоеточиями. Каждая часть — это\d ** 2, ровно две цифры, а не открытое\d+, поэтому неверное значение вроде09:30:456отвергается. (Если часть может быть без ведущего нуля, как час в9:30:45, напишите\d ** 1..2, разрешив одну или две цифры.)После разбора каждый токен становится именованным захватом, поэтому секунды читают у совпадения как
<second>. Добавить третью часть — это всего один лишний токен и одно лишнее двоеточие: грамматика естественно масштабируется.