// expr.cpp: implementation of the expr class.
//
//////////////////////////////////////////////////////////////////////

#include "expr.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

expr::expr()
{
	name ="";
	e1=NULL;
	e2=NULL;
}

expr::~expr()
{
	delete e1;
	delete e2;
}

expr::expr(String n)
{
	name = n;
	e1 = NULL;
	e2 = NULL;
}

expr::expr(String n , expr *exp1, expr *exp2)
{
	name = n;
	e1 = new expr(*exp1);
	e2 = new expr(*exp2);
}

// copy constructor
expr::expr(const expr &exp)
{
	name = exp.name;
	if (exp.e1 == NULL)
		e1 = NULL;
	else
		e1 = new expr(*exp.e1);
	if (exp.e2 == NULL)
		e2 = NULL;
	else
		e2 = new expr(*exp.e2);
}

/////////
///the others
/////////
void expr::pParen()
{
	if (e1 == NULL)
		cout << name;
	else{
		cout << "(";
		e1->pParen(); 
		cout << name;
		e2->pParen();
		cout << ")";
	}
}

expr & expr::operator +(expr & exp)
{
	expr * e = new expr("+",this, &exp);
	return *e;
}


expr & expr::operator -(expr & exp)
{
	expr * e = new expr("-",this, &exp);
	return *e;
}

expr & expr::operator *(expr & exp)
{
	expr * e = new expr("*",this, &exp);
	return *e;
}

expr & expr::operator /(expr & exp)
{
	expr * e = new expr("/",this, &exp);
	return *e;
}

double expr::eval()
{
	if (e1 == NULL)
		return name.getNum();
	else if (name == "+")
		return e1->eval() + e2->eval();
	else if (name == "-")
		return e1->eval() - e2->eval();
	else if (name == "*")
		return e1->eval() * e2->eval();
	else if (name == "/")
		return e1->eval() / e2->eval();
	else
		cerr << "ERROR: malformed tree" <<endl;
	return 0.0;
}

void expr::pPolish()
{
	if (e1 == NULL)
		cout << name << " ";
	else{
		e1->pPolish();
		e2->pPolish();
		cout << name << " ";
	}
}
