From e92e7d2183cbf57f2b93a4b6216b2e81c57ee0ef Mon Sep 17 00:00:00 2001 From: ChUrl Date: Tue, 21 Mar 2023 15:48:42 +0100 Subject: [PATCH] Implement codegen using an Observer --- src/ast/PostfixObserver.cpp | 18 ++++++++++++++++++ src/ast/PostfixObserver.h | 23 +++++++++++++++++++++++ src/codegen/CodegenObserver.cpp | 20 ++++++++++++++++++++ src/codegen/CodegenObserver.h | 23 +++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 src/ast/PostfixObserver.cpp create mode 100644 src/ast/PostfixObserver.h create mode 100644 src/codegen/CodegenObserver.cpp create mode 100644 src/codegen/CodegenObserver.h diff --git a/src/ast/PostfixObserver.cpp b/src/ast/PostfixObserver.cpp new file mode 100644 index 0000000..7f8a9fb --- /dev/null +++ b/src/ast/PostfixObserver.cpp @@ -0,0 +1,18 @@ +// +// Created by christoph on 20.03.23. +// + +#include "PostfixObserver.h" + +PostfixObserver::PostfixObserver(const Node &root) : Observer(root) {} + +// TODO: Shouldn't be recursive +void PostfixObserver::traverse(const Node &node) { + for (const auto &child : node.getChildren()) { + depth++; + traverse(*child); + depth--; + } + + action(node); +} diff --git a/src/ast/PostfixObserver.h b/src/ast/PostfixObserver.h new file mode 100644 index 0000000..2e1964a --- /dev/null +++ b/src/ast/PostfixObserver.h @@ -0,0 +1,23 @@ +// +// Created by christoph on 20.03.23. +// + +#ifndef LOGISIMASSEMBLER_POSTFIXOBSERVER_H +#define LOGISIMASSEMBLER_POSTFIXOBSERVER_H + +#include "Observer.h" + +class PostfixObserver : public Observer { +public: + PostfixObserver(const Node &root); + + ~PostfixObserver() override = default; + +protected: + void traverse(const Node &node) override; + +protected: + uint32_t depth = 0; +}; + +#endif //LOGISIMASSEMBLER_PREFIXOBSERVER_H diff --git a/src/codegen/CodegenObserver.cpp b/src/codegen/CodegenObserver.cpp new file mode 100644 index 0000000..1b9640c --- /dev/null +++ b/src/codegen/CodegenObserver.cpp @@ -0,0 +1,20 @@ +// +// Created by christoph on 21.03.23. +// + +#include "CodegenObserver.h" +#include +#include + +CodegenObserver::CodegenObserver(const Node &node, std::string &output_string) + : PostfixObserver(node), output_string(output_string) {} + +void CodegenObserver::action(const Node &node) { + const uint8_t opcode = node.compile(); + const uint8_t INVALID = -1; + + if (opcode != INVALID) { + output_string += (boost::format("%x") % static_cast(opcode)).str(); // uint8_t is always interpreted as char + output_string += ' '; + } +} diff --git a/src/codegen/CodegenObserver.h b/src/codegen/CodegenObserver.h new file mode 100644 index 0000000..9f916d9 --- /dev/null +++ b/src/codegen/CodegenObserver.h @@ -0,0 +1,23 @@ +// +// Created by christoph on 21.03.23. +// + +#ifndef LOGISIMASSEMBLER_CODEGENOBSERVER_H +#define LOGISIMASSEMBLER_CODEGENOBSERVER_H + +#include "../ast/PostfixObserver.h" + +class CodegenObserver : public PostfixObserver { +public: + CodegenObserver(const Node &node, std::string &output_string); + + ~CodegenObserver() override = default; + +protected: + void action(const Node &node) override; + +private: + std::string &output_string; +}; + +#endif //LOGISIMASSEMBLER_CODEGENOBSERVER_H