//
// NAME
// eval.cpp
//
// DESCRIPTION
// This file contains functions used to implement the Evaluation
// module.
//
// For descriptions of the parameters and return values of
// exported (non-static) functions, see eval.h.
//
//
// Include files.
//
#include <stdlib.h>
#include <iostream.h>
#include "bool.h"
#include "eval.h"
//
// NAME
// evaluate
//
// DESCRIPTION
// This function evaluates the given expression by first
// recursively evaluating the subexpressions, then applying
// the operation to the resulting values.
//
double evaluate(const expr * e) {
switch (e->oper) {
case Constant: {
return e->number;
}
case Addition: {
return evaluate(e->op1) + evaluate(e->op2);
}
case Subtraction: {
return evaluate(e->op1) - evaluate(e->op2);
}
case Multiplication: {
return evaluate(e->op1) * evaluate(e->op2);
}
case Division: {
return evaluate(e->op1) / evaluate(e->op2);
}
}
return 0.0; // This line should never be reached.
}
//
// NAME
// freeExpr
//
// DESCRIPTION
// This function frees the memory allocated to an expression.
//
void freeExpr(expr * e) {
if (e == NULL) {
return;
}
freeExpr(e->op1);
freeExpr(e->op2);
delete e;
return;
}
//
// NAME
// display
//
// DESCRIPTION
// This function displays an expression.
//
void display(const expr * e) {
if (e == NULL) {
cout << "(NULL)";
return;
}
switch (e->oper) {
case Constant : {
cout << e->number;
break;
}
case Addition: {
cout << "(+ ";
display(e->op1);
cout << " ";
display(e->op2);
cout << ")";
break;
}
case Subtraction: {
cout << "(- ";
display(e->op1);
cout << " ";
display(e->op2);
cout << ")";
break;
}
case Multiplication: {
cout << "(* ";
display(e->op1);
cout << " ";
display(e->op2);
cout << ")";
break;
}
case Division: {
cout << "(/ ";
display(e->op1);
cout << " ";
display(e->op2);
cout << ")";
break;
}
}
return;
}
//
// End of file.
//