diff --git a/src/schala_lang/parsing.rs b/src/schala_lang/parsing.rs index 9f0dcd0..97b4b7b 100644 --- a/src/schala_lang/parsing.rs +++ b/src/schala_lang/parsing.rs @@ -297,15 +297,18 @@ expression := precedence_expr precedence_expr := prefix_expr prefix_expr := prefix_op primary prefix_op := '+' | '-' | '!' | '~' -primary := literal | paren_expr | identifier_expr +primary := literal | paren_expr | if_expr | match_expr | identifier_expr paren_expr := LParen expression RParen -identifier_expr := call_expr | index_expr | if_expr | IDENTIFIER +identifier_expr := call_expr | index_expr | IDENTIFIER literal := 'true' | 'false' | number_literal | STR_LITERAL if_expr := 'if' expression block else_clause else_clause := ε | 'else' block +match_expr := 'match' expression '{' match_body '}' +match_body := pattern '=>' expression + block := '{' (statement)* '}' call_expr := IDENTIFIER '(' expr_list ')' //TODO maybe make this optional? or no, have a bare identifier meant to be used as method taken care of in eval @@ -606,6 +609,7 @@ impl Parser { match self.peek() { LParen => self.paren_expr(), Keyword(Kw::If) => self.if_expr(), + Keyword(Kw::Match) => self.match_expr(), Identifier(_) => self.identifier_expr(), _ => self.literal(), } @@ -707,6 +711,15 @@ impl Parser { Ok(statements) }); + parse_method!(match_expr(&mut self) -> ParseResult { + expect!(self, Keyword(Kw::Match), "Expected 'match'"); + let expr = self.expression()?; + expect!(self, LCurlyBrace, "Expected '{'"); + let body = self.match_body()?; + expect!(self, RCurlyBrace, "Expected '}'"); + unimplementd!() + }); + parse_method!(identifier(&mut self) -> ParseResult> { match self.next() { Identifier(s) => Ok(s),