我一直试图弄清楚如何在Perl 6中做一个递归的正则表达式.对于一个玩具示例,一个平衡的括号匹配器,它将匹配((())())内部(((((())()).
我以为这样做会:
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>语法编译为该语法.对于递归情况,声明在解析正则表达式之前不会安装,因此需要显式.