Compound assign statement
This commit is contained in:
@@ -46,7 +46,7 @@ pub class Application {
|
|||||||
void tick(self mut*) {
|
void tick(self mut*) {
|
||||||
self.logger.info("tick");
|
self.logger.info("tick");
|
||||||
|
|
||||||
self.ticks = self.ticks + 1;
|
self.ticks += 1;
|
||||||
|
|
||||||
var task = task::create_task("background-job");
|
var task = task::create_task("background-job");
|
||||||
|
|
||||||
|
|||||||
+9
-1
@@ -181,7 +181,15 @@ pub enum Statement {
|
|||||||
Block(Block),
|
Block(Block),
|
||||||
|
|
||||||
VarDecl(VarDeclStmt),
|
VarDecl(VarDeclStmt),
|
||||||
VarAssign(VarAssignStmt),
|
Assign {
|
||||||
|
target: Expression,
|
||||||
|
value: Expression,
|
||||||
|
},
|
||||||
|
CompoundAssign {
|
||||||
|
target: Expression,
|
||||||
|
compound: String,
|
||||||
|
value: Expression,
|
||||||
|
},
|
||||||
If {
|
If {
|
||||||
initial: StatementBranch,
|
initial: StatementBranch,
|
||||||
else_if: Vec<StatementBranch>,
|
else_if: Vec<StatementBranch>,
|
||||||
|
|||||||
@@ -314,6 +314,7 @@ statement = _{
|
|||||||
expr_stmt
|
expr_stmt
|
||||||
| match_stmt
|
| match_stmt
|
||||||
| assign_statement
|
| assign_statement
|
||||||
|
| compound_assign_statement
|
||||||
| if_stmt
|
| if_stmt
|
||||||
| while_stmt
|
| while_stmt
|
||||||
| c_for_stmt
|
| c_for_stmt
|
||||||
@@ -353,6 +354,22 @@ assign_statement = {
|
|||||||
expr ~ "=" ~ expr ~ semicolon
|
expr ~ "=" ~ expr ~ semicolon
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compound_assign = {
|
||||||
|
"+="
|
||||||
|
| "-="
|
||||||
|
| "/="
|
||||||
|
| "%="
|
||||||
|
| "&="
|
||||||
|
| "|="
|
||||||
|
| "^="
|
||||||
|
| "<<="
|
||||||
|
| ">>="
|
||||||
|
}
|
||||||
|
|
||||||
|
compound_assign_statement = {
|
||||||
|
expr ~ compound_assign ~ expr ~ semicolon
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
// CONDITIONALS
|
// CONDITIONALS
|
||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
|
|||||||
@@ -88,13 +88,10 @@ 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!(VarAssignStmt {
|
Rule::assign_statement => ast_expr!(Statement::Assign {
|
||||||
target: inner.next().unwrap().try_into(),
|
target: inner.next().unwrap().try_into(),
|
||||||
value: 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(
|
Rule::match_stmt => ast_expr!(Statement::Match(
|
||||||
inner.next().unwrap().try_into(),
|
inner.next().unwrap().try_into(),
|
||||||
inner
|
inner
|
||||||
@@ -108,6 +105,15 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Statement {
|
|||||||
.collect::<AstResult<'a, Vec<_>>>(),
|
.collect::<AstResult<'a, Vec<_>>>(),
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
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 => {
|
Rule::unexpected_statement => {
|
||||||
return Err(AstError {
|
return Err(AstError {
|
||||||
span: pair.as_span(),
|
span: pair.as_span(),
|
||||||
|
|||||||
+14
-1
@@ -545,10 +545,23 @@ impl ToRust for Statement {
|
|||||||
cg.add_indentedln(&format!("let {}{};", decl.get_rust(), init));
|
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(),));
|
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) => {
|
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user