Курс языка программирования 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 тест по содержанию этой темы.

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

Тест — Возврат   |   Тест — Токены и правила


💪 Или перейдите сразу к упражнениям этого раздела.