Вчера мы ввели в грамматику блок кода, выполняемый в ответ на совпавшую подстроку. При увеличении сложности исполняемый код и правила грамматики будут сильно перемешиваться визуально и засорять внешний вид, поэтому есть смысл вынести весь код в отдельный класс:
class DateStrActions { method TOP($/) { printf "--> %4i-%02i-%02i\n", $<year>, $<month>, $<day> } }
Методы этого класса должны совпадать с названиями правил и токенов в грамматике. Из вчерашнего примера я убрал код из токена TOP грамматики DateStr и поместил его в метод TOP класса DateStrActions.
Теперь необходимо сообщить о действиях перед парсингом:
my $r = DateStr.parse($t, :actions(DateStrActions));
Все остальное остается неизменным. Программа печатает тот же результат:
2018-02-26 --> 2018-02-26 2018-02-26 --> 2018-02-26 2018-2-26 --> 2018-02-26 26.02.2018 --> 2018-02-26
Завтра мы рассмотрим более сложный случай, когда действия должны хранить данные.