]> git.saurik.com Git - bison.git/blobdiff - src/state.c
Get rid of broken %no-parser, -n, and --no-parser implementation and
[bison.git] / src / state.c
index bae3575e4881e3705c734ceb5fc6385fdb721f43..3ba592bf2e9c1d83cc33de1af4caa22a55d52d83 100644 (file)
@@ -1,6 +1,6 @@
 /* Type definitions for nondeterministic finite state machine for Bison.
 
 /* Type definitions for nondeterministic finite state machine for Bison.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
@@ -145,7 +145,6 @@ state_new (symbol_number accessing_symbol,
   res->errs = NULL;
   res->consistent = 0;
   res->solved_conflicts = NULL;
   res->errs = NULL;
   res->consistent = 0;
   res->solved_conflicts = NULL;
-  res->reachable = false;
 
   res->nitems = nitems;
   memcpy (res->items, core, items_size);
 
   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
 
 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;
     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;
 }
 
 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;
   nstates = nstates_reachable;
+  bitset_free (reachable);
 }
 
 /* All the decorated states, indexed by the state number.  */
 }
 
 /* All the decorated states, indexed by the state number.  */