Курс языка программирования 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 тест по содержанию этой темы.
Навигация по курсу
← Тест — Возврат | Тест — Токены и правила →
💪 Или перейдите сразу к упражнениям этого
раздела.