Raku kurss / Pielikums 🆕 / Tipi un teksta mašīnas / Regulārās izteiksmes un gramatikas / Exercises / Gramatika, kas saskaita
Risinājums: Gramatika, kas saskaita
Šeit ir iespējams risinājums uzdevumam.
Kods
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;🦋 Atrodiet programmu failā grammar-sum.raku.
Izvade
12Komentāri
<number>+ % '+'salāgo vienu vai vairākus skaitļus, atdalītus ar+zīmēm — modifikators%apraksta atdalītāju starp atkārtojumiem.Darbības metode izpildās, kad
TOPsalāgojas.makepiesaista aprēķinātu vērtību — skaitļu summu —, ko pēc parsēšanas nolasa.made.tokennekad neizlaiž atstarpes, tāpēc šī gramatika pret savu ievadi ir stingra:'3+4+5'parsējas, bet'3 + 4 + 5'nē (.parseatgriežNil). Lai pieņemtu atstarpes ap plusa zīmēm, padarietTOPparrule— un atdaliet kvantoru no tā atoma:grammar Sum { rule TOP { <number> + % '+' } token number { \d+ } }
ruleiekšienē atstarpe paraugā apzīmē netiešu<.ws>izsaukumu. Uzrakstīts kā<number> + % '+', ar atstarpi pirms kvantora+, šī netiešā atstarpe nosedz visu atkārtojumu — arī atdalītājus —, tāpēc tiek parsēts gan'3+4+5', gan'3 + 4 + 5', un summa abos gadījumos ir12. (Ja labprātāk paliekat pietoken, izrakstiet atstarpes atdalītājā:<number>+ % [ \s* '+' \s* ].)