CODE-0006 · grok-4.5 (high)def eval_expr(s):
if not isinstance(s, str):
raise ValueError("malformed expression")
n = len(s)
i = 0
def skip_ws():
nonlocal i
while i < n and s[i].isspace():
i += 1
def peek():
skip_ws()
if i >= n:
return None
return s[i]
def raise_malformed():
raise ValueError("malformed expression")
def parse_number():
nonlocal i
skip_ws()
start = i
if i < n and s[i] in '+-':
# numbers themselves don't include leading unary; handled by unary
pass
has_digit = False
while i < n and s[i].isdigit():
has_digit = True
i += 1
if i < n and s[i] == '.':
i += 1
while i < n and s[i].isdigit():
has_digit = True
i += 1
if not has_digit:
raise_malformed()
text = s[start:i]
if '.' in text:
return float(text)
return int(text)
def parse_primary():
nonlocal i
c = peek()
if c is None:
raise_malformed()
if c == '(':
i += 1
val = parse_expr()
if peek() != ')':
raise_malformed()
i += 1
return val
if c.isdigit() or c == '.':
return parse_number()
raise_malformed()
def parse_unary():
nonlocal i
c = peek()
if c == '+':
i += 1
return parse_unary()
if c == '-':
i += 1
return -parse_unary()
return parse_primary()
def parse_term():
nonlocal i
left = parse_unary()
while True:
c = peek()
if c == '*':
i += 1
right = parse_unary()
left = left * right
elif c == '/':
i += 1
right = parse_unary()
if right == 0:
raise ValueError("division by zero")
left = left / right
else:
break
return left
def parse_expr():
nonlocal i
left = parse_term()
while True:
c = peek()
if c == '+':
i += 1
right = parse_term()
left = left + right
elif c == '-':
i += 1
right = parse_term()
left = left - right
else:
break
return left
skip_ws()
if i >= n:
raise_malformed()
result = parse_expr()
skip_ws()
if i < n:
raise_malformed()
if isinstance(result, float) and result.is_integer():
return int(result)
if isinstance(result, int):
return result
return result