From c9030809fd6d7dcef06f7ce892cb8c1050bc3674 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sat, 16 May 2026 22:40:01 +0200 Subject: [PATCH] Compound assign statement --- mist-test/src/app.mist | 2 +- parser/src/ast.rs | 10 +++++++++- parser/src/grammar.pest | 17 +++++++++++++++++ parser/src/parser/common/statement.rs | 16 +++++++++++----- src/codegen.rs | 15 ++++++++++++++- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/mist-test/src/app.mist b/mist-test/src/app.mist index 01fbd87..3358be9 100644 --- a/mist-test/src/app.mist +++ b/mist-test/src/app.mist @@ -46,7 +46,7 @@ pub class Application { void tick(self mut*) { self.logger.info("tick"); - self.ticks = self.ticks + 1; + self.ticks += 1; var task = task::create_task("background-job"); diff --git a/parser/src/ast.rs b/parser/src/ast.rs index d2acb95..834dc35 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -181,7 +181,15 @@ pub enum Statement { Block(Block), VarDecl(VarDeclStmt), - VarAssign(VarAssignStmt), + Assign { + target: Expression, + value: Expression, + }, + CompoundAssign { + target: Expression, + compound: String, + value: Expression, + }, If { initial: StatementBranch, else_if: Vec, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 945c825..64fb96b 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -314,6 +314,7 @@ statement = _{ expr_stmt | match_stmt | assign_statement + | compound_assign_statement | if_stmt | while_stmt | c_for_stmt @@ -353,6 +354,22 @@ assign_statement = { expr ~ "=" ~ expr ~ semicolon } +compound_assign = { + "+=" + | "-=" + | "/=" + | "%=" + | "&=" + | "|=" + | "^=" + | "<<=" + | ">>=" +} + +compound_assign_statement = { + expr ~ compound_assign ~ expr ~ semicolon +} + // ------------------------------------------------------ // CONDITIONALS // ------------------------------------------------------ diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 243e6a3..34d35f9 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -88,13 +88,10 @@ impl<'a> TryFrom> for Statement { body: inner.next().unwrap().try_into().map(Box::new), }), - Rule::assign_statement => ast_expr!(VarAssignStmt { + Rule::assign_statement => ast_expr!(Statement::Assign { target: inner.next().unwrap().try_into(), value: inner.next().unwrap().try_into(), - }) - .map(Statement::VarAssign) - .get_map(Statement::VarAssign), - + }), Rule::match_stmt => ast_expr!(Statement::Match( inner.next().unwrap().try_into(), inner @@ -108,6 +105,15 @@ impl<'a> TryFrom> for Statement { .collect::>>(), )), + Rule::compound_assign_statement => { + ast_expr!(Statement::CompoundAssign { + target: inner.next().unwrap().try_into(), + compound: Ok(inner.next().unwrap().as_str().trim().to_string()) + as AstResult<'_, String>, + value: inner.next().unwrap().try_into(), + }) + } + Rule::unexpected_statement => { return Err(AstError { span: pair.as_span(), diff --git a/src/codegen.rs b/src/codegen.rs index f60d37e..b3fbfe5 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -545,10 +545,23 @@ impl ToRust for Statement { cg.add_indentedln(&format!("let {}{};", decl.get_rust(), init)); } - Statement::VarAssign(VarAssignStmt { target, value }) => { + Statement::Assign { target, value } => { cg.add_indentedln(&format!("{} = {};", target.get_rust(), value.get_rust(),)); } + Statement::CompoundAssign { + target, + compound, + value, + } => { + cg.add_indentedln(&format!( + "{} {} {};", + target.get_rust(), + compound, + value.get_rust(), + )); + } + Statement::Match(expr, match_items) => { cg.add_indentedln(&format!("match {} {{", expr.get_rust())); cg.indent += 1;