From d5e25a15dc4efedf47bf2420051f524ee2dbbda4 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 28 Oct 2025 22:47:58 -0400 Subject: [PATCH] ast: add `continue` expression --- src/ast.rs | 1 + src/lexer.rs | 1 + src/parser/expr.rs | 2 ++ src/token.rs | 1 + 4 files changed, 5 insertions(+) diff --git a/src/ast.rs b/src/ast.rs index f5d9fbc..d1d89f4 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -354,6 +354,7 @@ impl Display for Expr { Self::Bind(v) => v.fmt(f), Self::Make(v) => v.fmt(f), + Self::Op(op @ Op::Continue, exprs) => f.delimit(op, "").list(exprs, "!?,"), Self::Op(op @ (Op::If | Op::While), exprs) => match exprs.as_slice() { [cond, pass, Anno(Expr::Op(Op::Tuple, e), _)] if e.is_empty() => { write!(f, "{op}{cond} {pass}") diff --git a/src/lexer.rs b/src/lexer.rs index 8c7744a..ba9e9af 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -292,6 +292,7 @@ impl<'t> Lexer<'t> { "as" => TKind::As, "break" => TKind::Break, "const" => TKind::Const, + "continue" => TKind::Continue, "do" => TKind::Do, "else" => TKind::Else, "enum" => TKind::Enum, diff --git a/src/parser/expr.rs b/src/parser/expr.rs index 52f06d7..cc4103c 100644 --- a/src/parser/expr.rs +++ b/src/parser/expr.rs @@ -120,6 +120,7 @@ fn from_prefix(token: &Token) -> PResult<(Ps, Prec)> { TKind::While => (Ps::Op(Op::While), Prec::Body), TKind::Break => (Ps::Op(Op::Break), Prec::Body), TKind::Return => (Ps::Op(Op::Return), Prec::Body), + TKind::Continue => (Ps::Op(Op::Continue), Prec::Min), TKind::LCurly => (Ps::Op(Op::Block), Prec::Min), TKind::RCurly => (Ps::End, Prec::Do), @@ -266,6 +267,7 @@ impl<'t> Parse<'t> for Expr { Some(value) => Expr::Op(Op::Group, vec![value]), None => Expr::Op(Op::Tuple, vec![]), }, + Ps::Op(Op::Continue) => p.consume().then(Expr::Op(Op::Continue, vec![])), Ps::Op(op @ (Op::If | Op::While)) => { p.consume(); let exprs = vec![ diff --git a/src/token.rs b/src/token.rs index d117e80..bb0de9f 100644 --- a/src/token.rs +++ b/src/token.rs @@ -67,6 +67,7 @@ pub enum TKind { As, Break, Const, + Continue, Do, Else, Enum,