stage4/generate_cc/generate_cc.cc
changeset 16 e8b99f896416
parent 14 d926ee71f228
child 17 38754701ac41
equal deleted inserted replaced
15:0b472e25eb16 16:e8b99f896416
    36 
    36 
    37 
    37 
    38 // #include <stdio.h>  /* required for NULL */
    38 // #include <stdio.h>  /* required for NULL */
    39 #include <string>
    39 #include <string>
    40 #include <iostream>
    40 #include <iostream>
       
    41 #include <typeinfo>
    41 
    42 
    42 #include "../../util/symtable.hh"
    43 #include "../../util/symtable.hh"
    43 #include "../../util/dsymtable.hh"
    44 #include "../../util/dsymtable.hh"
    44 #include "../../absyntax/visitor.hh"
    45 #include "../../absyntax/visitor.hh"
    45 
    46 
   174 #include "search_base_type.cc"
   175 #include "search_base_type.cc"
   175 #include "search_var_instance_decl.cc"
   176 #include "search_var_instance_decl.cc"
   176 #include "decompose_var_instance_name.cc"
   177 #include "decompose_var_instance_name.cc"
   177 #include "search_varfb_instance_type.cc"
   178 #include "search_varfb_instance_type.cc"
   178 #include "search_constant_type.cc"
   179 #include "search_constant_type.cc"
       
   180 #include "search_expression_type.cc"
   179 
   181 
   180 #include "generate_cc_base.cc"
   182 #include "generate_cc_base.cc"
   181 #include "generate_cc_typedecl.cc"
   183 #include "generate_cc_typedecl.cc"
   182 #include "generate_cc_vardecl.cc"
   184 #include "generate_cc_vardecl.cc"
   183 #include "generate_cc_configbody.cc"
   185 #include "generate_cc_configbody.cc"
   521   /* function interface */
   523   /* function interface */
   522   s4o.print("void ");
   524   s4o.print("void ");
   523   symbol->fblock_name->accept(*this);
   525   symbol->fblock_name->accept(*this);
   524   s4o.print(FB_FUNCTION_SUFFIX);
   526   s4o.print(FB_FUNCTION_SUFFIX);
   525   s4o.print("(");
   527   s4o.print("(");
   526     /* first and only parameter is a pointer to the data */
   528   /* first and only parameter is a pointer to the data */
   527   symbol->fblock_name->accept(*this);
   529   symbol->fblock_name->accept(*this);
   528   s4o.print(" *");
   530   s4o.print(" *");
   529   s4o.print(FB_FUNCTION_PARAM);
   531   s4o.print(FB_FUNCTION_PARAM);
   530   s4o.print(") {\n");
   532   s4o.print(") {\n");
   531   s4o.indent_right();
   533   s4o.indent_right();
   547   s4o.print(s4o.indent_spaces + "} // ");
   549   s4o.print(s4o.indent_spaces + "} // ");
   548   symbol->fblock_name->accept(*this);
   550   symbol->fblock_name->accept(*this);
   549   s4o.print(FB_FUNCTION_SUFFIX);
   551   s4o.print(FB_FUNCTION_SUFFIX);
   550   s4o.print(s4o.indent_spaces + "() \n\n");
   552   s4o.print(s4o.indent_spaces + "() \n\n");
   551 
   553 
   552 
   554   s4o.indent_left();
   553 
   555   s4o.print("\n\n\n\n");
   554 
   556 
   555 
   557   return NULL;
   556 
   558 }
   557 
   559 
   558 #if 0
   560 
   559 
   561 /* The remaining temp_var_decls_c, temp_var_decls_list_c
   560 +++++++++++++++++++++++++++++++++++++
   562  * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
   561   s4o.print(s4o.indent_spaces + "class ");
   563  */
   562   symbol->fblock_name->accept(*this);
   564 
   563   s4o.print(" {\n");
   565 
   564   s4o.indent_right();
   566 /**********************/
   565 
   567 /* B 1.5.3 - Programs */
   566   /* (A.2) Public variables: i.e. the function parameters... */
   568 /**********************/
   567   s4o.print(s4o.indent_spaces + "public:\n");
   569 
   568   s4o.indent_right();
   570 
       
   571 
       
   572 public:
       
   573 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
       
   574 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
       
   575 void *visit(program_declaration_c *symbol) {
       
   576   generate_cc_vardecl_c *vardecl;
       
   577   TRACE("program_declaration_c");
       
   578 
       
   579   /* start off by adding this declaration to the global
       
   580    * program declaration symbol table...
       
   581    */
       
   582   program_type_symtable.insert(symbol->program_type_name, symbol);
       
   583 
       
   584   /* (A) Program data structure declaration... */
       
   585   /* (A.1) Data structure declaration */
       
   586   s4o.print("// PROGRAM ");
       
   587   symbol->program_type_name->accept(*this);
       
   588   s4o.print("\n// Data part\n");
       
   589   s4o.print("typedef struct {\n");
       
   590   s4o.indent_right();
       
   591 
       
   592   /* (A.2) Public variables: i.e. the program parameters... */
       
   593   s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n");
   569   vardecl = new generate_cc_vardecl_c(&s4o,
   594   vardecl = new generate_cc_vardecl_c(&s4o,
   570   				      generate_cc_vardecl_c::local_vf,
   595   				      generate_cc_vardecl_c::local_vf,
   571   				      generate_cc_vardecl_c::input_vt |
   596   				      generate_cc_vardecl_c::input_vt |
   572   				      generate_cc_vardecl_c::output_vt |
   597   				      generate_cc_vardecl_c::output_vt |
   573   				      generate_cc_vardecl_c::inoutput_vt);
   598   				      generate_cc_vardecl_c::inoutput_vt);
   574   vardecl->print(symbol->var_declarations);
   599   vardecl->print(symbol->var_declarations);
   575   delete vardecl;
   600   delete vardecl;
   576   s4o.indent_left();
       
   577   s4o.print("\n");
   601   s4o.print("\n");
   578 
       
   579   /* (A.3) Private internal variables */
   602   /* (A.3) Private internal variables */
   580   s4o.print(s4o.indent_spaces + "private:\n");
   603   s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   581   s4o.indent_right();
       
   582   vardecl = new generate_cc_vardecl_c(&s4o,
   604   vardecl = new generate_cc_vardecl_c(&s4o,
   583   				      generate_cc_vardecl_c::local_vf,
   605   				      generate_cc_vardecl_c::local_vf,
   584   				      generate_cc_vardecl_c::private_vt |
   606 				      generate_cc_vardecl_c::temp_vt |
   585   				      generate_cc_vardecl_c::located_vt);
       
   586   vardecl->print(symbol->var_declarations);
       
   587   delete vardecl;
       
   588   s4o.indent_left();
       
   589   s4o.print("\n");
       
   590 
       
   591 ---------------------------------
       
   592   /* (B) Constructor */
       
   593   s4o.print(s4o.indent_spaces + "public:\n");
       
   594   s4o.indent_right();
       
   595   s4o.print(s4o.indent_spaces);
       
   596   symbol->fblock_name->accept(*this);
       
   597   s4o.print("(void)\n");
       
   598   s4o.indent_right();
       
   599   s4o.print(s4o.indent_spaces);
       
   600   vardecl = new generate_cc_vardecl_c(&s4o,
       
   601   				      generate_cc_vardecl_c::constructorinit_vf,
       
   602   				      generate_cc_vardecl_c::input_vt |
       
   603   				      generate_cc_vardecl_c::output_vt |
       
   604   				      generate_cc_vardecl_c::inoutput_vt |
       
   605   				      generate_cc_vardecl_c::private_vt);
       
   606   vardecl->print(symbol->var_declarations);
       
   607   delete vardecl;
       
   608   s4o.print("\n" + s4o.indent_spaces + "{}\n\n");
       
   609   s4o.indent_left();
       
   610   s4o.indent_left();
       
   611 ---------------------------------
       
   612 
       
   613 
       
   614   /* (C) Public Function*/
       
   615   /* (C.1) Public Function declaration */
       
   616   s4o.print(s4o.indent_spaces + "public:\n");
       
   617   s4o.indent_right();
       
   618   s4o.print(s4o.indent_spaces + "void f(void) {\n");
       
   619 
       
   620   /* (C.2) Temporary variables */
       
   621   s4o.indent_right();
       
   622   vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
       
   623   vardecl->print(symbol->var_declarations);
       
   624   delete vardecl;
       
   625   s4o.indent_left();
       
   626   s4o.print("\n");
       
   627 
       
   628   /* (C.3) Public Function body */
       
   629   s4o.indent_right();
       
   630   this->current_scope = symbol;
       
   631   symbol->fblock_body->accept(*this);
       
   632   this->current_scope = NULL;
       
   633   s4o.indent_left();
       
   634   s4o.print(s4o.indent_spaces + "} /* f() */\n\n");
       
   635   s4o.indent_left();
       
   636 
       
   637   /* (D) Close the class declaration... */
       
   638   s4o.indent_left();
       
   639   s4o.print(s4o.indent_spaces + "}; /* class ");
       
   640   symbol->fblock_name->accept(*this);
       
   641   s4o.print(" */\n");
       
   642 
       
   643 ---------------------------------
       
   644   /* (E) Initialise the static member variables... */
       
   645   vardecl = new generate_cc_vardecl_c(&s4o,
       
   646   				      generate_cc_vardecl_c::globalinit_vf,
       
   647   				      generate_cc_vardecl_c::located_vt);
       
   648   vardecl->print(symbol->var_declarations, symbol->fblock_name);
       
   649   delete vardecl;
       
   650 
       
   651 #endif
       
   652 
       
   653   s4o.indent_left();
       
   654   s4o.print("\n\n\n\n");
       
   655 
       
   656   return NULL;
       
   657 }
       
   658 
       
   659 
       
   660 /* The remaining temp_var_decls_c, temp_var_decls_list_c
       
   661  * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
       
   662  */
       
   663 
       
   664 
       
   665 /**********************/
       
   666 /* B 1.5.3 - Programs */
       
   667 /**********************/
       
   668 
       
   669 
       
   670 
       
   671 public:
       
   672 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
       
   673 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
       
   674 void *visit(program_declaration_c *symbol) {
       
   675   generate_cc_vardecl_c *vardecl;
       
   676   TRACE("program_declaration_c");
       
   677 
       
   678   /* start off by adding this declaration to the global
       
   679    * program declaration symbol table...
       
   680    */
       
   681   program_type_symtable.insert(symbol->program_type_name, symbol);
       
   682 
       
   683   /* (A) Class (Function Block) declaration... */
       
   684   /* (A.1) Class (Function Block) name */
       
   685   s4o.print("// PROGRAM\n");
       
   686   s4o.print(s4o.indent_spaces);
       
   687   symbol->program_type_name->accept(*this);
       
   688   s4o.print("\n //Data part\n");
       
   689   s4o.print("typedef struct {\n");
       
   690   s4o.indent_right();
       
   691 
       
   692   /* (A.2) Public variables: i.e. the program parameters... */
       
   693   s4o.print(s4o.indent_spaces + "//PROGRAM interface IN OUT IN_OUT variables\n");
       
   694   s4o.indent_right();
       
   695   vardecl = new generate_cc_vardecl_c(&s4o,
       
   696   				      generate_cc_vardecl_c::local_vf,
       
   697   				      generate_cc_vardecl_c::input_vt |
       
   698   				      generate_cc_vardecl_c::output_vt |
       
   699   				      generate_cc_vardecl_c::inoutput_vt);
       
   700   vardecl->print(symbol->var_declarations);
       
   701   delete vardecl;
       
   702   s4o.indent_left();
       
   703   s4o.print("\n");
       
   704 
       
   705   /* (A.3) Private internal variables */
       
   706   s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
       
   707   s4o.indent_right();
       
   708   vardecl = new generate_cc_vardecl_c(&s4o,
       
   709   				      generate_cc_vardecl_c::local_vf,
       
   710   				      generate_cc_vardecl_c::private_vt |
   607   				      generate_cc_vardecl_c::private_vt |
   711   				      generate_cc_vardecl_c::located_vt |
   608   				      generate_cc_vardecl_c::located_vt |
   712 				      generate_cc_vardecl_c::external_vt);
   609   				      generate_cc_vardecl_c::external_vt);
   713   vardecl->print(symbol->var_declarations);
   610   vardecl->print(symbol->var_declarations);
   714   delete vardecl;
   611   delete vardecl;
   715   s4o.print("\n ");
   612   s4o.print("\n");
       
   613 
       
   614   /* (A.4) Program data structure type name. */
   716   s4o.indent_left();
   615   s4o.indent_left();
   717   s4o.print("} ");
   616   s4o.print("} ");
   718   symbol->program_type_name->accept(*this);
   617   symbol->program_type_name->accept(*this);
   719   s4o.print(";\n\n ");
   618   s4o.print(";\n\n");
   720   /* (B) Constructor */
   619 
   721   /* (B.1) Constructor name... */
   620   /* (B) Function with PROGRAM body */
   722   s4o.print("// Code part");
   621   /* (B.1) Function declaration */
   723   /*PROGRAM Interface*/
   622   s4o.print("// Code part\n");
   724   s4o.indent_right();
   623   /* function interface */
   725   s4o.print(s4o.indent_spaces);
       
   726   s4o.print("void ");
   624   s4o.print("void ");
   727   symbol->program_type_name->accept(*this);
   625   symbol->program_type_name->accept(*this);
   728   s4o.print(FB_FUNCTION_SUFFIX);
   626   s4o.print(FB_FUNCTION_SUFFIX);
   729   /* (B.2) Constructor parameters (i.e. the external variables)... */
       
   730   s4o.print("(");
   627   s4o.print("(");
       
   628   /* first and only parameter is a pointer to the data */
   731   symbol->program_type_name->accept(*this);
   629   symbol->program_type_name->accept(*this);
   732   s4o.indent_right();
   630   s4o.print(" *");
   733   s4o.print(" ");
   631   s4o.print(FB_FUNCTION_PARAM);
       
   632   s4o.print(") {\n");
       
   633   s4o.indent_right();
       
   634 
       
   635   /* (B.2) Initialize TEMP variables */
       
   636   /* function body */
       
   637   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   734   vardecl = new generate_cc_vardecl_c(&s4o,
   638   vardecl = new generate_cc_vardecl_c(&s4o,
   735   				      generate_cc_vardecl_c::finterface_vf,
   639   				      generate_cc_vardecl_c::init_vf,
   736   				      generate_cc_vardecl_c::external_vt);
   640 				      generate_cc_vardecl_c::temp_vt);
   737   vardecl->print(symbol->var_declarations);
   641   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   738   delete vardecl;
   642   delete vardecl;
   739   s4o.print(")");
       
   740   s4o.print("{\n");
       
   741   s4o.indent_left();
       
   742 
       
   743   /* (B.2) Member initializations... */
       
   744   s4o.indent_right();
       
   745   s4o.print(s4o.indent_spaces + "//Initialise PROGRAM variables\n");
       
   746   vardecl = new generate_cc_vardecl_c(&s4o,
       
   747   				      generate_cc_vardecl_c::constructorinit_vf,
       
   748   				      generate_cc_vardecl_c::input_vt |
       
   749   				      generate_cc_vardecl_c::output_vt |
       
   750   				      generate_cc_vardecl_c::inoutput_vt |
       
   751   				      generate_cc_vardecl_c::private_vt |
       
   752 				      generate_cc_vardecl_c::external_vt);
       
   753   vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
       
   754   delete vardecl;
       
   755   s4o.print("\n" + s4o.indent_spaces);
       
   756   s4o.indent_left();
       
   757   s4o.indent_left();
       
   758 
       
   759   /* (C) Public Function*/
       
   760   /* (C.1) Public Function declaration */
       
   761   s4o.print(s4o.indent_spaces);
       
   762   //s4o.indent_right();
       
   763   //s4o.print(s4o.indent_spaces + "void f(void) {\n");
       
   764 
       
   765   /* (C.2) Temporary variables */
       
   766   //s4o.indent_right();
       
   767   //vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
       
   768   //vardecl->print(symbol->var_declarations);
       
   769   //delete vardecl;
       
   770   //s4o.indent_left();
       
   771   s4o.print("\n");
   643   s4o.print("\n");
   772 
   644 
   773   /* (C.3) Public Function body */
   645   /* (B.3) Function code */
   774   s4o.indent_right();
       
   775   generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   646   generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   776   symbol->function_block_body->accept(generate_cc_code);
   647   symbol->function_block_body->accept(generate_cc_code);
   777   s4o.indent_left();
   648   s4o.indent_left();
   778   s4o.print(s4o.indent_spaces + "} //");
   649   s4o.print(s4o.indent_spaces + "} // ");
   779   symbol->program_type_name->accept(*this);
   650   symbol->program_type_name->accept(*this);
   780   s4o.print(FB_FUNCTION_SUFFIX);
   651   s4o.print(FB_FUNCTION_SUFFIX);
   781   s4o.print("()\n");
   652   s4o.print(s4o.indent_spaces + "() \n\n");
   782   s4o.indent_left();
   653 
   783 
   654   s4o.indent_left();
   784   /* (D) Close the class declaration... */
       
   785   s4o.indent_left();
       
   786   s4o.print(s4o.indent_spaces + "}; /* void ");
       
   787   symbol->program_type_name->accept(*this);
       
   788   s4o.print(" */\n\n\n");
       
   789 
       
   790   /* (E) Initialise the static member variables... */
       
   791   vardecl = new generate_cc_vardecl_c(&s4o,
       
   792   				      generate_cc_vardecl_c::globalinit_vf,
       
   793   				      generate_cc_vardecl_c::located_vt);
       
   794   vardecl->print(symbol->var_declarations, symbol->program_type_name);
       
   795   delete vardecl;
       
   796   s4o.print("\n\n\n\n");
   655   s4o.print("\n\n\n\n");
   797 
   656 
   798   return NULL;
   657   return NULL;
   799 }
   658 }
   800 
   659