1+ #include " MathTokenizer.h"
2+
3+ namespace MathParser {
4+ std::vector<Token> TokenBuilding::ParserTokens (const std::string &content) {
5+ std::vector<Token> tokens;
6+ Token currentToken;
7+
8+ for (auto const & element : content) {
9+ switch (element) {
10+ case ' 0' :
11+ case ' 1' :
12+ case ' 2' :
13+ case ' 3' :
14+ case ' 4' :
15+ case ' 5' :
16+ case ' 6' :
17+ case ' 7' :
18+ case ' 8' :
19+ case ' 9' :
20+ if (currentToken.TokenType == WHITESPACE) {
21+ currentToken.TokenType = INT;
22+ currentToken.TokenText .append (1 , element);
23+ } else if (currentToken.TokenType == MAYBE_DOUBLE) {
24+ currentToken.TokenType = DOUBLE;
25+ currentToken.TokenText .append (1 , element);
26+ } else {
27+ currentToken.TokenText .append (1 , element);
28+ }
29+ break ;
30+
31+ case ' .' :
32+ if (currentToken.TokenType == WHITESPACE) {
33+ currentToken.TokenType = MAYBE_DOUBLE;
34+ currentToken.TokenText .append (1 , element);
35+ } else if (currentToken.TokenType == INT) {
36+ currentToken.TokenType = DOUBLE;
37+ currentToken.TokenText .append (1 , element);
38+ } else {
39+ TokenBuilding::endToken ( currentToken, tokens);
40+ currentToken.TokenType = OPERATOR;
41+ currentToken.TokenText .append (1 , element);
42+ TokenBuilding::endToken (currentToken, tokens);
43+ }
44+ break ;
45+
46+ case ' +' :
47+ case ' -' :
48+ case ' /' :
49+ case ' *' :
50+ TokenBuilding::endToken (currentToken, tokens);
51+ currentToken.TokenType = OPERATOR;
52+ currentToken.TokenText .append (1 , element);
53+ TokenBuilding::endToken (currentToken, tokens);
54+ break ;
55+
56+ default :
57+ break ;
58+ }
59+ }
60+ TokenBuilding::endToken (currentToken, tokens);
61+ return tokens;
62+ }
63+
64+ void TokenBuilding::endToken (Token &token, std::vector<Token> &tokens) {
65+ if (token.TokenType != WHITESPACE) {
66+ tokens.push_back (token);
67+ }
68+
69+ if (token.TokenType == MAYBE_DOUBLE)
70+ {
71+ if (token.TokenText == " ." ) {
72+ token.TokenType = OPERATOR;
73+ } else {
74+ token.TokenType = MAYBE_DOUBLE;
75+ }
76+ }
77+
78+ token.TokenType = WHITESPACE;
79+ token.TokenText .erase ();
80+ }
81+
82+ bool operator ==(Token const & a, Token const & b) {
83+ return a.TokenText == b.TokenText ;
84+ }
85+
86+ double operator +(Token const & a, Token const & b) {
87+ try {
88+ double v = std::stod (a.TokenText );
89+ double v2 = std::stod (b.TokenText );
90+ return v + v2;
91+ }
92+ catch (std::invalid_argument const & ex) {
93+ std::cout << " It can not be a double/int value !" << " Final error: " << ex.what () << std::endl;
94+ }
95+ return 0 ;
96+ }
97+
98+ double operator -(Token const & a, Token const & b) {
99+ try {
100+ double v = std::stod (a.TokenText );
101+ double v2 = std::stod (b.TokenText );
102+ return v - v2;
103+ }
104+ catch (std::invalid_argument const & ex) {
105+ std::cout << " It can not be a double/int value !" << " Final error: " << ex.what () << std::endl;
106+ }
107+ return 0 ;
108+ }
109+
110+ double operator *(Token const & a, Token const & b) {
111+ try {
112+ double v = std::stod (a.TokenText );
113+ double v2 = std::stod (b.TokenText );
114+ return v * v2;
115+ }
116+ catch (std::invalid_argument const & ex) {
117+ std::cout << " It can not be a double/int value !" << " Final error: " << ex.what () << std::endl;
118+ }
119+ return 0 ;
120+ }
121+
122+ double operator /(Token const & a, Token const & b) {
123+ try {
124+ double v = std::stod (a.TokenText );
125+ double v2 = std::stod (b.TokenText );
126+ return v / v2;
127+ }
128+ catch (std::invalid_argument const & ex) {
129+ std::cout << " It can not be a double/int value !" << " Final error: " << ex.what () << std::endl;
130+ }
131+ return 0 ;
132+ }
133+ }
0 commit comments