Calculator.h revision 10447
110447Snilay@cs.wisc.edu#ifndef __LIBUTIL_CALCULATOR_H__
210447Snilay@cs.wisc.edu#define __LIBUTIL_CALCULATOR_H__
310447Snilay@cs.wisc.edu
410447Snilay@cs.wisc.edu#include <sstream>
510447Snilay@cs.wisc.edu
610447Snilay@cs.wisc.edu#include "String.h"
710447Snilay@cs.wisc.edu#include "Map.h"
810447Snilay@cs.wisc.edu#include "Assert.h"
910447Snilay@cs.wisc.edu
1010447Snilay@cs.wisc.edunamespace LibUtil
1110447Snilay@cs.wisc.edu{
1210447Snilay@cs.wisc.edu    using std::istringstream;
1310447Snilay@cs.wisc.edu
1410447Snilay@cs.wisc.edu    /*
1510447Snilay@cs.wisc.edu     *  program:
1610447Snilay@cs.wisc.edu     *      END                         // END is end-of-input
1710447Snilay@cs.wisc.edu     *      expr_list END
1810447Snilay@cs.wisc.edu     *
1910447Snilay@cs.wisc.edu     *  expr_list:
2010447Snilay@cs.wisc.edu     *      expression SEP expr_list    // SEP is semicolon
2110447Snilay@cs.wisc.edu     *      expression
2210447Snilay@cs.wisc.edu     *      print expression
2310447Snilay@cs.wisc.edu     *      print STRING
2410447Snilay@cs.wisc.edu     *      print STRING expression
2510447Snilay@cs.wisc.edu     *      print STRING expression SEP expr_list
2610447Snilay@cs.wisc.edu     *
2710447Snilay@cs.wisc.edu     *
2810447Snilay@cs.wisc.edu     *  expression:
2910447Snilay@cs.wisc.edu     *      expression + term
3010447Snilay@cs.wisc.edu     *      expression - term
3110447Snilay@cs.wisc.edu     *      term
3210447Snilay@cs.wisc.edu     *
3310447Snilay@cs.wisc.edu     *  term:
3410447Snilay@cs.wisc.edu     *      term / primary
3510447Snilay@cs.wisc.edu     *      term * primary
3610447Snilay@cs.wisc.edu     *      primary
3710447Snilay@cs.wisc.edu     *
3810447Snilay@cs.wisc.edu     *  primary:
3910447Snilay@cs.wisc.edu     *      NUMBER
4010447Snilay@cs.wisc.edu     *      NAME
4110447Snilay@cs.wisc.edu     *      NAME = expression
4210447Snilay@cs.wisc.edu     *      NAME string expression      // NAME is print
4310447Snilay@cs.wisc.edu     *      - primary
4410447Snilay@cs.wisc.edu     *      ( expression )
4510447Snilay@cs.wisc.edu     *
4610447Snilay@cs.wisc.edu     *  string:
4710447Snilay@cs.wisc.edu     *
4810447Snilay@cs.wisc.edu     **/
4910447Snilay@cs.wisc.edu
5010447Snilay@cs.wisc.edu    class Calculator
5110447Snilay@cs.wisc.edu    {
5210447Snilay@cs.wisc.edu        protected:
5310447Snilay@cs.wisc.edu            enum Token
5410447Snilay@cs.wisc.edu            {
5510447Snilay@cs.wisc.edu                NAME, NAME2, NUMBER, STRING, END,
5610447Snilay@cs.wisc.edu                PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
5710447Snilay@cs.wisc.edu                SEP = ';', ASSIGN = '=', LP = '(', RP = ')'
5810447Snilay@cs.wisc.edu            };
5910447Snilay@cs.wisc.edu
6010447Snilay@cs.wisc.edu        public:
6110447Snilay@cs.wisc.edu            Calculator();
6210447Snilay@cs.wisc.edu            virtual ~Calculator();
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edu        public:
6510447Snilay@cs.wisc.edu            void reset();
6610447Snilay@cs.wisc.edu            void evaluateString(const String& str_);
6710447Snilay@cs.wisc.edu
6810447Snilay@cs.wisc.edu        protected:
6910447Snilay@cs.wisc.edu            Token getToken(istringstream& ist_);
7010447Snilay@cs.wisc.edu            double prim(istringstream& ist_, bool is_get_);
7110447Snilay@cs.wisc.edu            double term(istringstream& ist_, bool is_get_);
7210447Snilay@cs.wisc.edu            double expr(istringstream& ist_, bool is_get_);
7310447Snilay@cs.wisc.edu            virtual double getEnvVar(const String& var_name_) const;
7410447Snilay@cs.wisc.edu
7510447Snilay@cs.wisc.edu        protected:
7610447Snilay@cs.wisc.edu            String m_reserved_chars_;
7710447Snilay@cs.wisc.edu            Map<double> m_var_;
7810447Snilay@cs.wisc.edu
7910447Snilay@cs.wisc.edu            Token m_curr_token_;
8010447Snilay@cs.wisc.edu            double m_value_number_;
8110447Snilay@cs.wisc.edu            String m_value_string_;
8210447Snilay@cs.wisc.edu    }; // class Calculator
8310447Snilay@cs.wisc.edu} // namespace LibUtil
8410447Snilay@cs.wisc.edu
8510447Snilay@cs.wisc.edu#endif // __LIBUTIL_CALCULATOR_H__
8610447Snilay@cs.wisc.edu
87