# HG changeset patch # User Mario de Sousa # Date 1349359845 -3600 # Node ID bd1360f29f15b77576eeeda209fca1f87226cf2a # Parent 8ba9ec4bae50fdb808ba2a53b71f9ee4e1eae803# Parent 73b56dc69e610ae030316bba6f7cbea674c69f1d Merge diff -r 8ba9ec4bae50 -r bd1360f29f15 absyntax_utils/search_base_type.cc --- a/absyntax_utils/search_base_type.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/absyntax_utils/search_base_type.cc Thu Oct 04 15:10:45 2012 +0100 @@ -295,6 +295,11 @@ return symbol->structure_specification->accept(*this); } +/* var1_list ':' structure_type_name */ +void *search_base_type_c::visit(structured_var_declaration_c *symbol) { + return symbol; +} + /* structure_type_name ASSIGN structure_initialization */ /* structure_initialization may be NULL ! */ void *search_base_type_c::visit(initialized_structure_c *symbol) { diff -r 8ba9ec4bae50 -r bd1360f29f15 absyntax_utils/search_base_type.hh --- a/absyntax_utils/search_base_type.hh Thu Oct 04 14:30:51 2012 +0100 +++ b/absyntax_utils/search_base_type.hh Thu Oct 04 15:10:45 2012 +0100 @@ -203,6 +203,8 @@ * structure_element_declaration_list_c */ void *visit(structure_type_declaration_c *symbol); + /* var1_list ':' structure_type_name */ + void *visit(structured_var_declaration_c *symbol); /* structure_type_name ASSIGN structure_initialization */ /* structure_initialization may be NULL ! */ void *visit(initialized_structure_c *symbol); diff -r 8ba9ec4bae50 -r bd1360f29f15 lib/iec_std_lib.h --- a/lib/iec_std_lib.h Thu Oct 04 14:30:51 2012 +0100 +++ b/lib/iec_std_lib.h Thu Oct 04 15:10:45 2012 +0100 @@ -100,7 +100,7 @@ #define __DATE_LITERAL(value) __literal(DATE,value) #define __TOD_LITERAL(value) __literal(TOD,value) #define __DT_LITERAL(value) __literal(DT,value) -#define __STRING_LITERAL(count,value) {count,value} +#define __STRING_LITERAL(count,value) (STRING){count,value} #define __BYTE_LITERAL(value) __literal(BYTE,value) #define __WORD_LITERAL(value) __literal(WORD,value) #define __DWORD_LITERAL(value) __literal(DWORD,value,__32b_sufix) diff -r 8ba9ec4bae50 -r bd1360f29f15 lib/iec_types_all.h --- a/lib/iec_types_all.h Thu Oct 04 14:30:51 2012 +0100 +++ b/lib/iec_types_all.h Thu Oct 04 15:10:45 2012 +0100 @@ -131,7 +131,7 @@ typedef struct { BOOL stored; // action storing state. 0 : not stored, 1: stored - BOOL state; // current action state. 0 : inative, 1: active + __IEC_BOOL_t state; // current action state. 0 : inative, 1: active BOOL set; // set have been requested (reset each time the body is evaluated) BOOL reset; // reset have been requested (reset each time the body is evaluated) TIME set_remaining_time; // time before set will be requested diff -r 8ba9ec4bae50 -r bd1360f29f15 stage1_2/iec_bison.yy --- a/stage1_2/iec_bison.yy Thu Oct 04 14:30:51 2012 +0100 +++ b/stage1_2/iec_bison.yy Thu Oct 04 15:10:45 2012 +0100 @@ -1020,6 +1020,8 @@ %token N %token P +%token P0 +%token P1 /* NOTE: the following two clash with the R and S IL operators. * It will have to be handled when we include parsing of SFC... */ @@ -5243,6 +5245,8 @@ | R {$$ = new qualifier_c(strdup("R"), locloc(@$));} | S {$$ = new qualifier_c(strdup("S"), locloc(@$));} | P {$$ = new qualifier_c(strdup("P"), locloc(@$));} +| P0 {$$ = new qualifier_c(strdup("P0"), locloc(@$));} +| P1 {$$ = new qualifier_c(strdup("P1"), locloc(@$));} ; timed_qualifier: diff -r 8ba9ec4bae50 -r bd1360f29f15 stage1_2/iec_flex.ll --- a/stage1_2/iec_flex.ll Thu Oct 04 14:30:51 2012 +0100 +++ b/stage1_2/iec_flex.ll Thu Oct 04 15:10:45 2012 +0100 @@ -1387,6 +1387,8 @@ SL return SL; N return N; P return P; +P0 return P0; +P1 return P1; R return R; S return S; } diff -r 8ba9ec4bae50 -r bd1360f29f15 stage3/constant_folding.cc --- a/stage3/constant_folding.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage3/constant_folding.cc Thu Oct 04 15:10:45 2012 +0100 @@ -332,12 +332,19 @@ real64_t extract_real_value(symbol_c *sym, bool *overflow) { std::string str = ""; real_c *real_sym; + fixed_point_c *fixed_point_sym; char *endptr; real64_t ret; - if ((real_sym = dynamic_cast(sym)) == NULL) ERROR; - for(unsigned int i = 0; i < strlen(real_sym->value); i++) - if (real_sym->value[i] != '_') str += real_sym->value[i]; + if ((real_sym = dynamic_cast(sym)) != NULL) { + for(unsigned int i = 0; i < strlen(real_sym->value); i++) + if (real_sym->value[i] != '_') str += real_sym->value[i]; + } + else if ((fixed_point_sym = dynamic_cast(sym)) != NULL) { + for(unsigned int i = 0; i < strlen(fixed_point_sym->value); i++) + if (fixed_point_sym->value[i] != '_') str += fixed_point_sym->value[i]; + } + else ERROR; errno = 0; // since strtoXX() may legally return 0, we must set errno to 0 to detect errors correctly! #if (real64_t == float) @@ -899,7 +906,15 @@ return NULL; } - +/************************/ +/* B 1.2.3.1 - Duration */ +/********* **************/ +void *constant_folding_c::visit(fixed_point_c *symbol) { + bool overflow; + SET_CVALUE(real64, symbol, extract_real_value(symbol, &overflow)); + if (overflow) SET_OVFLOW(real64, symbol); + return NULL; +} @@ -1158,4 +1173,4 @@ void *constant_folding_c::visit( not_expression_c *symbol) {symbol-> exp->accept(*this); return handle_not(symbol, symbol->exp);} /* TODO: handle function invocations... */ -// void *fill_candidate_datatypes_c::visit(function_invocation_c *symbol) {} \ No newline at end of file +// void *fill_candidate_datatypes_c::visit(function_invocation_c *symbol) {} diff -r 8ba9ec4bae50 -r bd1360f29f15 stage3/constant_folding.hh --- a/stage3/constant_folding.hh Thu Oct 04 14:30:51 2012 +0100 +++ b/stage3/constant_folding.hh Thu Oct 04 15:10:45 2012 +0100 @@ -81,6 +81,11 @@ void *visit(boolean_true_c *symbol); void *visit(boolean_false_c *symbol); + /************************/ + /* B 1.2.3.1 - Duration */ + /********* **************/ + void *visit(fixed_point_c *symbol); + /****************************************/ /* B.2 - Language IL (Instruction List) */ /****************************************/ diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c.cc Thu Oct 04 15:10:45 2012 +0100 @@ -352,12 +352,13 @@ interval_c *interval = dynamic_cast(symbol); duration_c *duration = dynamic_cast(symbol); - if ((NULL == interval) && (NULL == duration)) ERROR; + if ((NULL == interval) && (NULL == duration)) + {STAGE4_ERROR(symbol, symbol, "This type of interval value is not currently supported"); ERROR;} if (NULL != duration) { /* SYM_REF2(duration_c, neg, interval) */ if (duration->neg != NULL) - {STAGE4_ERROR(duration, duration, "Negative TIME literals are not currently supported"); ERROR;} + {STAGE4_ERROR(duration, duration, "Negative TIME literals for interval are not currently supported"); ERROR;} return calculate_time(duration->interval); } diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c_il.cc --- a/stage4/generate_c/generate_c_il.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c_il.cc Thu Oct 04 15:10:45 2012 +0100 @@ -647,17 +647,28 @@ // SYM_REF2(structured_variable_c, record_variable, field_selector) void *visit(structured_variable_c *symbol) { TRACE("structured_variable_c"); + bool type_is_complex = search_var_instance_decl->type_is_complex(symbol->record_variable); switch (wanted_variablegeneration) { case complextype_base_vg: case complextype_base_assignment_vg: symbol->record_variable->accept(*this); + if (!type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } break; case complextype_suffix_vg: - case assignment_vg: - symbol->record_variable->accept(*this); - s4o.print("."); - symbol->field_selector->accept(*this); - break; + symbol->record_variable->accept(*this); + if (type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } + break; + case assignment_vg: + symbol->record_variable->accept(*this); + s4o.print("."); + symbol->field_selector->accept(*this); + break; default: if (this->is_variable_prefix_null()) { symbol->record_variable->accept(*this); diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c_inlinefcall.cc --- a/stage4/generate_c/generate_c_inlinefcall.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c_inlinefcall.cc Thu Oct 04 15:10:45 2012 +0100 @@ -401,15 +401,22 @@ // SYM_REF2(structured_variable_c, record_variable, field_selector) void *visit(structured_variable_c *symbol) { TRACE("structured_variable_c"); + bool type_is_complex = search_var_instance_decl->type_is_complex(symbol->record_variable); if (generating_inlinefunction) { switch (wanted_variablegeneration) { case complextype_base_vg: symbol->record_variable->accept(*this); + if (!type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } break; case complextype_suffix_vg: symbol->record_variable->accept(*this); - s4o.print("."); - symbol->field_selector->accept(*this); + if (type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } break; default: print_getter(symbol); diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c_sfc.cc --- a/stage4/generate_c/generate_c_sfc.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c_sfc.cc Thu Oct 04 15:10:45 2012 +0100 @@ -51,6 +51,7 @@ generate_c_il_c *generate_c_il; generate_c_st_c *generate_c_st; generate_c_SFC_IL_ST_c *generate_c_code; + search_var_instance_decl_c *search_var_instance_decl; int transition_number; std::list transition_list; @@ -66,6 +67,7 @@ generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix); generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix); generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix); + search_var_instance_decl = new search_var_instance_decl_c(scope); this->set_variable_prefix(variable_prefix); } @@ -74,7 +76,16 @@ delete generate_c_il; delete generate_c_st; delete generate_c_code; - } + delete search_var_instance_decl; + } + + + bool is_variable(symbol_c *symbol) { + /* we try to find the variable instance declaration, to determine if symbol is variable... */ + symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); + + return var_decl != NULL; + } void reset_transition_number(void) {transition_number = 0;} @@ -398,11 +409,13 @@ switch (wanted_sfcgeneration) { case actionbody_sg: s4o.print(s4o.indent_spaces + "if("); + s4o.print(GET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__action_list["); s4o.print(SFC_STEP_ACTION_PREFIX); symbol->action_name->accept(*this); - s4o.print("].state) {\n"); + s4o.print("].state)) {\n"); s4o.indent_right(); // generate action code @@ -421,8 +434,8 @@ if (symbol->step_name != NULL) { switch (wanted_sfcgeneration) { case transitiontest_sg: - s4o.print(GET_VAR); - s4o.print("("); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(symbol->step_name, "state"); s4o.print(")"); break; @@ -446,8 +459,8 @@ switch (wanted_sfcgeneration) { case transitiontest_sg: for(int i = 0; i < symbol->n; i++) { - s4o.print(GET_VAR); - s4o.print("("); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(symbol->elements[i], "state"); s4o.print(")"); if (i < symbol->n - 1) { @@ -497,8 +510,10 @@ s4o.print(")) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); - print_action_argument(symbol->action_name, "state"); - s4o.print(" = 1;\n"); + s4o.print(SET_VAR); + s4o.print("("); + print_action_argument(symbol->action_name, "state", true); + s4o.print(",1);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}"); } @@ -519,11 +534,15 @@ strcmp(qualifier, "R") == 0) { s4o.print("active"); } - if (strcmp(qualifier, "P") == 0 || strcmp(qualifier, "SD") == 0 || - strcmp(qualifier, "DS") == 0 || strcmp(qualifier, "SL") == 0) { + else if (strcmp(qualifier, "P") == 0 || strcmp(qualifier, "SD") == 0 || + strcmp(qualifier, "DS") == 0 || strcmp(qualifier, "SL") == 0 || + strcmp(qualifier, "P0") == 0) { s4o.print("activated"); } - if (strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { + else if (strcmp(qualifier, "P1") == 0) { + s4o.print("desactivated"); + } + else if (strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { s4o.print("active && __time_cmp("); print_step_argument(current_step, "elapsed_time"); s4o.print(", "); @@ -539,11 +558,48 @@ s4o.indent_right(); s4o.print(s4o.indent_spaces); if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "P") == 0 || - strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { - print_action_argument(current_action, "state"); - s4o.print(" = 1;\n"); - } - if (strcmp(qualifier, "S") == 0) { + strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0 || + strcmp(qualifier, "P0") == 0 || strcmp(qualifier, "P1") == 0) { + + if (is_variable(current_action)) { + unsigned int vartype = search_var_instance_decl->get_vartype(current_action); + + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); + current_action->accept(*this); + s4o.print(",1);\n"); + s4o.indent_left(); + s4o.print("}\n"); + s4o.print(s4o.indent_spaces + "else if (active) {\n"); + s4o.indent_right(); + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); + current_action->accept(*this); + s4o.print(",0);\n"); + } + + else { + s4o.print(SET_VAR); + s4o.print("("); + print_action_argument(current_action, "state", true); + s4o.print(",1);\n"); + } + } + if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) { print_action_argument(current_action, "set"); s4o.print(" = 1;\n"); } @@ -714,8 +770,10 @@ s4o.print("__nb_actions; i++) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); - print_variable_prefix(); - s4o.print("__action_list[i].state = 0;\n"); + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(",__action_list[i].state,0);\n"); s4o.print(s4o.indent_spaces); print_variable_prefix(); s4o.print("__action_list[i].set = 0;\n"); @@ -834,10 +892,16 @@ s4o.print("__action_list[i].stored = 0;\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces); - print_variable_prefix(); - s4o.print("__action_list[i].state |= "); - print_variable_prefix(); - s4o.print("__action_list[i].stored;\n"); + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(",__action_list[i].state,"); + s4o.print(GET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print("__action_list[i].state) | "); + print_variable_prefix(); + s4o.print("__action_list[i].stored);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n\n"); @@ -846,27 +910,52 @@ { std::list::iterator pt; for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { - symbol_c *var_decl = search_var_instance_decl->get_decl(pt->symbol); - if (var_decl != NULL) { + + if (is_variable(pt->symbol)) { unsigned int vartype = search_var_instance_decl->get_vartype(pt->symbol); - s4o.print(s4o.indent_spaces); - if (vartype == search_var_instance_decl_c::external_vt) - s4o.print(SET_EXTERNAL); - else if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(SET_LOCATED); - else - s4o.print(SET_VAR); - s4o.print("("); - print_variable_prefix(); - s4o.print(","); - pt->symbol->accept(*this); - s4o.print(","); + s4o.print(s4o.indent_spaces + "if ("); print_variable_prefix(); s4o.print("__action_list["); s4o.print(SFC_STEP_ACTION_PREFIX); pt->symbol->accept(*this); - s4o.print("].state);\n"); + s4o.print("].reset) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); + pt->symbol->accept(*this); + s4o.print(",0);\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.print(s4o.indent_spaces + "else if ("); + print_variable_prefix(); + s4o.print("__action_list["); + s4o.print(SFC_STEP_ACTION_PREFIX); + pt->symbol->accept(*this); + s4o.print("].set) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); + pt->symbol->accept(*this); + s4o.print(",1);\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); } } } @@ -889,9 +978,7 @@ } void *visit(action_association_c *symbol) { - symbol_c *var_decl = search_var_instance_decl->get_decl(symbol->action_name); - - if (var_decl != NULL) { + if (is_variable(symbol->action_name)) { std::list::iterator pt; for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { if (!compare_identifiers(pt->symbol, symbol->action_name)) diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c_sfcdecl.cc --- a/stage4/generate_c/generate_c_sfcdecl.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c_sfcdecl.cc Thu Oct 04 15:10:45 2012 +0100 @@ -156,7 +156,7 @@ wanted_sfcdeclaration = sfcinit_sd; /* actions table initialisation */ - s4o.print(s4o.indent_spaces + "static const ACTION temp_action = {0, 0, 0, 0, {0, 0}, {0, 0}};\n"); + s4o.print(s4o.indent_spaces + "static const ACTION temp_action = {0, {0, 0}, 0, 0, {0, 0}, {0, 0}};\n"); s4o.print(s4o.indent_spaces + "for(i = 0; i < "); print_variable_prefix(); s4o.print("__nb_actions; i++) {\n"); @@ -192,6 +192,8 @@ break; case actiondef_sd: s4o.print("// Actions definitions\n"); + for(int i = 0; i < symbol->n; i++) + symbol->elements[i]->accept(*this); { std::list::iterator pt; for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { @@ -204,8 +206,6 @@ action_number++; } } - for(int i = 0; i < symbol->n; i++) - symbol->elements[i]->accept(*this); s4o.print("\n"); break; case stepundef_sd: diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_c_st.cc Thu Oct 04 15:10:45 2012 +0100 @@ -319,12 +319,23 @@ // SYM_REF2(structured_variable_c, record_variable, field_selector) void *visit(structured_variable_c *symbol) { TRACE("structured_variable_c"); + bool type_is_complex = search_var_instance_decl->type_is_complex(symbol->record_variable); switch (wanted_variablegeneration) { case complextype_base_vg: case complextype_base_assignment_vg: symbol->record_variable->accept(*this); + if (!type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } break; case complextype_suffix_vg: + symbol->record_variable->accept(*this); + if (type_is_complex) { + s4o.print("."); + symbol->field_selector->accept(*this); + } + break; case assignment_vg: symbol->record_variable->accept(*this); s4o.print("."); diff -r 8ba9ec4bae50 -r bd1360f29f15 stage4/generate_c/generate_var_list.cc --- a/stage4/generate_c/generate_var_list.cc Thu Oct 04 14:30:51 2012 +0100 +++ b/stage4/generate_c/generate_var_list.cc Thu Oct 04 15:10:45 2012 +0100 @@ -349,7 +349,7 @@ break; } } - + void print_var_number(void) { char str[10]; sprintf(str, "%d", current_var_number); @@ -477,7 +477,7 @@ update_var_type_symbol(symbol->array_spec_init); declare_variables(symbol->var1_list); - + /* 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... @@ -487,6 +487,26 @@ return NULL; } + /* 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"); + /* Start off by setting the current_var_type_symbol and + * current_var_init_symbol private variables... + */ + update_var_type_symbol(symbol->array_specification); + + declare_variables(symbol->var1_list); + + /* 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; + } + /* var1_list ':' initialized_structure */ // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) void *visit(structured_var_init_decl_c *symbol) { @@ -512,6 +532,37 @@ return NULL; } + /* 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"); + /* Please read the comments inside the var1_init_decl_c + * visitor, as they apply here too. + */ + + /* Start off by setting the current_var_type_symbol and + * current_var_init_symbol private variables... + */ + update_var_type_symbol(symbol->structure_type_name); + + /* now to produce the c equivalent... */ + declare_variables(symbol->var1_list); + + /* 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; + } + + /* enumerated_value_list ',' enumerated_value */ + void *visit(enumerated_value_list_c *symbol) { + this->current_var_type_name->accept(*this); + return NULL; + } + /* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */ /* structure_initialization -> may be NULL ! */ void *visit(fb_name_decl_c *symbol) {