]> git.saurik.com Git - bison.git/blobdiff - src/lalr.c
* src/bison.simple: Remove YYERROR_VERBOSE using.
[bison.git] / src / lalr.c
index 27e04be455c4bd7752f7bb77fec16dcd2b70f3f5..42cd05ef938f287ae97866fccd98c1c7a02eb29d 100644 (file)
@@ -1,5 +1,5 @@
 /* Compute look-ahead criteria for bison,
 /* Compute look-ahead criteria for bison,
-   Copyright 1984, 1986, 1989, 2000 Free Software Foundation, Inc.
+   Copyright 1984, 1986, 1989, 2000, 2001  Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 state_t *state_table = NULL;
 
 int tokensetsize;
 state_t *state_table = NULL;
 
 int tokensetsize;
-short *lookaheads;
 short *LAruleno;
 unsigned *LA;
 
 short *LAruleno;
 unsigned *LA;
 
-char *consistent;
 short *goto_map;
 short *from_state;
 short *to_state;
 short *goto_map;
 short *from_state;
 short *to_state;
@@ -50,9 +48,13 @@ short *to_state;
 extern void berror PARAMS ((const char *));
 
 static int infinity;
 extern void berror PARAMS ((const char *));
 
 static int infinity;
-static int maxrhs;
 static int ngotos;
 static int ngotos;
-static unsigned *F;
+
+/* And for the famous F variable, which named is so descriptive that a
+   comment is hardly needed.  <grin>.  */
+static unsigned *F = NULL;
+#define F(Rule)  (F + (Rule) * tokensetsize)
+
 static short **includes;
 static shorts **lookback;
 static short **R;
 static short **includes;
 static shorts **lookback;
 static short **R;
@@ -76,8 +78,8 @@ traverse (int i)
   VERTICES[++top] = i;
   INDEX[i] = height = top;
 
   VERTICES[++top] = i;
   INDEX[i] = height = top;
 
-  base = F + i * tokensetsize;
-  fp3 = base + tokensetsize;
+  base = F (i);
+  fp3 = F (i + 1);
 
   rp = R[i];
   if (rp)
 
   rp = R[i];
   if (rp)
@@ -91,7 +93,7 @@ traverse (int i)
            INDEX[i] = INDEX[j];
 
          fp1 = base;
            INDEX[i] = INDEX[j];
 
          fp1 = base;
-         fp2 = F + j * tokensetsize;
+         fp2 = F (j);
 
          while (fp1 < fp3)
            *fp1++ |= *fp2++;
 
          while (fp1 < fp3)
            *fp1++ |= *fp2++;
@@ -109,7 +111,7 @@ traverse (int i)
            break;
 
          fp1 = base;
            break;
 
          fp1 = base;
-         fp2 = F + j * tokensetsize;
+         fp2 = F (j);
 
          while (fp1 < fp3)
            *fp2++ = *fp1++;
 
          while (fp1 < fp3)
            *fp2++ = *fp1++;
@@ -134,19 +136,25 @@ digraph (short **relation)
     INDEX[i] = 0;
 
   for (i = 0; i < ngotos; i++)
     INDEX[i] = 0;
 
   for (i = 0; i < ngotos; i++)
-    {
-      if (INDEX[i] == 0 && R[i])
-       traverse (i);
-    }
+    if (INDEX[i] == 0 && R[i])
+      traverse (i);
 
   XFREE (INDEX);
   XFREE (VERTICES);
 }
 
 
   XFREE (INDEX);
   XFREE (VERTICES);
 }
 
+
+/*--------------------.
+| Build STATE_TABLE.  |
+`--------------------*/
+
 static void
 set_state_table (void)
 {
 static void
 set_state_table (void)
 {
-  state_table = XCALLOC (state_t, nstates);
+  /* NSTATES + 1 because lookahead for the pseudo state number NSTATES
+     might be used (see conflicts.c).  It is too opaque for me to
+     provide a probably less hacky implementation. --akim */
+  state_table = XCALLOC (state_t, nstates + 1);
 
   {
     core *sp;
 
   {
     core *sp;
@@ -168,11 +176,45 @@ set_state_table (void)
     for (rp = first_reduction; rp; rp = rp->next)
       state_table[rp->number].reduction_table = rp;
   }
     for (rp = first_reduction; rp; rp = rp->next)
       state_table[rp->number].reduction_table = rp;
   }
+
+  /* Initializing the lookaheads members.  Please note that it must be
+     performed after having set some of the other members which are
+     used below.  Change with extreme caution.  */
+  {
+    int i;
+    int count = 0;
+    for (i = 0; i < nstates; i++)
+      {
+       int k;
+       reductions *rp = state_table[i].reduction_table;
+       shifts *sp = state_table[i].shift_table;
+
+       state_table[i].lookaheads = count;
+
+       if (rp
+           && (rp->nreds > 1
+               || (sp && !ISVAR (state_table[sp->shifts[0]].accessing_symbol))))
+         count += rp->nreds;
+       else
+         state_table[i].consistent = 1;
+
+       if (sp)
+         for (k = 0; k < sp->nshifts; k++)
+           if (state_table[sp->shifts[k]].accessing_symbol
+               == error_token_number)
+             {
+               state_table[i].consistent = 0;
+               break;
+             }
+      }
+     state_table[nstates].lookaheads = count;
+  }
 }
 
 
 }
 
 
-static void
-set_maxrhs (void)
+/* Return the size of the longest ride hand side of the rules. */
+static size_t
+maxrhs (void)
 {
   short *itemp;
   int length;
 {
   short *itemp;
   int length;
@@ -194,7 +236,7 @@ set_maxrhs (void)
        }
     }
 
        }
     }
 
-  maxrhs = max;
+  return max;
 }
 
 
 }
 
 
@@ -203,65 +245,23 @@ initialize_LA (void)
 {
   int i;
   int j;
 {
   int i;
   int j;
-  int count;
-  reductions *rp;
-  shifts *sp;
   short *np;
   short *np;
+  reductions *rp;
 
 
-  consistent = XCALLOC (char, nstates);
-  lookaheads = XCALLOC (short, nstates + 1);
-
-  count = 0;
-  for (i = 0; i < nstates; i++)
-    {
-      int k;
-
-      lookaheads[i] = count;
+  size_t nLA = state_table[nstates].lookaheads;
+  if (!nLA)
+    nLA = 1;
 
 
-      rp = state_table[i].reduction_table;
-      sp = state_table[i].shift_table;
-      if (rp
-         && (rp->nreds > 1
-             || (sp && !ISVAR (state_table[sp->shifts[0]].accessing_symbol))))
-       count += rp->nreds;
-      else
-       consistent[i] = 1;
-
-      if (sp)
-       for (k = 0; k < sp->nshifts; k++)
-         if (state_table[sp->shifts[k]].accessing_symbol
-             == error_token_number)
-           {
-             consistent[i] = 0;
-             break;
-           }
-    }
-
-  lookaheads[nstates] = count;
-
-  if (count == 0)
-    {
-      LA = XCALLOC (unsigned, 1 * tokensetsize);
-      LAruleno = XCALLOC (short, 1);
-      lookback = XCALLOC (shorts *, 1);
-    }
-  else
-    {
-      LA = XCALLOC (unsigned, count * tokensetsize);
-      LAruleno = XCALLOC (short, count);
-      lookback = XCALLOC (shorts *, count);
-    }
+  LA = XCALLOC (unsigned, nLA * tokensetsize);
+  LAruleno = XCALLOC (short, nLA);
+  lookback = XCALLOC (shorts *, nLA);
 
   np = LAruleno;
   for (i = 0; i < nstates; i++)
 
   np = LAruleno;
   for (i = 0; i < nstates; i++)
-    {
-      if (!consistent[i])
-       {
-         if ((rp = state_table[i].reduction_table))
-           for (j = 0; j < rp->nreds; j++)
-             *np++ = rp->rules[j];
-       }
-    }
+    if (!state_table[i].consistent)
+      if ((rp = state_table[i].reduction_table))
+       for (j = 0; j < rp->nreds; j++)
+         *np++ = rp->rules[j];
 }
 
 
 }
 
 
@@ -434,10 +434,7 @@ initialize_F (void)
   digraph (reads);
 
   for (i = 0; i < ngotos; i++)
   digraph (reads);
 
   for (i = 0; i < ngotos; i++)
-    {
-      if (reads[i])
-       XFREE (reads[i]);
-    }
+    XFREE (reads[i]);
 
   XFREE (reads);
   XFREE (edge);
 
   XFREE (reads);
   XFREE (edge);
@@ -452,8 +449,8 @@ add_lookback_edge (int stateno, int ruleno, int gotono)
   int found;
   shorts *sp;
 
   int found;
   shorts *sp;
 
-  i = lookaheads[stateno];
-  k = lookaheads[stateno + 1];
+  i = state_table[stateno].lookaheads;
+  k = state_table[stateno + 1].lookaheads;
   found = 0;
   while (!found && i < k)
     {
   found = 0;
   while (!found && i < k)
     {
@@ -550,7 +547,7 @@ build_relations (void)
 
   includes = XCALLOC (short *, ngotos);
   edge = XCALLOC (short, ngotos + 1);
 
   includes = XCALLOC (short *, ngotos);
   edge = XCALLOC (short, ngotos + 1);
-  states = XCALLOC (short, maxrhs + 1);
+  states = XCALLOC (short, maxrhs () + 1);
 
   for (i = 0; i < ngotos; i++)
     {
 
   for (i = 0; i < ngotos; i++)
     {
@@ -564,7 +561,7 @@ build_relations (void)
          states[0] = state1;
          stateno = state1;
 
          states[0] = state1;
          stateno = state1;
 
-         for (rp = ritem + rrhs[*rulep]; *rp > 0; rp++)
+         for (rp = ritem + rule_table[*rulep].rhs; *rp > 0; rp++)
            {
              symbol2 = *rp;
              sp = state_table[stateno].shift_table;
            {
              symbol2 = *rp;
              sp = state_table[stateno].shift_table;
@@ -580,7 +577,7 @@ build_relations (void)
              states[length++] = stateno;
            }
 
              states[length++] = stateno;
            }
 
-         if (!consistent[stateno])
+         if (!state_table[stateno].consistent)
            add_lookback_edge (stateno, *rulep, i);
 
          length--;
            add_lookback_edge (stateno, *rulep, i);
 
          length--;
@@ -633,10 +630,7 @@ compute_FOLLOWS (void)
   digraph (includes);
 
   for (i = 0; i < ngotos; i++)
   digraph (includes);
 
   for (i = 0; i < ngotos; i++)
-    {
-      if (includes[i])
-       XFREE (includes[i]);
-    }
+    XFREE (includes[i]);
 
   XFREE (includes);
 }
 
   XFREE (includes);
 }
@@ -646,39 +640,20 @@ static void
 compute_lookaheads (void)
 {
   int i;
 compute_lookaheads (void)
 {
   int i;
-  int n;
-  unsigned *fp1;
-  unsigned *fp2;
-  unsigned *fp3;
   shorts *sp;
   shorts *sp;
-  unsigned *rowp;
-  shorts *sptmp;               /* JF */
 
 
-  rowp = LA;
-  n = lookaheads[nstates];
-  for (i = 0; i < n; i++)
-    {
-      fp3 = rowp + tokensetsize;
-      for (sp = lookback[i]; sp; sp = sp->next)
-       {
-         fp1 = rowp;
-         fp2 = F + tokensetsize * sp->value;
-         while (fp1 < fp3)
-           *fp1++ |= *fp2++;
-       }
-
-      rowp = fp3;
-    }
+  for (i = 0; i < state_table[nstates].lookaheads; i++)
+    for (sp = lookback[i]; sp; sp = sp->next)
+      {
+       unsigned *fp1 = LA (i);
+       unsigned *fp2 = F (sp->value);
+       while (fp1 < LA (i + 1))
+         *fp1++ |= *fp2++;
+      }
 
 
-  for (i = 0; i < n; i++)
-    {
-      /* JF removed ref to freed storage */
-      for (sp = lookback[i]; sp; sp = sptmp)
-       {
-         sptmp = sp->next;
-         XFREE (sp);
-       }
-    }
+  /* Free LOOKBACK. */
+  for (i = 0; i < state_table[nstates].lookaheads; i++)
+    LIST_FREE (shorts, lookback[i]);
 
   XFREE (lookback);
   XFREE (F);
 
   XFREE (lookback);
   XFREE (F);
@@ -691,7 +666,6 @@ lalr (void)
   tokensetsize = WORDSIZE (ntokens);
 
   set_state_table ();
   tokensetsize = WORDSIZE (ntokens);
 
   set_state_table ();
-  set_maxrhs ();
   initialize_LA ();
   set_goto_map ();
   initialize_F ();
   initialize_LA ();
   set_goto_map ();
   initialize_F ();