ometa CalcParser { digit = ^digit:d -> d.digitValue(), number = number:n digit:d -> (n * 10 + d) | digit, addExpr = addExpr:x '+' mulExpr:y -> ['add',x,y] | addExpr:x '-' mulExpr:y -> ['sub',x,y] | mulExpr, mulExpr = mulExpr:x '*' primExpr:y -> ['mul',x,y] | mulExpr:x '/' primExpr:y -> ['div',x,y] | primExpr, primExpr = '(' expr:x ')' -> x | number:n -> ['num',n], expr = addExpr } tree = CalcParser.matchAll('6*(4+3)','expr') ometa CalcInterpreter { interp = ['num' anything:x] -> x | ['add' interp:x interp:y] -> (x+y) | ['sub' interp:x interp:y] -> (x-y) | ['mul' interp:x interp:y] -> (x*y) | ['div' interp:x interp:y] -> (x/y) } CalcInterpreter.match(tree,'interp')