// Test Grammar "G" ometa G { digit = '0' | '1' | '2' | '3' , number = digit+, addExpr = addExpr '+' mulExpr | addExpr '-' mulExpr | mulExpr, mulExpr = mulExpr '*' primExpr | mulExpr '/' primExpr | primExpr, primExpr = '(' expr ')' | number, expr = addExpr } G.matchAll( '3*(1-2)', 'addExpr' ) alert(G.matchAll( '3*(1-2)', 'addExpr' )) // Parser and simple interpreter via Semantic Actions 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 } str = "6*(4+3)"; parseTree = CalcParser.matchAll(str, 'expr') alert(parseTree);