Loading

Paste #pukcyetxs

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

Comments