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