Kurso de Raku / Regulesprimoj kaj gramatikoj / Gramatikoj / Agoklasoj / Exercises / Unu gramatiko, du agoklasoj

Solvo: Unu gramatiko, du agoklasoj

Jen ebla solvo de la tasko.

Kodo

grammar Pair {
    token TOP { <a> ',' <b> }
    token a   { \d+ }
    token b   { \d+ }
}

class Sum  { method TOP($/) { make $<a>.Int + $<b>.Int } }
class Diff { method TOP($/) { make $<a>.Int - $<b>.Int } }

say Pair.parse('10,20', actions => Sum.new).made;
say Pair.parse('10,20', actions => Diff.new).made;

🦋 Vi povas trovi la fontkodon en la dosiero two-actions.raku.

Eligo

30
-10

Komentoj

  1. La gramatiko nur priskribas la formon number,number; ĝi scias nenion pri tio, kion kalkuli.

  2. La du agoklasoj alfiksas malsamajn signifojn al la sama analizo — unu sumigas la nombrojn, la alia subtrahas ilin. Transdoni malsaman objekton actions al .parse estas ĉio, kio necesas por ricevi malsaman rezulton, sen ŝanĝi la gramatikon entute.

Kursa navigado

Unu gramatiko, du agoklasoj   |   Faru daton homlegebla