-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtoken.cpp
More file actions
75 lines (65 loc) · 2.29 KB
/
token.cpp
File metadata and controls
75 lines (65 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "token.h"
#include <cmath>
#include <stdexcept>
using namespace std;
double Operator::apply(double a, double b) const {
if (signature == '+') {
return a + b;
} else if (signature == '-') {
return a - b;
} else if (signature == '*') {
return a * b;
} else if (signature == '/') {
return a / b;
} else if (signature == '^') {
return pow(a, b);
} else {
throw invalid_argument("Unknown operator: " + to_string(signature));
}
}
map<char, Operator> *Operator::operatorMap = new map<char, Operator>{
{'+', Operator(1, '+')},
{'-', Operator(1, '-')},
{'*', Operator(2, '*')},
{'/', Operator(2, '/')},
{'^', Operator(3, '^')},
};
Operator *Operator::get(char signature) {
if (!isOperator(signature)) {
throw invalid_argument("Unknown operator: " + string(1, signature));
}
return &operatorMap->at(signature);
}
OpeningBracket *OpeningBracket::instance = new OpeningBracket();
ClosingBracket *ClosingBracket::instance = new ClosingBracket();
Assignment *Assignment::instance = new Assignment();
IfToken *IfToken::instance = new IfToken();
ElseToken *ElseToken::instance = new ElseToken();
OpeningCurlyBracket *OpeningCurlyBracket::instance = new OpeningCurlyBracket();
ClosingCurlyBracket *ClosingCurlyBracket::instance = new ClosingCurlyBracket();
Semicolon *Semicolon::instance = new Semicolon();
map<char, Token *> *Token::tokenMap = new map<char, Token *>{
{'=', Assignment::getInstance()},
{';', Semicolon::getInstance()},
{'(', OpeningBracket::getInstance()},
{')', ClosingBracket::getInstance()},
{'{', OpeningCurlyBracket::getInstance()},
{'}', ClosingCurlyBracket::getInstance()},
};
Token *Token::get(char symbol) {
if (!isNonOperatorToken(symbol)) {
throw invalid_argument("Unknown token: " + string(1, symbol));
}
return tokenMap->at(symbol);
}
void Token::destroyMap() {
delete tokenMap;
delete OpeningBracket::getInstance();
delete ClosingBracket::getInstance();
delete Assignment::getInstance();
delete IfToken::getInstance();
delete ElseToken::getInstance();
delete OpeningCurlyBracket::getInstance();
delete ClosingCurlyBracket::getInstance();
delete Semicolon::getInstance();
}