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 */ |