From 9447888a4f1f85420b1b7273439448625ebe93ef Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Sat, 6 Feb 2021 21:05:56 +0100 Subject: [PATCH] feat: nested expressions --- TODO | 1 - examples/playground.sb | 5 +---- src/parser/rules.rs | 20 +++++++++++++++----- src/parser/tests.rs | 13 +++++++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/TODO b/TODO index 6d08d2b..95bc756 100644 --- a/TODO +++ b/TODO @@ -6,7 +6,6 @@ - stdlib moves line of file, which makes error reporting impossible # Features -- Nested expressions like (1 + (2 * 2)) - Nested arrays like [[1, 2, 3], [1, 2, 3]] - Break and Continue keywords - Type inference diff --git a/examples/playground.sb b/examples/playground.sb index 7d6084a..84d1e07 100644 --- a/examples/playground.sb +++ b/examples/playground.sb @@ -1,7 +1,4 @@ fn main() { - another_function(5) -} - -fn another_function(x: int) { + let x = (1 + 2 * (3 + 2)) println(x) } \ No newline at end of file diff --git a/src/parser/rules.rs b/src/parser/rules.rs index c85e2de..41ff117 100644 --- a/src/parser/rules.rs +++ b/src/parser/rules.rs @@ -198,6 +198,11 @@ impl Parser { fn parse_expression(&mut self) -> Result { let token = self.next()?; match token.kind { + TokenKind::BraceOpen => { + let expr = self.parse_expression()?; + self.match_token(TokenKind::BraceClose)?; + Ok(expr) + } TokenKind::Keyword(Keyword::Boolean) => { let state = match BinOp::try_from(self.peek()?.kind) { Ok(_) => self.parse_bin_op(None)?, @@ -308,7 +313,14 @@ impl Parser { let expr = self.parse_expression()?; let body = self.parse_block()?; - Ok(Statement::For(Variable {name: ident, ty: None}, expr, Box::new(body))) + Ok(Statement::For( + Variable { + name: ident, + ty: None, + }, + expr, + Box::new(body), + )) } fn parse_conditional_statement(&mut self) -> Result { @@ -381,13 +393,11 @@ impl Parser { match self.peek()?.kind { TokenKind::Assign => { - self.match_token(TokenKind::Assign)?; + self.match_token(TokenKind::Assign)?; let expr = self.parse_expression()?; Ok(Statement::Declare(Variable { name, ty }, Some(expr))) - }, - _ => { - Ok(Statement::Declare(Variable {name, ty}, None)) } + _ => Ok(Statement::Declare(Variable { name, ty }, None)), } } diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 0429de0..0ac88c3 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -693,3 +693,16 @@ fn test_nested_array() { let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()); } + +#[test] +fn test_simple_nested_expression() { + let raw = " + fn main() { + let x = (1 + 2 * (3 + 2)) + println(x) + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()); +}