diff options
[IPL/T] Implemented initial structure with Integer data type
4 files changed, 64 insertions, 0 deletions
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 <fstream> +#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 <string> + +class Register { + unsigned counter; + +public: + Register(); + Register& operator++(); + Register operator++(int); + std::string operator*(); +}; + +#endif |
