bison-patches
[Top][All Lists]
Advanced

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

02-fyi-deobf-set-nullable.patch


From: Akim Demaille
Subject: 02-fyi-deobf-set-nullable.patch
Date: Wed, 05 Dec 2001 08:24:12 +0100

Index: ChangeLog
from  Akim Demaille  <address@hidden>
        * src/nullable.c (set_nullable): Deobfuscate the handling of
        ritem.
        `symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
        
        
Index: src/nullable.c
--- src/nullable.c Sun, 18 Nov 2001 14:23:55 +0100 akim
+++ src/nullable.c Sat, 01 Dec 2001 12:45:21 +0100 akim
@@ -71,41 +71,35 @@
   relts = XCALLOC (shorts, nitems + nvars + 1);
   p = relts;
 
-  r = ritem;
-  while (*r)
+  for (r = ritem; *r; ++r)
     {
-      if (*r < 0)
-       {
-         int symbol = rule_table[-(*r++)].lhs;
-         if (symbol >= 0 && !nullable[symbol])
-           {
-             nullable[symbol] = 1;
-             *s2++ = symbol;
-           }
-       }
-      else
-       {
-         int any_tokens = 0;
-         int symbol;
-         short *r1 = r;
-         for (symbol = *r++; symbol > 0; symbol = *r++)
-           if (ISTOKEN (symbol))
-             any_tokens = 1;
+      /* Walk RITEM to find (i), if there are any tokens in the
+        RHS, and (ii), to find RULENO. */
+      int ruleno;
+      int any_tokens = 0;
+      short *r1;
+      for (r1 = r; *r1 > 0; ++r1)
+       if (ISTOKEN (*r1))
+         any_tokens = 1;
+      ruleno = -*r1;
 
-         if (!any_tokens)
-           {
-             int ruleno = -symbol;
-             r = r1;
-             for (symbol = *r++; symbol > 0; symbol = *r++)
-               {
-                 rcount[ruleno]++;
-                 p->next = rsets[symbol];
-                 p->value = ruleno;
-                 rsets[symbol] = p;
-                 p++;
-               }
-           }
-       }
+      /* Examine the RHS of the rule.  */
+      if (!any_tokens)
+       for (/* Nothing. */; *r > 0; ++r)
+         {
+           rcount[ruleno]++;
+           p->next = rsets[*r];
+           p->value = ruleno;
+           rsets[*r] = p;
+           p++;
+         }
+
+      /* Examine its LHS. */
+      if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs])
+       {
+         nullable[rule_table[ruleno].lhs] = 1;
+         *s2++ = rule_table[ruleno].lhs;
+        }
     }
 
   while (s1 < s2)



reply via email to

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