Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitab1d1ecba4f2562a8b81d887d08370d5fcf0921d (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-01-29 20:58:52 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-01-29 20:58:52 +0200
Files636468df6e0f973fa3066db6492251c8027890d6
uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.tar
uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.tar.gz
uni-projects-ab1d1ecba4f2562a8b81d887d08370d5fcf0921d.zip
Parentd8eb50a7960edd35c74885d0ba7897f35c1b1eed (diff)
[IPL/T] Added current progress of implementing functions
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,
};