Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-02-07 21:55:49 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-02-07 21:55:49 +0200
Filese79e4e1318568e933ed9ae031a53477ce214b9be
uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.tar
uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.tar.gz
uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.zip
Parent34ab5a9292118dad0fa3a302282b627b2fc956b9 (diff)
[IPL/T] Implemented defvar
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 0424d04..238c2f6 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
@@ -45,7 +45,19 @@ LLVMRet LLVMVisitor::f_defun(const std::vector<Value*>& args) {
outFile << "\tret " << funcRet << "\n}\n\n";
locals.pop();
- return { funcRet.type, "@" + fname->get_value() };
+ LLVMRet retType = { funcRet.type, "@" + fname->get_value() };
+ funcs_user.insert({ retType.addr, retType });
+ return retType;
+}
+
+LLVMRet LLVMVisitor::f_defvar(funcargs args) {
+ std::string name = "@" + static_cast<Name*>(args[0])->get_value();
+ LLVMRet retVal = args[1]->Visit(*this);
+ outFile << name << " = global " << retVal << "\n";
+
+ LLVMRet val = { retVal.type, name };
+ vars_user.insert({ name, val });
+ return val;
}
LLVMRet LLVMVisitor::nameAsVar(const LLVMRet& ret) {
@@ -129,6 +141,7 @@ LLVMVisitor::LLVMVisitor(const char* fileName) : outFile(std::ofstream(fileName)
funcs_direct.insert({"+", &LLVMVisitor::f_add});
funcs_direct.insert({"-", &LLVMVisitor::f_sub});
funcs_direct.insert({"defun", &LLVMVisitor::f_defun});
+ funcs_direct.insert({"defvar", &LLVMVisitor::f_defvar});
}
void LLVMVisitor::insertMain() {
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 9929dda..0a667e2 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
@@ -25,6 +25,7 @@ class LLVMVisitor {
typedef const std::vector<Value*>& funcargs;
LLVMRet f_defun(funcargs args);
+ LLVMRet f_defvar(funcargs args);
LLVMRet nameAsVar(const LLVMRet& ret);
LLVMRet aritop(const std::string name, funcargs args, unsigned astart = 0);
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 319f408..3efc904 100644
--- a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp
+++ b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp
@@ -6,6 +6,10 @@
int main() {
LLVMVisitor visitor("testout.ll");
std::deque<Value*> nodes = {
+ new Funcall("defvar", {
+ new Name("myvar"),
+ new Funcall("+", { new Funcall("-", { new Integer(8), new Integer(4) }), new Integer(19) })
+ }),
new Funcall("+", {
new Float(1),
new Funcall("-", { new Float(5), new Float(10) }),