Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Грамматики, классы и наследование
Proto-токены и альтернативы
Иногда у одного понятия есть несколько форм: число может быть целым
или десятичным. Можно было бы написать альтернативу через
|, но грамматики предлагают более аккуратный способ —
proto-токен с именованными вариантами.
Объявите зонтичный токен как proto token, а затем
запишите каждый вариант как token имя:sym<метка>:
grammar Number {
token TOP { <number> }
proto token number {*}
token number:sym<int> { \d+ }
token number:sym<float> { \d+ '.' \d+ }
}
say Number.parse('42').defined; # True
say Number.parse('3.14').defined; # TrueСтрока proto token number {*} говорит:
«number — это один из вариантов ниже». Каждый вариант несёт
метку :sym<…>, которая его называет. Когда грамматике
нужен <number>, она пробует варианты и по правилу
самого длинного токена выбирает подходящий: int для
42, float для 3.14.
Proto-токены читаются лучше, чем длинная цепочка альтернатив через
|, а метки :sym<…> дают каждому случаю
имя, на которое можно опереться позже, когда вы будете придавать разбору
смысл. Это идиоматический способ выразить в грамматике «одно из вот
таких».
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Тест — Наследование грамматик | Тест — Грамматики и наследование →
💪 Или перейдите сразу к упражнениям этого
раздела.