107 |
107 |
108 |
108 |
109 /* Variable declaration symbol for accessor macros */ |
109 /* Variable declaration symbol for accessor macros */ |
110 #define DECLARE_VAR "__DECLARE_VAR" |
110 #define DECLARE_VAR "__DECLARE_VAR" |
111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL" |
111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL" |
|
112 #define DECLARE_GLOBAL_FB "__DECLARE_GLOBAL_FB" |
112 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION" |
113 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION" |
113 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED" |
114 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED" |
114 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL" |
115 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL" |
|
116 #define DECLARE_EXTERNAL_FB "__DECLARE_EXTERNAL_FB" |
115 #define DECLARE_LOCATED "__DECLARE_LOCATED" |
117 #define DECLARE_LOCATED "__DECLARE_LOCATED" |
116 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE" |
118 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE" |
117 |
119 |
118 /* Variable declaration symbol for accessor macros */ |
120 /* Variable declaration symbol for accessor macros */ |
119 #define INIT_VAR "__INIT_VAR" |
121 #define INIT_VAR "__INIT_VAR" |
120 #define INIT_GLOBAL "__INIT_GLOBAL" |
122 #define INIT_GLOBAL "__INIT_GLOBAL" |
|
123 #define INIT_GLOBAL_FB "__INIT_GLOBAL_FB" |
121 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED" |
124 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED" |
122 #define INIT_EXTERNAL "__INIT_EXTERNAL" |
125 #define INIT_EXTERNAL "__INIT_EXTERNAL" |
|
126 #define INIT_EXTERNAL_FB "__INIT_EXTERNAL_FB" |
123 #define INIT_LOCATED "__INIT_LOCATED" |
127 #define INIT_LOCATED "__INIT_LOCATED" |
124 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE" |
128 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE" |
125 |
129 |
126 /* Variable getter symbol for accessor macros */ |
130 /* Variable getter symbol for accessor macros */ |
127 #define GET_VAR "__GET_VAR" |
131 #define GET_VAR "__GET_VAR" |
128 #define GET_EXTERNAL "__GET_EXTERNAL" |
132 #define GET_EXTERNAL "__GET_EXTERNAL" |
|
133 #define GET_EXTERNAL_FB "__GET_EXTERNAL_FB" |
129 #define GET_LOCATED "__GET_LOCATED" |
134 #define GET_LOCATED "__GET_LOCATED" |
130 #define GET_VAR_BY_REF "__GET_VAR_BY_REF" |
135 #define GET_VAR_BY_REF "__GET_VAR_BY_REF" |
131 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF" |
136 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF" |
|
137 #define GET_EXTERNAL_FB_BY_REF "__GET_EXTERNAL_FB_BY_REF" |
132 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF" |
138 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF" |
133 |
139 |
134 /* Variable setter symbol for accessor macros */ |
140 /* Variable setter symbol for accessor macros */ |
135 #define SET_VAR "__SET_VAR" |
141 #define SET_VAR "__SET_VAR" |
136 #define SET_EXTERNAL "__SET_EXTERNAL" |
142 #define SET_EXTERNAL "__SET_EXTERNAL" |
|
143 #define SET_EXTERNAL_FB "__SET_EXTERNAL_FB" |
137 #define SET_LOCATED "__SET_LOCATED" |
144 #define SET_LOCATED "__SET_LOCATED" |
138 |
145 |
139 /* Variable initial value symbol for accessor macros */ |
146 /* Variable initial value symbol for accessor macros */ |
140 #define INITIAL_VALUE "__INITIAL_VALUE" |
147 #define INITIAL_VALUE "__INITIAL_VALUE" |
141 |
148 |
624 /* B 1.3.1 - Elementary Data Types */ |
631 /* B 1.3.1 - Elementary Data Types */ |
625 /***********************************/ |
632 /***********************************/ |
626 |
633 |
627 #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\ |
634 #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\ |
628 void *visit(datatype_symbol *symbol) {\ |
635 void *visit(datatype_symbol *symbol) {\ |
629 switch (current_mode) {\ |
636 switch (current_mode) {\ |
630 case arrayname_im:\ |
637 case arrayname_im:\ |
631 current_array_name += datatype_name;\ |
638 current_array_name += datatype_name;\ |
632 break;\ |
639 break;\ |
633 case arraydeclaration_im:\ |
640 case arraydeclaration_im:\ |
634 s4o_incl.print(datatype_name);\ |
641 s4o_incl.print(datatype_name);\ |
635 break;\ |
642 break;\ |
636 default:\ |
643 default:\ |
637 return generate_c_base_c::visit(symbol);\ |
644 return generate_c_base_c::visit(symbol);\ |
638 break;\ |
645 break;\ |
639 }\ |
646 }\ |
640 return NULL;\ |
647 return NULL;\ |
641 } |
648 } |
642 |
649 |
643 HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME") |
650 HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME") |
644 HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL") |
651 HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL") |
645 HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT") |
652 HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT") |
646 HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT") |
653 HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT") |
661 HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD") |
668 HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD") |
662 HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING") |
669 HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING") |
663 HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING") |
670 HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING") |
664 |
671 |
665 HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME") |
672 HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME") |
666 HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL") |
673 HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL") |
667 HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT") |
674 HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT") |
668 HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT") |
675 HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT") |
669 HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT") |
676 HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT") |
670 HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT") |
677 HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT") |
671 HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT") |
678 HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT") |
672 HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT") |
679 HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT") |
673 HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT") |
680 HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT") |
674 HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT") |
681 HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT") |
675 HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL") |
682 HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL") |
676 HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL") |
683 HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL") |
677 HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE") |
684 HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE") |
678 HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD") |
685 HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD") |
679 HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT") |
686 HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT") |
680 HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE") |
687 HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE") |
681 HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD") |
688 HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD") |
682 HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
689 HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
683 HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
690 HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
684 HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
691 HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
685 HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
692 HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
686 |
693 |
687 /***********************************/ |
694 /***********************************/ |
688 /* B 1.3.2 - Generic Data Types */ |
695 /* B 1.3.2 - Generic Data Types */ |
689 /***********************************/ |
696 /***********************************/ |
690 |
697 |
691 /* structure_type_name ':' structure_specification */ |
698 /* structure_type_name ':' structure_specification */ |
692 //SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification) |
699 //SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification) |
693 void *visit(structure_type_declaration_c *symbol) { |
700 void *visit(structure_type_declaration_c *symbol) { |
694 current_mode = arraydeclaration_im; |
701 current_mode = arraydeclaration_im; |
695 symbol->structure_specification->accept(*this); |
702 symbol->structure_specification->accept(*this); |
696 current_mode = arrayname_im; |
703 current_mode = arrayname_im; |
697 generate_c_typedecl_c::visit(symbol); |
704 generate_c_typedecl_c::visit(symbol); |
698 current_mode = none_im; |
705 current_mode = none_im; |
699 return NULL; |
706 return NULL; |
700 } |
707 } |
701 |
708 |
702 /* helper symbol for structure_declaration */ |
709 /* helper symbol for structure_declaration */ |
703 /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ |
710 /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ |
704 /* structure_element_declaration_list structure_element_declaration ';' */ |
711 /* structure_element_declaration_list structure_element_declaration ';' */ |
705 //SYM_LIST(structure_element_declaration_list_c) |
712 //SYM_LIST(structure_element_declaration_list_c) |
706 void *visit(structure_element_declaration_list_c *symbol) { |
713 void *visit(structure_element_declaration_list_c *symbol) { |
707 switch (current_mode) { |
714 switch (current_mode) { |
708 case arraydeclaration_im: |
715 case arraydeclaration_im: |
709 iterator_visitor_c::visit(symbol); |
716 iterator_visitor_c::visit(symbol); |
710 break; |
717 break; |
711 default: |
718 default: |
712 generate_c_typedecl_c::visit(symbol); |
719 generate_c_typedecl_c::visit(symbol); |
713 break; |
720 break; |
714 } |
721 } |
715 return NULL; |
722 return NULL; |
716 } |
723 } |
717 |
724 |
718 /* structure_element_name ':' spec_init */ |
725 /* structure_element_name ':' spec_init */ |
719 //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init) |
726 //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init) |
720 void *visit(structure_element_declaration_c *symbol) { |
727 void *visit(structure_element_declaration_c *symbol) { |
721 switch (current_mode) { |
728 switch (current_mode) { |
722 case arraydeclaration_im: |
729 case arraydeclaration_im: |
723 { |
730 { |
724 array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init); |
731 array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init); |
725 if (spec_init != NULL) { |
732 if (spec_init != NULL) { |
726 symbol->spec_init->accept(*this); |
733 symbol->spec_init->accept(*this); |
727 } |
734 } |
728 } |
735 } |
729 break; |
736 break; |
730 default: |
737 default: |
731 generate_c_typedecl_c::visit(symbol); |
738 generate_c_typedecl_c::visit(symbol); |
732 break; |
739 break; |
733 } |
740 } |
734 return NULL; |
741 return NULL; |
735 } |
742 } |
736 |
743 |
770 |
777 |
771 /* array_specification [ASSIGN array_initialization] */ |
778 /* array_specification [ASSIGN array_initialization] */ |
772 /* array_initialization may be NULL ! */ |
779 /* array_initialization may be NULL ! */ |
773 void *visit(array_spec_init_c *symbol) { |
780 void *visit(array_spec_init_c *symbol) { |
774 switch (current_mode) { |
781 switch (current_mode) { |
775 case arraydeclaration_im: |
782 case arraydeclaration_im: |
776 case arrayname_im: |
783 case arrayname_im: |
777 { |
784 { |
778 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
785 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
779 if (specification != NULL) |
786 if (specification != NULL) |
780 symbol->array_specification->accept(*this); |
787 symbol->array_specification->accept(*this); |
781 } |
788 } |
782 break; |
789 break; |
783 default: |
790 default: |
784 return generate_c_typedecl_c::visit(symbol); |
791 return generate_c_typedecl_c::visit(symbol); |
785 break; |
792 break; |
786 } |
793 } |
787 return NULL; |
794 return NULL; |
788 } |
795 } |
789 |
796 |
790 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
797 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
791 void *visit(array_specification_c *symbol) { |
798 void *visit(array_specification_c *symbol) { |
792 switch (current_mode) { |
799 switch (current_mode) { |
793 case arraydeclaration_im: |
800 case arraydeclaration_im: |
794 { |
801 { |
795 current_mode = arrayname_im; |
802 current_mode = arrayname_im; |
796 std::map<std::string,int>::iterator definition; |
803 std::map<std::string,int>::iterator definition; |
797 current_array_name = "__"; |
804 current_array_name = "__"; |
798 symbol->non_generic_type_name->accept(*this); |
805 symbol->non_generic_type_name->accept(*this); |
799 symbol->array_subrange_list->accept(*this); |
806 symbol->array_subrange_list->accept(*this); |
800 current_mode = arraydeclaration_im; |
807 current_mode = arraydeclaration_im; |