diff --git a/src/ast/mod.rs b/src/ast/mod.rs deleted file mode 100644 index 5bd84ba..0000000 --- a/src/ast/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -use std::ops::Range; - -use crate::ast::op::Op; - -pub mod op; -pub mod ast; - - diff --git a/src/ast/ast.rs b/src/language_frontend/ast/ast.rs similarity index 100% rename from src/ast/ast.rs rename to src/language_frontend/ast/ast.rs diff --git a/src/language_frontend/ast/mod.rs b/src/language_frontend/ast/mod.rs new file mode 100644 index 0000000..10d92bc --- /dev/null +++ b/src/language_frontend/ast/mod.rs @@ -0,0 +1,2 @@ +pub mod ast; +pub mod op; \ No newline at end of file diff --git a/src/ast/op.rs b/src/language_frontend/ast/op.rs similarity index 100% rename from src/ast/op.rs rename to src/language_frontend/ast/op.rs diff --git a/src/language_frontend/mod.rs b/src/language_frontend/mod.rs new file mode 100644 index 0000000..851c0bc --- /dev/null +++ b/src/language_frontend/mod.rs @@ -0,0 +1 @@ +pub mod ast; diff --git a/src/code_generation/compiler.rs b/src/llvm_backend/compiler.rs similarity index 100% rename from src/code_generation/compiler.rs rename to src/llvm_backend/compiler.rs diff --git a/src/code_generation/mod.rs b/src/llvm_backend/mod.rs similarity index 54% rename from src/code_generation/mod.rs rename to src/llvm_backend/mod.rs index 6887f20..eaa9f91 100644 --- a/src/code_generation/mod.rs +++ b/src/llvm_backend/mod.rs @@ -44,27 +44,54 @@ impl<'ctx, 'src> Expression<'src> { todo!() }, - Expression::Add(expression, expression1) => { + Expression::Add( + lhs, + rhs + ) => { + let l = lhs.codegen(ctx).into_int_value(); + let r = rhs.codegen(ctx).into_int_value(); + ctx.builder.build_int_add(l, r, "addtmp").unwrap().into() + }, + + Expression::Substract( + lhs, + rhs + ) => { todo!() }, - Expression::Substract(expression, expression1) => { + Expression::Multiply( + lhs, + rhs + ) => { todo!() }, - Expression::Multiply(expression, expression1) => { + Expression::Divide( + lhs, + rhs + ) => { todo!() }, - Expression::Divide(expression, expression1) => { - todo!() + Expression::Var { + name, + rhs, + then + } => { + let value = rhs.codegen(ctx); + let ptr = ctx.builder.build_alloca(ctx.context.f32_type(), name).unwrap(); + let _ = ctx.builder.build_store(ptr, value); + ctx.variables.insert(name.to_string(), ptr); + then.codegen(ctx) }, - Expression::Var { name, rhs, then } => { - todo!() - }, - - Expression::Function { name, args, body, then } => { + Expression::Function { + name, + args, + body, + then + } => { todo!() }, diff --git a/src/main.rs b/src/main.rs index f8d8eca..9acea71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,9 @@ use logos::Logos; use crate::{parser::parser, tokens::Token}; mod tokens; -mod ast; +mod language_frontend; mod parser; -mod code_generation; +mod llvm_backend; fn main() { let lexer = Token::lexer("(1 + 1) * 3"); diff --git a/syntax.akai b/syntax.akai index b4293f4..40c7e25 100644 --- a/syntax.akai +++ b/syntax.akai @@ -25,14 +25,29 @@ fun helloWorld() { print("Hello World " + bar) } +fun returnsInteger(int: i): int { + -> i + 1 +} + /* Keywords/ Tokens: - class + - interface - fun - var + + - derive // Inheritance for classes + - impl // for interfaces + + // Standard keywords for basic stuff + - int + - float + - char - bool - if - else + - enum + - ( - ) - {