diff -r a7d9e0b8636b -r 9c6c588fd708 absyntax_utils/decompose_var_instance_name.cc --- a/absyntax_utils/decompose_var_instance_name.cc Wed Feb 19 22:25:10 2014 +0100 +++ b/absyntax_utils/decompose_var_instance_name.cc Wed Feb 19 22:27:11 2014 +0100 @@ -52,24 +52,31 @@ next_variable_name = NULL; current_recursive_variable_name = NULL; previously_returned_variable_name = NULL; + current_array_subscript_list = NULL; } -symbol_c *decompose_var_instance_name_c::next_part(bool increment) { +/* Get the next element in the strcutured variable */ +symbol_c *decompose_var_instance_name_c::get_next() { /* We must always start from the top! * See note in the structured_variable_c visitor * to understand why... */ + current_array_subscript_list = NULL; symbol_c *res = (symbol_c *)variable_name->accept(*this); - if (increment) - next_variable_name = current_recursive_variable_name; + next_variable_name = current_recursive_variable_name; if (previously_returned_variable_name == res) - return NULL; - if (increment) - previously_returned_variable_name = res; + return NULL; + + previously_returned_variable_name = res; return res; } +/* If the current element in the structured variable is an array, return its subscript_list, + * otherwise return NULL + */ +list_c *decompose_var_instance_name_c::get_current_arraysubs_list(void) {return current_array_subscript_list;} + /*************************/ /* B.1 - Common elements */ /*************************/ @@ -95,8 +102,14 @@ /* subscripted_variable '[' subscript_list ']' */ // SYM_REF2(array_variable_c, subscripted_variable, subscript_list) void *decompose_var_instance_name_c::visit(array_variable_c *symbol) { - /* NOTE: the subscripted_variable may itself be a structure!, - * so we must recursevily visit! + if (NULL == symbol->subscript_list) ERROR; // array may not have an empty subscript list! + current_array_subscript_list = dynamic_cast(symbol->subscript_list); + if (NULL == current_array_subscript_list) ERROR; // if it does not point to a subscript_list_c, then the abstract syntax tree has been changed, and this code needs to be fixed accordingly! + + /* NOTE: the subscripted_variable may itself be a structure or an array!, so we must recursevily visit! */ + /* the next line will call either: + * - visit(structured_variable_c *) or visit(array_variable_c *), if the array variable is itself an element of another array os structure + * - visit(symbolic_variable_c *) if it is a simple array variable */ return symbol->subscripted_variable->accept(*this); } @@ -131,8 +144,13 @@ return (void *)symbol->field_selector->accept(*this); } + current_array_subscript_list = NULL; current_recursive_variable_name = symbol; - return symbol->record_variable->accept(*this); + /* the next line will call either: + * - visit(structured_variable_c *) or visit(array_variable_c *), if the record variable has more elements to visit + * - visit(symbolic_variable_c *) if it is the last element in the record variable + */ + return symbol->record_variable->accept(*this); } /********************************/