|
1 | 1 | #include <iostream> |
2 | 2 | #include "calculator.h" |
3 | 3 |
|
4 | | -Calculator::Calculator() {} |
5 | | - |
6 | | -float Calculator::calc(std::vector<RpnGenerator::RPNToken>& tokenlist){ |
| 4 | +float calc(std::vector<RPNToken>& tokenlist, VarTable * vartabel){ |
7 | 5 | if (tokenlist.size() == 0) return 0.f; |
8 | 6 |
|
9 | 7 | float res = 0; |
10 | 8 | float v1 = 0; |
11 | 9 | float v2 = 0; |
12 | 10 |
|
13 | | - // RpnGenerator::RPNToken last = tokenlist.back(); |
14 | | - // tokenlist.pop_back(); |
15 | | - |
16 | 11 | cursor--; |
17 | 12 | if (cursor<0) cout << "\n\n !!! ERROR cursor !!!\n"; |
18 | | - RpnGenerator::RPNToken last = tokenlist[cursor]; |
| 13 | + RPNToken last = tokenlist[cursor]; |
19 | 14 |
|
20 | 15 | //remember that operands will be eaten in reverse order |
21 | 16 | switch (last.opcode) { |
22 | 17 | case OC::NUM: res = last.value; break; |
23 | | - case OC::VAR: res = vartab->getValue((int)last.value); break; |
24 | | - case OC::MUL: res = calc(tokenlist) * calc(tokenlist); break; |
25 | | - case OC::DIV: v1 = calc(tokenlist); res = calc(tokenlist)/v1; break; |
26 | | - case OC::ADD: res = calc(tokenlist) + calc(tokenlist); break; |
27 | | - case OC::SUB: v1 = calc(tokenlist); res = calc(tokenlist) - v1; break; |
28 | | - case OC::PAS: res = calc(tokenlist); break; |
29 | | - case OC::CHS: res = -calc(tokenlist); break; |
30 | | - case OC::LT: res = calc(tokenlist) > calc(tokenlist); break; |
31 | | - case OC::LE: res = calc(tokenlist) >= calc(tokenlist); break; |
32 | | - case OC::GT: res = calc(tokenlist) < calc(tokenlist); break; |
33 | | - case OC::GE: res = calc(tokenlist) <= calc(tokenlist); break; |
34 | | - case OC::EQ: res = calc(tokenlist) == calc(tokenlist); break; |
35 | | - case OC::NE: res = calc(tokenlist) != calc(tokenlist); break; |
36 | | - case OC::ASS: res = calc(tokenlist); |
37 | | - vartab->setVar(tokenlist[cursor-1].value, res); cursor--; break; |
38 | | - case OC::COL: v1 = calc(tokenlist); v2=calc(tokenlist); |
39 | | - res = calc(tokenlist)?v2:v1; break; |
| 18 | + case OC::VAR: res = vartabel->getValue((int)last.value); break; |
| 19 | + case OC::MUL: res = calc(tokenlist, vartabel) * calc(tokenlist, vartabel); break; |
| 20 | + case OC::DIV: v1 = calc(tokenlist, vartabel); res = calc(tokenlist, vartabel)/v1; break; |
| 21 | + case OC::ADD: res = calc(tokenlist, vartabel) + calc(tokenlist, vartabel); break; |
| 22 | + case OC::SUB: v1 = calc(tokenlist, vartabel); res = calc(tokenlist, vartabel) - v1; break; |
| 23 | + case OC::PAS: res = calc(tokenlist, vartabel); break; |
| 24 | + case OC::CHS: res = -calc(tokenlist, vartabel); break; |
| 25 | + case OC::LT: res = calc(tokenlist, vartabel) > calc(tokenlist, vartabel); break; |
| 26 | + case OC::LE: res = calc(tokenlist, vartabel) >= calc(tokenlist, vartabel); break; |
| 27 | + case OC::GT: res = calc(tokenlist, vartabel) < calc(tokenlist, vartabel); break; |
| 28 | + case OC::GE: res = calc(tokenlist, vartabel) <= calc(tokenlist, vartabel); break; |
| 29 | + case OC::EQ: res = calc(tokenlist, vartabel) == calc(tokenlist, vartabel); break; |
| 30 | + case OC::NE: res = calc(tokenlist, vartabel) != calc(tokenlist, vartabel); break; |
| 31 | + case OC::ASS: res = calc(tokenlist, vartabel); |
| 32 | + vartabel->setVar(tokenlist[cursor-1].value, res); cursor--; break; |
| 33 | + case OC::COL: v1 = calc(tokenlist, vartabel); v2=calc(tokenlist, vartabel); |
| 34 | + res = calc(tokenlist, vartabel)?v2:v1; break; |
40 | 35 | default: break; |
41 | 36 | } |
42 | 37 | return res; |
43 | 38 | } |
44 | 39 |
|
45 | | -void Calculator::calcandprint(std::vector<RpnGenerator::RPNToken> &tokenlist, bool prt) { |
| 40 | +void calcandprint(std::vector<RPNToken> &tokenlist, VarTable * vartabel, bool prt) { |
46 | 41 | cursor = tokenlist.size(); |
47 | | - float result = calc(tokenlist); |
| 42 | + float result = calc(tokenlist, vartabel); |
48 | 43 | if (prt){ |
49 | 44 | std::cout << "EVALUATION RESULT ==> " << std::to_string(result) << std::endl; |
50 | | - vartab->printVarTable(); |
| 45 | + vartabel->printVarTable(); |
51 | 46 | cout << "_______________________________________________________________________________" << std::endl; |
52 | 47 | } |
53 | 48 | } |
|
0 commit comments