Курс языка программирования 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」

Комментарии

  1. TOP описывает время целиком как три токена, разделённых двоеточиями. Каждая часть — это \d ** 2, ровно две цифры, а не открытое \d+, поэтому неверное значение вроде 09:30:456 отвергается. (Если часть может быть без ведущего нуля, как час в 9:30:45, напишите \d ** 1..2, разрешив одну или две цифры.)

  2. После разбора каждый токен становится именованным захватом, поэтому секунды читают у совпадения как <second>. Добавить третью часть — это всего один лишний токен и одно лишнее двоеточие: грамматика естественно масштабируется.

Навигация по курсу

Разберите время   |   Токены и правила