Calculator.h revision 10447
113540Sandrea.mondelli@ucf.edu#ifndef __LIBUTIL_CALCULATOR_H__
211398SN/A#define __LIBUTIL_CALCULATOR_H__
311398SN/A
411398SN/A#include <sstream>
511398SN/A
611398SN/A#include "String.h"
711398SN/A#include "Map.h"
811398SN/A#include "Assert.h"
911398SN/A
1011398SN/Anamespace LibUtil
1111398SN/A{
1211398SN/A    using std::istringstream;
1311398SN/A
1411398SN/A    /*
1511397SN/A     *  program:
1611397SN/A     *      END                         // END is end-of-input
1711397SN/A     *      expr_list END
1811397SN/A     *
1911397SN/A     *  expr_list:
2011397SN/A     *      expression SEP expr_list    // SEP is semicolon
2111397SN/A     *      expression
2211397SN/A     *      print expression
2311397SN/A     *      print STRING
2411397SN/A     *      print STRING expression
2511397SN/A     *      print STRING expression SEP expr_list
2611397SN/A     *
2711397SN/A     *
2811397SN/A     *  expression:
2911397SN/A     *      expression + term
3011397SN/A     *      expression - term
3111397SN/A     *      term
3211397SN/A     *
3311397SN/A     *  term:
3411397SN/A     *      term / primary
3511397SN/A     *      term * primary
3611397SN/A     *      primary
3711397SN/A     *
3811397SN/A     *  primary:
3911397SN/A     *      NUMBER
4011397SN/A     *      NAME
4111397SN/A     *      NAME = expression
4211398SN/A     *      NAME string expression      // NAME is print
4311397SN/A     *      - primary
448225SN/A     *      ( expression )
458225SN/A     *
468225SN/A     *  string:
478225SN/A     *
488225SN/A     **/
498225SN/A
508225SN/A    class Calculator
518225SN/A    {
528225SN/A        protected:
538225SN/A            enum Token
548225SN/A            {
558225SN/A                NAME, NAME2, NUMBER, STRING, END,
568225SN/A                PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
578225SN/A                SEP = ';', ASSIGN = '=', LP = '(', RP = ')'
588225SN/A            };
598225SN/A
608225SN/A        public:
618225SN/A            Calculator();
628225SN/A            virtual ~Calculator();
638225SN/A
648225SN/A        public:
658225SN/A            void reset();
668225SN/A            void evaluateString(const String& str_);
678225SN/A
688225SN/A        protected:
698225SN/A            Token getToken(istringstream& ist_);
708225SN/A            double prim(istringstream& ist_, bool is_get_);
718225SN/A            double term(istringstream& ist_, bool is_get_);
728225SN/A            double expr(istringstream& ist_, bool is_get_);
738225SN/A            virtual double getEnvVar(const String& var_name_) const;
748225SN/A
758225SN/A        protected:
768225SN/A            String m_reserved_chars_;
778225SN/A            Map<double> m_var_;
788225SN/A
798225SN/A            Token m_curr_token_;
808225SN/A            double m_value_number_;
818225SN/A            String m_value_string_;
828225SN/A    }; // class Calculator
838225SN/A} // namespace LibUtil
848225SN/A
858225SN/A#endif // __LIBUTIL_CALCULATOR_H__
868225SN/A
878225SN/A