2013-10-27 5 views
7

Gibt es eine Möglichkeit, perl6 eine Fehlermeldung zu erhalten, wenn eine Grammatik nicht übereinstimmt? Oder zumindest die Position der letzten verarbeiteten Daten zurückgeben? Es ist ziemlich schwierig, Syntaxfehler zu beheben, wenn alles, was ich vom Parser bekomme, "keine Übereinstimmung" ist.perl6 Grammatiken, Fehlermeldung

Antwort

11

Wenn Ihr Fokus Nachrichten für Benutzer Ihrer Grammatik generiert, siehe Generating Good Parse Errors from a Parser und Grammar::ErrorReporting.

Der Rest dieser Antwort ist über Debugging.

Zuerst können Sie beliebige Verschlüsse (Code) in Perl 6-Regexes einbetten. (Geben Sie einfach { your code goes here } in der Mitte eines regulären Ausdrucks ein.) Sie können also einfach die Anweisungen { say ... } streuen, die für das Debugging hilfreich sind.

Aber es gibt bessere Möglichkeiten.

Verwenden Sie die Rakudo Star-Distribution "Batterien enthalten"? (Sie sollten es sein, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.) Wenn dies der Fall ist, können Sie die Zeile use Grammar::Tracer; (wie in den Folien unter http://www.jnthn.net/papers/2011-yapceu-grammars.pdf beschrieben) hinzufügen, um eine vollständige Ablaufverfolgung einer Analyse zu erhalten.

Meine persönliche Präferenz ist es, den Rakudo Debugger zu verwenden, der alles bietet, was Grammar :: Tracer tut und noch viel mehr (Einzelschritte, Breakpoints usw. von allen Perl 6 Codes einschließlich Regexes und Grammatiken). Der Debugger wird in diesem video eingeführt.

Wenn Sie weitere Fragen haben, empfehle ich Ihnen besuchen Sie die immer freundlich IRC channel #perl6.