//  File: etree.C
//
//  Implementation of the ETree class


#include <stdio.h>
#include <stdlib.h>
#include "etree.h"

ETree::ETree() { }		// Default constructor does nothing

ETree::ETree(data x) {
   itemp = new Item(x) ;
   left = right = NULL ;
}

ETree::ETree(data x, ETree *lchild, ETree *rchild) {
   itemp = new Item(x) ;
   left  = lchild ;
   right = rchild ;
}

ETree::~ETree() { } 	// Tree destructor does the job


int ETree::Evaluate() {
   int ltemp, rtemp ;
   ETree *lchild ;

   if (itemp == NULL) return 0 ;

   if (left != NULL) {
	  lchild = (ETree *) left ;
	  ltemp  = lchild->Evaluate() ;
   }

   if (right != NULL) {
	  rtemp  = ((ETree *) right)->Evaluate() ;
   }

   switch(itemp->item->kind) {
      case NUMBER :
         return itemp->item->value ;

	  case PLUS :
		 return ltemp + rtemp ;

	  case MINUS :
		 return ltemp - rtemp ;

	  case TIMES :
		 return ltemp * rtemp ;

	  case DIVIDE :
		 return ltemp / rtemp ;

	  default : return 0 ;
   }
}
