Starting work on patterns
This commit is contained in:
parent
005aba7a10
commit
927f427a86
@ -120,6 +120,7 @@ pub enum Discriminator {
|
|||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
pub enum IfExpressionBody {
|
pub enum IfExpressionBody {
|
||||||
SimpleConditional(Block, Option<Block>),
|
SimpleConditional(Block, Option<Block>),
|
||||||
|
SimplePatternMatch(Pattern, Block, Option<Block>),
|
||||||
GuardList(Vec<Guard>)
|
GuardList(Vec<Guard>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ pattern := identifier //TODO NOT DONE
|
|||||||
/* NEW GOOD */
|
/* NEW GOOD */
|
||||||
|
|
||||||
/* Expression - If */
|
/* Expression - If */
|
||||||
if_expr := 'if' discriminator ('then' condititional | guard_block)
|
if_expr := 'if' discriminator ('then' condititional | 'is' pattern 'then' conditional | guard_block)
|
||||||
discriminator := modified_precedence_expression
|
discriminator := modified_precedence_expression
|
||||||
conditional := block else_clause
|
conditional := block else_clause
|
||||||
else_clause := ε | 'else' block
|
else_clause := ε | 'else' block
|
||||||
@ -634,10 +634,10 @@ impl Parser {
|
|||||||
x?
|
x?
|
||||||
});
|
});
|
||||||
|
|
||||||
let body = Box::new(if let Keyword(Kw::Then) = self.peek() {
|
let body = Box::new(match self.peek() {
|
||||||
self.conditional()?
|
Keyword(Kw::Then) => self.conditional()?,
|
||||||
} else {
|
Keyword(Kw::Is) => self.simple_pattern_match()? ,
|
||||||
self.guard_block()?
|
_ => self.guard_block()?
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(Expression(ExpressionType::IfExpression { discriminator, body }, None))
|
Ok(Expression(ExpressionType::IfExpression { discriminator, body }, None))
|
||||||
@ -654,6 +654,15 @@ impl Parser {
|
|||||||
Ok(IfExpressionBody::SimpleConditional(then_clause, else_clause))
|
Ok(IfExpressionBody::SimpleConditional(then_clause, else_clause))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
parse_method!(simple_pattern_match(&mut self) -> ParseResult<IfExpressionBody> {
|
||||||
|
expect!(self, Keyword(Kw::Is));
|
||||||
|
let pat = self.pattern()?;
|
||||||
|
expect!(self, Keyword(Kw::Then));
|
||||||
|
let then_clause = self.block()?; //TODO should be block_or_expr
|
||||||
|
let else_clause = self.else_clause()?;
|
||||||
|
Ok(IfExpressionBody::SimplePatternMatch(pat, then_clause, else_clause))
|
||||||
|
});
|
||||||
|
|
||||||
parse_method!(guard_block(&mut self) -> ParseResult<IfExpressionBody> {
|
parse_method!(guard_block(&mut self) -> ParseResult<IfExpressionBody> {
|
||||||
ParseError::new("Rest of if not done")
|
ParseError::new("Rest of if not done")
|
||||||
});
|
});
|
||||||
@ -667,6 +676,11 @@ impl Parser {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
parse_method!(pattern(&mut self) -> ParseResult<Pattern> {
|
||||||
|
let identifier = self.identifier()?;
|
||||||
|
Ok(Pattern { })
|
||||||
|
});
|
||||||
|
|
||||||
parse_method!(block(&mut self) -> ParseResult<Block> {
|
parse_method!(block(&mut self) -> ParseResult<Block> {
|
||||||
Ok(delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict))
|
Ok(delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict))
|
||||||
});
|
});
|
||||||
@ -695,10 +709,6 @@ impl Parser {
|
|||||||
Ok(MatchArm { pat, expr })
|
Ok(MatchArm { pat, expr })
|
||||||
});
|
});
|
||||||
|
|
||||||
parse_method!(pattern(&mut self) -> ParseResult<Pattern> {
|
|
||||||
let identifier = self.identifier()?;
|
|
||||||
Ok(Pattern(identifier))
|
|
||||||
});
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
parse_method!(while_expr(&mut self) -> ParseResult<Expression> {
|
parse_method!(while_expr(&mut self) -> ParseResult<Expression> {
|
||||||
|
@ -126,6 +126,14 @@ impl Expression {
|
|||||||
};
|
};
|
||||||
Expr::Conditional { cond, then_clause, else_clause }
|
Expr::Conditional { cond, then_clause, else_clause }
|
||||||
},
|
},
|
||||||
|
IfExpressionBody::SimplePatternMatch(ref pat, ref then_clause, ref else_clause) => {
|
||||||
|
let then_clause = then_clause.iter().map(|expr| expr.reduce(symbol_table)).collect();
|
||||||
|
let else_clause = match else_clause {
|
||||||
|
None => vec![],
|
||||||
|
Some(stmts) => stmts.iter().map(|expr| expr.reduce(symbol_table)).collect(),
|
||||||
|
};
|
||||||
|
Expr::Conditional { cond, then_clause, else_clause }
|
||||||
|
},
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user