Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitbfa6fffc85772c17219437ab99c0cc59c3056f88 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-01-19 11:57:59 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-01-19 11:57:59 +0200
Files56fbf910a0507e3f42a71657144bbf0a0636a6ca
uni-projects-bfa6fffc85772c17219437ab99c0cc59c3056f88.tar
uni-projects-bfa6fffc85772c17219437ab99c0cc59c3056f88.tar.gz
uni-projects-bfa6fffc85772c17219437ab99c0cc59c3056f88.zip
Parentfd77c95a1042b319ec6dc0fcc10d77d0fe8af170 (diff)
[IPL/T] Add function can handle multiple arguments
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 d3eea2d..9ca6f8f 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
@@ -17,9 +17,15 @@ std::string LLVMVisitor::Visit(const Float& vfloat) {
return valRegister;
}
-std::string LLVMVisitor::f_add(const BuiltInFunction& bfun) {
- std::string leftArg = bfun.get_args()[0]->Visit(*this);
- std::string rightArg = bfun.get_args()[1]->Visit(*this);
+std::string LLVMVisitor::f_add(const BuiltInFunction& bfun, unsigned i) {
+ std::string leftArg = bfun.get_args()[i]->Visit(*this);
+ std::string rightArg;
+ if (bfun.get_args().size() - 2 == i) {
+ rightArg = bfun.get_args()[i+1]->Visit(*this);
+ }
+ else {
+ rightArg = f_add(bfun, i+1);
+ }
std::string valRegister = *(reg++);
outFile << valRegister << " = add i32 " << leftArg << ", " << rightArg << "\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
index 8b49cba..78719da 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
@@ -11,7 +11,7 @@ class LLVMVisitor {
std::ofstream outFile;
Register reg;
- std::string f_add(const BuiltInFunction& bfun);
+ std::string f_add(const BuiltInFunction& bfun, unsigned i = 0);
public:
std::string Visit(const Integer& vint);
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp
index 088f4d0..fefe544 100644
--- a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp
+++ b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp
@@ -4,7 +4,9 @@
int main() {
LLVMVisitor visitor("testout.ll");
- std::deque<Value*> nodes = { new BuiltInFunction("+", { new Integer(123), new Integer(567) }) };
+ std::deque<Value*> nodes = {
+ new BuiltInFunction("+", {
+ new Integer(1), new Integer(2), new Integer(123) }) };
for (Value* n : nodes) {
n->Visit(visitor);
}