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

Ama*_*dan 10 regex perl6

我一直试图弄清楚如何在Perl 6中做一个递归的正则表达式.对于一个玩具示例,一个平衡的括号匹配器,它将匹配((())())内部(((((())()).

  • PCRE示例:/\((?R)?\)/

  • Onigmo示例:(?<paren>\(\g<paren>*\))

我以为这样做会:

my regex paren {
  '(' ~ ')' <paren>*
}
Run Code Online (Sandbox Code Playgroud)

或者更简单

my regex paren {
  '(' <paren>* ')'
}
Run Code Online (Sandbox Code Playgroud)

但那失败了

No such method 'paren' for invocant of type 'Match'
in regex paren at ...
Run Code Online (Sandbox Code Playgroud)

Jon*_*ton 15

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

my regex paren {
    '(' ~ ')' <&paren>*
}
Run Code Online (Sandbox Code Playgroud)

注意&已经添加了.接着就,随即:

say "(()())" ~~ /^<&paren>$/    # ?(()())?
say "(()()" ~~ /^<&paren>$/     # Nil
Run Code Online (Sandbox Code Playgroud)

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

say "(()())" ~~ /^<paren>$/    # ?(()())?
say "(()()" ~~ /^<paren>$/     # Nil
Run Code Online (Sandbox Code Playgroud)

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

  • 完美,这是缺少的一块.谢谢! (2认同)