From 7c0dc98ef7a75f6654e2e33bb2b8e87e6cbcfeda Mon Sep 17 00:00:00 2001 From: LunarAkai Date: Thu, 4 Dec 2025 00:44:28 +0100 Subject: [PATCH 1/2] moved to workspaces --- .gitignore | 4 +- Cargo.lock | 79 +++++++++++-------- Cargo.toml | 14 ++-- crates/akailang-parser/Cargo.toml | 8 ++ .../src}/abstract_syntax_tree/ast.rs | 2 +- .../src}/abstract_syntax_tree/definitions.rs | 2 +- .../src}/abstract_syntax_tree/mod.rs | 0 .../src}/abstract_syntax_tree/parser.rs | 5 +- .../akailang-parser/src}/lexer/mod.rs | 0 .../akailang-parser/src}/lexer/tokens.rs | 0 crates/akailang-parser/src/lib.rs | 17 ++++ crates/akailang/Cargo.toml | 8 ++ {src => crates/akailang/src}/main.rs | 13 +-- src/language_frontend/mod.rs | 2 - src/llvm_backend/llvm.rs | 39 --------- src/llvm_backend/mod.rs | 1 - 16 files changed, 91 insertions(+), 103 deletions(-) create mode 100644 crates/akailang-parser/Cargo.toml rename {src/language_frontend => crates/akailang-parser/src}/abstract_syntax_tree/ast.rs (91%) rename {src/language_frontend => crates/akailang-parser/src}/abstract_syntax_tree/definitions.rs (97%) rename {src/language_frontend => crates/akailang-parser/src}/abstract_syntax_tree/mod.rs (100%) rename {src/language_frontend => crates/akailang-parser/src}/abstract_syntax_tree/parser.rs (99%) rename {src/language_frontend => crates/akailang-parser/src}/lexer/mod.rs (100%) rename {src/language_frontend => crates/akailang-parser/src}/lexer/tokens.rs (100%) create mode 100644 crates/akailang-parser/src/lib.rs create mode 100644 crates/akailang/Cargo.toml rename {src => crates/akailang/src}/main.rs (62%) delete mode 100644 src/language_frontend/mod.rs delete mode 100644 src/llvm_backend/llvm.rs delete mode 100644 src/llvm_backend/mod.rs diff --git a/.gitignore b/.gitignore index c7e89de..d03ef72 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /target *.sh -sample.akai \ No newline at end of file +sample.akai +.idea +/.idea \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 4368f31..4a17967 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,31 @@ dependencies = [ "memchr", ] +[[package]] +name = "akailang" +version = "0.1.0" +dependencies = [ + "akailang-backend", + "akailang-parser", +] + +[[package]] +name = "akailang-backend" +version = "0.1.0" +dependencies = [ + "akailang-parser", + "chumsky", + "inkwell", +] + +[[package]] +name = "akailang-parser" +version = "0.1.0" +dependencies = [ + "chumsky", + "logos", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -58,12 +83,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - [[package]] name = "equivalent" version = "1.0.2" @@ -95,11 +114,10 @@ dependencies = [ [[package]] name = "inkwell" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67349bd7578d4afebbe15eaa642a80b884e8623db74b1716611b131feb1deef" +checksum = "39457e8611219cf690f862a470575f5c06862910d03ea3c3b187ad7abc44b4e2" dependencies = [ - "either", "inkwell_internals", "libc", "llvm-sys", @@ -109,24 +127,15 @@ dependencies = [ [[package]] name = "inkwell_internals" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f365c8de536236cfdebd0ba2130de22acefed18b1fb99c32783b3840aec5fb46" +checksum = "ad9a7dd586b00f2b20e0b9ae3c6faa351fbfd56d15d63bbce35b13bece682eda" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "lang" -version = "0.1.0" -dependencies = [ - "chumsky", - "inkwell", - "logos", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -141,9 +150,9 @@ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "llvm-sys" -version = "181.2.0" +version = "211.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320f9d2723c97d4b78f9190a61ed25cc7cfbe456668c08e6e7dd8e50ceb8500" +checksum = "108b3ad2b2eaf2a561fc74196273b20e3436e4a688b8b44e250d83974dc1b2e2" dependencies = [ "anyhow", "cc", @@ -155,34 +164,34 @@ dependencies = [ [[package]] name = "logos" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f536c1af4c7cc81edf73da1f8029896e7e1e16a219ef09b184e76a296f3db" +checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189bbfd0b61330abea797e5e9276408f2edbe4f822d7ad08685d67419aafb34e" +checksum = "192a3a2b90b0c05b27a0b2c43eecdb7c415e29243acc3f89cc8247a5b693045c" dependencies = [ "beef", "fnv", "lazy_static", "proc-macro2", "quote", - "regex-syntax 0.8.5", + "regex-syntax 0.8.8", "rustc_version", "syn", ] [[package]] name = "logos-derive" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfe8e1a19049ddbfccbd14ac834b215e11b85b90bab0c2dba7c7b92fb5d5cba" +checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470" dependencies = [ "logos-codegen", ] @@ -251,9 +260,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rustc_version" @@ -322,18 +331,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 681fc8e..3b75ccf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,7 @@ -[package] -name = "lang" -version = "0.1.0" -edition = "2024" +[workspace] +members = ["crates/akailang-backend", "crates/akailang", "crates/akailang-parser"] +resolver = "3" -[dependencies] -logos = "0.15.0" -chumsky = "0.10.1" -inkwell = { version = "0.6.0", features = ["llvm18-1"] } +[workspace.package] +version = "0.1.0" +edition = "2024" \ No newline at end of file diff --git a/crates/akailang-parser/Cargo.toml b/crates/akailang-parser/Cargo.toml new file mode 100644 index 0000000..94dabd5 --- /dev/null +++ b/crates/akailang-parser/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "akailang-parser" +version.workspace = true +edition.workspace = true + +[dependencies] +logos = "0.15.0" +chumsky = "0.10.1" diff --git a/src/language_frontend/abstract_syntax_tree/ast.rs b/crates/akailang-parser/src/abstract_syntax_tree/ast.rs similarity index 91% rename from src/language_frontend/abstract_syntax_tree/ast.rs rename to crates/akailang-parser/src/abstract_syntax_tree/ast.rs index 3e8f666..e3e4b60 100644 --- a/src/language_frontend/abstract_syntax_tree/ast.rs +++ b/crates/akailang-parser/src/abstract_syntax_tree/ast.rs @@ -1,4 +1,4 @@ -use crate::language_frontend::abstract_syntax_tree::definitions::*; +use crate::abstract_syntax_tree::definitions::*; // Option and Result -> define in Std #[derive(Clone, Debug, PartialEq)] diff --git a/src/language_frontend/abstract_syntax_tree/definitions.rs b/crates/akailang-parser/src/abstract_syntax_tree/definitions.rs similarity index 97% rename from src/language_frontend/abstract_syntax_tree/definitions.rs rename to crates/akailang-parser/src/abstract_syntax_tree/definitions.rs index b8be826..1ae4f96 100644 --- a/src/language_frontend/abstract_syntax_tree/definitions.rs +++ b/crates/akailang-parser/src/abstract_syntax_tree/definitions.rs @@ -1,6 +1,6 @@ use std::{ops::Range, rc::Rc}; -use crate::language_frontend::abstract_syntax_tree::ast::Expr; +use crate::abstract_syntax_tree::ast::Expr; // Abstract Syntax Tree diff --git a/src/language_frontend/abstract_syntax_tree/mod.rs b/crates/akailang-parser/src/abstract_syntax_tree/mod.rs similarity index 100% rename from src/language_frontend/abstract_syntax_tree/mod.rs rename to crates/akailang-parser/src/abstract_syntax_tree/mod.rs diff --git a/src/language_frontend/abstract_syntax_tree/parser.rs b/crates/akailang-parser/src/abstract_syntax_tree/parser.rs similarity index 99% rename from src/language_frontend/abstract_syntax_tree/parser.rs rename to crates/akailang-parser/src/abstract_syntax_tree/parser.rs index 14c7690..d2d64f1 100644 --- a/src/language_frontend/abstract_syntax_tree/parser.rs +++ b/crates/akailang-parser/src/abstract_syntax_tree/parser.rs @@ -15,15 +15,14 @@ use chumsky::{ newline, whitespace, }, }; -use inkwell::Either; use logos::{Logos, source}; use crate::{ - language_frontend::{ + token, + { abstract_syntax_tree::{ast::Expr, definitions::*}, lexer::tokens::Token, }, - token, }; // goal of parsing is to construct an abstract syntax tree diff --git a/src/language_frontend/lexer/mod.rs b/crates/akailang-parser/src/lexer/mod.rs similarity index 100% rename from src/language_frontend/lexer/mod.rs rename to crates/akailang-parser/src/lexer/mod.rs diff --git a/src/language_frontend/lexer/tokens.rs b/crates/akailang-parser/src/lexer/tokens.rs similarity index 100% rename from src/language_frontend/lexer/tokens.rs rename to crates/akailang-parser/src/lexer/tokens.rs diff --git a/crates/akailang-parser/src/lib.rs b/crates/akailang-parser/src/lib.rs new file mode 100644 index 0000000..06c75b8 --- /dev/null +++ b/crates/akailang-parser/src/lib.rs @@ -0,0 +1,17 @@ +pub mod abstract_syntax_tree; +pub mod lexer; + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/akailang/Cargo.toml b/crates/akailang/Cargo.toml new file mode 100644 index 0000000..269c834 --- /dev/null +++ b/crates/akailang/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "akailang" +version.workspace = true +edition.workspace = true + +[dependencies] +akailang-parser = {path = "../akailang-parser" } +akailang-backend = {path = "../akailang-backend"} \ No newline at end of file diff --git a/src/main.rs b/crates/akailang/src/main.rs similarity index 62% rename from src/main.rs rename to crates/akailang/src/main.rs index 8881300..696524c 100644 --- a/src/main.rs +++ b/crates/akailang/src/main.rs @@ -1,15 +1,4 @@ -use chumsky::Parser; -use chumsky::input::{Input, Stream}; -use logos::Logos; - -mod language_frontend; -mod llvm_backend; - -use crate::{ - language_frontend::abstract_syntax_tree::parser::parse, language_frontend::lexer::tokens::Token, -}; - -use crate::language_frontend::abstract_syntax_tree::ast::Expr; +use akailang_parser::abstract_syntax_tree::parser::parse; /* Simple Compiler -> 4 Stages: diff --git a/src/language_frontend/mod.rs b/src/language_frontend/mod.rs deleted file mode 100644 index 0d2d3fd..0000000 --- a/src/language_frontend/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod abstract_syntax_tree; -pub mod lexer; diff --git a/src/llvm_backend/llvm.rs b/src/llvm_backend/llvm.rs deleted file mode 100644 index 3ddba9e..0000000 --- a/src/llvm_backend/llvm.rs +++ /dev/null @@ -1,39 +0,0 @@ -use chumsky::prelude::todo; -use inkwell::{ - OptimizationLevel, - builder::{self, Builder}, - context::Context, - execution_engine::ExecutionEngine, - module::Module, - types::BasicTypeEnum, - values::{BasicValueEnum, FunctionValue}, -}; - -use crate::language_frontend::abstract_syntax_tree::{ - ast::Expr, - definitions::{Function, Type}, -}; - -pub struct CodeGen<'ctx> { - pub(crate) context: &'ctx Context, - pub(crate) module: Module<'ctx>, - pub(crate) builder: Builder<'ctx>, - pub(crate) exec_engine: ExecutionEngine<'ctx>, -} - -impl<'ctx> CodeGen<'ctx> { - pub fn new(context: &'ctx Context, module_name: &str, opt_level: OptimizationLevel) -> Self { - let module = context.create_module(module_name); - let exec_engine = module.create_jit_execution_engine(opt_level).unwrap(); - let builder = context.create_builder(); - - CodeGen { - context, - module, - builder, - exec_engine, - } - } - - fn compile_expr(&mut self, expr: &Expr) {} -} diff --git a/src/llvm_backend/mod.rs b/src/llvm_backend/mod.rs deleted file mode 100644 index cd44a09..0000000 --- a/src/llvm_backend/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod llvm; From ed6c8c6f22af86acccac1ffa99e57e518fc9966e Mon Sep 17 00:00:00 2001 From: LunarAkai Date: Thu, 4 Dec 2025 00:52:56 +0100 Subject: [PATCH 2/2] workspaces --- Cargo.toml | 2 +- crates/akailang-backend/Cargo.toml | 9 ++++++ crates/akailang-backend/src/lib.rs | 18 ++++++++++++ crates/akailang-backend/src/llvm/mod.rs | 39 +++++++++++++++++++++++++ crates/akailang/Cargo.toml | 2 +- 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 crates/akailang-backend/Cargo.toml create mode 100644 crates/akailang-backend/src/lib.rs create mode 100644 crates/akailang-backend/src/llvm/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 3b75ccf..e76ba05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,4 @@ resolver = "3" [workspace.package] version = "0.1.0" -edition = "2024" \ No newline at end of file +edition = "2024" diff --git a/crates/akailang-backend/Cargo.toml b/crates/akailang-backend/Cargo.toml new file mode 100644 index 0000000..4fc8844 --- /dev/null +++ b/crates/akailang-backend/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "akailang-backend" +version.workspace = true +edition.workspace = true + +[dependencies] +inkwell = { version = "0.7.0", features = ["llvm21-1"] } +chumsky = "0.10.1" +akailang-parser = { path = "../akailang-parser" } \ No newline at end of file diff --git a/crates/akailang-backend/src/lib.rs b/crates/akailang-backend/src/lib.rs new file mode 100644 index 0000000..9665cda --- /dev/null +++ b/crates/akailang-backend/src/lib.rs @@ -0,0 +1,18 @@ +pub mod llvm; + +pub use akailang_parser::*; + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/akailang-backend/src/llvm/mod.rs b/crates/akailang-backend/src/llvm/mod.rs new file mode 100644 index 0000000..a7f8acc --- /dev/null +++ b/crates/akailang-backend/src/llvm/mod.rs @@ -0,0 +1,39 @@ +use chumsky::prelude::todo; +use inkwell::{ + GlobalVisibility, OptimizationLevel, + builder::{self, Builder}, + context::Context, + execution_engine::ExecutionEngine, + module::Module, + types::BasicTypeEnum, + values::{BasicValue, BasicValueEnum, FunctionValue}, +}; + +use akailang_parser::abstract_syntax_tree::{ + ast::Expr, + definitions::{Function, Identifier, Type}, +}; + +pub struct CodeGen<'ctx> { + pub(crate) context: &'ctx Context, + pub(crate) module: Module<'ctx>, + pub(crate) builder: Builder<'ctx>, + pub(crate) exec_engine: ExecutionEngine<'ctx>, +} + +impl<'ctx> CodeGen<'ctx> { + pub fn new(context: &'ctx Context, module_name: &str, opt_level: OptimizationLevel) -> Self { + let module = context.create_module(module_name); + let exec_engine = module.create_jit_execution_engine(opt_level).unwrap(); + let builder = context.create_builder(); + + CodeGen { + context, + module, + builder, + exec_engine, + } + } + + fn compile_expr(&mut self, expr: &Expr) {} +} diff --git a/crates/akailang/Cargo.toml b/crates/akailang/Cargo.toml index 269c834..40ec6fe 100644 --- a/crates/akailang/Cargo.toml +++ b/crates/akailang/Cargo.toml @@ -5,4 +5,4 @@ edition.workspace = true [dependencies] akailang-parser = {path = "../akailang-parser" } -akailang-backend = {path = "../akailang-backend"} \ No newline at end of file +akailang-backend = {path = "../akailang-backend" } \ No newline at end of file