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