#ifndef LLVMVISITOR #define LLVMVISITOR #include #include #include #include #include #include #include "Register.h" #include "LLVMVisitorReturn.h" #include "../Value/Integer.h" #include "../Value/Float.h" #include "../Value/Name.h" #include "../Value/List.h" #include "../Value/Funcall.h" class LLVMVisitor { std::ofstream outFile; Register greg; Register lreg; typedef std::function& args)> f_direct; std::map funcs_direct; typedef const std::vector& funcargs; LLVMRet f_defun(funcargs args); LLVMRet f_defvar(funcargs args); LLVMRet f_if(funcargs args); LLVMRet nameAsVar(const LLVMRet& ret); LLVMRet aritop(const std::string name, funcargs args, unsigned astart = 0); LLVMRet f_add(funcargs args); LLVMRet f_sub(funcargs args); LLVMRet f_mul(funcargs args); LLVMRet f_div(funcargs args); LLVMRet boolop(const std::string name, funcargs args); LLVMRet f_eq(funcargs args); LLVMRet f_gt(funcargs args); LLVMRet f_ge(funcargs args); LLVMRet f_lt(funcargs args); LLVMRet f_le(funcargs args); std::stack*> locals; std::map funcs_user; std::map vars_user; std::vector outBuf; public: LLVMRet Visit(const Integer& vint); LLVMRet Visit(const Float& vfloat); LLVMRet Visit(const Name& vname); LLVMRet Visit(const List& vlist); LLVMRet Visit(const Funcall& vfuncall); void insertMain(); LLVMVisitor(const char* fileName); }; #endif