Frage Warum funktioniert diese Perl-Grammatik nicht?


Ich weiß Perl 5 nicht, aber ich dachte, ich würde mit Perl 6 spielen. Ich probiere seine Grammatikfähigkeiten aus, aber bisher habe ich kein Glück. Hier ist mein Code weit:

    grammar CopybookGrammar {
        token TOP { {say "at TOP" }  <aword><num>}
        token aword { {say "at word" } [a..z]+ }
        token num { {say "at NUM" } [0..9]+ }
}


sub scanit($contents) {
        my $match1 = CopybookGrammar.parse($contents);
        say $match1;
}

scanit "outline1";

Die Ausgabe ist wie folgt:

at TOP
at word
(Any)

Aus irgendeinem Grund scheint es nicht zu passen <num> Regel. Irgendwelche Ideen?


5
2017-12-13 18:15


Ursprung


Antworten:


Du hast die abgewinkelten Klammern in der vergessen Charakterklassen Syntax:

[a..z]+ sollte sein <[a..z]>+

[0..9]+ sollte sein <[0..9]>+

Für sich genommen, eckige Klammern [ ] agiere einfach als nicht einfangende Gruppe in Perl 6 Regexes. Damit [a..z]+ würde der Buchstabe "a", gefolgt von zwei beliebigen Zeichen, gefolgt von dem Buchstaben "Z", und dann das Ganze wieder beliebig oft übereinstimmen. Da dies nicht mit dem Wort "outline" übereinstimmt, wird das <aword> Token konnte für Sie nicht übereinstimmen, und das Parsing wurde nicht fortgesetzt <num> Zeichen.


PS: Beim Debuggen von Grammatiken, eine bequemere Alternative zum Hinzufügen {say ...} blockiert überall, ist zu benutzen Grammatik :: Debugger. Nach der Installation dieses Moduls können Sie die Leitung vorübergehend hinzufügen use Grammar::Debugger; zu Ihrem Code, und führen Sie Ihr Programm - dann wird es Schritt für Schritt durch Ihre Grammatik gehen (mit der ENTER-Taste, um fortzufahren), und Ihnen sagen, welche Token / Regeln auf dem Weg zusammenpassen.


8
2017-12-13 18:24