Match expressions
not done yet
This commit is contained in:
parent
18fa160fed
commit
6bff7aac0d
@ -297,15 +297,18 @@ expression := precedence_expr
|
|||||||
precedence_expr := prefix_expr
|
precedence_expr := prefix_expr
|
||||||
prefix_expr := prefix_op primary
|
prefix_expr := prefix_op primary
|
||||||
prefix_op := '+' | '-' | '!' | '~'
|
prefix_op := '+' | '-' | '!' | '~'
|
||||||
primary := literal | paren_expr | identifier_expr
|
primary := literal | paren_expr | if_expr | match_expr | identifier_expr
|
||||||
|
|
||||||
paren_expr := LParen expression RParen
|
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
|
literal := 'true' | 'false' | number_literal | STR_LITERAL
|
||||||
|
|
||||||
if_expr := 'if' expression block else_clause
|
if_expr := 'if' expression block else_clause
|
||||||
else_clause := ε | 'else' block
|
else_clause := ε | 'else' block
|
||||||
|
|
||||||
|
match_expr := 'match' expression '{' match_body '}'
|
||||||
|
match_body := pattern '=>' expression
|
||||||
|
|
||||||
block := '{' (statement)* '}'
|
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
|
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() {
|
match self.peek() {
|
||||||
LParen => self.paren_expr(),
|
LParen => self.paren_expr(),
|
||||||
Keyword(Kw::If) => self.if_expr(),
|
Keyword(Kw::If) => self.if_expr(),
|
||||||
|
Keyword(Kw::Match) => self.match_expr(),
|
||||||
Identifier(_) => self.identifier_expr(),
|
Identifier(_) => self.identifier_expr(),
|
||||||
_ => self.literal(),
|
_ => self.literal(),
|
||||||
}
|
}
|
||||||
@ -707,6 +711,15 @@ impl Parser {
|
|||||||
Ok(statements)
|
Ok(statements)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
parse_method!(match_expr(&mut self) -> ParseResult<Expression> {
|
||||||
|
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<Rc<String>> {
|
parse_method!(identifier(&mut self) -> ParseResult<Rc<String>> {
|
||||||
match self.next() {
|
match self.next() {
|
||||||
Identifier(s) => Ok(s),
|
Identifier(s) => Ok(s),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user