diff --git a/crates/codegen/src/fmt/statement.rs b/crates/codegen/src/fmt/statement.rs index e38a87e..087c2d6 100644 --- a/crates/codegen/src/fmt/statement.rs +++ b/crates/codegen/src/fmt/statement.rs @@ -33,6 +33,7 @@ impl GenMist for Statement { cg.add("unsafe "); block.gen_mist(ctx, cg); } + Statement::TopLevel(tl) => tl.gen_mist(ctx, cg), Statement::Block(block) => block.gen_mist(ctx, cg), Statement::VarDecl(VarDeclStmt { decl, init }) => { if decl.type_.is_some() { diff --git a/crates/codegen/src/statement.rs b/crates/codegen/src/statement.rs index 9a94947..98dfaf7 100644 --- a/crates/codegen/src/statement.rs +++ b/crates/codegen/src/statement.rs @@ -31,13 +31,14 @@ impl GenRust for Block { impl GenRust for Statement { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { + Statement::TopLevel(tl) => tl.gen_rust(ctx, cg), + Statement::Block(block) => block.gen_rust(ctx, cg), + Statement::UnsafeBlock(block) => { cg.add("unsafe "); block.gen_rust(ctx, cg); } - Statement::Block(block) => block.gen_rust(ctx, cg), - Statement::VarDecl(VarDeclStmt { decl, init }) => { cg.add("let "); decl.gen_rust(ctx, cg); diff --git a/crates/parser/src/ast/expr.rs b/crates/parser/src/ast/expr.rs index d1f5f20..10e7129 100644 --- a/crates/parser/src/ast/expr.rs +++ b/crates/parser/src/ast/expr.rs @@ -119,3 +119,15 @@ impl From for ExprPath { ) } } + +impl Expression { + pub fn is_semicolon_required(&self) -> bool { + match self { + Self::Statement(v) => match &**v { + Statement::TopLevel(_) => false, + _ => true, + }, + _ => true, + } + } +} diff --git a/crates/parser/src/ast/statement.rs b/crates/parser/src/ast/statement.rs index f152c44..04ff4aa 100644 --- a/crates/parser/src/ast/statement.rs +++ b/crates/parser/src/ast/statement.rs @@ -12,6 +12,7 @@ pub struct Block { pub enum Statement { UnsafeBlock(Block), Block(Block), + TopLevel(Box), If { initial: StatementBranch, else_if: Vec, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 8172ceb..e6e0eef 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -24,6 +24,7 @@ keyword = { | "class" | "trait" | "impl" + | "use" | "pub" | "mut" | "let" @@ -389,6 +390,7 @@ statement_list = { statement = _{ control_flow | (expr ~ semicolon) + | top_level } // ------------------------------------------------------ diff --git a/crates/parser/src/semantics.rs b/crates/parser/src/semantics.rs index 6ecda9e..a7d557d 100644 --- a/crates/parser/src/semantics.rs +++ b/crates/parser/src/semantics.rs @@ -129,6 +129,7 @@ impl GetMutability for Block { impl GetMutability for Statement { fn get_mutability(&self) -> Vec { match self { + Statement::TopLevel(_) => Vec::new(), Statement::Block(body) | Statement::UnsafeBlock(body) => body.get_mutability(), Statement::If { initial, diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index e5fd2e4..df47271 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -1,5 +1,6 @@ void main() { + use std::fmt; println!("running common tests..."); common::test_package(); common::expr_test::run_tests();