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


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