Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
533
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.90 KB | None | 0 0
  1. # returns (value, remaining_expr)
  2. def getterm(expr, incoming_rank=0):
  3.   #print "expr: %s rank: %d" %(expr, incoming_rank)
  4.   if expr=="":
  5.     raise Exception("expecting term, instead end of string")
  6.   c=expr[0]
  7.   if c == '-' or c == '+':  # unary
  8.     (val, remains) = getterm(expr[1:], incoming_rank=2)
  9.     if c == '-':
  10.       val = -val
  11.   elif c >= '0' and c <= '9':
  12.     (val, remains) = (int(c) - int('0'), expr[1:])
  13.     while len(remains) > 0 and remains[0] >= '0' and remains[0] <= '9':
  14.       val = val*10 + int(remains[0]) - int('0')
  15.       remains = remains[1:]
  16.   elif c == '(':
  17.     (val, remains) = getterm(expr[1:], incoming_rank=0)
  18.     if remains[0] != ')':
  19.       raise Exception('unclosed paren')
  20.     remains = remains[1:]
  21.   else:
  22.     raise Exception('expecting term, instead got ' + expr)
  23.  
  24.   while len(remains) > 0:
  25.     op = remains[0]
  26.     if op == ')':
  27.       return (val, remains)
  28.     if op == '-' or op == '+':
  29.       if incoming_rank >= 1:
  30.         break
  31.       (val2, remains) = getterm(remains[1:], incoming_rank=1)
  32.       if op == '-':
  33.         val = val - val2
  34.       else:
  35.         val = val + val2
  36.     elif op == '*' or op == '/':
  37.       if incoming_rank >= 2:
  38.         break
  39.       (val2, remains) = getterm(remains[1:], incoming_rank=2)
  40.       if op == '/':
  41.         val = val / val2
  42.       else:
  43.         val = val * val2
  44.     elif op == '^':
  45.       if incoming_rank >= 3:
  46.         break
  47.       (val2, remains) = getterm(remains[1:], incoming_rank=3)
  48.       val = val ** val2
  49.     else:
  50.       raise Exception('unrecognized two-place op at: ' + remains)
  51.   return (val, remains)
  52.  
  53. def evalexpr(expr):
  54.   (val, remains) = getterm(expr)
  55.   if len(remains) > 0:
  56.     raise Exception('junk at end: ' + remains)
  57.   print "%s = %d" %(expr, val)
  58.  
  59. evalexpr("2+2")
  60. evalexpr("(2)")
  61. evalexpr("22+3")
  62. evalexpr("2+3*5")
  63. evalexpr("(2+3)*5")
  64. evalexpr("((2+3)^2*2)+3*5")
  65. evalexpr("-3")
  66. evalexpr("-10^2")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement