#include "expression.h" #include "safe_int.h" using namespace std; using namespace boost; /////////////////////////////////////////////////////////////////////////////// // Operator /////////////////////////////////////////////////////////////////////////////// Operator to_operator(const std::string& s) { if (s == "+") { return PLUS; } else if (s == "-") { return MINUS; } else if (s == "*") { return MULTIPLY; } else if (s == "/") { return DIVIDE; } else { throw BadOperatorSymbol(); } }; /////////////////////////////////////////////////////////////////////////////// // Expression /////////////////////////////////////////////////////////////////////////////// Expression::~Expression() { } /////////////////////////////////////////////////////////////////////////////// // AddExpression /////////////////////////////////////////////////////////////////////////////// AddExpression::AddExpression(ExpressionPtr f, ExpressionVector e) : first(f), expr(e) { } int AddExpression::eval() const { safe_int sum = first->eval(); for (ExpressionVector::const_iterator i = expr.begin(); i != expr.end(); ++i) { if (i->second == PLUS) { sum += i->first->eval(); } else if (i->second == MINUS) { sum -= i->first->eval(); } } return sum; } /////////////////////////////////////////////////////////////////////////////// // MultExpression /////////////////////////////////////////////////////////////////////////////// MultExpression::MultExpression(ExpressionPtr f, ExpressionVector e) : first(f), expr(e) { } int MultExpression::eval() const { safe_int prod = first->eval(); for (ExpressionVector::const_iterator i = expr.begin(); i != expr.end(); ++i) { if (i->second == MULTIPLY) { prod *= i->first->eval(); } else if (i->second == DIVIDE) { prod /= i->first->eval(); } } return prod; } /////////////////////////////////////////////////////////////////////////////// // IntegerExpression /////////////////////////////////////////////////////////////////////////////// IntegerExpression::IntegerExpression(int v) : value(v) { } int IntegerExpression::eval() const { return value; }