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

Розв’язання: Переверніть порядок слів

Ось одне з можливих розв’язань задачі.

Код

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.

Навігація курсом

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