Raku-Kurs / Reguläre Ausdrücke und Grammatiken / Grammatiken / Aktionsklassen / Exercises / Eine Grammatik, zwei Aktionsklassen

Lösung: Eine Grammatik, zwei Aktionsklassen

Hier ist eine mögliche Lösung der Aufgabe.

Code

grammar Pair {
    token TOP { <a> ',' <b> }
    token a   { \d+ }
    token b   { \d+ }
}

class Sum  { method TOP($/) { make $<a>.Int + $<b>.Int } }
class Diff { method TOP($/) { make $<a>.Int - $<b>.Int } }

say Pair.parse('10,20', actions => Sum.new).made;
say Pair.parse('10,20', actions => Diff.new).made;

🦋 Du findest den Quellcode in der Datei two-actions.raku.

Ausgabe

30
-10

Kommentare

  1. Die Grammatik beschreibt nur die Form Zahl,Zahl; sie weiß nichts davon, was zu berechnen ist.

  2. Die beiden Aktionsklassen hängen derselben Zerlegung verschiedene Bedeutungen an — die eine summiert die Zahlen, die andere zieht sie voneinander ab. Ein anderes actions-Objekt an .parse zu übergeben genügt für ein anderes Ergebnis, ganz ohne die Grammatik zu ändern.

Kursnavigation

Eine Grammatik, zwei Aktionsklassen   |   Machen Sie ein Datum lesbar