Kurso de Raku / Regulesprimoj kaj gramatikoj / Gramatikoj / La analizarbo, make kaj made
make kaj made
Anstataŭ elfosi valorojn el la arbo poste, vi povas alfiksi valoron
al kongruo dum la analizado. Ene de la korpo de ĵetono
vi povas enmeti kodblokon — internan { … }
skribitan inter la ŝablono — kiu ruliĝas tuj kiam la kongruigo atingas
ĝin. Ene de tiu bloko, la funkcio make konservas valoron
sur la nuna kongruo:
grammar OneNum {
token TOP { <number> { make $<number>.Int } }
token number { \d+ }
}Kiam TOP kongruas, la interna bloko
{ make $<number>.Int } ruliĝas — la eksteraj kunigaj
krampoj estas nur la korpo de la ĵetono — kaj konservas la entjeron sur
la kongruo. Vi relegas ĝin poste per made (aŭ ĝia alinomo
.ast):
say OneNum.parse('42').made; # 42Ĉar ni konservis $<number>.Int, la valoro redonita
de made estas vera Int — la nombro mem, ne la
kongrua objekto:
say OneNum.parse('42').made + 1; # 43Notu, ke ĉi tiu aparta + 1 donus 43 eĉ sen
la .Int, ĉar kongruo nombriĝas al siaj ciferoj en
aritmetiko. La celo de voki .Int estas, ke la
konservita valoro vere estas nombro — kion vi
volas, kiam ĝi estas tenata en datumstrukturo aŭ transdonata plu,
anstataŭ la kruda kongruo.
La konservita valoro povas esti io ajn — nombro, ĉeno, tabelo, objekto. Ĵetono ankaŭ povas kombini la valorojn, kiujn ĝiaj subĵetonoj faris. Ekzemple, sumigi du kaptitajn nombrojn:
grammar Sum {
token TOP { <a> '+' <b> { make $<a>.Int + $<b>.Int } }
token a { \d+ }
token b { \d+ }
}
say Sum.parse('2+3').made; # 5make kaj made estas la ponto de «ĝi
kongruis» al «jen la signifo». Meti la blokojn enlinie funkcias, sed ĝi
miksas la ŝablonon kun la logiko; la sekva sekcio movas tiun logikon en
apartan agoklason.
Praktiko
Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.
Kursa navigado
← Kvizo — La kongruarbo | Kvizo — make kaj made →
💪 Aŭ iru rekte al la ekzercoj de ĉi tiu
sekcio.