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


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