From 7688599504231066a54a4c0b331bb7f8e915472d Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 21 May 2026 07:59:00 +0200 Subject: [PATCH] Working soft return --- mist-test/src/main.mist | 4 ++++ parser/src/ast/statement.rs | 5 ++++- parser/src/grammar.pest | 9 +++++++-- parser/src/parser/common/statement.rs | 8 ++++++-- src/codegen.rs | 4 ++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index cdda4c4..db84371 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -9,5 +9,9 @@ void main() { println!("Yes!"); } + i32 y = if (x == 3) { 1 } else { 0 }; + println!("hello, world {x}"); + + println!("{y}") } diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index ea00353..89a2d44 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -3,7 +3,10 @@ use serde::Serialize; use super::*; #[derive(Debug, Clone, Serialize, Default)] -pub struct Block(pub Vec>); +pub struct Block( + pub Vec>, + pub Option>, +); #[derive(Debug, Clone, Serialize)] pub enum Statement { diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 3716e1d..a6bac5d 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -339,7 +339,11 @@ top_level = { // ====================================================== block = { - "{" ~ (statement | unexpected_statement)* ~ "}" + "{" ~ statement_list ~ expr? ~ "}" +} + +statement_list = { + (statement | (!expr ~ unexpected_statement))* } statement = _{ @@ -472,7 +476,8 @@ expr_path = { } primary = { - basic_stmt + control_flow + | basic_stmt | literal | expr_path | tuple diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index e8d1647..8e4f4a4 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -10,8 +10,10 @@ impl<'a> TryFrom> for Block { type Error = AstError<'a, Self>; fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result { + let mut inner = pair.clone().into_inner(); + ast_ensure!(pair, Rule::block => { - ast_expr!(Block(collect_recovered(pair.into_inner()))) + ast_expr!(Block(collect_recovered(inner.next().unwrap().into_inner()), inner.next().map(Spanned::try_from).transpose())) }) } } @@ -39,7 +41,9 @@ impl<'a> TryFrom> for Statement { let mut inner = pair.clone().into_inner(); match rule { - Rule::statement | Rule::basic_stmt | Rule::control_flow => 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())), diff --git a/src/codegen.rs b/src/codegen.rs index 61f4486..3cb5ca7 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -326,6 +326,10 @@ impl ToRust for Block { for stmt in self.0 { cg.add_indentedln(&(stmt.get_rust() + ";")); } + + if let Some(soft_return) = self.1 { + cg.add_indentedln(&soft_return.get_rust()); + } } }