@@ -24,7 +24,7 @@ pub struct Parser<'a, 'src, T: Iterator<Item = Result<Token, Span>>> {
24
24
}
25
25
26
26
impl < ' a , ' src , T : Iterator < Item = Result < Token , Span > > > Parser < ' a , ' src , T > {
27
- pub fn new ( lexer : T , diag : & ' a mut Diagnostics < ' src > ) -> Result < Self , ( ) > {
27
+ pub fn new ( lexer : T , diag : & ' a mut Diagnostics < ' src > ) -> Self {
28
28
let mut parser = Self {
29
29
prev_token : None ,
30
30
cur_token : None ,
@@ -83,20 +83,18 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
83
83
] ) ,
84
84
} ;
85
85
86
- parser. bump ( ) ? ;
87
- parser. bump ( ) ? ;
86
+ parser. bump ( ) ;
87
+ parser. bump ( ) ;
88
88
89
- Ok ( parser)
89
+ parser
90
90
}
91
91
92
- fn bump ( & mut self ) -> Result < ( ) , ( ) > {
92
+ fn bump ( & mut self ) {
93
93
match self . lexer . next ( ) . transpose ( ) {
94
94
Ok ( mut token) => {
95
95
std:: mem:: swap ( & mut self . prev_token , & mut self . cur_token ) ;
96
96
std:: mem:: swap ( & mut self . cur_token , & mut self . peek_token ) ;
97
97
std:: mem:: swap ( & mut token, & mut self . peek_token ) ;
98
-
99
- Ok ( ( ) )
100
98
}
101
99
Err ( span) => {
102
100
self . diag . error ( Diagnostic :: UnknownChar , span) ;
@@ -118,7 +116,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
118
116
match & self . cur_token {
119
117
Some ( cur) if & cur. kind == kind => {
120
118
let span = cur. span . clone ( ) ;
121
- self . bump ( ) ? ;
119
+ self . bump ( ) ;
122
120
123
121
Ok ( span)
124
122
}
@@ -135,13 +133,12 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
135
133
136
134
while let Some ( token) = & self . cur_token {
137
135
let item = match token. kind {
138
- TokenKind :: Struct => Some ( self . parse_struct_item ( ) ? ) ,
139
- TokenKind :: Let => Some ( self . parse_global_item ( ) ? ) ,
140
- TokenKind :: Fn => Some ( self . parse_function_item ( true ) ? ) ,
136
+ TokenKind :: Struct => self . parse_struct_item ( ) . ok ( ) ,
137
+ TokenKind :: Let => self . parse_global_item ( ) . ok ( ) ,
138
+ TokenKind :: Fn => self . parse_function_item ( true ) . ok ( ) ,
141
139
_ => {
142
140
self . expected ( & [ & TokenKind :: Struct , & TokenKind :: Let , & TokenKind :: Fn ] ) ;
143
-
144
- self . bump ( ) ?;
141
+ self . bump ( ) ;
145
142
146
143
None
147
144
}
@@ -266,7 +263,9 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
266
263
let open_brace = self . expect ( & TokenKind :: LBrace ) ?;
267
264
268
265
while !self . cur_token_is ( & TokenKind :: RBrace ) {
269
- stmts. push ( self . parse_stmt ( ) ?) ;
266
+ if let Ok ( stmt) = self . parse_stmt ( ) {
267
+ stmts. push ( stmt) ;
268
+ }
270
269
}
271
270
272
271
let close_brace = self . expect ( & TokenKind :: RBrace ) ?;
@@ -295,7 +294,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
295
294
let ty = match self . cur_token . as_ref ( ) . map ( |token| & token. kind ) {
296
295
Some ( TokenKind :: Asterisk ) => Ty :: Ptr ( Box :: new ( self . parse_type ( ) ?) ) ,
297
296
Some ( TokenKind :: LBracket ) => {
298
- self . bump ( ) ? ;
297
+ self . bump ( ) ;
299
298
300
299
match & self . cur_token {
301
300
Some ( Token {
@@ -307,7 +306,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
307
306
Err ( _) => {
308
307
let span = span. clone ( ) ;
309
308
310
- self . bump ( ) ? ;
309
+ self . bump ( ) ;
311
310
self . diag . error ( Diagnostic :: IntegerLitralTooLong , span) ;
312
311
313
312
return Err ( ( ) ) ;
@@ -322,7 +321,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
322
321
}
323
322
_ => {
324
323
self . expected ( & [ & TokenKind :: Integer ( Default :: default ( ) ) ] ) ;
325
- self . bump ( ) ? ;
324
+ self . bump ( ) ;
326
325
327
326
return Err ( ( ) ) ?;
328
327
}
@@ -342,7 +341,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
342
341
Some ( TokenKind :: Void ) => Ty :: Void ,
343
342
Some ( TokenKind :: Ident ( ident) ) => Ty :: Ident ( ident. clone ( ) ) ,
344
343
Some ( TokenKind :: Fn ) => {
345
- self . bump ( ) ? ;
344
+ self . bump ( ) ;
346
345
self . expect ( & TokenKind :: LParen ) ?;
347
346
348
347
let mut params = Vec :: new ( ) ;
@@ -371,13 +370,13 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
371
370
} )
372
371
. clone ( ) ,
373
372
) ;
374
- self . bump ( ) ? ;
373
+ self . bump ( ) ;
375
374
376
375
return Err ( ( ) ) ;
377
376
}
378
377
} ;
379
378
380
- self . bump ( ) ? ;
379
+ self . bump ( ) ;
381
380
382
381
Ok ( ty)
383
382
}
@@ -615,13 +614,13 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
615
614
..
616
615
} ) => {
617
616
let lit = literal. clone ( ) ;
618
- self . bump ( ) ? ;
617
+ self . bump ( ) ;
619
618
620
619
Ok ( Expr :: Lit ( ExprLit :: String ( lit) ) )
621
620
}
622
621
_ => {
623
622
self . expected ( & [ & TokenKind :: String ( Default :: default ( ) ) ] ) ;
624
- self . bump ( ) ? ;
623
+ self . bump ( ) ;
625
624
626
625
Err ( ( ) )
627
626
}
@@ -641,18 +640,18 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
641
640
fn parse_bool_expr ( & mut self ) -> Result < Expr , ( ) > {
642
641
match self . cur_token . as_ref ( ) . map ( |token| & token. kind ) {
643
642
Some ( TokenKind :: True ) => {
644
- self . bump ( ) ? ;
643
+ self . bump ( ) ;
645
644
646
645
Ok ( Expr :: Lit ( ExprLit :: Bool ( true ) ) )
647
646
}
648
647
Some ( TokenKind :: False ) => {
649
- self . bump ( ) ? ;
648
+ self . bump ( ) ;
650
649
651
650
Ok ( Expr :: Lit ( ExprLit :: Bool ( false ) ) )
652
651
}
653
652
_ => {
654
653
self . expected ( & [ & TokenKind :: True , & TokenKind :: False ] ) ;
655
- self . bump ( ) ? ;
654
+ self . bump ( ) ;
656
655
657
656
Err ( ( ) )
658
657
}
@@ -687,7 +686,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
687
686
688
687
( )
689
688
} ) ?) ;
690
- self . bump ( ) ? ;
689
+ self . bump ( ) ;
691
690
}
692
691
693
692
self . expect ( & TokenKind :: RParen ) ?;
@@ -697,7 +696,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
697
696
698
697
fn parse_bin_expr ( & mut self , left : Expr ) -> Result < Expr , ( ) > {
699
698
let token = self . cur_token_unchecked ( ) ;
700
- self . bump ( ) ? ;
699
+ self . bump ( ) ;
701
700
702
701
// NOTE: assignment expression is right-associative
703
702
let precedence = if let & TokenKind :: Assign = & token. kind {
@@ -776,7 +775,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
776
775
777
776
fn parse_unary_expr ( & mut self ) -> Result < Expr , ( ) > {
778
777
let token = self . cur_token_unchecked ( ) ;
779
- self . bump ( ) ? ;
778
+ self . bump ( ) ;
780
779
let op = UnOp :: try_from ( & token. kind ) . map_err ( |_| {
781
780
self . diag
782
781
. error ( Diagnostic :: ExpressionInfix ( token. kind ) , token. span ) ;
@@ -841,19 +840,19 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
841
840
Err ( _) => {
842
841
let span = span. clone ( ) ;
843
842
844
- self . bump ( ) ? ;
843
+ self . bump ( ) ;
845
844
self . diag . error ( Diagnostic :: IntegerLitralTooLong , span) ;
846
845
847
846
return Err ( ( ) ) ;
848
847
}
849
848
} ;
850
- self . bump ( ) ? ;
849
+ self . bump ( ) ;
851
850
852
851
Ok ( lit)
853
852
}
854
853
_ => {
855
854
self . expected ( & [ & TokenKind :: Integer ( Default :: default ( ) ) ] ) ;
856
- self . bump ( ) ? ;
855
+ self . bump ( ) ;
857
856
858
857
Err ( ( ) )
859
858
}
@@ -866,13 +865,13 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
866
865
kind : TokenKind :: Ident ( ident) ,
867
866
span,
868
867
} ) => {
869
- self . bump ( ) ? ;
868
+ self . bump ( ) ;
870
869
871
870
Ok ( ( ident, span) )
872
871
}
873
872
_ => {
874
873
self . expected ( & [ & TokenKind :: Ident ( Default :: default ( ) ) ] ) ;
875
- self . bump ( ) ? ;
874
+ self . bump ( ) ;
876
875
877
876
Err ( ( ) )
878
877
}
@@ -1050,7 +1049,7 @@ mod test {
1050
1049
1051
1050
for ( input, expected) in tests {
1052
1051
let mut diagnostics = Diagnostics :: new ( input) ;
1053
- let mut parser = Parser :: new ( Lexer :: new ( input) , & mut diagnostics) . unwrap ( ) ;
1052
+ let mut parser = Parser :: new ( Lexer :: new ( input) , & mut diagnostics) ;
1054
1053
let ast = parser. parse_block_stmt ( ) . unwrap ( ) ;
1055
1054
1056
1055
assert_eq ! (
0 commit comments