stage3/narrow_candidate_datatypes.cc
changeset 1040 e8563dcaefca
parent 1029 37145f381bb0
child 1041 56ebe2a31b5b
equal deleted inserted replaced
1037:bf39078476e4 1040:e8563dcaefca
   670 
   670 
   671 /* helper symbol for structure_initialization */
   671 /* helper symbol for structure_initialization */
   672 /* structure_initialization: '(' structure_element_initialization_list ')' */
   672 /* structure_initialization: '(' structure_element_initialization_list ')' */
   673 /* structure_element_initialization_list ',' structure_element_initialization */
   673 /* structure_element_initialization_list ',' structure_element_initialization */
   674 // SYM_LIST(structure_element_initialization_list_c)
   674 // SYM_LIST(structure_element_initialization_list_c)
   675 // Not needed ???
   675 void *narrow_candidate_datatypes_c::visit(structure_element_initialization_list_c *symbol) {
       
   676 	if (get_datatype_info_c::is_type_valid(symbol->datatype)) {
       
   677 		/* Note that in principle structure_element_initialization_list_c will have at most 1 candidate_datatype
       
   678 		 * (the FB or structure in the type specification). However, our algorithm is more generic and will
       
   679 		 * assume that more than 1 candidate_datatype is possible. In this case we need to iterate and check each
       
   680 		 * candidate_datatype whether it is feasible, as they may all be feasible but not for the same ...
       
   681 		 */
       
   682 		// assume symbol->datatype is a FB type
       
   683 		search_varfb_instance_type_c search_varfb_instance_type(symbol->datatype);
       
   684 		for (int k = 0; k < symbol->n; k++) {
       
   685 			structure_element_initialization_c *struct_elem = (structure_element_initialization_c *)symbol->elements[k];
       
   686 			symbol_c *type = search_varfb_instance_type.get_basetype_decl(struct_elem->structure_element_name);
       
   687 			set_datatype(type, struct_elem);
       
   688 			struct_elem->accept(*this);
       
   689 			if (struct_elem->datatype == NULL) ERROR; // should never occur. Already checked in fill_candidate_datatypes_c
       
   690 		}
       
   691 	}
       
   692 	return NULL;
       
   693 }
   676 
   694 
   677 /*  structure_element_name ASSIGN value */
   695 /*  structure_element_name ASSIGN value */
   678 // SYM_REF2(structure_element_initialization_c, structure_element_name, value)
   696 // SYM_REF2(structure_element_initialization_c, structure_element_name, value)
   679 // Not needed ???
   697 void *narrow_candidate_datatypes_c::visit(structure_element_initialization_c *symbol) {set_datatype(symbol->datatype, symbol->value); return NULL;}
   680 
   698 
   681 /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
   699 /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
   682 // SYM_REF4(string_type_declaration_c, string_type_name, elementary_string_type_name, string_type_declaration_size, string_type_declaration_init/* may be == NULL! */) 
   700 // SYM_REF4(string_type_declaration_c, string_type_name, elementary_string_type_name, string_type_declaration_size, string_type_declaration_init/* may be == NULL! */) 
   683 
   701 
   684 
   702