diff options
| author | Tolmachev Igor <me@igorek.dev> | 2026-05-22 21:22:25 +0300 |
|---|---|---|
| committer | Tolmachev Igor <me@igorek.dev> | 2026-05-22 21:22:25 +0300 |
| commit | 662bc1d55d9fecf173e873b5d00e95fd7635e73d (patch) | |
| tree | 2ccaf5c68a4c575276da63f0ecc9b2a62fcd73ce /compiler/src/ast/parser.rs | |
| parent | abda8d00117072f7c03f57eaeca9cf44427078dc (diff) | |
| download | crisp-662bc1d55d9fecf173e873b5d00e95fd7635e73d.tar.gz crisp-662bc1d55d9fecf173e873b5d00e95fd7635e73d.zip | |
Implement If expression supportdev-easy
I forgor
Diffstat (limited to 'compiler/src/ast/parser.rs')
| -rw-r--r-- | compiler/src/ast/parser.rs | 33 |
1 files changed, 30 insertions, 3 deletions
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 | |||
| 244 | Ok(Spanned::new(let_vars, span)) | 244 | Ok(Spanned::new(let_vars, span)) |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | fn parse_if(&mut self, open_span: Span) -> Result<Spanned<Expr>, Spanned<Error>> { | ||
| 248 | self.consume()?; | ||
| 249 | |||
| 250 | let condition = self.parse_expr()?.map(Into::into); | ||
| 251 | let then_expr = self.parse_expr()?.map(Into::into); | ||
| 252 | let else_expr = match self.peek_token()?.inner { | ||
| 253 | Token::RightPar => { | ||
| 254 | self.consume()?; | ||
| 255 | None | ||
| 256 | } | ||
| 257 | _ => { | ||
| 258 | let expr = self.parse_expr()?.map(Into::into); | ||
| 259 | self.require_right_par()?; | ||
| 260 | Some(expr) | ||
| 261 | } | ||
| 262 | }; | ||
| 263 | |||
| 264 | let if_stmt = Expr::If { | ||
| 265 | condition, | ||
| 266 | then_expr, | ||
| 267 | else_expr, | ||
| 268 | }; | ||
| 269 | let span = Span::new(open_span.start, self.last_token_span.end); | ||
| 270 | Ok(Spanned::new(if_stmt, span)) | ||
| 271 | } | ||
| 272 | |||
| 247 | fn parse_for(&mut self, open_span: Span) -> Result<Spanned<Expr>, Spanned<Error>> { | 273 | fn parse_for(&mut self, open_span: Span) -> Result<Spanned<Expr>, Spanned<Error>> { |
| 248 | self.consume()?; | 274 | self.consume()?; |
| 249 | 275 | ||
| 250 | let loop_var = self.parse_sym()?.map(Into::into); | 276 | let loop_var = self.parse_sym()?.map(Into::into); |
| 251 | self.require_sym("from")?; | 277 | self.require_sym("from")?; |
| 252 | let from = self.parse_expr()?.map(Box::new); | 278 | let from = self.parse_expr()?.map(Into::into); |
| 253 | self.require_sym("to")?; | 279 | self.require_sym("to")?; |
| 254 | let to = self.parse_expr()?.map(Box::new); | 280 | let to = self.parse_expr()?.map(Into::into); |
| 255 | let body = self.parse_body(open_span, true)?; | 281 | let body = self.parse_body(open_span, true)?; |
| 256 | 282 | ||
| 257 | let for_loop = Expr::For { | 283 | let for_loop = Expr::For { |
| @@ -268,7 +294,7 @@ where | |||
| 268 | self.consume()?; | 294 | self.consume()?; |
| 269 | 295 | ||
| 270 | let target_var = self.parse_sym()?.map(Into::into); | 296 | let target_var = self.parse_sym()?.map(Into::into); |
| 271 | let expr = self.parse_expr()?.map(Box::new); | 297 | let expr = self.parse_expr()?.map(Into::into); |
| 272 | self.require_right_par()?; | 298 | self.require_right_par()?; |
| 273 | 299 | ||
| 274 | let set = Expr::Set { target_var, expr }; | 300 | let set = Expr::Set { target_var, expr }; |
| @@ -312,6 +338,7 @@ where | |||
| 312 | "fn" => self.parse_fn(open_span), | 338 | "fn" => self.parse_fn(open_span), |
| 313 | "const" => self.parse_const(open_span), | 339 | "const" => self.parse_const(open_span), |
| 314 | "let" => self.parse_let(open_span), | 340 | "let" => self.parse_let(open_span), |
| 341 | "if" => self.parse_if(open_span), | ||
| 315 | "for" => self.parse_for(open_span), | 342 | "for" => self.parse_for(open_span), |
| 316 | "set" => self.parse_set(open_span), | 343 | "set" => self.parse_set(open_span), |
| 317 | "do" => self.parse_do(open_span), | 344 | "do" => self.parse_do(open_span), |
