Beginning for expressions
This commit is contained in:
parent
4032707dc9
commit
5cb8423ecc
@ -289,7 +289,7 @@ expression := precedence_expr type_anno+
|
|||||||
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 | if_expr | match_expr | identifier_expr
|
primary := literal | paren_expr | if_expr | match_expr | for_expr | identifier_expr
|
||||||
|
|
||||||
paren_expr := LParen paren_inner RParen
|
paren_expr := LParen paren_inner RParen
|
||||||
paren_inner := (expression ',')*
|
paren_inner := (expression ',')*
|
||||||
@ -310,6 +310,7 @@ call_expr := IDENTIFIER '(' expr_list ')' //TODO maybe make this optional? or no
|
|||||||
index_expr := '[' (expression (',' (expression)* | ε) ']'
|
index_expr := '[' (expression (',' (expression)* | ε) ']'
|
||||||
expr_list := expression (',' expression)* | ε
|
expr_list := expression (',' expression)* | ε
|
||||||
|
|
||||||
|
for_expr := 'for' ... ????
|
||||||
|
|
||||||
// a float_literal can still be assigned to an int in type-checking
|
// a float_literal can still be assigned to an int in type-checking
|
||||||
number_literal := int_literal | float_literal
|
number_literal := int_literal | float_literal
|
||||||
@ -451,7 +452,8 @@ pub enum ExpressionType {
|
|||||||
indexers: Vec<Expression>,
|
indexers: Vec<Expression>,
|
||||||
},
|
},
|
||||||
IfExpression(Box<Expression>, Vec<Statement>, Option<Vec<Statement>>),
|
IfExpression(Box<Expression>, Vec<Statement>, Option<Vec<Statement>>),
|
||||||
MatchExpression(Box<Expression>, Vec<MatchArm>)
|
MatchExpression(Box<Expression>, Vec<MatchArm>),
|
||||||
|
ForExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
@ -787,6 +789,7 @@ impl Parser {
|
|||||||
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(),
|
Keyword(Kw::Match) => self.match_expr(),
|
||||||
|
Keyword(Kw::For) => self.for_expr(),
|
||||||
Identifier(_) => self.identifier_expr(),
|
Identifier(_) => self.identifier_expr(),
|
||||||
_ => self.literal(),
|
_ => self.literal(),
|
||||||
}
|
}
|
||||||
@ -879,6 +882,11 @@ impl Parser {
|
|||||||
Ok(Pattern(identifier))
|
Ok(Pattern(identifier))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
parse_method!(for_expr(&mut self) -> ParseResult<Expression> {
|
||||||
|
expect!(self, Keyword(Kw::For), "'for'");
|
||||||
|
Ok(Expression(ExpressionType::ForExpression, None))
|
||||||
|
});
|
||||||
|
|
||||||
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…
Reference in New Issue
Block a user