@@ -92,24 +92,24 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
92
92
] ) ,
93
93
} ;
94
94
95
- parser. next_token ( ) ?;
96
- parser. next_token ( ) ?;
95
+ parser. bump ( ) ?;
96
+ parser. bump ( ) ?;
97
97
98
98
Ok ( parser)
99
99
}
100
100
101
- fn next_token ( & mut self ) -> Result < Option < Token > , Error > {
101
+ fn bump ( & mut self ) -> Result < ( ) , Error > {
102
102
match self . lexer . next ( ) . transpose ( ) {
103
103
Ok ( mut token) => {
104
104
std:: mem:: swap ( & mut self . cur_token , & mut self . peek_token ) ;
105
105
std:: mem:: swap ( & mut token, & mut self . peek_token ) ;
106
106
107
- Ok ( token )
107
+ Ok ( ( ) )
108
108
}
109
109
Err ( span) => {
110
110
self . diag . error ( Diagnostic :: UnknownChar , span) ;
111
111
112
- self . next_token ( )
112
+ self . bump ( )
113
113
}
114
114
}
115
115
}
@@ -123,9 +123,13 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
123
123
}
124
124
125
125
fn expect ( & mut self , token : & Token ) -> Result < ( ) , Error > {
126
- match self . next_token ( ) ? {
127
- Some ( ref cur) if cur == token => Ok ( ( ) ) ,
128
- Some ( cur) => Err ( Error :: UnexpectedToken ( token. to_owned ( ) , cur) ) ,
126
+ match & self . cur_token {
127
+ Some ( cur) if cur == token => {
128
+ self . bump ( ) ?;
129
+
130
+ Ok ( ( ) )
131
+ }
132
+ Some ( cur) => Err ( Error :: UnexpectedToken ( token. to_owned ( ) , cur. clone ( ) ) ) ,
129
133
None => Err ( Error :: Expected ( token. to_owned ( ) ) ) ,
130
134
}
131
135
}
@@ -174,16 +178,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
174
178
fn parse_struct ( & mut self ) -> Result < Item , Error > {
175
179
self . expect ( & Token :: Struct ) ?;
176
180
177
- let name = match self
178
- . next_token ( ) ?
179
- . ok_or ( Error :: Expected ( Token :: Ident ( Default :: default ( ) ) ) ) ?
180
- {
181
- Token :: Ident ( ident) => Ok ( ident) ,
182
- token => Err ( Error :: UnexpectedToken (
183
- Token :: Ident ( Default :: default ( ) ) ,
184
- token,
185
- ) ) ,
186
- } ?;
181
+ let name = self . parse_ident ( ) ?;
187
182
188
183
self . expect ( & Token :: LBrace ) ?;
189
184
@@ -193,10 +188,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
193
188
if self . cur_token_is ( & Token :: Fn ) {
194
189
// Handle struct methods here
195
190
} else {
196
- let name = match self . next_token ( ) ? {
197
- Some ( Token :: Ident ( ident) ) => ident,
198
- _ => todo ! ( "Don't know what error to return yet" ) ,
199
- } ;
191
+ let name = self . parse_ident ( ) ?;
200
192
self . expect ( & Token :: Colon ) ?;
201
193
let ty = self . parse_type ( ) ?;
202
194
@@ -272,34 +264,39 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
272
264
}
273
265
274
266
fn parse_type ( & mut self ) -> Result < Ty , Error > {
275
- Ok ( match self . next_token ( ) ?. unwrap ( ) {
276
- Token :: Asterisk => Ty :: Ptr ( Box :: new ( self . parse_type ( ) ?) ) ,
277
- Token :: LBracket => match self . next_token ( ) ?. unwrap ( ) {
278
- Token :: Integer ( int) => {
279
- let length: usize = str:: parse ( & int) . unwrap ( ) ;
280
- self . expect ( & Token :: RBracket ) ?;
281
-
282
- Ty :: Array {
283
- ty : Box :: new ( self . parse_type ( ) ?) ,
284
- len : length,
267
+ let ty = match & self . cur_token {
268
+ Some ( Token :: Asterisk ) => Ty :: Ptr ( Box :: new ( self . parse_type ( ) ?) ) ,
269
+ Some ( Token :: LBracket ) => {
270
+ self . bump ( ) ?;
271
+
272
+ match & self . cur_token {
273
+ Some ( Token :: Integer ( int) ) => {
274
+ let length: usize = str:: parse ( int) . unwrap ( ) ;
275
+ self . expect ( & Token :: RBracket ) ?;
276
+
277
+ Ty :: Array {
278
+ ty : Box :: new ( self . parse_type ( ) ?) ,
279
+ len : length,
280
+ }
285
281
}
282
+ token => panic ! ( "Expected integer, got {token:?}" ) ,
286
283
}
287
- token => panic ! ( "Expected integer, got {token}" ) ,
288
- } ,
289
- Token :: U8 => Ty :: UInt ( UintTy :: U8 ) ,
290
- Token :: U16 => Ty :: UInt ( UintTy :: U16 ) ,
291
- Token :: U32 => Ty :: UInt ( UintTy :: U32 ) ,
292
- Token :: U64 => Ty :: UInt ( UintTy :: U64 ) ,
293
- Token :: I8 => Ty :: Int ( IntTy :: I8 ) ,
294
- Token :: I16 => Ty :: Int ( IntTy :: I16 ) ,
295
- Token :: I32 => Ty :: Int ( IntTy :: I32 ) ,
296
- Token :: I64 => Ty :: Int ( IntTy :: I64 ) ,
297
- Token :: Usize => Ty :: UInt ( UintTy :: Usize ) ,
298
- Token :: Isize => Ty :: Int ( IntTy :: Isize ) ,
299
- Token :: Bool => Ty :: Bool ,
300
- Token :: Void => Ty :: Void ,
301
- Token :: Ident ( ident ) => Ty :: Ident ( ident ) ,
302
- Token :: Fn => {
284
+ }
285
+ Some ( Token :: U8 ) => Ty :: UInt ( UintTy :: U8 ) ,
286
+ Some ( Token :: U16 ) => Ty :: UInt ( UintTy :: U16 ) ,
287
+ Some ( Token :: U32 ) => Ty :: UInt ( UintTy :: U32 ) ,
288
+ Some ( Token :: U64 ) => Ty :: UInt ( UintTy :: U64 ) ,
289
+ Some ( Token :: I8 ) => Ty :: Int ( IntTy :: I8 ) ,
290
+ Some ( Token :: I16 ) => Ty :: Int ( IntTy :: I16 ) ,
291
+ Some ( Token :: I32 ) => Ty :: Int ( IntTy :: I32 ) ,
292
+ Some ( Token :: I64 ) => Ty :: Int ( IntTy :: I64 ) ,
293
+ Some ( Token :: Usize ) => Ty :: UInt ( UintTy :: Usize ) ,
294
+ Some ( Token :: Isize ) => Ty :: Int ( IntTy :: Isize ) ,
295
+ Some ( Token :: Bool ) => Ty :: Bool ,
296
+ Some ( Token :: Void ) => Ty :: Void ,
297
+ Some ( Token :: Ident ( ident ) ) => Ty :: Ident ( ident . clone ( ) ) ,
298
+ Some ( Token :: Fn ) => {
299
+ self . bump ( ) ? ;
303
300
self . expect ( & Token :: LParen ) ?;
304
301
305
302
let mut params = Vec :: new ( ) ;
@@ -315,10 +312,14 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
315
312
self . expect ( & Token :: RParen ) ?;
316
313
self . expect ( & Token :: Arrow ) ?;
317
314
318
- Ty :: Fn ( params, Box :: new ( self . parse_type ( ) ?) )
315
+ return Ok ( Ty :: Fn ( params, Box :: new ( self . parse_type ( ) ?) ) ) ;
319
316
}
320
- token => return Err ( Error :: ParseType ( token) ) ,
321
- } )
317
+ token => return Err ( Error :: ParseType ( token. clone ( ) . unwrap ( ) ) ) ,
318
+ } ;
319
+
320
+ self . bump ( ) ?;
321
+
322
+ Ok ( ty)
322
323
}
323
324
324
325
fn parse_return ( & mut self ) -> Result < Stmt , Error > {
@@ -405,12 +406,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
405
406
fn local ( & mut self ) -> Result < Stmt , Error > {
406
407
self . expect ( & Token :: Let ) ?;
407
408
408
- let name = match self . next_token ( ) ?. unwrap ( ) {
409
- Token :: Ident ( ident) => ident,
410
- token => {
411
- return Err ( Error :: ParseType ( token) ) ;
412
- }
413
- } ;
409
+ let name = self . parse_ident ( ) ?;
414
410
let ty = if self . cur_token_is ( & Token :: Colon ) {
415
411
self . expect ( & Token :: Colon ) ?;
416
412
@@ -439,12 +435,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
439
435
fn global ( & mut self ) -> Result < Item , Error > {
440
436
self . expect ( & Token :: Let ) ?;
441
437
442
- let name = match self . next_token ( ) ?. unwrap ( ) {
443
- Token :: Ident ( ident) => ident,
444
- token => {
445
- return Err ( Error :: ParseType ( token) ) ;
446
- }
447
- } ;
438
+ let name = self . parse_ident ( ) ?;
448
439
self . expect ( & Token :: Colon ) ?;
449
440
450
441
let ty = self . parse_type ( ) ?;
@@ -469,12 +460,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
469
460
fn function ( & mut self , func_definition : bool ) -> Result < Item , Error > {
470
461
self . expect ( & Token :: Fn ) ?;
471
462
472
- let name = match self . next_token ( ) ?. unwrap ( ) {
473
- Token :: Ident ( ident) => ident,
474
- token => {
475
- return Err ( Error :: ParseType ( token) ) ;
476
- }
477
- } ;
463
+ let name = self . parse_ident ( ) ?;
478
464
479
465
self . expect ( & Token :: LParen ) ?;
480
466
@@ -508,10 +494,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
508
494
let mut params = Vec :: new ( ) ;
509
495
510
496
while !self . cur_token_is ( & end) {
511
- let name = match self . next_token ( ) ? {
512
- Some ( Token :: Ident ( ident) ) => ident,
513
- _ => todo ! ( "Don't know what error to return yet" ) ,
514
- } ;
497
+ let name = self . parse_ident ( ) ?;
515
498
self . expect ( & Token :: Colon ) ?;
516
499
let type_ = self . parse_type ( ) ?;
517
500
@@ -533,28 +516,20 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
533
516
fn ident ( & mut self ) -> Result < Expr , Error > {
534
517
match self . peek_token {
535
518
Some ( Token :: LBrace ) => self . struct_expr ( ) ,
536
- _ => match self
537
- . next_token ( ) ?
538
- . ok_or ( Error :: Expected ( Token :: Ident ( Default :: default ( ) ) ) ) ?
539
- {
540
- Token :: Ident ( ident) => Ok ( Expr :: Ident ( ExprIdent ( ident) ) ) ,
541
- token => Err ( Error :: ParseType ( token) ) ,
542
- } ,
519
+ _ => Ok ( Expr :: Ident ( ExprIdent ( self . parse_ident ( ) ?) ) ) ,
543
520
}
544
521
}
545
522
546
523
fn struct_expr ( & mut self ) -> Result < Expr , Error > {
547
- let name = match self . next_token ( ) ? {
548
- Some ( Token :: Ident ( ident) ) => ident,
549
- _ => todo ! ( "Don't know what error to return yet" ) ,
550
- } ;
524
+ let name = self . parse_ident ( ) ?;
551
525
552
526
self . expect ( & Token :: LBrace ) ?;
553
527
let mut fields = Vec :: new ( ) ;
554
528
555
529
while !self . cur_token_is ( & Token :: RBrace ) {
556
- match self . next_token ( ) ? {
530
+ match self . cur_token . clone ( ) {
557
531
Some ( Token :: Ident ( field) ) => {
532
+ self . bump ( ) ?;
558
533
self . expect ( & Token :: Colon ) ?;
559
534
let expr = self . expr ( Precedence :: Lowest ) ?;
560
535
@@ -574,16 +549,26 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
574
549
}
575
550
576
551
fn string_lit ( & mut self ) -> Result < Expr , Error > {
577
- match self . next_token ( ) ? {
578
- Some ( Token :: String ( literal) ) => Ok ( Expr :: Lit ( ExprLit :: String ( literal) ) ) ,
579
- Some ( _) | None => unreachable ! ( ) ,
552
+ match & self . cur_token {
553
+ Some ( Token :: String ( literal) ) => {
554
+ let lit = literal. clone ( ) ;
555
+ self . bump ( ) ?;
556
+
557
+ Ok ( Expr :: Lit ( ExprLit :: String ( lit) ) )
558
+ }
559
+ _ => unreachable ! ( ) ,
580
560
}
581
561
}
582
562
583
563
fn int_lit ( & mut self ) -> Result < Expr , Error > {
584
- match self . next_token ( ) ? {
585
- Some ( Token :: Integer ( num_str) ) => Ok ( Expr :: Lit ( ExprLit :: UInt ( num_str. parse ( ) . unwrap ( ) ) ) ) ,
586
- Some ( _) | None => unreachable ! ( ) ,
564
+ match & self . cur_token {
565
+ Some ( Token :: Integer ( num_str) ) => {
566
+ let lit = num_str. parse ( ) . unwrap ( ) ;
567
+ self . bump ( ) ?;
568
+
569
+ Ok ( Expr :: Lit ( ExprLit :: UInt ( lit) ) )
570
+ }
571
+ _ => unreachable ! ( ) ,
587
572
}
588
573
}
589
574
@@ -594,10 +579,18 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
594
579
}
595
580
596
581
fn bool ( & mut self ) -> Result < Expr , Error > {
597
- match self . next_token ( ) ? {
598
- Some ( Token :: True ) => Ok ( Expr :: Lit ( ExprLit :: Bool ( true ) ) ) ,
599
- Some ( Token :: False ) => Ok ( Expr :: Lit ( ExprLit :: Bool ( false ) ) ) ,
600
- Some ( _) | None => unreachable ! ( ) ,
582
+ match & self . cur_token {
583
+ Some ( Token :: True ) => {
584
+ self . bump ( ) ?;
585
+
586
+ Ok ( Expr :: Lit ( ExprLit :: Bool ( true ) ) )
587
+ }
588
+ Some ( Token :: False ) => {
589
+ self . bump ( ) ?;
590
+
591
+ Ok ( Expr :: Lit ( ExprLit :: Bool ( false ) ) )
592
+ }
593
+ _ => unreachable ! ( ) ,
601
594
}
602
595
}
603
596
@@ -624,7 +617,12 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
624
617
let mut tokens = Vec :: new ( ) ;
625
618
626
619
while !self . cur_token_is ( & Token :: RParen ) {
627
- tokens. push ( self . next_token ( ) ?. ok_or ( Error :: Expected ( Token :: RParen ) ) ?) ;
620
+ tokens. push (
621
+ self . cur_token
622
+ . clone ( )
623
+ . ok_or ( Error :: Expected ( Token :: RParen ) ) ?,
624
+ ) ;
625
+ self . bump ( ) ?;
628
626
}
629
627
630
628
self . expect ( & Token :: RParen ) ?;
@@ -633,7 +631,8 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
633
631
}
634
632
635
633
fn bin_expr ( & mut self , left : Expr ) -> Result < Expr , Error > {
636
- let token = self . next_token ( ) ?. unwrap ( ) ;
634
+ let token = self . cur_token . clone ( ) . unwrap ( ) ;
635
+ self . bump ( ) ?;
637
636
638
637
// NOTE: assignment expression is right-associative
639
638
let precedence = if let & Token :: Assign = & token {
@@ -654,10 +653,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
654
653
fn pointer_access ( & mut self , left : Expr ) -> Result < Expr , Error > {
655
654
self . expect ( & Token :: Arrow ) ?;
656
655
657
- let field = match self . next_token ( ) ? {
658
- Some ( Token :: Ident ( ident) ) => ident,
659
- _ => unreachable ! ( ) ,
660
- } ;
656
+ let field = self . parse_ident ( ) ?;
661
657
662
658
Ok ( Expr :: Field ( ExprField {
663
659
expr : Box :: new ( Expr :: Unary ( ExprUnary {
@@ -672,10 +668,7 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
672
668
self . expect ( & Token :: Period ) ?;
673
669
674
670
if self . peek_token_is ( & Token :: LParen ) {
675
- let method = match self . next_token ( ) ? {
676
- Some ( Token :: Ident ( field) ) => field,
677
- _ => panic ! ( "Struct field name should be of type string" ) ,
678
- } ;
671
+ let method = self . parse_ident ( ) ?;
679
672
680
673
self . expect ( & Token :: LParen ) ?;
681
674
let arguments = self . expr_list ( ) ?;
@@ -686,13 +679,10 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
686
679
arguments,
687
680
} ) )
688
681
} else {
689
- match self . next_token ( ) ? {
690
- Some ( Token :: Ident ( field) ) => Ok ( Expr :: Field ( ExprField {
691
- expr : Box :: new ( expr) ,
692
- field,
693
- } ) ) ,
694
- _ => panic ! ( "Struct field name should be of type string" ) ,
695
- }
682
+ Ok ( Expr :: Field ( ExprField {
683
+ expr : Box :: new ( expr) ,
684
+ field : self . parse_ident ( ) ?,
685
+ } ) )
696
686
}
697
687
}
698
688
@@ -717,7 +707,9 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
717
707
}
718
708
719
709
fn unary_expr ( & mut self ) -> Result < Expr , Error > {
720
- let op = UnOp :: try_from ( & self . next_token ( ) ?. unwrap ( ) ) . map_err ( |e| Error :: Operator ( e) ) ?;
710
+ let token = self . cur_token . clone ( ) . unwrap ( ) ;
711
+ self . bump ( ) ?;
712
+ let op = UnOp :: try_from ( & token) . map_err ( |e| Error :: Operator ( e) ) ?;
721
713
let expr = self . expr ( Precedence :: Prefix ) ?;
722
714
723
715
Ok ( Expr :: Unary ( ExprUnary {
@@ -766,6 +758,17 @@ impl<'a, 'src, T: Iterator<Item = Result<Token, Span>>> Parser<'a, 'src, T> {
766
758
767
759
Ok ( Expr :: Array ( ExprArray ( items) ) )
768
760
}
761
+
762
+ fn parse_ident ( & mut self ) -> Result < String , Error > {
763
+ match self . cur_token . clone ( ) {
764
+ Some ( Token :: Ident ( ident) ) => {
765
+ self . bump ( ) ?;
766
+
767
+ Ok ( ident)
768
+ }
769
+ _ => todo ! ( ) ,
770
+ }
771
+ }
769
772
}
770
773
771
774
#[ cfg( test) ]
0 commit comments