def evalTree(tree): # evaluates and simplifies a tree (as far as it can go without hitting a variable) that you give it if tree.isNumber(): return tree elif tree.isOperator(): # +, -, *, / left = evalTree(tree.left) # eval and set up copies of the tree branches right = evalTree(tree.right) if left.isOperator() or right.isOperator() or (left.isPoly() and right.isPoly() and right.value.var != left.value.var): # if left side is op, or right side is op, pass up. If both sides are vars, and they don't match, pass up. tree.left = left tree.right = right return tree num1 = left.value num2 = right.value if tree.value == "+": answer = num1 + num2 # evaluate ops elif tree.value == "-": answer = num1 - num2 elif tree.value == "*": answer = num1 * num2 elif tree.value == "/": answer = num1 / num2 elif tree.value == "^" or tree.value == "**": answer = num1 ** num2 if INTERMEDIATE: print "\t"+str(num1)+str(tree.value)+str(num2)+"="+str(answer) # ...[+, -, *, /,etc.]...=... result = Tree(answer, NUMBER, None, None) if result.value.__class__ == Polynomial: result.type = NAME return result elif tree.isFunction(): num = evalTree(tree.left) # make sure it is a number if not num.isNumber(): # if not (such as var) pass it up return tree evalString = tree.value+"("+str(num.value)+")" # setting up the function... answer = eval(evalString) # ...and evaling it if INTERMEDIATE: print "\t"+evalString+"="+str(answer) # f(x)=... result = Tree(answer, NUMBER, None, None) return result elif tree.isPoly(): return tree else: raise SyntaxError