stage3/fill_candidate_datatypes.cc
changeset 693 51a2fa6441b9
parent 690 6156ee2b4e32
child 716 eb9aad0c3627
equal deleted inserted replaced
692:c3287ffaee8c 693:51a2fa6441b9
   120 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) {
   120 void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) {
   121   #ifdef __REMOVE__
   121   #ifdef __REMOVE__
   122     #error __REMOVE__ macro already exists. Choose another name!
   122     #error __REMOVE__ macro already exists. Choose another name!
   123   #endif
   123   #endif
   124   #define __REMOVE__(datatype)\
   124   #define __REMOVE__(datatype)\
   125       remove_from_candidate_datatype_list(&search_constant_type_c::datatype,       symbol->candidate_datatypes);\
   125       remove_from_candidate_datatype_list(&get_datatype_info_c::datatype,       symbol->candidate_datatypes);\
   126       remove_from_candidate_datatype_list(&search_constant_type_c::safe##datatype, symbol->candidate_datatypes);
   126       remove_from_candidate_datatype_list(&get_datatype_info_c::safe##datatype, symbol->candidate_datatypes);
   127   
   127   
   128   {/* Remove unsigned data types */
   128   {/* Remove unsigned data types */
   129     uint64_t value = 0;
   129     uint64_t value = 0;
   130     if (VALID_CVALUE( uint64, symbol)) value = GET_CVALUE(uint64, symbol);
   130     if (VALID_CVALUE( uint64, symbol)) value = GET_CVALUE(uint64, symbol);
   131     if (IS_OVERFLOW ( uint64, symbol)) value = (uint64_t)UINT32_MAX + (uint64_t)1;
   131     if (IS_OVERFLOW ( uint64, symbol)) value = (uint64_t)UINT32_MAX + (uint64_t)1;
   424 	search_base_type_c search_base_type;
   424 	search_base_type_c search_base_type;
   425 	handle_binary_expression(widen_table, symbol, l_expr, r_expr);
   425 	handle_binary_expression(widen_table, symbol, l_expr, r_expr);
   426 	for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++)
   426 	for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++)
   427 		for(unsigned int j = 0; j < r_expr->candidate_datatypes.size(); j++) {
   427 		for(unsigned int j = 0; j < r_expr->candidate_datatypes.size(); j++) {
   428 			if ((l_expr->candidate_datatypes[i] == r_expr->candidate_datatypes[j]) && search_base_type.type_is_enumerated(l_expr->candidate_datatypes[i]))
   428 			if ((l_expr->candidate_datatypes[i] == r_expr->candidate_datatypes[j]) && search_base_type.type_is_enumerated(l_expr->candidate_datatypes[i]))
   429 				add_datatype_to_candidate_list(symbol, &search_constant_type_c::bool_type_name);
   429 				add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name);
   430 		}
   430 		}
   431 	return NULL;
   431 	return NULL;
   432 }
   432 }
   433 
   433 
   434 
   434 
   449 /* B 1.2.1 - Numeric Literals */
   449 /* B 1.2.1 - Numeric Literals */
   450 /******************************/
   450 /******************************/
   451 #define sizeoftype(symbol) get_sizeof_datatype_c::getsize(symbol)
   451 #define sizeoftype(symbol) get_sizeof_datatype_c::getsize(symbol)
   452 
   452 
   453 void *fill_candidate_datatypes_c::handle_any_integer(symbol_c *symbol) {
   453 void *fill_candidate_datatypes_c::handle_any_integer(symbol_c *symbol) {
   454 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::bool_type_name,  &search_constant_type_c::safebool_type_name);
   454 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name,  &get_datatype_info_c::safebool_type_name);
   455 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::byte_type_name,  &search_constant_type_c::safebyte_type_name);
   455 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name,  &get_datatype_info_c::safebyte_type_name);
   456 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::word_type_name,  &search_constant_type_c::safeword_type_name);
   456 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::word_type_name,  &get_datatype_info_c::safeword_type_name);
   457 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::dword_type_name, &search_constant_type_c::safedword_type_name);
   457 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name, &get_datatype_info_c::safedword_type_name);
   458 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::lword_type_name, &search_constant_type_c::safelword_type_name);
   458 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name, &get_datatype_info_c::safelword_type_name);
   459 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::sint_type_name,  &search_constant_type_c::safesint_type_name);
   459 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name,  &get_datatype_info_c::safesint_type_name);
   460 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::int_type_name,   &search_constant_type_c::safeint_type_name);
   460 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::int_type_name,   &get_datatype_info_c::safeint_type_name);
   461 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::dint_type_name,  &search_constant_type_c::safedint_type_name);
   461 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name,  &get_datatype_info_c::safedint_type_name);
   462 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::lint_type_name,  &search_constant_type_c::safelint_type_name);
   462 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name,  &get_datatype_info_c::safelint_type_name);
   463 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::usint_type_name, &search_constant_type_c::safeusint_type_name);
   463 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::usint_type_name, &get_datatype_info_c::safeusint_type_name);
   464 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::uint_type_name,  &search_constant_type_c::safeuint_type_name);
   464 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::uint_type_name,  &get_datatype_info_c::safeuint_type_name);
   465 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::udint_type_name, &search_constant_type_c::safeudint_type_name);
   465 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::udint_type_name, &get_datatype_info_c::safeudint_type_name);
   466 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::ulint_type_name, &search_constant_type_c::safeulint_type_name);
   466 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::ulint_type_name, &get_datatype_info_c::safeulint_type_name);
   467 	remove_incompatible_datatypes(symbol);
   467 	remove_incompatible_datatypes(symbol);
   468 	if (debug) std::cout << "ANY_INT [" << symbol->candidate_datatypes.size()<< "]" << std::endl;
   468 	if (debug) std::cout << "ANY_INT [" << symbol->candidate_datatypes.size()<< "]" << std::endl;
   469 	return NULL;
   469 	return NULL;
   470 }
   470 }
   471 
   471 
   472 
   472 
   473 
   473 
   474 void *fill_candidate_datatypes_c::handle_any_real(symbol_c *symbol) {
   474 void *fill_candidate_datatypes_c::handle_any_real(symbol_c *symbol) {
   475 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::real_type_name,  &search_constant_type_c::safereal_type_name);
   475 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::real_type_name,  &get_datatype_info_c::safereal_type_name);
   476 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::lreal_type_name, &search_constant_type_c::safelreal_type_name);
   476 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lreal_type_name, &get_datatype_info_c::safelreal_type_name);
   477 	remove_incompatible_datatypes(symbol);
   477 	remove_incompatible_datatypes(symbol);
   478 	if (debug) std::cout << "ANY_REAL [" << symbol->candidate_datatypes.size() << "]" << std::endl;
   478 	if (debug) std::cout << "ANY_REAL [" << symbol->candidate_datatypes.size() << "]" << std::endl;
   479 	return NULL;
   479 	return NULL;
   480 }
   480 }
   481 
   481 
   497 
   497 
   498 
   498 
   499 
   499 
   500 void *fill_candidate_datatypes_c::visit(neg_integer_c *symbol) {
   500 void *fill_candidate_datatypes_c::visit(neg_integer_c *symbol) {
   501 	/* Please read the comment in neg_expression_c method, as it also applies here */
   501 	/* Please read the comment in neg_expression_c method, as it also applies here */
   502 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::int_type_name, &search_constant_type_c::safeint_type_name);
   502 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::int_type_name, &get_datatype_info_c::safeint_type_name);
   503 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::sint_type_name, &search_constant_type_c::safesint_type_name);
   503 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name, &get_datatype_info_c::safesint_type_name);
   504 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::dint_type_name, &search_constant_type_c::safedint_type_name);
   504 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name, &get_datatype_info_c::safedint_type_name);
   505 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::lint_type_name, &search_constant_type_c::safelint_type_name);
   505 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name, &get_datatype_info_c::safelint_type_name);
   506 	remove_incompatible_datatypes(symbol);
   506 	remove_incompatible_datatypes(symbol);
   507 	if (debug) std::cout << "neg ANY_INT [" << symbol->candidate_datatypes.size() << "]" << std::endl;
   507 	if (debug) std::cout << "neg ANY_INT [" << symbol->candidate_datatypes.size() << "]" << std::endl;
   508 	return NULL;
   508 	return NULL;
   509 }
   509 }
   510 
   510 
   537 	return NULL;
   537 	return NULL;
   538 }
   538 }
   539 
   539 
   540 
   540 
   541 void *fill_candidate_datatypes_c::visit(boolean_true_c *symbol) {
   541 void *fill_candidate_datatypes_c::visit(boolean_true_c *symbol) {
   542 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::bool_type_name, &search_constant_type_c::safebool_type_name);
   542 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name, &get_datatype_info_c::safebool_type_name);
   543 	return NULL;
   543 	return NULL;
   544 }
   544 }
   545 
   545 
   546 void *fill_candidate_datatypes_c::visit(boolean_false_c *symbol) {
   546 void *fill_candidate_datatypes_c::visit(boolean_false_c *symbol) {
   547 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::bool_type_name, &search_constant_type_c::safebool_type_name);
   547 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name, &get_datatype_info_c::safebool_type_name);
   548 	return NULL;
   548 	return NULL;
   549 }
   549 }
   550 
   550 
   551 /*******************************/
   551 /*******************************/
   552 /* B.1.2.2   Character Strings */
   552 /* B.1.2.2   Character Strings */
   553 /*******************************/
   553 /*******************************/
   554 void *fill_candidate_datatypes_c::visit(double_byte_character_string_c *symbol) {
   554 void *fill_candidate_datatypes_c::visit(double_byte_character_string_c *symbol) {
   555 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::wstring_type_name, &search_constant_type_c::safewstring_type_name);
   555 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::wstring_type_name, &get_datatype_info_c::safewstring_type_name);
   556 	return NULL;
   556 	return NULL;
   557 }
   557 }
   558 
   558 
   559 void *fill_candidate_datatypes_c::visit(single_byte_character_string_c *symbol) {
   559 void *fill_candidate_datatypes_c::visit(single_byte_character_string_c *symbol) {
   560 	add_2datatypes_to_candidate_list(symbol, &search_constant_type_c::string_type_name, &search_constant_type_c::safestring_type_name);
   560 	add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::string_type_name, &get_datatype_info_c::safestring_type_name);
   561 	return NULL;
   561 	return NULL;
   562 }
   562 }
   563 
   563 
   564 /***************************/
   564 /***************************/
   565 /* B 1.2.3 - Time Literals */
   565 /* B 1.2.3 - Time Literals */
   669 	/* if (symbol->value == NULL) ERROR;
   669 	/* if (symbol->value == NULL) ERROR;
   670 	 * if (symbol->value[0] == '\0') ERROR;
   670 	 * if (symbol->value[0] == '\0') ERROR;
   671 	 * if (symbol->value[1] == '\0') ERROR;
   671 	 * if (symbol->value[1] == '\0') ERROR;
   672 	 */
   672 	 */
   673 	switch (symbol->value[2]) {
   673 	switch (symbol->value[2]) {
   674 		case 'x': case 'X': /* bit   -  1 bit  */ add_datatype_to_candidate_list(symbol, &search_constant_type_c::bool_type_name);  break;
   674 		case 'x': case 'X': /* bit   -  1 bit  */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name);  break;
   675 		case 'b': case 'B': /* byte  -  8 bits */ add_datatype_to_candidate_list(symbol, &search_constant_type_c::byte_type_name);  break;
   675 		case 'b': case 'B': /* byte  -  8 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name);  break;
   676 		case 'w': case 'W': /* word  - 16 bits */ add_datatype_to_candidate_list(symbol, &search_constant_type_c::word_type_name);  break;
   676 		case 'w': case 'W': /* word  - 16 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::word_type_name);  break;
   677 		case 'd': case 'D': /* dword - 32 bits */ add_datatype_to_candidate_list(symbol, &search_constant_type_c::dword_type_name); break;
   677 		case 'd': case 'D': /* dword - 32 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name); break;
   678 		case 'l': case 'L': /* lword - 64 bits */ add_datatype_to_candidate_list(symbol, &search_constant_type_c::lword_type_name); break;
   678 		case 'l': case 'L': /* lword - 64 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name); break;
   679         	          /* if none of the above, then the empty string was used <=> boolean */
   679         	          /* if none of the above, then the empty string was used <=> boolean */
   680 		default:                        add_datatype_to_candidate_list(symbol, &search_constant_type_c::bool_type_name);  break;
   680 		default:                        add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name);  break;
   681 	}
   681 	}
   682 	return NULL;
   682 	return NULL;
   683 }
   683 }
   684 
   684 
   685 /*************************************/
   685 /*************************************/
   774 
   774 
   775 	symbol->direct_variable->accept(*this);
   775 	symbol->direct_variable->accept(*this);
   776 	for (unsigned int i = 0; i < symbol->direct_variable->candidate_datatypes.size(); i++) {
   776 	for (unsigned int i = 0; i < symbol->direct_variable->candidate_datatypes.size(); i++) {
   777         	switch (get_sizeof_datatype_c::getsize(symbol->direct_variable->candidate_datatypes[i])) {
   777         	switch (get_sizeof_datatype_c::getsize(symbol->direct_variable->candidate_datatypes[i])) {
   778 			case  1: /* bit   -  1 bit  */
   778 			case  1: /* bit   -  1 bit  */
   779 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::bool_type_name);
   779 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name);
   780 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safebool_type_name);
   780 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safebool_type_name);
   781 					break;
   781 					break;
   782 			case  8: /* byte  -  8 bits */
   782 			case  8: /* byte  -  8 bits */
   783 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::byte_type_name);
   783 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name);
   784 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safebyte_type_name);
   784 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safebyte_type_name);
   785 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::sint_type_name);
   785 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name);
   786 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safesint_type_name);
   786 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safesint_type_name);
   787 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::usint_type_name);
   787 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::usint_type_name);
   788 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeusint_type_name);
   788 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeusint_type_name);
   789 					break;
   789 					break;
   790 			case 16: /* word  - 16 bits */
   790 			case 16: /* word  - 16 bits */
   791 	 				add_datatype_to_candidate_list(symbol, &search_constant_type_c::word_type_name);
   791 	 				add_datatype_to_candidate_list(symbol, &get_datatype_info_c::word_type_name);
   792 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeword_type_name);
   792 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeword_type_name);
   793 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::int_type_name);
   793 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::int_type_name);
   794 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeint_type_name);
   794 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeint_type_name);
   795 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::uint_type_name);
   795 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::uint_type_name);
   796 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeuint_type_name);
   796 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeuint_type_name);
   797 					break;
   797 					break;
   798 			case 32: /* dword - 32 bits */
   798 			case 32: /* dword - 32 bits */
   799 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::dword_type_name);
   799 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name);
   800 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safedword_type_name);
   800 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safedword_type_name);
   801 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::dint_type_name);
   801 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name);
   802 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safedint_type_name);
   802 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safedint_type_name);
   803 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::udint_type_name);
   803 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::udint_type_name);
   804 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeudint_type_name);
   804 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeudint_type_name);
   805 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::real_type_name);
   805 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::real_type_name);
   806 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safereal_type_name);
   806 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safereal_type_name);
   807 					break;
   807 					break;
   808 			case 64: /* lword - 64 bits */
   808 			case 64: /* lword - 64 bits */
   809 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lword_type_name);
   809 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name);
   810 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelword_type_name);
   810 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelword_type_name);
   811 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lint_type_name);
   811 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name);
   812 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelint_type_name);
   812 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelint_type_name);
   813 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::ulint_type_name);
   813 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::ulint_type_name);
   814 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safeulint_type_name);
   814 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeulint_type_name);
   815 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::lreal_type_name);
   815 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lreal_type_name);
   816 					add_datatype_to_candidate_list(symbol, &search_constant_type_c::safelreal_type_name);
   816 					add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelreal_type_name);
   817 					break;
   817 					break;
   818 			default: /* if none of the above, then no valid datatype allowed... */
   818 			default: /* if none of the above, then no valid datatype allowed... */
   819 					break;
   819 					break;
   820 		} /* switch() */
   820 		} /* switch() */
   821 	} /* for */
   821 	} /* for */