diff options
| Commit | 7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c (patch) | |
|---|---|---|
| Author | 2023-02-07 21:55:49 +0200 | |
| Committer | 2023-02-07 21:55:49 +0200 | |
| Files | e79e4e1318568e933ed9ae031a53477ce214b9be | |
| uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.tar uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.tar.gz uni-projects-7913fe2fd73b11f8b1b13d8b3e65aca66dc3282c.zip | ||
| Parent | 34ab5a9292118dad0fa3a302282b627b2fc956b9 (diff) | |
[IPL/T] Implemented defvar
3 files changed, 19 insertions, 1 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 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) }), |
