From eb3b755a3c419afc38c5f3ed52bcd075d9ba48e6 Mon Sep 17 00:00:00 2001 From: Araozu Date: Sat, 6 Jan 2024 19:07:41 -0500 Subject: [PATCH] (lazily) codegen parsed expressions. v0.0.9 (rebase) --- CHANGELOG.md | 10 +++++++--- src/codegen/binding.rs | 4 ++-- src/codegen/expression.rs | 14 ++++++++++++-- src/codegen/function_call.rs | 4 ++++ src/codegen/mod.rs | 1 + src/codegen/module_ast.rs | 4 ++++ src/codegen/statement.rs | 9 +++++++++ 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f1949d..4155b04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,11 +15,15 @@ - Watch mode - Formatter - Simple language server -- Decide how to handle comments in the syntax (?) +- Decide how to handle comments in the syntax (?)(should comments mean something like in rust?) ## v0.0.10 -- [ ] Typecheck current AST +- [ ] Begin work on semantic analysis +- [ ] Symbol table +- [ ] Typecheck bindings +- [ ] Typecheck functions +- [ ] Transform simple THP expression into PHP statements ## v0.0.9 @@ -27,7 +31,7 @@ - [x] Compile a single file - [x] Display error messages during compilation instead of panicking - [x] Improve error messages -- [ ] Implement code generation for ast nodes implemented as of now +- [x] Implement code generation for ast nodes implemented as of now diff --git a/src/codegen/binding.rs b/src/codegen/binding.rs index be1e131..039167f 100644 --- a/src/codegen/binding.rs +++ b/src/codegen/binding.rs @@ -6,7 +6,7 @@ impl Transpilable for Binding { fn transpile(&self) -> String { let expression_str = self.expression.transpile(); - format!("${} = {};", self.identifier, expression_str) + format!("${} = {}", self.identifier, expression_str) } } @@ -28,6 +28,6 @@ mod tests { let result = binding.transpile(); - assert_eq!("$identifier = 322;", result); + assert_eq!("$identifier = 322", result); } } diff --git a/src/codegen/expression.rs b/src/codegen/expression.rs index 3ce806a..db254e7 100644 --- a/src/codegen/expression.rs +++ b/src/codegen/expression.rs @@ -18,11 +18,21 @@ impl Transpilable for Expression { Expression::Boolean(value) => String::from(if *value { "true" } else { "false" }), Expression::Identifier(value) => format!("{}", *value), Expression::FunctionCall(f) => f.transpile(), +<<<<<<< HEAD Expression::BinaryOperator(_, _, _) => { todo!("BinaryOperator codegen is not implemented yet") +======= + Expression::BinaryOperator(left_expr, right_expr, operator) => { + format!( + "{}{}{}", + left_expr.transpile(), + operator, + right_expr.transpile() + ) +>>>>>>> f71f9ab ((lazily) codegen parsed expressions. v0.0.9) } - Expression::UnaryOperator(_, _) => { - todo!("UnaryOperator codegen is not implemented yet") + Expression::UnaryOperator(operator, expression) => { + format!("{}{}", operator, expression.transpile()) } } } diff --git a/src/codegen/function_call.rs b/src/codegen/function_call.rs index 11b111e..591e706 100644 --- a/src/codegen/function_call.rs +++ b/src/codegen/function_call.rs @@ -4,6 +4,10 @@ use super::Transpilable; impl Transpilable for FunctionCall { fn transpile(&self) -> String { +<<<<<<< HEAD format!("{}();", self.function.transpile()) +======= + format!("{}()", self.identifier) +>>>>>>> f71f9ab ((lazily) codegen parsed expressions. v0.0.9) } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 86b47fc..b375a40 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -5,6 +5,7 @@ mod block; mod expression; mod function_call; mod function_declaration; +mod function_call; mod module_ast; mod statement; mod top_level_construct; diff --git a/src/codegen/module_ast.rs b/src/codegen/module_ast.rs index 2b70d25..018efa8 100644 --- a/src/codegen/module_ast.rs +++ b/src/codegen/module_ast.rs @@ -37,6 +37,10 @@ mod tests { let result = module.transpile(); +<<<<<<< HEAD assert_eq!(">>>>>> f71f9ab ((lazily) codegen parsed expressions. v0.0.9) } } diff --git a/src/codegen/statement.rs b/src/codegen/statement.rs index 6792eec..cbf72be 100644 --- a/src/codegen/statement.rs +++ b/src/codegen/statement.rs @@ -4,9 +4,18 @@ use super::Transpilable; impl Transpilable for Statement { fn transpile(&self) -> String { +<<<<<<< HEAD match self { Statement::Binding(binding) => binding.transpile(), Statement::FunctionCall(function_call) => function_call.transpile(), } +======= + let stmt = match self { + Statement::FunctionCall(f) => f.transpile(), + Statement::Binding(b) => b.transpile(), + }; + + format!("{stmt};") +>>>>>>> f71f9ab ((lazily) codegen parsed expressions. v0.0.9) } }