77
88using 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}
0 commit comments