示例#1
0
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