Mercurial > projects > ddmd
annotate dmd/Token.d @ 114:e28b18c23469
added a module dmd.common for commonly used stuff
it currently holds code for consistency checking of predefined versions
also added a VisualD project file
author | Trass3r |
---|---|
date | Wed, 01 Sep 2010 18:21:58 +0200 |
parents | 43073c7c7769 |
children | af724d3510d7 |
rev | line source |
---|---|
0 | 1 module dmd.Token; |
2 | |
114 | 3 import dmd.common; |
0 | 4 import dmd.TOK; |
5 import dmd.Identifier; | |
6 import dmd.OutBuffer; | |
7 import dmd.Utf; | |
8 | |
9 import core.stdc.stdio; | |
10 import core.stdc.ctype; | |
11 | |
12 struct Token | |
13 { | |
14 Token* next; | |
15 ubyte* ptr; // pointer to first character of this token within buffer | |
16 TOK value; | |
79 | 17 string blockComment; // doc comment string prior to this token |
18 string lineComment; // doc comment for previous token | |
0 | 19 |
20 union | |
21 { | |
22 // Integers | |
23 int int32value; | |
24 uint uns32value; | |
25 long int64value; | |
26 ulong uns64value; | |
27 | |
28 // Floats | |
29 version (IN_GCC) { | |
30 // real_t float80value; // can't use this in a union! | |
31 } else { | |
32 real float80value; | |
33 } | |
34 | |
35 struct | |
36 { | |
37 const(char)* ustring; // UTF8 string | |
38 uint len; | |
39 ubyte postfix; // 'c', 'w', 'd' | |
40 }; | |
41 | |
42 Identifier ident; | |
43 } | |
44 | |
45 version (IN_GCC) { | |
46 real float80value; // can't use this in a union! | |
47 } | |
48 | |
49 static string tochars[TOK.TOKMAX]; | |
50 /// static void *operator new(size_t sz); | |
51 | |
52 int isKeyword() | |
53 { | |
54 assert(false); | |
55 } | |
56 | |
57 void print() | |
58 { | |
59 assert(false); | |
60 } | |
61 | |
62 string toChars() | |
63 { | |
64 static char buffer[3 + 3 * value.sizeof + 1]; | |
65 | |
66 string p; | |
67 | |
68 switch (value) | |
69 { | |
70 case TOK.TOKint32v: | |
71 version (IN_GCC) { | |
72 sprintf(buffer.ptr,"%d",cast(int)int64value); | |
73 } else { | |
74 sprintf(buffer.ptr,"%d",int32value); | |
75 } | |
76 break; | |
77 | |
78 case TOK.TOKuns32v: | |
79 case TOK.TOKcharv: | |
80 case TOK.TOKwcharv: | |
81 case TOK.TOKdcharv: | |
82 version (IN_GCC) { | |
83 sprintf(buffer.ptr,"%uU",cast(uint)uns64value); | |
84 } else { | |
85 sprintf(buffer.ptr,"%uU",uns32value); | |
86 } | |
87 break; | |
88 | |
89 case TOK.TOKint64v: | |
90 sprintf(buffer.ptr,"%jdL",int64value); | |
91 break; | |
92 | |
93 case TOK.TOKuns64v: | |
94 sprintf(buffer.ptr,"%juUL",uns64value); | |
95 break; | |
96 | |
97 version (IN_GCC) { | |
98 case TOK.TOKfloat32v: | |
99 case TOK.TOKfloat64v: | |
100 case TOK.TOKfloat80v: | |
101 float80value.format(buffer, sizeof(buffer)); | |
102 break; | |
103 case TOK.TOKimaginary32v: | |
104 case TOK.TOKimaginary64v: | |
105 case TOK.TOKimaginary80v: | |
106 float80value.format(buffer, sizeof(buffer)); | |
107 // %% buffer | |
108 strcat(buffer, "i"); | |
109 break; | |
110 } else { | |
111 case TOK.TOKfloat32v: | |
112 sprintf(buffer.ptr,"%Lgf", float80value); | |
113 break; | |
114 | |
115 case TOK.TOKfloat64v: | |
116 sprintf(buffer.ptr,"%Lg", float80value); | |
117 break; | |
118 | |
119 case TOK.TOKfloat80v: | |
120 sprintf(buffer.ptr,"%LgL", float80value); | |
121 break; | |
122 | |
123 case TOK.TOKimaginary32v: | |
124 sprintf(buffer.ptr,"%Lgfi", float80value); | |
125 break; | |
126 | |
127 case TOK.TOKimaginary64v: | |
128 sprintf(buffer.ptr,"%Lgi", float80value); | |
129 break; | |
130 | |
131 case TOK.TOKimaginary80v: | |
132 sprintf(buffer.ptr,"%LgLi", float80value); | |
133 break; | |
134 } | |
135 | |
136 case TOK.TOKstring: | |
137 version (CSTRINGS) { | |
138 p = string; | |
139 } else { | |
16
5c9b78899f5d
Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
140 { OutBuffer buf = new OutBuffer(); |
0 | 141 |
142 buf.writeByte('"'); | |
143 for (size_t i = 0; i < len; ) | |
144 { | |
145 dchar c; ///! | |
146 | |
147 utf_decodeChar(ustring[0..len], &i, &c); | |
148 switch (c) | |
149 { | |
150 case 0: | |
151 break; | |
152 | |
153 case '"': | |
154 case '\\': | |
155 buf.writeByte('\\'); | |
156 default: | |
157 if (isprint(c)) | |
158 buf.writeByte(c); | |
159 else if (c <= 0x7F) | |
160 buf.printf("\\x%02x", c); | |
161 else if (c <= 0xFFFF) | |
162 buf.printf("\\u%04x", c); | |
163 else | |
164 buf.printf("\\U%08x", c); | |
165 continue; | |
166 } | |
167 break; | |
168 } | |
169 buf.writeByte('"'); | |
170 if (postfix) | |
171 buf.writeByte('"'); | |
172 buf.writeByte(0); | |
173 p = buf.extractString(); | |
174 } | |
175 } | |
176 break; | |
177 | |
178 case TOK.TOKidentifier: | |
179 case TOK.TOKenum: | |
180 case TOK.TOKstruct: | |
181 case TOK.TOKimport: | |
182 case TOK.TOKwchar: case TOK.TOKdchar: | |
183 case TOK.TOKbit: case TOK.TOKbool: case TOK.TOKchar: | |
184 case TOK.TOKint8: case TOK.TOKuns8: | |
185 case TOK.TOKint16: case TOK.TOKuns16: | |
186 case TOK.TOKint32: case TOK.TOKuns32: | |
187 case TOK.TOKint64: case TOK.TOKuns64: | |
188 case TOK.TOKfloat32: case TOK.TOKfloat64: case TOK.TOKfloat80: | |
189 case TOK.TOKimaginary32: case TOK.TOKimaginary64: case TOK.TOKimaginary80: | |
190 case TOK.TOKcomplex32: case TOK.TOKcomplex64: case TOK.TOKcomplex80: | |
191 case TOK.TOKvoid: | |
192 p = ident.toChars(); | |
193 break; | |
194 | |
195 default: | |
196 p = toChars(value); | |
197 break; | |
198 } | |
199 return p; | |
200 } | |
201 | |
202 static string toChars(TOK value) | |
203 { | |
204 string p; | |
205 static char buffer[3 + 3 * value.sizeof + 1]; | |
206 | |
207 p = tochars[value]; | |
208 if (!p) | |
209 { | |
210 int len = sprintf(buffer.ptr, "TOK%d".ptr, value); | |
211 p = buffer[0..len].idup; | |
212 } | |
213 | |
214 return p; | |
215 } | |
16
5c9b78899f5d
Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
216 } |