_WHITESPACE = " " | "\t" | " "; _COMMENT = "(*", {!"*)", <0, 0xFF>}, ("*)" | -); _ = {_WHITESPACE | _COMMENT}; DIGIT = <"0", "9">; ADD = _, ("+"), _; SUB = _, ("-" | "−"), _; MUL = _, ("*" | "⋅" | "×"), _; DIV = _, ("/" | "∕" | "÷"), _; sign = ADD | SUB; _digit = DIGIT | _WHITESPACE | "_" | "'"; unsigned = DIGIT, +({_digit}, !_digit); _number = unsigned | "(", _expr, (")" | -); number = _number, +{_, _number}; (* optionally with implicit multiplication *) value = [sign], number; _expr = hyper1; hyper1 = _, hyper2, {+(ADD | SUB), +(hyper2 | -)}, _; hyper2 = _, value, {+(MUL | DIV), +(value | -)}, _;