Mercurial > projects > ldc
annotate dmd/lexer.h @ 715:30b42a283c8e
Removed TypeOpaque from DMD.
Changed runtime functions taking opaque[] to void[].
Implemented proper type painting, to avoid "resizing" array casts in runtime calls that previously took opaque[].
Implemented dynamic arrays as first class types, this implements proper ABI for these types on x86.
Added dwarf region end after call to assert function, fixes some problems with llvm not allowing this to be missing.
Reverted change to WithStatement from rev [704] it breaks MiniD, mini/with2.d needs to be fixed some other way...
Fixed tango bug 1339 in runtime, problem with _adReverseChar on invalid UTF-8.
Disabled .bc generation in the compiler runtime part, genobj.d triggers some llvm bug when using debug info. the .o seems to work fine.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:55:33 +0200 |
parents | eef8ac26c66c |
children | a26b0c5d5942 |
rev | line source |
---|---|
1 | 1 |
2 // Compiler implementation of the D programming language | |
159 | 3 // Copyright (c) 1999-2008 by Digital Mars |
1 | 4 // All Rights Reserved |
5 // written by Walter Bright | |
6 // http://www.digitalmars.com | |
7 // License for redistribution is by either the Artistic License | |
8 // in artistic.txt, or the GNU General Public License in gnu.txt. | |
9 // See the included readme.txt for details. | |
10 | |
11 #ifndef DMD_LEXER_H | |
12 #define DMD_LEXER_H | |
13 | |
14 #ifdef __DMC__ | |
15 #pragma once | |
16 #endif /* __DMC__ */ | |
17 | |
18 #include "root.h" | |
19 #include "mars.h" | |
20 | |
21 struct StringTable; | |
22 struct Identifier; | |
23 struct Module; | |
24 | |
25 /* Tokens: | |
26 ( ) | |
27 [ ] | |
28 { } | |
29 < > <= >= == != === !== | |
30 << >> <<= >>= >>> >>>= | |
31 + - += -= | |
32 * / % *= /= %= | |
33 & | ^ &= |= ^= | |
34 = ! ~ | |
35 ++ -- | |
36 . -> : , | |
37 ? && || | |
38 */ | |
39 | |
40 enum TOK | |
41 { | |
42 TOKreserved, | |
43 | |
44 // Other | |
45 TOKlparen, TOKrparen, | |
46 TOKlbracket, TOKrbracket, | |
47 TOKlcurly, TOKrcurly, | |
48 TOKcolon, TOKneg, | |
49 TOKsemicolon, TOKdotdotdot, | |
50 TOKeof, TOKcast, | |
51 TOKnull, TOKassert, | |
52 TOKtrue, TOKfalse, | |
53 TOKarray, TOKcall, | |
54 TOKaddress, TOKtypedot, | |
55 TOKtype, TOKthrow, | |
56 TOKnew, TOKdelete, | |
57 TOKstar, TOKsymoff, | |
58 TOKvar, TOKdotvar, | |
59 TOKdotti, TOKdotexp, | |
60 TOKdottype, TOKslice, | |
61 TOKarraylength, TOKversion, | |
62 TOKmodule, TOKdollar, | |
63 TOKtemplate, TOKdottd, | |
64 TOKdeclaration, TOKtypeof, | |
65 TOKpragma, TOKdsymbol, | |
66 TOKtypeid, TOKuadd, | |
67 TOKremove, | |
68 TOKnewanonclass, TOKcomment, | |
69 TOKarrayliteral, TOKassocarrayliteral, | |
70 TOKstructliteral, | |
71 | |
72 // Operators | |
73 TOKlt, TOKgt, | |
74 TOKle, TOKge, | |
75 TOKequal, TOKnotequal, | |
76 TOKidentity, TOKnotidentity, | |
77 TOKindex, TOKis, | |
78 TOKtobool, | |
79 | |
80 // 60 | |
81 // NCEG floating point compares | |
82 // !<>= <> <>= !> !>= !< !<= !<> | |
83 TOKunord,TOKlg,TOKleg,TOKule,TOKul,TOKuge,TOKug,TOKue, | |
84 | |
85 TOKshl, TOKshr, | |
86 TOKshlass, TOKshrass, | |
87 TOKushr, TOKushrass, | |
88 TOKcat, TOKcatass, // ~ ~= | |
89 TOKadd, TOKmin, TOKaddass, TOKminass, | |
90 TOKmul, TOKdiv, TOKmod, | |
91 TOKmulass, TOKdivass, TOKmodass, | |
92 TOKand, TOKor, TOKxor, | |
93 TOKandass, TOKorass, TOKxorass, | |
94 TOKassign, TOKnot, TOKtilde, | |
159 | 95 TOKplusplus, TOKminusminus, TOKconstruct, TOKblit, |
1 | 96 TOKdot, TOKarrow, TOKcomma, |
97 TOKquestion, TOKandand, TOKoror, | |
98 | |
159 | 99 // 104 |
1 | 100 // Numeric literals |
101 TOKint32v, TOKuns32v, | |
102 TOKint64v, TOKuns64v, | |
103 TOKfloat32v, TOKfloat64v, TOKfloat80v, | |
104 TOKimaginary32v, TOKimaginary64v, TOKimaginary80v, | |
105 | |
106 // Char constants | |
107 TOKcharv, TOKwcharv, TOKdcharv, | |
108 | |
109 // Leaf operators | |
110 TOKidentifier, TOKstring, | |
111 TOKthis, TOKsuper, | |
112 TOKhalt, TOKtuple, | |
113 | |
114 // Basic types | |
115 TOKvoid, | |
116 TOKint8, TOKuns8, | |
117 TOKint16, TOKuns16, | |
118 TOKint32, TOKuns32, | |
119 TOKint64, TOKuns64, | |
120 TOKfloat32, TOKfloat64, TOKfloat80, | |
121 TOKimaginary32, TOKimaginary64, TOKimaginary80, | |
122 TOKcomplex32, TOKcomplex64, TOKcomplex80, | |
123 TOKchar, TOKwchar, TOKdchar, TOKbit, TOKbool, | |
124 TOKcent, TOKucent, | |
125 | |
126 // Aggregates | |
127 TOKstruct, TOKclass, TOKinterface, TOKunion, TOKenum, TOKimport, | |
128 TOKtypedef, TOKalias, TOKoverride, TOKdelegate, TOKfunction, | |
129 TOKmixin, | |
130 | |
131 TOKalign, TOKextern, TOKprivate, TOKprotected, TOKpublic, TOKexport, | |
132 TOKstatic, /*TOKvirtual,*/ TOKfinal, TOKconst, TOKabstract, TOKvolatile, | |
133 TOKdebug, TOKdeprecated, TOKin, TOKout, TOKinout, TOKlazy, | |
159 | 134 TOKauto, TOKpackage, TOKmanifest, |
1 | 135 |
136 // Statements | |
137 TOKif, TOKelse, TOKwhile, TOKfor, TOKdo, TOKswitch, | |
138 TOKcase, TOKdefault, TOKbreak, TOKcontinue, TOKwith, | |
139 TOKsynchronized, TOKreturn, TOKgoto, TOKtry, TOKcatch, TOKfinally, | |
140 TOKasm, TOKforeach, TOKforeach_reverse, | |
141 TOKscope, | |
142 TOKon_scope_exit, TOKon_scope_failure, TOKon_scope_success, | |
143 | |
144 // Contracts | |
145 TOKbody, TOKinvariant, | |
146 | |
147 // Testing | |
148 TOKunittest, | |
149 | |
150 // Added after 1.0 | |
151 TOKref, | |
152 TOKmacro, | |
336 | 153 #if DMDV2 |
19 | 154 TOKtraits, |
159 | 155 TOKoverloadset, |
156 TOKpure, | |
336 | 157 TOKnothrow, |
158 TOKtls, | |
159 TOKline, | |
160 TOKfile, | |
658
50383e476c7e
Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
599
diff
changeset
|
161 TOKshared, |
19 | 162 #endif |
1 | 163 |
664
eef8ac26c66c
Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents:
658
diff
changeset
|
164 // LDC specific |
599
4435f57956e7
Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
336
diff
changeset
|
165 #if IN_LLVM |
4435f57956e7
Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
336
diff
changeset
|
166 TOKgep, |
4435f57956e7
Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
336
diff
changeset
|
167 #endif |
4435f57956e7
Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
336
diff
changeset
|
168 |
1 | 169 TOKMAX |
170 }; | |
171 | |
172 #define CASE_BASIC_TYPES \ | |
173 case TOKwchar: case TOKdchar: \ | |
174 case TOKbit: case TOKbool: case TOKchar: \ | |
175 case TOKint8: case TOKuns8: \ | |
176 case TOKint16: case TOKuns16: \ | |
177 case TOKint32: case TOKuns32: \ | |
178 case TOKint64: case TOKuns64: \ | |
179 case TOKfloat32: case TOKfloat64: case TOKfloat80: \ | |
180 case TOKimaginary32: case TOKimaginary64: case TOKimaginary80: \ | |
181 case TOKcomplex32: case TOKcomplex64: case TOKcomplex80: \ | |
182 case TOKvoid | |
183 | |
184 #define CASE_BASIC_TYPES_X(t) \ | |
185 case TOKvoid: t = Type::tvoid; goto LabelX; \ | |
186 case TOKint8: t = Type::tint8; goto LabelX; \ | |
187 case TOKuns8: t = Type::tuns8; goto LabelX; \ | |
188 case TOKint16: t = Type::tint16; goto LabelX; \ | |
189 case TOKuns16: t = Type::tuns16; goto LabelX; \ | |
190 case TOKint32: t = Type::tint32; goto LabelX; \ | |
191 case TOKuns32: t = Type::tuns32; goto LabelX; \ | |
192 case TOKint64: t = Type::tint64; goto LabelX; \ | |
193 case TOKuns64: t = Type::tuns64; goto LabelX; \ | |
194 case TOKfloat32: t = Type::tfloat32; goto LabelX; \ | |
195 case TOKfloat64: t = Type::tfloat64; goto LabelX; \ | |
196 case TOKfloat80: t = Type::tfloat80; goto LabelX; \ | |
197 case TOKimaginary32: t = Type::timaginary32; goto LabelX; \ | |
198 case TOKimaginary64: t = Type::timaginary64; goto LabelX; \ | |
199 case TOKimaginary80: t = Type::timaginary80; goto LabelX; \ | |
200 case TOKcomplex32: t = Type::tcomplex32; goto LabelX; \ | |
201 case TOKcomplex64: t = Type::tcomplex64; goto LabelX; \ | |
202 case TOKcomplex80: t = Type::tcomplex80; goto LabelX; \ | |
203 case TOKbit: t = Type::tbit; goto LabelX; \ | |
204 case TOKbool: t = Type::tbool; goto LabelX; \ | |
205 case TOKchar: t = Type::tchar; goto LabelX; \ | |
206 case TOKwchar: t = Type::twchar; goto LabelX; \ | |
207 case TOKdchar: t = Type::tdchar; goto LabelX; \ | |
208 LabelX | |
209 | |
210 struct Token | |
211 { | |
212 Token *next; | |
213 unsigned char *ptr; // pointer to first character of this token within buffer | |
214 enum TOK value; | |
215 unsigned char *blockComment; // doc comment string prior to this token | |
216 unsigned char *lineComment; // doc comment for previous token | |
217 union | |
218 { | |
219 // Integers | |
220 d_int32 int32value; | |
221 d_uns32 uns32value; | |
222 d_int64 int64value; | |
223 d_uns64 uns64value; | |
224 | |
225 // Floats | |
226 #ifdef IN_GCC | |
227 // real_t float80value; // can't use this in a union! | |
228 #else | |
229 d_float80 float80value; | |
230 #endif | |
231 | |
232 struct | |
233 { unsigned char *ustring; // UTF8 string | |
234 unsigned len; | |
235 unsigned char postfix; // 'c', 'w', 'd' | |
236 }; | |
237 | |
238 Identifier *ident; | |
239 }; | |
240 #ifdef IN_GCC | |
241 real_t float80value; // can't use this in a union! | |
242 #endif | |
243 | |
658
50383e476c7e
Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
599
diff
changeset
|
244 static const char *tochars[TOKMAX]; |
1 | 245 static void *operator new(size_t sz); |
246 | |
247 int isKeyword(); | |
248 void print(); | |
658
50383e476c7e
Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
599
diff
changeset
|
249 const char *toChars(); |
50383e476c7e
Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
599
diff
changeset
|
250 static const char *toChars(enum TOK); |
1 | 251 }; |
252 | |
253 struct Lexer | |
254 { | |
255 static StringTable stringtable; | |
256 static OutBuffer stringbuffer; | |
257 static Token *freelist; | |
258 | |
259 Loc loc; // for error messages | |
260 | |
261 unsigned char *base; // pointer to start of buffer | |
262 unsigned char *end; // past end of buffer | |
263 unsigned char *p; // current character | |
264 Token token; | |
265 Module *mod; | |
266 int doDocComment; // collect doc comment information | |
267 int anyToken; // !=0 means seen at least one token | |
268 int commentToken; // !=0 means comments are TOKcomment's | |
269 | |
270 Lexer(Module *mod, | |
271 unsigned char *base, unsigned begoffset, unsigned endoffset, | |
272 int doDocComment, int commentToken); | |
273 | |
274 static void initKeywords(); | |
275 static Identifier *idPool(const char *s); | |
159 | 276 static Identifier *uniqueId(const char *s); |
277 static Identifier *uniqueId(const char *s, int num); | |
1 | 278 |
279 TOK nextToken(); | |
280 void scan(Token *t); | |
281 Token *peek(Token *t); | |
282 Token *peekPastParen(Token *t); | |
283 unsigned escapeSequence(); | |
284 TOK wysiwygStringConstant(Token *t, int tc); | |
285 TOK hexStringConstant(Token *t); | |
336 | 286 #if DMDV2 |
19 | 287 TOK delimitedStringConstant(Token *t); |
288 TOK tokenStringConstant(Token *t); | |
289 #endif | |
1 | 290 TOK escapeStringConstant(Token *t, int wide); |
291 TOK charConstant(Token *t, int wide); | |
292 void stringPostfix(Token *t); | |
293 unsigned wchar(unsigned u); | |
294 TOK number(Token *t); | |
295 TOK inreal(Token *t); | |
296 void error(const char *format, ...); | |
297 void error(Loc loc, const char *format, ...); | |
298 void pragma(); | |
299 unsigned decodeUTF(); | |
300 void getDocComment(Token *t, unsigned lineComment); | |
301 | |
302 static int isValidIdentifier(char *p); | |
303 static unsigned char *combineComments(unsigned char *c1, unsigned char *c2); | |
304 }; | |
305 | |
306 #endif /* DMD_LEXER_H */ |