如何将参数传递给Perl 6语法?

时间:2017-07-24 03:37:05

标签: grammar perl6

Edit distance: Ignore start/end中,我提出了一个模糊模糊匹配问题的Perl 6解决方案。我有这样的语法(尽管我可能在编辑#3之后对其进行了改进):

grammar NString {
    regex n-chars { [<.ignore>* \w]**4 }
    regex ignore  { \s }
    }

文字4本身就是示例中目标字符串的长度。但下一个问题可能是另一个问题。那么我怎么能告诉语法我想要多长时间匹配呢?

1 个答案:

答案 0 :(得分:4)

虽然文档没有显示示例或使用$args参数,但我在S05-grammar/example.t in roast中找到了一个。

:args中指定参数并为正则表达式提供适当的签名。在正则表达式中,访问代码块中的参数:

grammar NString {
    regex n-chars ($length) { [<.ignore>* \w]**{ $length } }
    regex ignore { \s }
    }

class NString::Actions {
    method n-chars ($/) {
        put "Found $/";
        }
    }

my $string = 'The quick, brown butterfly';

loop {
    state $from = 0;
    my $match = NString.subparse(
        $string,
        :rule('n-chars'),
        :actions(NString::Actions),
        :c($from++),
        :args( \(5) )
        );

    last unless ?$match;
    }

我仍然不确定传递参数的规则。这不起作用:

        :args( 5 )

我明白了:

  

通过的位置太少;预计2个参数但得到1

这有效:

        :args( 5, )

但是对于这一点的思考已经足够一夜了。