547 s4o.print(s4o.indent_spaces + "} // "); |
549 s4o.print(s4o.indent_spaces + "} // "); |
548 symbol->fblock_name->accept(*this); |
550 symbol->fblock_name->accept(*this); |
549 s4o.print(FB_FUNCTION_SUFFIX); |
551 s4o.print(FB_FUNCTION_SUFFIX); |
550 s4o.print(s4o.indent_spaces + "() \n\n"); |
552 s4o.print(s4o.indent_spaces + "() \n\n"); |
551 |
553 |
552 |
554 s4o.indent_left(); |
553 |
555 s4o.print("\n\n\n\n"); |
554 |
556 |
555 |
557 return NULL; |
556 |
558 } |
557 |
559 |
558 #if 0 |
560 |
559 |
561 /* The remaining temp_var_decls_c, temp_var_decls_list_c |
560 +++++++++++++++++++++++++++++++++++++ |
562 * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class |
561 s4o.print(s4o.indent_spaces + "class "); |
563 */ |
562 symbol->fblock_name->accept(*this); |
564 |
563 s4o.print(" {\n"); |
565 |
564 s4o.indent_right(); |
566 /**********************/ |
565 |
567 /* B 1.5.3 - Programs */ |
566 /* (A.2) Public variables: i.e. the function parameters... */ |
568 /**********************/ |
567 s4o.print(s4o.indent_spaces + "public:\n"); |
569 |
568 s4o.indent_right(); |
570 |
|
571 |
|
572 public: |
|
573 /* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */ |
|
574 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused) |
|
575 void *visit(program_declaration_c *symbol) { |
|
576 generate_cc_vardecl_c *vardecl; |
|
577 TRACE("program_declaration_c"); |
|
578 |
|
579 /* start off by adding this declaration to the global |
|
580 * program declaration symbol table... |
|
581 */ |
|
582 program_type_symtable.insert(symbol->program_type_name, symbol); |
|
583 |
|
584 /* (A) Program data structure declaration... */ |
|
585 /* (A.1) Data structure declaration */ |
|
586 s4o.print("// PROGRAM "); |
|
587 symbol->program_type_name->accept(*this); |
|
588 s4o.print("\n// Data part\n"); |
|
589 s4o.print("typedef struct {\n"); |
|
590 s4o.indent_right(); |
|
591 |
|
592 /* (A.2) Public variables: i.e. the program parameters... */ |
|
593 s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n"); |
569 vardecl = new generate_cc_vardecl_c(&s4o, |
594 vardecl = new generate_cc_vardecl_c(&s4o, |
570 generate_cc_vardecl_c::local_vf, |
595 generate_cc_vardecl_c::local_vf, |
571 generate_cc_vardecl_c::input_vt | |
596 generate_cc_vardecl_c::input_vt | |
572 generate_cc_vardecl_c::output_vt | |
597 generate_cc_vardecl_c::output_vt | |
573 generate_cc_vardecl_c::inoutput_vt); |
598 generate_cc_vardecl_c::inoutput_vt); |
574 vardecl->print(symbol->var_declarations); |
599 vardecl->print(symbol->var_declarations); |
575 delete vardecl; |
600 delete vardecl; |
576 s4o.indent_left(); |
|
577 s4o.print("\n"); |
601 s4o.print("\n"); |
578 |
|
579 /* (A.3) Private internal variables */ |
602 /* (A.3) Private internal variables */ |
580 s4o.print(s4o.indent_spaces + "private:\n"); |
603 s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); |
581 s4o.indent_right(); |
|
582 vardecl = new generate_cc_vardecl_c(&s4o, |
604 vardecl = new generate_cc_vardecl_c(&s4o, |
583 generate_cc_vardecl_c::local_vf, |
605 generate_cc_vardecl_c::local_vf, |
584 generate_cc_vardecl_c::private_vt | |
606 generate_cc_vardecl_c::temp_vt | |
585 generate_cc_vardecl_c::located_vt); |
|
586 vardecl->print(symbol->var_declarations); |
|
587 delete vardecl; |
|
588 s4o.indent_left(); |
|
589 s4o.print("\n"); |
|
590 |
|
591 --------------------------------- |
|
592 /* (B) Constructor */ |
|
593 s4o.print(s4o.indent_spaces + "public:\n"); |
|
594 s4o.indent_right(); |
|
595 s4o.print(s4o.indent_spaces); |
|
596 symbol->fblock_name->accept(*this); |
|
597 s4o.print("(void)\n"); |
|
598 s4o.indent_right(); |
|
599 s4o.print(s4o.indent_spaces); |
|
600 vardecl = new generate_cc_vardecl_c(&s4o, |
|
601 generate_cc_vardecl_c::constructorinit_vf, |
|
602 generate_cc_vardecl_c::input_vt | |
|
603 generate_cc_vardecl_c::output_vt | |
|
604 generate_cc_vardecl_c::inoutput_vt | |
|
605 generate_cc_vardecl_c::private_vt); |
|
606 vardecl->print(symbol->var_declarations); |
|
607 delete vardecl; |
|
608 s4o.print("\n" + s4o.indent_spaces + "{}\n\n"); |
|
609 s4o.indent_left(); |
|
610 s4o.indent_left(); |
|
611 --------------------------------- |
|
612 |
|
613 |
|
614 /* (C) Public Function*/ |
|
615 /* (C.1) Public Function declaration */ |
|
616 s4o.print(s4o.indent_spaces + "public:\n"); |
|
617 s4o.indent_right(); |
|
618 s4o.print(s4o.indent_spaces + "void f(void) {\n"); |
|
619 |
|
620 /* (C.2) Temporary variables */ |
|
621 s4o.indent_right(); |
|
622 vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt); |
|
623 vardecl->print(symbol->var_declarations); |
|
624 delete vardecl; |
|
625 s4o.indent_left(); |
|
626 s4o.print("\n"); |
|
627 |
|
628 /* (C.3) Public Function body */ |
|
629 s4o.indent_right(); |
|
630 this->current_scope = symbol; |
|
631 symbol->fblock_body->accept(*this); |
|
632 this->current_scope = NULL; |
|
633 s4o.indent_left(); |
|
634 s4o.print(s4o.indent_spaces + "} /* f() */\n\n"); |
|
635 s4o.indent_left(); |
|
636 |
|
637 /* (D) Close the class declaration... */ |
|
638 s4o.indent_left(); |
|
639 s4o.print(s4o.indent_spaces + "}; /* class "); |
|
640 symbol->fblock_name->accept(*this); |
|
641 s4o.print(" */\n"); |
|
642 |
|
643 --------------------------------- |
|
644 /* (E) Initialise the static member variables... */ |
|
645 vardecl = new generate_cc_vardecl_c(&s4o, |
|
646 generate_cc_vardecl_c::globalinit_vf, |
|
647 generate_cc_vardecl_c::located_vt); |
|
648 vardecl->print(symbol->var_declarations, symbol->fblock_name); |
|
649 delete vardecl; |
|
650 |
|
651 #endif |
|
652 |
|
653 s4o.indent_left(); |
|
654 s4o.print("\n\n\n\n"); |
|
655 |
|
656 return NULL; |
|
657 } |
|
658 |
|
659 |
|
660 /* The remaining temp_var_decls_c, temp_var_decls_list_c |
|
661 * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class |
|
662 */ |
|
663 |
|
664 |
|
665 /**********************/ |
|
666 /* B 1.5.3 - Programs */ |
|
667 /**********************/ |
|
668 |
|
669 |
|
670 |
|
671 public: |
|
672 /* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */ |
|
673 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused) |
|
674 void *visit(program_declaration_c *symbol) { |
|
675 generate_cc_vardecl_c *vardecl; |
|
676 TRACE("program_declaration_c"); |
|
677 |
|
678 /* start off by adding this declaration to the global |
|
679 * program declaration symbol table... |
|
680 */ |
|
681 program_type_symtable.insert(symbol->program_type_name, symbol); |
|
682 |
|
683 /* (A) Class (Function Block) declaration... */ |
|
684 /* (A.1) Class (Function Block) name */ |
|
685 s4o.print("// PROGRAM\n"); |
|
686 s4o.print(s4o.indent_spaces); |
|
687 symbol->program_type_name->accept(*this); |
|
688 s4o.print("\n //Data part\n"); |
|
689 s4o.print("typedef struct {\n"); |
|
690 s4o.indent_right(); |
|
691 |
|
692 /* (A.2) Public variables: i.e. the program parameters... */ |
|
693 s4o.print(s4o.indent_spaces + "//PROGRAM interface IN OUT IN_OUT variables\n"); |
|
694 s4o.indent_right(); |
|
695 vardecl = new generate_cc_vardecl_c(&s4o, |
|
696 generate_cc_vardecl_c::local_vf, |
|
697 generate_cc_vardecl_c::input_vt | |
|
698 generate_cc_vardecl_c::output_vt | |
|
699 generate_cc_vardecl_c::inoutput_vt); |
|
700 vardecl->print(symbol->var_declarations); |
|
701 delete vardecl; |
|
702 s4o.indent_left(); |
|
703 s4o.print("\n"); |
|
704 |
|
705 /* (A.3) Private internal variables */ |
|
706 s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); |
|
707 s4o.indent_right(); |
|
708 vardecl = new generate_cc_vardecl_c(&s4o, |
|
709 generate_cc_vardecl_c::local_vf, |
|
710 generate_cc_vardecl_c::private_vt | |
607 generate_cc_vardecl_c::private_vt | |
711 generate_cc_vardecl_c::located_vt | |
608 generate_cc_vardecl_c::located_vt | |
712 generate_cc_vardecl_c::external_vt); |
609 generate_cc_vardecl_c::external_vt); |
713 vardecl->print(symbol->var_declarations); |
610 vardecl->print(symbol->var_declarations); |
714 delete vardecl; |
611 delete vardecl; |
715 s4o.print("\n "); |
612 s4o.print("\n"); |
|
613 |
|
614 /* (A.4) Program data structure type name. */ |
716 s4o.indent_left(); |
615 s4o.indent_left(); |
717 s4o.print("} "); |
616 s4o.print("} "); |
718 symbol->program_type_name->accept(*this); |
617 symbol->program_type_name->accept(*this); |
719 s4o.print(";\n\n "); |
618 s4o.print(";\n\n"); |
720 /* (B) Constructor */ |
619 |
721 /* (B.1) Constructor name... */ |
620 /* (B) Function with PROGRAM body */ |
722 s4o.print("// Code part"); |
621 /* (B.1) Function declaration */ |
723 /*PROGRAM Interface*/ |
622 s4o.print("// Code part\n"); |
724 s4o.indent_right(); |
623 /* function interface */ |
725 s4o.print(s4o.indent_spaces); |
|
726 s4o.print("void "); |
624 s4o.print("void "); |
727 symbol->program_type_name->accept(*this); |
625 symbol->program_type_name->accept(*this); |
728 s4o.print(FB_FUNCTION_SUFFIX); |
626 s4o.print(FB_FUNCTION_SUFFIX); |
729 /* (B.2) Constructor parameters (i.e. the external variables)... */ |
|
730 s4o.print("("); |
627 s4o.print("("); |
|
628 /* first and only parameter is a pointer to the data */ |
731 symbol->program_type_name->accept(*this); |
629 symbol->program_type_name->accept(*this); |
732 s4o.indent_right(); |
630 s4o.print(" *"); |
733 s4o.print(" "); |
631 s4o.print(FB_FUNCTION_PARAM); |
|
632 s4o.print(") {\n"); |
|
633 s4o.indent_right(); |
|
634 |
|
635 /* (B.2) Initialize TEMP variables */ |
|
636 /* function body */ |
|
637 s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
734 vardecl = new generate_cc_vardecl_c(&s4o, |
638 vardecl = new generate_cc_vardecl_c(&s4o, |
735 generate_cc_vardecl_c::finterface_vf, |
639 generate_cc_vardecl_c::init_vf, |
736 generate_cc_vardecl_c::external_vt); |
640 generate_cc_vardecl_c::temp_vt); |
737 vardecl->print(symbol->var_declarations); |
641 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
738 delete vardecl; |
642 delete vardecl; |
739 s4o.print(")"); |
|
740 s4o.print("{\n"); |
|
741 s4o.indent_left(); |
|
742 |
|
743 /* (B.2) Member initializations... */ |
|
744 s4o.indent_right(); |
|
745 s4o.print(s4o.indent_spaces + "//Initialise PROGRAM variables\n"); |
|
746 vardecl = new generate_cc_vardecl_c(&s4o, |
|
747 generate_cc_vardecl_c::constructorinit_vf, |
|
748 generate_cc_vardecl_c::input_vt | |
|
749 generate_cc_vardecl_c::output_vt | |
|
750 generate_cc_vardecl_c::inoutput_vt | |
|
751 generate_cc_vardecl_c::private_vt | |
|
752 generate_cc_vardecl_c::external_vt); |
|
753 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
|
754 delete vardecl; |
|
755 s4o.print("\n" + s4o.indent_spaces); |
|
756 s4o.indent_left(); |
|
757 s4o.indent_left(); |
|
758 |
|
759 /* (C) Public Function*/ |
|
760 /* (C.1) Public Function declaration */ |
|
761 s4o.print(s4o.indent_spaces); |
|
762 //s4o.indent_right(); |
|
763 //s4o.print(s4o.indent_spaces + "void f(void) {\n"); |
|
764 |
|
765 /* (C.2) Temporary variables */ |
|
766 //s4o.indent_right(); |
|
767 //vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt); |
|
768 //vardecl->print(symbol->var_declarations); |
|
769 //delete vardecl; |
|
770 //s4o.indent_left(); |
|
771 s4o.print("\n"); |
643 s4o.print("\n"); |
772 |
644 |
773 /* (C.3) Public Function body */ |
645 /* (B.3) Function code */ |
774 s4o.indent_right(); |
|
775 generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
646 generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
776 symbol->function_block_body->accept(generate_cc_code); |
647 symbol->function_block_body->accept(generate_cc_code); |
777 s4o.indent_left(); |
648 s4o.indent_left(); |
778 s4o.print(s4o.indent_spaces + "} //"); |
649 s4o.print(s4o.indent_spaces + "} // "); |
779 symbol->program_type_name->accept(*this); |
650 symbol->program_type_name->accept(*this); |
780 s4o.print(FB_FUNCTION_SUFFIX); |
651 s4o.print(FB_FUNCTION_SUFFIX); |
781 s4o.print("()\n"); |
652 s4o.print(s4o.indent_spaces + "() \n\n"); |
782 s4o.indent_left(); |
653 |
783 |
654 s4o.indent_left(); |
784 /* (D) Close the class declaration... */ |
|
785 s4o.indent_left(); |
|
786 s4o.print(s4o.indent_spaces + "}; /* void "); |
|
787 symbol->program_type_name->accept(*this); |
|
788 s4o.print(" */\n\n\n"); |
|
789 |
|
790 /* (E) Initialise the static member variables... */ |
|
791 vardecl = new generate_cc_vardecl_c(&s4o, |
|
792 generate_cc_vardecl_c::globalinit_vf, |
|
793 generate_cc_vardecl_c::located_vt); |
|
794 vardecl->print(symbol->var_declarations, symbol->program_type_name); |
|
795 delete vardecl; |
|
796 s4o.print("\n\n\n\n"); |
655 s4o.print("\n\n\n\n"); |
797 |
656 |
798 return NULL; |
657 return NULL; |
799 } |
658 } |
800 |
659 |