diff --git a/lib/modules/LR.pmod/parser.pike b/lib/modules/LR.pmod/parser.pike
index 36f95e0ffeab5189494003f0658cc68a8b324f42..1a432891386a98fbded47c05b7203849b5258b67 100644
--- a/lib/modules/LR.pmod/parser.pike
+++ b/lib/modules/LR.pmod/parser.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: parser.pike,v 1.4 1998/11/12 01:30:43 grubba Exp $
+ * $Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
  *
  * A BNF-grammar in Pike.
  * Compiles to a LALR(1) state-machine.
@@ -9,7 +9,7 @@
 
 //.
 //. File:	parser.pike
-//. RCSID:	$Id: parser.pike,v 1.4 1998/11/12 01:30:43 grubba Exp $
+//. RCSID:	$Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
 //. Author:	Henrik Grubbstr�m (grubba@infovav.se)
 //.
 //. Synopsis:	LALR(1) parser and compiler.
@@ -73,6 +73,10 @@ class state_queue {
   //. The queue/set itself.
   array(object(LR.kernel)) arr=allocate(64);
 
+  //. + members
+  //.   Hashes of the states that are members.
+  mapping(string:int) members = ([]);
+
   //. - memberp
   //.   Returns the index of the state in arr if present.
   //.   Returns -1 on failure.
@@ -80,14 +84,13 @@ class state_queue {
   //.   State to search for.
   int|object(LR.kernel) memberp(object(LR.kernel) state)
   {
-    int j;
-
-    for (j = 0; j<tail; j++) {
-      if (state->equalp(arr[j])) {
-	return(j);
-      }
+    if (!state->kernel_hash) {
+      state->make_kernel_hash();
+    }
+    if (zero_type(members[state->kernel_hash])) {
+      return(-1);
     }
-    return(-1);
+    return(members[state->kernel_hash]);
   }
 
   //. - push_if_new
@@ -104,6 +107,7 @@ class state_queue {
       if (tail == sizeof(arr)) {
 	arr += allocate(tail);
       }
+      members[state->kernel_hash] = tail;
       arr[tail++] = state;
 
       return(state);