diff options
| Commit | ab1d1ecba4f2562a8b81d887d08370d5fcf0921d (patch) | |
|---|---|---|
| Author | 2023-01-29 20:58:52 +0200 | |
| Committer | 2023-01-29 20:58:52 +0200 | |
| Files | 636468df6e0f973fa3066db6492251c8027890d6 | |
| uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.tar uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.tar.gz uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.zip | ||
| Parent | d8eb50a7960edd35c74885d0ba7897f35c1b1eed (diff) | |
[IPL/T] Added current progress of implementing functions
9 files changed, 121 insertions, 2 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 index 9727a85..1fce314 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp @@ -1,14 +1,15 @@ #include <utility> +#include <vector> #include "LLVMVisitor.h" LLVMVisitor::LLVMVisitor(const char* fileName) : outFile(std::ofstream(fileName)), greg("@v"), lreg("%v") { if (!outFile.is_open()) throw std::runtime_error("Couldn't open file for writing!"); - outFile << "define i32 @main() {\n"; + // outFile << "define i32 @main() {\n"; } void LLVMVisitor::finalizeFile() { - outFile << "ret i32 0\n}\n"; + // outFile << "ret i32 0\n}\n"; } std::string LLVMVisitor::Visit(const Integer& vint) { @@ -19,6 +20,26 @@ std::string LLVMVisitor::Visit(const Float& vfloat) { return std::to_string(vfloat.get_value()); } +std::string LLVMVisitor::Visit(const Name& vname) { + return vname.get_value(); +} + +std::string LLVMVisitor::Visit(const Funcall& vfuncall) { + if (std::find(gfuncs.begin(), gfuncs.end(), vfuncall) == gfuncs.end()) + throw std::runtime_error("Function doesn't exist!"); + + std::vector<std::string> pargs; + for (Value* arg : vfuncall.get_args()) + pargs.push_back(arg->Visit(*this)); + + std::string valReg = *(lreg++); + outFile << valReg << " = call i32 " << vfuncall.get_funname() << "("; + for (std::string arg : pargs) + outFile << "i32 " << arg << ", "; + outFile << ")\n"; + return valReg; +} + void f_add(std::string reg, Value::T_Primitive ty, std::string first, std::string second, std::ofstream& of) { of << reg << " = "; switch(ty) { 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 index 55cc86e..9354ca1 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h @@ -2,15 +2,22 @@ #define LLVMVISITOR #include <fstream> +#include <vector> +#include <algorithm> #include "Register.h" #include "../Value/Integer.h" #include "../Value/Float.h" +#include "../Value/Name.h" +#include "../Value/Function/Funcall.h" #include "../Value/Function/BuiltInFunction.h" +#include "../Value/Function/UserFunction.h" class LLVMVisitor { std::ofstream outFile; Register greg; Register lreg; + std::vector<std::string> gfuncs; + std::vector<std::string> gvars; typedef void (&BiFout)(std::string reg, Value::T_Primitive ty, std::string first, std::string second, std::ofstream& of); std::string rightAssoc(BiFout f, const BuiltInFunction& bfun, unsigned i = 0); @@ -18,6 +25,8 @@ class LLVMVisitor { public: std::string Visit(const Integer& vint); std::string Visit(const Float& vfloat); + std::string Visit(const Name& vname); + std::string Visit(const Funcall& vfuncall); std::string Visit(const BuiltInFunction& bfun); void finalizeFile(); diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.cpp diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.h b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.h new file mode 100644 index 0000000..5afc51d --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/Funcall.h @@ -0,0 +1,21 @@ +#ifndef VALUE_FUNCALL +#define VALUE_FUNCALL + +#include <deque> +#include "../Value.h" + +class Funcall : public Value { + std::string funName; + std::deque<Value*> args; +public: + const std::string& get_funname() const; + const std::deque<Value*>& get_args() const; + + std::string Visit(LLVMVisitor& visitor) const override; + T_Primitive RetType() const override; + + Funcall(std::string funName, std::deque<Value*> args); + ~Funcall() override = default; +}; + +#endif diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.cpp new file mode 100644 index 0000000..a9841d3 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.cpp @@ -0,0 +1,14 @@ +#include "UserFunction.h" +#include "../../LLVMVisitor/LLVMVisitor.h" + +std::string UserFunction::Visit(LLVMVisitor& visitor) const { + return visitor.Visit(*this); +} + +Value::T_Primitive UserFunction::RetType() const { + if (body.empty()) + return T_void; + return body.back()->RetType(); +} + +UserFunction::UserFunction(std::string name, std::deque<Value*> args, std::deque<Function*> body) : Function(name, args), body(body) {} diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.h b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.h index e69de29..17cf931 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.h +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Function/UserFunction.h @@ -0,0 +1,16 @@ +#ifndef VALUE_USERFUNCTION +#define VALUE_USERFUNCTION + +#include <deque> +#include "Function.h" + +class UserFunction : public Function { + std::deque<Function*> body; + +public: + std::string Visit(LLVMVisitor& visitor) const override; + T_Primitive RetType() const override; + UserFunction(std::string name, std::deque<Value*> args, std::deque<Function*> body); +}; + +#endif diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.cpp new file mode 100644 index 0000000..52094b9 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.cpp @@ -0,0 +1,17 @@ +#include "Name.h" +#include "Value.h" +#include "../LLVMVisitor/LLVMVisitor.h" + +const std::string& Name::get_value() const { + return val; +} + +std::string Name::Visit(LLVMVisitor& visitor) const { + return visitor.Visit(*this); +} + +Value::T_Primitive Name::RetType() const { + return T_name; +} + +Name::Name(std::string val) : val(val) {} diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.h b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.h new file mode 100644 index 0000000..b242c06 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Name.h @@ -0,0 +1,20 @@ +#ifndef VALUE_NAME +#define VALUE_NAME + +#include <string> +#include "Value.h" + +class Name : public Value { + std::string val; + +public: + const std::string& get_value() const; + + std::string Visit(LLVMVisitor& visitor) const override; + T_Primitive RetType() const override; + + Name(std::string); + ~Name() override = default; +}; + +#endif diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Value.h b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Value.h index 0147515..a675d13 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Value.h +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/Value/Value.h @@ -9,6 +9,7 @@ class Value { public: enum T_Primitive { T_void, + T_name, T_integer, T_float, }; |
