@@ -891,6 +891,29 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
891
891
ret @spanned ( lo, hi, ast. expr_if ( cond, thn, els, ast. ann_none ) ) ;
892
892
}
893
893
894
+ impure fn parse_for_expr ( parser p) -> @ast . expr {
895
+ auto lo = p. get_span ( ) ;
896
+ auto hi = lo;
897
+
898
+ expect ( p, token. FOR ) ;
899
+ expect ( p, token. LPAREN ) ;
900
+
901
+ let @ast. local local;
902
+ if ( p. peek ( ) == token. AUTO ) {
903
+ p. bump ( ) ;
904
+ local = parse_auto_local ( p) ;
905
+ } else {
906
+ local = parse_typed_local ( p) ;
907
+ }
908
+ expect ( p, token. IN ) ;
909
+
910
+ auto seq = parse_expr ( p) ;
911
+ expect ( p, token. RPAREN ) ;
912
+ auto body = parse_block ( p) ;
913
+ hi = body. span ;
914
+ ret @spanned ( lo, hi, ast. expr_for ( local, seq, body, ast. ann_none ) ) ;
915
+ }
916
+
894
917
impure fn parse_while_expr ( parser p) -> @ast . expr {
895
918
auto lo = p. get_span ( ) ;
896
919
auto hi = lo;
@@ -979,6 +1002,9 @@ impure fn parse_expr_inner(parser p) -> @ast.expr {
979
1002
case ( token. IF ) {
980
1003
ret parse_if_expr ( p) ;
981
1004
}
1005
+ case ( token. FOR ) {
1006
+ ret parse_for_expr ( p) ;
1007
+ }
982
1008
case ( token. WHILE ) {
983
1009
ret parse_while_expr ( p) ;
984
1010
}
@@ -1052,43 +1078,40 @@ impure fn parse_pat(parser p) -> @ast.pat {
1052
1078
ret @spanned ( lo, hi, pat) ;
1053
1079
}
1054
1080
1055
- impure fn parse_let ( parser p) -> @ast. decl {
1056
- auto lo = p. get_span ( ) ;
1057
-
1058
- expect ( p, token. LET ) ;
1059
- auto ty = parse_ty ( p) ;
1081
+ impure fn parse_local ( & option. t [ @ast. ty ] tyopt, parser p) -> @ast. local {
1060
1082
auto ident = parse_ident ( p) ;
1061
1083
auto init = parse_initializer ( p) ;
1084
+ ret @rec( ty = tyopt,
1085
+ infer = false ,
1086
+ ident = ident,
1087
+ init = init,
1088
+ id = p. next_def_id ( ) ,
1089
+ ann = ast. ann_none ) ;
1090
+ }
1062
1091
1063
- auto hi = p. get_span ( ) ;
1092
+ impure fn parse_typed_local ( parser p) -> @ast. local {
1093
+ auto ty = parse_ty ( p) ;
1094
+ ret parse_local ( some ( ty) , p) ;
1095
+ }
1064
1096
1065
- let ast. local local = rec ( ty = some ( ty) ,
1066
- infer = false ,
1067
- ident = ident,
1068
- init = init,
1069
- id = p. next_def_id ( ) ,
1070
- ann = ast. ann_none ) ;
1097
+ impure fn parse_auto_local ( parser p) -> @ast. local {
1098
+ ret parse_local ( none[ @ast. ty ] , p) ;
1099
+ }
1071
1100
1072
- ret @spanned ( lo, hi, ast. decl_local ( @local) ) ;
1101
+ impure fn parse_let ( parser p) -> @ast. decl {
1102
+ auto lo = p. get_span ( ) ;
1103
+ expect ( p, token. LET ) ;
1104
+ auto local = parse_typed_local ( p) ;
1105
+ auto hi = p. get_span ( ) ;
1106
+ ret @spanned ( lo, hi, ast. decl_local ( local) ) ;
1073
1107
}
1074
1108
1075
1109
impure fn parse_auto ( parser p) -> @ast. decl {
1076
1110
auto lo = p. get_span ( ) ;
1077
-
1078
1111
expect ( p, token. AUTO ) ;
1079
- auto ident = parse_ident ( p) ;
1080
- auto init = parse_initializer ( p) ;
1081
-
1112
+ auto local = parse_auto_local ( p) ;
1082
1113
auto hi = p. get_span ( ) ;
1083
-
1084
- let ast. local local = rec ( ty = none[ @ast. ty ] ,
1085
- infer = true ,
1086
- ident = ident,
1087
- init = init,
1088
- id = p. next_def_id ( ) ,
1089
- ann = ast. ann_none ) ;
1090
-
1091
- ret @spanned ( lo, hi, ast. decl_local ( @local) ) ;
1114
+ ret @spanned ( lo, hi, ast. decl_local ( local) ) ;
1092
1115
}
1093
1116
1094
1117
impure fn parse_stmt ( parser p) -> @ast . stmt {
@@ -1150,6 +1173,11 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
1150
1173
ret @spanned ( lo, e. span , ast. stmt_expr ( e) ) ;
1151
1174
}
1152
1175
1176
+ case ( token. FOR ) {
1177
+ auto e = parse_expr ( p) ;
1178
+ ret @spanned ( lo, e. span , ast. stmt_expr ( e) ) ;
1179
+ }
1180
+
1153
1181
case ( token. WHILE ) {
1154
1182
auto e = parse_expr ( p) ;
1155
1183
ret @spanned ( lo, e. span , ast. stmt_expr ( e) ) ;
@@ -1279,6 +1307,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
1279
1307
case ( ast. expr_lit ( _, _) ) { ret true ; }
1280
1308
case ( ast. expr_cast ( _, _, _) ) { ret true ; }
1281
1309
case ( ast. expr_if ( _, _, _, _) ) { ret false ; }
1310
+ case ( ast. expr_for ( _, _, _, _) ) { ret false ; }
1282
1311
case ( ast. expr_while ( _, _, _) ) { ret false ; }
1283
1312
case ( ast. expr_do_while ( _, _, _) ) { ret false ; }
1284
1313
case ( ast. expr_alt ( _, _, _) ) { ret false ; }
@@ -1289,10 +1318,8 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
1289
1318
case ( ast. expr_field ( _, _, _) ) { ret true ; }
1290
1319
case ( ast. expr_index ( _, _, _) ) { ret true ; }
1291
1320
case ( ast. expr_path ( _, _, _) ) { ret true ; }
1292
- case ( _) { fail; }
1293
1321
}
1294
1322
}
1295
- case ( _) { fail; }
1296
1323
}
1297
1324
}
1298
1325
0 commit comments