Курс языка программирования 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.