(&mut self)
| 418 | } |
| 419 | |
| 420 | fn parse_if_expr(&mut self) -> Option<Expr> { |
| 421 | if !self.expect_peek(Token::LeftParen) { |
| 422 | return None; |
| 423 | } |
| 424 | |
| 425 | self.next_token(); |
| 426 | |
| 427 | let expr: Expr = match self.parse_expr(Precedence::Lowest) { |
| 428 | Some(e) => e, |
| 429 | None => return None, |
| 430 | }; |
| 431 | |
| 432 | if !self.expect_peek(Token::RightParen) || !self.expect_peek(Token::LeftBrace) { |
| 433 | return None; |
| 434 | } |
| 435 | |
| 436 | let cons: Vec<Statement> = self.parse_block_statement(); |
| 437 | let mut alternative: Option<Vec<Statement>> = None; |
| 438 | if self.peek_token(&Token::Else) { |
| 439 | self.next_token(); |
| 440 | |
| 441 | if self.peek_token(&Token::If) { |
| 442 | self.next_token(); |
| 443 | let else_if = self.parse_if_expr(); |
| 444 | alternative = Some(vec![Statement::Expression(else_if.unwrap())]); |
| 445 | } else if !self.expect_peek(Token::LeftBrace) { |
| 446 | return None; |
| 447 | } else { |
| 448 | alternative = Some(self.parse_block_statement()) |
| 449 | }; |
| 450 | } |
| 451 | |
| 452 | Some(Expr::If { |
| 453 | cond: Box::new(expr), |
| 454 | then: Box::new(cons), |
| 455 | else_: alternative, |
| 456 | }) |
| 457 | } |
| 458 | |
| 459 | fn parse_fn_expr(&mut self) -> Option<Expr> { |
| 460 | if !self.expect_peek(Token::LeftParen) { |
no test coverage detected