Курс по 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Коментари
Всеки токен
wordсъздава собствения си обърнат текст: вграденият му блок се изпълнява винаги когато съвпадне дума, аmake $/.flipсъхранява думата —$/е текущото съвпадение — изписана наопаки.TOPсъпоставя думите с<word> [ ' ' <word> ]*— една дума, после произволен брой пъти „интервал, после дума“ — и ги съчетава.$<word>е списъкът с всички съвпадения на думи;».madeизважда обърнатия текст, съхранен от всяко от тях, а.join(' ')пресъздава фразата с интервали.Формата „елемент, после елемент, после елемент…“ се среща достатъчно често, за да има съкращение: разделителят
%. Записът<word>+ % ' 'означава „една или повече<word>, разделени с интервал“ и съпоставя точно същите фрази като<word> [ ' ' <word> ]*— само по-сбито.Така
makeиmadeработят тук на две нива: малките парчета създават своите стойности, а цялото се създава от тях. Прочитането на.madeвърху резултата даваolleh dlrow.