Курс по Raku / Регулярни изрази и граматики / Граматики / Класове за действия

Писане на клас за действия

Класът за действия е обикновен клас с по един метод за всеки токен на граматиката. Всеки метод получава съвпадението за своя токен като $/ и извиква make, за да прикачи стойност — точно каквото правеше вграденият блок, но държано отделно от шаблона:

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 }
}

Граматиката сега съдържа само шаблона; цялата семантика живее в SumActions. Забележете как методите си сътрудничат: a и b създават по едно цяло число, а TOP ги прочита с $<a>.made и $<b>.made и създава сумата им.

За да използвате класа за действия, подайте негов екземпляр на .parse с именувания аргумент actions, а после прочетете най-горния резултат с .made:

say Sum.parse('2+3', actions => SumActions.new).made; # 5

Докато граматиката разбира текста, методът на всеки токен се изпълнява автоматично и изгражда стойността отдолу нагоре. Резултатът върху най-горното съвпадение е стойността, която искате — тук числото 5.

Практика

Направете 1 тест върху съдържанието на тази тема.

Навигация в курса

Класове за действия   |   Тест — make


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