From f084165eabbb8ad1b8e8969078fce89070ab4d96 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 24 Feb 2021 21:29:32 +0100 Subject: =?UTF-8?q?While=20loops=20=F0=9F=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parse/mod.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/parse') diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 8d6958cf..d4cf90c7 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -71,7 +71,7 @@ fn node(p: &mut Parser, at_start: &mut bool) -> Option { Token::UnicodeEscape(t) => Node::Text(unicode_escape(p, t)), // Hashtag + keyword / identifier. - Token::Ident(_) | Token::Let | Token::If | Token::For => { + Token::Ident(_) | Token::Let | Token::If | Token::While | Token::For => { *at_start = false; let stmt = token == Token::Let; let group = if stmt { Group::Stmt } else { Group::Expr }; @@ -191,6 +191,7 @@ fn primary(p: &mut Parser) -> Option { // Keywords. Some(Token::Let) => expr_let(p), Some(Token::If) => expr_if(p), + Some(Token::While) => expr_while(p), Some(Token::For) => expr_for(p), // Structures. @@ -382,6 +383,25 @@ fn expr_if(p: &mut Parser) -> Option { expr_if } +/// Parse a while expresion. +fn expr_while(p: &mut Parser) -> Option { + let start = p.start(); + p.assert(Token::While); + + let mut expr_while = None; + if let Some(condition) = expr(p) { + if let Some(body) = body(p) { + expr_while = Some(Expr::While(ExprWhile { + span: p.span(start), + condition: Box::new(condition), + body: Box::new(body), + })); + } + } + + expr_while +} + /// Parse a for expression. fn expr_for(p: &mut Parser) -> Option { let start = p.start(); -- cgit v1.2.3