ometa CalcParser { sign = ('+'|'-')? , exponent = ('e'|'E') sign digit+ , float = :f -> parseFloat(f) | :f -> parseFloat(f) | :f -> parseFloat(f) , hexdigit = digit:c | char:c ?((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) , int = :i -> parseInt(i, 16) | :i -> parseInt(i) , number = float | int , addexp = addexp:l "+" mulexp:r -> ['add', l, r] | addexp:l "-" mulexp:r -> ['sub', l, r] | mulexp , mulexp = mulexp:l "*" powexp:r -> ['mul', l, r] | mulexp:l "/" powexp:r -> ['div', l, r] | mulexp:l "%" powexp:r -> ['mod', l, r] | powexp , powexp = parexp:l "^" powexp:r -> ['pow', l, r] | parexp , parexp = "(" exp:e ")" -> e | number , exp = addexp } CalcParser.matchAll('1+2^3^4-5*6', 'exp')