Kurso de Raku / Aldono 🆕 / Tipoj kaj tekstmaŝinoj / Regulesprimoj kaj gramatikoj / Exercises / Gramatiko kiu adicias
Solvo: Gramatiko kiu adicias
Jen ebla solvo de la tasko.
Kodo
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;🦋 Vi povas trovi la fontkodon en la dosiero grammar-sum.raku.
Eligo
12Komentoj
<number>+ % '+'kongruas kun unu aŭ pluraj nombroj apartigitaj per signoj+— la modifilo%priskribas la apartigilon inter ripetoj.La aga metodo plenumiĝas, kiam
TOPkongruas.makealligas kalkulitan valoron — la sumon de la nombroj — kiun.maderelegas post la analizo.tokenneniam preterpasas spacojn, do ĉi tiu gramatiko estas strikta pri sia enigo:'3+4+5'analiziĝas, sed'3 + 4 + 5'ne (.parseredonasNil). Por akcepti spacojn ĉirkaŭ la plus-signoj, faruTOPrule— kaj apartigu la kvantoron de ĝia atomo:grammar Sum { rule TOP { <number> + % '+' } token number { \d+ } }
En
rule, spaceto en la ŝablono reprezentas implicitan vokon<.ws>. Skribita kiel<number> + % '+', kun spaco antaŭ la kvantoro+, tiu implicita spaceto kovras la tutan ripeton — apartigilojn inkluzive — do kaj'3+4+5'kaj'3 + 4 + 5'estas analizataj, kaj la sumo estas12ambaŭokaze. (Se vi preferas resti ĉetoken, skribu la spacojn en la apartigilo:<number>+ % [ \s* '+' \s* ].)