@@ -181,7 +181,7 @@ impl<'a> Parser<'a> {
181
181
fn parse_use ( & mut self ) -> Result < Use , ParseErrorAndPos > {
182
182
self . expect_token ( TokenKind :: Use ) ?;
183
183
let use_declaration = self . parse_use_inner ( ) ?;
184
- self . expect_semicolon ( ) ?;
184
+ self . skip_semicolon ( ) ?;
185
185
186
186
Ok ( use_declaration)
187
187
}
@@ -325,7 +325,7 @@ impl<'a> Parser<'a> {
325
325
self . expect_token ( TokenKind :: RBrace ) ?;
326
326
Some ( elements)
327
327
} else {
328
- self . expect_token ( TokenKind :: Semicolon ) ?;
328
+ self . skip_semicolon ( ) ?;
329
329
None
330
330
} ;
331
331
@@ -372,7 +372,7 @@ impl<'a> Parser<'a> {
372
372
let ty = self . parse_type ( ) ?;
373
373
self . expect_token ( TokenKind :: Eq ) ?;
374
374
let expr = self . parse_expression ( ) ?;
375
- self . expect_semicolon ( ) ?;
375
+ self . skip_semicolon ( ) ?;
376
376
let span = self . span_from ( start) ;
377
377
378
378
Ok ( Const {
@@ -447,7 +447,7 @@ impl<'a> Parser<'a> {
447
447
None
448
448
} ;
449
449
450
- self . expect_semicolon ( ) ?;
450
+ self . skip_semicolon ( ) ?;
451
451
let span = self . span_from ( start) ;
452
452
453
453
let mut global = Global {
@@ -976,22 +976,22 @@ impl<'a> Parser<'a> {
976
976
}
977
977
978
978
fn parse_function_block ( & mut self ) -> Result < Option < Box < ExprBlockType > > , ParseErrorAndPos > {
979
- if self . token . is ( TokenKind :: Semicolon ) {
980
- self . advance_token ( ) ?;
981
-
982
- Ok ( None )
983
- } else if self . token . is ( TokenKind :: Eq ) {
979
+ if self . token . is ( TokenKind :: Eq ) {
984
980
let expr = self . parse_function_block_expression ( ) ?;
985
981
986
982
Ok ( Some ( expr) )
987
- } else {
983
+ } else if self . token . is ( TokenKind :: LBrace ) {
988
984
let block = self . parse_block ( ) ?;
989
985
990
986
if let Expr :: Block ( block_type) = * block {
991
987
Ok ( Some ( Box :: new ( block_type) ) )
992
988
} else {
993
989
unreachable ! ( )
994
990
}
991
+ } else {
992
+ self . skip_semicolon ( ) ?;
993
+
994
+ Ok ( None )
995
995
}
996
996
}
997
997
@@ -1012,7 +1012,7 @@ impl<'a> Parser<'a> {
1012
1012
1013
1013
_ => {
1014
1014
let expr = self . parse_expression ( ) ?;
1015
- self . expect_token ( TokenKind :: Semicolon ) ?;
1015
+ self . skip_semicolon ( ) ?;
1016
1016
Ok ( Box :: new ( ExprBlockType {
1017
1017
id : self . generate_id ( ) ,
1018
1018
pos : expr. pos ( ) ,
@@ -1124,18 +1124,12 @@ impl<'a> Parser<'a> {
1124
1124
1125
1125
match stmt_or_expr {
1126
1126
StmtOrExpr :: Stmt ( stmt) => Ok ( stmt) ,
1127
- StmtOrExpr :: Expr ( expr) => {
1128
- if expr. needs_semicolon ( ) {
1129
- Err ( self . expect_semicolon ( ) . unwrap_err ( ) )
1130
- } else {
1131
- Ok ( Box :: new ( Stmt :: create_expr (
1132
- self . generate_id ( ) ,
1133
- expr. pos ( ) ,
1134
- expr. span ( ) ,
1135
- expr,
1136
- ) ) )
1137
- }
1138
- }
1127
+ StmtOrExpr :: Expr ( expr) => Ok ( Box :: new ( Stmt :: create_expr (
1128
+ self . generate_id ( ) ,
1129
+ expr. pos ( ) ,
1130
+ expr. span ( ) ,
1131
+ expr,
1132
+ ) ) ) ,
1139
1133
}
1140
1134
}
1141
1135
@@ -1154,7 +1148,7 @@ impl<'a> Parser<'a> {
1154
1148
let data_type = self . parse_var_type ( ) ?;
1155
1149
let expr = self . parse_var_assignment ( ) ?;
1156
1150
1157
- self . expect_semicolon ( ) ?;
1151
+ self . skip_semicolon ( ) ?;
1158
1152
let span = self . span_from ( start) ;
1159
1153
1160
1154
Ok ( Box :: new ( Stmt :: create_let (
@@ -1254,10 +1248,7 @@ impl<'a> Parser<'a> {
1254
1248
match stmt_or_expr {
1255
1249
StmtOrExpr :: Stmt ( stmt) => stmts. push ( stmt) ,
1256
1250
StmtOrExpr :: Expr ( curr_expr) => {
1257
- if curr_expr. needs_semicolon ( ) {
1258
- expr = Some ( curr_expr) ;
1259
- break ;
1260
- } else if !self . token . is ( TokenKind :: RBrace ) {
1251
+ if !self . token . is ( TokenKind :: RBrace ) {
1261
1252
stmts. push ( Box :: new ( Stmt :: create_expr (
1262
1253
self . generate_id ( ) ,
1263
1254
curr_expr. pos ( ) ,
@@ -1295,20 +1286,8 @@ impl<'a> Parser<'a> {
1295
1286
TokenKind :: For => Ok ( StmtOrExpr :: Stmt ( self . parse_for ( ) ?) ) ,
1296
1287
_ => {
1297
1288
let expr = self . parse_expression ( ) ?;
1298
-
1299
- if self . token . is ( TokenKind :: Semicolon ) {
1300
- self . expect_token ( TokenKind :: Semicolon ) ?;
1301
- let span = self . span_from ( expr. span ( ) . start ( ) ) ;
1302
-
1303
- Ok ( StmtOrExpr :: Stmt ( Box :: new ( Stmt :: create_expr (
1304
- self . generate_id ( ) ,
1305
- expr. pos ( ) ,
1306
- span,
1307
- expr,
1308
- ) ) ) )
1309
- } else {
1310
- Ok ( StmtOrExpr :: Expr ( expr) )
1311
- }
1289
+ self . skip_semicolon ( ) ?;
1290
+ Ok ( StmtOrExpr :: Expr ( expr) )
1312
1291
}
1313
1292
}
1314
1293
}
@@ -1522,14 +1501,12 @@ impl<'a> Parser<'a> {
1522
1501
fn parse_return ( & mut self ) -> StmtResult {
1523
1502
let start = self . token . span . start ( ) ;
1524
1503
let pos = self . expect_token ( TokenKind :: Return ) ?. position ;
1525
- let expr = if self . token . is ( TokenKind :: Semicolon ) {
1526
- None
1527
- } else {
1528
- let expr = self . parse_expression ( ) ?;
1529
- Some ( expr)
1504
+ let expr = match self . token . kind {
1505
+ TokenKind :: Semicolon | TokenKind :: RBrace => None ,
1506
+ _ => Some ( self . parse_expression ( ) ?) ,
1530
1507
} ;
1531
1508
1532
- self . expect_semicolon ( ) ?;
1509
+ self . skip_semicolon ( ) ?;
1533
1510
let span = self . span_from ( start) ;
1534
1511
1535
1512
Ok ( Box :: new ( Stmt :: create_return (
@@ -2107,6 +2084,18 @@ impl<'a> Parser<'a> {
2107
2084
self . expect_token ( TokenKind :: Semicolon )
2108
2085
}
2109
2086
2087
+ fn skip_semicolon ( & mut self ) -> Result < Token , ParseErrorAndPos > {
2088
+ if self . token . is ( TokenKind :: Semicolon )
2089
+ /* || self.token.is(TokenKind::NewLine)*/
2090
+ {
2091
+ //println!("FOUND semi or nl: {:?}, advancing", self.token);
2092
+ self . advance_token ( )
2093
+ } else {
2094
+ //println!("NOT found semi or nl: {:?}", self.token);
2095
+ Ok ( self . token . clone ( ) )
2096
+ }
2097
+ }
2098
+
2110
2099
fn expect_token ( & mut self , kind : TokenKind ) -> Result < Token , ParseErrorAndPos > {
2111
2100
if self . token . kind == kind {
2112
2101
let token = self . advance_token ( ) ?;
@@ -2853,12 +2842,10 @@ mod tests {
2853
2842
2854
2843
#[ test]
2855
2844
fn parse_expr_stmt_without_semicolon ( ) {
2856
- err_stmt (
2857
- "1" ,
2858
- ParseError :: ExpectedToken ( ";" . into ( ) , "<<EOF>>" . into ( ) ) ,
2859
- 1 ,
2860
- 2 ,
2861
- ) ;
2845
+ let stmt = parse_stmt ( "1" ) ;
2846
+ let expr = stmt. to_expr ( ) . unwrap ( ) ;
2847
+
2848
+ assert ! ( expr. expr. is_lit_int( ) ) ;
2862
2849
}
2863
2850
2864
2851
#[ test]
@@ -2914,15 +2901,12 @@ mod tests {
2914
2901
let ( expr, _) = parse_expr ( "{ 1; 2; }" ) ;
2915
2902
let block = expr. to_block ( ) . unwrap ( ) ;
2916
2903
2917
- assert_eq ! ( 2 , block. stmts. len( ) ) ;
2904
+ assert_eq ! ( 1 , block. stmts. len( ) ) ;
2918
2905
2919
2906
let expr = & block. stmts [ 0 ] . to_expr ( ) . unwrap ( ) . expr ;
2920
2907
assert_eq ! ( 1 , expr. to_lit_int( ) . unwrap( ) . value) ;
2921
2908
2922
- let expr = & block. stmts [ 1 ] . to_expr ( ) . unwrap ( ) . expr ;
2923
- assert_eq ! ( 2 , expr. to_lit_int( ) . unwrap( ) . value) ;
2924
-
2925
- assert ! ( block. expr. is_none( ) ) ;
2909
+ assert ! ( block. expr. as_ref( ) . unwrap( ) . is_lit_int( ) ) ;
2926
2910
}
2927
2911
2928
2912
#[ test]
@@ -3685,7 +3669,7 @@ mod tests {
3685
3669
fn parse_use_declaration ( ) {
3686
3670
parse_err (
3687
3671
"use foo.bar{a, b, c}" ,
3688
- ParseError :: ExpectedToken ( ";" . into ( ) , "{" . into ( ) ) ,
3672
+ ParseError :: ExpectedTopLevelElement ( "{" . into ( ) ) ,
3689
3673
1 ,
3690
3674
12 ,
3691
3675
) ;
0 commit comments