ometa L { start = jedynki:j -> ['start', j], jedynki = dwojki:d '1' -> ['jedynki', d, '1'] | '1' -> '1', dwojki = start:s '2' -> ['start', s, '2'] | '2' -> '2' } L.matchAll('2121', 'start') ometa L2 { number = digit+, addExpr = addExpr '+' mulExpr | addExpr '-' mulExpr | mulExpr, mulExpr = mulExpr '*' primExpr | mulExpr '/' primExpr | primExpr, primExpr = '(' expr ')' | number, expr = addExpr } L2.matchAll('6*(4+2)', 'expr') 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 L3 { x = expr:e -> ['expr', e], expr = x:xq '+' digit:d -> ['x' , xq, '+', d] | digit:d -> d.digitValue() } L3.matchAll('4+2+3', 'x') [expr, 4]