Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Классы действий
Встроенные действия и классы действий
Теперь у вас есть два способа придать разбору смысл. Какой из них выбрать?
Встроенные действия помещают блок
{ make … } прямо внутрь токена:
grammar Sum {
token TOP { <a> '+' <b> { make $<a>.Int + $<b>.Int } }
token a { \d+ }
token b { \d+ }
}Их быстро писать, и для крошечной грамматики или одноразового скрипта они вполне годятся. Плата за это — шаблон и логика оказываются переплетены.
Класс действий держит их порознь: грамматика описывает форму, а класс действий — смысл:
grammar Sum {
token TOP { <a> '+' <b> }
token a { \d+ }
token b { \d+ }
}
class SumActions {
method TOP($/) { make $<a>.made + $<b>.made }
method a($/) { make $/.Int }
method b($/) { make $/.Int }
}По мере роста грамматики у этого разделения появляются настоящие преимущества: шаблон остаётся удобочитаемым, а одну грамматику можно сочетать с несколькими классами действий — один вычисляет, другой красиво печатает, третий строит структуру данных, — вообще не трогая саму грамматику.
Простое правило: встроенные действия — для чего-то маленького и одноразового, класс действий — для всего, что вы будете сопровождать или переиспользовать.
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Тест — make | Тест — Классы действий →
💪 Или перейдите сразу к упражнениям этого
раздела.