From 0878b9f0b9e91bfe972a8f78c63e7c0a3b6fb72a Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 21 May 2026 07:05:58 +0200 Subject: [PATCH] Improving operators and suffix --- mist-test/src/main.mist | 6 ++- parser/src/ast/expr.rs | 3 ++ parser/src/ast/statement.rs | 8 ---- parser/src/grammar.pest | 61 +++++++++++++-------------- parser/src/parser/common/expr.rs | 3 ++ parser/src/parser/common/statement.rs | 14 ------ src/codegen.rs | 20 ++------- 7 files changed, 43 insertions(+), 72 deletions(-) diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 1292b05..9bf7b6a 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,5 +1,7 @@ void main() { - i32 x; + i32 mut x = 10; - println!("hello, world"); + x++; + + println!("hello, world {x}"); } diff --git a/parser/src/ast/expr.rs b/parser/src/ast/expr.rs index 56e0584..0ecdaca 100644 --- a/parser/src/ast/expr.rs +++ b/parser/src/ast/expr.rs @@ -70,8 +70,11 @@ pub enum Postfix { Call(Vec), MacroCall(String), StructCall(Vec<(Identifier, Expression)>), + Assign(String, Box), Index(Expression), As(TypeExpr), + Increment, + Decrement, Try, } diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index 0e9c056..ea00353 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -9,11 +9,6 @@ pub struct Block(pub Vec>); pub enum Statement { Block(Block), VarDecl(VarDeclStmt), - Assign { - target: Expression, - compound: String, - value: Expression, - }, If { initial: StatementBranch, else_if: Vec, @@ -37,9 +32,6 @@ pub enum Statement { Return(Option), Break, Continue, - - Increment(Expression), - Decrement(Expression), } #[derive(Debug, Clone, Serialize)] diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 1315e6f..5f25152 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -343,7 +343,7 @@ block = { } statement = _{ - ((expr | basic_stmt_left_recurse) ~ semicolon) + (expr ~ semicolon) } // ------------------------------------------------------ @@ -357,12 +357,6 @@ basic_stmt = { | var_decl_statement } -basic_stmt_left_recurse = { - increment_statement - | decrement_statement - | assign_statement -} - return_stmt = { "return" ~ expr? } @@ -379,31 +373,6 @@ var_decl_statement = { var_decl ~ ("=" ~ expr)? } -increment_statement = { - expr ~ "++" -} - -decrement_statement = { - expr ~ "--" -} - -compound_assign = { - "=" - | "+=" - | "-=" - | "/=" - | "%=" - | "&=" - | "|=" - | "^=" - | "<<=" - | ">>=" -} - -assign_statement = { - expr ~ compound_assign ~ expr ~ semicolon -} - // ------------------------------------------------------ // CONDITIONALS // ------------------------------------------------------ @@ -536,6 +505,31 @@ try_px = { "?" } +increment = { + "++" +} + +decrement = { + "--" +} + +compound_assign = { + "=" + | "+=" + | "-=" + | "/=" + | "%=" + | "&=" + | "|=" + | "^=" + | "<<=" + | ">>=" +} + +assign = { + compound_assign ~ expr +} + postfix = { field_px | call_px @@ -544,6 +538,9 @@ postfix = { | index_px | as_px | try_px + | increment + | decrement + | assign } // ------------------------------------------------------ diff --git a/parser/src/parser/common/expr.rs b/parser/src/parser/common/expr.rs index ddc83fb..107c8e8 100644 --- a/parser/src/parser/common/expr.rs +++ b/parser/src/parser/common/expr.rs @@ -191,6 +191,9 @@ impl<'a> TryFrom> for Postfix { Rule::try_px => Ok(Postfix::Try), + Rule::increment => Ok(Postfix::Increment), + Rule::decrement => Ok(Postfix::Decrement), + _ => AstError::bug_unimplemented(pair), } } diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 6d369f6..1aec7c0 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -84,12 +84,6 @@ impl<'a> TryFrom> for Statement { body: inner.next().unwrap().try_into().map(Box::new), }), - Rule::assign_statement => ast_expr!(Statement::Assign { - 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::match_stmt => ast_expr!(Statement::Match( inner.next().unwrap().try_into(), inner @@ -103,14 +97,6 @@ impl<'a> TryFrom> for Statement { .collect::>>(), )), - Rule::increment_statement => { - ast_expr!(Statement::Increment(inner.next().unwrap().try_into())) - } - - Rule::decrement_statement => { - ast_expr!(Statement::Decrement(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 de58d2e..2c8e296 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -319,6 +319,10 @@ impl GetRust for Postfix { Postfix::As(ty) => format!(" as {}", ty.get_rust()), Postfix::Try => String::from("?"), + + Postfix::Assign(cmp, expr) => format!("{cmp} {}", expr.get_rust()), + Postfix::Increment => "+=1".to_string(), + Postfix::Decrement => "-=1".to_string(), } } } @@ -630,19 +634,6 @@ impl ToRust for Statement { cg.add_indentedln(&format!("let {}{};", decl.get_rust(), init)); } - Statement::Assign { - 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; @@ -740,9 +731,6 @@ impl ToRust for Statement { Statement::Break => cg.add_indentedln("break;"), Statement::Continue => cg.add_indentedln("continue;"), - - Statement::Increment(e) => cg.add_indentedln(&format!("{}+=1;", e.get_rust())), - Statement::Decrement(e) => cg.add_indentedln(&format!("{}-=1;", e.get_rust())), } } }