Курс по 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 | Тест — Класове за действия →
💪 Или преминете направо към упражненията в този
раздел.