58. Действия (actions) в грамматиках Perl 6, часть 2

Вчера мы ввели в грамматику блок кода, выполняемый в ответ на совпавшую подстроку. При увеличении сложности исполняемый код и правила грамматики будут сильно перемешиваться визуально и засорять внешний вид, поэтому есть смысл вынести весь код в отдельный класс:

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

Завтра мы рассмотрим более сложный случай, когда действия должны хранить данные.

One thought on “58. Действия (actions) в грамматиках Perl 6, часть 2

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s