Курс 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   |   Тест — Класи дій


💪 Або перейдіть одразу до вправ цього розділу.