xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/d/dmd/tokens.c (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1*627f7eb2Smrg 
2*627f7eb2Smrg /* Compiler implementation of the D programming language
3*627f7eb2Smrg  * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
4*627f7eb2Smrg  * written by Walter Bright
5*627f7eb2Smrg  * http://www.digitalmars.com
6*627f7eb2Smrg  * Distributed under the Boost Software License, Version 1.0.
7*627f7eb2Smrg  * http://www.boost.org/LICENSE_1_0.txt
8*627f7eb2Smrg  * https://github.com/D-Programming-Language/dmd/blob/master/src/lexer.c
9*627f7eb2Smrg  */
10*627f7eb2Smrg 
11*627f7eb2Smrg #include "root/dsystem.h"
12*627f7eb2Smrg 
13*627f7eb2Smrg #include "tokens.h"
14*627f7eb2Smrg #include "root/rmem.h"
15*627f7eb2Smrg #include "root/outbuffer.h"
16*627f7eb2Smrg #include "id.h"
17*627f7eb2Smrg #include "identifier.h"
18*627f7eb2Smrg #include "utf.h"
19*627f7eb2Smrg 
20*627f7eb2Smrg /************************* Token **********************************************/
21*627f7eb2Smrg 
22*627f7eb2Smrg Token *Token::freelist = NULL;
23*627f7eb2Smrg 
24*627f7eb2Smrg const char *Token::tochars[TOKMAX];
25*627f7eb2Smrg 
alloc()26*627f7eb2Smrg Token *Token::alloc()
27*627f7eb2Smrg {
28*627f7eb2Smrg     if (Token::freelist)
29*627f7eb2Smrg     {
30*627f7eb2Smrg         Token *t = freelist;
31*627f7eb2Smrg         freelist = t->next;
32*627f7eb2Smrg         t->next = NULL;
33*627f7eb2Smrg         return t;
34*627f7eb2Smrg     }
35*627f7eb2Smrg 
36*627f7eb2Smrg     return new Token();
37*627f7eb2Smrg }
38*627f7eb2Smrg 
free()39*627f7eb2Smrg void Token::free()
40*627f7eb2Smrg {
41*627f7eb2Smrg     next = freelist;
42*627f7eb2Smrg     freelist = this;
43*627f7eb2Smrg }
44*627f7eb2Smrg 
toChars()45*627f7eb2Smrg const char *Token::toChars() const
46*627f7eb2Smrg {
47*627f7eb2Smrg     static char buffer[3 + 3 * sizeof(floatvalue) + 1];
48*627f7eb2Smrg 
49*627f7eb2Smrg     const char *p = &buffer[0];
50*627f7eb2Smrg     switch (value)
51*627f7eb2Smrg     {
52*627f7eb2Smrg         case TOKint32v:
53*627f7eb2Smrg             sprintf(&buffer[0],"%d",(d_int32)int64value);
54*627f7eb2Smrg             break;
55*627f7eb2Smrg 
56*627f7eb2Smrg         case TOKuns32v:
57*627f7eb2Smrg         case TOKcharv:
58*627f7eb2Smrg         case TOKwcharv:
59*627f7eb2Smrg         case TOKdcharv:
60*627f7eb2Smrg             sprintf(&buffer[0],"%uU",(d_uns32)uns64value);
61*627f7eb2Smrg             break;
62*627f7eb2Smrg 
63*627f7eb2Smrg         case TOKint64v:
64*627f7eb2Smrg             sprintf(&buffer[0],"%lldL",(longlong)int64value);
65*627f7eb2Smrg             break;
66*627f7eb2Smrg 
67*627f7eb2Smrg         case TOKuns64v:
68*627f7eb2Smrg             sprintf(&buffer[0],"%lluUL",(ulonglong)uns64value);
69*627f7eb2Smrg             break;
70*627f7eb2Smrg 
71*627f7eb2Smrg         case TOKfloat32v:
72*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
73*627f7eb2Smrg             strcat(&buffer[0], "f");
74*627f7eb2Smrg             break;
75*627f7eb2Smrg 
76*627f7eb2Smrg         case TOKfloat64v:
77*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
78*627f7eb2Smrg             break;
79*627f7eb2Smrg 
80*627f7eb2Smrg         case TOKfloat80v:
81*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
82*627f7eb2Smrg             strcat(&buffer[0], "L");
83*627f7eb2Smrg             break;
84*627f7eb2Smrg 
85*627f7eb2Smrg         case TOKimaginary32v:
86*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
87*627f7eb2Smrg             strcat(&buffer[0], "fi");
88*627f7eb2Smrg             break;
89*627f7eb2Smrg 
90*627f7eb2Smrg         case TOKimaginary64v:
91*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
92*627f7eb2Smrg             strcat(&buffer[0], "i");
93*627f7eb2Smrg             break;
94*627f7eb2Smrg 
95*627f7eb2Smrg         case TOKimaginary80v:
96*627f7eb2Smrg             CTFloat::sprint(&buffer[0], 'g', floatvalue);
97*627f7eb2Smrg             strcat(&buffer[0], "Li");
98*627f7eb2Smrg             break;
99*627f7eb2Smrg 
100*627f7eb2Smrg         case TOKstring:
101*627f7eb2Smrg         {
102*627f7eb2Smrg             OutBuffer buf;
103*627f7eb2Smrg             buf.writeByte('"');
104*627f7eb2Smrg             for (size_t i = 0; i < len; )
105*627f7eb2Smrg             {
106*627f7eb2Smrg                 unsigned c;
107*627f7eb2Smrg                 utf_decodeChar((utf8_t *)ustring, len, &i, &c);
108*627f7eb2Smrg                 switch (c)
109*627f7eb2Smrg                 {
110*627f7eb2Smrg                     case 0:
111*627f7eb2Smrg                         break;
112*627f7eb2Smrg 
113*627f7eb2Smrg                     case '"':
114*627f7eb2Smrg                     case '\\':
115*627f7eb2Smrg                         buf.writeByte('\\');
116*627f7eb2Smrg                         /* fall through */
117*627f7eb2Smrg                     default:
118*627f7eb2Smrg                         if (c <= 0x7F)
119*627f7eb2Smrg                         {
120*627f7eb2Smrg                             if (isprint(c))
121*627f7eb2Smrg                                 buf.writeByte(c);
122*627f7eb2Smrg                             else
123*627f7eb2Smrg                                 buf.printf("\\x%02x", c);
124*627f7eb2Smrg                         }
125*627f7eb2Smrg                         else if (c <= 0xFFFF)
126*627f7eb2Smrg                             buf.printf("\\u%04x", c);
127*627f7eb2Smrg                         else
128*627f7eb2Smrg                             buf.printf("\\U%08x", c);
129*627f7eb2Smrg                         continue;
130*627f7eb2Smrg                 }
131*627f7eb2Smrg                 break;
132*627f7eb2Smrg             }
133*627f7eb2Smrg             buf.writeByte('"');
134*627f7eb2Smrg             if (postfix)
135*627f7eb2Smrg                 buf.writeByte(postfix);
136*627f7eb2Smrg             p = buf.extractString();
137*627f7eb2Smrg         }
138*627f7eb2Smrg             break;
139*627f7eb2Smrg 
140*627f7eb2Smrg         case TOKxstring:
141*627f7eb2Smrg         {
142*627f7eb2Smrg             OutBuffer buf;
143*627f7eb2Smrg             buf.writeByte('x');
144*627f7eb2Smrg             buf.writeByte('"');
145*627f7eb2Smrg             for (size_t i = 0; i < len; i++)
146*627f7eb2Smrg             {
147*627f7eb2Smrg                 if (i)
148*627f7eb2Smrg                     buf.writeByte(' ');
149*627f7eb2Smrg                 buf.printf("%02x", ustring[i]);
150*627f7eb2Smrg             }
151*627f7eb2Smrg             buf.writeByte('"');
152*627f7eb2Smrg             if (postfix)
153*627f7eb2Smrg                 buf.writeByte(postfix);
154*627f7eb2Smrg             buf.writeByte(0);
155*627f7eb2Smrg             p = (char *)buf.extractData();
156*627f7eb2Smrg             break;
157*627f7eb2Smrg         }
158*627f7eb2Smrg 
159*627f7eb2Smrg         case TOKidentifier:
160*627f7eb2Smrg         case TOKenum:
161*627f7eb2Smrg         case TOKstruct:
162*627f7eb2Smrg         case TOKimport:
163*627f7eb2Smrg         case TOKwchar: case TOKdchar:
164*627f7eb2Smrg         case TOKbool: case TOKchar:
165*627f7eb2Smrg         case TOKint8: case TOKuns8:
166*627f7eb2Smrg         case TOKint16: case TOKuns16:
167*627f7eb2Smrg         case TOKint32: case TOKuns32:
168*627f7eb2Smrg         case TOKint64: case TOKuns64:
169*627f7eb2Smrg         case TOKint128: case TOKuns128:
170*627f7eb2Smrg         case TOKfloat32: case TOKfloat64: case TOKfloat80:
171*627f7eb2Smrg         case TOKimaginary32: case TOKimaginary64: case TOKimaginary80:
172*627f7eb2Smrg         case TOKcomplex32: case TOKcomplex64: case TOKcomplex80:
173*627f7eb2Smrg         case TOKvoid:
174*627f7eb2Smrg             p = ident->toChars();
175*627f7eb2Smrg             break;
176*627f7eb2Smrg 
177*627f7eb2Smrg         default:
178*627f7eb2Smrg             p = toChars(value);
179*627f7eb2Smrg             break;
180*627f7eb2Smrg     }
181*627f7eb2Smrg     return p;
182*627f7eb2Smrg }
183*627f7eb2Smrg 
toChars(TOK value)184*627f7eb2Smrg const char *Token::toChars(TOK value)
185*627f7eb2Smrg {
186*627f7eb2Smrg     static char buffer[3 + 3 * sizeof(value) + 1];
187*627f7eb2Smrg 
188*627f7eb2Smrg     const char *p = tochars[value];
189*627f7eb2Smrg     if (!p)
190*627f7eb2Smrg     {
191*627f7eb2Smrg         sprintf(&buffer[0],"TOK%d",value);
192*627f7eb2Smrg         p = &buffer[0];
193*627f7eb2Smrg     }
194*627f7eb2Smrg     return p;
195*627f7eb2Smrg }
196*627f7eb2Smrg 
197*627f7eb2Smrg /****************************************
198*627f7eb2Smrg  */
199*627f7eb2Smrg 
200*627f7eb2Smrg struct Keyword
201*627f7eb2Smrg {
202*627f7eb2Smrg     const char *name;
203*627f7eb2Smrg     TOK value;
204*627f7eb2Smrg };
205*627f7eb2Smrg 
206*627f7eb2Smrg static size_t nkeywords;
207*627f7eb2Smrg static Keyword keywords[] =
208*627f7eb2Smrg {
209*627f7eb2Smrg     {   "this",         TOKthis         },
210*627f7eb2Smrg     {   "super",        TOKsuper        },
211*627f7eb2Smrg     {   "assert",       TOKassert       },
212*627f7eb2Smrg     {   "null",         TOKnull         },
213*627f7eb2Smrg     {   "true",         TOKtrue         },
214*627f7eb2Smrg     {   "false",        TOKfalse        },
215*627f7eb2Smrg     {   "cast",         TOKcast         },
216*627f7eb2Smrg     {   "new",          TOKnew          },
217*627f7eb2Smrg     {   "delete",       TOKdelete       },
218*627f7eb2Smrg     {   "throw",        TOKthrow        },
219*627f7eb2Smrg     {   "module",       TOKmodule       },
220*627f7eb2Smrg     {   "pragma",       TOKpragma       },
221*627f7eb2Smrg     {   "typeof",       TOKtypeof       },
222*627f7eb2Smrg     {   "typeid",       TOKtypeid       },
223*627f7eb2Smrg 
224*627f7eb2Smrg     {   "template",     TOKtemplate     },
225*627f7eb2Smrg 
226*627f7eb2Smrg     {   "void",         TOKvoid         },
227*627f7eb2Smrg     {   "byte",         TOKint8         },
228*627f7eb2Smrg     {   "ubyte",        TOKuns8         },
229*627f7eb2Smrg     {   "short",        TOKint16        },
230*627f7eb2Smrg     {   "ushort",       TOKuns16        },
231*627f7eb2Smrg     {   "int",          TOKint32        },
232*627f7eb2Smrg     {   "uint",         TOKuns32        },
233*627f7eb2Smrg     {   "long",         TOKint64        },
234*627f7eb2Smrg     {   "ulong",        TOKuns64        },
235*627f7eb2Smrg     {   "cent",         TOKint128,      },
236*627f7eb2Smrg     {   "ucent",        TOKuns128,      },
237*627f7eb2Smrg     {   "float",        TOKfloat32      },
238*627f7eb2Smrg     {   "double",       TOKfloat64      },
239*627f7eb2Smrg     {   "real",         TOKfloat80      },
240*627f7eb2Smrg 
241*627f7eb2Smrg     {   "bool",         TOKbool         },
242*627f7eb2Smrg     {   "char",         TOKchar         },
243*627f7eb2Smrg     {   "wchar",        TOKwchar        },
244*627f7eb2Smrg     {   "dchar",        TOKdchar        },
245*627f7eb2Smrg 
246*627f7eb2Smrg     {   "ifloat",       TOKimaginary32  },
247*627f7eb2Smrg     {   "idouble",      TOKimaginary64  },
248*627f7eb2Smrg     {   "ireal",        TOKimaginary80  },
249*627f7eb2Smrg 
250*627f7eb2Smrg     {   "cfloat",       TOKcomplex32    },
251*627f7eb2Smrg     {   "cdouble",      TOKcomplex64    },
252*627f7eb2Smrg     {   "creal",        TOKcomplex80    },
253*627f7eb2Smrg 
254*627f7eb2Smrg     {   "delegate",     TOKdelegate     },
255*627f7eb2Smrg     {   "function",     TOKfunction     },
256*627f7eb2Smrg 
257*627f7eb2Smrg     {   "is",           TOKis           },
258*627f7eb2Smrg     {   "if",           TOKif           },
259*627f7eb2Smrg     {   "else",         TOKelse         },
260*627f7eb2Smrg     {   "while",        TOKwhile        },
261*627f7eb2Smrg     {   "for",          TOKfor          },
262*627f7eb2Smrg     {   "do",           TOKdo           },
263*627f7eb2Smrg     {   "switch",       TOKswitch       },
264*627f7eb2Smrg     {   "case",         TOKcase         },
265*627f7eb2Smrg     {   "default",      TOKdefault      },
266*627f7eb2Smrg     {   "break",        TOKbreak        },
267*627f7eb2Smrg     {   "continue",     TOKcontinue     },
268*627f7eb2Smrg     {   "synchronized", TOKsynchronized },
269*627f7eb2Smrg     {   "return",       TOKreturn       },
270*627f7eb2Smrg     {   "goto",         TOKgoto         },
271*627f7eb2Smrg     {   "try",          TOKtry          },
272*627f7eb2Smrg     {   "catch",        TOKcatch        },
273*627f7eb2Smrg     {   "finally",      TOKfinally      },
274*627f7eb2Smrg     {   "with",         TOKwith         },
275*627f7eb2Smrg     {   "asm",          TOKasm          },
276*627f7eb2Smrg     {   "foreach",      TOKforeach      },
277*627f7eb2Smrg     {   "foreach_reverse",      TOKforeach_reverse      },
278*627f7eb2Smrg     {   "scope",        TOKscope        },
279*627f7eb2Smrg 
280*627f7eb2Smrg     {   "struct",       TOKstruct       },
281*627f7eb2Smrg     {   "class",        TOKclass        },
282*627f7eb2Smrg     {   "interface",    TOKinterface    },
283*627f7eb2Smrg     {   "union",        TOKunion        },
284*627f7eb2Smrg     {   "enum",         TOKenum         },
285*627f7eb2Smrg     {   "import",       TOKimport       },
286*627f7eb2Smrg     {   "mixin",        TOKmixin        },
287*627f7eb2Smrg     {   "static",       TOKstatic       },
288*627f7eb2Smrg     {   "final",        TOKfinal        },
289*627f7eb2Smrg     {   "const",        TOKconst        },
290*627f7eb2Smrg     {   "alias",        TOKalias        },
291*627f7eb2Smrg     {   "override",     TOKoverride     },
292*627f7eb2Smrg     {   "abstract",     TOKabstract     },
293*627f7eb2Smrg     {   "debug",        TOKdebug        },
294*627f7eb2Smrg     {   "deprecated",   TOKdeprecated   },
295*627f7eb2Smrg     {   "in",           TOKin           },
296*627f7eb2Smrg     {   "out",          TOKout          },
297*627f7eb2Smrg     {   "inout",        TOKinout        },
298*627f7eb2Smrg     {   "lazy",         TOKlazy         },
299*627f7eb2Smrg     {   "auto",         TOKauto         },
300*627f7eb2Smrg 
301*627f7eb2Smrg     {   "align",        TOKalign        },
302*627f7eb2Smrg     {   "extern",       TOKextern       },
303*627f7eb2Smrg     {   "private",      TOKprivate      },
304*627f7eb2Smrg     {   "package",      TOKpackage      },
305*627f7eb2Smrg     {   "protected",    TOKprotected    },
306*627f7eb2Smrg     {   "public",       TOKpublic       },
307*627f7eb2Smrg     {   "export",       TOKexport       },
308*627f7eb2Smrg 
309*627f7eb2Smrg     {   "invariant",    TOKinvariant    },
310*627f7eb2Smrg     {   "unittest",     TOKunittest     },
311*627f7eb2Smrg     {   "version",      TOKversion      },
312*627f7eb2Smrg 
313*627f7eb2Smrg     {   "__argTypes",   TOKargTypes     },
314*627f7eb2Smrg     {   "__parameters", TOKparameters   },
315*627f7eb2Smrg     {   "ref",          TOKref          },
316*627f7eb2Smrg     {   "macro",        TOKmacro        },
317*627f7eb2Smrg 
318*627f7eb2Smrg     {   "pure",         TOKpure         },
319*627f7eb2Smrg     {   "nothrow",      TOKnothrow      },
320*627f7eb2Smrg     {   "__gshared",    TOKgshared      },
321*627f7eb2Smrg     {   "__traits",     TOKtraits       },
322*627f7eb2Smrg     {   "__vector",     TOKvector       },
323*627f7eb2Smrg     {   "__overloadset", TOKoverloadset },
324*627f7eb2Smrg     {   "__FILE__",     TOKfile         },
325*627f7eb2Smrg     {   "__FILE_FULL_PATH__", TOKfilefullpath  },
326*627f7eb2Smrg     {   "__LINE__",     TOKline         },
327*627f7eb2Smrg     {   "__MODULE__",   TOKmodulestring },
328*627f7eb2Smrg     {   "__FUNCTION__", TOKfuncstring   },
329*627f7eb2Smrg     {   "__PRETTY_FUNCTION__", TOKprettyfunc   },
330*627f7eb2Smrg     {   "shared",       TOKshared       },
331*627f7eb2Smrg     {   "immutable",    TOKimmutable    },
332*627f7eb2Smrg     {   NULL,           TOKreserved     }
333*627f7eb2Smrg };
334*627f7eb2Smrg 
isKeyword()335*627f7eb2Smrg int Token::isKeyword()
336*627f7eb2Smrg {
337*627f7eb2Smrg     for (size_t u = 0; u < nkeywords; u++)
338*627f7eb2Smrg     {
339*627f7eb2Smrg         if (keywords[u].value == value)
340*627f7eb2Smrg             return 1;
341*627f7eb2Smrg     }
342*627f7eb2Smrg     return 0;
343*627f7eb2Smrg }
344*627f7eb2Smrg 
345*627f7eb2Smrg struct TokenInitializer
346*627f7eb2Smrg {
347*627f7eb2Smrg     TokenInitializer();
348*627f7eb2Smrg };
349*627f7eb2Smrg 
350*627f7eb2Smrg static TokenInitializer tokeninitializer;
351*627f7eb2Smrg 
TokenInitializer()352*627f7eb2Smrg TokenInitializer::TokenInitializer()
353*627f7eb2Smrg {
354*627f7eb2Smrg     Identifier::initTable();
355*627f7eb2Smrg     for (nkeywords = 0; keywords[nkeywords].name; nkeywords++)
356*627f7eb2Smrg     {
357*627f7eb2Smrg         //printf("keyword[%d] = '%s'\n",u, keywords[u].name);
358*627f7eb2Smrg         const char *s = keywords[nkeywords].name;
359*627f7eb2Smrg         size_t len = strlen(s);
360*627f7eb2Smrg         TOK v = keywords[nkeywords].value;
361*627f7eb2Smrg         Identifier::idPool(s, len, v);
362*627f7eb2Smrg 
363*627f7eb2Smrg         //printf("tochars[%d] = '%s'\n",v, s);
364*627f7eb2Smrg         Token::tochars[v] = s;
365*627f7eb2Smrg     }
366*627f7eb2Smrg 
367*627f7eb2Smrg     Token::tochars[TOKeof]              = "EOF";
368*627f7eb2Smrg     Token::tochars[TOKlcurly]           = "{";
369*627f7eb2Smrg     Token::tochars[TOKrcurly]           = "}";
370*627f7eb2Smrg     Token::tochars[TOKlparen]           = "(";
371*627f7eb2Smrg     Token::tochars[TOKrparen]           = ")";
372*627f7eb2Smrg     Token::tochars[TOKlbracket]         = "[";
373*627f7eb2Smrg     Token::tochars[TOKrbracket]         = "]";
374*627f7eb2Smrg     Token::tochars[TOKsemicolon]        = ";";
375*627f7eb2Smrg     Token::tochars[TOKcolon]            = ":";
376*627f7eb2Smrg     Token::tochars[TOKcomma]            = ",";
377*627f7eb2Smrg     Token::tochars[TOKdot]              = ".";
378*627f7eb2Smrg     Token::tochars[TOKxor]              = "^";
379*627f7eb2Smrg     Token::tochars[TOKxorass]           = "^=";
380*627f7eb2Smrg     Token::tochars[TOKassign]           = "=";
381*627f7eb2Smrg     Token::tochars[TOKconstruct]        = "=";
382*627f7eb2Smrg     Token::tochars[TOKblit]             = "=";
383*627f7eb2Smrg     Token::tochars[TOKlt]               = "<";
384*627f7eb2Smrg     Token::tochars[TOKgt]               = ">";
385*627f7eb2Smrg     Token::tochars[TOKle]               = "<=";
386*627f7eb2Smrg     Token::tochars[TOKge]               = ">=";
387*627f7eb2Smrg     Token::tochars[TOKequal]            = "==";
388*627f7eb2Smrg     Token::tochars[TOKnotequal]         = "!=";
389*627f7eb2Smrg     Token::tochars[TOKnotidentity]      = "!is";
390*627f7eb2Smrg 
391*627f7eb2Smrg     Token::tochars[TOKunord]            = "!<>=";
392*627f7eb2Smrg     Token::tochars[TOKue]               = "!<>";
393*627f7eb2Smrg     Token::tochars[TOKlg]               = "<>";
394*627f7eb2Smrg     Token::tochars[TOKleg]              = "<>=";
395*627f7eb2Smrg     Token::tochars[TOKule]              = "!>";
396*627f7eb2Smrg     Token::tochars[TOKul]               = "!>=";
397*627f7eb2Smrg     Token::tochars[TOKuge]              = "!<";
398*627f7eb2Smrg     Token::tochars[TOKug]               = "!<=";
399*627f7eb2Smrg 
400*627f7eb2Smrg     Token::tochars[TOKnot]              = "!";
401*627f7eb2Smrg     Token::tochars[TOKshl]              = "<<";
402*627f7eb2Smrg     Token::tochars[TOKshr]              = ">>";
403*627f7eb2Smrg     Token::tochars[TOKushr]             = ">>>";
404*627f7eb2Smrg     Token::tochars[TOKadd]              = "+";
405*627f7eb2Smrg     Token::tochars[TOKmin]              = "-";
406*627f7eb2Smrg     Token::tochars[TOKmul]              = "*";
407*627f7eb2Smrg     Token::tochars[TOKdiv]              = "/";
408*627f7eb2Smrg     Token::tochars[TOKmod]              = "%";
409*627f7eb2Smrg     Token::tochars[TOKslice]            = "..";
410*627f7eb2Smrg     Token::tochars[TOKdotdotdot]        = "...";
411*627f7eb2Smrg     Token::tochars[TOKand]              = "&";
412*627f7eb2Smrg     Token::tochars[TOKandand]           = "&&";
413*627f7eb2Smrg     Token::tochars[TOKor]               = "|";
414*627f7eb2Smrg     Token::tochars[TOKoror]             = "||";
415*627f7eb2Smrg     Token::tochars[TOKarray]            = "[]";
416*627f7eb2Smrg     Token::tochars[TOKindex]            = "[i]";
417*627f7eb2Smrg     Token::tochars[TOKaddress]          = "&";
418*627f7eb2Smrg     Token::tochars[TOKstar]             = "*";
419*627f7eb2Smrg     Token::tochars[TOKtilde]            = "~";
420*627f7eb2Smrg     Token::tochars[TOKdollar]           = "$";
421*627f7eb2Smrg     Token::tochars[TOKcast]             = "cast";
422*627f7eb2Smrg     Token::tochars[TOKplusplus]         = "++";
423*627f7eb2Smrg     Token::tochars[TOKminusminus]       = "--";
424*627f7eb2Smrg     Token::tochars[TOKpreplusplus]      = "++";
425*627f7eb2Smrg     Token::tochars[TOKpreminusminus]    = "--";
426*627f7eb2Smrg     Token::tochars[TOKtype]             = "type";
427*627f7eb2Smrg     Token::tochars[TOKquestion]         = "?";
428*627f7eb2Smrg     Token::tochars[TOKneg]              = "-";
429*627f7eb2Smrg     Token::tochars[TOKuadd]             = "+";
430*627f7eb2Smrg     Token::tochars[TOKvar]              = "var";
431*627f7eb2Smrg     Token::tochars[TOKaddass]           = "+=";
432*627f7eb2Smrg     Token::tochars[TOKminass]           = "-=";
433*627f7eb2Smrg     Token::tochars[TOKmulass]           = "*=";
434*627f7eb2Smrg     Token::tochars[TOKdivass]           = "/=";
435*627f7eb2Smrg     Token::tochars[TOKmodass]           = "%=";
436*627f7eb2Smrg     Token::tochars[TOKshlass]           = "<<=";
437*627f7eb2Smrg     Token::tochars[TOKshrass]           = ">>=";
438*627f7eb2Smrg     Token::tochars[TOKushrass]          = ">>>=";
439*627f7eb2Smrg     Token::tochars[TOKandass]           = "&=";
440*627f7eb2Smrg     Token::tochars[TOKorass]            = "|=";
441*627f7eb2Smrg     Token::tochars[TOKcatass]           = "~=";
442*627f7eb2Smrg     Token::tochars[TOKcat]              = "~";
443*627f7eb2Smrg     Token::tochars[TOKcall]             = "call";
444*627f7eb2Smrg     Token::tochars[TOKidentity]         = "is";
445*627f7eb2Smrg     Token::tochars[TOKnotidentity]      = "!is";
446*627f7eb2Smrg 
447*627f7eb2Smrg     Token::tochars[TOKorass]            = "|=";
448*627f7eb2Smrg     Token::tochars[TOKidentifier]       = "identifier";
449*627f7eb2Smrg     Token::tochars[TOKat]               = "@";
450*627f7eb2Smrg     Token::tochars[TOKpow]              = "^^";
451*627f7eb2Smrg     Token::tochars[TOKpowass]           = "^^=";
452*627f7eb2Smrg     Token::tochars[TOKgoesto]           = "=>";
453*627f7eb2Smrg     Token::tochars[TOKpound]            = "#";
454*627f7eb2Smrg 
455*627f7eb2Smrg      // For debugging
456*627f7eb2Smrg     Token::tochars[TOKerror]            = "error";
457*627f7eb2Smrg     Token::tochars[TOKdotid]            = "dotid";
458*627f7eb2Smrg     Token::tochars[TOKdottd]            = "dottd";
459*627f7eb2Smrg     Token::tochars[TOKdotti]            = "dotti";
460*627f7eb2Smrg     Token::tochars[TOKdotvar]           = "dotvar";
461*627f7eb2Smrg     Token::tochars[TOKdottype]          = "dottype";
462*627f7eb2Smrg     Token::tochars[TOKsymoff]           = "symoff";
463*627f7eb2Smrg     Token::tochars[TOKarraylength]      = "arraylength";
464*627f7eb2Smrg     Token::tochars[TOKarrayliteral]     = "arrayliteral";
465*627f7eb2Smrg     Token::tochars[TOKassocarrayliteral] = "assocarrayliteral";
466*627f7eb2Smrg     Token::tochars[TOKstructliteral]    = "structliteral";
467*627f7eb2Smrg     Token::tochars[TOKstring]           = "string";
468*627f7eb2Smrg     Token::tochars[TOKdsymbol]          = "symbol";
469*627f7eb2Smrg     Token::tochars[TOKtuple]            = "tuple";
470*627f7eb2Smrg     Token::tochars[TOKdeclaration]      = "declaration";
471*627f7eb2Smrg     Token::tochars[TOKon_scope_exit]    = "scope(exit)";
472*627f7eb2Smrg     Token::tochars[TOKon_scope_success] = "scope(success)";
473*627f7eb2Smrg     Token::tochars[TOKon_scope_failure] = "scope(failure)";
474*627f7eb2Smrg     Token::tochars[TOKdelegateptr]      = "delegateptr";
475*627f7eb2Smrg     Token::tochars[TOKvectorarray]      = "vectorarray";
476*627f7eb2Smrg }
477