ometa Calc2 { digit = ^digit:d -> d.digitValue(), number = number:n digit:d -> (n * 10 + d) | digit, addExpr = addExpr:x '+' mulExpr:y -> (Calc.matchAll('(' + x + ' + ' + y + ')', 'expr')) | addExpr:x '-' mulExpr:y -> (x - y) | mulExpr, mulExpr = mulExpr:x '*' primExpr:y -> (x * y) | mulExpr:x '/' primExpr:y -> (x / y) | primExpr, primExpr = '(' expr:x ')' -> x | number, expr = addExpr } Calc.matchAll('(' + 4 + '+' + 3 + ')', 'expr') '(' + 4 + '+' + 3 + ')' Calc2.matchAll('6*(4+3)', 'expr')