diff -r e8b99f896416 -r 38754701ac41 stage4/generate_cc/generate_cc.cc --- a/stage4/generate_cc/generate_cc.cc Tue Feb 20 18:17:21 2007 +0100 +++ b/stage4/generate_cc/generate_cc.cc Fri Feb 23 19:19:23 2007 +0100 @@ -180,6 +180,7 @@ #include "search_expression_type.cc" #include "generate_cc_base.cc" +#include "generate_cc_sfcdecl.cc" #include "generate_cc_typedecl.cc" #include "generate_cc_vardecl.cc" #include "generate_cc_configbody.cc" @@ -213,59 +214,76 @@ /***********************************************************************/ /* A helper class that knows how to generate code for both the IL and ST languages... */ -class generate_cc_IL_and_ST_c: public null_visitor_c { +class generate_cc_SFC_IL_ST_c: public null_visitor_c { private: stage4out_c *s4o_ptr; symbol_c *scope; const char *variable_prefix; public: - generate_cc_IL_and_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) { - if (NULL == scope) ERROR; - this->s4o_ptr = s4o_ptr; - this->scope = scope; - this->variable_prefix = variable_prefix; - } - - - public: -/****************************************/ -/* B.2 - Language IL (Instruction List) */ -/****************************************/ - -/***********************************/ -/* B 2.1 Instructions and Operands */ -/***********************************/ -/*| instruction_list il_instruction */ -void *visit(instruction_list_c *symbol) { + generate_cc_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL); + /*********************************************/ + /* B.1.6 Sequential function chart elements */ + /*********************************************/ + + /*| sequential_function_chart sfc_network*/ + void *visit(sequential_function_chart_c * symbol); + + /****************************************/ + /* B.2 - Language IL (Instruction List) */ + /****************************************/ + + /***********************************/ + /* B 2.1 Instructions and Operands */ + /***********************************/ + /*| instruction_list il_instruction */ + void *visit(instruction_list_c *symbol); + + /* Remainder implemented in generate_cc_il_c... */ + + /***************************************/ + /* B.3 - Language ST (Structured Text) */ + /***************************************/ + /***********************/ + /* B 3.1 - Expressions */ + /***********************/ + /* Implemented in generate_cc_st_c */ + + /********************/ + /* B 3.2 Statements */ + /********************/ + void *visit(statement_list_c *symbol); + +/* Remainder implemented in generate_cc_st_c... */ +}; + +#include "generate_cc_sfc.cc" + +generate_cc_SFC_IL_ST_c::generate_cc_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix) { + if (NULL == scope) ERROR; + this->s4o_ptr = s4o_ptr; + this->scope = scope; + this->variable_prefix = variable_prefix; +} + +void *generate_cc_SFC_IL_ST_c::visit(sequential_function_chart_c * symbol) { + generate_cc_sfc_c generate_cc_sfc(s4o_ptr, scope, variable_prefix); + generate_cc_sfc.generate(symbol); + return NULL; +} + +void *generate_cc_SFC_IL_ST_c::visit(instruction_list_c *symbol) { generate_cc_il_c generate_cc_il(s4o_ptr, scope, variable_prefix); generate_cc_il.generate(symbol); return NULL; } -/* Remainder implemented in generate_cc_il_c... */ - -/***************************************/ -/* B.3 - Language ST (Structured Text) */ -/***************************************/ -/***********************/ -/* B 3.1 - Expressions */ -/***********************/ -/* Implemented in generate_cc_st_c */ - -/********************/ -/* B 3.2 Statements */ -/********************/ -void *visit(statement_list_c *symbol) { +void *generate_cc_SFC_IL_ST_c::visit(statement_list_c *symbol) { generate_cc_st_c generate_cc_st(s4o_ptr, scope, variable_prefix); generate_cc_st.generate(symbol); return NULL; } -/* Remainder implemented in generate_cc_st_c... */ -}; - - @@ -450,7 +468,7 @@ s4o.print(";\n\n"); /* (C) Function body */ - generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol); + generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol); symbol->function_body->accept(generate_cc_code); s4o.print(s4o.indent_spaces + "return "); symbol->derived_function_name->accept(*this); @@ -543,7 +561,7 @@ s4o.print("\n"); /* (B.3) Function code */ - generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); + generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); symbol->fblock_body->accept(generate_cc_code); s4o.indent_left(); s4o.print(s4o.indent_spaces + "} // "); @@ -602,16 +620,20 @@ /* (A.3) Private internal variables */ s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); vardecl = new generate_cc_vardecl_c(&s4o, - generate_cc_vardecl_c::local_vf, - generate_cc_vardecl_c::temp_vt | - generate_cc_vardecl_c::private_vt | - generate_cc_vardecl_c::located_vt | - generate_cc_vardecl_c::external_vt); + generate_cc_vardecl_c::local_vf, + generate_cc_vardecl_c::temp_vt | + generate_cc_vardecl_c::private_vt | + generate_cc_vardecl_c::located_vt | + generate_cc_vardecl_c::external_vt); vardecl->print(symbol->var_declarations); delete vardecl; s4o.print("\n"); - /* (A.4) Program data structure type name. */ + /* (A.4) Generate private internal variables for SFC*/ + generate_cc_sfcdecl_c generate_cc_sfcdecl(&s4o); + symbol->function_block_body->accept(generate_cc_sfcdecl); + + /* (A.5) Program data structure type name. */ s4o.indent_left(); s4o.print("} "); symbol->program_type_name->accept(*this); @@ -643,7 +665,7 @@ s4o.print("\n"); /* (B.3) Function code */ - generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); + generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); symbol->function_block_body->accept(generate_cc_code); s4o.indent_left(); s4o.print(s4o.indent_spaces + "} // ");