From 662bc1d55d9fecf173e873b5d00e95fd7635e73d Mon Sep 17 00:00:00 2001 From: Tolmachev Igor Date: Fri, 22 May 2026 21:22:25 +0300 Subject: Implement If expression support I forgor --- compiler/src/ast/parser.rs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'compiler/src/ast/parser.rs') diff --git a/compiler/src/ast/parser.rs b/compiler/src/ast/parser.rs index 12a6f0d..88ba8c7 100644 --- a/compiler/src/ast/parser.rs +++ b/compiler/src/ast/parser.rs @@ -244,14 +244,40 @@ where Ok(Spanned::new(let_vars, span)) } + fn parse_if(&mut self, open_span: Span) -> Result, Spanned> { + self.consume()?; + + let condition = self.parse_expr()?.map(Into::into); + let then_expr = self.parse_expr()?.map(Into::into); + let else_expr = match self.peek_token()?.inner { + Token::RightPar => { + self.consume()?; + None + } + _ => { + let expr = self.parse_expr()?.map(Into::into); + self.require_right_par()?; + Some(expr) + } + }; + + let if_stmt = Expr::If { + condition, + then_expr, + else_expr, + }; + let span = Span::new(open_span.start, self.last_token_span.end); + Ok(Spanned::new(if_stmt, span)) + } + fn parse_for(&mut self, open_span: Span) -> Result, Spanned> { self.consume()?; let loop_var = self.parse_sym()?.map(Into::into); self.require_sym("from")?; - let from = self.parse_expr()?.map(Box::new); + let from = self.parse_expr()?.map(Into::into); self.require_sym("to")?; - let to = self.parse_expr()?.map(Box::new); + let to = self.parse_expr()?.map(Into::into); let body = self.parse_body(open_span, true)?; let for_loop = Expr::For { @@ -268,7 +294,7 @@ where self.consume()?; let target_var = self.parse_sym()?.map(Into::into); - let expr = self.parse_expr()?.map(Box::new); + let expr = self.parse_expr()?.map(Into::into); self.require_right_par()?; let set = Expr::Set { target_var, expr }; @@ -312,6 +338,7 @@ where "fn" => self.parse_fn(open_span), "const" => self.parse_const(open_span), "let" => self.parse_let(open_span), + "if" => self.parse_if(open_span), "for" => self.parse_for(open_span), "set" => self.parse_set(open_span), "do" => self.parse_do(open_span), -- cgit v1.3