110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu#ifndef __LIBUTIL_CALCULATOR_H__
2310447Snilay@cs.wisc.edu#define __LIBUTIL_CALCULATOR_H__
2410447Snilay@cs.wisc.edu
2510447Snilay@cs.wisc.edu#include <sstream>
2610447Snilay@cs.wisc.edu
2710448Snilay@cs.wisc.edu#include "model/Model.h"
2810447Snilay@cs.wisc.edu#include "String.h"
2910447Snilay@cs.wisc.edu#include "Map.h"
3010447Snilay@cs.wisc.edu#include "Assert.h"
3110447Snilay@cs.wisc.edu
3210447Snilay@cs.wisc.edunamespace LibUtil
3310447Snilay@cs.wisc.edu{
3410447Snilay@cs.wisc.edu    using std::istringstream;
3510448Snilay@cs.wisc.edu    using std::ostringstream;
3610447Snilay@cs.wisc.edu
3710447Snilay@cs.wisc.edu    /*
3810447Snilay@cs.wisc.edu     *  program:
3910447Snilay@cs.wisc.edu     *      END                         // END is end-of-input
4010447Snilay@cs.wisc.edu     *      expr_list END
4110447Snilay@cs.wisc.edu     *
4210447Snilay@cs.wisc.edu     *  expr_list:
4310447Snilay@cs.wisc.edu     *      expression SEP expr_list    // SEP is semicolon
4410447Snilay@cs.wisc.edu     *      expression
4510447Snilay@cs.wisc.edu     *      print expression
4610447Snilay@cs.wisc.edu     *      print STRING
4710447Snilay@cs.wisc.edu     *      print STRING expression
4810447Snilay@cs.wisc.edu     *      print STRING expression SEP expr_list
4910447Snilay@cs.wisc.edu     *
5010447Snilay@cs.wisc.edu     *
5110447Snilay@cs.wisc.edu     *  expression:
5210447Snilay@cs.wisc.edu     *      expression + term
5310447Snilay@cs.wisc.edu     *      expression - term
5410447Snilay@cs.wisc.edu     *      term
5510447Snilay@cs.wisc.edu     *
5610447Snilay@cs.wisc.edu     *  term:
5710447Snilay@cs.wisc.edu     *      term / primary
5810447Snilay@cs.wisc.edu     *      term * primary
5910447Snilay@cs.wisc.edu     *      primary
6010447Snilay@cs.wisc.edu     *
6110447Snilay@cs.wisc.edu     *  primary:
6210447Snilay@cs.wisc.edu     *      NUMBER
6310447Snilay@cs.wisc.edu     *      NAME
6410447Snilay@cs.wisc.edu     *      NAME = expression
6510447Snilay@cs.wisc.edu     *      NAME string expression      // NAME is print
6610447Snilay@cs.wisc.edu     *      - primary
6710447Snilay@cs.wisc.edu     *      ( expression )
6810447Snilay@cs.wisc.edu     *
6910447Snilay@cs.wisc.edu     *  string:
7010447Snilay@cs.wisc.edu     *
7110447Snilay@cs.wisc.edu     **/
7210447Snilay@cs.wisc.edu
7310447Snilay@cs.wisc.edu    class Calculator
7410447Snilay@cs.wisc.edu    {
7510447Snilay@cs.wisc.edu        protected:
7610447Snilay@cs.wisc.edu            enum Token
7710447Snilay@cs.wisc.edu            {
7810447Snilay@cs.wisc.edu                NAME, NAME2, NUMBER, STRING, END,
7910447Snilay@cs.wisc.edu                PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
8010447Snilay@cs.wisc.edu                SEP = ';', ASSIGN = '=', LP = '(', RP = ')'
8110447Snilay@cs.wisc.edu            };
8210447Snilay@cs.wisc.edu
8310447Snilay@cs.wisc.edu        public:
8410447Snilay@cs.wisc.edu            Calculator();
8510447Snilay@cs.wisc.edu            virtual ~Calculator();
8610447Snilay@cs.wisc.edu
8710447Snilay@cs.wisc.edu        public:
8810447Snilay@cs.wisc.edu            void reset();
8910448Snilay@cs.wisc.edu            void evaluateString(const String& str_,
9010448Snilay@cs.wisc.edu                                const std::map<String, String> &config,
9110448Snilay@cs.wisc.edu                                DSENT::Model *ms_model,
9210448Snilay@cs.wisc.edu                                std::map<std::string, double> &outputs);
9310447Snilay@cs.wisc.edu
9410447Snilay@cs.wisc.edu        protected:
9510447Snilay@cs.wisc.edu            Token getToken(istringstream& ist_);
9610448Snilay@cs.wisc.edu
9710448Snilay@cs.wisc.edu            double prim(istringstream& ist_, bool is_get_,
9810448Snilay@cs.wisc.edu                        const std::map<String, String> &config,
9910448Snilay@cs.wisc.edu                        DSENT::Model *ms_model);
10010448Snilay@cs.wisc.edu
10110448Snilay@cs.wisc.edu            double term(istringstream& ist_, bool is_get_,
10210448Snilay@cs.wisc.edu                        const std::map<String, String> &config,
10310448Snilay@cs.wisc.edu                        DSENT::Model *ms_model);
10410448Snilay@cs.wisc.edu
10510448Snilay@cs.wisc.edu            double expr(istringstream& ist_, bool is_get_,
10610448Snilay@cs.wisc.edu                        const std::map<String, String> &config,
10710448Snilay@cs.wisc.edu                        DSENT::Model *ms_model);
10810448Snilay@cs.wisc.edu
10910448Snilay@cs.wisc.edu            virtual double getEnvVar(
11010448Snilay@cs.wisc.edu                    const String& var_name_,
11110448Snilay@cs.wisc.edu                    const std::map<String, String> &config,
11210448Snilay@cs.wisc.edu                    DSENT::Model *ms_model) const;
11310447Snilay@cs.wisc.edu
11410447Snilay@cs.wisc.edu        protected:
11510447Snilay@cs.wisc.edu            String m_reserved_chars_;
11610447Snilay@cs.wisc.edu            Map<double> m_var_;
11710447Snilay@cs.wisc.edu
11810447Snilay@cs.wisc.edu            Token m_curr_token_;
11910447Snilay@cs.wisc.edu            double m_value_number_;
12010447Snilay@cs.wisc.edu            String m_value_string_;
12110448Snilay@cs.wisc.edu    };
12210447Snilay@cs.wisc.edu} // namespace LibUtil
12310447Snilay@cs.wisc.edu
12410447Snilay@cs.wisc.edu#endif // __LIBUTIL_CALCULATOR_H__
12510447Snilay@cs.wisc.edu
126