From 8f41c57ff12fa72693016b75fec63bb86ae6560f Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 18 Jan 2023 11:51:57 +0200 Subject: [IPL/T] Implemented initial structure with Integer data type --- .../Transpiler/src/LLVMVisitor/LLVMVisitor.cpp | 12 ++++++++++++ .../Transpiler/src/LLVMVisitor/LLVMVisitor.h | 18 ++++++++++++++++++ .../Transpiler/src/LLVMVisitor/Register.cpp | 18 ++++++++++++++++++ .../Transpiler/src/LLVMVisitor/Register.h | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp create mode 100644 Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h create mode 100644 Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.cpp create mode 100644 Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.h (limited to 'Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor') diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp new file mode 100644 index 0000000..f68b80d --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp @@ -0,0 +1,12 @@ +#include "LLVMVisitor.h" + +LLVMVisitor::LLVMVisitor(const char* fileName) : outFile(std::ofstream(fileName)), reg() { + if (!outFile.is_open()) + throw std::runtime_error("Couldn't open file for writing!"); +} + +std::string LLVMVisitor::Visit(const Integer& vint) { + std::string valRegister = *(reg++); + outFile << valRegister + " = " + std::to_string(vint.get_value()) + "\n"; + return valRegister; +} diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h new file mode 100644 index 0000000..d52b5b3 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h @@ -0,0 +1,18 @@ +#ifndef LLVMVISITOR +#define LLVMVISITOR + +#include +#include "Register.h" +#include "../Value/Integer.h" + +class LLVMVisitor { + std::ofstream outFile; + Register reg; + +public: + std::string Visit(const Integer& vint); + + LLVMVisitor(const char* fileName); +}; + +#endif diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.cpp new file mode 100644 index 0000000..b2311d9 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.cpp @@ -0,0 +1,18 @@ +#include "Register.h" + +Register::Register() : counter(0) {} + +Register& Register::operator++() { + ++counter; + return *this; +} + +Register Register::operator++(int) { + Register old = *this; + ++(*this); + return old; +} + +std::string Register::operator*() { + return "%" + std::to_string(counter); +} diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.h b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.h new file mode 100644 index 0000000..70f0619 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/Register.h @@ -0,0 +1,16 @@ +#ifndef LLVMVISITOR_REGISTER +#define LLVMVISITOR_REGISTER + +#include + +class Register { + unsigned counter; + +public: + Register(); + Register& operator++(); + Register operator++(int); + std::string operator*(); +}; + +#endif -- cgit v1.3.1-26-gb76a