【问题标题】:How can I pass arguments to a Perl 6 grammar?如何将参数传递给 Perl 6 语法?
【发布时间】:2017-07-24 03:37:04
【问题描述】:

Edit distance: Ignore start/end 中,我提供了一个Perl 6 解决方案来解决模糊模糊匹配问题。我有这样的语法(虽然也许我在编辑 #3 之后改进了它):

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

文字4 本身就是示例中目标字符串的长度。但下一个问题可能是其他长度。那么如何告诉语法我希望匹配多长时间?

【问题讨论】:

    标签: grammar raku


    【解决方案1】:

    虽然文档没有显示示例或使用$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, )
    

    但这已经足够考虑一晚了。

    【讨论】:

    • 它期望被传递一个Capture,如果它没有得到一个然后调用.Capture coercer。 List 将强制转换为 Capture,并将列表元素作为位置参数。 Int 不会变成任何有用的东西(它回退到 Mu.Capture,它接受公共属性并将其用作命名参数;Int 没有公共属性)。
    • 这些如何变成两个论点?
    • 我希望它指的是调用者,即“self”参数,因为类中的正则表达式是方法。
    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2011-12-28
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多