stage4/generate_c/generate_c.cc
changeset 706 31553c22f318
parent 636 dd57e63bdc3d
child 793 268bf4ca5fa1
equal deleted inserted replaced
705:f2323f79252e 706:31553c22f318
   107 
   107 
   108 
   108 
   109 /* Variable declaration symbol for accessor macros */
   109 /* Variable declaration symbol for accessor macros */
   110 #define DECLARE_VAR "__DECLARE_VAR"
   110 #define DECLARE_VAR "__DECLARE_VAR"
   111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL"
   111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL"
       
   112 #define DECLARE_GLOBAL_FB "__DECLARE_GLOBAL_FB"
   112 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION"
   113 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION"
   113 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED"
   114 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED"
   114 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL"
   115 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL"
       
   116 #define DECLARE_EXTERNAL_FB "__DECLARE_EXTERNAL_FB"
   115 #define DECLARE_LOCATED "__DECLARE_LOCATED"
   117 #define DECLARE_LOCATED "__DECLARE_LOCATED"
   116 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE"
   118 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE"
   117 
   119 
   118 /* Variable declaration symbol for accessor macros */
   120 /* Variable declaration symbol for accessor macros */
   119 #define INIT_VAR "__INIT_VAR"
   121 #define INIT_VAR "__INIT_VAR"
   120 #define INIT_GLOBAL "__INIT_GLOBAL"
   122 #define INIT_GLOBAL "__INIT_GLOBAL"
       
   123 #define INIT_GLOBAL_FB "__INIT_GLOBAL_FB"
   121 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   124 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   122 #define INIT_EXTERNAL "__INIT_EXTERNAL"
   125 #define INIT_EXTERNAL "__INIT_EXTERNAL"
       
   126 #define INIT_EXTERNAL_FB "__INIT_EXTERNAL_FB"
   123 #define INIT_LOCATED "__INIT_LOCATED"
   127 #define INIT_LOCATED "__INIT_LOCATED"
   124 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   128 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   125 
   129 
   126 /* Variable getter symbol for accessor macros */
   130 /* Variable getter symbol for accessor macros */
   127 #define GET_VAR "__GET_VAR"
   131 #define GET_VAR "__GET_VAR"
   128 #define GET_EXTERNAL "__GET_EXTERNAL"
   132 #define GET_EXTERNAL "__GET_EXTERNAL"
       
   133 #define GET_EXTERNAL_FB "__GET_EXTERNAL_FB"
   129 #define GET_LOCATED "__GET_LOCATED"
   134 #define GET_LOCATED "__GET_LOCATED"
   130 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   135 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   131 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF"
   136 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF"
       
   137 #define GET_EXTERNAL_FB_BY_REF "__GET_EXTERNAL_FB_BY_REF"
   132 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF"
   138 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF"
   133 
   139 
   134 /* Variable setter symbol for accessor macros */
   140 /* Variable setter symbol for accessor macros */
   135 #define SET_VAR "__SET_VAR"
   141 #define SET_VAR "__SET_VAR"
   136 #define SET_EXTERNAL "__SET_EXTERNAL"
   142 #define SET_EXTERNAL "__SET_EXTERNAL"
       
   143 #define SET_EXTERNAL_FB "__SET_EXTERNAL_FB"
   137 #define SET_LOCATED "__SET_LOCATED"
   144 #define SET_LOCATED "__SET_LOCATED"
   138 
   145 
   139 /* Variable initial value symbol for accessor macros */
   146 /* Variable initial value symbol for accessor macros */
   140 #define INITIAL_VALUE "__INITIAL_VALUE"
   147 #define INITIAL_VALUE "__INITIAL_VALUE"
   141 
   148 
   590       generate_c_datatypes_c::s4o_ptr = s4o_ptr;
   597       generate_c_datatypes_c::s4o_ptr = s4o_ptr;
   591       current_mode = none_im;
   598       current_mode = none_im;
   592     };
   599     };
   593     virtual ~generate_c_datatypes_c(void) {
   600     virtual ~generate_c_datatypes_c(void) {
   594       while (!inline_array_defined.empty()) {
   601       while (!inline_array_defined.empty()) {
   595     	inline_array_defined.erase(inline_array_defined.begin());
   602         inline_array_defined.erase(inline_array_defined.begin());
   596       }
   603       }
   597     }
   604     }
   598 
   605 
   599     /*************************/
   606     /*************************/
   600     /* B.1 - Common elements */
   607     /* B.1 - Common elements */
   624     /* B 1.3.1 - Elementary Data Types */
   631     /* B 1.3.1 - Elementary Data Types */
   625     /***********************************/
   632     /***********************************/
   626 
   633 
   627     #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\
   634     #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\
   628     void *visit(datatype_symbol *symbol) {\
   635     void *visit(datatype_symbol *symbol) {\
   629 	  switch (current_mode) {\
   636       switch (current_mode) {\
   630 		case arrayname_im:\
   637         case arrayname_im:\
   631 		  current_array_name += datatype_name;\
   638           current_array_name += datatype_name;\
   632 		  break;\
   639           break;\
   633         case arraydeclaration_im:\
   640         case arraydeclaration_im:\
   634           s4o_incl.print(datatype_name);\
   641           s4o_incl.print(datatype_name);\
   635           break;\
   642           break;\
   636 		default:\
   643         default:\
   637 		  return generate_c_base_c::visit(symbol);\
   644           return generate_c_base_c::visit(symbol);\
   638 		  break;\
   645           break;\
   639 	  }\
   646       }\
   640 	  return NULL;\
   647       return NULL;\
   641 	}
   648     }
   642 
   649 
   643     HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME")
   650     HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME")
   644     HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL")
   651     HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL")
   645     HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT")
   652     HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT")
   646     HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT")
   653     HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT")
   661     HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD")
   668     HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD")
   662     HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING")
   669     HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING")
   663     HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING")
   670     HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING")
   664 
   671 
   665     HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME")
   672     HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME")
   666 	HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL")
   673     HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL")
   667 	HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT")
   674     HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT")
   668 	HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT")
   675     HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT")
   669 	HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT")
   676     HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT")
   670 	HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT")
   677     HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT")
   671 	HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT")
   678     HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT")
   672 	HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT")
   679     HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT")
   673 	HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT")
   680     HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT")
   674 	HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT")
   681     HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT")
   675 	HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL")
   682     HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL")
   676 	HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL")
   683     HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL")
   677 	HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE")
   684     HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE")
   678 	HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD")
   685     HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD")
   679 	HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT")
   686     HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT")
   680 	HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE")
   687     HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE")
   681 	HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD")
   688     HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD")
   682 	HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   689     HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   683 	HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   690     HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   684 	HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   691     HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   685 	HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
   692     HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
   686 
   693 
   687     /***********************************/
   694     /***********************************/
   688     /* B 1.3.2 - Generic Data Types    */
   695     /* B 1.3.2 - Generic Data Types    */
   689     /***********************************/
   696     /***********************************/
   690 
   697 
   691 	/*  structure_type_name ':' structure_specification */
   698     /*  structure_type_name ':' structure_specification */
   692 	//SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
   699     //SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
   693 	void *visit(structure_type_declaration_c *symbol) {
   700     void *visit(structure_type_declaration_c *symbol) {
   694       current_mode = arraydeclaration_im;
   701       current_mode = arraydeclaration_im;
   695       symbol->structure_specification->accept(*this);
   702       symbol->structure_specification->accept(*this);
   696       current_mode = arrayname_im;
   703       current_mode = arrayname_im;
   697       generate_c_typedecl_c::visit(symbol);
   704       generate_c_typedecl_c::visit(symbol);
   698 	  current_mode = none_im;
   705       current_mode = none_im;
   699 	  return NULL;
   706       return NULL;
   700 	}
   707     }
   701 
   708 
   702     /* helper symbol for structure_declaration */
   709     /* helper symbol for structure_declaration */
   703     /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
   710     /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
   704     /* structure_element_declaration_list structure_element_declaration ';' */
   711     /* structure_element_declaration_list structure_element_declaration ';' */
   705     //SYM_LIST(structure_element_declaration_list_c)
   712     //SYM_LIST(structure_element_declaration_list_c)
   706     void *visit(structure_element_declaration_list_c *symbol) {
   713     void *visit(structure_element_declaration_list_c *symbol) {
   707       switch (current_mode) {
   714       switch (current_mode) {
   708     	case arraydeclaration_im:
   715         case arraydeclaration_im:
   709     	  iterator_visitor_c::visit(symbol);
   716           iterator_visitor_c::visit(symbol);
   710     	  break;
   717           break;
   711         default:
   718         default:
   712     	  generate_c_typedecl_c::visit(symbol);
   719           generate_c_typedecl_c::visit(symbol);
   713     	  break;
   720           break;
   714       }
   721       }
   715       return NULL;
   722       return NULL;
   716     }
   723     }
   717 
   724 
   718     /*  structure_element_name ':' spec_init */
   725     /*  structure_element_name ':' spec_init */
   719     //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
   726     //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
   720     void *visit(structure_element_declaration_c *symbol) {
   727     void *visit(structure_element_declaration_c *symbol) {
   721       switch (current_mode) {
   728       switch (current_mode) {
   722     	case arraydeclaration_im:
   729         case arraydeclaration_im:
   723     	  {
   730           {
   724 			array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init);
   731             array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init);
   725 			if (spec_init != NULL) {
   732             if (spec_init != NULL) {
   726 			  symbol->spec_init->accept(*this);
   733               symbol->spec_init->accept(*this);
   727 			}
   734             }
   728 		  }
   735           }
   729     	  break;
   736           break;
   730     	default:
   737         default:
   731     	  generate_c_typedecl_c::visit(symbol);
   738           generate_c_typedecl_c::visit(symbol);
   732           break;
   739           break;
   733       }
   740       }
   734       return NULL;
   741       return NULL;
   735     }
   742     }
   736 
   743 
   770 
   777 
   771     /* array_specification [ASSIGN array_initialization] */
   778     /* array_specification [ASSIGN array_initialization] */
   772     /* array_initialization may be NULL ! */
   779     /* array_initialization may be NULL ! */
   773     void *visit(array_spec_init_c *symbol) {
   780     void *visit(array_spec_init_c *symbol) {
   774       switch (current_mode) {
   781       switch (current_mode) {
   775     	case arraydeclaration_im:
   782         case arraydeclaration_im:
   776     	case arrayname_im:
   783         case arrayname_im:
   777     	  {
   784           {
   778     	    array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   785             array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   779             if (specification != NULL)
   786             if (specification != NULL)
   780               symbol->array_specification->accept(*this);
   787               symbol->array_specification->accept(*this);
   781           }
   788           }
   782           break;
   789           break;
   783     	default:
   790         default:
   784     	  return generate_c_typedecl_c::visit(symbol);
   791           return generate_c_typedecl_c::visit(symbol);
   785           break;
   792           break;
   786       }
   793       }
   787       return NULL;
   794       return NULL;
   788     }
   795     }
   789 
   796 
   790     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   797     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   791     void *visit(array_specification_c *symbol) {
   798     void *visit(array_specification_c *symbol) {
   792       switch (current_mode) {
   799       switch (current_mode) {
   793         case arraydeclaration_im:
   800         case arraydeclaration_im:
   794           {
   801           {
   795         	current_mode = arrayname_im;
   802             current_mode = arrayname_im;
   796             std::map<std::string,int>::iterator definition;
   803             std::map<std::string,int>::iterator definition;
   797             current_array_name = "__";
   804             current_array_name = "__";
   798             symbol->non_generic_type_name->accept(*this);
   805             symbol->non_generic_type_name->accept(*this);
   799             symbol->array_subrange_list->accept(*this);
   806             symbol->array_subrange_list->accept(*this);
   800             current_mode = arraydeclaration_im;
   807             current_mode = arraydeclaration_im;
   813             }
   820             }
   814           }
   821           }
   815           break;
   822           break;
   816         case arrayname_im:
   823         case arrayname_im:
   817           {
   824           {
   818         	  std::map<std::string,int>::iterator definition;
   825               std::map<std::string,int>::iterator definition;
   819 			  current_array_name = "__";
   826               current_array_name = "__";
   820 			  symbol->non_generic_type_name->accept(*this);
   827               symbol->non_generic_type_name->accept(*this);
   821 			  symbol->array_subrange_list->accept(*this);
   828               symbol->array_subrange_list->accept(*this);
   822 			  s4o_incl.print(current_array_name);
   829               s4o_incl.print(current_array_name);
   823           }
   830           }
   824           break;
   831           break;
   825         default:
   832         default:
   826           return generate_c_typedecl_c::visit(symbol);
   833           return generate_c_typedecl_c::visit(symbol);
   827           break;
   834           break;
   879 
   886 
   880     /*  var1_list ':' array_specification */
   887     /*  var1_list ':' array_specification */
   881     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   888     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   882     void *visit(array_var_declaration_c *symbol) {
   889     void *visit(array_var_declaration_c *symbol) {
   883       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   890       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   884 	  if (specification != NULL) {
   891       if (specification != NULL) {
   885         current_mode = arraydeclaration_im;
   892         current_mode = arraydeclaration_im;
   886         symbol->array_specification->accept(*this);
   893         symbol->array_specification->accept(*this);
   887         current_mode = none_im;
   894         current_mode = none_im;
   888       }
   895       }
   889       return NULL;
   896       return NULL;
   921     /* variable_name -> may be NULL ! */
   928     /* variable_name -> may be NULL ! */
   922     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   929     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   923     void *visit(located_var_decl_c *symbol) {
   930     void *visit(located_var_decl_c *symbol) {
   924       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   931       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   925       if (array_spec_init != NULL) {
   932       if (array_spec_init != NULL) {
   926     	current_mode = arraydeclaration_im;
   933         current_mode = arraydeclaration_im;
   927     	symbol->located_var_spec_init->accept(*this);
   934         symbol->located_var_spec_init->accept(*this);
   928     	current_mode = none_im;
   935         current_mode = none_im;
   929       }
   936       }
   930       return NULL;
   937       return NULL;
   931     }
   938     }
   932 
   939 
   933     /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
   940     /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */