/* ---- This file is part of SECONDO. Copyright (C) 2004-2009, University in Hagen, Faculty of Mathematics and Computer Science, Database Systems for New Applications. SECONDO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. SECONDO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with SECONDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---- //paragraph [10] title: [{\Large \bf ] [}] //paragraph [21] table1column: [\begin{quote}\begin{tabular}{l}] [\end{tabular}\end{quote}] //paragraph [22] table2columns: [\begin{quote}\begin{tabular}{ll}] [\end{tabular}\end{quote}] //paragraph [23] table3columns: [\begin{quote}\begin{tabular}{lll}] [\end{tabular}\end{quote}] //paragraph [24] table4columns: [\begin{quote}\begin{tabular}{llll}] [\end{tabular}\end{quote}] //[TOC] [\tableofcontents] //[--------] [\hline] //characters [1] verbatim: [$] [$] //characters [2] formula: [$] [$] //characters [3] capital: [\textsc{] [}] //characters [4] teletype: [\texttt{] [}] //[ae] [\"a] //[oe] [\"o] //[ue] [\"u] //[ss] [{\ss}] //[<=] [\leq] //[#] [\neq] //[tilde] [\verb|~|] //[<] [$<$] //[>] [$>$] [10] Header file of the CECodeGenerator 2016/2017 H.Brieschke created the new CompiledExpression Algebra [TOC] 1 Overview This header file declares all classes needed for the ~CECodeGenerator~. These are * ~CECGImplSecondoType~ * ~CECGImplSecondoOperator~ * ~CECGImplSecondoAlgebra~ * ~CECodeGenerator~ * ~CECOpTreeVisitorGenerateCode~ The 3 classes ~CECGImplSecondoAlgebra~, ~CECGImplSecondoType~ and ~CECGImplSecondoOperator~ are the base classes of the ~ceCodeStore~. The class ~CECodeGenerator~ implements the code generator. The class ~CECOpTreeVisitorGenerateCode~, a subclass from the ~CECOpTreeVisitor~, searches for the code parts in the operator tree and provides it to the ~CECodeGenerator~. 2 Defines, includes, and constants */ #ifndef _COMPILED_EXPRESSIONS_CODEGENERATOR_H_ #define _COMPILED_EXPRESSIONS_CODEGENERATOR_H_ //define macro TRACE_ON if trace outputs are needed //#define TRACE_ON #undef TRACE_ON #include #include #include #include "CECompiler.h" namespace CompiledExpressions { // forward declarations from classes in the CompiledExpressions-namespace class CECodeGenerator; class CECOpTreeVisitorGenerateCode; /* 3 Enumeration definitions 3.1 Enumeration ~ceCGHeaderFileIdx~ This enumeration define names for the various vectors to save the entry of include files. */ enum ceCGHeaderFileIdx { HF_IDX_CPP, HF_IDX_SECONDO, HF_IDX_REST, HF_SIZEOF }; /* 3.2 Enumeration ~ceCGCodeNodesTypes~ This enumeration define names for the various vectors to save the entry of code parts. */ enum ceCGCodeNodesTypes { CE_VCG_SUPERCLASS, CE_VCG_DEFINITATION_VAR, CE_VCG_DEFINITATION_ADDITIONAL_VAR, CE_VCG_DEFINITATION_FUNC_GET_SON_NODE, CE_VCG_DEFINITATION_FUNC_EVAL, CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN, CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST, CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION, CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY, CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY, CE_VCG_DECLARATION_FUNC_INIT_BODY, CE_VGC_DECLARATION_FUNC_GET_SON_NODE_HEAD, CE_VGC_DECLARATION_FUNC_GET_SON_NODE_BODY, CE_VGC_DECLARATION_FUNC_EVAL_HEAD, CE_VGC_DECLARATION_FUNC_EVAL_BODY, CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD, CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY, CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD, CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY, CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_CLOSE_BODY, CE_VGC_DECLARATION_ADDITIONAL_FUNCTION, CE_VCG_CT_SIZEOF }; /* 4 Class ~CECGImplSecondoType~ This class is the base class of all ~ceCodeStore~-classes to implements the code generation of a ~Secondo Type~. */ class CECGImplSecondoType { public: /* The Destructor */ virtual ~CECGImplSecondoType() {} /* A ~set~-function that initializes the class objects with the current values of the ~Secondo Algebra Manager~ at runtime. */ void initType(int algID, int typeID, bool isActiv); /* A ~get~-function returned ~TRUE~ or ~FALSE~ if the corresponding ~Secondo Type~ activ or not. */ bool isActivType(); /* A ~get~-function returned ~TRUE~ or ~FALSE~ whether the corresponding ~Secondo Type~ has a correspondence as ~C++ Type~. */ virtual bool isCPPType(); /* A ~get~-function returned a string with the ~Secondo Type Name~. */ virtual std::string getTypeName(); /* A ~get~-function returned a string with the ~Secondo Type Class Name~. */ virtual std::string getTypeClassName(); /* A ~get~-function returned a string with the ~C++ Type Name~. */ virtual std::string getCPPTypeName(); /* This function insert all in the code to included headerfiles in the array ~hf~. */ virtual void getHeaderFilesEntry(std::set(&hf)[HF_SIZEOF]) {} protected: /* The Constructor */ CECGImplSecondoType(); private: /* Different local variables... */ int algID, typeID; bool isActiv; }; /* 5 Class ~CECGImplSecondoOperator~ This class is the base class of all ~ceCodeStore~-classes to implements the code generation of a ~Secondo Operator~. */ class CECGImplSecondoOperator { public: /* The Destructor */ virtual ~CECGImplSecondoOperator() {} /* A ~set~-function that initializes the class objects with the current values of the ~Secondo Algebra Manager~ at runtime. */ void initOperator(int algID, int opID, bool isActiv); /* A ~get~-function returned ~TRUE~ or ~FALSE~ if the corresponding ~Secondo Operator~ activ or not. */ bool isActivOperator(); /* A ~get~-function returned a string with the ~Secondo Operator Name~. */ virtual std::string getOperatorName(); /* A ~get~-function returned ~TRUE~ or ~FALSE~ if the corresponding ~Secondo Operator~ in his ~ResultStorage~ created new object or not. */ virtual bool isGenerateNewObject(); /* A ~get~-function returned ~TRUE~ or ~FALSE~ if the corresponding ~Secondo Operator~ a stream operator or not. */ virtual bool isStreamOperator(); /* This function insert all in the code to included headerfiles in the array ~hf~. */ virtual void getHeaderFilesEntry(std::set(&hf)[HF_SIZEOF]) {} /* A ~get~-function returned a string with the code to defintion additional variables. */ virtual std::string getCodeOperatorAdditionalVariablesDefinition(); /* A ~get~-function returned a string with the code to initialisation additional variables. */ virtual std::string getCodeOperatorAdditionalVariablesInitialisation(); /* A ~get~-function returned a string with the code from the body of the ~eval open~-function. */ virtual std::string getCodeOperatorEvalOpenBody(); /* A ~get~-function returned a string with the code from the body of the ~eval request~-function. */ virtual std::string getCodeOperatorEvalRequestBody (std::vector(&signature)) /*throw (CECRuntimeError)*/; /* A ~get~-function returned a string with the code from the body of the ~eval close~-function. */ virtual std::string getCodeOperatorEvalCloseBody(); protected: /* The Constructor */ CECGImplSecondoOperator(); private: /* Different local variables... */ int algID, opID; bool isActiv; }; /* 6 Class ~CECGImplSecondoAlgebra~ This class is the base class of all ~ceCodeStore~-classes to implements the code generation of a ~Secondo Algebra~. */ class CECGImplSecondoAlgebra { public: /* The Destructor */ virtual ~CECGImplSecondoAlgebra() {} /* This function loads the implemented types into the code store of the ~CECompiler~. */ virtual void loadCECGImplSecondoTypes(CECodeGenerator* ceCG) {} /* This function loads the implemented operators into the code store of the ~CECompiler~. */ virtual void loadCECGImplSecondoOperators(CECodeGenerator* ceCG) {} protected: /* A local variable... */ const std::string algName; /* The Constructor */ CECGImplSecondoAlgebra(const std::string& name) : algName(name) {} private: /* The Standard Constructor */ CECGImplSecondoAlgebra() : algName(std::string("")) {} }; /* 7 Class ~CECodeGenerator~ The class ~CECodeGenerator~ implements the code generator. On one hand, it manages the ~code store~ and, on the other hand, uses the ~CECOpTreeVisitorGenerateCode~-visitor to create the source code files to be generated. This class is also a ~Singleton~. */ class CECodeGenerator { public: /* This static function returned a pointer of the ~CECodeGenerator~-instance. If no instance has been created, the function creates an instance. */ static CECodeGenerator* getInstance(); /* This static function deleted the ~CECodeGenerator~-instance. */ static void deleteInstance(); /* This static function set a flag, which indicates that the ~Secondo System~ has been started so far that the ~Code Store~ can be initialized. This point is reached as soon as the ~Secondo Algebra Manager~ has loaded all active algebras. */ static void setCanInitialize(); /* The Destructor */ virtual ~CECodeGenerator(); /* This function insert the given ~CECGImplSecondoType~-object ~implSecondoType~ in a data structure, in which all implemented ~CECGImplSecondoType~ are managed. */ void loadCECGImplSecondoType(CECGImplSecondoType* implSecondoType); /* A ~get~-function returned a pointer to the ~CECGImplSecondoType~-objects is given by the name ~name~. */ CECGImplSecondoType* getPtrSecondoType(std::string& name); /* This function insert the given ~CECGImplSecondoOperator~-object ~implSecondoOperator~ in a data structure, in which all implemented ~CECGImplSecondoOperator~ are managed. */ void loadCECGImplSecondoOperator (const std::string& algName, CECGImplSecondoOperator* implSecondoOperator); /* A ~get~-function returned a pointer to the ~CECGImplSecondoOperator~-objects is given by the ~Algebraname~ and the ~Operatorname~. */ CECGImplSecondoOperator* getPtrSecondoOperator(std::string& algName, std::string& opName); /* A ~get~-function returned a pointer to the ~CECGImplSecondoOperator~-objects is given by the ~Algebranumber~ and the ~Operatornumber~. */ CECGImplSecondoOperator* getPtrSecondoOperator(unsigned const int algID, unsigned const int opID); /* This function generate the ~c++-code~ of the query. */ bool generateCECode(CECOpNode* ptrRootNode, CEQuery* ptrCEQY); /* This function write the ~c++-code~ of the query in the stream ~outPut~. */ void getStreamGeneratedCECode(std::ostream& outPut, CEQuery* ptrCEQY); /* This function generate the code from a ~makefile~ and write this in the stream ~outPut~. */ void getStreamMake(std::ostream& outPut, std::string libName); private: /* Different static variables... */ static bool canInitialize; static CECodeGenerator* instance; /* Different local variables... */ bool isLoadCECGImplTypesAndOperators, isInitCECGImplTypesAndOperators; std::set classObjAlgebras; std::map mapNameImplTypes; std::map mapNameImplOperators; std::map mapIdImplOperators; /* The Standard Constructor */ CECodeGenerator(); /* This function loaded all implemented algebras, types, and operators from the ~Code Store~. */ void loadCECGImplAlgebrasTypesAndOperators(); /* In this function the loading of the implemented algebras from the ~Code Store~ is encapsulated. */ void loadCECGImplAlgebras(); /* This function initialized all implemented types and operators from the ~Code Store~. */ void initCECGImplTypesAndOperators(); /* This function deleted all ~Algebras~-, ~Types~- and ~Operator~-objects are loaded from the ~Code Store~. */ void deleteCECGImplAlgebrasTypesAndOperators(); }; /* 8 Class ~CECOpTreeVisitorGenerateCode~ The class ~CECOpTreeVisitorGenerateCode~, a subclass from the ~CECOpTreeVisitor~, searches for the code parts in the operator tree and provides it to the ~CECodeGenerator~. */ class CECOpTreeVisitorGenerateCode : public CECOpTreeVisitor { public: /* The Constructor */ CECOpTreeVisitorGenerateCode(); /* The Destructor */ ~CECOpTreeVisitorGenerateCode(); /* This function completes the names of the parameters passed to a function for all necessary functions of the source code to be generated, so that unique variable names are generated within a function. */ void addVarNamesARG_idx(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~include headerfile section~. */ std::string getGenCodeIncludes(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~forward class declaration section~. */ std::string getGenCodeForwardDeclarations(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~class definition section~. */ std::string getGenCodeClassDefinitions(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~class constructor function~. */ std::string getGenCodeClassConstructor(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~class destructor function~. */ std::string getGenCodeClassDestructor(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~eval function~. */ std::string getGenCodeFunctionEval(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~init function~. */ std::string getGenCodeFunctionInit(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~evalOpen- and evalRequest- function~. */ std::string getGenCodeFunctionOperator(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~declaration of additional functions~. */ std::string getGenCodeDeclarationAdditionalFunction(); /* A ~get~-function returned a string with the generated ~c++-code~ of the ~evalDefault function~. */ std::string getGenCodeEvalDefaultFunction(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeDefault~. */ std::string getGenCodeClassCECNodeDefault(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeApplyop~. */ std::string getGenCodeClassCECNodeApplyop(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeAbstraction~. */ std::string getGenCodeClassCECNodeAbstraction(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeObject~. */ std::string getGenCodeClassCECNodeObject(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeConstant~. */ std::string getGenCodeClassCECNodeConstant(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeVariable~. */ std::string getGenCodeClassCECNodeVariable(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeIdentifier~. */ std::string getGenCodeClassCECNodeIdentifier(); /* A ~get~-function returned a string with the generated ~c++-code~ of the class ~CECNodeArglist~. */ std::string getGenCodeClassCECNodeArglist(); /* A ~get~-function returned a string with the generated ~c++-code~ of the declaration of the class ~CodeCompiledExpressions~. */ std::string getGenCodeCodeCompiledExpressionsDeclaration(); /* A ~get~-function returned a string with the generated ~c++-code~ of the definition of the class ~CodeCompiledExpressions~. */ std::string getGenCodeCodeCompiledExpressionsDefinition(); /* A ~get~-function returned a string with the generated ~c++-code~ of the the ~external library call functions section~. */ std::string getGenCodeLibCallFunction(); /* This function adds commas to lists of arguments, parameters or similar in the source code to be generated. */ void insertCommaInCodeVector(int startPos, int actualPos, std::vector(&codeVector)); /* This function initialized the data structure of code segments for a new node in the ~operator tree~ and return a iterator of this structure. */ std::map > >::iterator initGenCodeNodesEntry(std::string strNodeKey, unsigned int numSons); /* This function completes the code segments for the father node ~ceNode~ in the operator tree. */ void completeGenCodeFatherNodeEntry(CECOpNode& ceNode); /* The following functions implement the visitor's behavior for each node type of the operator tree. These functions implement the abstract functions of the base class ~CECOpTreeVisitor~. */ void visit(CECOpNode&); void visit(CECOpNodeOperator&); void visit(CECOpNodeApplyop&); void visit(CECOpNodeAbstraction&); void visit(CECOpNodeObject&); void visit(CECOpNodeConstant&); void visit(CECOpNodeVariable&); void visit(CECOpNodeIdentifier&); void visit(CECOpNodeArglist&); void visit(CECOpNodeFunction&); void visit(CECOpNodeApplyabs&); void visit(CECOpNodeApplyfun&); void visit(CECOpNodeCounterdef&); void visit(CECOpNodePointer&); void visit(CECOpNodePredinfodef&); void visit(CECOpNodeMemorydef&); private: /* Different local variables... */ std::set headerfiles[HF_SIZEOF]; std::map > > genCodeNodes; std::set genCodeCompExprRootNodes; std::map genCodeCCEGlobalVar; std::map operators_libcall_function; bool cecOpNodeApplyopIsInsert; bool cecOpNodeAbstractionIsInsert; bool cecOpNodeObjectIsInsert; bool cecOpNodeConstantIsInsert; bool cecOpNodeVariableIsInsert; bool cecOpNodeIdentifierIsInsert; bool cecOpNodeArglistIsInsert; void createCELibDefaultFunc(); }; //end of class CECOpTreeVisitorGenerateCode } // end of namespace CompiledExpressions #endif // _COMPILED_EXPRESSIONS_CODEGENERATOR_H_