Рекурсивное регулярное выражение в Perl 6? - PullRequest
0 голосов
/ 01 марта 2019

Я пытался выяснить, как сделать рекурсивное регулярное выражение в Perl 6. Для примера с игрушкой - сопоставление со сбалансированными скобками, которое будет соответствовать ((())()) внутри (((((())()).

  • PCRE пример: /\((?R)?\)/

  • Onigmo пример: (?<paren>\(\g<paren>*\))

Я думал, что это сделает это:

my regex paren {
  '(' ~ ')' <paren>*
}

или более простой

my regex paren {
  '(' <paren>* ')'
}

, но это не с

No such method 'paren' for invocant of type 'Match'
in regex paren at ...

1 Ответ

0 голосов
/ 01 марта 2019

Вам необходимо явно указать, что вы вызываете регулярное выражение my:

my regex paren {
    '(' ~ ')' <&paren>*
}

Обратите внимание на добавленное &.С этим:

say "(()())" ~~ /^<&paren>$/    # 「(()())」
say "(()()" ~~ /^<&paren>$/     # Nil

Хотя это правда, что иногда вы можете сойти с рук в явном виде написав &, и действительно можете при его использовании:

say "(()())" ~~ /^<paren>$/    # 「(()())」
say "(()()" ~~ /^<paren>$/     # Nil

Это работает только потому, чтов компиляторе есть регулярное выражение, определенное в лексической области видимости с именем paren, поэтому компилирует синтаксис <paren> в него.В рекурсивном случае объявление не устанавливается до тех пор, пока не будет проанализировано регулярное выражение, поэтому нужно быть явным.

...