Rewriting codegen'
This commit is contained in:
Generated
+8
@@ -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",
|
||||||
|
|||||||
@@ -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]]
|
||||||
|
|||||||
@@ -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"}
|
||||||
@@ -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("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user