Perl 6中的递归正则表达式?

问题描述 投票:9回答:1

我一直试图弄清楚如何在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 ...
regex perl6
1个回答
15
投票

你需要明确表示你正在调用my-scoped正则表达式:

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

注意已添加的&。接着就,随即:

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

虽然你有时可以明确地写出&,但确实可以在使用它时:

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

这只能起作用,因为编译器发现在词法范围内定义了一个名为paren的正则表达式,因此将<paren>语法编译为该语法。对于递归情况,声明在解析正则表达式之前不会安装,因此需要显式。

© www.soinside.com 2019 - 2024. All rights reserved.