Improving operators and suffix

This commit is contained in:
2026-05-21 07:05:58 +02:00
parent b28591f9e6
commit 0878b9f0b9
7 changed files with 43 additions and 72 deletions
+4 -2
View File
@@ -1,5 +1,7 @@
void main() { void main() {
i32 x; i32 mut x = 10;
println!("hello, world"); x++;
println!("hello, world {x}");
} }
+3
View File
@@ -70,8 +70,11 @@ pub enum Postfix {
Call(Vec<Expression>), Call(Vec<Expression>),
MacroCall(String), MacroCall(String),
StructCall(Vec<(Identifier, Expression)>), StructCall(Vec<(Identifier, Expression)>),
Assign(String, Box<Expression>),
Index(Expression), Index(Expression),
As(TypeExpr), As(TypeExpr),
Increment,
Decrement,
Try, Try,
} }
-8
View File
@@ -9,11 +9,6 @@ pub struct Block(pub Vec<Spanned<Expression>>);
pub enum Statement { pub enum Statement {
Block(Block), Block(Block),
VarDecl(VarDeclStmt), VarDecl(VarDeclStmt),
Assign {
target: Expression,
compound: String,
value: Expression,
},
If { If {
initial: StatementBranch, initial: StatementBranch,
else_if: Vec<StatementBranch>, else_if: Vec<StatementBranch>,
@@ -37,9 +32,6 @@ pub enum Statement {
Return(Option<Expression>), Return(Option<Expression>),
Break, Break,
Continue, Continue,
Increment(Expression),
Decrement(Expression),
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
+29 -32
View File
@@ -343,7 +343,7 @@ block = {
} }
statement = _{ statement = _{
((expr | basic_stmt_left_recurse) ~ semicolon) (expr ~ semicolon)
} }
// ------------------------------------------------------ // ------------------------------------------------------
@@ -357,12 +357,6 @@ basic_stmt = {
| var_decl_statement | var_decl_statement
} }
basic_stmt_left_recurse = {
increment_statement
| decrement_statement
| assign_statement
}
return_stmt = { return_stmt = {
"return" ~ expr? "return" ~ expr?
} }
@@ -379,31 +373,6 @@ var_decl_statement = {
var_decl ~ ("=" ~ expr)? var_decl ~ ("=" ~ expr)?
} }
increment_statement = {
expr ~ "++"
}
decrement_statement = {
expr ~ "--"
}
compound_assign = {
"="
| "+="
| "-="
| "/="
| "%="
| "&="
| "|="
| "^="
| "<<="
| ">>="
}
assign_statement = {
expr ~ compound_assign ~ expr ~ semicolon
}
// ------------------------------------------------------ // ------------------------------------------------------
// CONDITIONALS // CONDITIONALS
// ------------------------------------------------------ // ------------------------------------------------------
@@ -536,6 +505,31 @@ try_px = {
"?" "?"
} }
increment = {
"++"
}
decrement = {
"--"
}
compound_assign = {
"="
| "+="
| "-="
| "/="
| "%="
| "&="
| "|="
| "^="
| "<<="
| ">>="
}
assign = {
compound_assign ~ expr
}
postfix = { postfix = {
field_px field_px
| call_px | call_px
@@ -544,6 +538,9 @@ postfix = {
| index_px | index_px
| as_px | as_px
| try_px | try_px
| increment
| decrement
| assign
} }
// ------------------------------------------------------ // ------------------------------------------------------
+3
View File
@@ -191,6 +191,9 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Postfix {
Rule::try_px => Ok(Postfix::Try), Rule::try_px => Ok(Postfix::Try),
Rule::increment => Ok(Postfix::Increment),
Rule::decrement => Ok(Postfix::Decrement),
_ => AstError::bug_unimplemented(pair), _ => AstError::bug_unimplemented(pair),
} }
} }
-14
View File
@@ -84,12 +84,6 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Statement {
body: inner.next().unwrap().try_into().map(Box::new), 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( Rule::match_stmt => ast_expr!(Statement::Match(
inner.next().unwrap().try_into(), inner.next().unwrap().try_into(),
inner inner
@@ -103,14 +97,6 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Statement {
.collect::<AstResult<'a, Vec<_>>>(), .collect::<AstResult<'a, Vec<_>>>(),
)), )),
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 => { Rule::unexpected_statement => {
return Err(AstError { return Err(AstError {
span: pair.as_span(), span: pair.as_span(),
+4 -16
View File
@@ -319,6 +319,10 @@ impl GetRust for Postfix {
Postfix::As(ty) => format!(" as {}", ty.get_rust()), Postfix::As(ty) => format!(" as {}", ty.get_rust()),
Postfix::Try => String::from("?"), 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)); 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) => { Statement::Match(expr, match_items) => {
cg.add_indentedln(&format!("match {} {{", expr.get_rust())); cg.add_indentedln(&format!("match {} {{", expr.get_rust()));
cg.indent += 1; cg.indent += 1;
@@ -740,9 +731,6 @@ impl ToRust for Statement {
Statement::Break => cg.add_indentedln("break;"), Statement::Break => cg.add_indentedln("break;"),
Statement::Continue => cg.add_indentedln("continue;"), 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())),
} }
} }
} }