diff --git a/src/compiler/parser/mod.rs b/src/compiler/parser/mod.rs index 70d4b41..80cc3aa 100644 --- a/src/compiler/parser/mod.rs +++ b/src/compiler/parser/mod.rs @@ -36,7 +36,7 @@ fn parse_expression<'source>( &["+", "-"], // 5 &["*", "/", "%"], // 6 &["not", "-"], // 7 - // 8 + // 8, everything not explicitly listed above goes here ]; match level { @@ -92,7 +92,8 @@ fn parse_term<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression }, TokenType::Punctuation => match token.text { "(" => parse_parenthesized(pos, tokens), - _ => todo!(), + "{" => parse_block(pos, tokens), + _ => unreachable!(), }, _ => panic!("Unexpected {}", token), } @@ -122,6 +123,27 @@ fn parse_parenthesized<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> E expression } +fn parse_block<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { + consume_string(pos, tokens, "{"); + + let mut expressions = Vec::new(); + loop { + expressions.push(parse_expression(0, pos, tokens)); + + if peek(pos, tokens).text == "}" { + break; + } + consume_string(pos, tokens, ";"); + if peek(pos, tokens).text == "}" { + expressions.push(EmptyLiteral()); + break; + } + } + + consume_string(pos, tokens, "}"); + Block(expressions) +} + fn parse_function<'source>(pos: &mut usize, tokens: &[Token<'source>]) -> Expression<'source> { let identifier = consume_type(pos, tokens, TokenType::Identifier); consume_string(pos, tokens, "(");