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!() });