annotate dmdscript_tango/lexer.d @ 3:8363a4bf6a8f

rename package: dmdscript to dmdscript_tango
author saaadel
date Sun, 24 Jan 2010 18:33:05 +0200
parents 55c2951c07be
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2005 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21 /* Lexical Analyzer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
24 module dmdscript_tango.lexer;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import std.string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import std.utf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import std.outbuffer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import std.ctype;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import std.c.stdlib;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
33 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
34 import dmdscript_tango.text;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
35 import dmdscript_tango.identifier;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
36 import dmdscript_tango.scopex;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
37 import dmdscript_tango.textgen.errmsgs;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 /* Tokens:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 ( )
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 [ ]
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 { }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 < > <= >= == !=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 === !==
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 << >> <<= >>= >>> >>>=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 + - += -=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 * / % *= /= %=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 & | ^ &= |= ^=
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 = ! ~
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 ++ --
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 . : ,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 ? && ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 alias int TOK;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 enum
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 TOKreserved,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 // Other
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 TOKlparen, TOKrparen,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 TOKlbracket, TOKrbracket,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 TOKlbrace, TOKrbrace,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 TOKcolon, TOKneg,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 TOKpos,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 TOKsemicolon, TOKeof,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 TOKarray, TOKcall,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 TOKarraylit, TOKobjectlit,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 TOKcomma, TOKassert,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 // Operators
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 TOKless, TOKgreater,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 TOKlessequal, TOKgreaterequal,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 TOKequal, TOKnotequal,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 TOKidentity, TOKnonidentity,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 TOKshiftleft, TOKshiftright,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 TOKshiftleftass, TOKshiftrightass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 TOKushiftright, TOKushiftrightass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 TOKplus, TOKminus, TOKplusass, TOKminusass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 TOKmultiply, TOKdivide, TOKpercent,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 TOKmultiplyass, TOKdivideass, TOKpercentass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 TOKand, TOKor, TOKxor,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 TOKandass, TOKorass, TOKxorass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 TOKassign, TOKnot, TOKtilde,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 TOKplusplus, TOKminusminus,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 TOKdot,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 TOKquestion, TOKandand, TOKoror,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 // Leaf operators
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 TOKnumber, TOKidentifier, TOKstring,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 TOKregexp, TOKreal,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 // Keywords
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 TOKbreak, TOKcase, TOKcontinue,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 TOKdefault, TOKdelete, TOKdo,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 TOKelse, TOKexport, TOKfalse,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 TOKfor, TOKfunction, TOKif,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 TOKimport, TOKin, TOKnew,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 TOKnull, TOKreturn, TOKswitch,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 TOKthis, TOKtrue, TOKtypeof,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 TOKvar, TOKvoid, TOKwhile,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 TOKwith,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 // Reserved for ECMA extensions
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 TOKcatch, TOKclass,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 TOKconst, TOKdebugger,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 TOKenum, TOKextends,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 TOKfinally, TOKsuper,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 TOKthrow, TOKtry,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 // Java keywords reserved for unknown reasons
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 TOKabstract, TOKboolean,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 TOKbyte, TOKchar,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 TOKdouble, TOKfinal,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 TOKfloat, TOKgoto,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 TOKimplements, TOKinstanceof,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 TOKint, TOKinterface,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 TOKlong, TOKnative,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 TOKpackage, TOKprivate,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 TOKprotected, TOKpublic,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 TOKshort, TOKstatic,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 TOKsynchronized, TOKthrows,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 TOKtransient,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 TOKmax
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 };
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 int isoctal(dchar c) { return ('0' <= c && c <= '7'); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 int isasciidigit(dchar c) { return ('0' <= c && c <= '9'); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 int isasciilower(dchar c) { return ('a' <= c && c <= 'z'); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 int isasciiupper(dchar c) { return ('A' <= c && c <= 'Z'); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 int ishex(dchar c) { return
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 ('0' <= c && c <= '9') ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 ('a' <= c && c <= 'f') ||
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 ('A' <= c && c <= 'F'); }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 /******************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 struct Token
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 Token *next;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 tchar *ptr; // pointer to first character of this token within buffer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 uint linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 TOK value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 tchar *sawLineTerminator; // where we saw the last line terminator
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 union
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 number_t intvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 real_t realvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 tchar[] string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 };
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 static tchar[] tochars[TOKmax];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 static Token* alloc(Lexer* lex)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 { Token *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 if (lex.freelist)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 t = lex.freelist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 lex.freelist = t.next;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 return t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 return new Token();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 void print()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 writefln(toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 char[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 { char[] p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 switch (value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 case TOKnumber:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 p = std.string.format(intvalue);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 case TOKreal:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 long l = cast(long)realvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 if (l == realvalue)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 p = std.string.format(l);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 p = std.string.format(realvalue);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 case TOKstring:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 case TOKregexp:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 p = string;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 case TOKidentifier:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 p = ident.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 p = toString(value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 return p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 static char[] toString(TOK value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 { char[] p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 p = tochars[value];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 if (!p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 p = std.string.format("TOK%d", value);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 return p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 /*******************************************************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 class Lexer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 Identifier[tchar[]] stringtable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 Token* freelist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 char[] sourcename; // for error message strings
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 tchar[] base; // pointer to start of buffer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 tchar* end; // past end of buffer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 tchar* p; // current character
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 uint currentline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 Token token;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 OutBuffer stringbuffer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 int useStringtable; // use for Identifiers
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239 ErrInfo errinfo; // syntax error information
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 static bool inited;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 this(char[] sourcename, tchar[] base, int useStringtable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 //writefln("Lexer::Lexer(base = '%s')\n",base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 if (!inited)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 init();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 std.c.string.memset(&token, 0, token.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 this.useStringtable = useStringtable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 this.sourcename = sourcename;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 if (!base.length || (base[length - 1] != 0 && base[length - 1] != 0x1A))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 base ~= cast(tchar)0x1A;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 this.base = base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 this.end = base.ptr + base.length;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 p = base.ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 currentline = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 freelist = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 ~this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 //writef(L"~Lexer()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 freelist = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265 sourcename = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 base = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 end = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 p = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271 dchar get(tchar* p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 size_t idx = p - base.ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 return std.utf.decode(base, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
277 tchar* inc(tchar* p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
278 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
279 size_t idx = p - base.ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
280 std.utf.decode(base, idx);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
281 return base.ptr + idx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
282 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
283
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
284 void error(int msgnum)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
285 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
286 error(errmsgtbl[msgnum]);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
287 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
288
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
289 void error(...)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
290 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
291 uint linnum = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
292 tchar* s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
293 tchar* slinestart;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
294 tchar* slineend;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
295 tchar[] buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
296
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
297 //FuncLog funclog(L"Lexer.error()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
298 //writefln("TEXT START ------------\n%ls\nTEXT END ------------------", base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
299
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
300 // Find the beginning of the line
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
301 slinestart = base.ptr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
302 for (s = base.ptr; s != p; s++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
303 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
304 if (*s == '\n')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
305 { linnum++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
306 slinestart = s + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
307 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
308 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
309
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
310 // Find the end of the line
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
311 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
312 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
313 switch (*s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
314 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
315 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
316 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
317 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
318 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
319 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
320 s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
321 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
322 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
323 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
324 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
325 slineend = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
326
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
327 buf = std.string.format("%s(%d) : Error: ", sourcename, linnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
328
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
329 void putc(dchar c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
330 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
331 std.utf.encode(buf, c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
332 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
333
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
334 std.format.doFormat(&putc, _arguments, _argptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
335
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
336 if (!errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
337 { uint len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
338
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
339 errinfo.message = buf;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
340 errinfo.linnum = linnum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
341 errinfo.charpos = p - slinestart;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
342
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
343 len = slineend - slinestart;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
344 errinfo.srcline = slinestart[0 .. len];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
345 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
346
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
347 // Consume input until the end
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
348 while (*p != 0x1A && *p != 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
349 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
350 token.next = null; // dump any lookahead
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
351
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
352 version (none)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
353 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
354 writefln(errinfo.message);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
355 fflush(stdout);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
356 exit(EXIT_FAILURE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
357 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
358 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
359
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
360 /************************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
361 * Given source text, convert loc to a string for the corresponding line.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
362 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
363
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
364 static tchar[] locToSrcline(tchar *src, Loc loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
365 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
366 tchar *slinestart;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
367 tchar *slineend;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
368 tchar *s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
369 uint linnum = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
370 uint len;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
371
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
372 if (!src)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
373 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
374 slinestart = src;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
375 for (s = src; ; s++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
376 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
377 switch (*s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
378 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
379 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
380 if (linnum == loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
381 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
382 slineend = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
383 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
384 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
385 slinestart = s + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
386 linnum++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
387 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
388
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
389 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
390 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
391 slineend = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
392 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
393
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
394 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
395 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
396 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
397 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
398 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
399
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
400 // Remove trailing \r's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
401 while (slinestart < slineend && slineend[-1] == '\r')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
402 --slineend;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
403
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
404 len = slineend - slinestart;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
405 return slinestart[0 .. len];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
406 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
407
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
408
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
409 TOK nextToken()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
410 { Token *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
411
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
412 if (token.next)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
413 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
414 t = token.next;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
415 token = *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
416 t.next = freelist;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
417 freelist = t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
418 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
419 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
420 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
421 scan(&token);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
422 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
423 //token.print();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
424 return token.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
425 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
426
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
427 Token *peek(Token *ct)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
428 { Token *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
429
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
430 if (ct.next)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
431 t = ct.next;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
432 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
433 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
434 t = Token.alloc(&this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
435 scan(t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
436 t.next = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
437 ct.next = t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
438 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
439 return t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
440 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
441
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
442 void insertSemicolon(tchar *loc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
443 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
444 // Push current token back into the input, and
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
445 // create a new current token that is a semicolon
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
446 Token *t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
447
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
448 t = Token.alloc(&this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
449 *t = token;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
450 token.next = t;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
451 token.value = TOKsemicolon;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
452 token.ptr = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
453 token.sawLineTerminator = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
454 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
455
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
456 /**********************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
457 * Horrible kludge to support disambiguating TOKregexp from TOKdivide.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
458 * The idea is, if we are looking for a TOKdivide, and find instead
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
459 * a TOKregexp, we back up and rescan.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
460 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
461
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
462 void rescan()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
463 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
464 token.next = null; // no lookahead
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
465 // should put on freelist
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
466 p = token.ptr + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
467 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
468
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
469
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
470 /****************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
471 * Turn next token in buffer into a token.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
472 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
473
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
474 void scan(Token *t)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
475 { tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
476 dchar d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
477
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
478 //writefln("Lexer.scan()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
479 t.sawLineTerminator = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
480 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
481 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
482 t.ptr = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
483 //t.linnum = currentline;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
484 //writefln("p = %x",cast(uint)p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
485 //writefln("p = %x, *p = x%02x, '%s'",cast(uint)p,*p,*p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
486 switch (*p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
487 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
488 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
489 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
490 t.value = TOKeof; // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
491 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
492
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
493 case ' ':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
494 case '\t':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
495 case '\v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
496 case '\f':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
497 case 0xA0: // no-break space
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
498 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
499 continue; // skip white space
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
500
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
501 case '\n': // line terminator
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
502 currentline++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
503 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
504 t.sawLineTerminator = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
505 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
506 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
507
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
508 case '"':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
509 case '\'':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
510 t.string = string(*p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
511 t.value = TOKstring;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
512 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
513
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
514 case '0': case '1': case '2': case '3': case '4':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
515 case '5': case '6': case '7': case '8': case '9':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
516 t.value = number(t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
517 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
518
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
519 case 'a': case 'b': case 'c': case 'd': case 'e':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
520 case 'f': case 'g': case 'h': case 'i': case 'j':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
521 case 'k': case 'l': case 'm': case 'n': case 'o':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
522 case 'p': case 'q': case 'r': case 's': case 't':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
523 case 'u': case 'v': case 'w': case 'x': case 'y':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
524 case 'z':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
525 case 'A': case 'B': case 'C': case 'D': case 'E':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
526 case 'F': case 'G': case 'H': case 'I': case 'J':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
527 case 'K': case 'L': case 'M': case 'N': case 'O':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
528 case 'P': case 'Q': case 'R': case 'S': case 'T':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
529 case 'U': case 'V': case 'W': case 'X': case 'Y':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
530 case 'Z':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
531 case '_':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
532 case '$':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
533 Lidentifier:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
534 { tchar[] id;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
535
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
536 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
537 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
538 p = inc(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
539 d = get(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
540 if (d == '\\' && p[1] == 'u')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
541 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
542 Lidentifier2:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
543 id = t.ptr[0 .. p - t.ptr].dup;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
544 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
545 std.utf.encode(id, unicode());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
546 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
547 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
548 d = get(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
549 if (d == '\\' && p[1] == 'u')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
550 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
551 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
552 std.utf.encode(id, unicode());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
553 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
554 else if (isalnum(d) || d == '_' || d == '$')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
555 { id ~= cast(tchar)d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
556 p = inc(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
557 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
558 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
559 goto Lidentifier3;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
560 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
561 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
562 } while (isalnum(d) || d == '_' || d == '$'); // This should be isalnum -- any Unicode letter is allowed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
563 id = t.ptr[0 .. p - t.ptr];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
564 Lidentifier3:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
565 t.value = isKeyword(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
566 if (t.value)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
567 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
568 if (useStringtable)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
569 { //Identifier* i = &stringtable[id];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
570 Identifier* i = id in stringtable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
571 if (!i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
572 { stringtable[id] = Identifier.init;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
573 i = id in stringtable;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
574 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
575 i.value.putVstring(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
576 i.value.toHash();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
577 t.ident = i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
578 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
579 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
580 t.ident = Identifier.build(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
581 t.value = TOKidentifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
582 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
583 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
584
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
585 case '/':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
586 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
587 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
588 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
589 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
590 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
591 t.value = TOKdivideass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
592 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
593 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
594 else if (c == '*')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
595 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
596 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
597 for ( ; ; p++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
598 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
599 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
600 Lcomment:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
601 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
602 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
603 case '*':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
604 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
605 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
606 if (c == '/')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
607 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
608 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
609 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
610 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
611 goto Lcomment;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
612
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
613 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
614 currentline++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
615 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
616 t.sawLineTerminator = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
617 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
618
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
619 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
620 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
621 error(ERR_BAD_C_COMMENT);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
622 t.value = TOKeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
623 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
624
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
625 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
626 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
627 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
628 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
629 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
630 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
631 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
632 else if (c == '/')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
633 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
634 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
635 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
636 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
637 switch (*p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
638 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
639 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
640 currentline++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
641 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
642 t.sawLineTerminator = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
643 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
644
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
645 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
646 case 0x1A: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
647 t.value = TOKeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
648 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
649
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
650 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
651 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
652 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
653 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
654 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
655 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
656 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
657 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
658 else if ((t.string = regexp()) != null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
659 t.value = TOKregexp;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
660 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
661 t.value = TOKdivide;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
662 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
663
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
664 case '.':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
665 tchar *q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
666 q = p + 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
667 c = *q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
668 if (isdigit(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
669 t.value = number(t);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
670 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
671 { t.value = TOKdot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
672 p = q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
673 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
674 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
675
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
676 case '&':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
677 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
678 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
679 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
680 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
681 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
682 t.value = TOKandass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
683 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
684 else if (c == '&')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
685 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
686 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
687 t.value = TOKandand;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
688 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
689 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
690 t.value = TOKand;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
691 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
692
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
693 case '|':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
694 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
695 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
696 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
697 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
698 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
699 t.value = TOKorass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
700 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
701 else if (c == '|')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
702 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
703 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
704 t.value = TOKoror;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
705 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
706 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
707 t.value = TOKor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
708 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
709
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
710 case '-':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
711 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
712 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
713 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
714 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
715 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
716 t.value = TOKminusass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
717 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
718 else if (c == '-')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
719 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
720 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
721
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
722 // If the last token in the file is -. then
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
723 // treat it as EOF. This is to accept broken
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
724 // scripts that forgot to protect the closing -.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
725 // with a // comment.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
726 if (*p == '>')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
727 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
728 // Scan ahead to see if it's the last token
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
729 tchar *q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
730
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
731 q = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
732 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
733 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
734 switch (*++q)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
735 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
736 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
737 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
738 t.value = TOKeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
739 p = q;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
740 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
741
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
742 case ' ':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
743 case '\t':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
744 case '\v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
745 case '\f':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
746 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
747 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
748 case 0xA0: // no-break space
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
749 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
750
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
751 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
752 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
753 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
754 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
755 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
756 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
757 t.value = TOKminusminus;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
758 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
759 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
760 t.value = TOKminus;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
761 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
762
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
763 case '+':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
764 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
765 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
766 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
767 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
768 t.value = TOKplusass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
769 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
770 else if (c == '+')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
771 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
772 t.value = TOKplusplus;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
773 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
774 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
775 t.value = TOKplus;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
776 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
777
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
778 case '<':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
779 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
780 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
781 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
782 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
783 t.value = TOKlessequal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
784 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
785 else if (c == '<')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
786 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
787 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
788 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
789 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
790 t.value = TOKshiftleftass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
791 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
792 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
793 t.value = TOKshiftleft;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
794 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
795 else if (c == '!' && p[1] == '-' && p[2] == '-')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
796 { // Special comment to end of line
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
797 p += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
798 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
799 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
800 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
801 switch (*p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
802 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
803 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
804 currentline++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
805 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
806 t.sawLineTerminator = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
807 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
808
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
809 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
810 case 0x1A: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
811 error(ERR_BAD_HTML_COMMENT);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
812 t.value = TOKeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
813 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
814
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
815 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
816 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
817 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
818 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
819 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
820 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
821 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
822 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
823 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
824 t.value = TOKless;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
825 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
826
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
827 case '>':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
828 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
829 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
830 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
831 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
832 t.value = TOKgreaterequal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
833 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
834 else if (c == '>')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
835 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
836 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
837 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
838 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
839 t.value = TOKshiftrightass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
840 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
841 else if (c == '>')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
842 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
843 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
844 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
845 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
846 t.value = TOKushiftrightass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
847 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
848 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
849 t.value = TOKushiftright;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
850 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
851 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
852 t.value = TOKshiftright;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
853 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
854 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
855 t.value = TOKgreater;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
856 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
857
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
858 case '(': p++; t.value = TOKlparen; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
859 case ')': p++; t.value = TOKrparen; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
860 case '[': p++; t.value = TOKlbracket; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
861 case ']': p++; t.value = TOKrbracket; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
862 case '{': p++; t.value = TOKlbrace; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
863 case '}': p++; t.value = TOKrbrace; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
864 case '~': p++; t.value = TOKtilde; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
865 case '?': p++; t.value = TOKquestion; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
866 case ',': p++; t.value = TOKcomma; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
867 case ';': p++; t.value = TOKsemicolon; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
868 case ':': p++; t.value = TOKcolon; return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
869
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
870 case '*':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
871 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
872 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
873 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
874 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
875 t.value = TOKmultiplyass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
876 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
877 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
878 t.value = TOKmultiply;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
879 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
880
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
881 case '%':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
882 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
883 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
884 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
885 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
886 t.value = TOKpercentass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
887 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
888 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
889 t.value = TOKpercent;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
890 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
891
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
892 case '^':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
893 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
894 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
895 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
896 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
897 t.value = TOKxorass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
898 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
899 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
900 t.value = TOKxor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
901 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
902
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
903 case '=':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
904 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
905 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
906 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
907 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
908 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
909 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
910 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
911 t.value = TOKidentity;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
912 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
913 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
914 t.value = TOKequal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
915 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
916 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
917 t.value = TOKassign;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
918 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
919
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
920 case '!':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
921 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
922 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
923 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
924 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
925 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
926 if (c == '=')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
927 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
928 t.value = TOKnonidentity;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
929 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
930 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
931 t.value = TOKnotequal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
932 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
933 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
934 t.value = TOKnot;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
935 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
936
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
937 case '\\':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
938 if (p[1] == 'u')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
939 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
940 // \uXXXX starts an identifier
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
941 goto Lidentifier2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
942 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
943 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
944 d = get(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
945 if (isalpha(d)) // This should be isalpha -- any Unicode letter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
946 goto Lidentifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
947 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
948 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
949 if (isprint(d))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
950 error(errmsgtbl[ERR_BAD_CHAR_C], d);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
951 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
952 error(errmsgtbl[ERR_BAD_CHAR_X], d);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
953 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
954 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
955 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
956 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
957 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
958
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
959 /*******************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
960 * Parse escape sequence.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
961 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
962
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
963 dchar escapeSequence()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
964 { uint c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
965 int n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
966
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
967 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
968 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
969 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
970 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
971 case '\'':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
972 case '"':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
973 case '?':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
974 case '\\':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
975 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
976 case 'a':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
977 c = 7;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
978 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
979 case 'b':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
980 c = 8;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
981 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
982 case 'f':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
983 c = 12;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
984 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
985 case 'n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
986 c = 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
987 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
988 case 'r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
989 c = 13;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
990 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
991 case 't':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
992 c = 9;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
993 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
994
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
995 case 'v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
996 version (JSCRIPT_ESCAPEV_BUG)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
997 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
998 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
999 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1000 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1001 c = 11;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1002 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1003 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1004
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1005 case 'x':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1006 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1007 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1008 if (ishex(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1009 { uint v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1010
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1011 n = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1012 v = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1013 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1014 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1015 if (isdigit(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1016 c -= '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1017 else if (isasciilower(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1018 c -= 'a' - 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1019 else // 'A' <= c && c <= 'Z'
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1020 c -= 'A' - 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1021 v = v * 16 + c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1022 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1023 if (++n >= 2 || !ishex(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1024 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1025 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1026 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1027 if (n == 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1028 error(ERR_BAD_HEX_SEQUENCE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1029 c = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1030 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1031 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1032 error(errmsgtbl[ERR_UNDEFINED_ESC_SEQUENCE], c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1033 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1034
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1035 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1036 if (c > 0x7F)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1037 { p--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1038 c = get(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1039 p = inc(p);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1040 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1041 if (isoctal(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1042 { uint v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1043
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1044 n = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1045 v = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1046 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1047 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1048 v = v * 8 + (c - '0');
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1049 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1050 if (++n >= 3 || !isoctal(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1051 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1052 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1053 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1054 c = v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1055 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1056 // Don't throw error, just accept it
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1057 //error("undefined escape sequence \\%c\n",c);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1058 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1059 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1060 return c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1061 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1062
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1063 /**************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1064 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1065
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1066 tchar[] string(tchar quote)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1067 { tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1068 dchar d;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1069 tchar[] stringbuffer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1070
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1071 //printf("Lexer.string('%c')\n", quote);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1072 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1073 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1074 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1075 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1076 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1077 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1078 case '"':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1079 case '\'':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1080 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1081 if (c == quote)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1082 return stringbuffer;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1083 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1084
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1085 case '\\':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1086 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1087 if (*p == 'u')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1088 d = unicode();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1089 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1090 d = escapeSequence();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1091 std.utf.encode(stringbuffer, d);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1092 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1093
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1094 case '\n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1095 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1096 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1097 error(errmsgtbl[ERR_STRING_NO_END_QUOTE], quote);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1098 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1099
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1100 case 0:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1101 case 0x1A:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1102 error(ERR_UNTERMINATED_STRING);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1103 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1104
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1105 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1106 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1107 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1108 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1109 stringbuffer ~= c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1110 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1111 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1112 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1113
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1114 /**************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1115 * Scan regular expression. Return null with buffer
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1116 * pointer intact if it is not a regexp.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1117 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1118
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1119 tchar[] regexp()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1120 { tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1121 tchar* s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1122 tchar* start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1123
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1124 /*
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1125 RegExpLiteral: RegExpBody RegExpFlags
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1126 RegExpFlags:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1127 empty
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1128 | RegExpFlags ContinuingIdentifierCharacter
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1129 RegExpBody: / RegExpFirstChar RegExpChars /
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1130 RegExpFirstChar:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1131 OrdinaryRegExpFirstChar
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1132 | \ NonTerminator
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1133 OrdinaryRegExpFirstChar: NonTerminator except \ | / | *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1134 RegExpChars:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1135 empty
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1136 | RegExpChars RegExpChar
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1137 RegExpChar:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1138 OrdinaryRegExpChar
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1139 | \ NonTerminator
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1140 OrdinaryRegExpChar: NonTerminator except \ | /
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1141 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1143 //writefln("Lexer.regexp()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1144 start = p - 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1145 s = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1146
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1147 // Do RegExpBody
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1148 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1149 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1150 c = *s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1151 s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1152 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1153 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1154 case '\\':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1155 if (s == p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1156 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1157 c = *s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1158 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1159 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1160 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1161 case '\n': // new line
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1162 case 0: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1163 case 0x1A: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1164 return null; // not a regexp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1165 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1166 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1167 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1168 s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1169 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1170
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1171 case '/':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1172 if (s == p + 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1173 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1174 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1175
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1176 case '\r':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1177 case '\n': // new line
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1178 case 0: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1179 case 0x1A: // end of file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1180 return null; // not a regexp
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1181
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1182 case '*':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1183 if (s == p + 1)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1184 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1185 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1186 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1187 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1188 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1189 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1190
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1191 // Do RegExpFlags
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1192 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1193 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1194 c = *s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1195 if (isalnum(c) || c == '_' || c == '$')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1196 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1197 s++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1198 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1199 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1200 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1201 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1202
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1203 // Finish pattern & return it
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1204 p = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1205 return start[0 .. s - start].dup;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1206 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1207
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1208 /***************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1209 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1210
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1211 dchar unicode()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1212 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1213 dchar value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1214 uint n;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1215 dchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1216
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1217 value = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1218 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1219 for (n = 0; n < 4; n++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1220 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1221 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1222 if (!ishex(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1223 { error(ERR_BAD_U_SEQUENCE);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1224 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1225 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1226 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1227 if (isdigit(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1228 c -= '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1229 else if (isasciilower(c))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1230 c -= 'a' - 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1231 else // 'A' <= c && c <= 'Z'
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1232 c -= 'A' - 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1233 value <<= 4;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1234 value |= c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1235 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1236 return value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1237 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1238
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1239 /********************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1240 * Read a number.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1241 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1242
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1243 TOK number(Token *t)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1244 { tchar *start;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1245 number_t intvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1246 real realvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1247 int base = 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1248 tchar c;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1249
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1250 start = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1251 for (;;)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1252 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1253 c = *p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1254 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1255 switch (c)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1256 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1257 case '0':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1258 // ECMA grammar implies that numbers with leading 0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1259 // like 015 are illegal. But other scripts allow them.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1260 if (p - start == 1) // if leading 0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1261 base = 8;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1262 case '1': case '2': case '3': case '4': case '5':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1263 case '6': case '7':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1264 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1266 case '8': case '9': // decimal digits
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1267 if (base == 8) // and octal base
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1268 base = 10; // means back to decimal base
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1269 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1270
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1271 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1272 p--;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1273 Lnumber:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1274 if (base == 0)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1275 base = 10;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1276 intvalue = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1277 foreach (tchar v; start[0 .. p - start])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1278 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1279 if ('0' <= v && v <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1280 v -= '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1281 else if ('a' <= v && v <= 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1282 v -= ('a' - 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1283 else if ('A' <= v && v <= 'F')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1284 v -= ('A' - 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1285 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1286 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1287 assert(v < base);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1288 if ((number_t.max - v) / base < intvalue)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1289 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1290 realvalue = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1291 foreach (tchar w; start[0 .. p - start])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1292 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1293 if ('0' <= w && w <= '9')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1294 w -= '0';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1295 else if ('a' <= w && w <= 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1296 w -= ('a' - 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1297 else if ('A' <= w && w <= 'F')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1298 w -= ('A' - 10);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1299 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1300 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1301 realvalue *= base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1302 realvalue += v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1303 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1304 t.realvalue = realvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1305 return TOKreal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1306 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1307 intvalue *= base;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1308 intvalue += v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1309 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1310 t.realvalue = cast(double)intvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1311 return TOKreal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1312
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1313 case 'x':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1314 case 'X':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1315 if (p - start != 2 || !ishex(*p))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1316 goto Lerr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1317 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1318 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1319 while (ishex(*p));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1320 start += 2;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1321 base = 16;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1322 goto Lnumber;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1323
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1324 case '.':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1325 while (isdigit(*p))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1326 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1327 if (*p == 'e' || *p == 'E')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1328 { p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1329 goto Lexponent;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1330 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1331 goto Ldouble;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1332
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1333 case 'e':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1334 case 'E':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1335 Lexponent:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1336 if (*p == '+' || *p == '-')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1337 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1338 if (!isdigit(*p))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1339 goto Lerr;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1340 do
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1341 p++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1342 while (isdigit(*p));
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1343 goto Ldouble;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1344
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1345 Ldouble:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1346 // convert double
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1347 realvalue = std.c.stdlib.strtod(toStringz(start[0 .. p - start]), null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1348 t.realvalue = realvalue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1349 return TOKreal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1350 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1351 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1352
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1353 Lerr:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1354 error(ERR_UNRECOGNIZED_N_LITERAL);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1355 return TOKeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1356 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1357
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1358 static TOK isKeyword(tchar[] s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1359 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1360 if (s[0] >= 'a' && s[0] <= 'w')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1361 switch (s.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1362 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1363 case 2:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1364 if (s[0] == 'i')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1365 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1366 if (s[1] == 'f')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1367 return TOKif;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1368 if (s[1] == 'n')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1369 return TOKin;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1370 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1371 else if (s[0] == 'd' && s[1] == 'o')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1372 return TOKdo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1373 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1374
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1375 case 3:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1376 switch (s[0])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1377 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1378 case 'f':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1379 if (s[1] == 'o' && s[2] == 'r')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1380 return TOKfor;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1381 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1382 case 'i':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1383 if (s[1] == 'n' && s[2] == 't')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1384 return TOKint;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1385 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1386 case 'n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1387 if (s[1] == 'e' && s[2] == 'w')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1388 return TOKnew;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1389 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1390 case 't':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1391 if (s[1] == 'r' && s[2] == 'y')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1392 return TOKtry;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1393 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1394 case 'v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1395 if (s[1] == 'a' && s[2] == 'r')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1396 return TOKvar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1397 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1398 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1399 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1400 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1401 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1402
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1403 case 4:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1404 switch (s[0])
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1405 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1406 case 'b':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1407 if (s[1] == 'y' && s[2] == 't' && s[3] == 'e')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1408 return TOKbyte;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1409 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1410 case 'c':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1411 if (s[1] == 'a' && s[2] == 's' && s[3] == 'e')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1412 return TOKcase;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1413 if (s[1] == 'h' && s[2] == 'a' && s[3] == 'r')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1414 return TOKchar;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1415 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1416 case 'e':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1417 if (s[1] == 'l' && s[2] == 's' && s[3] == 'e')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1418 return TOKelse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1419 if (s[1] == 'n' && s[2] == 'u' && s[3] == 'm')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1420 return TOKenum;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1421 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1422 case 'g':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1423 if (s[1] == 'o' && s[2] == 't' && s[3] == 'o')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1424 return TOKgoto;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1425 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1426 case 'l':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1427 if (s[1] == 'o' && s[2] == 'n' && s[3] == 'g')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1428 return TOKlong;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1429 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1430 case 'n':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1431 if (s[1] == 'u' && s[2] == 'l' && s[3] == 'l')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1432 return TOKnull;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1433 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1434 case 't':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1435 if (s[1] == 'h' && s[2] == 'i' && s[3] == 's')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1436 return TOKthis;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1437 if (s[1] == 'r' && s[2] == 'u' && s[3] == 'e')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1438 return TOKtrue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1439 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1440 case 'w':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1441 if (s[1] == 'i' && s[2] == 't' && s[3] == 'h')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1442 return TOKwith;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1443 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1444 case 'v':
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1445 if (s[1] == 'o' && s[2] == 'i' && s[3] == 'd')
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1446 return TOKvoid;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1447 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1448 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1449 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1450 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1451 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1452
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1453 case 5:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1454 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1455 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1456 case "break": return TOKbreak;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1457 case "catch": return TOKcatch;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1458 case "class": return TOKclass;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1459 case "const": return TOKconst;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1460 case "false": return TOKfalse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1461 case "final": return TOKfinal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1462 case "float": return TOKfloat;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1463 case "short": return TOKshort;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1464 case "super": return TOKsuper;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1465 case "throw": return TOKthrow;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1466 case "while": return TOKwhile;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1467 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1468 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1469 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1470 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1471
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1472 case 6:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1473 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1474 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1475 case "delete": return TOKdelete;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1476 case "double": return TOKdouble;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1477 case "export": return TOKexport;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1478 case "import": return TOKimport;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1479 case "native": return TOKnative;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1480 case "public": return TOKpublic;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1481 case "return": return TOKreturn;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1482 case "static": return TOKstatic;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1483 case "switch": return TOKswitch;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1484 case "throws": return TOKthrows;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1485 case "typeof": return TOKtypeof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1486 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1487 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1488 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1489 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1490
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1491 case 7:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1492 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1493 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1494 case "boolean": return TOKboolean;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1495 case "default": return TOKdefault;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1496 case "extends": return TOKextends;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1497 case "finally": return TOKfinally;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1498 case "package": return TOKpackage;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1499 case "private": return TOKprivate;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1500 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1501 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1502 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1503 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1504
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1505 case 8:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1506 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1507 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1508 case "abstract": return TOKabstract;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1509 case "continue": return TOKcontinue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1510 case "debugger": return TOKdebugger;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1511 case "function": return TOKfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1512 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1513 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1514 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1515 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1516
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1517 case 9:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1518 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1519 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1520 case "interface": return TOKinterface;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1521 case "protected": return TOKprotected;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1522 case "transient": return TOKtransient;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1523 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1524 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1525 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1526 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1527
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1528 case 10:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1529 switch (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1530 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1531 case "implements": return TOKimplements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1532 case "instanceof": return TOKinstanceof;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1533 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1534 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1535 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1536 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1537
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1538 case 12:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1539 if (s == "synchronized") return TOKsynchronized;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1540 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1541
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1542 default:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1543 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1544 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1545 return TOKreserved; // not a keyword
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1546 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1547 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1548
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1549
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1550 /****************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1551 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1552
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1553 struct Keyword
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1554 { tchar[] name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1555 TOK value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1556 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1557
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1558 static Keyword keywords[] =
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1559 [
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1560 // { "", TOK },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1561
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1562 { "break", TOKbreak },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1563 { "case", TOKcase },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1564 { "continue", TOKcontinue },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1565 { "default", TOKdefault },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1566 { "delete", TOKdelete },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1567 { "do", TOKdo },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1568 { "else", TOKelse },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1569 { "export", TOKexport },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1570 { "false", TOKfalse },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1571 { "for", TOKfor },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1572 { "function", TOKfunction },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1573 { "if", TOKif },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1574 { "import", TOKimport },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1575 { "in", TOKin },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1576 { "new", TOKnew },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1577 { "null", TOKnull },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1578 { "return", TOKreturn },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1579 { "switch", TOKswitch },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1580 { "this", TOKthis },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1581 { "true", TOKtrue },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1582 { "typeof", TOKtypeof },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1583 { "var", TOKvar },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1584 { "void", TOKvoid },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1585 { "while", TOKwhile },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1586 { "with", TOKwith },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1587
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1588 { "catch", TOKcatch },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1589 { "class", TOKclass },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1590 { "const", TOKconst },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1591 { "debugger", TOKdebugger },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1592 { "enum", TOKenum },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1593 { "extends", TOKextends },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1594 { "finally", TOKfinally },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1595 { "super", TOKsuper },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1596 { "throw", TOKthrow },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1597 { "try", TOKtry },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1598
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1599 { "abstract", TOKabstract },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1600 { "boolean", TOKboolean },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1601 { "byte", TOKbyte },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1602 { "char", TOKchar },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1603 { "double", TOKdouble },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1604 { "final", TOKfinal },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1605 { "float", TOKfloat },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1606 { "goto", TOKgoto },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1607 { "implements", TOKimplements },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1608 { "instanceof", TOKinstanceof },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1609 { "int", TOKint },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1610 { "interface", TOKinterface },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1611 { "long", TOKlong },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1612 { "native", TOKnative },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1613 { "package", TOKpackage },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1614 { "private", TOKprivate },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1615 { "protected", TOKprotected },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1616 { "public", TOKpublic },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1617 { "short", TOKshort },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1618 { "static", TOKstatic },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1619 { "synchronized", TOKsynchronized },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1620 { "throws", TOKthrows },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1621 { "transient", TOKtransient },
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1622 ];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1623
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1624 void init()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1625 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1626 uint u;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1627 TOK v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1628
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1629 for (u = 0; u < keywords.length; u++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1630 { tchar[] s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1631
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1632 //writefln("keyword[%d] = '%s'", u, keywords[u].name);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1633 s = keywords[u].name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1634 v = keywords[u].value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1635
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1636 //writefln("tochars[%d] = '%s'", v, s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1637 Token.tochars[v] = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1638 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1639
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1640 Token.tochars[TOKreserved] = "reserved";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1641 Token.tochars[TOKeof] = "EOF";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1642 Token.tochars[TOKlbrace] = "{";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1643 Token.tochars[TOKrbrace] = "}";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1644 Token.tochars[TOKlparen] = "(";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1645 Token.tochars[TOKrparen] = "";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1646 Token.tochars[TOKlbracket] = "[";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1647 Token.tochars[TOKrbracket] = "]";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1648 Token.tochars[TOKcolon] = ":";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1649 Token.tochars[TOKsemicolon] = ";";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1650 Token.tochars[TOKcomma] = ",";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1651 Token.tochars[TOKor] = "|";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1652 Token.tochars[TOKorass] = "|=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1653 Token.tochars[TOKxor] = "^";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1654 Token.tochars[TOKxorass] = "^=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1655 Token.tochars[TOKassign] = "=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1656 Token.tochars[TOKless] = "<";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1657 Token.tochars[TOKgreater] = ">";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1658 Token.tochars[TOKlessequal] = "<=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1659 Token.tochars[TOKgreaterequal] = ">=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1660 Token.tochars[TOKequal] = "==";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1661 Token.tochars[TOKnotequal] = "!=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1662 Token.tochars[TOKidentity] = "===";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1663 Token.tochars[TOKnonidentity] = "!==";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1664 Token.tochars[TOKshiftleft] = "<<";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1665 Token.tochars[TOKshiftright] = ">>";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1666 Token.tochars[TOKushiftright] = ">>>";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1667 Token.tochars[TOKplus] = "+";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1668 Token.tochars[TOKplusass] = "+=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1669 Token.tochars[TOKminus] = "-";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1670 Token.tochars[TOKminusass] = "-=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1671 Token.tochars[TOKmultiply] = "*";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1672 Token.tochars[TOKmultiplyass] = "*=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1673 Token.tochars[TOKdivide] = "/";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1674 Token.tochars[TOKdivideass] = "/=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1675 Token.tochars[TOKpercent] = "%";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1676 Token.tochars[TOKpercentass] = "%=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1677 Token.tochars[TOKand] = "&";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1678 Token.tochars[TOKandass] = "&=";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1679 Token.tochars[TOKdot] = ".";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1680 Token.tochars[TOKquestion] = "?";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1681 Token.tochars[TOKtilde] = "~";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1682 Token.tochars[TOKnot] = "!";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1683 Token.tochars[TOKandand] = "&&";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1684 Token.tochars[TOKoror] = "||";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1685 Token.tochars[TOKplusplus] = "++";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1686 Token.tochars[TOKminusminus] = "--";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1687 Token.tochars[TOKcall] = "CALL";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1688
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1689 Lexer.inited = true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1690 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1691