60 lines
1.4 KiB
Python
Executable File
60 lines
1.4 KiB
Python
Executable File
def evaluate(expr: str) -> int:
|
|
expr = expr.replace(" ", "")
|
|
pos = 0
|
|
|
|
def number():
|
|
nonlocal pos
|
|
start = pos
|
|
if pos < len(expr) and expr[pos] in '+-':
|
|
pos += 1
|
|
while pos < len(expr) and expr[pos].isdigit():
|
|
pos += 1
|
|
return int(expr[start:pos])
|
|
|
|
def factor():
|
|
nonlocal pos
|
|
if pos < len(expr) and expr[pos] == '(':
|
|
pos += 1
|
|
result = expression()
|
|
if pos >= len(expr) or expr[pos] != ')':
|
|
raise ValueError
|
|
pos += 1
|
|
return result
|
|
return number()
|
|
|
|
def term():
|
|
nonlocal pos
|
|
result = factor()
|
|
while pos < len(expr) and expr[pos] in '*/':
|
|
op = expr[pos]
|
|
pos += 1
|
|
if op == '*':
|
|
result *= factor()
|
|
else:
|
|
num = factor()
|
|
if num == 0:
|
|
raise ValueError
|
|
result //= num
|
|
return result
|
|
|
|
def expression():
|
|
nonlocal pos
|
|
result = term()
|
|
while pos < len(expr) and expr[pos] in '+-':
|
|
op = expr[pos]
|
|
pos += 1
|
|
if op == '+':
|
|
result += term()
|
|
else:
|
|
result -= term()
|
|
return result
|
|
|
|
result = expression()
|
|
if pos < len(expr):
|
|
raise ValueError
|
|
return result
|
|
|
|
|
|
expr = input()
|
|
print(evaluate(expr))
|