diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 5a7a1cb..1292b05 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,3 +1,5 @@ void main() { + i32 x; + println!("hello, world"); } diff --git a/parser/src/ast/expr.rs b/parser/src/ast/expr.rs index 257448d..56e0584 100644 --- a/parser/src/ast/expr.rs +++ b/parser/src/ast/expr.rs @@ -30,6 +30,7 @@ pub enum BinaryOp { pub enum Expression { Literal(Literal), Path(ExprPath), + Statement(Box), Fix { initial: Box, prefixes: Vec, diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index 7ec8ccd..0e9c056 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -3,13 +3,11 @@ use serde::Serialize; use super::*; #[derive(Debug, Clone, Serialize, Default)] -pub struct Block(pub Vec>); +pub struct Block(pub Vec>); #[derive(Debug, Clone, Serialize)] pub enum Statement { - Expression(Expression), Block(Block), - VarDecl(VarDeclStmt), Assign { target: Expression, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 4b3758d..1315e6f 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -342,8 +342,8 @@ block = { "{" ~ (statement | unexpected_statement)* ~ "}" } -statement = { - (expr | basic_stmt_left_recurse) ~ semicolon +statement = _{ + ((expr | basic_stmt_left_recurse) ~ semicolon) } // ------------------------------------------------------ diff --git a/parser/src/parser/common/expr.rs b/parser/src/parser/common/expr.rs index 312a406..ddc83fb 100644 --- a/parser/src/parser/common/expr.rs +++ b/parser/src/parser/common/expr.rs @@ -117,6 +117,12 @@ impl<'a> TryFrom> for Expression { Rule::static_path => ast_expr!(Expression::Path(pair.try_into())), Rule::literal => ast_expr!(Expression::Literal(pair.try_into())), Rule::expr_path => ast_expr!(Expression::Path(pair.try_into())), + Rule::statement => ast_expr!(Expression::Statement( + pair.try_into().get_map(Box::new).map(Box::new) + )), + Rule::basic_stmt => ast_expr!(Expression::Statement( + pair.try_into().get_map(Box::new).map(Box::new) + )), _ => AstError::bug_unimplemented(pair), } diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index af9e1a2..6d369f6 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -39,7 +39,7 @@ impl<'a> TryFrom> for Statement { let mut inner = pair.clone().into_inner(); match rule { - Rule::statement => Statement::try_from(inner.next().unwrap()), + Rule::statement | Rule::basic_stmt => 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 f8524f1..de58d2e 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -169,6 +169,12 @@ impl GetRust for Expression { match self { Expression::Path(path) => path.get_rust(), Expression::Literal(literal) => literal.get_rust(), + Expression::Statement(stmt) => { + let mut cg = RustCodegen::new(); + cg.indent += 1; + stmt.to_rust(&mut cg); + cg.output + } Expression::Fix { initial, prefixes, @@ -336,7 +342,7 @@ impl ToRust for Spanned { impl ToRust for Block { fn to_rust(self, cg: &mut RustCodegen) { for stmt in self.0 { - stmt.to_rust(cg); + cg.add_indentedln(&(stmt.get_rust() + ";")); } } } @@ -608,10 +614,6 @@ impl ToRust for TopLevelKind { impl ToRust for Statement { fn to_rust(self, cg: &mut RustCodegen) { match self { - Statement::Expression(expr) => { - cg.add_indentedln(&format!("{};", expr.get_rust())); - } - Statement::Block(block) => { cg.add_indentedln("{"); cg.indent += 1;