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

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

Тест — Наследование грамматик   |   Тест — Грамматики и наследование


💪 Или перейдите сразу к упражнениям этого раздела.