//
// 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 "bool.h"
#include "parse.h"
#include "expr.h"
//
// NAME
// expr::expr
//
// DESCRIPTION
// Default constructor for an expression.
//
expr::expr() {
oper = Constant;
number = 0.0;
op1 = NULL;
op2 = NULL;
}
//
// NAME
// expr::expr
//
// DESCRIPTION
// Constructor for an expression.
//
expr::expr(const char * str) {
expr * e = parse(str);
oper = e->oper;
number = e->number;
if (e->op1 == NULL) {
op1 = NULL;
}
else {
op1 = new expr(*(e->op1));
}
if (e->op2 == NULL) {
op2 = NULL;
}
else {
op2 = new expr(*(e->op2));
}
delete e;
}
//
// NAME
// expr::expr
//
// DESCRIPTION
// Constructor for an expression.
//
expr::expr(const double n) {
oper = Constant;
number = n;
op1 = NULL;
op2 = NULL;
}
//
// NAME
// expr::expr
//
// DESCRIPTION
// Copy constructor for an expression.
//
expr::expr(const expr & e) {
oper = e.oper;
number = e.number;
if (e.op1 == NULL) {
op1 = NULL;
}
else {
op1 = new expr(*(e.op1));
}
if (e.op2 == NULL) {
op2 = NULL;
}
else {
op2 = new expr(*(e.op2));
}
}
//
// NAME
// expr::expr
//
// DESCRIPTION
// Constructor for an expression.
//
expr::expr(operation o, const expr & e1, const expr & e2) {
oper = o;
number = 0.0;
op1 = new expr(e1);
op2 = new expr(e2);
}
//
// NAME
// expr::putOperation
//
// DESCRIPTION
// This function sets the operation for the expression.
//
void expr::putOperation(const operation o) {
oper = o;
}
//
// NAME
// expr::getOperation
//
// DESCRIPTION
// This function gets the operation of the expression.
//
expr::operation expr::getOperation() {
return oper;
}
//
// NAME
// expr::putNumber
//
// DESCRIPTION
// This function sets the constant number for the expression.
//
void expr::putNumber(const double n) {
number = n;
}
//
// NAME
// expr::getNumber
//
// DESCRIPTION
// This function gets the constant number of the expression.
//
double expr::getNumber() {
return number;
}
//
// NAME
// expr::putOperand1
//
// DESCRIPTION
// This function sets the first operation for the expression.
//
void expr::putOperand1(expr * e) {
delete op1;
op1 = e;
}
//
// NAME
// expr::getOperand1
//
// DESCRIPTION
// This function gets the first operand of the expression.
//
expr * expr::getOperand1() {
return op1;
}
//
// NAME
// expr::putOperand2
//
// DESCRIPTION
// This function sets the second operation for the expression.
//
void expr::putOperand2(expr * e) {
delete op2;
op2 = e;
}
//
// NAME
// expr::getOperand2
//
// DESCRIPTION
// This function gets the second operand of the expression.
//
expr * expr::getOperand2() {
return op2;
}
//
// NAME
// expr::evaluate
//
// DESCRIPTION
// This function evaluates the expression by first
// recursively evaluating the subexpressions, then applying
// the operation to the resulting values.
//
double expr::evaluate() {
if (oper == Constant) {
return number;
}
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
// expr::display
//
// DESCRIPTION
// This function displays the expression.
//
void expr::display() {
switch (oper) {
case Constant : {
cout << number;
break;
}
case Addition: {
cout << "(+ ";
op1->display();
cout << " ";
op2->display();
cout << ")";
break;
}
case Subtraction: {
cout << "(- ";
op1->display();
cout << " ";
op2->display();
cout << ")";
break;
}
case Multiplication: {
cout << "(* ";
op1->display();
cout << " ";
op2->display();
cout << ")";
break;
}
case Division: {
cout << "(/ ";
op1->display();
cout << " ";
op2->display();
cout << ")";
break;
}
}
return;
}
//
// NAME
// ~expr
//
// DESCRIPTION
// This destructor frees the memory allocated to the two
// subexpressions.
//
expr::~expr() {
delete op1;
delete op2;
}
//
// End of file.
//