Курс по Raku / Регулярни изрази и граматики / Граматики / Граматики, класове и наследяване
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.
Прототокените се четат по-добре от дълга верига от алтернативи с
|, а етикетите :sym<…> дават на всеки
случай име, на което можете да реагирате по-късно, когато прикачвате
семантика към разбора. Те са идиоматичният начин да изразите „един от
тези видове“ в граматика.
Практика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← Тест — Наследяване на граматики | Тест — Граматики и наследяване →
💪 Или преминете направо към упражненията в този
раздел.