2016-11-24 1 views
1

Okay, ich habe immer noch Probleme mit Perl6 Grammatik und Aktion. Ich möchte ein Muster in einer Zeichenfolge finden, und sobald es gefunden wird, ändern Sie das Muster entsprechend der Aktion und geben Sie die geänderte Zeichenfolge zurück.Perl6 Grammatik und Aktion Fehler: "Methode 'Ann' auf Objekt vom Typ NQPMu nicht gefunden werden"

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; 

Aber es sagt:

=== SORRY === Die Methode kann nicht 'ann' auf Objekt vom Typ finden NQPMu

Was habe ich falsch gemacht!? Danke für Ihre Hilfe !!!

Antwort

2

Das sieht aus wie ein Fehler in Rakudo für mich, möglicherweise bezogen auf before als Teil der Syntax für lookahead assertions.

Es kann bereits mit einer einfachen / <before> / ausgelöst werden:

$ 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 

Am allerwenigsten, es ist ein Fall einer weniger als genial Fehlermeldung ist.

Sie sollten dies an [email protected] melden, cf How to report a bug.

+0

Danke Christoph! Ich habe den Fehler gemeldet. – lisprogtor

+0

[Link zu rt] (https://rt.perl.org/Public/Bug/Display.html?id=130218#txn-1437532) Vielen Dank @lisprogtor – raiph

Verwandte Themen