我一直在试图弄清楚如何在 Perl 6 中执行递归正则表达式。对于一个玩具示例,平衡括号匹配器,它将匹配((())())
inside (((((())())
.
我以为这样就可以了:
my regex paren {
'(' ~ ')' <paren>*
}
或者更简单的
my regex paren {
'(' <paren>* ')'
}
但这失败了
No such method 'paren' for invocant of type 'Match'
in regex paren at ...
您需要明确表示您正在调用my
-范围正则表达式:
my regex paren {
'(' ~ ')' <&paren>*
}
注意&
已添加。接着就,随即:
say "(()())" ~~ /^<&paren>$/ # 「(()())」
say "(()()" ~~ /^<&paren>$/ # Nil
虽然有时您确实可以在不明确编写&
,并且在使用它时确实可以:
say "(()())" ~~ /^<paren>$/ # 「(()())」
say "(()()" ~~ /^<paren>$/ # Nil
这只有效,因为编译器发现词法范围中定义了一个名为paren
所以编译<paren>
语法到那个。对于递归情况,只有在解析正则表达式之后才会安装声明,因此需要明确声明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)