# expr ::= expr + term | term
# term ::= term * factor | factor
# factor ::= '(' expr ')' | const
# Bzw.
# expr ::= term | term '+' expr
# term ::= factor | factor '*' term
# factor ::= '(' expr ')' | const
# const ::= '9', '8', ..., '0'
i=0
s = "((4+5*(4+2))+1)*3";
def nexttoken ():
global i
j = i
if i >= len(s):
return 'e'
i = i+1
return s[j]
def tokenback ():
global i
i = i-1
def expr ():
y = 0
x = term()
s = nexttoken ()
if s == '+':
y = expr()
elif s == 'e':
return x+y
else:
tokenback()
return x+y
def term ():
y = 1
x = factor()
s = nexttoken ()
if s == '*':
y = term ()
elif s == 'e':
return x*y
else:
tokenback()
return x*y
def factor ():
s = nexttoken ()
if s.isdigit ():
y = int(s)
if s == '(':
x = expr()
if nexttoken () != ')':
exit ()
elif s == 'e':
return 0
elif (y >= 0) and (y <= 9):
x = y
else:
exit ()
return x
print(expr())