|
|
|
@ -165,6 +165,7 @@ impl Parser {
|
|
|
|
|
TokenKind::Keyword(Keyword::Break) => self.parse_break(), |
|
|
|
|
TokenKind::Keyword(Keyword::Continue) => self.parse_continue(), |
|
|
|
|
TokenKind::Keyword(Keyword::For) => self.parse_for_loop(), |
|
|
|
|
TokenKind::Keyword(Keyword::Match) => self.parse_match_statement(), |
|
|
|
|
TokenKind::Identifier(_) => { |
|
|
|
|
let ident = self.match_identifier()?; |
|
|
|
|
let expr = if self.peek_token(TokenKind::Dot).is_ok() { |
|
|
|
@ -457,6 +458,47 @@ impl Parser {
|
|
|
|
|
)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn parse_match_statement(&mut self) -> Result<Statement, String> { |
|
|
|
|
self.match_keyword(Keyword::Match)?; |
|
|
|
|
let subject = self.parse_expression()?; |
|
|
|
|
self.match_token(TokenKind::CurlyBracesOpen)?; |
|
|
|
|
let mut arms: Vec<MatchArm> = Vec::new(); |
|
|
|
|
|
|
|
|
|
// Used to mitigate multiple default cases were defined
|
|
|
|
|
let mut has_default = false; |
|
|
|
|
loop { |
|
|
|
|
let next = self.peek()?; |
|
|
|
|
match next.kind { |
|
|
|
|
TokenKind::Literal(_) | TokenKind::Identifier(_) => { |
|
|
|
|
arms.push(self.parse_match_arm()?) |
|
|
|
|
} |
|
|
|
|
TokenKind::Keyword(Keyword::Default) => { |
|
|
|
|
if has_default { |
|
|
|
|
return Err(self.make_error_msg( |
|
|
|
|
next.pos, |
|
|
|
|
"Multiple defaults are not allowed".to_string(), |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
has_default = true; |
|
|
|
|
arms.push(self.parse_match_arm()?); |
|
|
|
|
} |
|
|
|
|
TokenKind::CurlyBracesClose => break, |
|
|
|
|
_ => return Err(self.make_error_msg(next.pos, "Illegal token".to_string())) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
self.match_token(TokenKind::CurlyBracesClose)?; |
|
|
|
|
Ok(Statement::Match(subject, arms)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn parse_match_arm(&mut self) -> Result<MatchArm, String> { |
|
|
|
|
let expr = self.parse_expression()?; |
|
|
|
|
self.match_token(TokenKind::ArrowRight)?; |
|
|
|
|
let statement = self.parse_statement()?; |
|
|
|
|
|
|
|
|
|
Ok((expr, statement)) |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn parse_conditional_statement(&mut self) -> Result<Statement, String> { |
|
|
|
|
self.match_keyword(Keyword::If)?; |
|
|
|
|
let condition = self.parse_expression()?; |
|
|
|
|