Курс по 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 тест върху съдържанието на тази тема.

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

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


💪 Или преминете направо към упражненията в този раздел.