From 87bc8a0d697399362d7b3946def1a957ae8b780e Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 21 May 2026 11:29:01 +0200 Subject: [PATCH] Rewriting codegen' --- Cargo.lock | 8 +++++ Cargo.toml | 1 + codegen/Cargo.toml | 12 ++++++++ codegen/src/expr.rs | 0 codegen/src/lib.rs | 63 ++++++++++++++++++++++++++++++++++++++++ codegen/src/statement.rs | 0 codegen/src/top_level.rs | 0 7 files changed, 84 insertions(+) create mode 100644 codegen/Cargo.toml create mode 100644 codegen/src/expr.rs create mode 100644 codegen/src/lib.rs create mode 100644 codegen/src/statement.rs create mode 100644 codegen/src/top_level.rs diff --git a/Cargo.lock b/Cargo.lock index 339cb0f..01f0dd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -449,12 +449,20 @@ dependencies = [ "tower-lsp", ] +[[package]] +name = "mist-codegen" +version = "0.1.0" +dependencies = [ + "mist-parser", +] + [[package]] name = "mist-lang" version = "0.0.3-alpha4" dependencies = [ "cargo_metadata", "mist-analyzer", + "mist-codegen", "mist-parser", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index e4e5dc5..f129aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ serde = { version = "1.0.228", features = ["serde_derive"] } serde_json = "1.0.149" mist-parser = { path = "./parser", version = "0.1.4"} mist-analyzer = { path = "./analyzer", version = "0.0.1"} +mist-codegen = { path = "./codegen", version = "0.1.0"} cargo_metadata = "0.23.1" [[bin]] diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml new file mode 100644 index 0000000..cf2c632 --- /dev/null +++ b/codegen/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "mist-codegen" +version = "0.1.0" +edition = "2024" +description = "The Mist programming language Rust code generator" +license = "Apache-2.0" +repository = "https://github.com/mist-go/mist" +keywords = ["compiler", "language", "mist"] +categories = ["compilers"] + +[dependencies] +mist-parser = { path = "../parser", version = "0.1.4"} diff --git a/codegen/src/expr.rs b/codegen/src/expr.rs new file mode 100644 index 0000000..e69de29 diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs new file mode 100644 index 0000000..71e7ff9 --- /dev/null +++ b/codegen/src/lib.rs @@ -0,0 +1,63 @@ +pub mod expr; +pub mod statement; +pub mod top_level; + +use mist_parser::ast::*; + +pub trait GenRust { + fn get_rust(&self, cg: &mut RustCodegen); +} + +#[derive(Default)] +pub struct RustCodegen { + output: String, + indent: usize, +} + +impl RustCodegen { + pub fn new() -> Self { + Self { + output: String::new(), + indent: 0, + } + } + + fn indent_str(&self) -> String { + " ".repeat(self.indent) + } + + fn add(&mut self, s: &str) { + self.output.push_str(s); + } + + fn addln(&mut self, s: &str) { + self.add(s); + self.add("\n"); + } + + fn add_indentedln(&mut self, s: &str) { + let line = format!("{}{}\n", self.indent_str(), s); + self.add(&line); + } + + pub fn generate(&mut self, toplevels: Vec) -> String { + for tl in toplevels { + tl.to_rust(self); + } + + self.output.clone() + } + + pub fn ensure_brackets(&mut self, stmt: Box) { + match *stmt { + Statement::Block(_) => stmt.to_rust(self), + _ => { + self.add_indentedln("{"); + self.indent += 1; + stmt.to_rust(self); + self.indent -= 1; + self.add_indentedln("}"); + } + } + } +} diff --git a/codegen/src/statement.rs b/codegen/src/statement.rs new file mode 100644 index 0000000..e69de29 diff --git a/codegen/src/top_level.rs b/codegen/src/top_level.rs new file mode 100644 index 0000000..e69de29