ometa InfixToPrefixParser { value = (letter | digit)+:v -> v.join(''), addExpr = addExpr:a ('+'|'-'):o mulExpr:m -> ['(', o, a, m, ')'].join(' ') | mulExpr, mulExpr = mulExpr:m ('*'|'/'):o primExpr:p -> ['(', o, m, p, ')'].join(' ') | primExpr, primExpr = '(' expr:e ')' -> e | value, expr = addExpr } tree = InfixToPrefixParser.matchAll('(1+2a2)*(b/3)', 'expr')