Rewriting codegen'

This commit is contained in:
2026-05-21 11:29:01 +02:00
parent aba8badd90
commit 87bc8a0d69
7 changed files with 84 additions and 0 deletions
Generated
+8
View File
@@ -449,12 +449,20 @@ dependencies = [
"tower-lsp", "tower-lsp",
] ]
[[package]]
name = "mist-codegen"
version = "0.1.0"
dependencies = [
"mist-parser",
]
[[package]] [[package]]
name = "mist-lang" name = "mist-lang"
version = "0.0.3-alpha4" version = "0.0.3-alpha4"
dependencies = [ dependencies = [
"cargo_metadata", "cargo_metadata",
"mist-analyzer", "mist-analyzer",
"mist-codegen",
"mist-parser", "mist-parser",
"serde", "serde",
"serde_json", "serde_json",
+1
View File
@@ -21,6 +21,7 @@ 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.4"} mist-parser = { path = "./parser", version = "0.1.4"}
mist-analyzer = { path = "./analyzer", version = "0.0.1"} mist-analyzer = { path = "./analyzer", version = "0.0.1"}
mist-codegen = { path = "./codegen", version = "0.1.0"}
cargo_metadata = "0.23.1" cargo_metadata = "0.23.1"
[[bin]] [[bin]]
+12
View File
@@ -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"}
View File
+63
View File
@@ -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<TopLevel>) -> String {
for tl in toplevels {
tl.to_rust(self);
}
self.output.clone()
}
pub fn ensure_brackets(&mut self, stmt: Box<Statement>) {
match *stmt {
Statement::Block(_) => stmt.to_rust(self),
_ => {
self.add_indentedln("{");
self.indent += 1;
stmt.to_rust(self);
self.indent -= 1;
self.add_indentedln("}");
}
}
}
}
View File
View File