CODE-0006 · gpt-5.6-sol (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:
ch = s[i]
if ch.isspace():
i += 1
continue
if ch in "+-*/()":
tokens.append((ch, None))
i += 1
continue
if "0" <= ch <= "9" or ch == ".":
start = i
if ch == ".":
i += 1
if i >= n or not ("0" <= s[i] <= "9"):
raise ValueError("invalid number")
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]
value = float(text) if "." in text else int(text)
tokens.append(("number", value))
continue
raise ValueError("unknown token")
tokens.append(("eof", None))
position = 0
def parse_expression():
nonlocal position
value = parse_term()
while tokens[position][0] in ("+", "-"):
operator = tokens[position][0]
position += 1
right = parse_term()
value = value + right if operator == "+" else value - right
return value
def parse_term():
nonlocal position
value = parse_unary()
while tokens[position][0] in ("*", "/"):
operator = tokens[position][0]
position += 1
right = parse_unary()
if operator == "*":
value *= right
else:
if right == 0:
raise ValueError("division by zero")
value /= right
return value
def parse_unary():
nonlocal position
token = tokens[position][0]
if token == "+":
position += 1
return +parse_unary()
if token == "-":
position += 1
return -parse_unary()
return parse_primary()
def parse_primary():
nonlocal position
token, value = tokens[position]
if token == "number":
position += 1
return value
if token == "(":
position += 1
value = parse_expression()
if tokens[position][0] != ")":
raise ValueError("mismatched parentheses")
position += 1
return value
raise ValueError("malformed expression")
result = parse_expression()
if tokens[position][0] != "eof":
raise ValueError("malformed expression")
if isinstance(result, float) and result.is_integer():
return int(result)
return result