Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Дерево разбора, make и made

Дерево совпадения

Совпадение грамматики — это дерево. У верхнего совпадения есть именованная запись для каждого токена, который использовал TOP, а эти записи сами являются объектами совпадения со своими захватами. По дереву ходят тем же синтаксисом <имя>, что и для именованных захватов:

grammar Pair {
    token TOP   { <key> '=' <value> }
    token key   { \w+ }
    token value { \d+ }
}

my $m = Pair.parse('x=5');
say $m<key>;   # 「x」
say $m<value>; # 「5」

Каждая ветвь — полноценный объект совпадения, поэтому у неё можно спросить .Str, позицию или преобразовать её. Здесь значение состоит из цифр, поэтому превратить его в настоящее число — это всего лишь вызов метода:

say $m<value>.Int; # 5

У более глубоких грамматик в дереве больше уровней: $m<a><b> добирается до токена b, использованного внутри токена a. Ходить по дереву так можно, но для чего-то большего, чем пара полей, это становится неуклюже. Следующая тема показывает более чистый способ прикрепить к каждому совпадению именно то значение, которое вам нужно.

Практика

Пройдите 1 тест по содержанию этой темы.

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

Дерево разбора, make и made   |   Тест — Дерево совпадения


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