Loading

Paste #pouez3gbl

  1. tokens = [('number', 2), ('binop+',), ('number', 3), ('binop*',),
  2.           ('(',), ('number', 4), ('binop+',), ('unop-',), ('number', 3), (')',)]
  3.  
  4.  
  5. def eval_multiplies():
  6.     global tokens
  7.  
  8.     print("Started eval_multiplies: tokens={}".format(tokens))
  9.  
  10.     val = eval_adds()
  11.     while len(tokens) > 0:
  12.         if tokens[0][0] == 'binop*':
  13.             tokens = tokens[1:]
  14.             val2 = eval_adds()
  15.             val = val * val2
  16.         elif tokens[0][0] == 'binop/':
  17.             tokens = tokens[1:]
  18.             val2 = eval_adds()
  19.             val = val / val2
  20.         else:
  21.             break
  22.  
  23.     print("Returning {}".format(val))
  24.     return val
  25.  
  26. def eval_adds():
  27.     global tokens
  28.  
  29.     print("Started eval_adds:       tokens={}".format(tokens))
  30.  
  31.     val = eval_unops()
  32.     while len(tokens) > 0:
  33.         if tokens[0][0] == 'binop+':
  34.             tokens = tokens[1:]
  35.             val2 = eval_unops()
  36.             val = val + val2
  37.         elif tokens[0][0] == 'binop-':
  38.             tokens = tokens[1:]
  39.             val2 = eval_unops()
  40.             val = val - val2
  41.         else:
  42.             break
  43.  
  44.     print("Returning {}".format(val))
  45.     return val
  46.  
  47. def eval_unops():
  48.     global tokens
  49.  
  50.     print("Started eval_unops:      tokens={}".format(tokens))
  51.  
  52.     inverse = False
  53.     while len(tokens) > 0:
  54.         if tokens[0][0] == 'unop-':
  55.             inverse = not inverse
  56.             tokens = tokens[1:]
  57.         else:
  58.             break
  59.  
  60.     val = eval_factor()
  61.     if inverse: val = -val
  62.     print("Returning {}".format(val))
  63.     return val
  64.  
  65. def eval_factor():
  66.     global tokens
  67.  
  68.     print("Started eval_factor:     tokens={}".format(tokens))
  69.  
  70.     if tokens[0][0] == 'number':
  71.         val = tokens[0][1]
  72.         tokens = tokens[1:]
  73.         print("Returning {}".format(val))
  74.         return val
  75.  
  76.     if tokens[0][0] == '(':
  77.         tokens = tokens[1:]
  78.         val = eval_multiplies()
  79.         assert tokens[0][0] == ')' # Report error, missing )
  80.         tokens = tokens[1:]
  81.         print("Returning {}".format(val))
  82.         return val
  83.  
  84.     assert False # Report error, weird expression found
  85.  
  86.  
  87.  
  88.  
  89.  
  90. val = eval_multiplies()
  91. print(val)

Comments