CODE-0006 · gpt-5.6-luna (high)
def eval_expr(s):
    if not isinstance(s, str):
        raise ValueError("expression must be a string")

    tokens = []
    i = 0
    n = len(s)

    while i < n:
        c = s[i]

        if c.isspace():
            i += 1
            continue

        if ("0" <= c <= "9") or c == ".":
            start = i

            if c == ".":
                if i + 1 >= n or not ("0" <= s[i + 1] <= "9"):
                    raise ValueError("invalid token")
                i += 1
                while i < n and "0" <= s[i] <= "9":
                    i += 1
            else:
                while i < n and "0" <= s[i] <= "9":
                    i += 1
                if i < n and s[i] == ".":
                    i += 1
                    while i < n and "0" <= s[i] <= "9":
                        i += 1

            text = s[start:i]
            try:
                value = float(text) if "." in text else int(text)
            except (ValueError, OverflowError):
                raise ValueError("invalid number")
            tokens.append(("number", value))
            continue

        if c in "+-*/()":
            tokens.append((c, c))
            i += 1
            continue

        raise ValueError("unknown token")

    position = 0

    def parse_primary():
        nonlocal position

        if position >= len(tokens):
            raise ValueError("expected operand")

        kind, value = tokens[position]

        if kind == "number":
            position += 1
            return value

        if kind == "(":
            position += 1
            result = parse_expression()
            if position >= len(tokens) or tokens[position][0] != ")":
                raise ValueError("mismatched parentheses")
            position += 1
            return result

        raise ValueError("expected operand")

    def parse_factor():
        nonlocal position

        if position < len(tokens) and tokens[position][0] in ("+", "-"):
            operator = tokens[position][0]
            position += 1
            value = parse_factor()
            return value if operator == "+" else -value

        return parse_primary()

    def parse_term():
        nonlocal position

        result = parse_factor()

        while position < len(tokens) and tokens[position][0] in ("*", "/"):
            operator = tokens[position][0]
            position += 1
            right = parse_factor()

            if operator == "*":
                result = result * right
            else:
                if right == 0:
                    raise ValueError("division by zero")
                result = result / right

        return result

    def parse_expression():
        nonlocal position

        result = parse_term()

        while position < len(tokens) and tokens[position][0] in ("+", "-"):
            operator = tokens[position][0]
            position += 1
            right = parse_term()

            if operator == "+":
                result = result + right
            else:
                result = result - right

        return result

    if not tokens:
        raise ValueError("empty expression")

    result = parse_expression()

    if position != len(tokens):
        raise ValueError("malformed expression")

    if isinstance(result, float) and result.is_integer():
        return int(result)
    return result