Skip to content

Instantly share code, notes, and snippets.

@hyqhyq3
Created July 21, 2016 06:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hyqhyq3/fb36e56f6d7863b9aeb48e1cd6c1ee50 to your computer and use it in GitHub Desktop.
Save hyqhyq3/fb36e56f6d7863b9aeb48e1cd6c1ee50 to your computer and use it in GitHub Desktop.
#expr = term + expr | term - expr | term
#term = term * factor | term / factor | factor
#factor = '(' expr ')' | number
#
def getch(expr, ch):
while expr[0] == ' ':
expr = expr[1:]
if ch.find(expr[0]) == -1:
raise "expected %s" % ch
return expr[1:], expr[0]
def calc_factor(expr):
s = 0
if expr[0] == '(':
expr,ch = getch(expr, '(')
expr, e = calc_expr(expr)
expr,ch = getch(expr, ')')
return expr, e
while expr[0] >= '0' and expr[0] <= '9':
s = s * 10 + int(expr[0])
expr = expr[1:]
return expr,s
def calc_term(expr):
expr, f = calc_factor(expr)
if '*/'.find(expr[0]) != -1:
expr,op = getch(expr, '*/')
expr, f2 = calc_term(expr)
if op == '*':
return expr, f * f2
elif op == '/':
return expr, f / f2
return expr,f
def calc_expr(expr):
expr,sum = calc_term(expr)
if '+-'.find(expr[0]) != -1:
expr,op = getch(expr, '+-')
expr,t2 = calc_expr(expr)
if op == '+':
return expr, sum +t2
elif op == '-':
return expr, sum - t2
return expr, sum
def calc(expr):
return calc_expr(expr + '#')[1]
print(calc("1+2+3+4+5+6+7+8+9+10"))
print(calc("(1+2)*4"))
print(calc("222/111"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment