568 void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) { |
569 void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) { |
569 generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix); |
570 generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix); |
570 generate_c_st.generate(symbol); |
571 generate_c_st.generate(symbol); |
571 return NULL; |
572 return NULL; |
572 } |
573 } |
|
574 |
|
575 |
|
576 |
|
577 |
|
578 /***********************************************************************/ |
|
579 /***********************************************************************/ |
|
580 /***********************************************************************/ |
|
581 /***********************************************************************/ |
|
582 /***********************************************************************/ |
|
583 |
|
584 |
|
585 class generate_c_datatypes_c: public generate_c_typedecl_c { |
|
586 public: |
|
587 typedef enum { |
|
588 none_im, |
|
589 arrayname_im, |
|
590 arraydeclaration_im, |
|
591 } inlinearray_mode_t; |
|
592 |
|
593 private: |
|
594 stage4out_c *s4o_ptr; |
|
595 std::map<std::string, int> inline_array_defined; |
|
596 std::string current_array_name; |
|
597 inlinearray_mode_t current_mode; |
|
598 |
|
599 public: |
|
600 generate_c_datatypes_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) |
|
601 : generate_c_typedecl_c(s4o_ptr, s4o_incl_ptr) { |
|
602 generate_c_datatypes_c::s4o_ptr = s4o_ptr; |
|
603 current_mode = none_im; |
|
604 }; |
|
605 virtual ~generate_c_datatypes_c(void) { |
|
606 while (!inline_array_defined.empty()) { |
|
607 inline_array_defined.erase(inline_array_defined.begin()); |
|
608 } |
|
609 } |
|
610 |
|
611 /*************************/ |
|
612 /* B.1 - Common elements */ |
|
613 /*************************/ |
|
614 /*******************************************/ |
|
615 /* B 1.1 - Letters, digits and identifiers */ |
|
616 /*******************************************/ |
|
617 void *visit(identifier_c *symbol) { |
|
618 switch (current_mode) { |
|
619 case arrayname_im: |
|
620 current_array_name += symbol->value; |
|
621 break; |
|
622 case arraydeclaration_im: |
|
623 s4o_incl.print(symbol->value); |
|
624 break; |
|
625 default: |
|
626 return generate_c_base_c::visit(symbol); |
|
627 break; |
|
628 } |
|
629 return NULL; |
|
630 } |
|
631 |
|
632 /**********************/ |
|
633 /* B.1.3 - Data types */ |
|
634 /**********************/ |
|
635 /***********************************/ |
|
636 /* B 1.3.1 - Elementary Data Types */ |
|
637 /***********************************/ |
|
638 |
|
639 #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\ |
|
640 void *visit(datatype_symbol *symbol) {\ |
|
641 switch (current_mode) {\ |
|
642 case arrayname_im:\ |
|
643 current_array_name += datatype_name;\ |
|
644 break;\ |
|
645 case arraydeclaration_im:\ |
|
646 s4o_incl.print(datatype_name);\ |
|
647 break;\ |
|
648 default:\ |
|
649 return generate_c_base_c::visit(symbol);\ |
|
650 break;\ |
|
651 }\ |
|
652 return NULL;\ |
|
653 } |
|
654 |
|
655 HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME") |
|
656 HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL") |
|
657 HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT") |
|
658 HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT") |
|
659 HANDLE_ELEMENTARY_DATA_TYPE(dint_type_name_c, "DINT") |
|
660 HANDLE_ELEMENTARY_DATA_TYPE(lint_type_name_c, "LINT") |
|
661 HANDLE_ELEMENTARY_DATA_TYPE(usint_type_name_c, "USINT") |
|
662 HANDLE_ELEMENTARY_DATA_TYPE(uint_type_name_c, "UINT") |
|
663 HANDLE_ELEMENTARY_DATA_TYPE(udint_type_name_c, "UDINT") |
|
664 HANDLE_ELEMENTARY_DATA_TYPE(ulint_type_name_c, "ULINT") |
|
665 HANDLE_ELEMENTARY_DATA_TYPE(real_type_name_c, "REAL") |
|
666 HANDLE_ELEMENTARY_DATA_TYPE(lreal_type_name_c, "LREAL") |
|
667 HANDLE_ELEMENTARY_DATA_TYPE(date_type_name_c, "DATE") |
|
668 HANDLE_ELEMENTARY_DATA_TYPE(tod_type_name_c, "TOD") |
|
669 HANDLE_ELEMENTARY_DATA_TYPE(dt_type_name_c, "DT") |
|
670 HANDLE_ELEMENTARY_DATA_TYPE(byte_type_name_c, "BYTE") |
|
671 HANDLE_ELEMENTARY_DATA_TYPE(word_type_name_c, "WORD") |
|
672 HANDLE_ELEMENTARY_DATA_TYPE(dword_type_name_c, "DWORD") |
|
673 HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD") |
|
674 HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING") |
|
675 HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING") |
|
676 |
|
677 HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME") |
|
678 HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL") |
|
679 HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT") |
|
680 HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT") |
|
681 HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT") |
|
682 HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT") |
|
683 HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT") |
|
684 HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT") |
|
685 HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT") |
|
686 HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT") |
|
687 HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL") |
|
688 HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL") |
|
689 HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE") |
|
690 HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD") |
|
691 HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT") |
|
692 HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE") |
|
693 HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD") |
|
694 HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
|
695 HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
|
696 HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
|
697 HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
|
698 |
|
699 /******************************************/ |
|
700 /* B 1.4.3 - Declaration & Initialization */ |
|
701 /******************************************/ |
|
702 |
|
703 void *visit(input_declarations_c *symbol) { |
|
704 symbol->input_declaration_list->accept(*this); |
|
705 return NULL; |
|
706 } |
|
707 |
|
708 void *visit(edge_declaration_c *symbol) { |
|
709 return NULL; |
|
710 } |
|
711 |
|
712 void *visit(en_param_declaration_c *symbol) { |
|
713 return NULL; |
|
714 } |
|
715 |
|
716 void *visit(eno_param_declaration_c *symbol) { |
|
717 return NULL; |
|
718 } |
|
719 |
|
720 void *visit(var1_init_decl_c *symbol) { |
|
721 return NULL; |
|
722 } |
|
723 |
|
724 /* var1_list ':' array_spec_init */ |
|
725 // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) |
|
726 void *visit(array_var_init_decl_c *symbol) { |
|
727 current_mode = arrayname_im; |
|
728 symbol->array_spec_init->accept(*this); |
|
729 current_mode = none_im; |
|
730 return NULL; |
|
731 } |
|
732 |
|
733 /* array_specification [ASSIGN array_initialization] */ |
|
734 /* array_initialization may be NULL ! */ |
|
735 void *visit(array_spec_init_c *symbol) { |
|
736 switch (current_mode) { |
|
737 case arrayname_im: |
|
738 { |
|
739 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
|
740 if (specification != NULL) |
|
741 symbol->array_specification->accept(*this); |
|
742 } |
|
743 break; |
|
744 default: |
|
745 return generate_c_typedecl_c::visit(symbol); |
|
746 break; |
|
747 } |
|
748 return NULL; |
|
749 } |
|
750 |
|
751 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
|
752 void *visit(array_specification_c *symbol) { |
|
753 switch (current_mode) { |
|
754 case arrayname_im: |
|
755 { |
|
756 std::map<std::string,int>::iterator definition; |
|
757 current_array_name = "__"; |
|
758 symbol->non_generic_type_name->accept(*this); |
|
759 symbol->array_subrange_list->accept(*this); |
|
760 |
|
761 definition = inline_array_defined.find(current_array_name); |
|
762 if (definition == inline_array_defined.end()) { |
|
763 current_mode = arraydeclaration_im; |
|
764 |
|
765 s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
|
766 s4o_incl.print(current_array_name); |
|
767 s4o_incl.print(","); |
|
768 symbol->non_generic_type_name->accept(*this); |
|
769 s4o_incl.print(","); |
|
770 symbol->array_subrange_list->accept(*this); |
|
771 s4o_incl.print(")\n\n"); |
|
772 |
|
773 inline_array_defined[current_array_name] = 0; |
|
774 } |
|
775 } |
|
776 break; |
|
777 default: |
|
778 return generate_c_typedecl_c::visit(symbol); |
|
779 break; |
|
780 } |
|
781 return NULL; |
|
782 } |
|
783 |
|
784 /* signed_integer DOTDOT signed_integer */ |
|
785 //SYM_REF2(subrange_c, lower_limit, upper_limit) |
|
786 void *visit(subrange_c *symbol) { |
|
787 int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; |
|
788 switch (current_mode) { |
|
789 case arrayname_im: |
|
790 current_array_name += "_"; |
|
791 { |
|
792 std::stringstream ss; |
|
793 ss << dimension; |
|
794 current_array_name += ss.str(); |
|
795 } |
|
796 break; |
|
797 case arraydeclaration_im: |
|
798 s4o_incl.print("["); |
|
799 s4o_incl.print_integer(dimension); |
|
800 s4o_incl.print("]"); |
|
801 default: |
|
802 generate_c_typedecl_c::visit(symbol); |
|
803 break; |
|
804 } |
|
805 return NULL; |
|
806 } |
|
807 |
|
808 /* var1_list ':' initialized_structure */ |
|
809 // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) |
|
810 void *visit(structured_var_init_decl_c *symbol) { |
|
811 return NULL; |
|
812 } |
|
813 |
|
814 /* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */ |
|
815 /* structure_initialization -> may be NULL ! */ |
|
816 void *visit(fb_name_decl_c *symbol) { |
|
817 return NULL; |
|
818 } |
|
819 |
|
820 /* VAR_OUTPUT [RETAIN | NON_RETAIN] var_init_decl_list END_VAR */ |
|
821 /* option -> may be NULL ! */ |
|
822 void *visit(output_declarations_c *symbol) { |
|
823 symbol->var_init_decl_list->accept(*this); |
|
824 return NULL; |
|
825 } |
|
826 |
|
827 /* VAR_IN_OUT var_declaration_list END_VAR */ |
|
828 void *visit(input_output_declarations_c *symbol) { |
|
829 symbol->var_declaration_list->accept(*this); |
|
830 return NULL; |
|
831 } |
|
832 |
|
833 /* var1_list ':' array_specification */ |
|
834 //SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
|
835 void *visit(array_var_declaration_c *symbol) { |
|
836 array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
|
837 if (specification != NULL) { |
|
838 current_mode = arrayname_im; |
|
839 symbol->array_specification->accept(*this); |
|
840 current_mode = none_im; |
|
841 } |
|
842 return NULL; |
|
843 } |
|
844 |
|
845 /* VAR [CONSTANT] var_init_decl_list END_VAR */ |
|
846 /* option -> may be NULL ! */ |
|
847 /* helper symbol for input_declarations */ |
|
848 void *visit(var_declarations_c *symbol) { |
|
849 symbol->var_init_decl_list->accept(*this); |
|
850 return NULL; |
|
851 } |
|
852 |
|
853 /* VAR RETAIN var_init_decl_list END_VAR */ |
|
854 void *visit(retentive_var_declarations_c *symbol) { |
|
855 symbol->var_init_decl_list->accept(*this); |
|
856 return NULL; |
|
857 } |
|
858 |
|
859 /* VAR [CONSTANT|RETAIN|NON_RETAIN] located_var_decl_list END_VAR */ |
|
860 /* option -> may be NULL ! */ |
|
861 //SYM_REF2(located_var_declarations_c, option, located_var_decl_list) |
|
862 void *visit(located_var_declarations_c *symbol) { |
|
863 symbol->located_var_decl_list->accept(*this); |
|
864 return NULL; |
|
865 } |
|
866 |
|
867 /* [variable_name] location ':' located_var_spec_init */ |
|
868 /* variable_name -> may be NULL ! */ |
|
869 //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused) |
|
870 void *visit(located_var_decl_c *symbol) { |
|
871 symbol->located_var_spec_init->accept(*this); |
|
872 return NULL; |
|
873 } |
|
874 |
|
875 /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */ |
|
876 /* option -> may be NULL ! */ |
|
877 //SYM_REF2(external_var_declarations_c, option, external_declaration_list) |
|
878 void *visit(external_var_declarations_c *symbol) { |
|
879 symbol->external_declaration_list->accept(*this); |
|
880 return NULL; |
|
881 } |
|
882 |
|
883 /* global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */ |
|
884 //SYM_REF2(external_declaration_c, global_var_name, specification) |
|
885 void *visit(external_declaration_c *symbol) { |
|
886 array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification); |
|
887 if (array_specification != NULL) { |
|
888 current_mode = arrayname_im; |
|
889 symbol->specification->accept(*this); |
|
890 current_mode = none_im; |
|
891 } |
|
892 return NULL; |
|
893 } |
|
894 |
|
895 /*| VAR_GLOBAL [CONSTANT|RETAIN] global_var_decl_list END_VAR */ |
|
896 /* option -> may be NULL ! */ |
|
897 // SYM_REF2(global_var_declarations_c, option, global_var_decl_list) |
|
898 void *visit(global_var_declarations_c *symbol) { |
|
899 symbol->global_var_decl_list->accept(*this); |
|
900 return NULL; |
|
901 } |
|
902 |
|
903 /*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */ |
|
904 /* type_specification ->may be NULL ! */ |
|
905 // SYM_REF2(global_var_decl_c, global_var_spec, type_specification) |
|
906 void *visit(global_var_decl_c *symbol) { |
|
907 array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification); |
|
908 if (array_spec_init != NULL) { |
|
909 current_mode = arrayname_im; |
|
910 symbol->type_specification->accept(*this); |
|
911 current_mode = none_im; |
|
912 } |
|
913 return NULL; |
|
914 } |
|
915 |
|
916 void *visit(function_var_decls_c *symbol) { |
|
917 symbol->decl_list->accept(*this); |
|
918 return NULL; |
|
919 } |
|
920 |
|
921 /*****************************/ |
|
922 /* B 1.5.2 - Function Blocks */ |
|
923 /*****************************/ |
|
924 |
|
925 /* VAR_TEMP temp_var_decl_list END_VAR */ |
|
926 void *visit(temp_var_decls_c *symbol) { |
|
927 symbol->var_decl_list->accept(*this); |
|
928 return NULL; |
|
929 } |
|
930 |
|
931 /* VAR NON_RETAIN var_init_decl_list END_VAR */ |
|
932 void *visit(non_retentive_var_decls_c *symbol) { |
|
933 symbol->var_decl_list->accept(*this); |
|
934 return NULL; |
|
935 } |
|
936 |
|
937 }; |
573 |
938 |
574 |
939 |
575 |
940 |
576 |
941 |
577 /***********************************************************************/ |
942 /***********************************************************************/ |
1874 /***********************************************************************/ |
2240 /***********************************************************************/ |
1875 /***********************************************************************/ |
2241 /***********************************************************************/ |
1876 /***********************************************************************/ |
2242 /***********************************************************************/ |
1877 |
2243 |
1878 class generate_c_c: public iterator_visitor_c { |
2244 class generate_c_c: public iterator_visitor_c { |
|
2245 public: |
|
2246 typedef enum { |
|
2247 none_gm, |
|
2248 datatypes_gm, |
|
2249 pous_gm, |
|
2250 } generate_mode_t; |
|
2251 |
1879 protected: |
2252 protected: |
1880 stage4out_c &s4o; |
2253 stage4out_c &s4o; |
1881 stage4out_c pous_s4o; |
2254 stage4out_c pous_s4o; |
1882 stage4out_c pous_incl_s4o; |
2255 stage4out_c pous_incl_s4o; |
1883 stage4out_c located_variables_s4o; |
2256 stage4out_c located_variables_s4o; |
1884 stage4out_c variables_s4o; |
2257 stage4out_c variables_s4o; |
|
2258 generate_c_datatypes_c generate_c_datatypes; |
1885 generate_c_pous_c generate_c_pous; |
2259 generate_c_pous_c generate_c_pous; |
1886 |
2260 |
1887 symbol_c *current_configuration; |
2261 symbol_c *current_configuration; |
1888 |
2262 |
1889 const char *current_name; |
2263 const char *current_name; |
1890 const char *current_builddir; |
2264 const char *current_builddir; |
1891 |
2265 |
1892 unsigned long long common_ticktime; |
2266 unsigned long long common_ticktime; |
|
2267 |
|
2268 generate_mode_t current_mode; |
1893 |
2269 |
1894 public: |
2270 public: |
1895 generate_c_c(stage4out_c *s4o_ptr, const char *builddir): |
2271 generate_c_c(stage4out_c *s4o_ptr, const char *builddir): |
1896 s4o(*s4o_ptr), |
2272 s4o(*s4o_ptr), |
1897 pous_s4o(builddir, "POUS", "c"), |
2273 pous_s4o(builddir, "POUS", "c"), |
1898 pous_incl_s4o(builddir, "POUS", "h"), |
2274 pous_incl_s4o(builddir, "POUS", "h"), |
1899 located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), |
2275 located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), |
1900 variables_s4o(builddir, "VARIABLES","csv"), |
2276 variables_s4o(builddir, "VARIABLES","csv"), |
|
2277 generate_c_datatypes(&pous_s4o, &pous_incl_s4o), |
1901 generate_c_pous(&pous_s4o, &pous_incl_s4o) { |
2278 generate_c_pous(&pous_s4o, &pous_incl_s4o) { |
1902 current_builddir = builddir; |
2279 current_builddir = builddir; |
1903 current_configuration = NULL; |
2280 current_configuration = NULL; |
|
2281 current_mode = none_gm; |
1904 } |
2282 } |
1905 |
2283 |
1906 ~generate_c_c(void) {} |
2284 ~generate_c_c(void) {} |
1907 |
2285 |
1908 |
2286 |
1953 /*************************/ |
2339 /*************************/ |
1954 /*******************************************/ |
2340 /*******************************************/ |
1955 /* B 1.1 - Letters, digits and identifiers */ |
2341 /* B 1.1 - Letters, digits and identifiers */ |
1956 /*******************************************/ |
2342 /*******************************************/ |
1957 void *visit(identifier_c *symbol) { |
2343 void *visit(identifier_c *symbol) { |
1958 current_name = symbol->value; |
2344 current_name = symbol->value; |
1959 return NULL; |
2345 return NULL; |
1960 } |
2346 } |
1961 |
2347 |
1962 /********************************/ |
2348 /********************************/ |
1963 /* B 1.3.3 - Derived data types */ |
2349 /* B 1.3.3 - Derived data types */ |
1964 /********************************/ |
2350 /********************************/ |
1965 /* TYPE type_declaration_list END_TYPE */ |
2351 /* TYPE type_declaration_list END_TYPE */ |
1966 void *visit(data_type_declaration_c *symbol) { |
2352 void *visit(data_type_declaration_c *symbol) { |
1967 symbol->accept(generate_c_pous); |
2353 switch (current_mode) { |
|
2354 case datatypes_gm: |
|
2355 symbol->accept(generate_c_datatypes); |
|
2356 break; |
|
2357 default: |
|
2358 break; |
|
2359 } |
1968 return NULL; |
2360 return NULL; |
1969 } |
2361 } |
1970 |
2362 |
1971 /**************************************/ |
2363 /**************************************/ |
1972 /* B.1.5 - Program organization units */ |
2364 /* B.1.5 - Program organization units */ |
1973 /**************************************/ |
2365 /**************************************/ |
1974 /***********************/ |
2366 /***********************/ |
1975 /* B 1.5.1 - Functions */ |
2367 /* B 1.5.1 - Functions */ |
1976 /***********************/ |
2368 /***********************/ |
1977 void *visit(function_declaration_c *symbol) { |
2369 void *visit(function_declaration_c *symbol) { |
1978 symbol->accept(generate_c_pous); |
2370 switch (current_mode) { |
1979 return NULL; |
2371 case datatypes_gm: |
|
2372 symbol->var_declarations_list->accept(generate_c_datatypes); |
|
2373 break; |
|
2374 case pous_gm: |
|
2375 symbol->accept(generate_c_pous); |
|
2376 break; |
|
2377 default: |
|
2378 break; |
|
2379 } |
|
2380 return NULL; |
1980 } |
2381 } |
1981 |
2382 |
1982 /*****************************/ |
2383 /*****************************/ |
1983 /* B 1.5.2 - Function Blocks */ |
2384 /* B 1.5.2 - Function Blocks */ |
1984 /*****************************/ |
2385 /*****************************/ |
1985 void *visit(function_block_declaration_c *symbol) { |
2386 void *visit(function_block_declaration_c *symbol) { |
1986 symbol->accept(generate_c_pous); |
2387 switch (current_mode) { |
1987 return NULL; |
2388 case datatypes_gm: |
|
2389 symbol->var_declarations->accept(generate_c_datatypes); |
|
2390 break; |
|
2391 case pous_gm: |
|
2392 symbol->accept(generate_c_pous); |
|
2393 break; |
|
2394 default: |
|
2395 break; |
|
2396 } |
|
2397 return NULL; |
1988 } |
2398 } |
1989 |
2399 |
1990 /**********************/ |
2400 /**********************/ |
1991 /* B 1.5.3 - Programs */ |
2401 /* B 1.5.3 - Programs */ |
1992 /**********************/ |
2402 /**********************/ |
1993 void *visit(program_declaration_c *symbol) { |
2403 void *visit(program_declaration_c *symbol) { |
1994 symbol->accept(generate_c_pous); |
2404 switch (current_mode) { |
1995 return NULL; |
2405 case datatypes_gm: |
|
2406 symbol->var_declarations->accept(generate_c_datatypes); |
|
2407 break; |
|
2408 case pous_gm: |
|
2409 symbol->accept(generate_c_pous); |
|
2410 break; |
|
2411 default: |
|
2412 break; |
|
2413 } |
|
2414 return NULL; |
1996 } |
2415 } |
1997 |
2416 |
1998 |
2417 |
1999 /********************************/ |
2418 /********************************/ |
2000 /* B 1.7 Configuration elements */ |
2419 /* B 1.7 Configuration elements */ |
2001 /********************************/ |
2420 /********************************/ |
2002 void *visit(configuration_declaration_c *symbol) { |
2421 void *visit(configuration_declaration_c *symbol) { |
2003 static int configuration_count = 0; |
2422 switch (current_mode) { |
2004 |
2423 case datatypes_gm: |
2005 if (configuration_count++) { |
2424 if (symbol->global_var_declarations != NULL) |
2006 /* the first configuration is the one we will use!! */ |
2425 symbol->global_var_declarations->accept(generate_c_datatypes); |
2007 ERROR; |
2426 break; |
|
2427 |
|
2428 case pous_gm: |
|
2429 static int configuration_count = 0; |
|
2430 |
|
2431 if (configuration_count++) { |
|
2432 /* the first configuration is the one we will use!! */ |
|
2433 ERROR; |
|
2434 } |
|
2435 |
|
2436 current_configuration = symbol; |
|
2437 |
|
2438 { |
|
2439 calculate_common_ticktime_c calculate_common_ticktime; |
|
2440 symbol->accept(calculate_common_ticktime); |
|
2441 common_ticktime = calculate_common_ticktime.get_common_ticktime(); |
|
2442 if (common_ticktime == 0) { |
|
2443 fprintf(stderr, "\nYou must at least define a periodic task to set cycle period!"); |
|
2444 ERROR; |
|
2445 } |
|
2446 |
|
2447 symbol->configuration_name->accept(*this); |
|
2448 |
|
2449 stage4out_c config_s4o(current_builddir, current_name, "c"); |
|
2450 generate_c_config_c generate_c_config(&config_s4o); |
|
2451 symbol->accept(generate_c_config); |
|
2452 |
|
2453 config_s4o.print("unsigned long long common_ticktime__ = "); |
|
2454 config_s4o.print_long_long_integer(common_ticktime); |
|
2455 config_s4o.print("; /*ns*/\n"); |
|
2456 config_s4o.print("unsigned long greatest_tick_count__ = "); |
|
2457 config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count()); |
|
2458 config_s4o.print("; /*tick*/\n"); |
|
2459 } |
|
2460 |
|
2461 symbol->resource_declarations->accept(*this); |
|
2462 |
|
2463 current_configuration = NULL; |
|
2464 break; |
|
2465 |
|
2466 default: |
|
2467 break; |
2008 } |
2468 } |
2009 |
2469 return NULL; |
2010 current_configuration = symbol; |
2470 } |
2011 |
2471 |
2012 calculate_common_ticktime_c calculate_common_ticktime; |
2472 void *visit(resource_declaration_c *symbol) { |
2013 symbol->accept(calculate_common_ticktime); |
2473 switch (current_mode) { |
2014 common_ticktime = calculate_common_ticktime.get_common_ticktime(); |
2474 case datatypes_gm: |
2015 if (common_ticktime == 0) { |
2475 if (symbol->global_var_declarations != NULL) |
2016 fprintf(stderr, "\nYou must at least define a periodic task to set cycle period!"); |
2476 symbol->global_var_declarations->accept(generate_c_datatypes); |
2017 ERROR; |
2477 break; |
|
2478 case pous_gm: |
|
2479 symbol->resource_name->accept(*this); |
|
2480 { |
|
2481 stage4out_c resources_s4o(current_builddir, current_name, "c"); |
|
2482 generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
|
2483 symbol->accept(generate_c_resources); |
|
2484 } |
|
2485 break; |
|
2486 default: |
|
2487 break; |
2018 } |
2488 } |
2019 |
|
2020 symbol->configuration_name->accept(*this); |
|
2021 stage4out_c config_s4o(current_builddir, current_name, "c"); |
|
2022 generate_c_config_c generate_c_config(&config_s4o); |
|
2023 symbol->accept(generate_c_config); |
|
2024 |
|
2025 config_s4o.print("unsigned long long common_ticktime__ = "); |
|
2026 config_s4o.print_long_long_integer(common_ticktime); |
|
2027 config_s4o.print("; /*ns*/\n"); |
|
2028 config_s4o.print("unsigned long greatest_tick_count__ = "); |
|
2029 config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count()); |
|
2030 config_s4o.print("; /*tick*/\n"); |
|
2031 |
|
2032 symbol->resource_declarations->accept(*this); |
|
2033 |
|
2034 current_configuration = NULL; |
|
2035 |
|
2036 return NULL; |
|
2037 } |
|
2038 |
|
2039 void *visit(resource_declaration_c *symbol) { |
|
2040 symbol->resource_name->accept(*this); |
|
2041 stage4out_c resources_s4o(current_builddir, current_name, "c"); |
|
2042 generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
|
2043 symbol->accept(generate_c_resources); |
|
2044 return NULL; |
2489 return NULL; |
2045 } |
2490 } |
2046 |
2491 |
2047 void *visit(single_resource_declaration_c *symbol) { |
2492 void *visit(single_resource_declaration_c *symbol) { |
2048 stage4out_c resources_s4o(current_builddir, "RESOURCE", "c"); |
2493 switch (current_mode) { |
2049 generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
2494 case pous_gm: |
2050 symbol->accept(generate_c_resources); |
2495 { |
|
2496 stage4out_c resources_s4o(current_builddir, "RESOURCE", "c"); |
|
2497 generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
|
2498 symbol->accept(generate_c_resources); |
|
2499 } |
|
2500 break; |
|
2501 default: |
|
2502 break; |
|
2503 } |
2051 return NULL; |
2504 return NULL; |
2052 } |
2505 } |
2053 |
2506 |
2054 }; |
2507 }; |
2055 |
2508 |