From ed929dd10c8cbf57bf590db8c63cd8878ce2a864 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 26 Jan 2021 21:16:36 +0100 Subject: =?UTF-8?q?For=20loops=20=F0=9F=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (does not support key-value patterns yet) --- src/parse/mod.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/parse') diff --git a/src/parse/mod.rs b/src/parse/mod.rs index f731cd17..ccf333b9 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -319,6 +319,7 @@ fn primary(p: &mut Parser) -> Option { // Keywords. Some(Token::Let) => return expr_let(p), Some(Token::If) => return expr_if(p), + Some(Token::For) => return expr_for(p), // No value. _ => { @@ -417,7 +418,27 @@ fn expr_if(p: &mut Parser) -> Option { expr_if } +/// Parse a for expression. +fn expr_for(p: &mut Parser) -> Option { + p.assert(Token::For); + let mut expr_for = None; + if let Some(pat) = p.span_if(ident) { + if p.expect(Token::In) { + if let Some(iter) = p.span_if(expr) { + if let Some(body) = p.span_if(body) { + expr_for = Some(Expr::For(ExprFor { + pat, + iter: Box::new(iter), + body: Box::new(body), + })); + } + } + } + } + + expr_for +} /// Parse an identifier. fn ident(p: &mut Parser) -> Option { -- cgit v1.2.3