在语法中§

有关方法 parse的详细信息,请参阅主要文档 在上下文中

method parse($target:$rule = 'TOP',  Capture() :$args = \(), Mu :$actions = Mu*%opt)

使用 $rule 作为起始规则解析 $target,如果它不是 Str,则将其强制转换为 Str。如果提供了其他 $args,则会将其传递给起始规则。

grammar RepeatChar {
    token start($character) { $character+ }
}
 
say RepeatChar.parse('aaaaaa':rule('start'), :args(\('a')));
say RepeatChar.parse('bbbbbb':rule('start'), :args(\('b')));
 
# OUTPUT: 
# 「aaaaaa」 
# 「bbbbbb」

如果提供了名为 actions 的参数,则将其用作动作对象,也就是说,对于每个成功的正则表达式匹配,如果存在同名方法,则使用匹配对象作为唯一的位置参数在动作对象上调用该方法。

my $actions = class { method TOP($/{ say "7" } };
grammar { token TOP { a { say "42" } b } }.parse('ab':$actions);
# OUTPUT: «42␤7␤»

其他命名参数用作匹配选项,因此你可以指定诸如 :pos(4) 之类的内容以从第五个(:pos 为零基)字符开始解析。允许所有 匹配副词,但并非所有副词都会生效。正则表达式可以有几种类型的副词,其中一些在编译时应用,例如 :s:i。你无法将它们传递给 .parse,因为正则表达式已经编译过了。但是,你可以传递那些影响运行时行为的副词,例如 :pos:continue

say RepeatChar.parse('bbbbbb':rule('start'), :args(\('b')), :pos(4)).Str;
# OUTPUT: «bb␤» 

方法 parse 仅在匹配结束后光标到达目标字符串末尾时才成功。如果你想在中间停止,请使用 方法 subparse

语法中的顶级正则表达式将被允许回溯。

成功时返回 Match,失败时返回 Nil