# HG changeset patch # User lbessard # Date 1229695769 -3600 # Node ID 59d58f5e6caa33918dcf77e1fab5d4b3af4c6390 # Parent 1e4eb0d48385bcd5c12f93479c7beabf99bdfe26 Adding support for compiling struct data types diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/function_param_iterator.cc --- a/stage4/generate_c/function_param_iterator.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/function_param_iterator.cc Fri Dec 19 15:09:29 2008 +0100 @@ -244,13 +244,16 @@ if (en_declared) ERROR; return (void *)declare_en_param(); } + + /* var1_list ':' array_spec_init */ + //SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) + void *visit(array_var_init_decl_c *symbol) {TRACE("array_var_init_decl_c"); return symbol->var1_list->accept(*this);} + + /* var1_list ':' initialized_structure */ + //SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) + void *visit(structured_var_init_decl_c *symbol) {TRACE("structured_var_init_decl_c"); return symbol->var1_list->accept(*this);} + #if 0 -/* var1_list ':' array_spec_init */ -SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) - -/* var1_list ':' initialized_structure */ -SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) - /* name_list ':' function_block_type_name ASSIGN structure_initialization */ /* structure_initialization -> may be NULL ! */ SYM_REF4(fb_name_decl_c, fb_name_list, function_block_type_name, structure_initialization, unused) @@ -276,15 +279,16 @@ } void *visit(var_declaration_list_c *symbol) {TRACE("var_declaration_list_c"); return iterate_list(symbol);} -#if 0 -/* var1_list ':' array_specification */ -SYM_REF2(array_var_declaration_c, var1_list, array_specification) - -/* var1_list ':' structure_type_name */ -SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name) -#endif - -/* VAR [CONSTANT] var_init_decl_list END_VAR */ + + /* var1_list ':' array_specification */ + //SYM_REF2(array_var_declaration_c, var1_list, array_specification) + void *visit(array_var_declaration_c *symbol) {TRACE("array_var_declaration_c"); return symbol->var1_list->accept(*this);} + + /* var1_list ':' structure_type_name */ + //SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name) + void *visit(structured_var_declaration_c *symbol) {TRACE("structured_var_declaration_c"); return symbol->var1_list->accept(*this);} + + /* VAR [CONSTANT] var_init_decl_list END_VAR */ void *visit(var_declarations_c *symbol) {TRACE("var_declarations_c"); return NULL;} #if 0 diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_c_base.cc --- a/stage4/generate_c/generate_c_base.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_c_base.cc Fri Dec 19 15:09:29 2008 +0100 @@ -87,6 +87,7 @@ ~generate_c_base_c(void) {} void set_variable_prefix(const char *variable_prefix) {variable_prefix_ = variable_prefix;} + const char *get_variable_prefix(void) {return variable_prefix_;} bool is_variable_prefix_null(void) {return variable_prefix_ == NULL;} void print_variable_prefix(void) { if (variable_prefix_ != NULL) diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_c_sfcdecl.cc --- a/stage4/generate_c/generate_c_sfcdecl.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_c_sfcdecl.cc Fri Dec 19 15:09:29 2008 +0100 @@ -166,6 +166,7 @@ s4o.print(s4o.indent_spaces + "}\n"); /* last_ticktime initialisation */ + s4o.print(s4o.indent_spaces); print_variable_prefix(); s4o.print("__lasttick_time = __CURRENT_TIME;\n"); break; diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_c_st.cc Fri Dec 19 15:09:29 2008 +0100 @@ -628,7 +628,9 @@ function_call_param_iterator_c function_call_param_iterator(symbol); for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) { function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction(); - + + fprintf(stderr, "param : %s\n", param_name->value); + /* Get the value from a foo( = ) style call */ symbol_c *param_value = function_call_param_iterator.search(param_name); diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_c_typedecl.cc --- a/stage4/generate_c/generate_c_typedecl.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_c_typedecl.cc Fri Dec 19 15:09:29 2008 +0100 @@ -203,7 +203,7 @@ current_basetypedeclaration = none_bd; s4o_incl.print(" "); symbol->subrange_type_name->accept(*basedecl); - s4o_incl.print(";\n\n"); + s4o_incl.print(";\n"); current_type_name = symbol->subrange_type_name; @@ -376,13 +376,20 @@ return NULL; } -/* array_specification [ASSIGN array_initialization} */ +/* array_specification [ASSIGN array_initialization] */ /* array_initialization may be NULL ! */ void *visit(array_spec_init_c *symbol) { TRACE("array_spec_init_c"); - current_typedefinition = array_td; - symbol->array_specification->accept(*this); - current_typedefinition = none_td; + + identifier_c *array_type_name = dynamic_cast(symbol->array_specification); + + if (array_type_name == NULL) { + current_typedefinition = array_td; + symbol->array_specification->accept(*this); + current_typedefinition = none_td; + } + else + symbol->array_specification->accept(*basedecl); return NULL; } @@ -435,7 +442,7 @@ /* helper symbol for data_type_declaration */ void *visit(type_declaration_list_c *symbol) { TRACE("type_declaration_list_c"); - return print_list(symbol, "", "\n"); + return print_list_incl(symbol, "", "\n", "\n"); } /* simple_type_name ':' simple_spec_init */ @@ -531,6 +538,8 @@ //SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization) void *visit(initialized_structure_c *symbol) { TRACE("initialized_structure_c"); + fprintf(stderr, "initialized_structure_c\n"); + symbol->structure_type_name->accept(*this); return NULL; } @@ -541,15 +550,15 @@ //SYM_LIST(structure_element_declaration_list_c) void *visit(structure_element_declaration_list_c *symbol) { TRACE("structure_element_declaration_list_c"); - s4o.print("struct {\n"); - s4o.indent_right(); - s4o.print(s4o.indent_spaces); - - print_list(symbol); - - s4o.indent_left(); - s4o.print(s4o.indent_spaces); - s4o.print("}"); + s4o_incl.print("struct {\n"); + s4o_incl.indent_right(); + s4o_incl.print(s4o_incl.indent_spaces); + + print_list_incl(symbol, "", s4o_incl.indent_spaces, ""); + + s4o_incl.indent_left(); + s4o_incl.print(s4o_incl.indent_spaces); + s4o_incl.print("}"); return NULL; } @@ -559,10 +568,10 @@ TRACE("structure_element_declaration_c"); symbol->spec_init->accept(*this); - s4o.print(" "); - symbol->structure_element_name->accept(*this); - s4o.print(";\n"); - s4o.print(s4o.indent_spaces); + s4o_incl.print(" "); + symbol->structure_element_name->accept(*basedecl); + s4o_incl.print(";\n"); + s4o_incl.print(s4o.indent_spaces); return NULL; } @@ -575,7 +584,7 @@ TRACE("structure_element_initialization_list_c"); // TODO ??? - ERROR; + //ERROR; return NULL; } @@ -585,7 +594,7 @@ TRACE("structure_element_initialization_c"); // TODO ??? - ERROR; + //ERROR; return NULL; } diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_c_vardecl.cc Fri Dec 19 15:09:29 2008 +0100 @@ -56,25 +56,37 @@ arrayinitialization_mode_t current_mode; + symbol_c* array_base_type; symbol_c* array_default_value; + symbol_c* array_default_initialization; private: - int dimension_number, current_dimension, array_size; + int dimension_number; + int current_dimension; + int array_size; + int defined_values_count; + int current_initialization_count; public: generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} ~generate_c_array_initialization_c(void) {} + void init_array_dimensions(symbol_c *array_specification) { + dimension_number = 0; + current_dimension = 0; + array_size = 1; + defined_values_count = 0; + current_initialization_count = 0; + array_base_type = array_default_value = array_default_initialization = NULL; + + current_mode = dimensioncount_am; + array_specification->accept(*this); + } + void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) { int i; - dimension_number = 0; - current_dimension = 0; - array_size = 1; - array_default_value = NULL; - - current_mode = dimensioncount_am; - array_specification->accept(*this); + init_array_dimensions(array_specification); current_mode = initializationvalue_am; s4o.print("\n"); @@ -86,7 +98,7 @@ s4o.print(s4o.indent_spaces); array_specification->accept(*this); s4o.print(" temp = "); - array_initialization->accept(*this); + init_array_values(array_initialization); s4o.print(";\n"); current_mode = arrayassignment_am; @@ -103,7 +115,23 @@ s4o.indent_left(); s4o.print(s4o.indent_spaces + "}"); } - + + void init_array_values(symbol_c *array_initialization) { + s4o.print("{"); + array_initialization->accept(*this); + if (array_default_initialization != NULL && defined_values_count < array_size) + array_default_initialization->accept(*this); + if (defined_values_count < array_size) { + for (int i = defined_values_count; i < array_size; i++) { + if (defined_values_count > 0) + s4o.print(", "); + array_default_value->accept(*this); + defined_values_count++; + } + } + s4o.print("}"); + } + void *visit(identifier_c *type_name) { symbol_c *type_decl; switch (current_mode) { @@ -150,15 +178,30 @@ /* B 1.3.3 - Derived data types */ /********************************/ + /* array_specification [ASSIGN array_initialization] */ + /* array_initialization may be NULL ! */ + void *visit(array_spec_init_c *symbol) { + switch (current_mode) { + case dimensioncount_am: + array_default_initialization = symbol->array_initialization; + break; + default: + break; + } + symbol->array_specification->accept(*this); + return NULL; + } + /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ void *visit(array_specification_c *symbol) { + symbol->array_subrange_list->accept(*this); switch (current_mode) { case dimensioncount_am: - symbol->array_subrange_list->accept(*this); + array_base_type = symbol->non_generic_type_name; array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());; + if (array_default_value == NULL) ERROR; break; default: - symbol->array_subrange_list->accept(*this); break; } return NULL; @@ -196,25 +239,24 @@ void *visit(array_initial_elements_list_c *symbol) { switch (current_mode) { case initializationvalue_am: - int i; - - s4o.print("{"); - for (i = 0; i < symbol->n; i++) { - if (i > 0) - s4o.print(", "); - symbol->elements[i]->accept(*this); - array_size--; + current_initialization_count = 0; + for (int i = 0; i < symbol->n; i++) { + if (current_initialization_count >= defined_values_count) { + if (defined_values_count >= array_size) + ERROR; + if (defined_values_count > 0) + s4o.print(", "); + symbol->elements[i]->accept(*this); + defined_values_count++; + } + else { + array_initial_elements_c *array_initial_element = dynamic_cast(symbol->elements[i]); + + if (array_initial_element != NULL) + symbol->elements[i]->accept(*this); + } + current_initialization_count++; } - if (array_size > 0) { - if (symbol->n > 0) - s4o.print(", "); - for (i = 0; i < array_size; i++) { - if (i > 0) - s4o.print(", "); - array_default_value->accept(*this); - } - } - s4o.print("}"); break; default: break; @@ -230,17 +272,32 @@ switch (current_mode) { case initializationvalue_am: initial_element_number = extract_integer(symbol->integer); - + if (current_initialization_count < defined_values_count) { + int temp_element_number = 0; + int diff = defined_values_count - current_initialization_count; + if (diff <= initial_element_number) + temp_element_number = initial_element_number - diff; + current_initialization_count += initial_element_number - 1; + initial_element_number = temp_element_number; + if (initial_element_number > 0) { + defined_values_count++; + s4o.print(", "); + } + } + else + current_initialization_count += initial_element_number - 1; + if (defined_values_count + initial_element_number > array_size) + ERROR; for (int i = 0; i < initial_element_number; i++) { if (i > 0) s4o.print(", "); if (symbol->array_initial_element != NULL) symbol->array_initial_element->accept(*this); - else if (array_default_value != NULL) + else array_default_value->accept(*this); } if (initial_element_number > 1) - array_size -= initial_element_number - 1; + defined_values_count += initial_element_number - 1; break; default: break; @@ -248,6 +305,7 @@ return NULL; } + void *visit(structure_element_initialization_list_c *symbol); }; /***********************************************************************/ @@ -259,6 +317,334 @@ /***********************************************************************/ /***********************************************************************/ +/* given a structure_element_declaration_list_c, iterate + * through each element, returning the name + * of each element...structure_element_iterator_c + */ +class structure_element_iterator_c : public null_visitor_c { + + private: + /* a pointer to the structure_element_declaration_list_c + * currently being analysed. + */ + symbol_c *type_decl; + int next_element, element_count; + identifier_c *current_element_name; + symbol_c *current_element_type; + symbol_c *current_element_default_value; + + + public: + /* start off at the first parameter once again... */ + void reset(void) { + next_element = element_count = 0; + current_element_name = NULL; + current_element_type = current_element_default_value = NULL; + } + + /* initialise the iterator object. + * We must be given a reference to the function declaration + * that will be analysed... + */ + structure_element_iterator_c(symbol_c *type_decl) { + this->type_decl = type_decl; + reset(); + } + + /* Skip to the next element. After object creation, + * the object references on + * element _before_ the first, so + * this function must be called once to get the object to + * reference the first element... + * + * Returns the element's name! + */ + identifier_c *next(void) { + void *res; + identifier_c *identifier; + element_count = 0; + next_element++; + res = type_decl->accept(*this); + if (res != NULL) { + symbol_c *sym = (symbol_c *)res; + identifier = dynamic_cast(sym); + if (identifier == NULL) + ERROR; + } + else + return NULL; + + current_element_name = identifier; + return current_element_name; + } + + /* Returns the currently referenced element's default value, + * or NULL if none is specified in the structure declaration itself. + */ + symbol_c *default_value(void) { + return current_element_default_value; + } + + /* Returns the currently referenced element's type name. */ + symbol_c *element_type(void) { + return current_element_type; + } + +/********************************/ +/* B 1.3.3 - Derived data types */ +/********************************/ + + /* helper symbol for structure_declaration */ + /* structure_element_declaration_list structure_element_declaration ';' */ + void *visit(structure_element_declaration_list_c *symbol) { + void *res; + for (int i = 0; i < symbol->n; i++) { + res = symbol->elements[i]->accept(*this); + if (res != NULL) + return res; + } + return NULL; + } + + /* structure_element_name ':' *_spec_init */ + void *visit(structure_element_declaration_c *symbol) { + element_count++; + if (next_element == element_count) { + current_element_default_value = spec_init_sperator_c::get_init(symbol->spec_init); + current_element_type = spec_init_sperator_c::get_spec(symbol->spec_init); + return symbol->structure_element_name; + } + /* not yet the desired element... */ + return NULL; + } + +}; + +/* + * Structure init element iterator. + * It will search through the elements of a structure initialization + */ +class structure_init_element_iterator_c : public null_visitor_c { + private: + /* a pointer to the structure initialization + * currently being analysed. + */ + symbol_c *structure_initialization; + identifier_c *search_element_name; + + public: + /* initialise the iterator object. + * We must be given a reference to the structure initialization + * that will be analysed... + */ + structure_init_element_iterator_c(symbol_c *structure_initialization) { + this->structure_initialization = structure_initialization; + search_element_name = NULL; + } + + /* Search for the value passed to the element named ... */ + symbol_c *search(symbol_c *element_name) { + if (NULL == element_name) ERROR; + search_element_name = dynamic_cast(element_name); + if (NULL == search_element_name) ERROR; + void *res = structure_initialization->accept(*this); + return (symbol_c *)res; + } + + /* helper symbol for structure_initialization */ + /* structure_element_initialization_list ',' structure_element_initialization */ + void *visit(structure_element_initialization_list_c *symbol) { + void *res; + for (int i = 0; i < symbol->n; i++) { + res = symbol->elements[i]->accept(*this); + if (res != NULL) + return res; + } + return NULL; + } + + /* structure_element_name ASSIGN value */ + void *visit(structure_element_initialization_c *symbol) { + identifier_c *element_name = dynamic_cast(symbol->structure_element_name); + + if (element_name == NULL) ERROR; + + if (strcasecmp(search_element_name->value, element_name->value) == 0) + /* FOUND! This is the same element!! */ + return (void *)symbol->value; + return NULL; + } +}; + +class generate_c_structure_initialization_c: public generate_c_typedecl_c { + + public: + typedef enum { + none_sm, + typedecl_sm, + initializationvalue_sm, + varlistparse_sm + } structureinitialization_mode_t; + + structureinitialization_mode_t current_mode; + + private: + symbol_c* structure_type_decl; + symbol_c* current_element_type; + + public: + generate_c_structure_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} + ~generate_c_structure_initialization_c(void) {} + + void init_structure_default(symbol_c *structure_type_name) { + structure_type_decl = NULL; + current_element_type = NULL; + + current_mode = typedecl_sm; + structure_type_name->accept(*this); + } + + void init_structure(symbol_c *var1_list, symbol_c *structure_type_name, symbol_c *structure_initialization) { + int i; + + init_structure_default(structure_type_name); + + current_mode = initializationvalue_sm; + s4o.print("\n"); + s4o.print(s4o.indent_spaces + "{\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + structure_type_name->accept(*this); + s4o.print(" temp = "); + structure_initialization->accept(*this); + s4o.print(";\n"); + + current_mode = varlistparse_sm; + var1_list->accept(*this); + + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}"); + } + + void *visit(identifier_c *type_name) { + symbol_c *type_decl; + switch (current_mode) { + case typedecl_sm: + /* look up the type declaration... */ + type_decl = type_symtable.find_value(type_name); + if (type_decl == type_symtable.end_value()) + /* Type declaration not found!! */ + ERROR; + type_decl->accept(*this); + break; + default: + print_token(type_name); + break; + } + return NULL; + } + + void *visit(var1_list_c *symbol) { + int i, j; + + for (i = 0; i < symbol->n; i++) { + s4o.print(s4o.indent_spaces); + print_variable_prefix(); + symbol->elements[i]->accept(*this); + s4o.print(" = temp;\n"); + } + return NULL; + } + +/********************************/ +/* B 1.3.3 - Derived data types */ +/********************************/ + + /* helper symbol for structure_declaration */ + /* structure_element_declaration_list structure_element_declaration ';' */ + void *visit(structure_element_declaration_list_c *symbol) { + switch (current_mode) { + case typedecl_sm: + structure_type_decl = (symbol_c *)symbol; + break; + default: + break; + } + return NULL; + } + + /* helper symbol for structure_initialization */ + /* structure_element_initialization_list ',' structure_element_initialization */ + void *visit(structure_element_initialization_list_c *symbol) { + s4o.print("{"); + structure_element_iterator_c structure_iterator(structure_type_decl); + + identifier_c *element_name; + structure_init_element_iterator_c structure_init_element_iterator(symbol); + for(int i = 1; (element_name = structure_iterator.next()) != NULL; i++) { + if (i > 1) + s4o.print(", "); + + /* Get the value from an initialization */ + symbol_c *element_value = structure_init_element_iterator.search(element_name); + + if (element_value == NULL) { + /* No value given for parameter, so we must use the default... */ + /* First check whether default value specified in function declaration...*/ + element_value = structure_iterator.default_value(); + current_element_type = structure_iterator.element_type(); + } + + if (element_value == NULL) { + if (current_element_type == NULL) ERROR; + + /* If not, get the default value of this variable's type */ + element_value = (symbol_c *)current_element_type->accept(*type_initial_value_c::instance()); + } + + if (element_value == NULL) ERROR; + + element_value->accept(*this); + } + s4o.print("}"); + return NULL; + } + + /* helper symbol for array_initialization */ + /* array_initial_elements_list ',' array_initial_elements */ + void *visit(array_initial_elements_list_c *symbol) { + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->set_variable_prefix(get_variable_prefix()); + array_initialization->init_array_dimensions(current_element_type); + array_initialization->current_mode = generate_c_array_initialization_c::initializationvalue_am; + array_initialization->init_array_values(symbol); + delete array_initialization; + return NULL; + } + +}; + + +/* helper symbol for array_initialization */ +/* structure_element_initialization_list ',' structure_element_initialization */ +void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) { + generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); + structure_initialization->set_variable_prefix(get_variable_prefix()); + structure_initialization->init_structure_default(array_base_type); + structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; + symbol->accept(*structure_initialization); + delete structure_initialization; + return NULL; +} + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ @@ -413,8 +799,6 @@ private: - generate_c_array_initialization_c *generate_c_array_initialization; - /* variable used to store the types of variables that need to be processed... */ /* Only set in the constructor...! */ /* Will contain a set of values of generate_c_vardecl_c::XXXX_vt */ @@ -583,7 +967,6 @@ public: generate_c_vardecl_c(stage4out_c *s4o_ptr, varformat_t varformat, unsigned int vartype, symbol_c* res_name = NULL) : generate_c_typedecl_c(s4o_ptr) { - generate_c_array_initialization = new generate_c_array_initialization_c(s4o_ptr); wanted_varformat = varformat; wanted_vartype = vartype; current_vartype = none_vt; @@ -596,9 +979,7 @@ eno_declared = false; } - ~generate_c_vardecl_c(void) { - delete generate_c_array_initialization; - } + ~generate_c_vardecl_c(void) {} bool is_en_declared(void) { return en_declared; @@ -610,7 +991,6 @@ void print(symbol_c *symbol, symbol_c *scope = NULL, const char *variable_prefix = NULL) { this->set_variable_prefix(variable_prefix); - this->generate_c_array_initialization->set_variable_prefix(variable_prefix); if (globalinit_vf == wanted_varformat) globalnamespace = scope; @@ -793,8 +1173,12 @@ update_type_init(symbol->array_spec_init); /* now to produce the c equivalent... */ - if (wanted_varformat == constructorinit_vf) - generate_c_array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); + if (wanted_varformat == constructorinit_vf) { + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->set_variable_prefix(get_variable_prefix()); + array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); + delete array_initialization; + } else symbol->var1_list->accept(*this); @@ -821,7 +1205,14 @@ update_type_init(symbol->initialized_structure); /* now to produce the c equivalent... */ - symbol->var1_list->accept(*this); + if (wanted_varformat == constructorinit_vf) { + generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); + structure_initialization->set_variable_prefix(get_variable_prefix()); + structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); + delete structure_initialization; + } + else + symbol->var1_list->accept(*this); /* Values no longer in scope, and therefore no longer used. * Make an effort to keep them set to NULL when not in use @@ -949,8 +1340,15 @@ */ update_type_init(symbol->structure_type_name); - /* now to produce the c equivalent... */ - symbol->var1_list->accept(*this); + if (wanted_varformat == constructorinit_vf) { + generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); + structure_initialization->set_variable_prefix(get_variable_prefix()); + structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); + delete structure_initialization; + } + else + /* now to produce the c equivalent... */ + symbol->var1_list->accept(*this); /* Values no longer in scope, and therefore no longer used. * Make an effort to keep them set to NULL when not in use diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/generate_var_list.cc --- a/stage4/generate_c/generate_var_list.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/generate_var_list.cc Fri Dec 19 15:09:29 2008 +0100 @@ -65,9 +65,21 @@ } declarationtype_t; declarationtype_t current_declarationtype; - + + typedef enum { + none_vtc, + variable_vtc, + pointer_vtc, + array_vtc, + structure_vtc, + function_block_vtc + } vartypecategory_t; + + vartypecategory_t current_var_type_category; + private: symbol_c *current_var_type_symbol; + symbol_c *current_var_type_name; unsigned int current_var_number; unsigned int step_number; unsigned int transition_number; @@ -82,24 +94,34 @@ : generate_c_typedecl_c(s4o_ptr) { search_fb_typedecl = new search_fb_typedecl_c(scope); current_var_number = 0; - current_var_type_symbol = NULL; + current_var_type_symbol = current_var_type_name = NULL; current_declarationtype = none_dt; + current_var_type_category = none_vtc; } ~generate_var_list_c(void) { delete search_fb_typedecl; } - void update_var_type_symbol(symbol_c *symbol, bool is_fb = false) { - - this->current_var_type_symbol = spec_init_sperator_c::get_spec(symbol); - if (this->current_var_type_symbol == NULL) + void update_var_type_symbol(symbol_c *symbol) { + + this->current_var_type_name = spec_init_sperator_c::get_spec(symbol); + if (this->current_var_type_name == NULL) ERROR; - if (is_fb) - this->current_var_type_symbol = search_fb_typedecl->get_decl(this->current_var_type_symbol); - else - this->current_var_type_symbol = (symbol_c *)(this->current_var_type_symbol->accept(search_base_type)); + this->current_var_type_symbol = search_fb_typedecl->get_decl(this->current_var_type_name); + if (this->current_var_type_symbol != NULL) + this->current_var_type_category = function_block_vtc; + else { + this->current_var_type_symbol = (symbol_c *)(this->current_var_type_name->accept(search_base_type)); + + structure_element_declaration_list_c *structure_symbol = dynamic_cast(this->current_var_type_symbol); + if (structure_symbol != NULL) + this->current_var_type_category = structure_vtc; + else + this->current_var_type_category = variable_vtc; + } + if (this->current_var_type_symbol == NULL) ERROR; } @@ -128,20 +150,36 @@ s4o.print("\n"); } - void declare_variables(symbol_c *symbol, const char* type = "VAR") { + void declare_variables(symbol_c *symbol) { list_c *list = dynamic_cast(symbol); /* should NEVER EVER occur!! */ if (list == NULL) ERROR; for(int i = 0; i < list->n; i++) { - declare_variable(list->elements[i], type); - } - } - - void declare_variable(symbol_c *symbol, const char* type = "VAR") { + declare_variable(list->elements[i]); + } + } + + void declare_variable(symbol_c *symbol) { print_var_number(); s4o.print(";"); - s4o.print(type); + switch (this->current_var_type_category) { + case pointer_vtc: + s4o.print("PT"); + break; + case array_vtc: + s4o.print("ARRAY"); + break; + case structure_vtc: + s4o.print("STRUCT"); + break; + case function_block_vtc: + s4o.print("FB"); + break; + default: + s4o.print("VAR"); + break; + } s4o.print(";"); print_symbol_list(); symbol->accept(*this); @@ -149,17 +187,26 @@ print_symbol_list(); symbol->accept(*this); s4o.print(";"); - if (strcmp(type, "FB") == 0) { - SYMBOL *current_name; - current_name = new SYMBOL; - current_name->symbol = symbol; - current_symbol_list.push_back(*current_name); - this->current_var_type_symbol->accept(*this); - current_symbol_list.pop_back(); - } - else { - this->current_var_type_symbol->accept(*this); - s4o.print(";\n"); + switch (this->current_var_type_category) { + case structure_vtc: + case function_block_vtc: + this->current_var_type_name->accept(*this); + s4o.print(";\n"); + SYMBOL *current_name; + current_name = new SYMBOL; + current_name->symbol = symbol; + current_symbol_list.push_back(*current_name); + this->current_var_type_symbol->accept(*this); + current_symbol_list.pop_back(); + break; + case array_vtc: + this->current_var_type_name->accept(*this); + s4o.print(";\n"); + break; + default: + this->current_var_type_symbol->accept(*this); + s4o.print(";\n"); + break; } } @@ -209,8 +256,10 @@ */ update_var_type_symbol(symbol->located_var_spec_init); - if (symbol->variable_name != NULL) - declare_variable(symbol->variable_name, "PT"); + if (symbol->variable_name != NULL) { + this->current_var_type_category = pointer_vtc; + declare_variable(symbol->variable_name); + } current_var_type_symbol = NULL; return NULL; @@ -224,7 +273,8 @@ * current_var_init_symbol private variables... */ update_var_type_symbol(symbol->array_spec_init); - + + this->current_var_type_category = array_vtc; declare_variables(symbol->var1_list); /* Values no longer in scope, and therefore no longer used. @@ -272,10 +322,10 @@ /* Start off by setting the current_var_type_symbol and * current_var_init_symbol private variables... */ - update_var_type_symbol(symbol, true); + update_var_type_symbol(symbol); /* now to produce the c equivalent... */ - declare_variables(symbol->fb_name_list, "FB"); + declare_variables(symbol->fb_name_list); /* Values no longer in scope, and therefore no longer used. * Make an effort to keep them set to NULL when not in use @@ -297,14 +347,12 @@ /* Start off by setting the current_var_type_symbol and * current_var_init_symbol private variables... */ - this->current_var_type_symbol = (symbol_c *)(symbol->specification->accept(*search_fb_typedecl)); - if (this->current_var_type_symbol == NULL) { - this->current_var_type_symbol = symbol->specification; - - declare_variable(symbol->global_var_name, "PT"); - } - else - declare_variable(symbol->global_var_name, "FB"); + update_var_type_symbol(symbol); + + /* now to produce the c equivalent... */ + if (this->current_var_type_category == variable_vtc) + this->current_var_type_category = pointer_vtc; + declare_variable(symbol->global_var_name); /* Values no longer in scope, and therefore no longer used. * Make an effort to keep them set to NULL when not in use @@ -350,7 +398,8 @@ // SYM_REF2(global_var_spec_c, global_var_name, location) void *visit(global_var_spec_c *symbol) { if (symbol->global_var_name != NULL) - declare_variable(symbol->global_var_name, "PT"); + this->current_var_type_category = pointer_vtc; + declare_variable(symbol->global_var_name); return NULL; } @@ -381,6 +430,31 @@ return NULL; } + void *visit(structure_element_declaration_list_c *symbol) { + for(int i = 0; i < symbol->n; i++) { + symbol->elements[i]->accept(*this); + } + return NULL; + } + + void *visit(structure_element_declaration_c *symbol) { + /* Start off by setting the current_var_type_symbol and + * current_var_init_symbol private variables... + */ + update_var_type_symbol(symbol->spec_init); + + /* now to produce the c equivalent... */ + declare_variable(symbol->structure_element_name); + + /* Values no longer in scope, and therefore no longer used. + * Make an effort to keep them set to NULL when not in use + * in order to catch bugs as soon as possible... + */ + reset_var_type_symbol(); + + return NULL; + } + /**************************************/ /* B.1.5 - Program organization units */ /**************************************/ @@ -397,8 +471,6 @@ /*****************************/ void *visit(function_block_declaration_c *symbol) { if (current_declarationtype == variables_dt && configuration_defined) { - symbol->fblock_name->accept(*this); - s4o.print(";\n"); symbol->var_declarations->accept(*this); symbol->fblock_body->accept(*this); } @@ -410,8 +482,6 @@ /**********************/ void *visit(program_declaration_c *symbol) { if (current_declarationtype == variables_dt && configuration_defined) { - symbol->program_type_name->accept(*this); - s4o.print(";\n"); symbol->var_declarations->accept(*this); symbol->function_block_body->accept(*this); } @@ -552,9 +622,9 @@ /* Start off by setting the current_var_type_symbol and * current_var_init_symbol private variables... */ - update_var_type_symbol(symbol->program_type_name, true); + update_var_type_symbol(symbol->program_type_name); - declare_variable(symbol->program_name, "FB"); + declare_variable(symbol->program_name); /* Values no longer in scope, and therefore no longer used. * Make an effort to keep them set to NULL when not in use diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/search_base_type.cc --- a/stage4/generate_c/search_base_type.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/search_base_type.cc Fri Dec 19 15:09:29 2008 +0100 @@ -203,7 +203,7 @@ /* structure_element_declaration_list structure_element_declaration ';' */ void *visit(structure_element_declaration_list_c *symbol) { if (NULL == this->current_type_name) ERROR; - return (void *)this->current_type_name; + return (void *)symbol; } /* structure_element_name ':' *_spec_init */ diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/search_varfb_instance_type.cc --- a/stage4/generate_c/search_varfb_instance_type.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/search_varfb_instance_type.cc Fri Dec 19 15:09:29 2008 +0100 @@ -72,7 +72,7 @@ */ symbol_c *var_name_part = decompose_var_instance_name->next_part(); if (NULL == var_name_part) ERROR; - + /* Now we try to find the variable instance declaration, to determine its type... */ symbol_c *var_decl = search_var_instance_decl.get_decl(var_name_part); if (NULL == var_decl) { @@ -185,11 +185,17 @@ /* array_specification [ASSIGN array_initialization} */ /* array_initialization may be NULL ! */ void *visit(array_spec_init_c *symbol) { + symbol_c *var_name = decompose_var_instance_name->next_part(); + if (NULL != var_name) + current_structelement_name = var_name; return symbol->array_specification->accept(*this); } /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ void *visit(array_specification_c *symbol) { + symbol_c *var_name = decompose_var_instance_name->next_part(); + if (NULL != var_name) + current_structelement_name = var_name; return symbol->non_generic_type_name->accept(*this); } @@ -241,7 +247,9 @@ /* helper symbol for structure_declaration */ /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ /* structure_element_declaration_list structure_element_declaration ';' */ - void *visit(structure_element_declaration_list_c *symbol) {return visit_list(symbol);} + void *visit(structure_element_declaration_list_c *symbol) { + return visit_list(symbol); + } /* structure_element_name ':' spec_init */ void *visit(structure_element_declaration_c *symbol) { diff -r 1e4eb0d48385 -r 59d58f5e6caa stage4/generate_c/type_initial_value.cc --- a/stage4/generate_c/type_initial_value.cc Mon Dec 15 17:23:48 2008 +0100 +++ b/stage4/generate_c/type_initial_value.cc Fri Dec 19 15:09:29 2008 +0100 @@ -227,7 +227,7 @@ } /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ void *visit(array_specification_c *symbol) { - symbol_c *init_value = (symbol_c *)symbol->non_generic_type_name->accept(*this); + //symbol_c *init_value = (symbol_c *)symbol->non_generic_type_name->accept(*this); /* Now build a array_initial_elements_list_c list, and populate it * with 1 element of the array_initial_elements_c class @@ -250,12 +250,12 @@ * in something else... */ // NOTE: We are leaking memory, as the integer will never get free'd!! - integer_c *integer = new integer_c("1"); + //integer_c *integer = new integer_c("1"); // NOTE: We are leaking memory, as the array_initial_elements will never get free'd!! - array_initial_elements_c *array_initial_elements = new array_initial_elements_c(integer, init_value); + //array_initial_elements_c *array_initial_elements = new array_initial_elements_c(integer, init_value); // NOTE: We are leaking memory, as the array_initial_elements_list will never get free'd!! array_initial_elements_list_c *array_initial_elements_list = new array_initial_elements_list_c(); - array_initial_elements_list->add_element(array_initial_elements); + //array_initial_elements_list->add_element(array_initial_elements); return array_initial_elements_list; } /* helper symbol for array_specification */ @@ -277,11 +277,16 @@ void *visit(structure_type_declaration_c *symbol) {return NULL;} /* structure_type_name ASSIGN structure_initialization */ /* structure_initialization may be NULL ! */ - void *visit(initialized_structure_c *symbol) {return NULL;} + void *visit(initialized_structure_c *symbol) { + return handle_type_spec(symbol->structure_type_name, symbol->structure_initialization); + } /* helper symbol for structure_declaration */ /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ /* structure_element_declaration_list structure_element_declaration ';' */ - void *visit(structure_element_declaration_list_c *symbol) {return NULL;} + void *visit(structure_element_declaration_list_c *symbol) { + structure_element_initialization_list_c *structure_element_initialization_list = new structure_element_initialization_list_c(); + return structure_element_initialization_list; + } /* structure_element_name ':' *_spec_init */ void *visit(structure_element_declaration_c *symbol) {return NULL;} /* helper symbol for structure_initialization */