ometa ExpEvaluator { eval = ['num' anything:x] -> x | ['add' eval:x eval:y] -> (x + y) | ['sub' eval:x eval:y] -> (x - y) | ['mul' eval:x eval:y] -> (x * y) | ['div' eval:x eval:y] -> (x / y) } ometa ExpTranslator { trans = ['num' anything:x] -> x.toString() | ['add' eval:x eval:y] -> ('(' + x + '+' + y + ')') | ['sub' eval:x eval:y] -> ('(' + x + '-' + y + ')') | ['mul' eval:x eval:y] -> ('(' + x + '*' + y + ')') | ['div' eval:x eval:y] -> ('(' + x + '/' + y + ')') } ExpTranslator.trans('44') ometa Calc <: Parser { var = letter:x -> x, num = num:n digit:d -> (n * 10 + d.digitValue()) | digit:d -> d.digitValue(), priExpr = spaces var:x -> self.vars[x] | spaces num:n -> n | "(" expr:r ")" -> r, mulExpr = mulExpr:x "*" priExpr:y -> (x * y) | mulExpr:x "/" priExpr:y -> (x / y) | priExpr, 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 } Calc.initialize = function() { this.vars = {}; } Calc.expr(3+2);