Perl6 语法和操作错误:“在 NQPMu 类型的对象上找不到方法 'ann'”

问题描述 投票:0回答:1

我仍然对 Perl6 语法和操作有疑问。我想在字符串中查找模式,一旦找到,就根据操作更改模式,并返回修改后的字符串。

my $test = "xx, 1-March-23, 23.feb.21, yy foo  12/january/2099 , zzz";
# want this result: xx, 010323, 230221, yy foo  120199 , zzz"; 
# 2 digits for day, month, year

grammar month {
    regex TOP { <unit>+ }
    regex unit { <before> <form1> <after> }
    regex before { .*? }
    regex after  { .*? }
    regex form1 { \s* <dd> <slash> <mon> <slash> <yy> \s* }
    regex slash { \s* <[ \- \/ \. ]> \s* }
    regex dd    { \d ** 1..2 }
    regex yy    { (19 | 20)? \d\d }
    proto regex mon {*}
    regex mon:sym<jan> { \w 'an' \w* }
    regex mon:sym<feb> { <sym> }
    regex mon:sym<mar> { <[Mm]> 'ar' \w* }
}
class monAct {
    method TOP ($/) { make $<unit>.map({.made}); }
    method unit  ($/) { make $<before> ~ $<form1>.made ~$<after>; }
    method form1 ($/) { make $<dd>.made ~ $<mon>.made ~ $<yy>; }
    method dd ($/) {
        my $ddStr = $/.Str;
        if $ddStr.chars == 1 { make "0" ~ $ddStr; } else { make $ddStr; }
    }
    method mon:sym<jan> ($/) { make "01"; };
    method mon:sym<feb> ($/) { make "02"; };
    method mon:sym<mar> ($/) { make "03"; };
}

my $m = month.parse($test, actions => monAct.new);
say $m;
say $m.made;

但它说:

===抱歉!===无法在 NQPMu 类型的对象上找到方法“ann”

我做错了什么?

regex action grammar raku
1个回答
2
投票

对我来说,这看起来像是 Rakudo 中的一个错误,可能与

before
lookahead 断言语法的一部分有关。

它已经可以通过简单的

/ <before> /
来触发:

$ perl6 --version
This is Rakudo version 2016.11-20-gbd42363 built on MoarVM version 2016.11-10-g0132729
implementing Perl 6.c.

$ perl6 -e '/ <before> /'
===SORRY!===
Cannot find method 'ann' on object of type NQPMu

至少,这是一个不太令人敬畏的错误消息。

您应该将此报告给

[email protected]
,参见 如何报告错误

© www.soinside.com 2019 - 2024. All rights reserved.