]> git.saurik.com Git - bison.git/blobdiff - src/tables.c
(symbol_user_token_number_set, symbol_make_alias, symbol_pack):
[bison.git] / src / tables.c
index 0b4fd275f0caac1c841eeff81b7e8b0f84b190fa..e1f0c61ebe5624d557022ebb5ec144d7f70b9234 100644 (file)
@@ -82,7 +82,7 @@ static base_t *width = NULL;
 /* For a given state, N = ACTROW[SYMBOL]:
 
    If N = 0, stands for `run the default action'.
-   If N = MIN, stands for `raise a parse error'.
+   If N = MIN, stands for `raise a syntax error'.
    If N > 0, stands for `shift SYMBOL and go to n'.
    If N < 0, stands for `reduce -N'.  */
 typedef short action_t;
@@ -116,7 +116,7 @@ static int conflict_list_free;
 static size_t table_size = 32768;
 base_t *table = NULL;
 base_t *check = NULL;
-/* The value used in TABLE to denote explicit parse errors
+/* The value used in TABLE to denote explicit syntax errors
    (%nonassoc), a negative infinite.  First defaults to ACTION_MIN,
    but in order to keep small tables, renumbered as TABLE_ERROR, which
    is the smallest (non error) value minus 1.  */
@@ -418,7 +418,7 @@ token_actions (void)
   /* Find the rules which are reduced.  */
   if (!glr_parser)
     for (r = 0; r < nrules; ++r)
-      rules[r].useful = FALSE;
+      rules[r].useful = false;
 
   for (i = 0; i < nstates; ++i)
     {
@@ -433,9 +433,9 @@ token_actions (void)
        {
          for (j = 0; j < ntokens; ++j)
            if (actrow[j] < 0 && actrow[j] != ACTION_MIN)
-             rules[item_number_as_rule_number (actrow[j])].useful = TRUE;
+             rules[item_number_as_rule_number (actrow[j])].useful = true;
          if (yydefact[i])
-           rules[yydefact[i] - 1].useful = TRUE;
+           rules[yydefact[i] - 1].useful = true;
        }
     }
 
@@ -610,6 +610,15 @@ matching_state (vector_number_t vector)
   t = tally[i];
   w = width[i];
 
+  /* If VECTOR has GLR conflicts, return -1 */
+  if (conflict_tos[i] != NULL)
+    {
+      int j;
+      for (j = 0; j < t; j += 1)
+       if (conflict_tos[i][j] != 0)
+         return -1;
+    }
+
   for (prev = vector - 1; prev >= 0; prev--)
     {
       vector_number_t j = order[prev];
@@ -622,7 +631,8 @@ matching_state (vector_number_t vector)
        return -1;
 
       for (k = 0; match && k < t; k++)
-       if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
+       if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]
+           || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0))
          match = 0;
 
       if (match)
@@ -682,8 +692,7 @@ pack_vector (vector_number_t vector)
          if (loc > high)
            high = loc;
 
-         if (j < BASE_MIN || BASE_MAX < j)
-           fatal ("base_t too small to hold %d\n", j);
+         assert (BASE_MIN <= j && j <= BASE_MAX);
          return j;
        }
     }
@@ -792,9 +801,9 @@ tables_generate (void)
   token_actions ();
 
   goto_actions ();
-  XFREE (goto_map + ntokens);
-  XFREE (from_state);
-  XFREE (to_state);
+  free (goto_map + ntokens);
+  free (from_state);
+  free (to_state);
 
   order = XCALLOC (vector_number_t, nvectors);
   sort_actions ();
@@ -806,8 +815,8 @@ tables_generate (void)
 
   for (i = 0; i < nvectors; i++)
     {
-      XFREE (froms[i]);
-      XFREE (tos[i]);
+      free (froms[i]);
+      free (tos[i]);
       XFREE (conflict_tos[i]);
     }