Raku-Kurs / Anhang 🆕 / Typen und Textmaschinen / Reguläre Ausdrücke und Grammatiken / Exercises / Eine Grammatik, die addiert
Lösung: Eine Grammatik, die addiert
Hier ist eine mögliche Lösung der Aufgabe.
Code
grammar Sum {
token TOP { <number>+ % '+' }
token number { \d+ }
}
class SumActions {
method TOP($/) { make [+] $<number>.map(*.Int) }
}
say Sum.parse('3+4+5', actions => SumActions).made;🦋 Du findest den Quellcode in der Datei grammar-sum.raku.
Ausgabe
12Kommentare
<number>+ % '+'trifft eine oder mehrere Zahlen, durch+-Zeichen getrennt — der Modifikator%beschreibt das Trennzeichen zwischen den Wiederholungen.Die Aktionsmethode läuft, wenn
TOPtrifft.makehängt einen berechneten Wert an — die Summe der Zahlen —, den.madenach dem Zerlegen zurückliest.Ein
tokenüberspringt niemals Leerraum, diese Grammatik ist bei ihrer Eingabe also streng:'3+4+5'lässt sich zerlegen,'3 + 4 + 5'nicht (.parseliefertNil). Um Leerzeichen um die Pluszeichen anzunehmen, machen SieTOPzu einerrule— und lösen Sie den Quantor von seinem Atom:grammar Sum { rule TOP { <number> + % '+' } token number { \d+ } }
In einer
rulesteht Leerraum im Muster für einen stillschweigenden<.ws>-Aufruf. Als<number> + % '+'geschrieben, mit einem Leerzeichen vor dem Quantor+, deckt dieser mitgemeinte Leerraum die ganze Wiederholung ab — Trennzeichen eingeschlossen —, sowohl'3+4+5'als auch'3 + 4 + 5'werden also zerlegt, und die Summe ist so wie so12. (Bleiben Sie lieber bei einemtoken, schreiben Sie die Leerzeichen im Trennzeichen aus:<number>+ % [ \s* '+' \s* ].)