Курс Raku / Регулярні вирази та граматики / Граматики / Граматики, класи та успадкування

Proto-токени та альтернативи

Інколи одне поняття має кілька форм — число може бути цілим або десятковим. Ви могли б записати альтернативу через |, але граматики пропонують охайніший спосіб: прототокен з іменованими варіантами.

Оголосіть загальний токен як proto token, а потім запишіть кожен варіант як token name: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.

Прототокени читаються краще, ніж довгий ланцюжок альтернатив через |, а мітки :sym<…> дають кожному випадку ім’я, на яке можна зважати пізніше, коли ви прикріплюватимете до розбору семантику. Це ідіоматичний спосіб виразити «один із цих різновидів» у граматиці.

Практика

Виконайте 1 тест за змістом цієї теми.

Навігація курсом

Тест — Успадкування граматик   |   Тест — Граматики та успадкування


💪 Або перейдіть одразу до вправ цього розділу.