Курс языка программирования 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; # TrueLoud наследует TOP от Base, но
предоставляет собственный greeting. Когда разбирает
Loud, её TOP вызывает
<greeting> — и используется переопределяющий токен из
Loud, ровно так же, как работает переопределённый метод у
объектов.
Это делает грамматики компонуемыми. Можно написать общую грамматику для формата, а затем вывести из неё специализированный вариант, меняющий только те токены, которые отличаются, не переписывая остального.
Даже тот .parse, который вы постоянно вызываете,
происходит из этой классовой природы: всякая грамматика автоматически
наследует от встроенного базового типа Grammar, который и
даёт .parse (а также его родственника для частичного
совпадения, .subparse). Вы никогда не пишете его сами — он
достаётся вам даром, как обычный класс получает методы от родителя.
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Грамматики, классы и наследование | Тест — Наследование грамматик →
💪 Или перейдите сразу к упражнениям этого
раздела.