From e2a4ebecf32339d7cc8c35bdc3879f4ca5505b31 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Tue, 21 Mar 2023 14:33:56 +0100 Subject: [PATCH] Implement AST Observer and AST printer --- src/ast/Observer.cpp | 11 +++++++++++ src/ast/Observer.h | 28 ++++++++++++++++++++++++++++ src/ast/PrefixObserver.cpp | 18 ++++++++++++++++++ src/ast/PrefixObserver.h | 23 +++++++++++++++++++++++ src/codegen/PrintObserver.cpp | 23 +++++++++++++++++++++++ src/codegen/PrintObserver.h | 20 ++++++++++++++++++++ 6 files changed, 123 insertions(+) create mode 100644 src/ast/Observer.cpp create mode 100644 src/ast/Observer.h create mode 100644 src/ast/PrefixObserver.cpp create mode 100644 src/ast/PrefixObserver.h create mode 100644 src/codegen/PrintObserver.cpp create mode 100644 src/codegen/PrintObserver.h diff --git a/src/ast/Observer.cpp b/src/ast/Observer.cpp new file mode 100644 index 0000000..aed1aad --- /dev/null +++ b/src/ast/Observer.cpp @@ -0,0 +1,11 @@ +// +// Created by christoph on 21.03.23. +// + +#include "Observer.h" + +Observer::Observer(const Node &root) : root(root) {} + +void Observer::traverse() { + traverse(root); +} diff --git a/src/ast/Observer.h b/src/ast/Observer.h new file mode 100644 index 0000000..a274908 --- /dev/null +++ b/src/ast/Observer.h @@ -0,0 +1,28 @@ +// +// Created by christoph on 21.03.23. +// + +#ifndef LOGISIMASSEMBLER_OBSERVER_H +#define LOGISIMASSEMBLER_OBSERVER_H + +#include "Node.h" +#include + +class Observer { +public: + Observer(const Node &root); + + virtual ~Observer() = default; + + void traverse(); + +protected: + virtual void traverse(const Node &node) = 0; + + virtual void action(const Node &node) = 0; + +private: + const Node &root; +}; + +#endif //LOGISIMASSEMBLER_OBSERVER_H diff --git a/src/ast/PrefixObserver.cpp b/src/ast/PrefixObserver.cpp new file mode 100644 index 0000000..dbb9f7d --- /dev/null +++ b/src/ast/PrefixObserver.cpp @@ -0,0 +1,18 @@ +// +// Created by christoph on 20.03.23. +// + +#include "PrefixObserver.h" + +PrefixObserver::PrefixObserver(const Node &root) : Observer(root) {} + +// TODO: Shouldn't be recursive +void PrefixObserver::traverse(const Node &node) { + action(node); + + for (const auto &child : node.getChildren()) { + depth++; + traverse(*child); + depth--; + } +} diff --git a/src/ast/PrefixObserver.h b/src/ast/PrefixObserver.h new file mode 100644 index 0000000..cf12913 --- /dev/null +++ b/src/ast/PrefixObserver.h @@ -0,0 +1,23 @@ +// +// Created by christoph on 20.03.23. +// + +#ifndef LOGISIMASSEMBLER_PREFIXOBSERVER_H +#define LOGISIMASSEMBLER_PREFIXOBSERVER_H + +#include "Observer.h" + +class PrefixObserver : public Observer { +public: + PrefixObserver(const Node &root); + + ~PrefixObserver() override = default; + +protected: + void traverse(const Node &node) override; + +protected: + uint32_t depth = 0; +}; + +#endif //LOGISIMASSEMBLER_PREFIXOBSERVER_H diff --git a/src/codegen/PrintObserver.cpp b/src/codegen/PrintObserver.cpp new file mode 100644 index 0000000..1179d5b --- /dev/null +++ b/src/codegen/PrintObserver.cpp @@ -0,0 +1,23 @@ +// +// Created by christoph on 21.03.23. +// + +#include +#include "PrintObserver.h" + +PrintObserver::PrintObserver(const Node &node) : PrefixObserver(node) {} + +void PrintObserver::action(const Node &node) { + // Print a simple indent guide + std::string depth_padding(depth * 2, '|'); + if (depth > 0) { + for (uint32_t i = 0; i < depth_padding.length(); ++i) { + if (i % 2 == 1) { + depth_padding[i] = ' '; + } + } + depth_padding[(depth * 2) - 1] = '-'; + } + + std::cout << depth_padding << typeid(node).name() << std::endl; +} diff --git a/src/codegen/PrintObserver.h b/src/codegen/PrintObserver.h new file mode 100644 index 0000000..f8242de --- /dev/null +++ b/src/codegen/PrintObserver.h @@ -0,0 +1,20 @@ +// +// Created by christoph on 21.03.23. +// + +#ifndef LOGISIMASSEMBLER_PRINTOBSERVER_H +#define LOGISIMASSEMBLER_PRINTOBSERVER_H + +#include "../ast/PrefixObserver.h" + +class PrintObserver : public PrefixObserver { +public: + PrintObserver(const Node &node); + + ~PrintObserver() override = default; + +protected: + void action(const Node &node) override; +}; + +#endif //LOGISIMASSEMBLER_PRINTOBSERVER_H