// a recognizer that also interprets ometa Calc { digit = ^digit:d -> d.digitValue(), number = number:n digit:d -> (n * 10 + d) | digit, addExpr = addExpr:x '+' mulExpr:y -> (x + y) | addExpr:x '-' mulExpr:y -> (x - y) | mulExpr, mulExpr = mulExpr:x '*' primary -> (x * y) | mulExpr:x '/' primary -> (x / y) | primary, primary = '(' expr:x ')' -> x | number, expr = addExpr } Calc.matchAll('3+4*(5+1)', 'expr') ometa Calc2 { digit = ^digit:d -> d.digitValue(), number = number:n digit:d -> (n * 10 + d) | digit, Expr = Expr:x '+'Term:y -> (x + y) | Expr:x '-' Term:y -> (x - y) | Term, Term = Term:x '*' Factor:y -> (x * y) | Term:x '/' Factor:y -> (x / y) | Factor, Factor = Factor:x '^' Primary:y -> Math.pow(x,y), Factor2 = '(' Expr:x ')' -> x | number, Start = Expr } Calc2.matchAll('3+4*5', 'Start')