Pol  Revision:cb584c9
tkn_strm.cpp
Go to the documentation of this file.
1 
7 #include <sstream>
8 #include <stddef.h>
9 
10 #include "objmembers.h"
11 #include "objmethods.h"
12 #include "token.h"
13 #include "tokens.h"
14 #include <format/format.h>
15 
16 namespace Pol
17 {
18 namespace Bscript
19 {
20 void Token::printOn( std::ostream& os ) const
21 {
22  switch ( id )
23  {
24  case TOK_LONG:
25  os << lval << "L";
26  break;
27  case TOK_DOUBLE:
28  os << dval << "LF";
29  break;
30  case TOK_IDENT:
31  os << token;
32  break;
33  case INS_ADDMEMBER2:
34  os << "addmember(" << token << ")";
35  break;
37  os << "addmember-assign(" << token << ")";
38  break;
39  case TOK_STRING:
40  os << '\"' << token << '\"';
41  break;
42  case TOK_LOCALVAR:
43  os << "local #" << lval;
44  if ( token != NULL )
45  os << " (" << token << ")";
46  break;
47  case TOK_GLOBALVAR:
48  os << "global #" << lval;
49  if ( token != NULL )
50  os << " (" << token << ")";
51  break;
52 
53  case TOK_ERROR:
54  os << "error";
55  break;
56  case TOK_DICTIONARY:
57  os << "dictionary";
58  break;
59 
60  case TOK_MULT:
61  os << "*";
62  break;
63  case TOK_DIV:
64  os << "/";
65  break;
66  case TOK_ADD:
67  os << "+";
68  break;
69 
70  case TOK_INSERTINTO:
71  os << "init{}";
72  break;
73  case TOK_SUBTRACT:
74  os << "-";
75  break;
76  case TOK_PLUSEQUAL:
77  os << "+=";
78  break;
79  case TOK_MINUSEQUAL:
80  os << "-=";
81  break;
82  case TOK_TIMESEQUAL:
83  os << "*=";
84  break;
85  case TOK_DIVIDEEQUAL:
86  os << "/=";
87  break;
88  case TOK_MODULUSEQUAL:
89  os << "%=";
90  break;
91 
92  case TOK_ASSIGN:
93  os << ":=";
94  break;
96  os << "local" << lval;
97  if ( token )
98  os << " (" << token << ")";
99  os << " := ";
100  break;
102  os << "global" << lval;
103  if ( token )
104  os << " (" << token << ")";
105  os << " := ";
106  break;
107  case INS_ASSIGN_CONSUME:
108  os << ":= #";
109  break;
111  os << "[] := (" << lval << ") #";
112  break;
114  os << "[] := (" << lval << ")";
115  break;
116  case TOK_LESSTHAN:
117  os << "<";
118  break;
119  case TOK_LESSEQ:
120  os << "<=";
121  break;
122  case TOK_GRTHAN:
123  os << ">";
124  break;
125  case TOK_GREQ:
126  os << ">=";
127  break;
128  case TOK_EQUAL1:
129  os << "=";
130  break;
131  case TOK_EQUAL:
132  os << "==";
133  break;
134  case TOK_NEQ:
135  os << "<>";
136  break;
137  case TOK_AND:
138  os << "&&";
139  break;
140  case TOK_OR:
141  os << "||";
142  break;
143  case TOK_ARRAY_SUBSCRIPT:
144  os << "[] " << lval;
145  break;
146  case INS_MULTISUBSCRIPT:
147  os << "[";
148  for ( int i = 1; i < lval; ++i )
149  os << ",";
150  os << "]";
151  break;
153  os << "[";
154  for ( int i = 1; i < lval; ++i )
155  os << ",";
156  os << "] :=";
157  break;
158  case TOK_ADDMEMBER:
159  os << ".+";
160  break;
161  case TOK_DELMEMBER:
162  os << ".-";
163  break;
164  case TOK_CHKMEMBER:
165  os << ".?";
166  break;
167  case TOK_MEMBER:
168  os << ".";
169  break;
170  case INS_GET_MEMBER:
171  os << "get member '" << token << "'";
172  break;
173  case INS_SET_MEMBER:
174  os << "set member '" << token << "'";
175  break;
177  os << "set member '" << token << "' #";
178  break;
179  case INS_GET_MEMBER_ID:
180  os << "get member id '" << getObjMember( lval )->code << "' (" << lval << ")";
181  break;
182  case INS_SET_MEMBER_ID:
183  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ")";
184  break;
186  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") #";
187  break;
189  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") += #";
190  break;
192  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") -= #";
193  break;
195  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") *= #";
196  break;
198  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") /= #";
199  break;
201  os << "set member id '" << getObjMember( lval )->code << "' (" << lval << ") %= #";
202  break;
203 
204  case INS_CALL_METHOD_ID:
205  os << "Call Method id " << getObjMethod( (int)lval )->code << " (#" << lval << ", " << type
206  << " params)";
207  break;
208  case TOK_IN:
209  os << "in";
210  break;
212  os << "add dictionary member";
213  break;
214 
215  case TOK_UNPLUS:
216  os << "unary +";
217  break;
218  case TOK_UNMINUS:
219  os << "unary -";
220  break;
221  case TOK_LOG_NOT:
222  os << "!";
223  break;
224  case TOK_CONSUMER:
225  os << "#";
226  break;
227  case TOK_REFTO:
228  os << "refto";
229  break;
230  case TOK_UNUSED:
231  os << "unused";
232  break;
233  case TOK_BITAND:
234  os << "&";
235  break;
236  case TOK_BITOR:
237  os << "|";
238  break;
239  case TOK_BSRIGHT:
240  os << ">>";
241  break;
242  case TOK_BSLEFT:
243  os << "<<";
244  break;
245  case TOK_BITXOR:
246  os << "^";
247  break;
248  case TOK_BITWISE_NOT:
249  os << "~";
250  break;
251  case TOK_MODULUS:
252  os << "%";
253  break;
254 
255  case INS_INITFOREACH:
256  os << "initforeach @" << lval;
257  break;
258  case INS_STEPFOREACH:
259  os << "stepforeach @" << lval;
260  break;
261  case INS_CASEJMP:
262  os << "casejmp";
263  break;
264  case INS_INITFOR:
265  os << "initfor @" << lval;
266  break;
267  case INS_NEXTFOR:
268  os << "nextfor @" << lval;
269  break;
270 
271  case TOK_TERM:
272  os << "Terminator";
273  break;
274 
275  case TOK_LPAREN:
276  os << "(";
277  break;
278  case TOK_RPAREN:
279  os << ")";
280  break;
281  case TOK_LBRACKET:
282  os << "[";
283  break;
284  case TOK_RBRACKET:
285  os << "]";
286  break;
287  case TOK_LBRACE:
288  os << "{";
289  break;
290  case TOK_RBRACE:
291  os << "}";
292  break;
293 
294  case RSV_JMPIFTRUE:
295  os << "if true goto " << lval;
296  break;
297  case RSV_JMPIFFALSE:
298  os << "if false goto " << lval;
299  break;
300  case RSV_ST_IF:
301  os << "if";
302  break;
303  case RSV_GOTO:
304  os << "goto " << lval;
305  break;
306  case RSV_GOSUB:
307  os << "gosub" << lval;
308  break;
309  case RSV_EXIT:
310  os << "exit";
311  break;
312  case RSV_RETURN:
313  os << "return";
314  break;
315  case RSV_LOCAL:
316  os << "decl local #" << lval;
317  break;
318  case RSV_GLOBAL:
319  os << "decl global #" << lval;
320  break;
321  case RSV_VAR:
322  os << "var";
323  break;
324  case RSV_CONST:
325  os << "const";
326  break;
327  case RSV_DECLARE:
328  os << "declare";
329  break;
330  case RSV_FUNCTION:
331  os << "function";
332  break;
333  case RSV_ENDFUNCTION:
334  os << "endfunction";
335  break;
336  case RSV_DO:
337  os << "do";
338  break;
339  case RSV_DOWHILE:
340  os << "dowhile";
341  break;
342  case RSV_WHILE:
343  os << "while";
344  break;
345  case RSV_ENDWHILE:
346  os << "endwhile";
347  break;
348  case RSV_REPEAT:
349  os << "repeat";
350  break;
351  case RSV_UNTIL:
352  os << "until";
353  break;
354  case RSV_FOR:
355  os << "for";
356  break;
357  case RSV_ENDFOR:
358  os << "endfor";
359  break;
360  case RSV_FOREACH:
361  os << "foreach";
362  break;
363  case RSV_ENDFOREACH:
364  os << "endforeach";
365  break;
366  case INS_DECLARE_ARRAY:
367  os << "declare array";
368  break;
369  case TOK_ARRAY:
370  os << "array";
371  break;
372  case TOK_STRUCT:
373  os << "struct";
374  break;
375  case INS_UNINIT:
376  os << "uninit";
377  break;
378  case RSV_USE_MODULE:
379  os << "use module";
380  break;
381  case RSV_INCLUDE_FILE:
382  os << "include file";
383  break;
384 
385  case CTRL_LABEL:
386  os << token << ":";
387  break;
388 
389  case TOK_COMMA:
390  os << "','";
391  break;
392  case TOK_SEMICOLON:
393  os << "';'";
394  break;
395 
396  case CTRL_STATEMENTBEGIN:
397  os << "[" << ( token ? token : "--source not available--" ) << "]";
398  break;
399  case CTRL_PROGEND:
400  os << "progend";
401  break;
402  case CTRL_MAKELOCAL:
403  os << "makelocal";
404  break;
405  case CTRL_JSR_USERFUNC:
406  os << "jmp userfunc @" << lval;
407  break;
408  case INS_POP_PARAM_BYREF:
409  os << "pop param byref '" << token << "'";
410  break;
411  case INS_POP_PARAM:
412  os << "pop param '" << token << "'";
413  break;
414  case INS_GET_ARG:
415  os << "get arg '" << token << "'";
416  break;
417  case CTRL_LEAVE_BLOCK:
418  os << "leave block(" << lval << ")";
419  break;
420 
421  case INS_CALL_METHOD:
422  os << "Call Method " << token << " (" << lval << " params)";
423  break;
424  case TOK_USERFUNC:
425  os << "User Function " << ( token ? token : "--function name not available--" );
426  break;
427  case TOK_FUNCREF:
428  os << "Function Ref " << ( token ? token : "--function name not available--" ) << "@" << lval;
429  break;
430  case RSV_COLON:
431  os << "':'";
432  break;
433  case RSV_PROGRAM:
434  os << "program";
435  break;
436  case RSV_ENDPROGRAM:
437  os << "endprogram";
438  break;
439  case RSV_ENUM:
440  os << "enum";
441  break;
442  case RSV_ENDENUM:
443  os << "endenum";
444  break;
445 
446 
447  case TOK_FUNC:
448  {
449  os << "Func(" << (int)module << "," << lval << "): ";
450  if ( token )
451  os << token;
452  else
453  os << "<unknown>";
454  return;
455  }
456 
457  default:
458  os << "Unknown Token: (" << int( id ) << "," << int( type );
459  if ( token )
460  os << ",'" << token << "'";
461  os << ")";
462  break;
463  }
464 }
465 
466 std::ostream& operator<<( std::ostream& os, const Token& tok )
467 {
468  tok.printOn( os );
469  return os;
470 }
471 
472 fmt::Writer& operator<<( fmt::Writer& w, const Token& tok )
473 {
474  std::ostringstream os;
475  tok.printOn( os );
476  w << os.str();
477  return w;
478 }
479 }
480 }
BTokenType type
Definition: token.h:40
std::ostream & operator<<(std::ostream &os, const CompilerContext &ctx)
Definition: compctx.h:54
ObjMember * getObjMember(int id)
Definition: parser.cpp:501
ObjMethod * getObjMethod(int id)
Definition: parser.cpp:685
unsigned char module
Definition: token.h:55
const char * token
Definition: token.h:61
void printOn(std::ostream &outputStream) const
Definition: tkn_strm.cpp:20
Definition: berror.cpp:12