@@ -15,6 +15,8 @@ state type parser =
15
15
fn peek( ) -> token. token ;
16
16
impure fn bump ( ) ;
17
17
impure fn err ( str s) ;
18
+ impure fn restrict ( bool r) ;
19
+ fn is_restricted ( ) -> bool ;
18
20
fn get_session ( ) -> session . session;
19
21
fn get_span ( ) -> common . span;
20
22
fn next_def_id ( ) -> ast. def_id ;
@@ -27,6 +29,7 @@ impure fn new_parser(session.session sess,
27
29
mutable common. pos lo,
28
30
mutable common. pos hi,
29
31
mutable ast. def_num def,
32
+ mutable bool restricted,
30
33
ast. crate_num crate,
31
34
lexer. reader rdr)
32
35
{
@@ -47,6 +50,14 @@ impure fn new_parser(session.session sess,
47
50
sess. span_err ( span, m) ;
48
51
}
49
52
53
+ impure fn restrict ( bool r) {
54
+ restricted = r;
55
+ }
56
+
57
+ fn is_restricted ( ) -> bool {
58
+ ret restricted;
59
+ }
60
+
50
61
fn get_session ( ) -> session . session {
51
62
ret sess;
52
63
}
@@ -65,7 +76,7 @@ impure fn new_parser(session.session sess,
65
76
auto rdr = lexer. new_reader ( srdr, path) ;
66
77
auto npos = rdr. get_curr_pos ( ) ;
67
78
ret stdio_parser ( sess, lexer. next_token ( rdr) ,
68
- npos, npos, 0 , crate , rdr) ;
79
+ npos, npos, 0 , false , crate , rdr) ;
69
80
}
70
81
71
82
impure fn unexpected ( parser p, token. token t) {
@@ -481,6 +492,32 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
481
492
ex = ast. expr_rec ( fs. node , ast. ann_none ) ;
482
493
}
483
494
495
+ case ( token. BIND ) {
496
+ p. bump ( ) ;
497
+ auto e = parse_restricted_expr ( p) ;
498
+ impure fn parse_expr_opt ( parser p) -> option . t[ @ast. expr] {
499
+ log "parse expr opt: " + token. to_str ( p. peek ( ) ) ;
500
+ alt ( p. peek ( ) ) {
501
+ case ( token. UNDERSCORE ) {
502
+ p. bump ( ) ;
503
+ ret none[ @ast. expr ] ;
504
+ }
505
+ case ( _) {
506
+ ret some[ @ast. expr ] ( parse_expr ( p) ) ;
507
+ }
508
+ }
509
+ }
510
+
511
+ auto pf = parse_expr_opt;
512
+ auto es = parse_seq[ option. t [ @ast. expr ] ] ( token. LPAREN ,
513
+ token. RPAREN ,
514
+ some ( token. COMMA ) ,
515
+ pf, p) ;
516
+ hi = es. span ;
517
+ auto e_ = ast. expr_bind ( e, es. node , ast. ann_none ) ;
518
+ e = @spanned ( lo, hi, e_) ;
519
+ }
520
+
484
521
case ( _) {
485
522
alt ( parse_lit ( p) ) {
486
523
case ( some[ ast. lit ] ( ?lit) ) {
@@ -505,15 +542,19 @@ impure fn parse_path_expr(parser p) -> @ast.expr {
505
542
alt ( p. peek ( ) ) {
506
543
507
544
case ( token. LPAREN ) {
508
- // Call expr.
509
- auto pf = parse_expr;
510
- auto es = parse_seq[ @ast. expr ] ( token. LPAREN ,
511
- token. RPAREN ,
512
- some ( token. COMMA ) ,
513
- pf, p) ;
514
- hi = es. span ;
515
- auto e_ = ast. expr_call ( e, es. node , ast. ann_none ) ;
516
- e = @spanned ( lo, hi, e_) ;
545
+ if ( p. is_restricted ( ) ) {
546
+ ret e;
547
+ } else {
548
+ // Call expr.
549
+ auto pf = parse_expr;
550
+ auto es = parse_seq[ @ast. expr ] ( token. LPAREN ,
551
+ token. RPAREN ,
552
+ some ( token. COMMA ) ,
553
+ pf, p) ;
554
+ hi = es. span ;
555
+ auto e_ = ast. expr_call ( e, es. node , ast. ann_none ) ;
556
+ e = @spanned ( lo, hi, e_) ;
557
+ }
517
558
}
518
559
519
560
case ( token. DOT ) {
@@ -865,7 +906,24 @@ impure fn parse_alt_expr(parser p) -> @ast.expr {
865
906
ret @spanned ( lo, hi, expr) ;
866
907
}
867
908
909
+
910
+ impure fn parse_restricted_expr ( parser p) -> @ast . expr {
911
+ ret parse_expr_res ( p, true ) ;
912
+ }
913
+
868
914
impure fn parse_expr ( parser p) -> @ast . expr {
915
+ ret parse_expr_res ( p, false ) ;
916
+ }
917
+
918
+ impure fn parse_expr_res ( parser p, bool restrict ) -> @ast . expr {
919
+ auto old = p. is_restricted ( ) ;
920
+ p. restrict ( restrict) ;
921
+ auto e = parse_expr_inner ( p) ;
922
+ p. restrict ( old) ;
923
+ ret e;
924
+ }
925
+
926
+ impure fn parse_expr_inner ( parser p) -> @ast . expr {
869
927
alt ( p. peek ( ) ) {
870
928
case ( token. LBRACE ) {
871
929
auto blk = parse_block ( p) ;
0 commit comments