From 5cb8423ecca51412756c514e906f7ff77083abc8 Mon Sep 17 00:00:00 2001 From: greg Date: Sun, 8 Oct 2017 22:02:58 -0700 Subject: [PATCH] Beginning for expressions --- src/schala_lang/parsing.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/schala_lang/parsing.rs b/src/schala_lang/parsing.rs index ee60e24..b174b2a 100644 --- a/src/schala_lang/parsing.rs +++ b/src/schala_lang/parsing.rs @@ -289,7 +289,7 @@ expression := precedence_expr type_anno+ precedence_expr := prefix_expr prefix_expr := prefix_op primary 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_inner := (expression ',')* @@ -310,6 +310,7 @@ call_expr := IDENTIFIER '(' expr_list ')' //TODO maybe make this optional? or no index_expr := '[' (expression (',' (expression)* | ε) ']' expr_list := expression (',' expression)* | ε +for_expr := 'for' ... ???? // a float_literal can still be assigned to an int in type-checking number_literal := int_literal | float_literal @@ -451,7 +452,8 @@ pub enum ExpressionType { indexers: Vec, }, IfExpression(Box, Vec, Option>), - MatchExpression(Box, Vec) + MatchExpression(Box, Vec), + ForExpression } #[derive(Debug, PartialEq, Clone)] @@ -787,6 +789,7 @@ impl Parser { LParen => self.paren_expr(), Keyword(Kw::If) => self.if_expr(), Keyword(Kw::Match) => self.match_expr(), + Keyword(Kw::For) => self.for_expr(), Identifier(_) => self.identifier_expr(), _ => self.literal(), } @@ -879,6 +882,11 @@ impl Parser { Ok(Pattern(identifier)) }); + parse_method!(for_expr(&mut self) -> ParseResult { + expect!(self, Keyword(Kw::For), "'for'"); + Ok(Expression(ExpressionType::ForExpression, None)) + }); + parse_method!(identifier(&mut self) -> ParseResult> { match self.next() { Identifier(s) => Ok(s),