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

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

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


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