MCPcopy Create free account
hub / github.com/AlenVelocity/MeowScript / parse_if_expr

Method parse_if_expr

src/parser.rs:420–457  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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) {

Callers 1

parse_exprMethod · 0.80

Calls 5

expect_peekMethod · 0.80
parse_exprMethod · 0.80
parse_block_statementMethod · 0.80
peek_tokenMethod · 0.80
next_tokenMethod · 0.45

Tested by

no test coverage detected