Raku kurss / Regulārās izteiksmes un gramatikas / Gramatikas / Parsēšanas koks, make un made
make un made
Tā vietā, lai vērtības rakņātu ārā no koka pēc tam, tās sakritībai
var piesaistīt parsēšanas laikā. Marķiera ķermenī var
iegult koda bloku — iekšēju { … }, kas uzrakstīts
starp raksturā daļām — un tas izpildās, tiklīdz piemeklēšana līdz tam
nonāk. Šī bloka iekšienē funkcija make saglabā vērtību uz
pašreizējās sakritības:
grammar OneNum {
token TOP { <number> { make $<number>.Int } }
token number { \d+ }
}Kad TOP sakrīt, izpildās iekšējais bloks
{ make $<number>.Int } — ārējās figūriekavas ir tikai
marķiera ķermenis — un saglabā veselo skaitli uz sakritības. Pēc tam to
nolasāt atpakaļ ar made (vai tā aliasu
.ast):
say OneNum.parse('42').made; # 42Tā kā saglabājām $<number>.Int, vērtība, ko atdod
made, ir īsts Int — pats skaitlis, nevis
sakritības objekts:
say OneNum.parse('42').made + 1; # 43Ievērojiet, ka tieši šis + 1 dotu 43 arī
bez .Int, jo aritmētikā sakritība pārvēršas par saviem
cipariem. .Int izsaukuma jēga ir tā, ka saglabātā
vērtība patiešām ir skaitlis — un tieši to jūs
vēlaties, tiklīdz tā tiek turēta datu struktūrā vai padota tālāk, nevis
paliek neapstrādāta sakritība.
Saglabātā vērtība var būt jebkas — skaitlis, virkne, masīvs, objekts. Marķieris var arī apvienot vērtības, ko izveidojuši tā apakšmarķieri. Piemēram, saskaitot divus satvertos skaitļus:
grammar Sum {
token TOP { <a> '+' <b> { make $<a>.Int + $<b>.Int } }
token a { \d+ }
token b { \d+ }
}
say Sum.parse('2+3').made; # 5make un made ir tilts no «tas sakrita» uz
«lūk, nozīme». Blokus likt uz vietas darbojas, taču tas sajauc raksturu
ar loģiku; nākamā sadaļa šo loģiku pārceļ uz atsevišķu darbību klasi.
Prakse
Jūs gaida 1 viktorīna par šī temata saturu.
Kursa navigācija
← Viktorīna — Sakritības koks | Viktorīna — make un made →
💪 Vai arī dodieties tieši uz šīs sadaļas
vingrinājumiem.