Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Классы действий / Exercises / Одна грамматика, два класса действий
Решение: Одна грамматика, два класса действий
Вот один из возможных вариантов решения задачи.
Код
grammar Pair {
token TOP { <a> ',' <b> }
token a { \d+ }
token b { \d+ }
}
class Sum { method TOP($/) { make $<a>.Int + $<b>.Int } }
class Diff { method TOP($/) { make $<a>.Int - $<b>.Int } }
say Pair.parse('10,20', actions => Sum.new).made;
say Pair.parse('10,20', actions => Diff.new).made;🦋 Исходный код можно найти в файле two-actions.raku.
Вывод
30
-10Комментарии
Грамматика описывает лишь форму «число,число»; о том, что вычислять, она ничего не знает.
Два класса действий придают одному и тому же разбору разный смысл: один складывает числа, другой вычитает. Чтобы получить другой результат, достаточно передать в
.parseдругой объектactions, вообще не меняя грамматику.
Навигация по курсу
← Одна грамматика, два класса действий | Сделайте дату человекочитаемой →