← index
cplusplus11.Examples/calculator/main.cpp
Source: cplusplus11.Examples/calculator/main.cpp
//  Created by Jared Bruni on 7/14/13.

#include<iostream>
#include<iomanip>
#include<sstream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include "lexer.h"


namespace driver {

    /* temporary */
    std::unordered_map<std::string, double> variables;
    std::unordered_map<std::string, lex::Func> functions;

    double val_sqrt(double d) { return sqrtf(d); }
    double val_abs(double d) { return abs(static_cast<int>(d)); }
    double val_print(double d) {
        std::cout << "value of variable: " << d << "\n";
        return d;
    }
    double val_cosf(double d) { return cosf(d); }
    double val_sinf(double d) { return sinf(d); }
    double val_log(double d) { return logf(d); }
    double val_tan(double d) { return tanf(d); }
    double val_rand(double d) { return std::rand()%static_cast<int>(d); }
    double val_exit(double ) {
        throw lex::Exit_Exception();
        return 0;
    }

    void add_func(std::initializer_list<lex::Func> lst) {
        for(auto &i : lst) {
            functions[i.name] = i;
        }
    }
    
    /* end temporary */
    
    void grabInput() {
        std::cout << "=)> ";
        std::string s;
        std::getline(std::cin, s);
        
        if(!std::cin) return;
        
        if(s.find(";") == std::string::npos) {
            std::cerr << "Error missing semi-colon\n";
            return grabInput();
        }
        if(s.length()==0) return;
        std::istringstream stream(s);
        lex::Parser pscan(stream, variables, functions);
        if(pscan.eval()) {
            for (auto &s : driver::variables) {
                std::cout << std::setw(10) << s.first << " " << std::setw(10) << s.second << "\n";
            }
        }
    }
    
    void initFunctions() {
        std::srand(static_cast<unsigned int>(std::time(0)));
        add_func({
            {"sqrt",val_sqrt}, {"abs",val_abs},
            {"print",val_print}, {"cos",val_cosf},
            {"sin",val_sinf}, {"tan",val_tan},
            {"log",val_log}, {"exit",val_exit},
            {"rand",val_rand}
        });
    }
}

int main(void) {
    try {
        driver::initFunctions();
        std::cout << "Enter Expression: \n";

        while(!std::cin.eof()) {
            driver::grabInput();
        }
    }
    catch(std::exception &e) {
        std::cerr << e.what() << "\n";
    }
    catch(lex::Scanner_EOF) {
        std::cout << "end of file.\n";
    }
    catch(lex::Exit_Exception) {
        std::cout << "Exit called, Quiting...\n";
        return 0;
    }
    return 0;
}