From d72fd82c7b1b8d3434807364357c669639801220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vili=20Sinerv=C3=A4?= Date: Fri, 31 Jan 2025 20:08:24 +0200 Subject: [PATCH] Add while-loop parsing --- src/compiler/parser/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/compiler/parser/mod.rs b/src/compiler/parser/mod.rs index 723f657..9a22937 100644 --- a/src/compiler/parser/mod.rs +++ b/src/compiler/parser/mod.rs @@ -105,6 +105,7 @@ fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression TokenType::Integer => parse_int_literal(pos, tokens), TokenType::Identifier => match token.text { "if" => parse_conditional(pos, tokens), + "while" => parse_while_loop(pos, tokens), "true" | "false" => parse_bool_literal(pos, tokens), "var" => panic!("Invalid variable declaration {}", token), _ => { @@ -152,6 +153,15 @@ fn parse_conditional<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Exp Conditional(start.loc, condition, then_expr, else_expr) } +fn parse_while_loop<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { + let start = consume_string(pos, tokens, "while"); + let condition = Box::new(parse_expression(0, pos, tokens)); + consume_string(pos, tokens, "do"); + let do_expr = Box::new(parse_expression(0, pos, tokens)); + + While(start.loc, condition, do_expr) +} + fn parse_parenthesized<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { consume_string(pos, tokens, "("); let expression = parse_expression(0, pos, tokens);