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

Граматиките са класове

Когато напишете grammar, Raku създава нещо много близко до клас. Токените са методи върху него и към него важи цялата машинария на наследяването от частта за обектите. Затова една граматика може да разширява друга с is, също като подклас:

grammar Base {
    token TOP      { <greeting> }
    token greeting { 'hi' }
}

grammar Loud is Base {
    token greeting { 'HI' }
}

say Loud.parse('HI').defined; # True
say Base.parse('hi').defined; # True

Loud наследява TOP от Base, но предоставя свой собствен greeting. Когато Loud разбира текст, неговият TOP извиква <greeting> и се използва предефиниращият токен в Loud — точно както работи предефиниран метод върху обекти.

Това прави граматиките компонуеми. Можете да напишете обща граматика за даден формат, а после да изведете специализирана версия, която променя само онези токени, които се различават, без да преписвате останалото.

Дори .parse, който постоянно извиквате, идва от тази класова природа: всяка граматика автоматично наследява вградения базов тип Grammar, който предоставя .parse (и роднината му за частично съпоставяне .subparse). Никога не го пишете сами — получавате го безплатно, точно както обикновен клас наследява методи от родителя си.

Практика

Направете 1 тест върху съдържанието на тази тема.

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

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


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