From 5f7dcc859c8d363d53345585e0a3f31654057d58 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 11:06:26 +0200 Subject: [PATCH 1/8] Preparing for bootstrapping --- .gitignore | 3 +-- Cargo.toml | 3 ++- mist.json | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 mist.json 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.toml b/Cargo.toml index e993ab3..4b132c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ 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"] } @@ -17,4 +18,4 @@ cargo_metadata = "0.23.1" [[bin]] name = "mist" -path = "src/main.rs" +path = "build/main.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 From 6d7beb20ca639619896b0c7dde296e92bee15fe4 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 11:19:49 +0200 Subject: [PATCH 2/8] Bootstrapped main --- src/main.mist | 45 +++++++++++++++++++++++++++++++++++++++ src/main.rs | 59 --------------------------------------------------- 2 files changed, 45 insertions(+), 59 deletions(-) create mode 100644 src/main.mist delete mode 100644 src/main.rs diff --git a/src/main.mist b/src/main.mist new file mode 100644 index 0000000..82c5a93 --- /dev/null +++ b/src/main.mist @@ -0,0 +1,45 @@ +use ; +use ; + +pub mod builder; +pub mod codegen; +pub mod transpiler; + +void main() { + Vec args = env::args().collect(); + + if (args.len() < 2) { + var _ = print_usage(); + process::exit(1); + } + + match (args[1].as_str()) { + "run" => { + var (config, root) = transpiler::build(); + println!(""); + if (builder::build(args, config, root)) { + var _ = println!("\x1b[32m\nBuild successful\x1b[0m"); + } else { + var _ = println!("\x1b[31m\nBuild failed\x1b[0m"); + } + } + "transpile" => { + var _ = transpiler::build(); + } + "version" => { + var _ = println!("mist {}", env!("CARGO_PKG_VERSION")); + } + "help" => { + var _ = print_usage(); + } + unknown => { + var _ = eprintln!("error: unknown command '{}'\n", unknown); + var _ = print_usage(); + var _ = process::exit(1); + } + } +} + +void print_usage() { + var _ = println!("Mist - the mist compiler\n"); +} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index d99e832..0000000 --- a/src/main.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::process::{self}; - -pub mod builder; -pub mod codegen; -pub mod transpiler; - -fn main() { - let args: Vec = std::env::args().collect(); - - if args.len() < 2 { - print_usage(); - process::exit(1); - } - - match args[1].as_str() { - "run" | "build" | "check" | "r" | "b" | "c" => { - let (config, root) = transpiler::build(); - println!(""); - if builder::build(args, config, root) { - println!("\x1b[32m\nBuild successful\x1b[0m"); - } else { - println!("\x1b[31m\nBuild failed\x1b[0m"); - } - } - "transpile" | "t" => { - transpiler::build(); - } - "version" | "--version" | "-v" => { - println!("mist {}", env!("CARGO_PKG_VERSION")); - } - "help" | "--help" | "-h" => { - print_usage(); - } - unknown => { - eprintln!("error: unknown command '{}'\n", unknown); - print_usage(); - process::exit(1); - } - } -} - -fn 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"); - println!("usage:"); - println!(" \x1b[36m mist run\x1b[0m,\x1b[36m r\x1b[0m run the project in the current directory\n"); - println!( - " \x1b[36m mist build\x1b[0m,\x1b[36m b\x1b[0m build the project in the current directory\n" - ); - println!( - " \x1b[36m mist transpile\x1b[0m,\x1b[36m t\x1b[0m transpile the project in the current directory\n" - ); - println!( - " \x1b[36m mist check\x1b[0m,\x1b[36m c\x1b[0m check the project in the current directory\n" - ); - println!(" \x1b[36m mist version \x1b[0m print the compiler version\n"); - println!(" \x1b[36m mist help\x1b[0m print this message\n"); -} From 1a469689a7a54028a59be71e16edfca1cb6e084a Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 11:25:14 +0200 Subject: [PATCH 3/8] Fixed amgibuitiy --- parser/src/grammar.pest | 2 +- src/main.mist | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index caac283..e3c91db 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 = { diff --git a/src/main.mist b/src/main.mist index 82c5a93..f211656 100644 --- a/src/main.mist +++ b/src/main.mist @@ -9,7 +9,7 @@ void main() { Vec args = env::args().collect(); if (args.len() < 2) { - var _ = print_usage(); + print_usage(); process::exit(1); } @@ -18,28 +18,28 @@ void main() { var (config, root) = transpiler::build(); println!(""); if (builder::build(args, config, root)) { - var _ = println!("\x1b[32m\nBuild successful\x1b[0m"); + println!("\x1b[32m\nBuild successful\x1b[0m"); } else { - var _ = println!("\x1b[31m\nBuild failed\x1b[0m"); + println!("\x1b[31m\nBuild failed\x1b[0m"); } } "transpile" => { - var _ = transpiler::build(); + transpiler::build(); } "version" => { - var _ = println!("mist {}", env!("CARGO_PKG_VERSION")); + println!("mist {}", env!("CARGO_PKG_VERSION")); } "help" => { - var _ = print_usage(); + print_usage(); } unknown => { - var _ = eprintln!("error: unknown command '{}'\n", unknown); - var _ = print_usage(); - var _ = process::exit(1); + eprintln!("error: unknown command '{}'\n", unknown); + print_usage(); + process::exit(1); } } } void print_usage() { - var _ = println!("Mist - the mist compiler\n"); + println!("Mist - the mist compiler\n"); } From 318480f0b579d3ad3e58ea3d8b77eddf07002432 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:14:25 +0200 Subject: [PATCH 4/8] Fixed string and macro, and main --- parser/src/grammar.pest | 3 ++- src/main.mist | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index e3c91db..992e273 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -477,7 +477,8 @@ array = { // ------------------------------------------------------ macro_inner_v = { - "(" ~ macro_inner_v* ~ ")" + string_lit + | ("(" ~ macro_inner_v* ~ ")") | (!("(" | ")") ~ ANY) } diff --git a/src/main.mist b/src/main.mist index f211656..a955afd 100644 --- a/src/main.mist +++ b/src/main.mist @@ -42,4 +42,19 @@ void main() { 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"); + println!("usage:"); + println!(" \x1b[36m mist run\x1b[0m,\x1b[36m r\x1b[0m run the project in the current directory\n"); + println!( + " \x1b[36m mist build\x1b[0m,\x1b[36m b\x1b[0m build the project in the current directory\n" + ); + println!( + " \x1b[36m mist transpile\x1b[0m,\x1b[36m t\x1b[0m transpile the project in the current directory\n" + ); + println!( + " \x1b[36m mist check\x1b[0m,\x1b[36m c\x1b[0m check the project in the current directory\n" + ); + println!(" \x1b[36m mist version \x1b[0m print the compiler version\n"); + println!(" \x1b[36m mist help\x1b[0m print this message\n"); } From bffc9f073b23c4b2f4c8957ebaf24077cd412dc1 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:21:20 +0200 Subject: [PATCH 5/8] Match multiple patterns --- parser/src/ast/statement.rs | 2 +- parser/src/grammar.pest | 4 +++- parser/src/parser/common/statement.rs | 2 +- src/codegen.rs | 9 ++++++++- 4 files changed, 13 insertions(+), 4 deletions(-) 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 992e273..7e480d5 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -446,8 +446,10 @@ for_stmt = { // MATCH // ------------------------------------------------------ +pattern_list = { pattern ~ ("|" ~ pattern)* } + match_item = { - pattern ~ "=>" ~ block + pattern_list ~ "=>" ~ block } match_stmt = { 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/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); From 3ed17e007f7e43f50d968c25b2a7754b8f70a07b Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:23:57 +0200 Subject: [PATCH 6/8] Multiple commands bootstrapped --- src/main.mist | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.mist b/src/main.mist index a955afd..8171d3b 100644 --- a/src/main.mist +++ b/src/main.mist @@ -14,7 +14,7 @@ void main() { } match (args[1].as_str()) { - "run" => { + "run" | "build" | "check" | "r" | "b" | "c" => { var (config, root) = transpiler::build(); println!(""); if (builder::build(args, config, root)) { @@ -23,13 +23,13 @@ void main() { println!("\x1b[31m\nBuild failed\x1b[0m"); } } - "transpile" => { + "transpile" | "t" => { transpiler::build(); } - "version" => { + "version" | "--version" | "-v" => { println!("mist {}", env!("CARGO_PKG_VERSION")); } - "help" => { + "help" | "--help" | "-h" => { print_usage(); } unknown => { From b856450cc1741302cc1eb2d887be78b3f1789f13 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:27:32 +0200 Subject: [PATCH 7/8] Header for rust IDE support --- Cargo.toml | 5 +++++ src/_header.rs | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 src/_header.rs diff --git a/Cargo.toml b/Cargo.toml index 4b132c6..cc417b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,8 @@ cargo_metadata = "0.23.1" [[bin]] name = "mist" path = "build/main.rs" + + +[[bin]] +name = "mist-lang" +path = "src/_header.rs" 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() {} From 47e62f96d951b38421a239bef7737d4e7acec0da Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:30:29 +0200 Subject: [PATCH 8/8] Updated version --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- parser/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) 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 cc417b9..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" @@ -13,7 +13,7 @@ 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]] 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"