diff --git a/vine/examples/break_return.vi b/vine/examples/break_return.vi new file mode 100644 index 00000000..ff92d1a2 --- /dev/null +++ b/vine/examples/break_return.vi @@ -0,0 +1,28 @@ + +use std::{io::println, u32}; + +fn main(io) { + println("hey"); + + + // let a = unit(); + // let b = loop_unit(); + + println("hey"); + + /* + if a == b { + println("Hurray for units!") + } + */ +} + +fn unit() { + return; +} + +fn loop_unit() { + return loop { + break; + } +} \ No newline at end of file diff --git a/vine/src/parser.rs b/vine/src/parser.rs index 29ee86cd..6b56b55e 100644 --- a/vine/src/parser.rs +++ b/vine/src/parser.rs @@ -248,10 +248,24 @@ impl<'ctx, 'src> VineParser<'ctx, 'src> { fn _parse_expr_prefix(&mut self, span: usize) -> Parse<'src, ExprKind> { if self.eat(Token::Return)? { + if self.check(Token::Semi) { + self.eat(Token::Semi)?; + return Ok(ExprKind::Return(Box::new(Expr { + span: self.span(), + kind: ExprKind::Tuple(Vec::new()), + }))); + } return Ok(ExprKind::Return(Box::new(self.parse_expr_bp(BP::ControlFlow)?))); } if self.eat(Token::Break)? { - return Ok(ExprKind::Break(Box::new(self.parse_expr_bp(BP::ControlFlow)?))); + if self.check(Token::Semi) { + self.eat(Token::Semi)?; + return Ok(ExprKind::Return(Box::new(Expr { + span: self.span(), + kind: ExprKind::Tuple(Vec::new()), + }))); + } + return Ok(ExprKind::Return(Box::new(self.parse_expr_bp(BP::ControlFlow)?))); } if self.eat(Token::Continue)? { return Ok(ExprKind::Continue);