- tokens = [('number', 2), ('binop+',), ('number', 4), ('binop*',), ('number', 5)]
- #('binop+',), ('number', 3), ('binop*',),
- # ('(',), ('number', 4), ('binop+',), ('unop-',), ('number', 3), (')',)]
- def eval_adds():
- global tokens
- print("Started eval_adds: tokens={}".format(tokens))
- val = eval_multiplies()
- while len(tokens) > 0:
- if tokens[0][0] == 'binop+':
- tokens = tokens[1:]
- val2 = eval_multiplies()
- val = val + val2
- elif tokens[0][0] == 'binop-':
- tokens = tokens[1:]
- val2 = eval_unops()
- val = val - val2
- else:
- break
- print("Returning {}".format(val))
- return val
- def eval_multiplies():
- global tokens
- print("Started eval_multiplies: tokens={}".format(tokens))
- val = eval_unops()
- while len(tokens) > 0:
- if tokens[0][0] == 'binop*':
- tokens = tokens[1:]
- val2 = eval_unops()
- val = val * val2
- elif tokens[0][0] == 'binop/':
- tokens = tokens[1:]
- val2 = eval_unops()
- val = val / val2
- else:
- break
- print("Returning {}".format(val))
- return val
- def eval_unops():
- global tokens
- print("Started eval_unops: tokens={}".format(tokens))
- inverse = False
- while len(tokens) > 0:
- if tokens[0][0] == 'unop-':
- inverse = not inverse
- tokens = tokens[1:]
- else:
- break
- val = eval_factor()
- if inverse: val = -val
- print("Returning {}".format(val))
- return val
- def eval_factor():
- global tokens
- print("Started eval_factor: tokens={}".format(tokens))
- if tokens[0][0] == 'number':
- val = tokens[0][1]
- tokens = tokens[1:]
- print("Returning {}".format(val))
- return val
- if tokens[0][0] == '(':
- tokens = tokens[1:]
- val = eval_adds()
- assert tokens[0][0] == ')' # Report error, missing )
- tokens = tokens[1:]
- print("Returning {}".format(val))
- return val
- assert False # Report error, weird expression found
- val = eval_adds()
- print(val)