Skip to content

Commit b43b50b

Browse files
committed
tokengenerator and RPNGenerator funtional now
1 parent 4d61e33 commit b43b50b

File tree

3 files changed

+119
-104
lines changed

3 files changed

+119
-104
lines changed

main.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ int main(int argc, char *argv[])
4747

4848
VarTable vvv;
4949

50-
RpnGenerator p3(&vvv);
5150
// Calculator calc(&variables);
5251
vector<Token> tokenList;
5352
// vector<RpnGenerator::RPNToken> tokensRPN;
@@ -126,7 +125,7 @@ int main(int argc, char *argv[])
126125
&keywords,
127126
&vvv);
128127

129-
vector<RpnGenerator::RPNToken> tokensRPN = p3.makeRPN(tokenList);
128+
vector<RPNToken> tokensRPN = makeRPN(tokenList);
130129

131130
// calc.calcandprint(tokensRPN, true);
132131

rpngenerator.cpp

Lines changed: 118 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,168 +7,220 @@
77

88
using namespace std;
99

10-
void RpnGenerator::printRPN(const vector<RPNToken>& RPNTokens, int tab){
10+
11+
void expr(Token &tk, TkList tkList, vector<RPNToken> &tokensout);
12+
void expr1_par(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
13+
void expr0_val(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
14+
void expr2_plus1(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
15+
void expr3_mul(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
16+
void expr4_plus(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
17+
void expr6_less(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
18+
void expr7_eq(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
19+
void expr13_tst(Token &tk, TkList &tkList, vector<RPNToken> &tokensout);
20+
21+
void printRPN(const vector<RPNToken> &RPNTokens, int tab)
22+
{
1123
cout << "RPN sequence:\n";
12-
if (vartab->errorlevel==0) return;
24+
// if (vartab->errorlevel==0) return;
1325
cout << "opcode : ";
14-
for (const RPNToken& element : RPNTokens)
15-
cout << "\t" << ppOC[static_cast<int>(element.opcode)] << " " ;
26+
for (const RPNToken &element : RPNTokens)
27+
cout << "\t" << ppOC[static_cast<int>(element.opcode)] << " ";
1628
cout << endl;
1729
cout << "opcode: ";
18-
for (const RPNToken& element : RPNTokens)
30+
for (const RPNToken &element : RPNTokens)
1931
cout << "\t" << static_cast<int>(element.opcode) << " ";
2032
cout << endl;
2133
cout << "arity : ";
22-
for (const RPNToken& element : RPNTokens)
34+
for (const RPNToken &element : RPNTokens)
2335
cout << "\t" << element.arity << " ";
2436
cout << endl;
2537
cout << "value : ";
26-
for (const RPNToken& element : RPNTokens)
38+
for (const RPNToken &element : RPNTokens)
2739
cout << "\t" << element.value << " ";
2840
cout << endl;
2941
}
3042

43+
bool isa(const Token &token, const vector<OC> &allowedTypes)
44+
{
45+
// check if the symbol sym is one of the symbols in the list op
46+
return (count(allowedTypes.begin(), allowedTypes.end(), token.opcode) > 0);
47+
return true;
48+
}
3149

32-
bool RpnGenerator::precedenceIs2(TkList tkList){
50+
bool precedenceIs2(TkList tkList)
51+
{
3352
// the current operator is "+" or "-".
3453
// we check if it it a binary operator (arity 2, precedence 1) or a unary op (arity 1, precedence 2)
3554
// this depends on the previous token
3655
if ((tkList.cursor == 1) ||
37-
( ! isa(tkList.get(-2), {OC::PAR_R, OC::VAR, OC::NUM}))) {
56+
(!isa(tkList.get(-2), {OC::PAR_R, OC::VAR, OC::NUM})))
57+
{
3858
return true;
3959
}
4060
return false;
4161
}
4262

43-
void RpnGenerator::pushToken(Token tk, vector<RPNToken> &out ){
63+
void pushToken(Token tk, vector<RPNToken> &out)
64+
{
4465
RPNToken newRPNToken;
45-
newRPNToken.opcode = tk.opcode;
46-
newRPNToken.arity = tk.arity;
47-
newRPNToken.value = tk.value;
66+
newRPNToken.opcode = tk.opcode;
67+
newRPNToken.arity = tk.arity;
68+
newRPNToken.value = tk.value;
4869
out.push_back(newRPNToken);
4970
}
5071

51-
vector<RpnGenerator::RPNToken> RpnGenerator::makeRPN(vector<Token> tkListIn)
72+
73+
vector<RPNToken> makeRPN(vector<Token> tkListIn)
5274
{
5375
// we will move the input token list into a structure TkList, equipped with member funtions
5476
TkList tkList;
55-
tkList.tokens = tkListIn;
56-
77+
tkList.tokens = tkListIn;
78+
79+
vector<RPNToken> tokensout;
80+
5781
tokensout.clear();
58-
try {
82+
try
83+
{
5984
Token tk = tkList.pop();
60-
expr(tk, tkList);
61-
} catch (const exception& e) {
62-
cout << "\n\n!!! PARSE ERROR:" << e.what() << endl<< endl;;
85+
expr(tk, tkList, tokensout);
86+
}
87+
catch (const exception &e)
88+
{
89+
cout << "\n\n!!! PARSE ERROR:" << e.what() << endl
90+
<< endl;
91+
;
6392
};
64-
printRPN(tokensout, 5);//teut
93+
printRPN(tokensout, 5);
6594
return tokensout;
6695
}
6796

68-
Token RpnGenerator::nextToken(TkList& tkList)
97+
Token nextToken(TkList &tkList)
6998
{
70-
if (tkList.done()) throw invalid_argument("symbols missing!");
99+
if (tkList.done())
100+
throw invalid_argument("symbols missing!");
71101
Token next = tkList.pop();
72102
return next;
73103
}
74104

75-
void RpnGenerator::expr0_val(Token& tk, TkList& tkList){
76-
if (isa(tk, {OC::VAR, OC::NUM})){
105+
void expr0_val(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
106+
{
107+
if (isa(tk, {OC::VAR, OC::NUM}))
108+
{
77109
pushToken(tk, tokensout);
78110
tk = tkList.pop();
79-
} else
80-
expr1_par(tk, tkList);
111+
}
112+
else
113+
expr1_par(tk, tkList, tokensout);
81114
}
82115

83-
void RpnGenerator::expr1_par(Token& tk, TkList& tkList){
84-
if (isa(tk, {OC::PAR_L})) {
116+
void expr1_par(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
117+
{
118+
if (isa(tk, {OC::PAR_L}))
119+
{
85120
tk = tkList.pop();
86-
expr13_tst(tk, tkList);
121+
expr13_tst(tk, tkList, tokensout);
87122
if (tk.opcode != OC::PAR_R)
88123
throw invalid_argument("received " + static_cast<int>(tk.opcode));
89124
tk = nextToken(tkList);
90125
}
91126
}
92127

93-
void RpnGenerator::expr2_plus1(Token& tk, TkList& tkList){
94-
expr0_val(tk, tkList);
95-
if (precedenceIs2(tkList)){
128+
void expr2_plus1(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
129+
{
130+
expr0_val(tk, tkList, tokensout);
131+
if (precedenceIs2(tkList))
132+
{
96133
// this means pass or change sign (unary operator)
97-
tk.arity= 1;
98-
if (tk.opcode==OC::ADD) tk.opcode = OC::PAS;
99-
else tk.opcode = OC::CHS; //!!! poor coding
134+
tk.arity = 1;
135+
if (tk.opcode == OC::ADD)
136+
tk.opcode = OC::PAS;
137+
else
138+
tk.opcode = OC::CHS; //!!! poor coding
100139
Token save = tk;
101140
tk = tkList.pop();
102-
expr0_val(tk, tkList);
141+
expr0_val(tk, tkList, tokensout);
103142
pushToken(save, tokensout);
104143
}
105144
}
106145

107-
void RpnGenerator::expr3_mul(Token& tk, TkList& tkList){
108-
expr2_plus1(tk, tkList);
109-
if (tk.precedence == 3){
146+
void expr3_mul(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
147+
{
148+
expr2_plus1(tk, tkList, tokensout);
149+
if (tk.precedence == 3)
150+
{
110151
Token save = tk;
111152
tk = tkList.pop();
112-
expr3_mul(tk, tkList);
153+
expr3_mul(tk, tkList, tokensout);
113154
pushToken(save, tokensout);
114155
}
115156
}
116157

117-
void RpnGenerator::expr4_plus(Token& tk, TkList& tkList){
118-
expr3_mul(tk, tkList);
119-
if (tk.precedence == 4){
158+
void expr4_plus(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
159+
{
160+
expr3_mul(tk, tkList, tokensout);
161+
if (tk.precedence == 4)
162+
{
120163
Token save = tk;
121164
tk = tkList.pop();
122-
expr4_plus(tk, tkList);
165+
expr4_plus(tk, tkList, tokensout);
123166
pushToken(save, tokensout);
124167
}
125168
}
126169

127-
void RpnGenerator::expr6_less(Token& tk, TkList& tkList){
128-
expr4_plus(tk, tkList);
129-
if (tk.precedence == 6){
170+
void expr6_less(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
171+
{
172+
expr4_plus(tk, tkList, tokensout);
173+
if (tk.precedence == 6)
174+
{
130175
Token save = tk;
131176
tk = tkList.pop();
132-
expr6_less(tk, tkList);
177+
expr6_less(tk, tkList, tokensout);
133178
pushToken(save, tokensout);
134179
}
135180
}
136181

137-
void RpnGenerator::expr7_eq(Token& tk, TkList& tkList){ //TODO !!!
138-
expr6_less(tk, tkList);
139-
if (tk.precedence == 7){
182+
void expr7_eq(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
183+
{ // TODO !!!
184+
expr6_less(tk, tkList, tokensout);
185+
if (tk.precedence == 7)
186+
{
140187
Token save = tk;
141188
tk = tkList.pop();
142-
expr7_eq(tk, tkList);
189+
expr7_eq(tk, tkList, tokensout);
143190
pushToken(save, tokensout);
144191
}
145192
}
146193

147-
void RpnGenerator::expr13_tst(Token& tk, TkList& tkList){
148-
expr7_eq(tk, tkList);
149-
if (tk.precedence == 13){
194+
void expr13_tst(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
195+
{
196+
expr7_eq(tk, tkList, tokensout);
197+
if (tk.precedence == 13)
198+
{
150199
Token save = tk;
151200
tk = tkList.pop();
152-
expr7_eq(tk, tkList); // no need to push "?", ":" is ternary, will take care
201+
expr7_eq(tk, tkList, tokensout); // no need to push "?", ":" is ternary, will take care
153202
save = tk;
154203
tk = nextToken(tkList);
155-
expr7_eq(tk, tkList);
204+
expr7_eq(tk, tkList, tokensout);
156205
pushToken(save, tokensout);
157206
}
158207
}
159208

160-
void RpnGenerator::expr14_assgn(Token& tk, TkList& tkList){
209+
void expr14_assgn(Token &tk, TkList &tkList, vector<RPNToken> &tokensout)
210+
{
161211
Token save = tkList.get(0);
162212
pushToken(tk, tokensout);
163-
tk = tkList.pop();
164-
tk = tkList.pop();
165-
expr13_tst(tk, tkList);
213+
tk = tkList.pop();
214+
tk = tkList.pop();
215+
expr13_tst(tk, tkList, tokensout);
166216
pushToken(save, tokensout);
167217
}
168-
void RpnGenerator::expr(Token& tk, TkList tkList){
218+
219+
void expr(Token &tk, TkList tkList, vector<RPNToken> &tokensout)
220+
{
169221
Token save = tkList.get(0);
170-
if (isa(tk, {OC::VAR}) &(save.precedence == 14))
171-
expr14_assgn(tk, tkList);
222+
if (isa(tk, {OC::VAR}) & (save.precedence == 14))
223+
expr14_assgn(tk, tkList, tokensout);
172224
else
173-
expr13_tst(tk, tkList);
225+
expr13_tst(tk, tkList, tokensout);
174226
}

rpngenerator.h

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@ struct TkList{
6666
}
6767
};
6868

69-
class RpnGenerator
70-
{
71-
public:
72-
RpnGenerator();
73-
RpnGenerator(VarTable *vt) : vartab(vt){}
74-
7569
// RPNToken is used in the OUTPUT of RPNizer, en input for the Interpreter
7670
struct RPNToken{
7771
OC opcode;
@@ -81,34 +75,4 @@ class RpnGenerator
8175

8276
vector<RPNToken> makeRPN(vector<Token> tkListIn);
8377

84-
private:
85-
86-
87-
88-
VarTable * vartab;
89-
90-
vector<RPNToken> tokensout;
91-
Token nextToken(TkList& tkList);
9278

93-
void expr(Token& tk, TkList tkList);
94-
void expr0_val(Token& tk, TkList& tkList);
95-
void expr1_par(Token& tk, TkList& tkList);
96-
void expr2_plus1(Token& tk, TkList& tkList);
97-
void expr3_mul(Token& tk, TkList& tkList);
98-
void expr4_plus(Token& tk, TkList& tkList);
99-
void expr6_less(Token& tk, TkList& tkList);
100-
void expr7_eq(Token& tk, TkList& tkList);
101-
void expr13_tst(Token& tk, TkList& tkList);
102-
void expr14_assgn(Token& tk, TkList& tkList);
103-
104-
bool precedenceIs2(TkList tkList);
105-
void pushToken(Token tk, vector<RPNToken>& out );
106-
107-
bool isa(const Token& token, const vector<OC>& allowedTypes){
108-
// check if the symbol sym is one of the symbols in the list op
109-
return(count(allowedTypes.begin(), allowedTypes.end(), token.opcode) > 0);
110-
return true;
111-
}
112-
113-
void printRPN(const vector<RPNToken>& RPNTokens, int tab);
114-
};

0 commit comments

Comments
 (0)