ometa StatefulCalculator <: Parser { var = spaces letter:x -> x, num = num:n digit:d -> (n*10 + d*1) | digit:d -> (d*1), primaryExpr = spaces var:x -> self.vars[x] | spaces num:n -> n | "(" expr:r ")" -> r, mulExpr = mulExpr:x "*" primaryExpr:y -> ( x * y ) | mulExpr:x "/" primaryExpr:y -> ( x / y ) | primaryExpr, addExpr = addExpr:x "+" mulExpr:y -> ( x + y ) | addExpr:x "-" mulExpr:y -> ( x - y ) | mulExpr, expr = var:x "=" expr:r -> (self.vars[x] = r) | addExpr, doit = (expr:r)* spaces end -> r } StatefulCalculator.initialize = function() { this.vars = {}; } StatefulCalculator.matchAll("x = 1 x + x", "doit")