@@ -2,6 +2,7 @@ import std._io.stdio_reader;
2
2
import std. _str ;
3
3
import std. map ;
4
4
import std. map . hashmap ;
5
+ import util. common ;
5
6
6
7
fn new_str_hash[ V ] ( ) -> map. hashmap [ str, V ] {
7
8
let map. hashfn [ str] hasher = _str. hash ;
@@ -95,6 +96,80 @@ fn new_reader(stdio_reader rdr, str filename) -> reader
95
96
keywords. insert ( "ret" , token. RET ( ) ) ;
96
97
keywords. insert ( "be" , token. BE ( ) ) ;
97
98
99
+ keywords. insert ( "fail" , token. FAIL ( ) ) ;
100
+ keywords. insert ( "drop" , token. DROP ( ) ) ;
101
+
102
+ keywords. insert ( "type" , token. TYPE ( ) ) ;
103
+ keywords. insert ( "check" , token. CHECK ( ) ) ;
104
+ keywords. insert ( "claim" , token. CLAIM ( ) ) ;
105
+ keywords. insert ( "prove" , token. PROVE ( ) ) ;
106
+
107
+ keywords. insert ( "io" , token. IO ( ) ) ;
108
+ keywords. insert ( "state" , token. STATE ( ) ) ;
109
+ keywords. insert ( "unsafe" , token. UNSAFE ( ) ) ;
110
+
111
+ keywords. insert ( "native" , token. NATIVE ( ) ) ;
112
+ keywords. insert ( "mutable" , token. MUTABLE ( ) ) ;
113
+ keywords. insert ( "auto" , token. AUTO ( ) ) ;
114
+
115
+ keywords. insert ( "fn" , token. FN ( ) ) ;
116
+ keywords. insert ( "iter" , token. ITER ( ) ) ;
117
+
118
+ keywords. insert ( "import" , token. IMPORT ( ) ) ;
119
+ keywords. insert ( "export" , token. EXPORT ( ) ) ;
120
+
121
+ keywords. insert ( "let" , token. LET ( ) ) ;
122
+
123
+ keywords. insert ( "log" , token. LOG ( ) ) ;
124
+ keywords. insert ( "spawn" , token. SPAWN ( ) ) ;
125
+ keywords. insert ( "thread" , token. THREAD ( ) ) ;
126
+ keywords. insert ( "yield" , token. YIELD ( ) ) ;
127
+ keywords. insert ( "join" , token. JOIN ( ) ) ;
128
+
129
+ keywords. insert ( "bool" , token. BOOL ( ) ) ;
130
+
131
+ keywords. insert ( "int" , token. INT ( ) ) ;
132
+ keywords. insert ( "uint" , token. UINT ( ) ) ;
133
+ keywords. insert ( "float" , token. FLOAT ( ) ) ;
134
+
135
+ keywords. insert ( "char" , token. CHAR ( ) ) ;
136
+ keywords. insert ( "str" , token. STR ( ) ) ;
137
+
138
+
139
+ keywords. insert ( "rec" , token. REC ( ) ) ;
140
+ keywords. insert ( "tup" , token. TUP ( ) ) ;
141
+ keywords. insert ( "tag" , token. TAG ( ) ) ;
142
+ keywords. insert ( "vec" , token. VEC ( ) ) ;
143
+ keywords. insert ( "any" , token. ANY ( ) ) ;
144
+
145
+ keywords. insert ( "obj" , token. OBJ ( ) ) ;
146
+
147
+ keywords. insert ( "port" , token. PORT ( ) ) ;
148
+ keywords. insert ( "chan" , token. CHAN ( ) ) ;
149
+
150
+ keywords. insert ( "task" , token. TASK ( ) ) ;
151
+
152
+ keywords. insert ( "true" , token. LIT_BOOL ( true ) ) ;
153
+ keywords. insert ( "false" , token. LIT_BOOL ( false ) ) ;
154
+
155
+ keywords. insert ( "in" , token. IN ( ) ) ;
156
+
157
+ keywords. insert ( "as" , token. AS ( ) ) ;
158
+ keywords. insert ( "with" , token. WITH ( ) ) ;
159
+
160
+ keywords. insert ( "bind" , token. BIND ( ) ) ;
161
+
162
+ keywords. insert ( "u8" , token. MACH ( common. ty_u8 ( ) ) ) ;
163
+ keywords. insert ( "u16" , token. MACH ( common. ty_u16 ( ) ) ) ;
164
+ keywords. insert ( "u32" , token. MACH ( common. ty_u32 ( ) ) ) ;
165
+ keywords. insert ( "u64" , token. MACH ( common. ty_u64 ( ) ) ) ;
166
+ keywords. insert ( "i8" , token. MACH ( common. ty_i8 ( ) ) ) ;
167
+ keywords. insert ( "i16" , token. MACH ( common. ty_i16 ( ) ) ) ;
168
+ keywords. insert ( "i32" , token. MACH ( common. ty_i32 ( ) ) ) ;
169
+ keywords. insert ( "i64" , token. MACH ( common. ty_i64 ( ) ) ) ;
170
+ keywords. insert ( "f32" , token. MACH ( common. ty_f32 ( ) ) ) ;
171
+ keywords. insert ( "f64" , token. MACH ( common. ty_f64 ( ) ) ) ;
172
+
98
173
ret reader( rdr, filename, rdr. getc ( ) as char , rdr. getc ( ) as char ,
99
174
1 u, 1 u, keywords, reserved) ;
100
175
}
@@ -125,6 +200,31 @@ fn is_bin_digit(char c) -> bool {
125
200
ret c == '0' || c == '1' ;
126
201
}
127
202
203
+ fn dec_digit_val ( char c) -> int {
204
+ ret ( c as int ) - ( '0' as int ) ;
205
+ }
206
+
207
+ fn hex_digit_val ( char c) -> int {
208
+ if ( in_range ( c, '0' , '9' ) ) {
209
+ ret ( c as int ) - ( '0' as int ) ;
210
+ }
211
+
212
+ if ( in_range ( c, 'a' , 'f' ) ) {
213
+ ret ( c as int ) - ( 'a' as int ) ;
214
+ }
215
+
216
+ if ( in_range ( c, 'A' , 'F' ) ) {
217
+ ret ( c as int ) - ( 'A' as int ) ;
218
+ }
219
+
220
+ fail;
221
+ }
222
+
223
+ fn bin_digit_value ( char c) -> int {
224
+ if ( c == 0 ) { ret 0 ; }
225
+ ret 1 ;
226
+ }
227
+
128
228
fn is_whitespace ( char c) -> bool {
129
229
ret c == ' ' || c == '\t' || c == '\r' || c == '\n' ;
130
230
}
@@ -159,27 +259,54 @@ fn next_token(reader rdr) -> token.token {
159
259
auto c = rdr. curr ( ) ;
160
260
161
261
if ( is_alpha ( c) ) {
162
- while ( is_alpha ( rdr. curr ( ) ) ) {
163
- c = rdr. curr ( ) ;
262
+ while ( is_alpha ( c) || c == '_' ) {
164
263
accum_str += ( c as u8 ) ;
165
264
rdr. bump ( ) ;
265
+ c = rdr. curr ( ) ;
166
266
}
267
+
268
+ auto kwds = rdr. get_keywords ( ) ;
269
+ if ( kwds. contains_key ( accum_str) ) {
270
+ ret kwds. get ( accum_str) ;
271
+ }
272
+
167
273
ret token. IDENT ( accum_str) ;
168
274
}
169
275
170
276
if ( is_dec_digit ( c) ) {
171
- if ( c == '0' ) {
172
- log "fixme: leading zero" ;
173
- fail;
174
- } else {
175
- while ( is_dec_digit ( c) ) {
277
+ auto n = rdr. next ( ) ;
278
+ if ( c == '0' && n == 'x' ) {
279
+ rdr. bump ( ) ;
280
+ rdr. bump ( ) ;
281
+ c = rdr. curr ( ) ;
282
+ while ( is_hex_digit ( c) || c == '_' ) {
283
+ accum_int *= 16 ;
284
+ accum_int += hex_digit_val ( v) ;
285
+ rdr. bump ( ) ;
176
286
c = rdr. curr ( ) ;
177
- accum_int *= 10 ;
178
- accum_int += ( c as int ) - ( '0' as int ) ;
287
+ }
288
+ }
289
+
290
+ if ( c == '0' && n == 'b' ) {
291
+ rdr. bump ( ) ;
292
+ rdr. bump ( ) ;
293
+ c = rdr. curr ( ) ;
294
+ while ( is_hex_digit ( c) || c == '_' ) {
295
+ accum_int *= 2 ;
296
+ accum_int += bit_value ( c) ;
179
297
rdr. bump ( ) ;
298
+ c = rdr. curr ( ) ;
180
299
}
181
- ret token. LIT_INT ( accum_int) ;
182
300
}
301
+
302
+ while ( is_dec_digit ( c) || c == '_' ) {
303
+ accum_int *= 10 ;
304
+ accum_int += dec_digit_val ( v) ;
305
+ rdr. bump ( ) ;
306
+ c = rdr. curr ( ) ;
307
+ }
308
+
309
+ ret token. LIT_INT ( accum_int) ;
183
310
}
184
311
185
312
@@ -206,6 +333,7 @@ fn next_token(reader rdr) -> token.token {
206
333
case ( ']' ) { rdr. bump ( ) ; ret token. RBRACKET ( ) ; }
207
334
case ( '@' ) { rdr. bump ( ) ; ret token. AT ( ) ; }
208
335
case ( '#' ) { rdr. bump ( ) ; ret token. POUND ( ) ; }
336
+ case ( '_' ) { rdr. bump ( ) ; ret token. UNDERSCORE ( ) ; }
209
337
210
338
// Multi-byte tokens.
211
339
case ( '=' ) {
0 commit comments