aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/ast/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/ast/parser.rs')
-rw-r--r--compiler/src/ast/parser.rs33
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),