// // NAME // expr.cpp // // DESCRIPTION // This file contains functions used to implement the Expression // module. // // For descriptions of the parameters and return values of // exported (non-static) functions, see expr.h. // // // Include files. // #include <stdlib.h> #include <iostream.h> #include <stdio.h> #include "bool.h" #include "expr.h" // // NAME // constant::constant // // DESCRIPTION // Constructor for a constant expression. // constant::constant(const double n) { number = n; } // // NAME // constant::constant // // DESCRIPTION // Copy constructor for a constant expression. // constant::constant(const constant & c) { number = c.number; } // // NAME // ~constant // // DESCRIPTION // Destructor for a constant expression. // constant::~constant() { } // // NAME // constant::evaluate // // DESCRIPTION // This function evaluates the constant expression. // double constant::evaluate() const { return number; } // // NAME // constant::clone // // DESCRIPTION // This function clones the constant expression. // expr * constant::clone() const { return new constant(*this); } // // NAME // display // // DESCRIPTION // This function outputs the constant expression. // ostream & constant::display(ostream & os) const { return (os << number); } // // NAME // composite::composite // // DESCRIPTION // Copy constructor for a composite expression. // composite::composite(const composite & c) { oper = c.oper; op1 = (c.op1)->clone(); op2 = (c.op2)->clone(); } // // NAME // composite::expr // // DESCRIPTION // Constructor for an expression. // composite::composite(const operation o, expr * e1, expr * e2) { oper = o; op1 = e1; op2 = e2; } // // NAME // ~composite // // DESCRIPTION // Destructor for a composite expression. // composite::~composite() { delete op1; delete op2; } // // NAME // composite::evaluate // // DESCRIPTION // This function evaluates the expression by first // recursively evaluating the subexpressions, then applying // the operation to the resulting values. // double composite::evaluate() const { switch (oper) { case Addition: { return op1->evaluate() + op2->evaluate(); } case Subtraction: { return op1->evaluate() - op2->evaluate(); } case Multiplication: { return op1->evaluate() * op2->evaluate(); } case Division: { return op1->evaluate() / op2->evaluate(); } } return 0.0; // This line should never be reached. } // // NAME // display // // DESCRIPTION // This function outputs the composite expression. // ostream & composite::display(ostream & os) const { switch (oper) { case Addition: { os << "(+ "; break; } case Subtraction: { os << "(- "; break; } case Multiplication: { os << "(* "; break; } case Division: { os << "(/ "; break; } } op1->display(os); os << " "; op2->display(os); os << ")"; return os; } // // NAME // composite::clone // // DESCRIPTION // This function clones a composite expression. // expr * composite::clone() const { return new composite(*this); } // // End of file. //