From: Joel E. Denny Date: Mon, 28 May 2007 01:09:11 +0000 (+0000) Subject: Don't depend on C99 features. X-Git-Tag: v2.3b~122 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/14462c2b1b55540d78ce1f1dc4fe67fcd1c701ac Don't depend on C99 features. * src/conflicts.c (conflicts_update_state_numbers): Fix for-loop. * src/lalr.c (lalr_update_state_numbers): Fix for-loop. * src/reader.c (check_and_convert_grammar): Fix for-loop. * src/state.c (state_mark_reachable_states): Fix for-loop. (state_remove_unreachable_states): Fix for-loop. Don't widen struct state with member reachable just to temporarily record reachability. Instead, use a local bitset. * src/state.h (struct state): Remove member. * src/state.c (state_new): Don't initialize it. (state_mark_reachable_states): Rename to... (state_record_reachable_states): ... this, and use bitset. (state_remove_unreachable_states): Use bitset. --- diff --git a/ChangeLog b/ChangeLog index 6eeb9d4f..1449cd1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2007-05-27 Joel E. Denny + + Don't depend on C99 features. + * src/conflicts.c (conflicts_update_state_numbers): Fix for-loop. + * src/lalr.c (lalr_update_state_numbers): Fix for-loop. + * src/reader.c (check_and_convert_grammar): Fix for-loop. + * src/state.c (state_mark_reachable_states): Fix for-loop. + (state_remove_unreachable_states): Fix for-loop. + + Don't widen struct state with member reachable just to temporarily + record reachability. Instead, use a local bitset. + * src/state.h (struct state): Remove member. + * src/state.c (state_new): Don't initialize it. + (state_mark_reachable_states): Rename to... + (state_record_reachable_states): ... this, and use bitset. + (state_remove_unreachable_states): Use bitset. + 2007-05-26 Joel E. Denny * src/Makefile.am (yacc): Quote target action commands properly so diff --git a/src/conflicts.c b/src/conflicts.c index cb7f13a6..f74604fa 100644 --- a/src/conflicts.c +++ b/src/conflicts.c @@ -331,7 +331,8 @@ void conflicts_update_state_numbers (state_number old_to_new[], state_number nstates_old) { - for (state_number i = 0; i < nstates_old; ++i) + state_number i; + for (i = 0; i < nstates_old; ++i) if (old_to_new[i] != nstates_old) conflicts[old_to_new[i]] = conflicts[i]; } diff --git a/src/lalr.c b/src/lalr.c index f7560552..af6ac9ef 100644 --- a/src/lalr.c +++ b/src/lalr.c @@ -459,22 +459,25 @@ lalr_update_state_numbers (state_number old_to_new[], state_number nstates_old) goto_number ngotos_reachable = 0; symbol_number nonterminal = 0; aver (nsyms == nvars + ntokens); - for (goto_number i = 0; i < ngotos; ++i) - { - while (i == goto_map[nonterminal]) - goto_map[nonterminal++] = ngotos_reachable; - /* If old_to_new[from_state[i]] = nstates_old, remove this goto - entry. */ - if (old_to_new[from_state[i]] != nstates_old) - { - /* from_state[i] is not removed, so it and thus to_state[i] are - reachable, so to_state[i] != nstates_old. */ - aver (old_to_new[to_state[i]] != nstates_old); - from_state[ngotos_reachable] = old_to_new[from_state[i]]; - to_state[ngotos_reachable] = old_to_new[to_state[i]]; - ++ngotos_reachable; - } - } + { + goto_number i; + for (i = 0; i < ngotos; ++i) + { + while (i == goto_map[nonterminal]) + goto_map[nonterminal++] = ngotos_reachable; + /* If old_to_new[from_state[i]] = nstates_old, remove this goto + entry. */ + if (old_to_new[from_state[i]] != nstates_old) + { + /* from_state[i] is not removed, so it and thus to_state[i] are + reachable, so to_state[i] != nstates_old. */ + aver (old_to_new[to_state[i]] != nstates_old); + from_state[ngotos_reachable] = old_to_new[from_state[i]]; + to_state[ngotos_reachable] = old_to_new[to_state[i]]; + ++ngotos_reachable; + } + } + } while (nonterminal <= nvars) { aver (ngotos == goto_map[nonterminal]); diff --git a/src/reader.c b/src/reader.c index be9f46f6..6918cc04 100644 --- a/src/reader.c +++ b/src/reader.c @@ -640,8 +640,11 @@ check_and_convert_grammar (void) rule. For the same reason, all the `used' flags must be set before checking whether to remove `$' from any midrule symbol name (also in packgram). */ - for (symbol_list *sym = grammar; sym; sym = sym->next) - code_props_translate_code (&sym->action_props); + { + symbol_list *sym; + for (sym = grammar; sym; sym = sym->next) + code_props_translate_code (&sym->action_props); + } /* Convert the grammar into the format described in gram.h. */ packgram (); diff --git a/src/state.c b/src/state.c index 9448da7d..3ba592bf 100644 --- a/src/state.c +++ b/src/state.c @@ -145,7 +145,6 @@ state_new (symbol_number accessing_symbol, res->errs = NULL; res->consistent = 0; res->solved_conflicts = NULL; - res->reachable = false; res->nitems = nitems; memcpy (res->items, core, items_size); @@ -354,41 +353,49 @@ state_hash_lookup (size_t nitems, item_number *core) } -/*------------------------------------------------------. -| Mark S and all states reachable from S as reachable. | -`------------------------------------------------------*/ +/*--------------------------------------------------------. +| Record S and all states reachable from S in REACHABLE. | +`--------------------------------------------------------*/ static void -state_mark_reachable_states (state *s) +state_record_reachable_states (state *s, bitset reachable) { - if (s->reachable) + if (bitset_test (reachable, s->number)) return; - s->reachable = true; - for (int i = 0; i < s->transitions->num; ++i) - if (!TRANSITION_IS_DISABLED (s->transitions, i)) - state_mark_reachable_states (s->transitions->states[i]); + bitset_set (reachable, s->number); + { + int i; + for (i = 0; i < s->transitions->num; ++i) + if (!TRANSITION_IS_DISABLED (s->transitions, i)) + state_record_reachable_states (s->transitions->states[i], reachable); + } } void state_remove_unreachable_states (state_number old_to_new[]) { state_number nstates_reachable = 0; - state_mark_reachable_states (states[0]); - for (state_number i = 0; i < nstates; ++i) - { - if (states[i]->reachable) - { - states[nstates_reachable] = states[i]; - states[nstates_reachable]->number = nstates_reachable; - old_to_new[i] = nstates_reachable++; - } - else - { - state_free (states[i]); - old_to_new[i] = nstates; - } - } + bitset reachable = bitset_create (nstates, BITSET_FIXED); + state_record_reachable_states (states[0], reachable); + { + state_number i; + for (i = 0; i < nstates; ++i) + { + if (bitset_test (reachable, states[i]->number)) + { + states[nstates_reachable] = states[i]; + states[nstates_reachable]->number = nstates_reachable; + old_to_new[i] = nstates_reachable++; + } + else + { + state_free (states[i]); + old_to_new[i] = nstates; + } + } + } nstates = nstates_reachable; + bitset_free (reachable); } /* All the decorated states, indexed by the state number. */ diff --git a/src/state.h b/src/state.h index e0aa6b75..c2ebe9cd 100644 --- a/src/state.h +++ b/src/state.h @@ -209,11 +209,6 @@ struct state a human readable description of the resolution. */ const char *solved_conflicts; - /* Conflict resolution sometimes makes states unreachable. Initialized to 0 - in state_new and then used by state_remove_unreachable_states after - conflicts_solve. */ - bool reachable; - /* Its items. Must be last, since ITEMS can be arbitrarily large. */ size_t nitems;