@@ -166,34 +166,252 @@ state fn parse_bottom_expr(parser p) -> @ast.expr {
166
166
ret e;
167
167
}
168
168
169
+ case ( token. TUP ) {
170
+ p. bump ( ) ;
171
+ auto pf = parse_expr;
172
+ auto es = parse_seq[ @ast. expr ] ( token. LPAREN ,
173
+ token. RPAREN ,
174
+ some ( token. COMMA ) ,
175
+ pf, p) ;
176
+ ret @ast. expr_tup ( es) ;
177
+ }
178
+
179
+ case ( token. VEC ) {
180
+ p. bump ( ) ;
181
+ auto pf = parse_expr;
182
+ auto es = parse_seq[ @ast. expr ] ( token. LPAREN ,
183
+ token. RPAREN ,
184
+ some ( token. COMMA ) ,
185
+ pf, p) ;
186
+ ret @ast. expr_vec ( es) ;
187
+ }
188
+
189
+ case ( token. REC ) {
190
+ p. bump ( ) ;
191
+ state fn parse_entry ( parser p) ->
192
+ tup ( ast . ident, @ast . expr) {
193
+ auto i = parse_ident ( p) ;
194
+ expect ( p, token. EQ ) ;
195
+ auto e = parse_expr ( p) ;
196
+ ret tup( i, e) ;
197
+ }
198
+ auto pf = parse_entry;
199
+ auto es =
200
+ parse_seq[ tup ( ast. ident , @ast. expr ) ] ( token. LPAREN ,
201
+ token. RPAREN ,
202
+ some ( token. COMMA ) ,
203
+ pf, p) ;
204
+ ret @ast. expr_rec ( es) ;
205
+ }
206
+
207
+ case ( token. IDENT ( ?i) ) {
208
+ p. bump ( ) ;
209
+ ret @ast. expr_ident ( i) ;
210
+ }
211
+
169
212
case ( _) {
170
213
ret @ast. expr_lit ( parse_lit ( p) ) ;
171
214
}
172
215
}
173
216
}
174
217
218
+ state fn parse_path_expr ( parser p) -> @ast . expr {
219
+ auto e = parse_bottom_expr ( p) ;
220
+ while ( true ) {
221
+ alt ( p. peek ( ) ) {
222
+ case ( token. DOT ) {
223
+ p. bump ( ) ;
224
+ alt ( p. peek ( ) ) {
225
+
226
+ case ( token. IDENT ( ?i) ) {
227
+ p. bump ( ) ;
228
+ e = @ast. expr_field ( e, i) ;
229
+ }
230
+
231
+ case ( token. LPAREN ) {
232
+ auto ix = parse_bottom_expr ( p) ;
233
+ e = @ast. expr_index ( e, ix) ;
234
+ }
235
+ }
236
+ }
237
+ case ( _) {
238
+ ret e;
239
+ }
240
+ }
241
+ }
242
+ ret e;
243
+ }
175
244
176
- state fn parse_negation_expr ( parser p) -> @ast . expr {
245
+ state fn parse_prefix_expr ( parser p) -> @ast . expr {
177
246
alt ( p. peek ( ) ) {
178
247
179
248
case ( token. NOT ) {
180
- auto e = parse_negation_expr ( p) ;
249
+ auto e = parse_prefix_expr ( p) ;
181
250
ret @ast. expr_unary ( ast. not , e) ;
182
251
}
183
252
184
253
case ( token. TILDE ) {
185
- auto e = parse_negation_expr ( p) ;
254
+ auto e = parse_prefix_expr ( p) ;
186
255
ret @ast. expr_unary ( ast. bitnot , e) ;
187
256
}
188
257
258
+ case ( token. BINOP ( ?b) ) {
259
+ alt ( b) {
260
+
261
+ case ( token. MINUS ) {
262
+ auto e = parse_prefix_expr ( p) ;
263
+ ret @ast. expr_unary ( ast. neg , e) ;
264
+ }
265
+
266
+ case ( token. STAR ) {
267
+ auto e = parse_prefix_expr ( p) ;
268
+ ret @ast. expr_unary ( ast. deref , e) ;
269
+ }
270
+
271
+ case ( _) {
272
+ ret parse_path_expr ( p) ;
273
+ }
274
+ }
275
+ }
276
+
277
+ case ( token. AT ) {
278
+ p. bump ( ) ;
279
+ auto e = parse_prefix_expr ( p) ;
280
+ ret @ast. expr_unary ( ast. box , e) ;
281
+ }
282
+
189
283
case ( _) {
190
- ret parse_bottom_expr ( p) ;
284
+ ret parse_path_expr ( p) ;
285
+ }
286
+ }
287
+ }
288
+
289
+ state fn parse_binops ( parser p,
290
+ ( state fn( parser ) -> @ast. expr) sub ,
291
+ vec[ tup( token. binop, ast. binop) ] ops )
292
+ -> @ast . expr {
293
+ auto e = sub ( p) ;
294
+ auto more = true ;
295
+ while ( more) {
296
+ more = false ;
297
+ auto t = p. peek ( ) ;
298
+ alt ( t) {
299
+ case ( token. BINOP ( ?op) ) {
300
+ for ( tup( token. binop, ast. binop) pair in ops) {
301
+ if ( pair. _0 == op) {
302
+ e = @ast. expr_binary ( pair. _1 , e, sub ( p) ) ;
303
+ more = true ;
304
+ t = p. peek ( ) ;
305
+ }
306
+ }
307
+ }
308
+ case ( _) {
309
+ }
310
+ }
311
+ }
312
+ ret e;
313
+ }
314
+
315
+ state fn parse_binary_exprs ( parser p,
316
+ ( state fn( parser ) -> @ast. expr) sub ,
317
+ vec[ tup( token. token, ast. binop) ] ops )
318
+ -> @ast . expr {
319
+ auto e = sub ( p) ;
320
+ auto more = true ;
321
+ while ( more) {
322
+ more = false ;
323
+ auto t = p. peek ( ) ;
324
+ for ( tup( token. token, ast. binop) pair in ops) {
325
+ if ( pair. _0 == t) {
326
+ e = @ast. expr_binary ( pair. _1 , e, sub ( p) ) ;
327
+ more = true ;
328
+ t = p. peek ( ) ;
329
+ }
191
330
}
192
331
}
332
+ ret e;
333
+ }
334
+
335
+ state fn parse_factor_expr ( parser p) -> @ast . expr {
336
+ auto sub = parse_prefix_expr;
337
+ ret parse_binops ( p, sub, vec ( tup ( token. STAR , ast. mul ) ,
338
+ tup ( token. SLASH , ast. div ) ,
339
+ tup ( token. PERCENT , ast. rem ) ) ) ;
340
+ }
341
+
342
+ state fn parse_term_expr ( parser p) -> @ast . expr {
343
+ auto sub = parse_factor_expr;
344
+ ret parse_binops ( p, sub, vec ( tup ( token. PLUS , ast. add ) ,
345
+ tup ( token. MINUS , ast. sub ) ) ) ;
346
+ }
347
+
348
+ state fn parse_shift_expr ( parser p) -> @ast . expr {
349
+ auto sub = parse_term_expr;
350
+ ret parse_binops ( p, sub, vec ( tup ( token. LSL , ast. lsl ) ,
351
+ tup ( token. LSR , ast. lsr ) ,
352
+ tup ( token. ASR , ast. asr ) ) ) ;
353
+ }
354
+
355
+ state fn parse_bitand_expr ( parser p) -> @ast . expr {
356
+ auto sub = parse_shift_expr;
357
+ ret parse_binops ( p, sub, vec ( tup ( token. AND , ast. bitand ) ) ) ;
358
+ }
359
+
360
+ state fn parse_bitxor_expr ( parser p) -> @ast . expr {
361
+ auto sub = parse_bitand_expr;
362
+ ret parse_binops ( p, sub, vec ( tup ( token. CARET , ast. bitxor ) ) ) ;
363
+ }
364
+
365
+ state fn parse_bitor_expr ( parser p) -> @ast . expr {
366
+ auto sub = parse_bitxor_expr;
367
+ ret parse_binops ( p, sub, vec ( tup ( token. OR , ast. bitor ) ) ) ;
368
+ }
369
+
370
+ state fn parse_cast_expr ( parser p) -> @ast . expr {
371
+ auto e = parse_bitor_expr ( p) ;
372
+ while ( true ) {
373
+ alt ( p. peek ( ) ) {
374
+ case ( token. AS ) {
375
+ p. bump ( ) ;
376
+ auto t = parse_ty ( p) ;
377
+ e = @ast. expr_cast ( e, t) ;
378
+ }
379
+
380
+ case ( _) {
381
+ ret e;
382
+ }
383
+ }
384
+ }
385
+ ret e;
386
+ }
387
+
388
+ state fn parse_relational_expr ( parser p) -> @ast . expr {
389
+ auto sub = parse_cast_expr;
390
+ ret parse_binary_exprs ( p, sub, vec ( tup ( token. LT , ast. lt ) ,
391
+ tup ( token. LE , ast. le ) ,
392
+ tup ( token. GE , ast. ge ) ,
393
+ tup ( token. GT , ast. gt ) ) ) ;
394
+ }
395
+
396
+
397
+ state fn parse_equality_expr ( parser p) -> @ast . expr {
398
+ auto sub = parse_relational_expr;
399
+ ret parse_binary_exprs ( p, sub, vec ( tup ( token. EQEQ , ast. eq ) ,
400
+ tup ( token. NE , ast. ne ) ) ) ;
401
+ }
402
+
403
+ state fn parse_and_expr ( parser p) -> @ast . expr {
404
+ auto sub = parse_equality_expr;
405
+ ret parse_binary_exprs ( p, sub, vec ( tup ( token. ANDAND , ast. and ) ) ) ;
406
+ }
407
+
408
+ state fn parse_or_expr ( parser p) -> @ast . expr {
409
+ auto sub = parse_and_expr;
410
+ ret parse_binary_exprs ( p, sub, vec ( tup ( token. OROR , ast. or ) ) ) ;
193
411
}
194
412
195
413
state fn parse_expr ( parser p) -> @ast . expr {
196
- ret parse_negation_expr ( p) ;
414
+ ret parse_or_expr ( p) ;
197
415
}
198
416
199
417
state fn parse_stmt ( parser p) -> @ast . stmt {
@@ -221,7 +439,7 @@ state fn parse_block(parser p) -> ast.block {
221
439
state fn parse_slot_ident_pair ( parser p) ->
222
440
rec ( ast. slot slot , ast . ident ident) {
223
441
auto s = parse_slot ( p) ;
224
- auto i = parse_ident ( p) ;
442
+ auto i = parse_ident ( p) ;
225
443
ret rec( slot=s, ident=i) ;
226
444
}
227
445
0 commit comments