stage4/generate_c/generate_c.cc
changeset 377 60b012b7793f
parent 355 30db860bd3bd
child 381 2fd934b91ffd
equal deleted inserted replaced
376:7dcbd8418771 377:60b012b7793f
    25 #include <string>
    25 #include <string>
    26 #include <iostream>
    26 #include <iostream>
    27 #include <sstream>
    27 #include <sstream>
    28 #include <typeinfo>
    28 #include <typeinfo>
    29 #include <list>
    29 #include <list>
       
    30 #include <map>
       
    31 #include <sstream>
    30 #include <strings.h>
    32 #include <strings.h>
    31 
    33 
    32 #include "../../util/symtable.hh"
    34 #include "../../util/symtable.hh"
    33 #include "../../util/dsymtable.hh"
    35 #include "../../util/dsymtable.hh"
    34 #include "../../absyntax/visitor.hh"
    36 #include "../../absyntax/visitor.hh"
   109 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   111 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   110 #define INIT_EXTERNAL "__INIT_EXTERNAL"
   112 #define INIT_EXTERNAL "__INIT_EXTERNAL"
   111 #define INIT_LOCATED "__INIT_LOCATED"
   113 #define INIT_LOCATED "__INIT_LOCATED"
   112 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   114 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   113 
   115 
   114 
       
   115 /* Variable getter symbol for accessor macros */
   116 /* Variable getter symbol for accessor macros */
   116 #define GET_VAR "__GET_VAR"
   117 #define GET_VAR "__GET_VAR"
   117 #define GET_EXTERNAL "__GET_EXTERNAL"
   118 #define GET_EXTERNAL "__GET_EXTERNAL"
   118 #define GET_LOCATED "__GET_LOCATED"
   119 #define GET_LOCATED "__GET_LOCATED"
   119 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   120 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   568 void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) {
   569 void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) {
   569   generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix);
   570   generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix);
   570   generate_c_st.generate(symbol);
   571   generate_c_st.generate(symbol);
   571   return NULL;
   572   return NULL;
   572 }
   573 }
       
   574 
       
   575 
       
   576 
       
   577 
       
   578 /***********************************************************************/
       
   579 /***********************************************************************/
       
   580 /***********************************************************************/
       
   581 /***********************************************************************/
       
   582 /***********************************************************************/
       
   583 
       
   584 
       
   585 class generate_c_datatypes_c: public generate_c_typedecl_c {
       
   586   public:
       
   587     typedef enum {
       
   588       none_im,
       
   589       arrayname_im,
       
   590       arraydeclaration_im,
       
   591     } inlinearray_mode_t;
       
   592 
       
   593   private:
       
   594     stage4out_c *s4o_ptr;
       
   595     std::map<std::string, int> inline_array_defined;
       
   596     std::string current_array_name;
       
   597     inlinearray_mode_t current_mode;
       
   598 
       
   599   public:
       
   600     generate_c_datatypes_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr)
       
   601       : generate_c_typedecl_c(s4o_ptr, s4o_incl_ptr) {
       
   602       generate_c_datatypes_c::s4o_ptr = s4o_ptr;
       
   603       current_mode = none_im;
       
   604     };
       
   605     virtual ~generate_c_datatypes_c(void) {
       
   606       while (!inline_array_defined.empty()) {
       
   607     	inline_array_defined.erase(inline_array_defined.begin());
       
   608       }
       
   609     }
       
   610 
       
   611     /*************************/
       
   612     /* B.1 - Common elements */
       
   613     /*************************/
       
   614     /*******************************************/
       
   615     /* B 1.1 - Letters, digits and identifiers */
       
   616     /*******************************************/
       
   617     void *visit(identifier_c *symbol) {
       
   618       switch (current_mode) {
       
   619         case arrayname_im:
       
   620           current_array_name += symbol->value;
       
   621           break;
       
   622         case arraydeclaration_im:
       
   623           s4o_incl.print(symbol->value);
       
   624           break;
       
   625         default:
       
   626           return generate_c_base_c::visit(symbol);
       
   627           break;
       
   628       }
       
   629       return NULL;
       
   630     }
       
   631 
       
   632     /**********************/
       
   633     /* B.1.3 - Data types */
       
   634     /**********************/
       
   635     /***********************************/
       
   636     /* B 1.3.1 - Elementary Data Types */
       
   637     /***********************************/
       
   638 
       
   639     #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\
       
   640     void *visit(datatype_symbol *symbol) {\
       
   641 	  switch (current_mode) {\
       
   642 		case arrayname_im:\
       
   643 		  current_array_name += datatype_name;\
       
   644 		  break;\
       
   645         case arraydeclaration_im:\
       
   646           s4o_incl.print(datatype_name);\
       
   647           break;\
       
   648 		default:\
       
   649 		  return generate_c_base_c::visit(symbol);\
       
   650 		  break;\
       
   651 	  }\
       
   652 	  return NULL;\
       
   653 	}
       
   654 
       
   655     HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME")
       
   656     HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL")
       
   657     HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT")
       
   658     HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT")
       
   659     HANDLE_ELEMENTARY_DATA_TYPE(dint_type_name_c, "DINT")
       
   660     HANDLE_ELEMENTARY_DATA_TYPE(lint_type_name_c, "LINT")
       
   661     HANDLE_ELEMENTARY_DATA_TYPE(usint_type_name_c, "USINT")
       
   662     HANDLE_ELEMENTARY_DATA_TYPE(uint_type_name_c, "UINT")
       
   663     HANDLE_ELEMENTARY_DATA_TYPE(udint_type_name_c, "UDINT")
       
   664     HANDLE_ELEMENTARY_DATA_TYPE(ulint_type_name_c, "ULINT")
       
   665     HANDLE_ELEMENTARY_DATA_TYPE(real_type_name_c, "REAL")
       
   666     HANDLE_ELEMENTARY_DATA_TYPE(lreal_type_name_c, "LREAL")
       
   667     HANDLE_ELEMENTARY_DATA_TYPE(date_type_name_c, "DATE")
       
   668     HANDLE_ELEMENTARY_DATA_TYPE(tod_type_name_c, "TOD")
       
   669     HANDLE_ELEMENTARY_DATA_TYPE(dt_type_name_c, "DT")
       
   670     HANDLE_ELEMENTARY_DATA_TYPE(byte_type_name_c, "BYTE")
       
   671     HANDLE_ELEMENTARY_DATA_TYPE(word_type_name_c, "WORD")
       
   672     HANDLE_ELEMENTARY_DATA_TYPE(dword_type_name_c, "DWORD")
       
   673     HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD")
       
   674     HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING")
       
   675     HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING")
       
   676 
       
   677     HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME")
       
   678 	HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL")
       
   679 	HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT")
       
   680 	HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT")
       
   681 	HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT")
       
   682 	HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT")
       
   683 	HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT")
       
   684 	HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT")
       
   685 	HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT")
       
   686 	HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT")
       
   687 	HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL")
       
   688 	HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL")
       
   689 	HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE")
       
   690 	HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD")
       
   691 	HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT")
       
   692 	HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE")
       
   693 	HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD")
       
   694 	HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
       
   695 	HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
       
   696 	HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
       
   697 	HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
       
   698 
       
   699     /******************************************/
       
   700     /* B 1.4.3 - Declaration & Initialization */
       
   701     /******************************************/
       
   702 
       
   703     void *visit(input_declarations_c *symbol) {
       
   704       symbol->input_declaration_list->accept(*this);
       
   705       return NULL;
       
   706     }
       
   707 
       
   708     void *visit(edge_declaration_c *symbol) {
       
   709       return NULL;
       
   710     }
       
   711 
       
   712     void *visit(en_param_declaration_c *symbol) {
       
   713       return NULL;
       
   714     }
       
   715 
       
   716     void *visit(eno_param_declaration_c *symbol) {
       
   717       return NULL;
       
   718     }
       
   719 
       
   720     void *visit(var1_init_decl_c *symbol) {
       
   721       return NULL;
       
   722     }
       
   723 
       
   724     /*  var1_list ':' array_spec_init */
       
   725     // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
       
   726     void *visit(array_var_init_decl_c *symbol) {
       
   727       current_mode = arrayname_im;
       
   728       symbol->array_spec_init->accept(*this);
       
   729       current_mode = none_im;
       
   730       return NULL;
       
   731     }
       
   732 
       
   733     /* array_specification [ASSIGN array_initialization] */
       
   734     /* array_initialization may be NULL ! */
       
   735     void *visit(array_spec_init_c *symbol) {
       
   736       switch (current_mode) {
       
   737     	case arrayname_im:
       
   738     	  {
       
   739     	    array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
       
   740             if (specification != NULL)
       
   741               symbol->array_specification->accept(*this);
       
   742           }
       
   743           break;
       
   744     	default:
       
   745     	  return generate_c_typedecl_c::visit(symbol);
       
   746           break;
       
   747       }
       
   748       return NULL;
       
   749     }
       
   750 
       
   751     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
       
   752     void *visit(array_specification_c *symbol) {
       
   753       switch (current_mode) {
       
   754         case arrayname_im:
       
   755           {
       
   756             std::map<std::string,int>::iterator definition;
       
   757             current_array_name = "__";
       
   758             symbol->non_generic_type_name->accept(*this);
       
   759             symbol->array_subrange_list->accept(*this);
       
   760 
       
   761             definition = inline_array_defined.find(current_array_name);
       
   762             if (definition == inline_array_defined.end()) {
       
   763               current_mode = arraydeclaration_im;
       
   764 
       
   765               s4o_incl.print("__DECLARE_ARRAY_TYPE(");
       
   766               s4o_incl.print(current_array_name);
       
   767               s4o_incl.print(",");
       
   768               symbol->non_generic_type_name->accept(*this);
       
   769               s4o_incl.print(",");
       
   770               symbol->array_subrange_list->accept(*this);
       
   771               s4o_incl.print(")\n\n");
       
   772 
       
   773               inline_array_defined[current_array_name] = 0;
       
   774             }
       
   775           }
       
   776           break;
       
   777         default:
       
   778           return generate_c_typedecl_c::visit(symbol);
       
   779           break;
       
   780       }
       
   781       return NULL;
       
   782     }
       
   783 
       
   784     /*  signed_integer DOTDOT signed_integer */
       
   785     //SYM_REF2(subrange_c, lower_limit, upper_limit)
       
   786     void *visit(subrange_c *symbol) {
       
   787       int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
       
   788       switch (current_mode) {
       
   789         case arrayname_im:
       
   790           current_array_name += "_";
       
   791           {
       
   792             std::stringstream ss;
       
   793             ss << dimension;
       
   794             current_array_name += ss.str();
       
   795           }
       
   796           break;
       
   797         case arraydeclaration_im:
       
   798           s4o_incl.print("[");
       
   799           s4o_incl.print_integer(dimension);
       
   800           s4o_incl.print("]");
       
   801         default:
       
   802           generate_c_typedecl_c::visit(symbol);
       
   803           break;
       
   804       }
       
   805       return NULL;
       
   806     }
       
   807 
       
   808     /*  var1_list ':' initialized_structure */
       
   809     // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
       
   810     void *visit(structured_var_init_decl_c *symbol) {
       
   811       return NULL;
       
   812     }
       
   813 
       
   814     /* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */
       
   815     /* structure_initialization -> may be NULL ! */
       
   816     void *visit(fb_name_decl_c *symbol) {
       
   817       return NULL;
       
   818     }
       
   819 
       
   820     /* VAR_OUTPUT [RETAIN | NON_RETAIN] var_init_decl_list END_VAR */
       
   821     /* option -> may be NULL ! */
       
   822     void *visit(output_declarations_c *symbol) {
       
   823       symbol->var_init_decl_list->accept(*this);
       
   824       return NULL;
       
   825     }
       
   826 
       
   827     /*  VAR_IN_OUT var_declaration_list END_VAR */
       
   828     void *visit(input_output_declarations_c *symbol) {
       
   829       symbol->var_declaration_list->accept(*this);
       
   830       return NULL;
       
   831     }
       
   832 
       
   833     /*  var1_list ':' array_specification */
       
   834     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
       
   835     void *visit(array_var_declaration_c *symbol) {
       
   836       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
       
   837 	  if (specification != NULL) {
       
   838         current_mode = arrayname_im;
       
   839         symbol->array_specification->accept(*this);
       
   840         current_mode = none_im;
       
   841       }
       
   842       return NULL;
       
   843     }
       
   844 
       
   845     /* VAR [CONSTANT] var_init_decl_list END_VAR */
       
   846     /* option -> may be NULL ! */
       
   847     /* helper symbol for input_declarations */
       
   848     void *visit(var_declarations_c *symbol) {
       
   849       symbol->var_init_decl_list->accept(*this);
       
   850       return NULL;
       
   851     }
       
   852 
       
   853     /*  VAR RETAIN var_init_decl_list END_VAR */
       
   854     void *visit(retentive_var_declarations_c *symbol) {
       
   855       symbol->var_init_decl_list->accept(*this);
       
   856       return NULL;
       
   857     }
       
   858 
       
   859     /*  VAR [CONSTANT|RETAIN|NON_RETAIN] located_var_decl_list END_VAR */
       
   860     /* option -> may be NULL ! */
       
   861     //SYM_REF2(located_var_declarations_c, option, located_var_decl_list)
       
   862     void *visit(located_var_declarations_c *symbol) {
       
   863       symbol->located_var_decl_list->accept(*this);
       
   864       return NULL;
       
   865     }
       
   866 
       
   867     /*  [variable_name] location ':' located_var_spec_init */
       
   868     /* variable_name -> may be NULL ! */
       
   869     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
       
   870     void *visit(located_var_decl_c *symbol) {
       
   871       symbol->located_var_spec_init->accept(*this);
       
   872       return NULL;
       
   873     }
       
   874 
       
   875     /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
       
   876     /* option -> may be NULL ! */
       
   877     //SYM_REF2(external_var_declarations_c, option, external_declaration_list)
       
   878     void *visit(external_var_declarations_c *symbol) {
       
   879       symbol->external_declaration_list->accept(*this);
       
   880       return NULL;
       
   881     }
       
   882 
       
   883     /*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
       
   884     //SYM_REF2(external_declaration_c, global_var_name, specification)
       
   885     void *visit(external_declaration_c *symbol) {
       
   886       array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification);
       
   887       if (array_specification != NULL) {
       
   888         current_mode = arrayname_im;
       
   889         symbol->specification->accept(*this);
       
   890         current_mode = none_im;
       
   891       }
       
   892       return NULL;
       
   893     }
       
   894 
       
   895     /*| VAR_GLOBAL [CONSTANT|RETAIN] global_var_decl_list END_VAR */
       
   896     /* option -> may be NULL ! */
       
   897     // SYM_REF2(global_var_declarations_c, option, global_var_decl_list)
       
   898     void *visit(global_var_declarations_c *symbol) {
       
   899       symbol->global_var_decl_list->accept(*this);
       
   900       return NULL;
       
   901     }
       
   902 
       
   903     /*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */
       
   904     /* type_specification ->may be NULL ! */
       
   905     // SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
       
   906     void *visit(global_var_decl_c *symbol) {
       
   907       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification);
       
   908       if (array_spec_init != NULL) {
       
   909         current_mode = arrayname_im;
       
   910         symbol->type_specification->accept(*this);
       
   911         current_mode = none_im;
       
   912       }
       
   913       return NULL;
       
   914     }
       
   915 
       
   916     void *visit(function_var_decls_c *symbol) {
       
   917       symbol->decl_list->accept(*this);
       
   918       return NULL;
       
   919     }
       
   920 
       
   921     /*****************************/
       
   922     /* B 1.5.2 - Function Blocks */
       
   923     /*****************************/
       
   924 
       
   925     /*  VAR_TEMP temp_var_decl_list END_VAR */
       
   926     void *visit(temp_var_decls_c *symbol) {
       
   927       symbol->var_decl_list->accept(*this);
       
   928       return NULL;
       
   929     }
       
   930 
       
   931     /*  VAR NON_RETAIN var_init_decl_list END_VAR */
       
   932     void *visit(non_retentive_var_decls_c *symbol) {
       
   933       symbol->var_decl_list->accept(*this);
       
   934       return NULL;
       
   935     }
       
   936 
       
   937 };
   573 
   938 
   574 
   939 
   575 
   940 
   576 
   941 
   577 /***********************************************************************/
   942 /***********************************************************************/
   770           generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
  1135           generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
   771           structure_initialization->init_structure_default(symbol->type_name);
  1136           structure_initialization->init_structure_default(symbol->type_name);
   772           structure_initialization->init_structure_values(default_value);
  1137           structure_initialization->init_structure_values(default_value);
   773           delete structure_initialization;
  1138           delete structure_initialization;
   774         }
  1139         }
   775     	break;
  1140         break;
   776       case initialization_analyzer_c::array_it:
  1141       case initialization_analyzer_c::array_it:
   777         {
  1142         {
   778     	  generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
  1143           generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
   779     	  array_initialization->init_array_size(symbol->type_name);
  1144           array_initialization->init_array_size(symbol->type_name);
   780     	  array_initialization->init_array_values(default_value);
  1145           array_initialization->init_array_values(default_value);
   781     	  delete array_initialization;
  1146           delete array_initialization;
   782         }
  1147         }
   783     	break;
  1148         break;
   784       default:
  1149       default:
   785         default_value->accept(*this);
  1150         default_value->accept(*this);
   786         break;
  1151         break;
   787     }
  1152     }
   788   }
  1153   }
  1193     public:
  1558     public:
  1194     generate_c_config_c(stage4out_c *s4o_ptr)
  1559     generate_c_config_c(stage4out_c *s4o_ptr)
  1195       : generate_c_typedecl_c(s4o_ptr) {
  1560       : generate_c_typedecl_c(s4o_ptr) {
  1196       generate_c_config_c::s4o_ptr = s4o_ptr;
  1561       generate_c_config_c::s4o_ptr = s4o_ptr;
  1197     };
  1562     };
  1198 	
  1563 
  1199     virtual ~generate_c_config_c(void) {}
  1564     virtual ~generate_c_config_c(void) {}
  1200 
  1565 
  1201     typedef enum {
  1566     typedef enum {
  1202       initprotos_dt,
  1567       initprotos_dt,
  1203       initdeclare_dt,
  1568       initdeclare_dt,
  1238   s4o.print("/*     FILE GENERATED BY iec2c             */\n");
  1603   s4o.print("/*     FILE GENERATED BY iec2c             */\n");
  1239   s4o.print("/* Editing this file is not recommended... */\n");
  1604   s4o.print("/* Editing this file is not recommended... */\n");
  1240   s4o.print("/*******************************************/\n\n");
  1605   s4o.print("/*******************************************/\n\n");
  1241   s4o.print("#include \"iec_std_lib.h\"\n\n");
  1606   s4o.print("#include \"iec_std_lib.h\"\n\n");
  1242   s4o.print("#include \"accessor.h\"\n\n"); 
  1607   s4o.print("#include \"accessor.h\"\n\n"); 
       
  1608   s4o.print("#include \"POUS.h\"\n\n");
  1243 
  1609 
  1244   /* (A) configuration declaration... */
  1610   /* (A) configuration declaration... */
  1245   /* (A.1) configuration name in comment */
  1611   /* (A.1) configuration name in comment */
  1246   s4o.print("// CONFIGURATION ");
  1612   s4o.print("// CONFIGURATION ");
  1247   symbol->configuration_name->accept(*this);
  1613   symbol->configuration_name->accept(*this);
  1433 
  1799 
  1434     /* variable used to store the qualifier of program currently being processed... */
  1800     /* variable used to store the qualifier of program currently being processed... */
  1435     unsigned int current_varqualifier;
  1801     unsigned int current_varqualifier;
  1436 
  1802 
  1437     void *print_retain(void) {
  1803     void *print_retain(void) {
  1438 	  s4o.print(",");
  1804       s4o.print(",");
  1439       switch (current_varqualifier) {
  1805       switch (current_varqualifier) {
  1440 		case retain_vq:
  1806         case retain_vq:
  1441           s4o.print("1");
  1807           s4o.print("1");
  1442           break;
  1808           break;
  1443         case non_retain_vq:
  1809         case non_retain_vq:
  1444           s4o.print("0");
  1810           s4o.print("0");
  1445           break;
  1811           break;
  1446 		default:
  1812         default:
  1447 		  s4o.print("retain");
  1813           s4o.print("retain");
  1448 		  break;
  1814           break;
  1449       }
  1815       }
  1450       return NULL;
  1816       return NULL;
  1451     }
  1817     }
  1452 
  1818 
  1453 
  1819 
  1629           symbol->program_name->accept(*this);
  1995           symbol->program_name->accept(*this);
  1630           s4o.print("\n");
  1996           s4o.print("\n");
  1631           break;
  1997           break;
  1632         case init_dt:
  1998         case init_dt:
  1633           if (symbol->retain_option != NULL)
  1999           if (symbol->retain_option != NULL)
  1634         	symbol->retain_option->accept(*this);
  2000             symbol->retain_option->accept(*this);
  1635           s4o.print(s4o.indent_spaces);
  2001           s4o.print(s4o.indent_spaces);
  1636           symbol->program_type_name->accept(*this);
  2002           symbol->program_type_name->accept(*this);
  1637           s4o.print(FB_INIT_SUFFIX);
  2003           s4o.print(FB_INIT_SUFFIX);
  1638           s4o.print("(&");
  2004           s4o.print("(&");
  1639           symbol->program_name->accept(*this);
  2005           symbol->program_name->accept(*this);
  1874 /***********************************************************************/
  2240 /***********************************************************************/
  1875 /***********************************************************************/
  2241 /***********************************************************************/
  1876 /***********************************************************************/
  2242 /***********************************************************************/
  1877 
  2243 
  1878 class generate_c_c: public iterator_visitor_c {
  2244 class generate_c_c: public iterator_visitor_c {
       
  2245   public:
       
  2246     typedef enum {
       
  2247       none_gm,
       
  2248       datatypes_gm,
       
  2249       pous_gm,
       
  2250     } generate_mode_t;
       
  2251 
  1879   protected:
  2252   protected:
  1880     stage4out_c &s4o;
  2253     stage4out_c &s4o;
  1881     stage4out_c pous_s4o;
  2254     stage4out_c pous_s4o;
  1882     stage4out_c pous_incl_s4o;
  2255     stage4out_c pous_incl_s4o;
  1883     stage4out_c located_variables_s4o;
  2256     stage4out_c located_variables_s4o;
  1884     stage4out_c variables_s4o;
  2257     stage4out_c variables_s4o;
       
  2258     generate_c_datatypes_c generate_c_datatypes;
  1885     generate_c_pous_c generate_c_pous;
  2259     generate_c_pous_c generate_c_pous;
  1886     
  2260     
  1887     symbol_c *current_configuration;
  2261     symbol_c *current_configuration;
  1888 
  2262 
  1889     const char *current_name;
  2263     const char *current_name;
  1890     const char *current_builddir;
  2264     const char *current_builddir;
  1891 
  2265 
  1892     unsigned long long common_ticktime;
  2266     unsigned long long common_ticktime;
       
  2267 
       
  2268     generate_mode_t current_mode;
  1893 
  2269 
  1894   public:
  2270   public:
  1895     generate_c_c(stage4out_c *s4o_ptr, const char *builddir): 
  2271     generate_c_c(stage4out_c *s4o_ptr, const char *builddir): 
  1896             s4o(*s4o_ptr),
  2272             s4o(*s4o_ptr),
  1897             pous_s4o(builddir, "POUS", "c"),
  2273             pous_s4o(builddir, "POUS", "c"),
  1898             pous_incl_s4o(builddir, "POUS", "h"),
  2274             pous_incl_s4o(builddir, "POUS", "h"),
  1899             located_variables_s4o(builddir, "LOCATED_VARIABLES","h"),
  2275             located_variables_s4o(builddir, "LOCATED_VARIABLES","h"),
  1900             variables_s4o(builddir, "VARIABLES","csv"),
  2276             variables_s4o(builddir, "VARIABLES","csv"),
       
  2277             generate_c_datatypes(&pous_s4o, &pous_incl_s4o),
  1901             generate_c_pous(&pous_s4o, &pous_incl_s4o) {
  2278             generate_c_pous(&pous_s4o, &pous_incl_s4o) {
  1902       current_builddir = builddir;
  2279       current_builddir = builddir;
  1903       current_configuration = NULL;
  2280       current_configuration = NULL;
       
  2281       current_mode = none_gm;
  1904     }
  2282     }
  1905             
  2283             
  1906     ~generate_c_c(void) {}
  2284     ~generate_c_c(void) {}
  1907 
  2285 
  1908 
  2286 
  1932 /***************************/
  2310 /***************************/
  1933 /* B 0 - Programming Model */
  2311 /* B 0 - Programming Model */
  1934 /***************************/
  2312 /***************************/
  1935     void *visit(library_c *symbol) {
  2313     void *visit(library_c *symbol) {
  1936       pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n#include \"accessor.h\"\n\n");
  2314       pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n#include \"accessor.h\"\n\n");
       
  2315 
       
  2316       current_mode = datatypes_gm;
  1937       for(int i = 0; i < symbol->n; i++) {
  2317       for(int i = 0; i < symbol->n; i++) {
  1938         symbol->elements[i]->accept(*this);
  2318         symbol->elements[i]->accept(*this);
  1939       }
  2319       }
       
  2320 
       
  2321       current_mode = pous_gm;
       
  2322       for(int i = 0; i < symbol->n; i++) {
       
  2323         symbol->elements[i]->accept(*this);
       
  2324       }
       
  2325 
  1940       pous_incl_s4o.print("#endif //__POUS_H\n");
  2326       pous_incl_s4o.print("#endif //__POUS_H\n");
  1941       
  2327       
  1942       generate_var_list_c generate_var_list(&variables_s4o, symbol);
  2328       generate_var_list_c generate_var_list(&variables_s4o, symbol);
  1943       generate_var_list.generate_programs(symbol);
  2329       generate_var_list.generate_programs(symbol);
  1944       generate_var_list.generate_variables(symbol);
  2330       generate_var_list.generate_variables(symbol);
  1953 /*************************/
  2339 /*************************/
  1954 /*******************************************/
  2340 /*******************************************/
  1955 /* B 1.1 - Letters, digits and identifiers */
  2341 /* B 1.1 - Letters, digits and identifiers */
  1956 /*******************************************/
  2342 /*******************************************/
  1957     void *visit(identifier_c *symbol) {
  2343     void *visit(identifier_c *symbol) {
  1958     	current_name = symbol->value;
  2344         current_name = symbol->value;
  1959     	return NULL;
  2345         return NULL;
  1960     }
  2346     }
  1961 
  2347 
  1962 /********************************/
  2348 /********************************/
  1963 /* B 1.3.3 - Derived data types */
  2349 /* B 1.3.3 - Derived data types */
  1964 /********************************/
  2350 /********************************/
  1965     /*  TYPE type_declaration_list END_TYPE */
  2351     /*  TYPE type_declaration_list END_TYPE */
  1966     void *visit(data_type_declaration_c *symbol) {
  2352     void *visit(data_type_declaration_c *symbol) {
  1967       symbol->accept(generate_c_pous);
  2353       switch (current_mode) {
       
  2354         case datatypes_gm:
       
  2355           symbol->accept(generate_c_datatypes);
       
  2356           break;
       
  2357         default:
       
  2358           break;
       
  2359       }
  1968       return NULL;
  2360       return NULL;
  1969     }
  2361     }
  1970 
  2362 
  1971 /**************************************/
  2363 /**************************************/
  1972 /* B.1.5 - Program organization units */
  2364 /* B.1.5 - Program organization units */
  1973 /**************************************/
  2365 /**************************************/
  1974 /***********************/
  2366 /***********************/
  1975 /* B 1.5.1 - Functions */
  2367 /* B 1.5.1 - Functions */
  1976 /***********************/
  2368 /***********************/
  1977     void *visit(function_declaration_c *symbol) {
  2369     void *visit(function_declaration_c *symbol) {
  1978     	symbol->accept(generate_c_pous);
  2370       switch (current_mode) {
  1979     	return NULL;
  2371         case datatypes_gm:
       
  2372           symbol->var_declarations_list->accept(generate_c_datatypes);
       
  2373           break;
       
  2374         case pous_gm:
       
  2375           symbol->accept(generate_c_pous);
       
  2376           break;
       
  2377         default:
       
  2378           break;
       
  2379       }
       
  2380       return NULL;
  1980     }
  2381     }
  1981     
  2382     
  1982 /*****************************/
  2383 /*****************************/
  1983 /* B 1.5.2 - Function Blocks */
  2384 /* B 1.5.2 - Function Blocks */
  1984 /*****************************/
  2385 /*****************************/
  1985     void *visit(function_block_declaration_c *symbol) {
  2386     void *visit(function_block_declaration_c *symbol) {
  1986     	symbol->accept(generate_c_pous);
  2387         switch (current_mode) {
  1987     	return NULL;
  2388           case datatypes_gm:
       
  2389             symbol->var_declarations->accept(generate_c_datatypes);
       
  2390             break;
       
  2391           case pous_gm:
       
  2392             symbol->accept(generate_c_pous);
       
  2393             break;
       
  2394           default:
       
  2395             break;
       
  2396         }
       
  2397         return NULL;
  1988     }
  2398     }
  1989     
  2399     
  1990 /**********************/
  2400 /**********************/
  1991 /* B 1.5.3 - Programs */
  2401 /* B 1.5.3 - Programs */
  1992 /**********************/    
  2402 /**********************/    
  1993     void *visit(program_declaration_c *symbol) {
  2403     void *visit(program_declaration_c *symbol) {
  1994     	symbol->accept(generate_c_pous);
  2404         switch (current_mode) {
  1995     	return NULL;
  2405           case datatypes_gm:
       
  2406             symbol->var_declarations->accept(generate_c_datatypes);
       
  2407             break;
       
  2408           case pous_gm:
       
  2409             symbol->accept(generate_c_pous);
       
  2410             break;
       
  2411           default:
       
  2412             break;
       
  2413         }
       
  2414         return NULL;
  1996     }
  2415     }
  1997     
  2416     
  1998 
  2417 
  1999 /********************************/
  2418 /********************************/
  2000 /* B 1.7 Configuration elements */
  2419 /* B 1.7 Configuration elements */
  2001 /********************************/
  2420 /********************************/
  2002     void *visit(configuration_declaration_c *symbol) {
  2421     void *visit(configuration_declaration_c *symbol) {
  2003   	  static int configuration_count = 0;
  2422       switch (current_mode) {
  2004   
  2423         case datatypes_gm:
  2005       if (configuration_count++) {
  2424           if (symbol->global_var_declarations != NULL)
  2006         /* the first configuration is the one we will use!! */
  2425             symbol->global_var_declarations->accept(generate_c_datatypes);
  2007         ERROR;
  2426           break;
       
  2427 
       
  2428         case pous_gm:
       
  2429           static int configuration_count = 0;
       
  2430 
       
  2431           if (configuration_count++) {
       
  2432             /* the first configuration is the one we will use!! */
       
  2433             ERROR;
       
  2434           }
       
  2435 
       
  2436           current_configuration = symbol;
       
  2437 
       
  2438           {
       
  2439             calculate_common_ticktime_c calculate_common_ticktime;
       
  2440             symbol->accept(calculate_common_ticktime);
       
  2441             common_ticktime = calculate_common_ticktime.get_common_ticktime();
       
  2442             if (common_ticktime == 0) {
       
  2443               fprintf(stderr, "\nYou must at least define a periodic task to set cycle period!");
       
  2444               ERROR;
       
  2445             }
       
  2446 
       
  2447             symbol->configuration_name->accept(*this);
       
  2448 
       
  2449             stage4out_c config_s4o(current_builddir, current_name, "c");
       
  2450             generate_c_config_c generate_c_config(&config_s4o);
       
  2451             symbol->accept(generate_c_config);
       
  2452 
       
  2453             config_s4o.print("unsigned long long common_ticktime__ = ");
       
  2454             config_s4o.print_long_long_integer(common_ticktime);
       
  2455             config_s4o.print("; /*ns*/\n");
       
  2456             config_s4o.print("unsigned long greatest_tick_count__ = ");
       
  2457             config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count());
       
  2458             config_s4o.print("; /*tick*/\n");
       
  2459           }
       
  2460 
       
  2461           symbol->resource_declarations->accept(*this);
       
  2462 
       
  2463           current_configuration = NULL;
       
  2464           break;
       
  2465 
       
  2466         default:
       
  2467           break;
  2008       }
  2468       }
  2009       
  2469       return NULL;
  2010       current_configuration = symbol;
  2470     }
  2011       
  2471 
  2012       calculate_common_ticktime_c calculate_common_ticktime;
  2472     void *visit(resource_declaration_c *symbol) {
  2013       symbol->accept(calculate_common_ticktime);
  2473       switch (current_mode) {
  2014       common_ticktime = calculate_common_ticktime.get_common_ticktime();
  2474         case datatypes_gm:
  2015       if (common_ticktime == 0) {
  2475           if (symbol->global_var_declarations != NULL)
  2016         fprintf(stderr, "\nYou must at least define a periodic task to set cycle period!");
  2476             symbol->global_var_declarations->accept(generate_c_datatypes);
  2017         ERROR;
  2477           break;
       
  2478         case pous_gm:
       
  2479           symbol->resource_name->accept(*this);
       
  2480           {
       
  2481             stage4out_c resources_s4o(current_builddir, current_name, "c");
       
  2482             generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime);
       
  2483             symbol->accept(generate_c_resources);
       
  2484           }
       
  2485           break;
       
  2486         default:
       
  2487           break;
  2018       }
  2488       }
  2019       
       
  2020       symbol->configuration_name->accept(*this);
       
  2021       stage4out_c config_s4o(current_builddir, current_name, "c");
       
  2022       generate_c_config_c generate_c_config(&config_s4o);
       
  2023       symbol->accept(generate_c_config);
       
  2024         
       
  2025       config_s4o.print("unsigned long long common_ticktime__ = ");
       
  2026       config_s4o.print_long_long_integer(common_ticktime);
       
  2027       config_s4o.print("; /*ns*/\n");
       
  2028       config_s4o.print("unsigned long greatest_tick_count__ = ");
       
  2029       config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count());
       
  2030       config_s4o.print("; /*tick*/\n");
       
  2031       
       
  2032       symbol->resource_declarations->accept(*this);
       
  2033 
       
  2034       current_configuration = NULL;
       
  2035       
       
  2036       return NULL;
       
  2037     }
       
  2038 
       
  2039     void *visit(resource_declaration_c *symbol) {
       
  2040       symbol->resource_name->accept(*this);
       
  2041       stage4out_c resources_s4o(current_builddir, current_name, "c");
       
  2042       generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime);
       
  2043       symbol->accept(generate_c_resources);
       
  2044       return NULL;
  2489       return NULL;
  2045     }
  2490     }
  2046 
  2491 
  2047     void *visit(single_resource_declaration_c *symbol) {
  2492     void *visit(single_resource_declaration_c *symbol) {
  2048       stage4out_c resources_s4o(current_builddir, "RESOURCE", "c");
  2493       switch (current_mode) {
  2049       generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime);
  2494         case pous_gm:
  2050       symbol->accept(generate_c_resources);
  2495           {
       
  2496             stage4out_c resources_s4o(current_builddir, "RESOURCE", "c");
       
  2497             generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime);
       
  2498             symbol->accept(generate_c_resources);
       
  2499           }
       
  2500           break;
       
  2501         default:
       
  2502           break;
       
  2503       }
  2051       return NULL;
  2504       return NULL;
  2052     }
  2505     }
  2053     
  2506     
  2054 };
  2507 };
  2055 
  2508