3

わかりました、私は perl6 を学んでいて、本当に簡単なことをしようとしています: 文法を使用して、アクション オブジェクトに従って一致するテキストを変更します。しかし、私は失敗しましたが、その理由はわかりません。こんな素朴な質問ですみません。私はテクノロジー業界やプログラミング業界ではありません。では、しばらくお待ちくださいね。

「jan」を 01 に、「feb」を 02 に変更したい。とても簡単:

grammar month {
    regex TOP { (\s* <mon> \s*)+ }
    proto regex mon {*}
    regex mon:sym<jan> { <sym> }
    regex mon:sym<feb> { <sym> }
}
class monAct {
    method TOP ($/) {
    make $<mon>.made;
    }
    method mon:sym<jan> ($/) { make "01"; };
    method mon:sym<feb> ($/) { make "02"; };
}
my $m = month.parse("jan feb jan feb", actions => monAct.new);
say $m.made; # it says Nil instead of "01 02 01 02" that I want; 

それで、私はここで何を間違えましたか?ありがとう。

4

1 に答える 1

3

<mon>TOPルールではなく、キャプチャ グループに適用されます。一致オブジェクトにインデックスを付けて取得することもできますが、代わりに非キャプチャ グループを使用する方がおそらく簡単です。

regex TOP { [\s* <mon> \s*]+ }

さらに、+量指定子により、単一の一致オブジェクトではなく、リストが取得されます。>>またはを使用mapして、ペイロードを取得できます。

method TOP ($/) { make $<mon>>>.made }
于 2016-11-24T10:43:50.247 に答える