682 HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
682 HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
683 HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
683 HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
684 HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
684 HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
685 HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
685 HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
686 |
686 |
|
687 /***********************************/ |
|
688 /* B 1.3.2 - Generic Data Types */ |
|
689 /***********************************/ |
|
690 |
|
691 /* structure_type_name ':' structure_specification */ |
|
692 //SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification) |
|
693 void *visit(structure_type_declaration_c *symbol) { |
|
694 current_mode = arraydeclaration_im; |
|
695 symbol->structure_specification->accept(*this); |
|
696 current_mode = arrayname_im; |
|
697 generate_c_typedecl_c::visit(symbol); |
|
698 current_mode = none_im; |
|
699 return NULL; |
|
700 } |
|
701 |
|
702 /* helper symbol for structure_declaration */ |
|
703 /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ |
|
704 /* structure_element_declaration_list structure_element_declaration ';' */ |
|
705 //SYM_LIST(structure_element_declaration_list_c) |
|
706 void *visit(structure_element_declaration_list_c *symbol) { |
|
707 switch (current_mode) { |
|
708 case arraydeclaration_im: |
|
709 iterator_visitor_c::visit(symbol); |
|
710 break; |
|
711 default: |
|
712 generate_c_typedecl_c::visit(symbol); |
|
713 break; |
|
714 } |
|
715 return NULL; |
|
716 } |
|
717 |
|
718 /* structure_element_name ':' spec_init */ |
|
719 //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init) |
|
720 void *visit(structure_element_declaration_c *symbol) { |
|
721 switch (current_mode) { |
|
722 case arraydeclaration_im: |
|
723 { |
|
724 array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init); |
|
725 if (spec_init != NULL) { |
|
726 symbol->spec_init->accept(*this); |
|
727 } |
|
728 } |
|
729 break; |
|
730 default: |
|
731 generate_c_typedecl_c::visit(symbol); |
|
732 break; |
|
733 } |
|
734 return NULL; |
|
735 } |
|
736 |
687 /******************************************/ |
737 /******************************************/ |
688 /* B 1.4.3 - Declaration & Initialization */ |
738 /* B 1.4.3 - Declaration & Initialization */ |
689 /******************************************/ |
739 /******************************************/ |
690 |
740 |
691 void *visit(input_declarations_c *symbol) { |
741 void *visit(input_declarations_c *symbol) { |
710 } |
760 } |
711 |
761 |
712 /* var1_list ':' array_spec_init */ |
762 /* var1_list ':' array_spec_init */ |
713 // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) |
763 // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) |
714 void *visit(array_var_init_decl_c *symbol) { |
764 void *visit(array_var_init_decl_c *symbol) { |
715 current_mode = arrayname_im; |
765 current_mode = arraydeclaration_im; |
716 symbol->array_spec_init->accept(*this); |
766 symbol->array_spec_init->accept(*this); |
717 current_mode = none_im; |
767 current_mode = none_im; |
718 return NULL; |
768 return NULL; |
719 } |
769 } |
720 |
770 |
721 /* array_specification [ASSIGN array_initialization] */ |
771 /* array_specification [ASSIGN array_initialization] */ |
722 /* array_initialization may be NULL ! */ |
772 /* array_initialization may be NULL ! */ |
723 void *visit(array_spec_init_c *symbol) { |
773 void *visit(array_spec_init_c *symbol) { |
724 switch (current_mode) { |
774 switch (current_mode) { |
|
775 case arraydeclaration_im: |
725 case arrayname_im: |
776 case arrayname_im: |
726 { |
777 { |
727 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
778 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
728 if (specification != NULL) |
779 if (specification != NULL) |
729 symbol->array_specification->accept(*this); |
780 symbol->array_specification->accept(*this); |
737 } |
788 } |
738 |
789 |
739 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
790 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
740 void *visit(array_specification_c *symbol) { |
791 void *visit(array_specification_c *symbol) { |
741 switch (current_mode) { |
792 switch (current_mode) { |
742 case arrayname_im: |
793 case arraydeclaration_im: |
743 { |
794 { |
|
795 current_mode = arrayname_im; |
744 std::map<std::string,int>::iterator definition; |
796 std::map<std::string,int>::iterator definition; |
745 current_array_name = "__"; |
797 current_array_name = "__"; |
746 symbol->non_generic_type_name->accept(*this); |
798 symbol->non_generic_type_name->accept(*this); |
747 symbol->array_subrange_list->accept(*this); |
799 symbol->array_subrange_list->accept(*this); |
|
800 current_mode = arraydeclaration_im; |
748 |
801 |
749 definition = inline_array_defined.find(current_array_name); |
802 definition = inline_array_defined.find(current_array_name); |
750 if (definition == inline_array_defined.end()) { |
803 if (definition == inline_array_defined.end()) { |
751 current_mode = arraydeclaration_im; |
|
752 |
|
753 s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
804 s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
754 s4o_incl.print(current_array_name); |
805 s4o_incl.print(current_array_name); |
755 s4o_incl.print(","); |
806 s4o_incl.print(","); |
756 symbol->non_generic_type_name->accept(*this); |
807 symbol->non_generic_type_name->accept(*this); |
757 s4o_incl.print(","); |
808 s4o_incl.print(","); |
758 symbol->array_subrange_list->accept(*this); |
809 symbol->array_subrange_list->accept(*this); |
759 s4o_incl.print(")\n\n"); |
810 s4o_incl.print(")\n\n"); |
760 |
811 |
761 inline_array_defined[current_array_name] = 0; |
812 inline_array_defined[current_array_name] = 0; |
762 } |
813 } |
|
814 } |
|
815 break; |
|
816 case arrayname_im: |
|
817 { |
|
818 std::map<std::string,int>::iterator definition; |
|
819 current_array_name = "__"; |
|
820 symbol->non_generic_type_name->accept(*this); |
|
821 symbol->array_subrange_list->accept(*this); |
|
822 s4o_incl.print(current_array_name); |
763 } |
823 } |
764 break; |
824 break; |
765 default: |
825 default: |
766 return generate_c_typedecl_c::visit(symbol); |
826 return generate_c_typedecl_c::visit(symbol); |
767 break; |
827 break; |
820 /* var1_list ':' array_specification */ |
880 /* var1_list ':' array_specification */ |
821 //SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
881 //SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
822 void *visit(array_var_declaration_c *symbol) { |
882 void *visit(array_var_declaration_c *symbol) { |
823 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
883 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
824 if (specification != NULL) { |
884 if (specification != NULL) { |
825 current_mode = arrayname_im; |
885 current_mode = arraydeclaration_im; |
826 symbol->array_specification->accept(*this); |
886 symbol->array_specification->accept(*this); |
827 current_mode = none_im; |
887 current_mode = none_im; |
828 } |
888 } |
829 return NULL; |
889 return NULL; |
830 } |
890 } |
861 /* variable_name -> may be NULL ! */ |
921 /* variable_name -> may be NULL ! */ |
862 //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused) |
922 //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused) |
863 void *visit(located_var_decl_c *symbol) { |
923 void *visit(located_var_decl_c *symbol) { |
864 array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init); |
924 array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init); |
865 if (array_spec_init != NULL) { |
925 if (array_spec_init != NULL) { |
866 current_mode = arrayname_im; |
926 current_mode = arraydeclaration_im; |
867 symbol->located_var_spec_init->accept(*this); |
927 symbol->located_var_spec_init->accept(*this); |
868 current_mode = none_im; |
928 current_mode = none_im; |
869 } |
929 } |
870 return NULL; |
930 return NULL; |
871 } |
931 } |
881 /* global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */ |
941 /* global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */ |
882 //SYM_REF2(external_declaration_c, global_var_name, specification) |
942 //SYM_REF2(external_declaration_c, global_var_name, specification) |
883 void *visit(external_declaration_c *symbol) { |
943 void *visit(external_declaration_c *symbol) { |
884 array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification); |
944 array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification); |
885 if (array_specification != NULL) { |
945 if (array_specification != NULL) { |
886 current_mode = arrayname_im; |
946 current_mode = arraydeclaration_im; |
887 symbol->specification->accept(*this); |
947 symbol->specification->accept(*this); |
888 current_mode = none_im; |
948 current_mode = none_im; |
889 } |
949 } |
890 return NULL; |
950 return NULL; |
891 } |
951 } |
902 /* type_specification ->may be NULL ! */ |
962 /* type_specification ->may be NULL ! */ |
903 // SYM_REF2(global_var_decl_c, global_var_spec, type_specification) |
963 // SYM_REF2(global_var_decl_c, global_var_spec, type_specification) |
904 void *visit(global_var_decl_c *symbol) { |
964 void *visit(global_var_decl_c *symbol) { |
905 array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification); |
965 array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification); |
906 if (array_spec_init != NULL) { |
966 if (array_spec_init != NULL) { |
907 current_mode = arrayname_im; |
967 current_mode = arraydeclaration_im; |
908 symbol->type_specification->accept(*this); |
968 symbol->type_specification->accept(*this); |
909 current_mode = none_im; |
969 current_mode = none_im; |
910 } |
970 } |
911 return NULL; |
971 return NULL; |
912 } |
972 } |