@@ -382,15 +382,32 @@ fn parse_type_constraints(p: parser) -> [@ast::ty_constr] {
382
382
383
383
fn parse_ty_postfix ( orig_t : ast:: ty_ , p : parser , colons_before_params : bool ,
384
384
lo : uint ) -> @ast:: ty {
385
+
386
+
387
+ fn mk_ty ( p : parser , t : ast:: ty_ , lo : uint , hi : uint ) -> @ast:: ty {
388
+ @{ id: p. get_id ( ) ,
389
+ node: t,
390
+ span: ast_util:: mk_sp ( lo, hi) }
391
+ }
392
+
393
+ if p. token == token:: BINOP ( token:: SLASH ) {
394
+ let orig_hi = p. last_span . hi ;
395
+ alt parse_maybe_vstore ( p) {
396
+ none { }
397
+ some( v) {
398
+ let t = ast:: ty_vstore ( mk_ty ( p, orig_t, lo, orig_hi) , v) ;
399
+ ret mk_ty( p, t, lo, p. last_span . hi ) ;
400
+ }
401
+ }
402
+ }
403
+
385
404
if colons_before_params && p. token == token:: MOD_SEP {
386
405
p. bump ( ) ;
387
406
expect ( p, token:: LT ) ;
388
407
} else if !colons_before_params && p. token == token:: LT {
389
408
p. bump ( ) ;
390
409
} else {
391
- ret @{ id : p. get_id ( ) ,
392
- node : orig_t,
393
- span : ast_util:: mk_sp ( lo, p. last_span . hi ) } ;
410
+ ret mk_ty ( p, orig_t, lo, p. last_span . hi ) ;
394
411
}
395
412
396
413
// If we're here, we have explicit type parameter instantiation.
@@ -399,12 +416,11 @@ fn parse_ty_postfix(orig_t: ast::ty_, p: parser, colons_before_params: bool,
399
416
400
417
alt orig_t {
401
418
ast : : ty_path ( pth, ann) {
402
- ret @{ id : p. get_id ( ) ,
403
- node : ast:: ty_path ( @spanned ( lo, p. last_span . hi ,
404
- { global: pth. node . global ,
405
- idents: pth. node . idents ,
406
- types: seq} ) , ann) ,
407
- span : ast_util:: mk_sp ( lo, p. last_span . hi ) } ;
419
+ ret mk_ty ( p, ast:: ty_path ( @spanned ( lo, p. last_span . hi ,
420
+ { global: pth. node . global ,
421
+ idents: pth. node . idents ,
422
+ types: seq} ) , ann) ,
423
+ lo, p. last_span . hi ) ;
408
424
}
409
425
_ { p. fatal ( "type parameter instantiation only allowed for paths" ) ; }
410
426
}
@@ -428,22 +444,33 @@ fn parse_ret_ty(p: parser) -> (ast::ret_style, @ast::ty) {
428
444
}
429
445
}
430
446
431
- fn parse_region ( p : parser ) -> ast:: region {
432
- let region_ = alt p. token {
433
- token:: IDENT ( sid, _) if p. look_ahead ( 1 u) == token:: DOT {
434
- let string = p. get_str ( sid) ;
435
- p. bump ( ) ; p. bump ( ) ;
436
- if string == "self" {
437
- ast:: re_self
438
- } else if string == "static" {
439
- ast:: re_static
440
- } else {
441
- ast:: re_named ( string)
442
- }
447
+ fn region_from_name ( p : parser , s : option < str > ) -> ast:: region {
448
+ let r = alt s {
449
+ some ( string) {
450
+ if string == "self" {
451
+ ast:: re_self
452
+ } else if string == "static" {
453
+ ast:: re_static
454
+ } else {
455
+ ast:: re_named ( string)
443
456
}
444
- _ { ast : : re_inferred }
457
+ }
458
+ none { ast : : re_inferred }
445
459
} ;
446
- ret { id : p. get_id ( ) , node : region_} ;
460
+
461
+ { id: p. get_id ( ) , node: r}
462
+ }
463
+
464
+ fn parse_region ( p : parser ) -> ast:: region {
465
+ let name =
466
+ alt p. token {
467
+ token:: IDENT ( sid, _) if p. look_ahead ( 1 u) == token:: DOT {
468
+ p. bump ( ) ; p. bump ( ) ;
469
+ some ( p. get_str ( sid) )
470
+ }
471
+ _ { none }
472
+ } ;
473
+ region_from_name ( p, name)
447
474
}
448
475
449
476
fn parse_ty ( p : parser , colons_before_params : bool ) -> @ast:: ty {
@@ -666,6 +693,44 @@ fn have_dollar(p: parser) -> option<ast::mac_> {
666
693
}
667
694
}
668
695
696
+ fn parse_maybe_vstore ( p : parser ) -> option < ast:: vstore > {
697
+ if p. token == token:: BINOP ( token:: SLASH ) {
698
+ p. bump ( ) ;
699
+ alt p. token {
700
+ token:: AT {
701
+ p. bump ( ) ; some ( ast:: vstore_box)
702
+ }
703
+ token:: TILDE {
704
+ p. bump ( ) ; some ( ast:: vstore_uniq)
705
+ }
706
+ token:: UNDERSCORE {
707
+ p. bump ( ) ; some ( ast:: vstore_fixed ( none) )
708
+ }
709
+ token:: LIT_INT ( i, ast:: ty_i) if i >= 0 {
710
+ p. bump ( ) ; some ( ast:: vstore_fixed ( some ( i as uint ) ) )
711
+ }
712
+ token:: BINOP ( token:: AND ) {
713
+ p. bump ( ) ;
714
+ alt p. token {
715
+ token:: IDENT ( sid, _) {
716
+ p. bump ( ) ;
717
+ let n = p. get_str ( sid) ;
718
+ some ( ast:: vstore_slice ( region_from_name ( p, some ( n) ) ) )
719
+ }
720
+ _ {
721
+ some( ast:: vstore_slice ( region_from_name ( p, none) ) )
722
+ }
723
+ }
724
+ }
725
+ _ {
726
+ none
727
+ }
728
+ }
729
+ } else {
730
+ none
731
+ }
732
+ }
733
+
669
734
fn lit_from_token ( p : parser , tok : token:: token ) -> ast:: lit_ {
670
735
alt tok {
671
736
token : : LIT_INT ( i, it) { ast:: lit_int ( i, it) }
@@ -678,7 +743,7 @@ fn lit_from_token(p: parser, tok: token::token) -> ast::lit_ {
678
743
}
679
744
680
745
fn parse_lit ( p : parser ) -> ast:: lit {
681
- let sp = p. span ;
746
+ let lo = p. span . lo ;
682
747
let lit = if eat_word ( p, "true" ) {
683
748
ast:: lit_bool ( true )
684
749
} else if eat_word ( p, "false" ) {
@@ -688,7 +753,7 @@ fn parse_lit(p: parser) -> ast::lit {
688
753
p. bump ( ) ;
689
754
lit_from_token ( p, tok)
690
755
} ;
691
- ret { node : lit, span : sp } ;
756
+ ret { node : lit, span : ast_util :: mk_sp ( lo , p . last_span . hi ) } ;
692
757
}
693
758
694
759
fn is_ident ( t : token:: token ) -> bool {
@@ -891,6 +956,7 @@ fn parse_bottom_expr(p: parser) -> pexpr {
891
956
let es =
892
957
parse_seq_to_end ( token:: RBRACKET , seq_sep ( token:: COMMA ) ,
893
958
parse_expr, p) ;
959
+ hi = p. span . hi ;
894
960
ex = ast:: expr_vec ( es, mutbl) ;
895
961
} else if p. token == token:: POUND_LT {
896
962
p. bump ( ) ;
@@ -988,6 +1054,23 @@ fn parse_bottom_expr(p: parser) -> pexpr {
988
1054
hi = lit. span . hi ;
989
1055
ex = ast:: expr_lit ( @lit) ;
990
1056
}
1057
+
1058
+ // Vstore is legal following expr_lit(lit_str(...)) and expr_vec(...)
1059
+ // only.
1060
+ alt ex {
1061
+ ast : : expr_lit( @{ node: ast:: lit_str ( _) , span : _} ) |
1062
+ ast:: expr_vec ( _, _) {
1063
+ alt parse_maybe_vstore ( p) {
1064
+ none { }
1065
+ some( v) {
1066
+ hi = p. span . hi ;
1067
+ ex = ast:: expr_vstore ( mk_expr ( p, lo, hi, ex) , v) ;
1068
+ }
1069
+ }
1070
+ }
1071
+ _ { }
1072
+ }
1073
+
991
1074
ret mk_pexpr( p, lo, hi, ex) ;
992
1075
}
993
1076
@@ -1194,10 +1277,10 @@ type op_spec = {tok: token::token, op: ast::binop, prec: int};
1194
1277
1195
1278
// FIXME make this a const, don't store it in parser state
1196
1279
fn prec_table ( ) -> @[ op_spec ] {
1197
- ret @[ // 'as' sits between here with 12
1198
- { tok: token:: BINOP ( token:: STAR ) , op: ast:: mul , prec: 11 } ,
1199
- { tok: token:: BINOP ( token:: SLASH ) , op: ast:: div , prec: 11 } ,
1200
- { tok : token :: BINOP ( token :: PERCENT ) , op : ast :: rem , prec : 11 } ,
1280
+ ret @[ { tok : token :: BINOP ( token :: STAR ) , op : ast :: mul , prec : 12 } ,
1281
+ { tok: token:: BINOP ( token:: SLASH ) , op: ast:: div , prec: 12 } ,
1282
+ { tok: token:: BINOP ( token:: PERCENT ) , op: ast:: rem , prec: 12 } ,
1283
+ // 'as' sits between here with 11
1201
1284
{ tok: token:: BINOP ( token:: PLUS ) , op: ast:: add, prec: 10 } ,
1202
1285
{ tok: token:: BINOP ( token:: MINUS ) , op: ast:: subtract, prec: 10 } ,
1203
1286
{ tok: token:: BINOP ( token:: LSL ) , op: ast:: lsl, prec: 9 } ,
@@ -1222,7 +1305,7 @@ fn parse_binops(p: parser) -> @ast::expr {
1222
1305
1223
1306
const unop_prec: int = 100 ;
1224
1307
1225
- const as_prec: int = 12 ;
1308
+ const as_prec: int = 11 ;
1226
1309
1227
1310
fn parse_more_binops ( p : parser , plhs : pexpr , min_prec : int ) ->
1228
1311
@ast:: expr {
0 commit comments