@@ -54,6 +54,18 @@ impl<'a, 'b> Pratt<'a, 'b> {
5454 self . fold_rhs ( lex, lhs, min_bp, |_| false )
5555 }
5656
57+ fn parse_index_exprs (
58+ & mut self ,
59+ lex : & mut Lexer < ' a > ,
60+ op : ArrayOperator ,
61+ ) -> Result < Vec < ' a , Expr < ' a > > > {
62+ lex. next ( ) ;
63+ let expr = self . parse_expression ( lex, op. binding_power ( ) . 1 ) ?;
64+ let indices = self . parse_comma_expr ( lex, expr) ?;
65+ lex. expect ( & Token :: ClosedBracket , ParsingError :: UnclosedArrayAccess ) ?;
66+ Ok ( indices)
67+ }
68+
5769 fn fold_rhs (
5870 & mut self ,
5971 lex : & mut Lexer < ' a > ,
@@ -101,24 +113,34 @@ impl<'a, 'b> Pratt<'a, 'b> {
101113 self . parse_place_op ( lex, op, place) ?
102114 } else if let Ok ( op) = ArrayOperator :: parse ( next, & span) {
103115 match op {
104- ArrayOperator :: Index => {
105- let place = match Place :: lower_from ( lhs. take ( ) , lex. span ( ) ) {
106- Ok ( Place :: Variable ( var) ) => var,
107- Ok ( _) => return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ,
108- Err ( ( expr, _) ) => {
109- lhs = expr;
110- if op. binding_power ( ) . 0 < min_bp {
111- break ;
112- }
113- return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ;
116+ ArrayOperator :: Index => match Place :: lower_from ( lhs. take ( ) , lex. span ( ) ) {
117+ Ok ( Place :: Variable ( var) ) => {
118+ let index = self . parse_index_exprs ( lex, op) ?;
119+ Expr :: node ( op. expr ( var, index) , self . parser . arena )
120+ }
121+ Ok ( Place :: Index ( var, index) ) => {
122+ let new_indices = self . parse_index_exprs ( lex, op) ?;
123+ let inner = Expr :: node (
124+ ExprNode :: ArrayOperation ( ArrayOperator :: Index , var, index) ,
125+ self . parser . arena ,
126+ ) ;
127+ Expr :: node ( ExprNode :: NestedArray ( inner, new_indices) , self . parser . arena )
128+ }
129+ Ok ( Place :: ChainedIndex ( arr, indices) ) => {
130+ let new_indices = self . parse_index_exprs ( lex, op) ?;
131+ let inner =
132+ Expr :: node ( ExprNode :: NestedArray ( arr, indices) , self . parser . arena ) ;
133+ Expr :: node ( ExprNode :: NestedArray ( inner, new_indices) , self . parser . arena )
134+ }
135+ Ok ( _) => return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ,
136+ Err ( ( expr, _) ) => {
137+ lhs = expr;
138+ if op. binding_power ( ) . 0 < min_bp {
139+ break ;
114140 }
115- } ;
116- lex. next ( ) ;
117- let expr = self . parse_expression ( lex, op. binding_power ( ) . 1 ) ?;
118- let comma_expr = self . parse_comma_expr ( lex, expr) ?;
119- lex. expect ( & Token :: ClosedBracket , ParsingError :: UnclosedArrayAccess ) ?;
120- Expr :: node ( op. expr ( place, comma_expr) , self . parser . arena )
121- }
141+ return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ;
142+ }
143+ } ,
122144 ArrayOperator :: In => {
123145 lex. next ( ) ;
124146 let Place :: Variable ( var) = self . parse_place ( lex) ? else {
0 commit comments