From a26c1c31fb004cf3dd776e42db5b8c8f0d6d5e0a Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Fri, 22 May 2026 03:05:08 +0200 Subject: [PATCH] Added forever loop --- codegen/src/statement.rs | 5 +++++ mist-test/src/app.mist | 8 +++++++- parser/src/ast/statement.rs | 1 + parser/src/grammar.pest | 6 ++++++ parser/src/parser/common/statement.rs | 2 ++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/codegen/src/statement.rs b/codegen/src/statement.rs index f4f18d3..d7c4f9d 100644 --- a/codegen/src/statement.rs +++ b/codegen/src/statement.rs @@ -98,6 +98,11 @@ impl GenRust for Statement { cg.ensure_brackets(ctx, body); } + Statement::Loop(body) => { + cg.add("loop "); + cg.ensure_brackets_expr(ctx, body); + } + Statement::CStyleFor { init, condition, diff --git a/mist-test/src/app.mist b/mist-test/src/app.mist index 8ebeed7..644a5bf 100644 --- a/mist-test/src/app.mist +++ b/mist-test/src/app.mist @@ -101,8 +101,14 @@ pub class Application { println!("{i}"); } - while (true) { + var i = 0; + + while (i == 0) { println!("hi"); } + + loop { + println!("loop!"); + } } } \ No newline at end of file diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index c6d9611..fb8b7e0 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -16,6 +16,7 @@ pub enum Statement { else_if: Vec, else_branch: Option>, }, + Loop(Expression), While(StatementBranch), CStyleFor { init: Expression, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 50b7127..5a87ca1 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -29,6 +29,7 @@ keyword = { | "true" | "false" | "dyn" + | "loop" } identifier = @{ @@ -379,6 +380,7 @@ control_flow = { | c_for_stmt | for_stmt | match_stmt + | loop_stmt | block } @@ -412,6 +414,10 @@ for_stmt = { "for" ~ "(" ~ mutable? ~ pattern ~ ":" ~ expr ~ ")" ~ statement } +loop_stmt = { + "loop" ~ statement +} + // ------------------------------------------------------ // MATCH // ------------------------------------------------------ diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index f532b39..7736e97 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -74,6 +74,8 @@ impl<'a> TryFrom> for Statement { Rule::while_stmt => ast_expr!(Statement::While(inner.next().unwrap().try_into())), + Rule::loop_stmt => ast_expr!(Statement::Loop(inner.next().unwrap().try_into())), + Rule::c_for_stmt => ast_expr!(Statement::CStyleFor { init: inner.next().unwrap().try_into(), condition: inner.next().unwrap().try_into(),