CODE-0006 · gpt-5.6-sol (max)def eval_expr(s):
if not isinstance(s, str):
raise ValueError("Expression must be a string")
values = []
operators = []
precedence = {
"+": 1,
"-": 1,
"*": 2,
"/": 2,
"u+": 3,
"u-": 3,
}
def apply_operator(op):
if op in ("u+", "u-"):
if not values:
raise ValueError("Malformed expression")
value = values.pop()
values.append(value if op == "u+" else -value)
return
if len(values) < 2:
raise ValueError("Malformed expression")
right = values.pop()
left = values.pop()
if op == "+":
result = left + right
elif op == "-":
result = left - right
elif op == "*":
result = left * right
elif op == "/":
if right == 0:
raise ValueError("Division by zero")
result = left / right
else:
raise ValueError("Malformed expression")
values.append(result)
i = 0
length = len(s)
expecting_operand = True
while True:
while i < length and s[i].isspace():
i += 1
if i >= length:
break
ch = s[i]
if expecting_operand:
if ch in "+-":
operators.append("u" + ch)
i += 1
continue
if ch == "(":
operators.append(ch)
i += 1
continue
if ("0" <= ch <= "9") or ch == ".":
start = i
while i < length and "0" <= s[i] <= "9":
i += 1
digits_before = i - start
has_dot = i < length and s[i] == "."
digits_after = 0
if has_dot:
i += 1
fractional_start = i
while i < length and "0" <= s[i] <= "9":
i += 1
digits_after = i - fractional_start
if digits_before == 0 and digits_after == 0:
raise ValueError("Malformed number")
if has_dot:
try:
number = float(s[start:i])
except (ValueError, OverflowError):
raise ValueError("Malformed number") from None
else:
number = 0
for digit in s[start:i]:
number = number * 10 + ord(digit) - 48
values.append(number)
expecting_operand = False
continue
raise ValueError("Malformed expression")
if ch in "+-*/":
while (
operators
and operators[-1] != "("
and precedence[operators[-1]] >= precedence[ch]
):
apply_operator(operators.pop())
operators.append(ch)
i += 1
expecting_operand = True
continue
if ch == ")":
matched = False
while operators:
op = operators.pop()
if op == "(":
matched = True
break
apply_operator(op)
if not matched:
raise ValueError("Mismatched parentheses")
i += 1
continue
raise ValueError("Malformed expression")
if expecting_operand:
raise ValueError("Malformed expression")
while operators:
op = operators.pop()
if op == "(":
raise ValueError("Mismatched parentheses")
apply_operator(op)
if len(values) != 1:
raise ValueError("Malformed expression")
result = values[0]
if isinstance(result, float) and result.is_integer():
return int(result)
return result