619 public: |
619 public: |
620 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
620 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
621 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused) |
621 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused) |
622 void *visit(function_block_declaration_c *symbol) { |
622 void *visit(function_block_declaration_c *symbol) { |
623 generate_cc_vardecl_c *vardecl; |
623 generate_cc_vardecl_c *vardecl; |
|
624 generate_cc_sfcdecl_c *sfcdecl; |
624 TRACE("function_block_declaration_c"); |
625 TRACE("function_block_declaration_c"); |
625 |
626 |
626 /* start off by adding this declaration to the global |
627 /* start off by adding this declaration to the global |
627 * function block declaration symbol table... |
628 * function block declaration symbol table... |
628 */ |
629 */ |
653 generate_cc_vardecl_c::private_vt | |
654 generate_cc_vardecl_c::private_vt | |
654 generate_cc_vardecl_c::located_vt | |
655 generate_cc_vardecl_c::located_vt | |
655 generate_cc_vardecl_c::external_vt); |
656 generate_cc_vardecl_c::external_vt); |
656 vardecl->print(symbol->var_declarations); |
657 vardecl->print(symbol->var_declarations); |
657 delete vardecl; |
658 delete vardecl; |
|
659 /* (A.4) Generate private internal variables for SFC */ |
|
660 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcdecl_sd); |
|
661 sfcdecl->print(symbol->fblock_body); |
|
662 delete sfcdecl; |
658 s4o.print("\n"); |
663 s4o.print("\n"); |
659 |
664 |
660 /* (A.4) Function Block data structure type name. */ |
665 /* (A.5) Function Block data structure type name. */ |
661 s4o.indent_left(); |
666 s4o.indent_left(); |
662 s4o.print("} "); |
667 s4o.print("} "); |
663 symbol->fblock_name->accept(*this); |
668 symbol->fblock_name->accept(*this); |
664 s4o.print(";\n\n"); |
669 s4o.print(";\n\n"); |
665 |
670 |
686 generate_cc_vardecl_c::output_vt | |
691 generate_cc_vardecl_c::output_vt | |
687 generate_cc_vardecl_c::inoutput_vt | |
692 generate_cc_vardecl_c::inoutput_vt | |
688 generate_cc_vardecl_c::private_vt | |
693 generate_cc_vardecl_c::private_vt | |
689 generate_cc_vardecl_c::located_vt | |
694 generate_cc_vardecl_c::located_vt | |
690 generate_cc_vardecl_c::external_vt); |
695 generate_cc_vardecl_c::external_vt); |
691 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
696 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
692 delete vardecl; |
697 delete vardecl; |
|
698 s4o.print("\n"); |
|
699 /* (B.3) Generate private internal variables for SFC */ |
|
700 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcinit_sd); |
|
701 sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->"); |
|
702 delete sfcdecl; |
693 s4o.indent_left(); |
703 s4o.indent_left(); |
694 s4o.print("\n" + s4o.indent_spaces + "}\n\n"); |
704 s4o.print(s4o.indent_spaces + "}\n\n"); |
695 |
705 |
696 |
706 |
697 /* (C) Function with FB body */ |
707 /* (C) Function with FB body */ |
698 /* (C.1) Function declaration */ |
708 /* (C.1) Step definitions */ |
|
709 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepdef_sd); |
|
710 sfcdecl->print(symbol->fblock_body); |
|
711 delete sfcdecl; |
|
712 |
|
713 /* (C.2) Action definitions */ |
|
714 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actiondef_sd); |
|
715 sfcdecl->print(symbol->fblock_body); |
|
716 delete sfcdecl; |
|
717 |
|
718 /* (C.3) Function declaration */ |
699 s4o.print("// Code part\n"); |
719 s4o.print("// Code part\n"); |
700 /* function interface */ |
720 /* function interface */ |
701 s4o.print("void "); |
721 s4o.print("void "); |
702 symbol->fblock_name->accept(*this); |
722 symbol->fblock_name->accept(*this); |
703 s4o.print(FB_FUNCTION_SUFFIX); |
723 s4o.print(FB_FUNCTION_SUFFIX); |
707 s4o.print(" *"); |
727 s4o.print(" *"); |
708 s4o.print(FB_FUNCTION_PARAM); |
728 s4o.print(FB_FUNCTION_PARAM); |
709 s4o.print(") {\n"); |
729 s4o.print(") {\n"); |
710 s4o.indent_right(); |
730 s4o.indent_right(); |
711 |
731 |
712 /* (C.2) Initialize TEMP variables */ |
732 /* (C.4) Initialize TEMP variables */ |
713 /* function body */ |
733 /* function body */ |
714 s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
734 s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
715 vardecl = new generate_cc_vardecl_c(&s4o, |
735 vardecl = new generate_cc_vardecl_c(&s4o, |
716 generate_cc_vardecl_c::init_vf, |
736 generate_cc_vardecl_c::init_vf, |
717 generate_cc_vardecl_c::temp_vt); |
737 generate_cc_vardecl_c::temp_vt); |
718 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
738 vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
719 delete vardecl; |
739 delete vardecl; |
720 s4o.print("\n"); |
740 s4o.print("\n"); |
721 |
741 |
722 /* (C.3) Function code */ |
742 /* (C.5) Function code */ |
723 generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
743 generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
724 symbol->fblock_body->accept(generate_cc_code); |
744 symbol->fblock_body->accept(generate_cc_code); |
725 s4o.indent_left(); |
745 s4o.indent_left(); |
726 s4o.print(s4o.indent_spaces + "} // "); |
746 s4o.print(s4o.indent_spaces + "} // "); |
727 symbol->fblock_name->accept(*this); |
747 symbol->fblock_name->accept(*this); |
728 s4o.print(FB_FUNCTION_SUFFIX); |
748 s4o.print(FB_FUNCTION_SUFFIX); |
729 s4o.print(s4o.indent_spaces + "() \n\n"); |
749 s4o.print(s4o.indent_spaces + "() \n\n"); |
|
750 |
|
751 /* (C.6) Step undefinitions */ |
|
752 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepundef_sd); |
|
753 sfcdecl->print(symbol->fblock_body); |
|
754 delete sfcdecl; |
|
755 |
|
756 /* (C.7) Action undefinitions */ |
|
757 sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actionundef_sd); |
|
758 sfcdecl->print(symbol->fblock_body); |
|
759 delete sfcdecl; |
730 |
760 |
731 s4o.indent_left(); |
761 s4o.indent_left(); |
732 s4o.print("\n\n\n\n"); |
762 s4o.print("\n\n\n\n"); |
733 |
763 |
734 return NULL; |
764 return NULL; |