@@ -35,6 +35,7 @@ type parser =
35
35
obj {
36
36
fn peek ( ) -> token:: token ;
37
37
fn bump ( ) ;
38
+ fn swap ( token:: token , uint , uint ) ;
38
39
fn look_ahead ( uint ) -> token:: token ;
39
40
fn fatal ( str ) -> ! ;
40
41
fn warn ( str ) ;
@@ -97,6 +98,10 @@ fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: lexer::reader,
97
98
tok_span = next. span ;
98
99
}
99
100
}
101
+ fn swap ( next : token:: token , lo : uint , hi : uint ) {
102
+ tok = next;
103
+ tok_span = ast:: mk_sp ( lo, hi) ;
104
+ }
100
105
fn look_ahead ( distance : uint ) -> token:: token {
101
106
while vec:: len ( buffer) < distance {
102
107
let next = lexer:: next_token ( rdr) ;
@@ -202,6 +207,23 @@ fn expect(p: &parser, t: token::token) {
202
207
}
203
208
}
204
209
210
+ fn expect_gt ( p : & parser ) {
211
+ if p. peek ( ) == token:: GT {
212
+ p. bump ( ) ;
213
+ } else if p. peek ( ) == token:: BINOP ( token:: LSR ) {
214
+ p. swap ( token:: GT , p. get_lo_pos ( ) + 1 u, p. get_hi_pos ( ) ) ;
215
+ } else if p. peek ( ) == token:: BINOP ( token:: ASR ) {
216
+ p. swap ( token:: BINOP ( token:: LSR ) , p. get_lo_pos ( ) + 1 u,
217
+ p. get_hi_pos ( ) ) ;
218
+ } else {
219
+ let s: str = "expecting " ;
220
+ s += token:: to_str ( p. get_reader ( ) , token:: GT ) ;
221
+ s += ", found " ;
222
+ s += token:: to_str ( p. get_reader ( ) , p. peek ( ) ) ;
223
+ p. fatal ( s) ;
224
+ }
225
+ }
226
+
205
227
fn spanned[ T ] ( lo: uint, hi: uint, node: & T ) -> spanned[ T ] {
206
228
ret { node : node, span : ast:: mk_sp ( lo, hi) } ;
207
229
}
@@ -426,24 +448,23 @@ fn parse_ty_postfix(orig_t: ast::ty_, p: &parser, colons_before_params: bool)
426
448
-> @ast:: ty {
427
449
let lo = p. get_lo_pos ( ) ;
428
450
429
- let end ;
451
+ let seq ;
430
452
if p. peek ( ) == token:: LBRACKET {
431
453
p. bump ( ) ;
432
- end = token:: RBRACKET ;
454
+ seq = parse_seq_to_end ( token:: RBRACKET , some ( token:: COMMA ) ,
455
+ bind parse_ty ( _, false ) , p) ;
433
456
} else if colons_before_params && p. peek ( ) == token:: MOD_SEP {
434
457
p. bump ( ) ;
435
458
expect ( p, token:: LT ) ;
436
- end = token:: GT ;
459
+ seq = parse_seq_to_gt ( some ( token:: COMMA ) , bind parse_ty ( _ , false ) , p ) ;
437
460
} else if !colons_before_params && p. peek ( ) == token:: LT {
438
461
p. bump ( ) ;
439
- end = token:: GT ;
462
+ seq = parse_seq_to_gt ( some ( token:: COMMA ) , bind parse_ty ( _ , false ) , p ) ;
440
463
} else {
441
464
ret @spanned ( lo, p. get_lo_pos ( ) , orig_t) ;
442
465
}
443
466
444
467
// If we're here, we have explicit type parameter instantiation.
445
- let seq = parse_seq_to_end ( end, some ( token:: COMMA ) ,
446
- bind parse_ty ( _, false ) , p) ;
447
468
448
469
alt orig_t {
449
470
ast : : ty_path ( pth, ann) {
@@ -554,10 +575,17 @@ fn parse_ty(p: &parser, colons_before_params: bool) -> @ast::ty {
554
575
parse_type_constraints ( p) ) ;
555
576
}
556
577
} else if ( eat_word ( p, "vec" ) ) {
557
- expect ( p, token:: LBRACKET ) ;
558
- t = ast:: ty_vec ( parse_mt ( p) ) ;
559
- hi = p. get_hi_pos ( ) ;
560
- expect ( p, token:: RBRACKET ) ;
578
+ if p. peek ( ) == token:: LBRACKET {
579
+ p. bump ( ) ;
580
+ t = ast:: ty_vec ( parse_mt ( p) ) ;
581
+ hi = p. get_hi_pos ( ) ;
582
+ expect ( p, token:: RBRACKET ) ;
583
+ } else {
584
+ expect ( p, token:: LT ) ;
585
+ t = ast:: ty_vec ( parse_mt ( p) ) ;
586
+ hi = p. get_hi_pos ( ) ;
587
+ expect_gt ( p) ;
588
+ }
561
589
} else if ( p. peek ( ) == token:: LBRACKET ) {
562
590
expect ( p, token:: LBRACKET ) ;
563
591
t = ast:: ty_ivec ( parse_mt ( p) ) ;
@@ -615,6 +643,25 @@ fn parse_fn_block_arg(p: &parser) -> ast::arg {
615
643
ret { mode : m, ty : t, ident : i, id : p. get_id ( ) } ;
616
644
}
617
645
646
+ fn parse_seq_to_gt[ T ] ( sep: option:: t[ token:: token] , f: fn ( & parser) -> T ,
647
+ p: & parser) -> [ T ] {
648
+ let first = true ;
649
+ let v = ~[ ] ;
650
+ while p. peek ( ) != token:: GT &&
651
+ p. peek ( ) != token:: BINOP ( token:: LSR ) &&
652
+ p. peek ( ) != token:: BINOP ( token:: ASR ) {
653
+ alt sep {
654
+ some( t) { if first { first = false ; } else { expect ( p, t) ; } }
655
+ _ { }
656
+ }
657
+ v += ~[ f ( p) ] ;
658
+ }
659
+
660
+ expect_gt ( p) ;
661
+
662
+ ret v;
663
+ }
664
+
618
665
fn parse_seq_to_end[ T ] ( ket: token:: token, sep: option:: t[ token:: token] ,
619
666
f : fn ( & parser) -> T , p: & parser) -> [ T ] {
620
667
let val = parse_seq_to_before_end ( ket, sep, f, p) ;
0 commit comments