@@ -2610,31 +2610,84 @@ impl<'a> Parser<'a> {
2610
2610
}
2611
2611
}
2612
2612
2613
- pub fn parse_subscript ( & mut self , expr : Expr ) -> Result < Expr , ParserError > {
2614
- let parse_upper_bound = |p : & mut Parser < ' a > | {
2615
- if let Token :: RBracket = p. peek_token ( ) . token {
2616
- Ok ( None )
2617
- } else {
2618
- p. parse_expr ( ) . map ( Some )
2619
- }
2613
+ /// Parses an array subscript like
2614
+ /// * `[:]`
2615
+ /// * `[l]`
2616
+ /// * `[l:]`
2617
+ /// * `[:u]`
2618
+ /// * `[l:u]`
2619
+ /// * `[l:u:s]`
2620
+ ///
2621
+ /// Parser is right after `[`
2622
+ fn parse_subscript_inner ( & mut self ) -> Result < Subscript , ParserError > {
2623
+ // at either `<lower>:(rest)` or `:(rest)]`
2624
+ let lower_bound = if self . consume_token ( & Token :: Colon ) {
2625
+ None
2626
+ } else {
2627
+ Some ( self . parse_expr ( ) ?)
2620
2628
} ;
2621
- let subscript = if self . consume_token ( & Token :: Colon ) {
2622
- Subscript :: Slice {
2623
- lower_bound : None ,
2624
- upper_bound : parse_upper_bound ( self ) ?,
2625
- }
2629
+
2630
+ // check for end
2631
+ if self . consume_token ( & Token :: RBracket ) {
2632
+ if let Some ( lower_bound) = lower_bound {
2633
+ return Ok ( Subscript :: Index { index : lower_bound } ) ;
2634
+ } ;
2635
+ return Ok ( Subscript :: Slice {
2636
+ lower_bound,
2637
+ upper_bound : None ,
2638
+ stride : None ,
2639
+ } ) ;
2640
+ }
2641
+
2642
+ // consume the `:`
2643
+ if lower_bound. is_some ( ) {
2644
+ self . expect_token ( & Token :: Colon ) ?;
2645
+ }
2646
+
2647
+ // we are now at either `]`, `<upper>(rest)]`
2648
+ let upper_bound = if self . consume_token ( & Token :: RBracket ) {
2649
+ return Ok ( Subscript :: Slice {
2650
+ lower_bound,
2651
+ upper_bound : None ,
2652
+ stride : None ,
2653
+ } ) ;
2626
2654
} else {
2627
- let expr = self . parse_expr ( ) ?;
2628
- if self . consume_token ( & Token :: Colon ) {
2629
- Subscript :: Slice {
2630
- lower_bound : Some ( expr) ,
2631
- upper_bound : parse_upper_bound ( self ) ?,
2632
- }
2633
- } else {
2634
- Subscript :: Index { index : expr }
2635
- }
2655
+ Some ( self . parse_expr ( ) ?)
2636
2656
} ;
2637
- self . expect_token ( & Token :: RBracket ) ?;
2657
+
2658
+ // check for end
2659
+ if self . consume_token ( & Token :: RBracket ) {
2660
+ return Ok ( Subscript :: Slice {
2661
+ lower_bound,
2662
+ upper_bound,
2663
+ stride : None ,
2664
+ } ) ;
2665
+ }
2666
+
2667
+ // we are now at `:]` or `:stride]`
2668
+ self . expect_token ( & Token :: Colon ) ?;
2669
+ let stride = if self . consume_token ( & Token :: RBracket ) {
2670
+ None
2671
+ } else {
2672
+ Some ( self . parse_expr ( ) ?)
2673
+ } ;
2674
+
2675
+ if stride. is_some ( ) {
2676
+ self . expect_token ( & Token :: RBracket ) ?;
2677
+ }
2678
+
2679
+ Ok ( Subscript :: Slice {
2680
+ lower_bound,
2681
+ upper_bound,
2682
+ stride,
2683
+ } )
2684
+ }
2685
+
2686
+ /// Parses an array subscript like `[1:3]`
2687
+ ///
2688
+ /// Parser is right after `[`
2689
+ pub fn parse_subscript ( & mut self , expr : Expr ) -> Result < Expr , ParserError > {
2690
+ let subscript = self . parse_subscript_inner ( ) ?;
2638
2691
Ok ( Expr :: Subscript {
2639
2692
expr : Box :: new ( expr) ,
2640
2693
subscript : Box :: new ( subscript) ,
0 commit comments