stage4/generate_cc/generate_cc.cc
changeset 49 c96d1a4c23f8
parent 46 fc1b78ea6d84
child 52 f44458d1fa29
equal deleted inserted replaced
48:3d24cc85bb3c 49:c96d1a4c23f8
   187 #include "search_varfb_instance_type.cc"
   187 #include "search_varfb_instance_type.cc"
   188 #include "search_constant_type.cc"
   188 #include "search_constant_type.cc"
   189 #include "search_expression_type.cc"
   189 #include "search_expression_type.cc"
   190 
   190 
   191 #include "generate_cc_base.cc"
   191 #include "generate_cc_base.cc"
       
   192 #include "generate_cc_typedecl.cc"
   192 #include "generate_cc_sfcdecl.cc"
   193 #include "generate_cc_sfcdecl.cc"
   193 #include "generate_cc_typedecl.cc"
       
   194 #include "generate_cc_vardecl.cc"
   194 #include "generate_cc_vardecl.cc"
   195 #include "generate_cc_configbody.cc"
   195 #include "generate_cc_configbody.cc"
   196 #include "generate_location_list.cc"
   196 #include "generate_location_list.cc"
   197 
   197 
   198 /***********************************************************************/
   198 /***********************************************************************/
   749 public:
   749 public:
   750 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
   750 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
   751 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
   751 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
   752 void *visit(program_declaration_c *symbol) {
   752 void *visit(program_declaration_c *symbol) {
   753   generate_cc_vardecl_c *vardecl;
   753   generate_cc_vardecl_c *vardecl;
       
   754   generate_cc_sfcdecl_c *sfcdecl;
   754   TRACE("program_declaration_c");
   755   TRACE("program_declaration_c");
   755 
   756 
   756   /* start off by adding this declaration to the global
   757   /* start off by adding this declaration to the global
   757    * program declaration symbol table...
   758    * program declaration symbol table...
   758    */
   759    */
   785                 generate_cc_vardecl_c::located_vt |
   786                 generate_cc_vardecl_c::located_vt |
   786                 generate_cc_vardecl_c::external_vt);
   787                 generate_cc_vardecl_c::external_vt);
   787   vardecl->print(symbol->var_declarations);
   788   vardecl->print(symbol->var_declarations);
   788   delete vardecl;
   789   delete vardecl;
   789   /* (A.4) Generate private internal variables for SFC */
   790   /* (A.4) Generate private internal variables for SFC */
   790   generate_cc_sfctables_c generate_cc_sfctables(&s4o);
   791   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcdecl_sg);
   791   symbol->function_block_body->accept(generate_cc_sfctables);
   792   sfcdecl->print(symbol->function_block_body);
   792   s4o.print("\n");
   793   delete sfcdecl;
   793 
   794   
   794   /* (A.5) Program data structure type name. */
   795   /* (A.5) Program data structure type name. */
   795   s4o.indent_left();
   796   s4o.indent_left();
   796   s4o.print("} ");
   797   s4o.print("} ");
   797   symbol->program_type_name->accept(*this);
   798   symbol->program_type_name->accept(*this);
   798   s4o.print(";\n\n");
   799   s4o.print(";\n\n");
   821   				      generate_cc_vardecl_c::private_vt |
   822   				      generate_cc_vardecl_c::private_vt |
   822   				      generate_cc_vardecl_c::located_vt |
   823   				      generate_cc_vardecl_c::located_vt |
   823 				      generate_cc_vardecl_c::external_vt);
   824 				      generate_cc_vardecl_c::external_vt);
   824   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   825   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   825   delete vardecl;
   826   delete vardecl;
       
   827   s4o.print("\n");
       
   828   /* (B.3) Generate private internal variables for SFC */
       
   829   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcinit_sg);
       
   830   sfcdecl->print(symbol->function_block_body,FB_FUNCTION_PARAM"->");
       
   831   delete sfcdecl;
       
   832 
   826   s4o.indent_left();
   833   s4o.indent_left();
   827   s4o.print("\n" + s4o.indent_spaces + "}\n\n");
   834   s4o.print(s4o.indent_spaces + "}\n\n");
   828 
   835 
   829   /* (C) Function with PROGRAM body */
   836   /* (C) Function with PROGRAM body */
   830   /* (C.1) Step and Action definitions */
   837   /* (C.1) Step definitions */
   831   generate_cc_sfcdecl_c generate_cc_sfcdecl(&s4o);
   838   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepdef_sg);
   832   symbol->function_block_body->accept(generate_cc_sfcdecl);
   839   sfcdecl->print(symbol->function_block_body);
   833 
   840   delete sfcdecl;
   834   /* (C.2) Function declaration */
   841   
       
   842   /* (C.2) Action definitions */
       
   843   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actiondef_sg);
       
   844   sfcdecl->print(symbol->function_block_body);
       
   845   delete sfcdecl;
       
   846 
       
   847   /* (C.3) Function declaration */
   835   s4o.print("// Code part\n");
   848   s4o.print("// Code part\n");
   836   /* function interface */
   849   /* function interface */
   837   s4o.print("void ");
   850   s4o.print("void ");
   838   symbol->program_type_name->accept(*this);
   851   symbol->program_type_name->accept(*this);
   839   s4o.print(FB_FUNCTION_SUFFIX);
   852   s4o.print(FB_FUNCTION_SUFFIX);
   843   s4o.print(" *");
   856   s4o.print(" *");
   844   s4o.print(FB_FUNCTION_PARAM);
   857   s4o.print(FB_FUNCTION_PARAM);
   845   s4o.print(") {\n");
   858   s4o.print(") {\n");
   846   s4o.indent_right();
   859   s4o.indent_right();
   847 
   860 
   848   /* (C.3) Initialize TEMP variables */
   861   /* (C.4) Initialize TEMP variables */
   849   /* function body */
   862   /* function body */
   850   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   863   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   851   vardecl = new generate_cc_vardecl_c(&s4o,
   864   vardecl = new generate_cc_vardecl_c(&s4o,
   852   				      generate_cc_vardecl_c::init_vf,
   865   				      generate_cc_vardecl_c::init_vf,
   853 				      generate_cc_vardecl_c::temp_vt);
   866 				      generate_cc_vardecl_c::temp_vt);
   854   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   867   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   855   delete vardecl;
   868   delete vardecl;
   856   s4o.print("\n");
   869   s4o.print("\n");
   857 
   870 
   858   /* (C.4) Function code */
   871   /* (C.5) Function code */
   859   generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   872   generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   860   symbol->function_block_body->accept(generate_cc_code);
   873   symbol->function_block_body->accept(generate_cc_code);
   861   s4o.indent_left();
   874   s4o.indent_left();
   862   s4o.print(s4o.indent_spaces + "} // ");
   875   s4o.print(s4o.indent_spaces + "} // ");
   863   symbol->program_type_name->accept(*this);
   876   symbol->program_type_name->accept(*this);
   864   s4o.print(FB_FUNCTION_SUFFIX);
   877   s4o.print(FB_FUNCTION_SUFFIX);
   865   s4o.print(s4o.indent_spaces + "() \n\n");
   878   s4o.print(s4o.indent_spaces + "() \n\n");
   866 
   879 
   867   /* (C.5) Step and Action undefinitions */
   880   /* (C.6) Step undefinitions */
   868   generate_cc_sfcundecl_c generate_cc_sfcundecl(&s4o);
   881   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepundef_sg);
   869   symbol->function_block_body->accept(generate_cc_sfcundecl);
   882   sfcdecl->print(symbol->function_block_body);
   870 
   883   delete sfcdecl;
       
   884   
       
   885   /* (C.7) Action undefinitions */
       
   886   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actionundef_sg);
       
   887   sfcdecl->print(symbol->function_block_body);
       
   888   delete sfcdecl;
       
   889   
   871   s4o.indent_left();
   890   s4o.indent_left();
   872   s4o.print("\n\n\n\n");
   891   s4o.print("\n\n\n\n");
   873 
   892 
   874   return NULL;
   893   return NULL;
   875 }
   894 }