From 70e6eb6276536b1996ec5c55ec0535c1b8d8bfdf Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 21 May 2026 07:28:19 +0200 Subject: [PATCH] Control flow --- mist-test/src/main.mist | 4 ++++ parser/src/grammar.pest | 12 +++++++++++- parser/src/parser/common/expr.rs | 9 +++------ parser/src/parser/common/statement.rs | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 9e77692..cdda4c4 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -5,5 +5,9 @@ void main() { x++; + if (1 == 1) { + println!("Yes!"); + } + println!("hello, world {x}"); } diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index e8e4d9b..3716e1d 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -343,7 +343,8 @@ block = { } statement = _{ - (expr ~ semicolon) + control_flow + | (expr ~ semicolon) } // ------------------------------------------------------ @@ -377,6 +378,15 @@ var_decl_statement = { // CONDITIONALS // ------------------------------------------------------ +control_flow = { + if_stmt + | while_stmt + | c_for_stmt + | for_stmt + | match_stmt + | block +} + statement_branch = { "(" ~ expr ~ ")" ~ statement } else_if = { diff --git a/parser/src/parser/common/expr.rs b/parser/src/parser/common/expr.rs index 06b26dd..de33878 100644 --- a/parser/src/parser/common/expr.rs +++ b/parser/src/parser/common/expr.rs @@ -78,12 +78,9 @@ impl<'a> TryFrom> for Expression { Rule::static_path => ast_expr!(Expression::Path(pair.try_into())), Rule::literal => ast_expr!(Expression::Literal(pair.try_into())), Rule::expr_path => ast_expr!(Expression::Path(pair.try_into())), - Rule::statement => ast_expr!(Expression::Statement( - pair.try_into().get_map(Box::new).map(Box::new) - )), - Rule::basic_stmt => ast_expr!(Expression::Statement( - pair.try_into().get_map(Box::new).map(Box::new) - )), + Rule::statement | Rule::basic_stmt | Rule::control_flow => ast_expr!( + Expression::Statement(pair.try_into().get_map(Box::new).map(Box::new)) + ), _ => AstError::bug_unimplemented(pair), } diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 1aec7c0..e8d1647 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -39,7 +39,7 @@ impl<'a> TryFrom> for Statement { let mut inner = pair.clone().into_inner(); match rule { - Rule::statement | Rule::basic_stmt => Statement::try_from(inner.next().unwrap()), + Rule::statement | Rule::basic_stmt | Rule::control_flow => Statement::try_from(inner.next().unwrap()), Rule::block => ast_expr!(Statement::Block(pair.try_into())),