CODE-0006 · gemini-3.5-flash (default)def eval_expr(s: str):
# Tokenizer
tokens = []
i = 0
n = len(s)
while i < n:
c = s[i]
if c.isspace():
i += 1
continue
if c in '+-*/()':
tokens.append(c)
i += 1
elif c.isdigit() or c == '.':
start = i
has_dot = False
if c == '.':
has_dot = True
i += 1
while i < n and (s[i].isdigit() or s[i] == '.'):
if s[i] == '.':
if has_dot:
raise ValueError("Invalid number format")
has_dot = True
i += 1
num_str = s[start:i]
if num_str == '.':
raise ValueError("Invalid token '.'")
val = float(num_str) if has_dot else int(num_str)
tokens.append(val)
else:
raise ValueError(f"Invalid character: {c}")
if not tokens:
raise ValueError("Empty expression")
pos = 0
def expr():
nonlocal pos
val = term()
while pos < len(tokens) and tokens[pos] in ('+', '-'):
op = tokens[pos]
pos += 1
right = term()
if op == '+':
val = val + right
else:
val = val - right
return val
def term():
nonlocal pos
val = factor()
while pos < len(tokens) and tokens[pos] in ('*', '/'):
op = tokens[pos]
pos += 1
right = factor()
if op == '*':
val = val * right
else:
if right == 0:
raise ValueError("Division by zero")
val = val / right
return val
def factor():
nonlocal pos
if pos < len(tokens) and tokens[pos] in ('+', '-'):
op = tokens[pos]
pos += 1
val = factor()
return val if op == '+' else -val
return primary()
def primary():
nonlocal pos
if pos >= len(tokens):
raise ValueError("Unexpected end of expression")
tok = tokens[pos]
if isinstance(tok, (int, float)):
pos += 1
return tok
elif tok == '(':
pos += 1
val = expr()
if pos >= len(tokens) or tokens[pos] != ')':
raise ValueError("Mismatched parentheses")
pos += 1
return val
else:
raise ValueError(f"Unexpected token: {tok}")
res = expr()
if pos < len(tokens):
raise ValueError("Malformed expression")
try:
if res == int(res):
return int(res)
except (ValueError, OverflowError):
pass
return res