From 837a180b092cd851b810fe8569028ade9ce8e9f3 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 13 Jul 2018 21:50:38 -0700 Subject: [PATCH] Starting work on guard arms --- schala-lang/src/ast.rs | 20 ++++++++++++++++---- schala-lang/src/parsing.rs | 12 ++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/schala-lang/src/ast.rs b/schala-lang/src/ast.rs index 191997c..73ec35e 100644 --- a/schala-lang/src/ast.rs +++ b/schala-lang/src/ast.rs @@ -125,13 +125,25 @@ pub enum Discriminator { pub enum IfExpressionBody { SimpleConditional(Block, Option), SimplePatternMatch(Pattern, Block, Option), - GuardList(Vec) + GuardList(Vec) } #[derive(Debug, PartialEq, Clone)] -pub struct Guard { - pat: Pattern, - body: Block, +pub struct GuardArm { + pub guard: Guard, + pub body: Block, +} + +#[derive(Debug, PartialEq, Clone)] +pub enum Guard { + Pat(Pattern), + HalfExpr(HalfExpr) +} + +#[derive(Debug, PartialEq, Clone)] +pub struct HalfExpr { + pub op: Option, + pub expr: ExpressionType, } #[derive(Debug, PartialEq, Clone)] diff --git a/schala-lang/src/parsing.rs b/schala-lang/src/parsing.rs index 096d002..2dde59d 100644 --- a/schala-lang/src/parsing.rs +++ b/schala-lang/src/parsing.rs @@ -124,7 +124,8 @@ modified_precedence_expression := ??? conditional := block else_clause simple_pattern_match := pattern 'then' conditional else_clause := ε | 'else' block -guard_block := '{' (guard, ',')* '}' +guard_block := '{' (guard_arm, ',')* '}' +guard_arm := guard '->' block guard := ?? /* Expression - While */ @@ -701,10 +702,17 @@ impl Parser { }); parse_method!(guard_block(&mut self) -> ParseResult { - let guards = delimited!(self, LCurlyBrace, guard, Comma, RCurlyBrace); + let guards = delimited!(self, LCurlyBrace, guard_arm, Comma, RCurlyBrace); Ok(IfExpressionBody::GuardList(guards)) }); + parse_method!(guard_arm(&mut self) -> ParseResult { + let guard = self.guard()?; + expect!(self, Operator(ref c) if **c == "->"); + let body = self.block()?; + Ok(GuardArm { guard, body }) + }); + parse_method!(guard(&mut self) -> ParseResult { unimplemented!() });