Raku-Kurs / Reguläre Ausdrücke und Grammatiken / Grammatiken / Der Parsebaum, make und made
make und made
Statt die Werte hinterher aus dem Baum zu graben, können Sie
während des Zerlegens einen Wert an einen Treffer
hängen. Im Rumpf eines Tokens dürfen Sie einen Codeblock
einbetten — ein inneres { … }, zwischen das Muster
geschrieben —, das läuft, sobald das Treffen dort ankommt. Innerhalb
dieses Blocks legt die Funktion make einen Wert auf dem
aktuellen Treffer ab:
grammar OneNum {
token TOP { <number> { make $<number>.Int } }
token number { \d+ }
}Wenn TOP trifft, läuft der innere Block
{ make $<number>.Int } — die äußeren geschweiften
Klammern sind nur der Rumpf des Tokens — und legt die ganze Zahl auf dem
Treffer ab. Sie lesen sie hinterher mit made aus (oder mit
dessen Alias .ast):
say OneNum.parse('42').made; # 42Weil wir $<number>.Int abgelegt haben, ist der von
made gelieferte Wert ein echter Int — die Zahl
selbst, nicht das Match-Objekt:
say OneNum.parse('42').made + 1; # 43Beachten Sie, dass dieses + 1 auch ohne das
.Int 43 ergäbe, denn ein Treffer wird in der
Rechnung zu seinen Ziffern. Der Sinn des .Int ist, dass der
abgelegte Wert wirklich eine Zahl ist — und
das wollen Sie, sobald er in einer Datenstruktur landet oder
weitergereicht wird, statt der blanke Treffer.
Der abgelegte Wert kann alles sein — eine Zahl, eine Zeichenkette, ein Array, ein Objekt. Ein Token kann auch die Werte verbinden, die seine Unter-Tokens gemacht haben. Etwa zwei gecapturte Zahlen summieren:
grammar Sum {
token TOP { <a> '+' <b> { make $<a>.Int + $<b>.Int } }
token a { \d+ }
token b { \d+ }
}
say Sum.parse('2+3').made; # 5make und made sind die Brücke von „es hat
getroffen“ zu „hier ist die Bedeutung“. Die Blöcke inline zu setzen
funktioniert, mischt aber das Muster mit der Logik; der nächste
Abschnitt verlagert diese Logik in eine eigene Aktionsklasse.
Praxis
Lösen Sie 1 Quiz zum Inhalt dieses Themas.
Kursnavigation
← Quiz — Der Match-Baum | Quiz — make und made →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.