--- 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 + "} // ");