@@ -761,7 +761,6 @@ impure fn parse_do_while_expr(parser p) -> @ast.expr {
761
761
expect ( p, token. LPAREN ) ;
762
762
auto cond = parse_expr ( p) ;
763
763
expect ( p, token. RPAREN ) ;
764
- expect ( p, token. SEMI ) ;
765
764
hi = cond. span ;
766
765
ret @spanned ( lo, hi, ast. expr_do_while ( body, cond, ast. ann_none ) ) ;
767
766
}
@@ -891,7 +890,6 @@ impure fn parse_let(parser p) -> @ast.decl {
891
890
auto init = parse_initializer ( p) ;
892
891
893
892
auto hi = p. get_span ( ) ;
894
- expect ( p, token. SEMI ) ;
895
893
896
894
let ast. local local = rec ( ty = some ( ty) ,
897
895
infer = false ,
@@ -911,7 +909,6 @@ impure fn parse_auto(parser p) -> @ast.decl {
911
909
auto init = parse_initializer ( p) ;
912
910
913
911
auto hi = p. get_span ( ) ;
914
- expect ( p, token. SEMI ) ;
915
912
916
913
let ast. local local = rec ( ty = none[ @ast. ty ] ,
917
914
infer = true ,
@@ -931,7 +928,6 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
931
928
p. bump ( ) ;
932
929
auto e = parse_expr ( p) ;
933
930
auto hi = p. get_span ( ) ;
934
- expect ( p, token. SEMI ) ;
935
931
ret @spanned ( lo, hi, ast. stmt_log ( e) ) ;
936
932
}
937
933
@@ -941,7 +937,6 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
941
937
case ( token. LPAREN ) {
942
938
auto e = parse_expr ( p) ;
943
939
auto hi = p. get_span ( ) ;
944
- expect ( p, token. SEMI ) ;
945
940
ret @spanned ( lo, hi, ast. stmt_check_expr ( e) ) ;
946
941
}
947
942
case ( _) {
@@ -954,13 +949,11 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
954
949
p. bump ( ) ;
955
950
alt ( p. peek ( ) ) {
956
951
case ( token. SEMI ) {
957
- p. bump ( ) ;
958
952
ret @spanned ( lo, p. get_span ( ) ,
959
953
ast. stmt_ret ( none[ @ast. expr ] ) ) ;
960
954
}
961
955
case ( _) {
962
956
auto e = parse_expr ( p) ;
963
- expect ( p, token. SEMI ) ;
964
957
ret @spanned ( lo, e. span ,
965
958
ast. stmt_ret ( some[ @ast. expr ] ( e) ) ) ;
966
959
}
@@ -1012,24 +1005,17 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
1012
1005
case ( _) {
1013
1006
auto e = parse_expr ( p) ;
1014
1007
auto hi = p. get_span ( ) ;
1015
- expect ( p, token. SEMI ) ;
1016
1008
ret @spanned ( lo, hi, ast. stmt_expr ( e) ) ;
1017
1009
}
1018
1010
}
1019
1011
p. err ( "expected statement" ) ;
1020
1012
fail;
1021
1013
}
1022
1014
1023
- impure fn parse_block ( parser p) -> ast . block {
1024
- auto f = parse_stmt;
1025
- // FIXME: passing parse_stmt as an lval doesn't work at the moment.
1026
- auto stmts = parse_seq[ @ast. stmt ] ( token. LBRACE ,
1027
- token. RBRACE ,
1028
- none[ token. token ] ,
1029
- f, p) ;
1015
+ fn index_block ( vec[ @ast. stmt] stmts, option. t[ @ast. expr] expr) -> ast. block_ {
1030
1016
auto index = new_str_hash[ uint] ( ) ;
1031
1017
auto u = 0 u;
1032
- for ( @ast. stmt s in stmts. node ) {
1018
+ for ( @ast. stmt s in stmts) {
1033
1019
// FIXME: typestate bug requires we do this up top, not
1034
1020
// down below loop. Sigh.
1035
1021
u += 1 u;
@@ -1056,8 +1042,103 @@ impure fn parse_block(parser p) -> ast.block {
1056
1042
}
1057
1043
}
1058
1044
}
1059
- let ast. block_ b = rec ( stmts=stmts. node , index=index) ;
1060
- ret spanned( stmts. span , stmts. span , b) ;
1045
+ ret rec( stmts=stmts, expr=expr, index=index) ;
1046
+ }
1047
+
1048
+ fn stmt_to_expr ( @ast . stmt stmt) -> option . t[ @ast. expr] {
1049
+ alt ( stmt. node ) {
1050
+ case ( ast. stmt_expr ( ?e) ) { ret some[ @ast. expr ] ( e) ; }
1051
+ case ( _) { /* fall through */ }
1052
+ }
1053
+ ret none[ @ast. expr ] ;
1054
+ }
1055
+
1056
+ fn stmt_ends_with_semi ( @ast . stmt stmt) -> bool {
1057
+ alt ( stmt. node ) {
1058
+ case ( ast. stmt_decl ( _) ) { ret true ; } // FIXME
1059
+ case ( ast. stmt_ret ( _) ) { ret true ; }
1060
+ case ( ast. stmt_log ( _) ) { ret true ; }
1061
+ case ( ast. stmt_check_expr ( _) ) { ret true ; }
1062
+ case ( ast. stmt_expr ( ?e) ) {
1063
+ alt ( e. node ) {
1064
+ case ( ast. expr_vec ( _, _) ) { ret true ; }
1065
+ case ( ast. expr_tup ( _, _) ) { ret true ; }
1066
+ case ( ast. expr_rec ( _, _) ) { ret true ; }
1067
+ case ( ast. expr_call ( _, _, _) ) { ret true ; }
1068
+ case ( ast. expr_binary ( _, _, _, _) ) { ret true ; }
1069
+ case ( ast. expr_unary ( _, _, _) ) { ret true ; }
1070
+ case ( ast. expr_lit ( _, _) ) { ret true ; }
1071
+ case ( ast. expr_cast ( _, _, _) ) { ret true ; }
1072
+ case ( ast. expr_if ( _, _, _, _) ) { ret false ; }
1073
+ case ( ast. expr_while ( _, _, _) ) { ret false ; }
1074
+ case ( ast. expr_do_while ( _, _, _) ) { ret false ; }
1075
+ case ( ast. expr_alt ( _, _, _) ) { ret false ; }
1076
+ case ( ast. expr_block ( _, _) ) { ret false ; }
1077
+ case ( ast. expr_assign ( _, _, _) ) { ret true ; }
1078
+ case ( ast. expr_field ( _, _, _) ) { ret true ; }
1079
+ case ( ast. expr_index ( _, _, _) ) { ret true ; }
1080
+ case ( ast. expr_name ( _, _, _) ) { ret true ; }
1081
+ case ( _) { fail; }
1082
+ }
1083
+ }
1084
+ case ( _) { fail; }
1085
+ }
1086
+ }
1087
+
1088
+ impure fn parse_block ( parser p) -> ast . block {
1089
+ auto lo = p. get_span ( ) ;
1090
+
1091
+ let vec[ @ast. stmt] stmts = vec ( ) ;
1092
+ let option. t[ @ast. expr] expr = none[ @ast. expr ] ;
1093
+
1094
+ expect ( p, token. LBRACE ) ;
1095
+ while ( p. peek ( ) != token. RBRACE ) {
1096
+ alt ( p. peek ( ) ) {
1097
+ case ( token. RBRACE ) {
1098
+ // empty; fall through to next iteration
1099
+ }
1100
+ case ( token. SEMI ) {
1101
+ p. bump ( ) ;
1102
+ // empty
1103
+ }
1104
+ case ( _) {
1105
+ auto stmt = parse_stmt ( p) ;
1106
+ alt ( stmt_to_expr ( stmt) ) {
1107
+ case ( some[ @ast. expr ] ( ?e) ) {
1108
+ alt ( p. peek ( ) ) {
1109
+ case ( token. SEMI ) {
1110
+ p. bump ( ) ;
1111
+ stmts += vec ( stmt) ;
1112
+ }
1113
+ case ( token. RBRACE ) { expr = some ( e) ; }
1114
+ case ( ?t) {
1115
+ if ( stmt_ends_with_semi ( stmt) ) {
1116
+ p. err ( "expected ';' or '}' after " +
1117
+ "expression but found " +
1118
+ token. to_str ( t) ) ;
1119
+ fail;
1120
+ }
1121
+ stmts += vec ( stmt) ;
1122
+ }
1123
+ }
1124
+ }
1125
+ case ( none[ @ast. expr ] ) {
1126
+ // Not an expression statement.
1127
+ stmts += vec ( stmt) ;
1128
+ if ( stmt_ends_with_semi ( stmt) ) {
1129
+ expect ( p, token. SEMI ) ;
1130
+ }
1131
+ }
1132
+ }
1133
+ }
1134
+ }
1135
+ }
1136
+
1137
+ p. bump ( ) ;
1138
+ auto hi = p. get_span ( ) ;
1139
+
1140
+ auto bloc = index_block ( stmts, expr) ;
1141
+ ret spanned[ ast. block_ ] ( lo, hi, bloc) ;
1061
1142
}
1062
1143
1063
1144
impure fn parse_ty_param ( parser p) -> ast. ty_param {
0 commit comments