]> git.saurik.com Git - bison.git/commitdiff
* src/nullable.c (set_nullable): Deobfuscate the handling of
authorAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:27:08 +0000 (09:27 +0000)
committerAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:27:08 +0000 (09:27 +0000)
ritem.
`symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.

ChangeLog
src/nullable.c

index 1a82f4385061ed6c46a5e1c10760a926aec0c0ec..6cd76086f395625485a9232839de442dac48ff25 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2001-12-05  Akim Demaille  <akim@epita.fr>
+
+       * src/nullable.c (set_nullable): Deobfuscate the handling of
+       ritem.
+       `symbol >= 0' is wrong now, use `rule_table[ruleno].useful'.
+
+       
 2001-12-05  Akim Demaille  <akim@epita.fr>
 
        * src/gram.c, src/gram.h (ritem_print): New.
index c207924dc8328a9770263d2313451c8e38b66748..74164937f7296d020152b99dc04315ff900a9068 100644 (file)
@@ -71,41 +71,35 @@ set_nullable (void)
   relts = XCALLOC (shorts, nitems + nvars + 1);
   p = relts;
 
-  r = ritem;
-  while (*r)
+  for (r = ritem; *r; ++r)
     {
-      if (*r < 0)
+      /* 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;
+
+      /* 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])
        {
-         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;
-
-         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++;
-               }
-           }
-       }
+         nullable[rule_table[ruleno].lhs] = 1;
+         *s2++ = rule_table[ruleno].lhs;
+        }
     }
 
   while (s1 < s2)