Курс по Raku / Регулярни изрази и граматики / Граматики / Дървото на разбора, make и made / Exercises / Обърнете реда на думите

Решение: Обърнете реда на думите

Ето едно възможно решение на задачата.

Код

grammar Phrase {
    token TOP  { <word> [ ' ' <word> ]* { make $<word>».made.join(' ') } }
    token word { \w+ { make $/.flip } }
}

say Phrase.parse('hello world').made;

🦋 Намерете програмата във файла reverse-the-words.raku.

Изход

olleh dlrow

Коментари

  1. Всеки токен word създава собствения си обърнат текст: вграденият му блок се изпълнява винаги когато съвпадне дума, а make $/.flip съхранява думата — $/ е текущото съвпадение — изписана наопаки.

  2. TOP съпоставя думите с <word> [ ' ' <word> ]* — една дума, после произволен брой пъти „интервал, после дума“ — и ги съчетава. $<word> е списъкът с всички съвпадения на думи; ».made изважда обърнатия текст, съхранен от всяко от тях, а .join(' ') пресъздава фразата с интервали.

  3. Формата „елемент, после елемент, после елемент…“ се среща достатъчно често, за да има съкращение: разделителят %. Записът <word>+ % ' ' означава „една или повече <word>, разделени с интервал“ и съпоставя точно същите фрази като <word> [ ' ' <word> ]* — само по-сбито.

  4. Така make и made работят тук на две нива: малките парчета създават своите стойности, а цялото се създава от тях. Прочитането на .made върху резултата дава olleh dlrow.

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

Обърнете реда на думите   |   Класове за действия