// 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" <pPolish(); e2->pPolish(); cout << name << " "; } }