bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

05-fyi-traverse.patch


From: Akim Demaille
Subject: 05-fyi-traverse.patch
Date: Wed, 05 Dec 2001 08:24:27 +0100

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/lalr.c (traverse): Use arrays instead of pointers.

Index: src/lalr.c
--- src/lalr.c Sat, 17 Nov 2001 17:06:51 +0100 akim
+++ src/lalr.c Sat, 01 Dec 2001 13:47:13 +0100 akim
@@ -50,7 +50,7 @@
 static int infinity;
 static int ngotos;

-/* And for the famous F variable, which named is so descriptive that a
+/* And for the famous F variable, which name is so descriptive that a
    comment is hardly needed.  <grin>.  */
 static unsigned *F = NULL;
 #define F(Rule)  (F + (Rule) * tokensetsize)
@@ -66,57 +66,39 @@
 static void
 traverse (int i)
 {
-  unsigned *fp1;
-  unsigned *fp2;
-  unsigned *fp3;
   int j;
-  short *rp;
-
+  size_t k;
   int height;
-  unsigned *base;
+  size_t size = F (i + 1) - F(i);

   VERTICES[++top] = i;
   INDEX[i] = height = top;

-  base = F (i);
-  fp3 = F (i + 1);
+  if (R[i])
+    for (j = 0; R[i][j] >= 0; ++j)
+      {
+       if (INDEX[R[i][j]] == 0)
+         traverse (R[i][j]);

-  rp = R[i];
-  if (rp)
-    {
-      while ((j = *rp++) >= 0)
-       {
-         if (INDEX[j] == 0)
-           traverse (j);
-
-         if (INDEX[i] > INDEX[j])
-           INDEX[i] = INDEX[j];
-
-         fp1 = base;
-         fp2 = F (j);
-
-         while (fp1 < fp3)
-           *fp1++ |= *fp2++;
-       }
-    }
+       if (INDEX[i] > INDEX[R[i][j]])
+         INDEX[i] = INDEX[R[i][j]];
+
+       for (k = 0; k < size; ++k)
+         F (i)[k] |= F (R[i][j])[k];
+      }

   if (INDEX[i] == height)
-    {
-      for (;;)
-       {
-         j = VERTICES[top--];
-         INDEX[j] = infinity;
-
-         if (i == j)
-           break;
-
-         fp1 = base;
-         fp2 = F (j);
-
-         while (fp1 < fp3)
-           *fp2++ = *fp1++;
-       }
-    }
+    for (;;)
+      {
+       j = VERTICES[top--];
+       INDEX[j] = infinity;
+
+       if (i == j)
+         break;
+
+       for (k = 0; k < size; ++k)
+         F (i)[k] = F (j)[k];
+      }
 }


@@ -212,7 +194,10 @@
 }


-/* Return the size of the longest ride hand side of the rules. */
+/*------------------------------------------.
+| Return the size of the longest rule RHS.  |
+`------------------------------------------*/
+
 static size_t
 maxrhs (void)
 {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]