Курс по 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 тест върху съдържанието на тази тема.

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

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


💪 Или преминете направо към упражненията в този раздел.