Merge pull request #38 from mist-go/snake

A snake is eating itself
This commit is contained in:
2026-05-19 12:31:25 +02:00
committed by GitHub
11 changed files with 47 additions and 22 deletions
+1 -2
View File
@@ -26,5 +26,4 @@ target
/target /target
/mist-test/build **/build
/mist-test/output.json
Generated
+2 -2
View File
@@ -109,7 +109,7 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
[[package]] [[package]]
name = "mist-lang" name = "mist-lang"
version = "0.0.3-alpha3" version = "0.0.3-alpha4"
dependencies = [ dependencies = [
"cargo_metadata", "cargo_metadata",
"mist-parser", "mist-parser",
@@ -119,7 +119,7 @@ dependencies = [
[[package]] [[package]]
name = "mist-parser" name = "mist-parser"
version = "0.1.3" version = "0.1.4"
dependencies = [ dependencies = [
"pest", "pest",
"pest_derive", "pest_derive",
+9 -3
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "mist-lang" name = "mist-lang"
version = "0.0.3-alpha3" version = "0.0.3-alpha4"
edition = "2024" edition = "2024"
description = "The Mist programming language compiler" description = "The Mist programming language compiler"
license = "Apache-2.0" license = "Apache-2.0"
@@ -8,13 +8,19 @@ repository = "https://github.com/mist-go/mist"
readme = "README.md" readme = "README.md"
keywords = ["compiler", "language", "mist"] keywords = ["compiler", "language", "mist"]
categories = ["compilers"] categories = ["compilers"]
default-run = "mist"
[dependencies] [dependencies]
serde = { version = "1.0.228", features = ["serde_derive"] } serde = { version = "1.0.228", features = ["serde_derive"] }
serde_json = "1.0.149" 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" cargo_metadata = "0.23.1"
[[bin]] [[bin]]
name = "mist" name = "mist"
path = "src/main.rs" path = "build/main.rs"
[[bin]]
name = "mist-lang"
path = "src/_header.rs"
+4
View File
@@ -0,0 +1,4 @@
{
"src": "src",
"output": "build"
}
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "mist-parser" name = "mist-parser"
version = "0.1.3" version = "0.1.4"
edition = "2024" edition = "2024"
description = "The Mist programming language parser" description = "The Mist programming language parser"
license = "Apache-2.0" license = "Apache-2.0"
+1 -1
View File
@@ -34,7 +34,7 @@ pub enum Statement {
iterator: Expression, iterator: Expression,
body: Box<Statement>, body: Box<Statement>,
}, },
Match(Expression, Vec<(Pattern, Block)>), Match(Expression, Vec<(Vec<Pattern>, Block)>),
Return(Option<Expression>), Return(Option<Expression>),
Break, Break,
+6 -3
View File
@@ -143,7 +143,7 @@ literal = {
// ====================================================== // ======================================================
tuple_pattern = { tuple_pattern = {
"(" ~ (identifier ~ ("," ~ identifier)*)? ~ ")" "(" ~ (identifier ~ ("," ~ identifier)*) ~ ")"
} }
named_tuple_pattern = { named_tuple_pattern = {
@@ -446,8 +446,10 @@ for_stmt = {
// MATCH // MATCH
// ------------------------------------------------------ // ------------------------------------------------------
pattern_list = { pattern ~ ("|" ~ pattern)* }
match_item = { match_item = {
pattern ~ "=>" ~ block pattern_list ~ "=>" ~ block
} }
match_stmt = { match_stmt = {
@@ -477,7 +479,8 @@ array = {
// ------------------------------------------------------ // ------------------------------------------------------
macro_inner_v = { macro_inner_v = {
"(" ~ macro_inner_v* ~ ")" string_lit
| ("(" ~ macro_inner_v* ~ ")")
| (!("(" | ")") ~ ANY) | (!("(" | ")") ~ ANY)
} }
+1 -1
View File
@@ -100,7 +100,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Statement {
.map(|match_itms| { .map(|match_itms| {
let mut match_inner = match_itms.into_inner(); let mut match_inner = match_itms.into_inner();
Ok(( 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()?, Block::try_from(match_inner.next().unwrap()).get()?,
)) ))
}) })
+5
View File
@@ -0,0 +1,5 @@
pub mod builder;
pub mod codegen;
pub mod transpiler;
fn main() {}
+8 -1
View File
@@ -646,7 +646,14 @@ impl ToRust for Statement {
cg.indent += 1; cg.indent += 1;
for itm in match_items { 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::<Vec<_>>()
.join(" | ")
));
cg.add_indentedln("{"); cg.add_indentedln("{");
cg.indent += 1; cg.indent += 1;
itm.1.to_rust(cg); itm.1.to_rust(cg);
+9 -8
View File
@@ -1,22 +1,23 @@
use std::process::{self}; use <std::process>;
use <std::env>;
pub mod builder; pub mod builder;
pub mod codegen; pub mod codegen;
pub mod transpiler; pub mod transpiler;
fn main() { void main() {
let args: Vec<String> = std::env::args().collect(); Vec<String> args = env::args().collect();
if args.len() < 2 { if (args.len() < 2) {
print_usage(); print_usage();
process::exit(1); process::exit(1);
} }
match args[1].as_str() { match (args[1].as_str()) {
"run" | "build" | "check" | "r" | "b" | "c" => { "run" | "build" | "check" | "r" | "b" | "c" => {
let (config, root) = transpiler::build(); var (config, root) = transpiler::build();
println!(""); println!("");
if builder::build(args, config, root) { if (builder::build(args, config, root)) {
println!("\x1b[32m\nBuild successful\x1b[0m"); println!("\x1b[32m\nBuild successful\x1b[0m");
} else { } else {
println!("\x1b[31m\nBuild failed\x1b[0m"); 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!("Mist - the mist compiler\n");
println!("󰖟 View our documentation! \x1b[35mhttps://mist.selimaj.dev\x1b[0m"); 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!(" Follow us on github! \x1b[35mhttps://github.com/mist-go\x1b[0m\n");