From 0f90e8108c28e350d4e51fc3c6d1ddebec094f7d Mon Sep 17 00:00:00 2001 From: mars Date: Wed, 2 Mar 2022 14:51:18 -0700 Subject: [PATCH] While loop --- src/lexer.rs | 3 ++- src/parse.rs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lexer.rs b/src/lexer.rs index c4394f9..36fc8cf 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -15,9 +15,10 @@ pub enum Token { #[token("struct")] Struct, #[token("fn")] Function, #[token("for")] For, + #[token("in")] In, + #[token("while")] While, #[token("if")] If, #[token("else")] Else, - #[token("in")] In, #[token("let")] Let, #[token("mut")] Mut, #[token("interface")] Interface, diff --git a/src/parse.rs b/src/parse.rs index 12eaf98..2e5468f 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -317,6 +317,20 @@ impl<'a> BranchBody<'a> { next = Some(tail); } } + Token::While => { + let test_expr = match Expr::build(lexer) { + (Some(test_expr), Token::BraceOpen) => test_expr, + (Some(_), _) => lexer.panic_message("Expected opening brace"), + _ => lexer.panic_message("Expected test expression"), + }; + + let loop_body = BranchBody::build(lexer); + + statements.push(Statement::While { + test_expr, + loop_body, + }); + } Token::BraceClose => break None, _ => match Expr::build_start(tok, lexer) { (None, Token::Semicolon | Token::BraceClose) => {} @@ -516,6 +530,10 @@ pub enum Literal<'a> { pub enum Statement<'a> { Expr(Expr<'a>), If(IfStmt<'a>), + While { + test_expr: Expr<'a>, + loop_body: BranchBody<'a>, + }, Let { var: &'a str, mutable: bool,