From efe8408f9ae0984d1ff2bf9171a4cb41e8f24856 Mon Sep 17 00:00:00 2001 From: "michael.burzan" Date: Fri, 3 Jan 2025 20:21:12 +0100 Subject: [PATCH] first program run --- include/Codegeneration.h | 146 +++++++++++++++++++++++++++++++++++++++ src/Codegeneration.cpp | 116 +++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 include/Codegeneration.h create mode 100644 src/Codegeneration.cpp diff --git a/include/Codegeneration.h b/include/Codegeneration.h new file mode 100644 index 0000000..4e89a8d --- /dev/null +++ b/include/Codegeneration.h @@ -0,0 +1,146 @@ +#ifndef PALLADIUM_CODEGENERATION_H +#define PALLADIUM_CODEGENERATION_H +#include +#include "FunctionNode.h" +#include "StatementsNode.h" +#include "VMPolicy.h" +#include "Visitor.h" +#include "VirtualMachine.h" + +using VMPtr = std::shared_ptr>; +using Code = std::vector>>; +//------------------FORWARD DECLARATION-------------------- +class FunctionVisitor; +class StatementsVisitor; +class StatementVisitor; +class ReturnStatementVisitor; +class ExpressionVisitor; +//--------------------------------------------------------- + +class TranslationUnitVisitor : public Visitor { +public: + TranslationUnitVisitor(); + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +public: + auto vm() const { + return _vm; + } + +private: + VMPtr _vm; + std::shared_ptr _func_visitor; +}; + +//----------------------------------------------------- +class FunctionVisitor : public Visitor { +public: + FunctionVisitor(const VMPtr& vm) : _vm(vm) { + } + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +private: + VMPtr _vm; + std::shared_ptr _statements_visitor; +}; + +//----------------------------------------------------- +class StatementsVisitor : public Visitor { +public: + StatementsVisitor() = default; + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +public: + auto block() const -> const Code& { + return _block; + } + +private: + Code _block; + std::shared_ptr _statement_visitor; +}; + +//----------------------------------------------------- +class StatementVisitor : public Visitor { +public: + StatementVisitor() = default; + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +public: + auto code() const -> const Code& { + return _code; + } + +private: + Code _code; + std::shared_ptr _return_statement_visitor; +}; + +//----------------------------------------------------- +class ReturnStatementVisitor : public Visitor { +public: + ReturnStatementVisitor() = default; + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +public: + auto code() const -> const Code& { + return _code; + } + +private: + Code _code; + std::shared_ptr _expression_visitor; +}; + +//----------------------------------------------------- +class ExpressionVisitor : public Visitor { +public: + ExpressionVisitor() = default; + auto begin(const std::shared_ptr& node) -> VisitResult override; + auto visit(const std::shared_ptr& node) -> std::shared_ptr override; + auto end(const std::shared_ptr& node) -> VisitResult override; + + using Visitor::begin; + using Visitor::end; + using Visitor::visit; + +public: + auto code() const -> const Code& { + return _code; + } + +private: + Code _code; +}; + +#endif diff --git a/src/Codegeneration.cpp b/src/Codegeneration.cpp new file mode 100644 index 0000000..e742141 --- /dev/null +++ b/src/Codegeneration.cpp @@ -0,0 +1,116 @@ +#include "Codegeneration.h" +#include +#include "ExpressionNode.h" +#include "ReturnStatementNode.h" +#include "StatementNode.h" +#include "StatementsNode.h" +#include "TranslationUnitNode.h" +#include "Util.h" + +using VM = VirtualMachine; +TranslationUnitVisitor::TranslationUnitVisitor() : _vm(std::make_shared>()) { + _vm->add_program({Call("main"), Halt()}); +} + +auto TranslationUnitVisitor::begin(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} +auto TranslationUnitVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + _func_visitor = std::make_shared(_vm); + return _func_visitor; +} +auto TranslationUnitVisitor::end(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} + +//----------------------------------------------------- +auto FunctionVisitor::begin(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} +auto FunctionVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + _statements_visitor = std::make_shared(); + return _statements_visitor; +} +auto FunctionVisitor::end(const std::shared_ptr& node) -> VisitResult { + auto fname = node->function_name(); + _vm->add_function(fname, _statements_visitor->block(), 0); + return true; +} + +//----------------------------------------------------- +auto StatementsVisitor::begin(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} +auto StatementsVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + _statement_visitor = std::make_shared(); + return _statement_visitor; +} +auto StatementsVisitor::end(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + _block.insert(_block.end(), _statement_visitor->code().begin(), _statement_visitor->code().end()); + return true; +} + +//----------------------------------------------------- +auto StatementVisitor::begin(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} +auto StatementVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + _return_statement_visitor = std::make_shared(); + return _return_statement_visitor; +} +auto StatementVisitor::end(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + _code.insert(_code.end(), _return_statement_visitor->code().begin(), _return_statement_visitor->code().end()); + return true; +} + +//----------------------------------------------------- +auto ReturnStatementVisitor::begin(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +} +auto ReturnStatementVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + _expression_visitor = std::make_shared(); + return _expression_visitor; +} +auto ReturnStatementVisitor::end(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + _code.insert(_code.end(), _expression_visitor->code().begin(), _expression_visitor->code().end()); + _code.push_back(Return(0)); + return true; +} + +//----------------------------------------------------- +auto ExpressionVisitor::begin(const std::shared_ptr& node) -> VisitResult { + switch (node->kind()) { + case ExpressionKind::CONST_INT: + _code.push_back(CLoad(std::atoi(node->constante().c_str()))); + break; + case ExpressionKind::CONST_DOUBLE: + case ExpressionKind::CONST_TEXT: + case ExpressionKind::ARRAY_INIT: + case ExpressionKind::BIN_OP: + break; + } + + return true; +} +auto ExpressionVisitor::visit(const std::shared_ptr& node) -> std::shared_ptr { + UNUSED(node); + return shared_from_this(); +} +auto ExpressionVisitor::end(const std::shared_ptr& node) -> VisitResult { + UNUSED(node); + return true; +}