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') // we can write a "compiler" instead ometa CalcCompiler { comp = ['num' anything:x] -> x.toString() | ['add' comp:x comp:y] -> ('(' + x + '+' + y + ')') | ['sub' comp:x comp:y] -> ('(' + x + '-' + y + ')') | ['mul' comp:x comp:y] -> ('(' + x + '*' + y + ')') | ['div' comp:x comp:y] -> ('(' + x + '/' + y + ')') } code = CalcCompiler.match(tree, 'comp') eval(code)