From 40bf9bc992c39677adc8f0d6d182065cc5706413 Mon Sep 17 00:00:00 2001 From: min Date: Thu, 17 Jul 2025 20:43:48 -0400 Subject: [PATCH] no more semicolon for now --- src/lexer.rs | 4 ---- src/parser.rs | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index dc690e8..c0d13bc 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -45,7 +45,6 @@ kinds!( ParenOpen, ParenClose, Comma, - Semicolon, Eol, Func, If, @@ -285,9 +284,6 @@ where // , comma ',' => self.eat_to(Token::Comma), - // ; semicolon - ';' => self.eat_to(Token::Semicolon), - // = equals // or == equal to '=' => match self.eat_peek() { diff --git a/src/parser.rs b/src/parser.rs index 48b21b7..412678e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -128,8 +128,7 @@ where } // start of a block Token::CurlyOpen => { - let exprs = - self.parse_delimited_until(TokenKind::Semicolon, Some(TokenKind::CurlyClose))?; + let exprs = self.parse_until(Some(TokenKind::CurlyClose))?; // skip curly brace self.eat(); Box::new(Expr::Block(Block { exprs })) @@ -254,6 +253,22 @@ where Ok(lhs) } + fn parse_until(&mut self, until: Option) -> Result> { + let mut exprs = Vec::new(); + + while !self.is_next(until) { + // try to parse expr + exprs.push(*self.parse_expr(Precedence::Min, false)?); + + // check for end + if self.is_next(until) { + break; + } + } + + Ok(exprs) + } + fn parse_delimited_until( &mut self, delim: TokenKind, @@ -283,7 +298,7 @@ where } pub fn parse(&mut self) -> Result { - let exprs = self.parse_delimited_until(TokenKind::Semicolon, None)?; + let exprs = self.parse_until(None)?; Ok(Block { exprs }) } }