@@ -7,7 +7,11 @@ use utils::compile_time_errors::errors::CompileTimeError;
7
7
use utils:: compile_time_errors:: parser_errors:: ParserErrorType ;
8
8
9
9
impl < ' a > Parser < ' a > {
10
- pub fn parse_expression ( & mut self , precedence : Precedence ) -> Result < ( Expression , Span ) , ParseError > {
10
+ pub fn parse_expression (
11
+ & mut self ,
12
+ precedence : Precedence ,
13
+ match_current : bool ,
14
+ ) -> Result < ( Expression , Span ) , ParseError > {
11
15
let mut left_start = self . current_token . span . start ;
12
16
let mut left = self . parse_prefix_expression ( ) ?;
13
17
@@ -16,9 +20,14 @@ impl<'a> Parser<'a> {
16
20
}
17
21
18
22
while self . current_token . kind != TokenKind :: EOF
19
- && precedence < token_precedence_of ( self . peek_token . kind . clone ( ) )
23
+ && precedence
24
+ < token_precedence_of ( if match_current {
25
+ self . current_token . kind . clone ( )
26
+ } else {
27
+ self . peek_token . kind . clone ( )
28
+ } )
20
29
{
21
- match self . parse_infix_expression ( left. clone ( ) , left_start) {
30
+ match self . parse_infix_expression ( left. clone ( ) , left_start, match_current ) {
22
31
Some ( infix) => {
23
32
left = infix?;
24
33
@@ -192,7 +201,7 @@ impl<'a> Parser<'a> {
192
201
193
202
self . next_token ( ) ; // consume the prefix operator
194
203
195
- let ( expr, span) = self . parse_expression ( Precedence :: Prefix ) ?;
204
+ let ( expr, span) = self . parse_expression ( Precedence :: Prefix , false ) ?;
196
205
197
206
Expression :: Prefix ( UnaryExpression {
198
207
operator : prefix_operator,
@@ -203,7 +212,7 @@ impl<'a> Parser<'a> {
203
212
}
204
213
TokenKind :: LeftParen => {
205
214
self . next_token ( ) ;
206
- let expr = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
215
+ let expr = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
207
216
self . expect_peek ( TokenKind :: RightParen ) ?;
208
217
expr
209
218
}
@@ -234,8 +243,17 @@ impl<'a> Parser<'a> {
234
243
& mut self ,
235
244
left : Expression ,
236
245
left_start : usize ,
246
+ match_current : bool ,
237
247
) -> Option < Result < Expression , ParseError > > {
238
- match & self . peek_token . kind {
248
+ let token_kind = {
249
+ if match_current {
250
+ self . current_token . kind . clone ( )
251
+ } else {
252
+ self . peek_token . kind . clone ( )
253
+ }
254
+ } ;
255
+
256
+ match token_kind {
239
257
TokenKind :: Plus
240
258
| TokenKind :: Minus
241
259
| TokenKind :: Asterisk
@@ -248,12 +266,15 @@ impl<'a> Parser<'a> {
248
266
| TokenKind :: GreaterEqual
249
267
| TokenKind :: GreaterThan
250
268
| TokenKind :: Identifier { .. } => {
251
- self . next_token ( ) ; // consume left expression
269
+ if !match_current {
270
+ self . next_token ( ) ; // consume left expression
271
+ }
272
+
252
273
let operator = self . current_token . clone ( ) ;
253
274
let precedence = token_precedence_of ( self . current_token . kind . clone ( ) ) ;
254
275
self . next_token ( ) ; // consume the operator
255
276
256
- let ( right, span) = self . parse_expression ( precedence) . unwrap ( ) ;
277
+ let ( right, span) = self . parse_expression ( precedence, false ) . unwrap ( ) ;
257
278
258
279
Some ( Ok ( Expression :: Infix ( BinaryExpression {
259
280
operator,
@@ -317,7 +338,7 @@ impl<'a> Parser<'a> {
317
338
}
318
339
self . next_token ( ) ; // consume the starting token
319
340
320
- let first_argument = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
341
+ let first_argument = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
321
342
series. push ( first_argument) ;
322
343
323
344
while self . peek_token_is ( TokenKind :: Comma ) {
@@ -331,7 +352,7 @@ impl<'a> Parser<'a> {
331
352
self . next_token ( ) ; // consume the comma
332
353
333
354
// dbg!(self.current_token.kind.clone());
334
- let argument = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
355
+ let argument = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
335
356
series. push ( argument) ;
336
357
}
337
358
@@ -408,15 +429,17 @@ impl<'a> Parser<'a> {
408
429
}
409
430
}
410
431
411
- if ( self . current_token_is ( TokenKind :: RightParen ) || self . current_token_is ( TokenKind :: RightBracket ) ) != true && !self . current_token_is ( TokenKind :: Semicolon ) {
432
+ if ( self . current_token_is ( TokenKind :: RightParen ) || self . current_token_is ( TokenKind :: RightBracket ) ) != true
433
+ && !self . current_token_is ( TokenKind :: Semicolon )
434
+ {
412
435
return Err ( CompileTimeError {
413
436
location : self . current_location ( ) ,
414
437
etype : ParserErrorType :: MissingSemicolon ,
415
438
file_name : Some ( self . lexer . file_name . clone ( ) ) ,
416
439
code_raw : Some ( self . lexer . select ( left_start..self . current_token . span . end ) ) ,
417
440
verbose : None ,
418
441
caret : true ,
419
- } ) ;
442
+ } ) ;
420
443
}
421
444
422
445
Ok ( Expression :: FieldAccessOrMethodCall ( chains) )
@@ -639,7 +662,7 @@ impl<'a> Parser<'a> {
639
662
} ;
640
663
self . expect_current ( TokenKind :: Colon ) ?;
641
664
642
- let value = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
665
+ let value = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
643
666
self . next_token ( ) ; // consume expr
644
667
645
668
field_inits. push ( FieldInit {
@@ -695,7 +718,7 @@ impl<'a> Parser<'a> {
695
718
self . next_token ( ) ; // consume identifier
696
719
self . next_token ( ) ; // consume assign
697
720
698
- let expr = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
721
+ let expr = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
699
722
700
723
let end = self . current_token . span . end ;
701
724
@@ -712,7 +735,7 @@ impl<'a> Parser<'a> {
712
735
713
736
self . expect_current ( TokenKind :: Assign ) ?;
714
737
715
- let expr = self . parse_expression ( Precedence :: Lowest ) ?. 0 ;
738
+ let expr = self . parse_expression ( Precedence :: Lowest , false ) ?. 0 ;
716
739
717
740
Ok ( Expression :: ArrayIndexAssign ( Box :: new ( ArrayIndexAssign {
718
741
from_package : array_index. from_package ,
0 commit comments