--- a/stage4/generate_cc/generate_cc.cc Wed Feb 14 19:57:01 2007 +0100
+++ b/stage4/generate_cc/generate_cc.cc Tue Feb 20 18:17:21 2007 +0100
@@ -38,6 +38,7 @@
// #include <stdio.h> /* required for NULL */
#include <string>
#include <iostream>
+#include <typeinfo>
#include "../../util/symtable.hh"
#include "../../util/dsymtable.hh"
@@ -176,6 +177,7 @@
#include "decompose_var_instance_name.cc"
#include "search_varfb_instance_type.cc"
#include "search_constant_type.cc"
+#include "search_expression_type.cc"
#include "generate_cc_base.cc"
#include "generate_cc_typedecl.cc"
@@ -523,7 +525,7 @@
symbol->fblock_name->accept(*this);
s4o.print(FB_FUNCTION_SUFFIX);
s4o.print("(");
- /* first and only parameter is a pointer to the data */
+ /* first and only parameter is a pointer to the data */
symbol->fblock_name->accept(*this);
s4o.print(" *");
s4o.print(FB_FUNCTION_PARAM);
@@ -549,23 +551,46 @@
s4o.print(FB_FUNCTION_SUFFIX);
s4o.print(s4o.indent_spaces + "() \n\n");
-
-
-
-
-
-
-#if 0
-
-+++++++++++++++++++++++++++++++++++++
- s4o.print(s4o.indent_spaces + "class ");
- symbol->fblock_name->accept(*this);
- s4o.print(" {\n");
- s4o.indent_right();
-
- /* (A.2) Public variables: i.e. the function parameters... */
- s4o.print(s4o.indent_spaces + "public:\n");
- s4o.indent_right();
+ s4o.indent_left();
+ s4o.print("\n\n\n\n");
+
+ return NULL;
+}
+
+
+/* The remaining temp_var_decls_c, temp_var_decls_list_c
+ * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
+ */
+
+
+/**********************/
+/* B 1.5.3 - Programs */
+/**********************/
+
+
+
+public:
+/* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
+//SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
+void *visit(program_declaration_c *symbol) {
+ generate_cc_vardecl_c *vardecl;
+ TRACE("program_declaration_c");
+
+ /* start off by adding this declaration to the global
+ * program declaration symbol table...
+ */
+ program_type_symtable.insert(symbol->program_type_name, symbol);
+
+ /* (A) Program data structure declaration... */
+ /* (A.1) Data structure declaration */
+ s4o.print("// PROGRAM ");
+ symbol->program_type_name->accept(*this);
+ s4o.print("\n// Data part\n");
+ s4o.print("typedef struct {\n");
+ s4o.indent_right();
+
+ /* (A.2) Public variables: i.e. the program parameters... */
+ s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n");
vardecl = new generate_cc_vardecl_c(&s4o,
generate_cc_vardecl_c::local_vf,
generate_cc_vardecl_c::input_vt |
@@ -573,226 +598,60 @@
generate_cc_vardecl_c::inoutput_vt);
vardecl->print(symbol->var_declarations);
delete vardecl;
- s4o.indent_left();
s4o.print("\n");
-
/* (A.3) Private internal variables */
- s4o.print(s4o.indent_spaces + "private:\n");
- s4o.indent_right();
+ 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::private_vt |
- generate_cc_vardecl_c::located_vt);
- vardecl->print(symbol->var_declarations);
- delete vardecl;
- s4o.indent_left();
- s4o.print("\n");
-
----------------------------------
- /* (B) Constructor */
- s4o.print(s4o.indent_spaces + "public:\n");
- s4o.indent_right();
- s4o.print(s4o.indent_spaces);
- symbol->fblock_name->accept(*this);
- s4o.print("(void)\n");
- s4o.indent_right();
- s4o.print(s4o.indent_spaces);
- vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::constructorinit_vf,
- generate_cc_vardecl_c::input_vt |
- generate_cc_vardecl_c::output_vt |
- generate_cc_vardecl_c::inoutput_vt |
- generate_cc_vardecl_c::private_vt);
- vardecl->print(symbol->var_declarations);
- delete vardecl;
- s4o.print("\n" + s4o.indent_spaces + "{}\n\n");
- s4o.indent_left();
- s4o.indent_left();
----------------------------------
-
-
- /* (C) Public Function*/
- /* (C.1) Public Function declaration */
- s4o.print(s4o.indent_spaces + "public:\n");
- s4o.indent_right();
- s4o.print(s4o.indent_spaces + "void f(void) {\n");
-
- /* (C.2) Temporary variables */
- s4o.indent_right();
- vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
- vardecl->print(symbol->var_declarations);
- delete vardecl;
- s4o.indent_left();
- s4o.print("\n");
-
- /* (C.3) Public Function body */
- s4o.indent_right();
- this->current_scope = symbol;
- symbol->fblock_body->accept(*this);
- this->current_scope = NULL;
- s4o.indent_left();
- s4o.print(s4o.indent_spaces + "} /* f() */\n\n");
- s4o.indent_left();
-
- /* (D) Close the class declaration... */
- s4o.indent_left();
- s4o.print(s4o.indent_spaces + "}; /* class ");
- symbol->fblock_name->accept(*this);
- s4o.print(" */\n");
-
----------------------------------
- /* (E) Initialise the static member variables... */
- vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::globalinit_vf,
- generate_cc_vardecl_c::located_vt);
- vardecl->print(symbol->var_declarations, symbol->fblock_name);
- delete vardecl;
-
-#endif
-
- s4o.indent_left();
- s4o.print("\n\n\n\n");
-
- return NULL;
-}
-
-
-/* The remaining temp_var_decls_c, temp_var_decls_list_c
- * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
- */
-
-
-/**********************/
-/* B 1.5.3 - Programs */
-/**********************/
-
-
-
-public:
-/* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
-//SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
-void *visit(program_declaration_c *symbol) {
- generate_cc_vardecl_c *vardecl;
- TRACE("program_declaration_c");
-
- /* start off by adding this declaration to the global
- * program declaration symbol table...
- */
- program_type_symtable.insert(symbol->program_type_name, symbol);
-
- /* (A) Class (Function Block) declaration... */
- /* (A.1) Class (Function Block) name */
- s4o.print("// PROGRAM\n");
- s4o.print(s4o.indent_spaces);
- symbol->program_type_name->accept(*this);
- s4o.print("\n //Data part\n");
- s4o.print("typedef struct {\n");
- s4o.indent_right();
-
- /* (A.2) Public variables: i.e. the program parameters... */
- s4o.print(s4o.indent_spaces + "//PROGRAM interface IN OUT IN_OUT variables\n");
- s4o.indent_right();
- vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::local_vf,
- generate_cc_vardecl_c::input_vt |
- generate_cc_vardecl_c::output_vt |
- generate_cc_vardecl_c::inoutput_vt);
- vardecl->print(symbol->var_declarations);
- delete vardecl;
- s4o.indent_left();
- s4o.print("\n");
-
- /* (A.3) Private internal variables */
- s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
- s4o.indent_right();
- 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::external_vt);
vardecl->print(symbol->var_declarations);
delete vardecl;
- s4o.print("\n ");
+ s4o.print("\n");
+
+ /* (A.4) Program data structure type name. */
s4o.indent_left();
s4o.print("} ");
symbol->program_type_name->accept(*this);
- s4o.print(";\n\n ");
- /* (B) Constructor */
- /* (B.1) Constructor name... */
- s4o.print("// Code part");
- /*PROGRAM Interface*/
- s4o.indent_right();
- s4o.print(s4o.indent_spaces);
+ s4o.print(";\n\n");
+
+ /* (B) Function with PROGRAM body */
+ /* (B.1) Function declaration */
+ s4o.print("// Code part\n");
+ /* function interface */
s4o.print("void ");
symbol->program_type_name->accept(*this);
s4o.print(FB_FUNCTION_SUFFIX);
- /* (B.2) Constructor parameters (i.e. the external variables)... */
s4o.print("(");
+ /* first and only parameter is a pointer to the data */
symbol->program_type_name->accept(*this);
- s4o.indent_right();
- s4o.print(" ");
+ s4o.print(" *");
+ s4o.print(FB_FUNCTION_PARAM);
+ s4o.print(") {\n");
+ s4o.indent_right();
+
+ /* (B.2) Initialize TEMP variables */
+ /* function body */
+ s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::finterface_vf,
- generate_cc_vardecl_c::external_vt);
- vardecl->print(symbol->var_declarations);
- delete vardecl;
- s4o.print(")");
- s4o.print("{\n");
- s4o.indent_left();
-
- /* (B.2) Member initializations... */
- s4o.indent_right();
- s4o.print(s4o.indent_spaces + "//Initialise PROGRAM variables\n");
- vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::constructorinit_vf,
- generate_cc_vardecl_c::input_vt |
- generate_cc_vardecl_c::output_vt |
- generate_cc_vardecl_c::inoutput_vt |
- generate_cc_vardecl_c::private_vt |
- generate_cc_vardecl_c::external_vt);
- vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
- delete vardecl;
- s4o.print("\n" + s4o.indent_spaces);
- s4o.indent_left();
- s4o.indent_left();
-
- /* (C) Public Function*/
- /* (C.1) Public Function declaration */
- s4o.print(s4o.indent_spaces);
- //s4o.indent_right();
- //s4o.print(s4o.indent_spaces + "void f(void) {\n");
-
- /* (C.2) Temporary variables */
- //s4o.indent_right();
- //vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
- //vardecl->print(symbol->var_declarations);
- //delete vardecl;
- //s4o.indent_left();
+ generate_cc_vardecl_c::init_vf,
+ generate_cc_vardecl_c::temp_vt);
+ vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
+ delete vardecl;
s4o.print("\n");
- /* (C.3) Public Function body */
- s4o.indent_right();
+ /* (B.3) Function code */
generate_cc_IL_and_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 + "} //");
+ s4o.print(s4o.indent_spaces + "} // ");
symbol->program_type_name->accept(*this);
s4o.print(FB_FUNCTION_SUFFIX);
- s4o.print("()\n");
- s4o.indent_left();
-
- /* (D) Close the class declaration... */
- s4o.indent_left();
- s4o.print(s4o.indent_spaces + "}; /* void ");
- symbol->program_type_name->accept(*this);
- s4o.print(" */\n\n\n");
-
- /* (E) Initialise the static member variables... */
- vardecl = new generate_cc_vardecl_c(&s4o,
- generate_cc_vardecl_c::globalinit_vf,
- generate_cc_vardecl_c::located_vt);
- vardecl->print(symbol->var_declarations, symbol->program_type_name);
- delete vardecl;
+ s4o.print(s4o.indent_spaces + "() \n\n");
+
+ s4o.indent_left();
s4o.print("\n\n\n\n");
return NULL;