stage3/fill_candidate_datatypes.cc
changeset 558 9273dfc5fa7c
parent 552 3c39d80fdede
child 603 a45a62dd6df9
equal deleted inserted replaced
557:95a2fe60a15c 558:9273dfc5fa7c
   694 
   694 
   695 
   695 
   696 /*  AT direct_variable */
   696 /*  AT direct_variable */
   697 // SYM_REF1(location_c, direct_variable)
   697 // SYM_REF1(location_c, direct_variable)
   698 void *fill_candidate_datatypes_c::visit(location_c *symbol) {
   698 void *fill_candidate_datatypes_c::visit(location_c *symbol) {
       
   699  /* This is a special situation. 
       
   700   *
       
   701   * The reason is that a located variable may be declared to be of any data type, as long as the size
       
   702   * matches the location (lines 1 3 and 4 of table 17). For example:
       
   703   *   var1 AT %MB42.0 : BYTE;
       
   704   *   var1 AT %MB42.1 : SINT;
       
   705   *   var1 AT %MB42.2 : USINT;
       
   706   *   var1 AT %MW64   : INT;
       
   707   *   var1 AT %MD56   : DINT;
       
   708   *   var1 AT %MD57   : REAL;
       
   709   *  are all valid!!
       
   710   *
       
   711   *  However, when used inside an expression, the direct variable (uses the same syntax as the location
       
   712   *  of a located variable) is limited to the following (ANY_BIT) data types:
       
   713   *    %MX --> BOOL
       
   714   *    %MB --> BYTE
       
   715   *    %MW --> WORD
       
   716   *    %MD --> DWORD
       
   717   *    %ML --> LWORD
       
   718   *
       
   719   *  So, in order to be able to analyse expressions with direct variables
       
   720   *   e.g:  var1 := 66 OR %MW34
       
   721   *  where the direct variable may only take the ANY_BIT data types, the fill_candidate_datatypes_c
       
   722   *  considers that only the ANY_BIT data types are allowed for a direct variable.
       
   723   *  However, it appears from the examples in the standard (lines 1 3 and 4 of table 17)
       
   724   *  a location may have any data type (presumably as long as the size in bits match).
       
   725   *  For this reason, a location_c may have more allowable data types than a direct_variable_c
       
   726   */
       
   727 
   699 	symbol->direct_variable->accept(*this);
   728 	symbol->direct_variable->accept(*this);
   700 	symbol->candidate_datatypes = symbol->direct_variable->candidate_datatypes;
   729 	for (unsigned int i = 0; i < symbol->direct_variable->candidate_datatypes.size(); i++) {
       
   730         	switch (get_sizeof_datatype_c::getsize(symbol->direct_variable->candidate_datatypes[i])) {
       
   731 			case  1: /* bit   -  1 bit  */
       
   732 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::bool_type_name);
       
   733 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safebool_type_name);
       
   734 					break;
       
   735 			case  8: /* byte  -  8 bits */
       
   736 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::byte_type_name);
       
   737 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safebyte_type_name);
       
   738 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::sint_type_name);
       
   739 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safesint_type_name);
       
   740 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::usint_type_name);
       
   741 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeusint_type_name);
       
   742 					break;
       
   743 			case 16: /* word  - 16 bits */
       
   744 	 				add_datatype_to_candidate_list(symbol, &search_constant_type_c::word_type_name);
       
   745 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeword_type_name);
       
   746 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::int_type_name);
       
   747 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeint_type_name);
       
   748 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::uint_type_name);
       
   749 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeuint_type_name);
       
   750 					break;
       
   751 			case 32: /* dword - 32 bits */
       
   752 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::dword_type_name);
       
   753 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safedword_type_name);
       
   754 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::dint_type_name);
       
   755 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safedint_type_name);
       
   756 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::udint_type_name);
       
   757 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeudint_type_name);
       
   758 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::real_type_name);
       
   759 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safereal_type_name);
       
   760 					break;
       
   761 			case 64: /* lword - 64 bits */
       
   762 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lword_type_name);
       
   763 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelword_type_name);
       
   764 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lint_type_name);
       
   765 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelint_type_name);
       
   766 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::ulint_type_name);
       
   767 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeulint_type_name);
       
   768 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lreal_type_name);
       
   769 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelreal_type_name);
       
   770 					break;
       
   771 			default: /* if none of the above, then no valid datatype allowed... */
       
   772 					break;
       
   773 		} /* switch() */
       
   774 	} /* for */
       
   775 
   701 	return NULL;
   776 	return NULL;
   702 }
   777 }
   703 
   778 
   704 
   779 
   705 /*  [variable_name] location ':' located_var_spec_init */
   780 /*  [variable_name] location ':' located_var_spec_init */