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

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

Переверните порядок слов   |   Классы действий