stage4/generate_c/generate_c.cc
changeset 636 dd57e63bdc3d
parent 634 736b36a83548
parent 635 a20a70021d37
child 706 31553c22f318
equal deleted inserted replaced
634:736b36a83548 636:dd57e63bdc3d
   682 	HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   682 	HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   683 	HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   683 	HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   684 	HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   684 	HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   685 	HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
   685 	HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
   686 
   686 
       
   687     /***********************************/
       
   688     /* B 1.3.2 - Generic Data Types    */
       
   689     /***********************************/
       
   690 
       
   691 	/*  structure_type_name ':' structure_specification */
       
   692 	//SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
       
   693 	void *visit(structure_type_declaration_c *symbol) {
       
   694       current_mode = arraydeclaration_im;
       
   695       symbol->structure_specification->accept(*this);
       
   696       current_mode = arrayname_im;
       
   697       generate_c_typedecl_c::visit(symbol);
       
   698 	  current_mode = none_im;
       
   699 	  return NULL;
       
   700 	}
       
   701 
       
   702     /* helper symbol for structure_declaration */
       
   703     /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
       
   704     /* structure_element_declaration_list structure_element_declaration ';' */
       
   705     //SYM_LIST(structure_element_declaration_list_c)
       
   706     void *visit(structure_element_declaration_list_c *symbol) {
       
   707       switch (current_mode) {
       
   708     	case arraydeclaration_im:
       
   709     	  iterator_visitor_c::visit(symbol);
       
   710     	  break;
       
   711         default:
       
   712     	  generate_c_typedecl_c::visit(symbol);
       
   713     	  break;
       
   714       }
       
   715       return NULL;
       
   716     }
       
   717 
       
   718     /*  structure_element_name ':' spec_init */
       
   719     //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
       
   720     void *visit(structure_element_declaration_c *symbol) {
       
   721       switch (current_mode) {
       
   722     	case arraydeclaration_im:
       
   723     	  {
       
   724 			array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init);
       
   725 			if (spec_init != NULL) {
       
   726 			  symbol->spec_init->accept(*this);
       
   727 			}
       
   728 		  }
       
   729     	  break;
       
   730     	default:
       
   731     	  generate_c_typedecl_c::visit(symbol);
       
   732           break;
       
   733       }
       
   734       return NULL;
       
   735     }
       
   736 
   687     /******************************************/
   737     /******************************************/
   688     /* B 1.4.3 - Declaration & Initialization */
   738     /* B 1.4.3 - Declaration & Initialization */
   689     /******************************************/
   739     /******************************************/
   690 
   740 
   691     void *visit(input_declarations_c *symbol) {
   741     void *visit(input_declarations_c *symbol) {
   710     }
   760     }
   711 
   761 
   712     /*  var1_list ':' array_spec_init */
   762     /*  var1_list ':' array_spec_init */
   713     // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
   763     // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
   714     void *visit(array_var_init_decl_c *symbol) {
   764     void *visit(array_var_init_decl_c *symbol) {
   715       current_mode = arrayname_im;
   765       current_mode = arraydeclaration_im;
   716       symbol->array_spec_init->accept(*this);
   766       symbol->array_spec_init->accept(*this);
   717       current_mode = none_im;
   767       current_mode = none_im;
   718       return NULL;
   768       return NULL;
   719     }
   769     }
   720 
   770 
   721     /* array_specification [ASSIGN array_initialization] */
   771     /* array_specification [ASSIGN array_initialization] */
   722     /* array_initialization may be NULL ! */
   772     /* array_initialization may be NULL ! */
   723     void *visit(array_spec_init_c *symbol) {
   773     void *visit(array_spec_init_c *symbol) {
   724       switch (current_mode) {
   774       switch (current_mode) {
       
   775     	case arraydeclaration_im:
   725     	case arrayname_im:
   776     	case arrayname_im:
   726     	  {
   777     	  {
   727     	    array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   778     	    array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   728             if (specification != NULL)
   779             if (specification != NULL)
   729               symbol->array_specification->accept(*this);
   780               symbol->array_specification->accept(*this);
   737     }
   788     }
   738 
   789 
   739     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   790     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   740     void *visit(array_specification_c *symbol) {
   791     void *visit(array_specification_c *symbol) {
   741       switch (current_mode) {
   792       switch (current_mode) {
   742         case arrayname_im:
   793         case arraydeclaration_im:
   743           {
   794           {
       
   795         	current_mode = arrayname_im;
   744             std::map<std::string,int>::iterator definition;
   796             std::map<std::string,int>::iterator definition;
   745             current_array_name = "__";
   797             current_array_name = "__";
   746             symbol->non_generic_type_name->accept(*this);
   798             symbol->non_generic_type_name->accept(*this);
   747             symbol->array_subrange_list->accept(*this);
   799             symbol->array_subrange_list->accept(*this);
       
   800             current_mode = arraydeclaration_im;
   748 
   801 
   749             definition = inline_array_defined.find(current_array_name);
   802             definition = inline_array_defined.find(current_array_name);
   750             if (definition == inline_array_defined.end()) {
   803             if (definition == inline_array_defined.end()) {
   751               current_mode = arraydeclaration_im;
       
   752 
       
   753               s4o_incl.print("__DECLARE_ARRAY_TYPE(");
   804               s4o_incl.print("__DECLARE_ARRAY_TYPE(");
   754               s4o_incl.print(current_array_name);
   805               s4o_incl.print(current_array_name);
   755               s4o_incl.print(",");
   806               s4o_incl.print(",");
   756               symbol->non_generic_type_name->accept(*this);
   807               symbol->non_generic_type_name->accept(*this);
   757               s4o_incl.print(",");
   808               s4o_incl.print(",");
   758               symbol->array_subrange_list->accept(*this);
   809               symbol->array_subrange_list->accept(*this);
   759               s4o_incl.print(")\n\n");
   810               s4o_incl.print(")\n\n");
   760 
   811 
   761               inline_array_defined[current_array_name] = 0;
   812               inline_array_defined[current_array_name] = 0;
   762             }
   813             }
       
   814           }
       
   815           break;
       
   816         case arrayname_im:
       
   817           {
       
   818         	  std::map<std::string,int>::iterator definition;
       
   819 			  current_array_name = "__";
       
   820 			  symbol->non_generic_type_name->accept(*this);
       
   821 			  symbol->array_subrange_list->accept(*this);
       
   822 			  s4o_incl.print(current_array_name);
   763           }
   823           }
   764           break;
   824           break;
   765         default:
   825         default:
   766           return generate_c_typedecl_c::visit(symbol);
   826           return generate_c_typedecl_c::visit(symbol);
   767           break;
   827           break;
   820     /*  var1_list ':' array_specification */
   880     /*  var1_list ':' array_specification */
   821     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   881     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   822     void *visit(array_var_declaration_c *symbol) {
   882     void *visit(array_var_declaration_c *symbol) {
   823       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   883       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   824 	  if (specification != NULL) {
   884 	  if (specification != NULL) {
   825         current_mode = arrayname_im;
   885         current_mode = arraydeclaration_im;
   826         symbol->array_specification->accept(*this);
   886         symbol->array_specification->accept(*this);
   827         current_mode = none_im;
   887         current_mode = none_im;
   828       }
   888       }
   829       return NULL;
   889       return NULL;
   830     }
   890     }
   861     /* variable_name -> may be NULL ! */
   921     /* variable_name -> may be NULL ! */
   862     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   922     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   863     void *visit(located_var_decl_c *symbol) {
   923     void *visit(located_var_decl_c *symbol) {
   864       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   924       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   865       if (array_spec_init != NULL) {
   925       if (array_spec_init != NULL) {
   866     	current_mode = arrayname_im;
   926     	current_mode = arraydeclaration_im;
   867     	symbol->located_var_spec_init->accept(*this);
   927     	symbol->located_var_spec_init->accept(*this);
   868     	current_mode = none_im;
   928     	current_mode = none_im;
   869       }
   929       }
   870       return NULL;
   930       return NULL;
   871     }
   931     }
   881     /*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
   941     /*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
   882     //SYM_REF2(external_declaration_c, global_var_name, specification)
   942     //SYM_REF2(external_declaration_c, global_var_name, specification)
   883     void *visit(external_declaration_c *symbol) {
   943     void *visit(external_declaration_c *symbol) {
   884       array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification);
   944       array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification);
   885       if (array_specification != NULL) {
   945       if (array_specification != NULL) {
   886         current_mode = arrayname_im;
   946         current_mode = arraydeclaration_im;
   887         symbol->specification->accept(*this);
   947         symbol->specification->accept(*this);
   888         current_mode = none_im;
   948         current_mode = none_im;
   889       }
   949       }
   890       return NULL;
   950       return NULL;
   891     }
   951     }
   902     /* type_specification ->may be NULL ! */
   962     /* type_specification ->may be NULL ! */
   903     // SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
   963     // SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
   904     void *visit(global_var_decl_c *symbol) {
   964     void *visit(global_var_decl_c *symbol) {
   905       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification);
   965       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification);
   906       if (array_spec_init != NULL) {
   966       if (array_spec_init != NULL) {
   907         current_mode = arrayname_im;
   967         current_mode = arraydeclaration_im;
   908         symbol->type_specification->accept(*this);
   968         symbol->type_specification->accept(*this);
   909         current_mode = none_im;
   969         current_mode = none_im;
   910       }
   970       }
   911       return NULL;
   971       return NULL;
   912     }
   972     }