Курс Raku / Регулярні вирази та граматики / Граматики / Токени та правила

Значущі пробіли у правилах

rule — це token з однією додатково увімкненою можливістю: :sigspace (значущий пробіл), тобто рівно прислівник :s. Він перетворює пробіли, які ви пишете в шаблоні, на автоматичне зіставлення з пробільними символами між частинами. Саме це вам потрібно щоразу, коли текст, який ви розбираєте, має пробіли між своїми шматками.

Порівняймо обидва варіанти. У token пробіли в шаблоні ігноруються, тож <first> <second> вимагає, щоб дві частини стояли без нічого між ними. Оскільки \w+ зупиняється на пробілі, вхід із пробілом не дає збігу:

grammar WithToken {
    token TOP    { <first> <second> }
    token first  { \w+ }
    token second { \w+ }
}

say WithToken.parse('foo bar').defined; # False

Прийняти пробіл у token можна — просто вам доведеться зіставитися з ним самотужки, наприклад за допомогою \s+:

token TOP { <first> \s+ <second> }      # тепер 'foo bar' розбирається

rule вставляє це зіставлення з пробілами за вас, тож достатньо просто написати пробіл між частинами:

grammar WithRule {
    rule TOP     { <first> <second> }
    token first  { \w+ }
    token second { \w+ }
}

say WithRule.parse('foo bar').defined; # True

Поширений підхід — використовувати rule для структури вищого рівня, де частини розділені пробілами, і token для дрібних шматків на кшталт імен та чисел, які пробілів не містять. Це робить вашу граматику і правильною, і легкою для читання.

Практика

Виконайте 1 тест за змістом цієї теми.

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

Тест — Повернення   |   Тест — Токени та правила


💪 Або перейдіть одразу до вправ цього розділу.