//
//  NAME
//    expr.h
//
//  DESCRIPTION
//    This file contains the type definitions and function prototypes
//    exported by the Expression module.
//

#ifndef _expr_h_
#define _expr_h_


//
//  NAME
//    expr
//
//  DESCRIPTION
//    This class models an expression.
//
//  MEMBER TYPES
//    operation  - kinds of operations in an expression.
//
//  DATA MEMBERS
//    oper   - operation of the expression.
//    number - value if the expression is a constant.
//    op1    - pointer to the first operand.  If the expression
//               is a constant, then op1 is set to NULL.
//    op2    - pointer to the second operand.  If the expression
//               is a constant, then op2 is set to NULL.
//
//  FUNCTION MEMBERS
//    expr()
//       - default constructor.
//    expr(const char *)
//       - constructs an expression by parsing the given string.
//    expr(const double)
//       - constructs an expression from the given double.
//    expr(const expr &)
//       - copy constructor.
//    expr(operation, expr &, expr &)
//       - constructs an expression from the given operation and
//           two subexpressions.
//    ~expr()
//       - destructor.
//    void putOperation(const operation)
//       - sets the top-level operation of the expression.
//    operation getOperation()
//       - returns the top-level operation of the expression.
//    void putNumber(const double)
//       - sets the number of the expression.  The number is used
//           only when the expression is a constant.
//    double getNumber()
//       - returns the number of the expression.  The number is
//           only meaningful if the expression is a constant.
//    void putOperand1(expr *)
//       - sets the first operand of the expression.
//    expr * getOperand1()
//       - returns the first operand of the expression.
//    void putOperand2(expr *)
//       - sets the second operand of the expression.
//    expr * getOperand2()
//       - returns the second operand of the expression.
//    double evaluate()
//       - returns the value of the expression.
//    void display()
//       - displays the expression in prefix notation.
//

class expr {
   public:
      enum operation { Constant,
                       Addition,
                       Subtraction,
                       Multiplication,
                       Division
                     };
      expr();
      expr(const char *);
      expr(const double);
      expr(const expr &);
      expr(operation, const expr &, const expr &);
      ~expr();
      void putOperation(const operation);
      operation getOperation();
      void putNumber(const double);
      double getNumber();
      void putOperand1(expr *);
      expr * getOperand1();
      void putOperand2(expr *);
      expr * getOperand2();
      double evaluate();
      void display();
   private:
      operation   oper;
      double      number;
      expr      * op1;
      expr      * op2;
   };


#endif