diff --git a/.gitignore b/.gitignore index 19a716d..e4cd9b8 100644 --- a/.gitignore +++ b/.gitignore @@ -26,5 +26,4 @@ target /target -/mist-test/build -/mist-test/output.json \ No newline at end of file +**/build diff --git a/Cargo.lock b/Cargo.lock index 902f1a0..d806d0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,7 +109,7 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mist-lang" -version = "0.0.3-alpha3" +version = "0.0.3-alpha4" dependencies = [ "cargo_metadata", "mist-parser", @@ -119,7 +119,7 @@ dependencies = [ [[package]] name = "mist-parser" -version = "0.1.3" +version = "0.1.4" dependencies = [ "pest", "pest_derive", diff --git a/Cargo.toml b/Cargo.toml index e993ab3..cd7327a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mist-lang" -version = "0.0.3-alpha3" +version = "0.0.3-alpha4" edition = "2024" description = "The Mist programming language compiler" license = "Apache-2.0" @@ -8,13 +8,19 @@ repository = "https://github.com/mist-go/mist" readme = "README.md" keywords = ["compiler", "language", "mist"] categories = ["compilers"] +default-run = "mist" [dependencies] serde = { version = "1.0.228", features = ["serde_derive"] } serde_json = "1.0.149" -mist-parser = { path = "./parser", version = "0.1.3"} +mist-parser = { path = "./parser", version = "0.1.4"} cargo_metadata = "0.23.1" [[bin]] name = "mist" -path = "src/main.rs" +path = "build/main.rs" + + +[[bin]] +name = "mist-lang" +path = "src/_header.rs" diff --git a/mist.json b/mist.json new file mode 100644 index 0000000..6632b01 --- /dev/null +++ b/mist.json @@ -0,0 +1,4 @@ +{ + "src": "src", + "output": "build" +} \ No newline at end of file diff --git a/parser/Cargo.toml b/parser/Cargo.toml index a4c0b75..67fca44 100644 --- a/parser/Cargo.toml +++ b/parser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mist-parser" -version = "0.1.3" +version = "0.1.4" edition = "2024" description = "The Mist programming language parser" license = "Apache-2.0" diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index 22375f4..7ec8ccd 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -34,7 +34,7 @@ pub enum Statement { iterator: Expression, body: Box, }, - Match(Expression, Vec<(Pattern, Block)>), + Match(Expression, Vec<(Vec, Block)>), Return(Option), Break, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index caac283..7e480d5 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -143,7 +143,7 @@ literal = { // ====================================================== tuple_pattern = { - "(" ~ (identifier ~ ("," ~ identifier)*)? ~ ")" + "(" ~ (identifier ~ ("," ~ identifier)*) ~ ")" } named_tuple_pattern = { @@ -446,8 +446,10 @@ for_stmt = { // MATCH // ------------------------------------------------------ +pattern_list = { pattern ~ ("|" ~ pattern)* } + match_item = { - pattern ~ "=>" ~ block + pattern_list ~ "=>" ~ block } match_stmt = { @@ -477,7 +479,8 @@ array = { // ------------------------------------------------------ macro_inner_v = { - "(" ~ macro_inner_v* ~ ")" + string_lit + | ("(" ~ macro_inner_v* ~ ")") | (!("(" | ")") ~ ANY) } diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 860ec61..3b3f7ad 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -100,7 +100,7 @@ impl<'a> TryFrom> for Statement { .map(|match_itms| { let mut match_inner = match_itms.into_inner(); Ok(( - Pattern::try_from(match_inner.next().unwrap()).get()?, + collect_recovered(match_inner.next().unwrap().into_inner()).get()?, Block::try_from(match_inner.next().unwrap()).get()?, )) }) diff --git a/src/_header.rs b/src/_header.rs new file mode 100644 index 0000000..c8b912b --- /dev/null +++ b/src/_header.rs @@ -0,0 +1,5 @@ +pub mod builder; +pub mod codegen; +pub mod transpiler; + +fn main() {} diff --git a/src/codegen.rs b/src/codegen.rs index 3349139..f8524f1 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -646,7 +646,14 @@ impl ToRust for Statement { cg.indent += 1; for itm in match_items { - cg.add_indentedln(&format!("{} =>", itm.0.get_rust())); + cg.add_indentedln(&format!( + "{} =>", + itm.0 + .into_iter() + .map(Pattern::get_rust) + .collect::>() + .join(" | ") + )); cg.add_indentedln("{"); cg.indent += 1; itm.1.to_rust(cg); diff --git a/src/main.rs b/src/main.mist similarity index 85% rename from src/main.rs rename to src/main.mist index d99e832..8171d3b 100644 --- a/src/main.rs +++ b/src/main.mist @@ -1,22 +1,23 @@ -use std::process::{self}; +use ; +use ; pub mod builder; pub mod codegen; pub mod transpiler; -fn main() { - let args: Vec = std::env::args().collect(); +void main() { + Vec args = env::args().collect(); - if args.len() < 2 { + if (args.len() < 2) { print_usage(); process::exit(1); } - match args[1].as_str() { + match (args[1].as_str()) { "run" | "build" | "check" | "r" | "b" | "c" => { - let (config, root) = transpiler::build(); + var (config, root) = transpiler::build(); println!(""); - if builder::build(args, config, root) { + if (builder::build(args, config, root)) { println!("\x1b[32m\nBuild successful\x1b[0m"); } else { println!("\x1b[31m\nBuild failed\x1b[0m"); @@ -39,7 +40,7 @@ fn main() { } } -fn print_usage() { +void print_usage() { println!("Mist - the mist compiler\n"); println!("󰖟 View our documentation! \x1b[35mhttps://mist.selimaj.dev\x1b[0m"); println!(" Follow us on github! \x1b[35mhttps://github.com/mist-go\x1b[0m\n");