stage4/generate_cc/generate_cc.cc
changeset 12 f01522b04810
parent 0 fb772792efd1
child 14 d926ee71f228
equal deleted inserted replaced
11:8ce37f36d744 12:f01522b04810
   681   program_type_symtable.insert(symbol->program_type_name, symbol);
   681   program_type_symtable.insert(symbol->program_type_name, symbol);
   682 
   682 
   683   /* (A) Class (Function Block) declaration... */
   683   /* (A) Class (Function Block) declaration... */
   684   /* (A.1) Class (Function Block) name */
   684   /* (A.1) Class (Function Block) name */
   685   s4o.print("// PROGRAM\n");
   685   s4o.print("// PROGRAM\n");
   686   s4o.print(s4o.indent_spaces + "class ");
   686   s4o.print(s4o.indent_spaces);
   687   symbol->program_type_name->accept(*this);
   687   symbol->program_type_name->accept(*this);
   688   s4o.print(" {\n");
   688   s4o.print("\n //Data part\n");
       
   689   s4o.print("typedef struct {\n");
   689   s4o.indent_right();
   690   s4o.indent_right();
   690 
   691 
   691   /* (A.2) Public variables: i.e. the program parameters... */
   692   /* (A.2) Public variables: i.e. the program parameters... */
   692   s4o.print(s4o.indent_spaces + "public:\n");
   693   s4o.print(s4o.indent_spaces + "//PROGRAM interface IN OUT IN_OUT variables\n");
   693   s4o.indent_right();
   694   s4o.indent_right();
   694   vardecl = new generate_cc_vardecl_c(&s4o,
   695   vardecl = new generate_cc_vardecl_c(&s4o,
   695   				      generate_cc_vardecl_c::local_vf,
   696   				      generate_cc_vardecl_c::local_vf,
   696   				      generate_cc_vardecl_c::input_vt |
   697   				      generate_cc_vardecl_c::input_vt |
   697   				      generate_cc_vardecl_c::output_vt |
   698   				      generate_cc_vardecl_c::output_vt |
   700   delete vardecl;
   701   delete vardecl;
   701   s4o.indent_left();
   702   s4o.indent_left();
   702   s4o.print("\n");
   703   s4o.print("\n");
   703 
   704 
   704   /* (A.3) Private internal variables */
   705   /* (A.3) Private internal variables */
   705   s4o.print(s4o.indent_spaces + "private:\n");
   706   s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   706   s4o.indent_right();
   707   s4o.indent_right();
   707   vardecl = new generate_cc_vardecl_c(&s4o,
   708   vardecl = new generate_cc_vardecl_c(&s4o,
   708   				      generate_cc_vardecl_c::local_vf,
   709   				      generate_cc_vardecl_c::local_vf,
   709   				      generate_cc_vardecl_c::private_vt |
   710   				      generate_cc_vardecl_c::private_vt |
   710   				      generate_cc_vardecl_c::located_vt |
   711   				      generate_cc_vardecl_c::located_vt |
   711 				      generate_cc_vardecl_c::external_vt);
   712 				      generate_cc_vardecl_c::external_vt);
   712   vardecl->print(symbol->var_declarations);
   713   vardecl->print(symbol->var_declarations);
   713   delete vardecl;
   714   delete vardecl;
   714   s4o.indent_left();
   715   s4o.print("\n ");
   715   s4o.print("\n");
   716   s4o.indent_left();
   716 
   717   s4o.print("} ");
       
   718   symbol->program_type_name->accept(*this);
       
   719   s4o.print(";\n\n ");
   717   /* (B) Constructor */
   720   /* (B) Constructor */
   718   /* (B.1) Constructor name... */
   721   /* (B.1) Constructor name... */
   719   s4o.print(s4o.indent_spaces + "public:\n");
   722   s4o.print("// Code part");
       
   723   /*PROGRAM Interface*/
   720   s4o.indent_right();
   724   s4o.indent_right();
   721   s4o.print(s4o.indent_spaces);
   725   s4o.print(s4o.indent_spaces);
       
   726   s4o.print("void ");
   722   symbol->program_type_name->accept(*this);
   727   symbol->program_type_name->accept(*this);
   723 
   728   s4o.print(FB_FUNCTION_SUFFIX);
   724   /* (B.2) Constructor parameters (i.e. the external variables)... */
   729   /* (B.2) Constructor parameters (i.e. the external variables)... */
   725   s4o.print("(");
   730   s4o.print("(");
   726   s4o.indent_right();
   731   symbol->program_type_name->accept(*this);
       
   732   s4o.indent_right();
       
   733   s4o.print(" ");
   727   vardecl = new generate_cc_vardecl_c(&s4o,
   734   vardecl = new generate_cc_vardecl_c(&s4o,
   728   				      generate_cc_vardecl_c::finterface_vf,
   735   				      generate_cc_vardecl_c::finterface_vf,
   729   				      generate_cc_vardecl_c::external_vt);
   736   				      generate_cc_vardecl_c::external_vt);
   730   vardecl->print(symbol->var_declarations);
   737   vardecl->print(symbol->var_declarations);
   731   delete vardecl;
   738   delete vardecl;
   732   s4o.print(")\n");
   739   s4o.print(")");
       
   740   s4o.print("{\n");
   733   s4o.indent_left();
   741   s4o.indent_left();
   734 
   742 
   735   /* (B.2) Member initializations... */
   743   /* (B.2) Member initializations... */
   736   s4o.indent_right();
   744   s4o.indent_right();
   737   s4o.print(s4o.indent_spaces);
   745   s4o.print(s4o.indent_spaces + "//Initialise PROGRAM variables\n");
   738   vardecl = new generate_cc_vardecl_c(&s4o,
   746   vardecl = new generate_cc_vardecl_c(&s4o,s4o.print("void ");
   739   				      generate_cc_vardecl_c::constructorinit_vf,
   747   				      generate_cc_vardecl_c::constructorinit_vf,
   740   				      generate_cc_vardecl_c::input_vt |
   748   				      generate_cc_vardecl_c::input_vt |
   741   				      generate_cc_vardecl_c::output_vt |
   749   				      generate_cc_vardecl_c::output_vt |
   742   				      generate_cc_vardecl_c::inoutput_vt |
   750   				      generate_cc_vardecl_c::inoutput_vt |
   743   				      generate_cc_vardecl_c::private_vt |
   751   				      generate_cc_vardecl_c::private_vt |
   744 				      generate_cc_vardecl_c::external_vt);
   752 				      generate_cc_vardecl_c::external_vt);
   745   vardecl->print(symbol->var_declarations);
   753   vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
   746   delete vardecl;
   754   delete vardecl;
   747   s4o.print("\n" + s4o.indent_spaces + "{}\n\n");
   755   s4o.print("\n" + s4o.indent_spaces);
   748   s4o.indent_left();
   756   s4o.indent_left();
   749   s4o.indent_left();
   757   s4o.indent_left();
   750 
   758 
   751   /* (C) Public Function*/
   759   /* (C) Public Function*/
   752   /* (C.1) Public Function declaration */
   760   /* (C.1) Public Function declaration */
   753   s4o.print(s4o.indent_spaces + "public:\n");
   761   s4o.print(s4o.indent_spaces);
   754   s4o.indent_right();
   762   //s4o.indent_right();
   755   s4o.print(s4o.indent_spaces + "void f(void) {\n");
   763   //s4o.print(s4o.indent_spaces + "void f(void) {\n");
   756 
   764 
   757   /* (C.2) Temporary variables */
   765   /* (C.2) Temporary variables */
   758   s4o.indent_right();
   766   //s4o.indent_right();
   759   vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
   767   //vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
   760   vardecl->print(symbol->var_declarations);
   768   //vardecl->print(symbol->var_declarations);
   761   delete vardecl;
   769   //delete vardecl;
   762   s4o.indent_left();
   770   //s4o.indent_left();
   763   s4o.print("\n");
   771   s4o.print("\n");
   764 
   772 
   765   /* (C.3) Public Function body */
   773   /* (C.3) Public Function body */
   766   s4o.indent_right();
   774   s4o.indent_right();
   767   generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol);
   775   generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   768   symbol->function_block_body->accept(generate_cc_code);
   776   symbol->function_block_body->accept(generate_cc_code);
   769   s4o.indent_left();
   777   s4o.indent_left();
   770   s4o.print(s4o.indent_spaces + "} /* f() */\n\n");
   778   s4o.print(s4o.indent_spaces + "} //");
       
   779   symbol->program_type_name->accept(*this);
       
   780   s4o.print(FB_FUNCTION_SUFFIX);
       
   781   s4o.print("()\n");
   771   s4o.indent_left();
   782   s4o.indent_left();
   772 
   783 
   773   /* (D) Close the class declaration... */
   784   /* (D) Close the class declaration... */
   774   s4o.indent_left();
   785   s4o.indent_left();
   775   s4o.print(s4o.indent_spaces + "}; /* class ");
   786   s4o.print(s4o.indent_spaces + "}; /* void ");
   776   symbol->program_type_name->accept(*this);
   787   symbol->program_type_name->accept(*this);
   777   s4o.print(" */\n\n\n");
   788   s4o.print(" */\n\n\n");
   778 
   789 
   779   /* (E) Initialise the static member variables... */
   790   /* (E) Initialise the static member variables... */
   780   vardecl = new generate_cc_vardecl_c(&s4o,
   791   vardecl = new generate_cc_vardecl_c(&s4o,