]> git.saurik.com Git - bison.git/commitdiff
* src/state.h, src/state.c (transitions_t): Holds state_t*'s, not
authorAkim Demaille <akim@epita.fr>
Mon, 29 Jul 2002 17:31:46 +0000 (17:31 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 29 Jul 2002 17:31:46 +0000 (17:31 +0000)
state_number_t.
(errs_t): symbol_t*, not symbol_number_t.
(reductions_t): rule_t*, not rule_number_t.
(FOR_EACH_SHIFT): New.
* src/LR0.c, src/conflicts.c, src/lalr.c, src/output.c
* src/print.c, src/print_graph.c: Adjust.

ChangeLog
src/LR0.c
src/conflicts.c
src/lalr.c
src/main.c
src/output.c
src/print.c
src/print_graph.c
src/state.c
src/state.h

index 95a4a2e3926db9d4d5a2c47af474f7ef59c0311d..93c1e52b0f679efcd04e25b89871d1a51618ec11 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2002-07-29  Akim Demaille  <akim@epita.fr>
+
+       * src/state.h, src/state.c (transitions_t): Holds state_t*'s, not
+       state_number_t.
+       (errs_t): symbol_t*, not symbol_number_t.
+       (reductions_t): rule_t*, not rule_number_t.
+       (FOR_EACH_SHIFT): New.
+       * src/LR0.c, src/conflicts.c, src/lalr.c, src/output.c
+       * src/print.c, src/print_graph.c: Adjust.
+
 2002-07-29  Akim Demaille  <akim@epita.fr>
 
        Use $accept and $end, as BYacc and BTYacc do, instead of $axiom and $.
index fa33906e63b9b1db34b84017b923c25d2c281ba7..00ff736ce9e8d8b25dd029f664cab48fff18d147 100644 (file)
--- a/src/LR0.c
+++ b/src/LR0.c
@@ -83,8 +83,8 @@ state_list_append (symbol_number_t symbol,
 static int nshifts;
 static symbol_number_t *shift_symbol = NULL;
 
-static short *redset = NULL;
-static state_number_t *shiftset = NULL;
+static rule_t **redset = NULL;
+static state_t **shiftset = NULL;
 
 static item_number_t **kernel_base = NULL;
 static int *kernel_size = NULL;
@@ -139,8 +139,8 @@ allocate_storage (void)
 {
   allocate_itemsets ();
 
-  shiftset = XCALLOC (state_number_t, nsyms);
-  redset = XCALLOC (short, nrules);
+  shiftset = XCALLOC (state_t *, nsyms);
+  redset = XCALLOC (rule_t *, nrules);
   state_hash_new ();
   shift_symbol = XCALLOC (symbol_number_t, nsyms);
 }
@@ -204,13 +204,13 @@ new_itemsets (state_t *state)
 
 
 
-/*--------------------------------------------------------------.
-| Find the state number for the state we would get to (from the |
-| current state) by shifting symbol.  Create a new state if no  |
-| equivalent one exists already.  Used by append_states.        |
-`--------------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| Find the state we would get to (from the current state) by       |
+| shifting SYMBOL.  Create a new state if no equivalent one exists |
+| already.  Used by append_states.                                 |
+`-----------------------------------------------------------------*/
 
-static state_number_t
+static state_t *
 get_state (symbol_number_t symbol, size_t core_size, item_number_t *core)
 {
   state_t *sp;
@@ -226,15 +226,15 @@ get_state (symbol_number_t symbol, size_t core_size, item_number_t *core)
   if (trace_flag)
     fprintf (stderr, "Exiting get_state => %d\n", sp->number);
 
-  return sp->number;
+  return sp;
 }
 
-/*------------------------------------------------------------------.
-| Use the information computed by new_itemsets to find the state    |
-| numbers reached by each shift transition from STATE.              |
-|                                                                   |
-| SHIFTSET is set up as a vector of state numbers of those states.  |
-`------------------------------------------------------------------*/
+/*---------------------------------------------------------------.
+| Use the information computed by new_itemsets to find the state |
+| numbers reached by each shift transition from STATE.           |
+|                                                                |
+| SHIFTSET is set up as a vector of those states.                |
+`---------------------------------------------------------------*/
 
 static void
 append_states (state_t *state)
@@ -292,7 +292,7 @@ save_reductions (state_t *state)
     {
       int item = ritem[itemset[i]];
       if (item < 0)
-       redset[count++] = item_number_as_rule_number (item);
+       redset[count++] = &rules[item_number_as_rule_number (item)];
     }
 
   /* Make a reductions structure and copy the data into it.  */
index 55468fd2b8efb56da25f4835222f95e03d75ea8a..9dabd70bb9bdfaf9d1d830741b0c5047d8001e9f 100644 (file)
@@ -176,7 +176,7 @@ flush_reduce (bitset lookaheads, int token)
 
 static void
 resolve_sr_conflict (state_t *state, int lookahead,
-                    symbol_number_t *errs)
+                    symbol_t **errs)
 {
   symbol_number_t i;
   /* Find the rule to reduce by to get precedence of reduction.  */
@@ -226,7 +226,7 @@ resolve_sr_conflict (state_t *state, int lookahead,
              flush_shift (state, i);
              flush_reduce (lookaheads, i);
              /* Record an explicit error for this token.  */
-             errs[nerrs++] = i;
+             errs[nerrs++] = symbols[i];
              break;
 
            case undef_assoc:
@@ -255,7 +255,7 @@ resolve_sr_conflict (state_t *state, int lookahead,
 `-------------------------------------------------------------------*/
 
 static void
-set_conflicts (state_t *state, symbol_number_t *errs)
+set_conflicts (state_t *state, symbol_t **errs)
 {
   int i;
   transitions_t *transitions = state->transitions;
@@ -265,9 +265,8 @@ set_conflicts (state_t *state, symbol_number_t *errs)
 
   bitset_zero (lookaheadset);
 
-  for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
-    if (!TRANSITION_IS_DISABLED (transitions, i))
-      bitset_set (lookaheadset, TRANSITION_SYMBOL (transitions, i));
+  FOR_EACH_SHIFT (transitions, i)
+    bitset_set (lookaheadset, TRANSITION_SYMBOL (transitions, i));
 
   /* Loop over all rules which require lookahead in this state.  First
      check for shift-reduce conflict, and try to resolve using
@@ -303,7 +302,7 @@ conflicts_solve (void)
 {
   state_number_t i;
   /* List of lookaheads on which we explicitly raise a parse error.  */
-  symbol_number_t *errs = XMALLOC (symbol_number_t, ntokens + 1);
+  symbol_t **errs = XMALLOC (symbol_t *, ntokens + 1);
 
   conflicts = XCALLOC (char, nstates);
   shiftset = bitset_create (ntokens, BITSET_FIXED);
@@ -341,9 +340,8 @@ count_sr_conflicts (state_t *state)
   bitset_zero (lookaheadset);
   bitset_zero (shiftset);
 
-  for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
-    if (!TRANSITION_IS_DISABLED (transitions, i))
-      bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
+  FOR_EACH_SHIFT (transitions, i)
+    bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
 
   for (i = 0; i < state->nlookaheads; ++i)
     bitset_or (lookaheadset, lookaheadset, state->lookaheads[i]);
@@ -434,17 +432,41 @@ void
 conflicts_output (FILE *out)
 {
   bool printed_sth = FALSE;
+  bool *used_rules = XCALLOC (bool, nrules);
   state_number_t i;
   for (i = 0; i < nstates; i++)
-    if (conflicts[i])
-      {
-       fprintf (out, _("State %d contains "), i);
-       fputs (conflict_report (count_sr_conflicts (states[i]),
-                               count_rr_conflicts (states[i], TRUE)), out);
-       printed_sth = TRUE;
-      }
+    {
+      state_t *s = states[i];
+      int j;
+      for (j = 0; j < s->reductions->num; ++j)
+       used_rules[s->reductions->rules[j]->number] = TRUE;
+      if (conflicts[i])
+       {
+         fprintf (out, _("State %d contains "), i);
+         fputs (conflict_report (count_sr_conflicts (s),
+                                 count_rr_conflicts (s, TRUE)), out);
+         printed_sth = TRUE;
+       }
+    }
   if (printed_sth)
     fputs ("\n\n", out);
+
+  for (i = 0; i < nstates; i++)
+    {
+      state_t *s = states[i];
+      reductions_t *r = s->reductions;
+      int j;
+      for (j = 0; j < r->num; ++j)
+       if (!used_rules[r->rules[j]->number])
+         {
+           LOCATION_PRINT (stderr, r->rules[j]->location);
+           fprintf (stderr, ": %s: %s: ",
+                    _("warning"),
+                    _("rule never reduced because of conflicts"));
+           rule_print (r->rules[j], stderr);
+         }
+    }
+  free (used_rules);
 }
 
 /*--------------------------------------------------------.
index 6d4a431ae5f33a6e27f63ec74a36b59a9f34fc67..c383e71d87d85d22df79d36c9d05ba98a38bba77 100644 (file)
@@ -86,7 +86,7 @@ initialize_LA (void)
   for (i = 0; i < nstates; i++)
     if (!states[i]->consistent)
       for (j = 0; j < states[i]->reductions->num; j++)
-       *np++ = &rules[states[i]->reductions->rules[j]];
+       *np++ = states[i]->reductions->rules[j];
 }
 
 
@@ -141,7 +141,7 @@ set_goto_map (void)
        {
          int k = temp_map[TRANSITION_SYMBOL (sp, i)]++;
          from_state[k] = state;
-         to_state[k] = sp->states[i];
+         to_state[k] = sp->states[i]->number;
        }
     }
 
@@ -200,7 +200,7 @@ initialize_F (void)
       transitions_t *sp = states[stateno]->transitions;
 
       int j;
-      for (j = 0; j < sp->num && TRANSITION_IS_SHIFT (sp, j); j++)
+      FOR_EACH_SHIFT (sp, j)
        bitset_set (F[i], TRANSITION_SYMBOL (sp, j));
 
       for (; j < sp->num; j++)
@@ -375,13 +375,14 @@ states_lookaheads_count (void)
         reduction from a shift.  Otherwise, it is straightforward,
         and the state is `consistent'.  */
       if (rp->num > 1
-         || (rp->num == 1 && sp->num && TRANSITION_IS_SHIFT (sp, 0)))
+         || (rp->num == 1 && sp->num &&
+             !TRANSITION_IS_DISABLED (sp, 0) && TRANSITION_IS_SHIFT (sp, 0)))
        nlookaheads += rp->num;
       else
        states[i]->consistent = 1;
 
       for (k = 0; k < sp->num; k++)
-       if (TRANSITION_IS_ERROR (sp, k))
+       if (!TRANSITION_IS_DISABLED (sp, k) && TRANSITION_IS_ERROR (sp, k))
          {
            states[i]->consistent = 0;
            break;
index 40566e9cc1bb09b08e9fe22a9d68a1f624b47050..a4a9871fdbe6dc62695fbba89d22b56d06de39e4 100644 (file)
 #include "conflicts.h"
 #include "print_graph.h"
 #include "muscle_tab.h"
+#include <malloc.h>
+#include <sys/times.h>
 
 /* The name this program was run with, for messages.  */
 char *program_name;
 
+static void
+stage (const char *title)
+{
+  struct mallinfo minfo = mallinfo ();
+  struct tms tinfo;
+  times (&tinfo);
+  fprintf (stderr, "STAGE: %30s: %9d (%9d): %ldu %lds\n",
+          title,
+          minfo.uordblks, minfo.arena,
+          tinfo.tms_utime, tinfo.tms_stime);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -58,16 +72,23 @@ main (int argc, char *argv[])
 
   muscle_init ();
 
+  stage ("initialized muscles");
+
   /* Read the input.  Copy some parts of it to FGUARD, FACTION, FTABLE
      and FATTRS.  In file reader.c.  The other parts are recorded in
      the grammar; see gram.h.  */
   reader ();
+
+  stage ("reader");
+
   if (complain_message_count)
     exit (1);
 
   /* Find useless nonterminals and productions and reduce the grammar. */
   reduce_grammar ();
 
+  stage ("reduced grammar");
+
   /* Record other info about the grammar.  In files derives and
      nullable.  */
   set_derives ();
@@ -77,9 +98,11 @@ main (int argc, char *argv[])
      See state.h for more info.  */
   generate_states ();
 
+  stage ("generated states");
   /* make it deterministic.  In file lalr.  */
   lalr ();
 
+  stage ("lalred");
   /* Find and record any conflicts: places where one token of
      lookahead is not enough to disambiguate the parsing.  In file
      conflicts.  Also resolve s/r conflicts based on precedence
@@ -87,6 +110,7 @@ main (int argc, char *argv[])
   conflicts_solve ();
   conflicts_print ();
 
+  stage ("solved conflicts");
   /* Output file names. */
   compute_output_file_names ();
 
@@ -94,6 +118,7 @@ main (int argc, char *argv[])
   if (report_flag)
     print_results ();
 
+  stage ("printed results");
   /* Stop if there were errors, to avoid trashing previous output
      files.  */
   if (complain_message_count)
@@ -105,26 +130,35 @@ main (int argc, char *argv[])
 
   /* Output the tables and the parser to ftable.  In file output.  */
   output ();
+  stage ("made output");
 
   states_free ();
+  stage ("freed states");
   reduce_free ();
+  stage ("freed reduce");
   conflicts_free ();
+  stage ("freed conflicts");
   free_nullable ();
+  stage ("freed nullable");
   free_derives ();
+  stage ("freed derives");
   grammar_free ();
+  stage ("freed grammar");
 
   /* The scanner memory cannot be released right after parsing, as it
      contains things such as user actions, prologue, epilogue etc.  */
   scanner_free ();
+  stage ("freed scanner");
   muscle_free ();
+  stage ("freed muscles");
   /* If using alloca.c, flush the alloca'ed memory for the benefit of
      people running Bison as a library in IDEs.  */
 #if C_ALLOCA
-    alloca (0);
+  alloca (0);
 #endif
 
-    if (trace_flag)
-      bitset_stats_dump (stderr);
+  if (trace_flag)
+    bitset_stats_dump (stderr);
 
   return complain_message_count ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index c218af3ee411b061143491b56f486a3b825e0331..1ec4d6b03fd3cab790f19d00c553075515ec9066 100644 (file)
@@ -494,15 +494,15 @@ conflict_row (state_t *state)
 | that has any such conflicts.                                      |
 `------------------------------------------------------------------*/
 
-static rule_number_t
+static rule_t *
 action_row (state_t *state)
 {
   int i;
-  rule_number_t default_rule = -1;
+  rule_t *default_rule = NULL;
   reductions_t *redp = state->reductions;
   transitions_t *transitions = state->transitions;
   errs_t *errp = state->errs;
-  /* set nonzero to inhibit having any default reduction */
+  /* Set to nonzero to inhibit having any default reduction.  */
   int nodefault = 0;
   int conflicted = 0;
 
@@ -531,28 +531,27 @@ action_row (state_t *state)
   /* Now see which tokens are allowed for shifts in this state.  For
      them, record the shift as the thing to do.  So shift is preferred
      to reduce.  */
-  for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
-    if (!TRANSITION_IS_DISABLED (transitions, i))
-      {
-       symbol_number_t symbol = TRANSITION_SYMBOL (transitions, i);
-       state_number_t shift_state = transitions->states[i];
+  FOR_EACH_SHIFT (transitions, i)
+    {
+      symbol_number_t symbol = TRANSITION_SYMBOL (transitions, i);
+      state_t *shift_state = transitions->states[i];
 
-       if (actrow[symbol] != 0)
-         conflicted = conflrow[symbol] = 1;
-       actrow[symbol] = state_number_as_int (shift_state);
+      if (actrow[symbol] != 0)
+       conflicted = conflrow[symbol] = 1;
+      actrow[symbol] = state_number_as_int (shift_state->number);
 
-       /* Do not use any default reduction if there is a shift for
-          error */
-       if (symbol == errtoken->number)
-         nodefault = 1;
-      }
+      /* Do not use any default reduction if there is a shift for
+        error */
+      if (symbol == errtoken->number)
+       nodefault = 1;
+    }
 
   /* See which tokens are an explicit error in this state (due to
      %nonassoc).  For them, record ACTION_MIN as the action.  */
   for (i = 0; i < errp->num; i++)
     {
-      symbol_number_t symbol = errp->symbols[i];
-      actrow[symbol] = ACTION_MIN;
+      symbol_t *symbol = errp->symbols[i];
+      actrow[symbol->number] = ACTION_MIN;
     }
 
   /* Now find the most common reduction and make it the default action
@@ -568,11 +567,11 @@ action_row (state_t *state)
          for (i = 0; i < state->nlookaheads; i++)
            {
              int count = 0;
-             rule_number_t rule = state->lookaheads_rule[i]->number;
+             rule_t *rule = state->lookaheads_rule[i];
              symbol_number_t j;
 
              for (j = 0; j < ntokens; j++)
-               if (actrow[j] == rule_number_as_item_number (rule))
+               if (actrow[j] == rule_number_as_item_number (rule->number))
                  count++;
 
              if (count > max)
@@ -592,7 +591,7 @@ action_row (state_t *state)
            {
              int j;
              for (j = 0; j < ntokens; j++)
-               if (actrow[j] == rule_number_as_item_number (default_rule)
+               if (actrow[j] == rule_number_as_item_number (default_rule->number)
                    && ! (glr_parser && conflrow[j]))
                  actrow[j] = 0;
            }
@@ -602,7 +601,7 @@ action_row (state_t *state)
   /* If have no default rule, the default is an error.
      So replace any action which says "error" with "use default".  */
 
-  if (default_rule == -1)
+  if (!default_rule)
     for (i = 0; i < ntokens; i++)
       if (actrow[i] == ACTION_MIN)
        actrow[i] = 0;
@@ -690,7 +689,8 @@ token_actions (void)
 
   for (i = 0; i < nstates; ++i)
     {
-      yydefact[i] = action_row (states[i]) + 1;
+      rule_t *default_rule = action_row (states[i]);
+      yydefact[i] = default_rule ? default_rule->number + 1 : 0;
       save_row (i);
     }
 
index 67490875402b6d494f3878b7035cdc84571d66a1..1227765b2f010454a2e51e40b12b847895345338 100644 (file)
@@ -152,16 +152,16 @@ print_transitions (state_t *state, FILE *out, bool display_transitions_p)
       {
        symbol_t *symbol = symbols[TRANSITION_SYMBOL (transitions, i)];
        const char *tag = symbol->tag;
-       state_number_t state1 = transitions->states[i];
+       state_t *state1 = transitions->states[i];
        int j;
 
        fprintf (out, "    %s", tag);
        for (j = width - strlen (tag); j > 0; --j)
          fputc (' ', out);
        if (display_transitions_p)
-         fprintf (out, _("shift, and go to state %d\n"), state1);
+         fprintf (out, _("shift, and go to state %d\n"), state1->number);
        else
-         fprintf (out, _("go to state %d\n"), state1);
+         fprintf (out, _("go to state %d\n"), state1->number);
       }
 }
 
@@ -180,7 +180,7 @@ print_errs (FILE *out, state_t *state)
   /* Compute the width of the lookaheads column.  */
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
-      max_length (&width, symbols[errp->symbols[i]]->tag);
+      max_length (&width, errp->symbols[i]->tag);
 
   /* Nothing to report. */
   if (!width)
@@ -193,7 +193,7 @@ print_errs (FILE *out, state_t *state)
   for (i = 0; i < errp->num; ++i)
     if (errp->symbols[i])
       {
-       const char *tag = symbols[errp->symbols[i]]->tag;
+       const char *tag = errp->symbols[i]->tag;
        int j;
        fprintf (out, "    %s", tag);
        for (j = width - strlen (tag); j > 0; --j)
@@ -218,22 +218,21 @@ state_default_rule (state_t *state)
 
   /* No need for a lookahead.  */
   if (state->consistent)
-    return &rules[redp->rules[0]];
+    return redp->rules[0];
 
   /* 1. Each reduction is possibly masked by the lookaheads on which
      we shift (S/R conflicts)...  */
   bitset_zero (shiftset);
   {
     transitions_t *transitions = state->transitions;
-    for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
-      if (!TRANSITION_IS_DISABLED (transitions, i))
-       {
-         /* If this state has a shift for the error token, don't use a
+    FOR_EACH_SHIFT (transitions, i)
+      {
+       /* If this state has a shift for the error token, don't use a
             default rule.  */
-         if (TRANSITION_IS_ERROR (transitions, i))
-           return NULL;
-         bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
-       }
+       if (TRANSITION_IS_ERROR (transitions, i))
+         return NULL;
+       bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
+      }
   }
 
   /* 2. Each reduction is possibly masked by the lookaheads on which
@@ -242,7 +241,7 @@ state_default_rule (state_t *state)
     errs_t *errp = state->errs;
     for (i = 0; i < errp->num; i++)
       if (errp->symbols[i])
-       bitset_set (shiftset, errp->symbols[i]);
+       bitset_set (shiftset, errp->symbols[i]->number);
   }
 
   for (i = 0; i < state->nlookaheads; ++i)
@@ -314,9 +313,8 @@ print_reductions (FILE *out, state_t *state)
   default_rule = state_default_rule (state);
 
   bitset_zero (shiftset);
-  for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
-    if (!TRANSITION_IS_DISABLED (transitions, i))
-      bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
+  FOR_EACH_SHIFT (transitions, i)
+    bitset_set (shiftset, TRANSITION_SYMBOL (transitions, i));
 
   /* Compute the width of the lookaheads column.  */
   if (default_rule)
index be7e196ee467fb1c6f60f812ad85d5877fc57512..272ffc53ff007df4f0164830c1198c3b4969610c 100644 (file)
@@ -137,17 +137,17 @@ print_actions (state_t *state, const char *node_name)
   for (i = 0; i < transitions->num; i++)
     if (!TRANSITION_IS_DISABLED (transitions, i))
       {
-       state_number_t state1 = transitions->states[i];
-       symbol_number_t symbol = states[state1]->accessing_symbol;
+       state_t *state1 = transitions->states[i];
+       symbol_number_t symbol = state1->accessing_symbol;
 
        new_edge (&edge);
 
-       if (state->number > state1)
+       if (state->number > state1->number)
          edge.type = back_edge;
        open_edge (&edge, fgraph);
        /* The edge source is the current node.  */
        edge.sourcename = node_name;
-       sprintf (buff, "%d", state1);
+       sprintf (buff, "%d", state1->number);
        edge.targetname = buff;
        /* Shifts are blue, gotos are green, and error is red. */
        if (TRANSITION_IS_ERROR (transitions, i))
index bdf2586b22429e492bac771276a84bbc5137c942..773071267335a3b1b319af60acf5194617f9bf70 100644 (file)
 | Create a new array of N shifts/gotos.  |
 `---------------------------------------*/
 
-#define TRANSITIONS_ALLOC(Num)                                 \
-  (transitions_t *) xcalloc ((sizeof (transitions_t)                   \
-                                  + (Num - 1) * sizeof (state_number_t)), 1)
+#define TRANSITIONS_ALLOC(Num)                                         \
+  (transitions_t *) xcalloc ((sizeof (transitions_t)                   \
+                                  + (Num - 1) * sizeof (state_t *)), 1)
 
 static transitions_t *
-transitions_new (int num, state_number_t *the_states)
+transitions_new (int num, state_t **the_states)
 {
   transitions_t *res = TRANSITIONS_ALLOC (num);
   res->num = num;
@@ -60,7 +60,7 @@ transitions_to (transitions_t *shifts, symbol_number_t s)
   int j;
   for (j = 0; j < shifts->num; j++)
     if (TRANSITION_SYMBOL (shifts, j) == s)
-      return states[shifts->states[j]];
+      return shifts->states[j];
   abort ();
 }
 
@@ -76,11 +76,11 @@ transitions_to (transitions_t *shifts, symbol_number_t s)
 
 #define ERRS_ALLOC(Nerrs)                              \
   (errs_t *) xcalloc ((sizeof (errs_t)                 \
-                      + (Nerrs - 1) * sizeof (symbol_number_t)), 1)
+                      + (Nerrs - 1) * sizeof (symbol_t *)), 1)
 
 
 errs_t *
-errs_new (int num, symbol_number_t *tokens)
+errs_new (int num, symbol_t **tokens)
 {
   errs_t *res = ERRS_ALLOC (num);
   res->num = num;
@@ -102,10 +102,10 @@ errs_new (int num, symbol_number_t *tokens)
 
 #define REDUCTIONS_ALLOC(Nreductions)                          \
   (reductions_t *) xcalloc ((sizeof (reductions_t)             \
-                            + (Nreductions - 1) * sizeof (rule_number_t)), 1)
+                            + (Nreductions - 1) * sizeof (rule_t *)), 1)
 
 static reductions_t *
-reductions_new (int num, rule_number_t *reductions)
+reductions_new (int num, rule_t **reductions)
 {
   reductions_t *res = REDUCTIONS_ALLOC (num);
   res->num = num;
@@ -126,8 +126,8 @@ state_number_t nstates = 0;
 state_t *final_state = NULL;
 
 #define STATE_ALLOC(Nitems)                                            \
-  (state_t *) xcalloc ((unsigned) (sizeof (state_t)                    \
-                                  + (Nitems - 1) * sizeof (item_number_t)), 1)
+  (state_t *) xcalloc ((sizeof (state_t)                               \
+                       + (Nitems - 1) * sizeof (item_number_t)), 1)
 
 /*------------------------------------------------------------------.
 | Create a new state with ACCESSING_SYMBOL, for those items.  Store |
@@ -177,7 +177,7 @@ state_free (state_t *state)
 `-------------------------------*/
 
 void
-state_transitions_set (state_t *state, int num, state_number_t *transitions)
+state_transitions_set (state_t *state, int num, state_t **transitions)
 {
   assert (!state->transitions);
   state->transitions = transitions_new (num, transitions);
@@ -189,7 +189,7 @@ state_transitions_set (state_t *state, int num, state_number_t *transitions)
 `------------------------------*/
 
 void
-state_reductions_set (state_t *state, int num, rule_number_t *reductions)
+state_reductions_set (state_t *state, int num, rule_t **reductions)
 {
   assert (!state->reductions);
   state->reductions = reductions_new (num, reductions);
@@ -201,7 +201,7 @@ state_reductions_set (state_t *state, int num, rule_number_t *reductions)
 `------------------------*/
 
 void
-state_errs_set (state_t *state, int num, symbol_number_t *tokens)
+state_errs_set (state_t *state, int num, symbol_t **tokens)
 {
   assert (!state->errs);
   state->errs = errs_new (num, tokens);
index 78a739a8b3620e8f334c76fd4e7d025e31be0b72..32559cef4ba2441ff19aff2965493e03731876a4 100644 (file)
@@ -95,6 +95,9 @@ typedef short state_number_t;
 /* Be ready to map a state_number_t to an int.  */
 # define state_number_as_int(Tok) ((int) (Tok))
 
+
+typedef struct state_s state_t;
+
 /*--------------.
 | Transitions.  |
 `--------------*/
@@ -102,7 +105,7 @@ typedef short state_number_t;
 typedef struct transtion_s
 {
   short num;
-  state_number_t states[1];
+  state_t *states[1];
 } transitions_t;
 
 
@@ -111,7 +114,7 @@ typedef struct transtion_s
    token), or non terminals in case of gotos.  */
 
 #define TRANSITION_SYMBOL(Transitions, Num) \
-  (states[Transitions->states[Num]]->accessing_symbol)
+  (Transitions->states[Num]->accessing_symbol)
 
 /* Is the TRANSITIONS->states[Num] a shift? (as opposed to gotos).  */
 
@@ -132,10 +135,21 @@ typedef struct transtion_s
    disabled.  */
 
 #define TRANSITION_DISABLE(Transitions, Num) \
-  (Transitions->states[Num] = 0)
+  (Transitions->states[Num] = NULL)
 
 #define TRANSITION_IS_DISABLED(Transitions, Num) \
-  (Transitions->states[Num] == 0)
+  (Transitions->states[Num] == NULL)
+
+
+/* Iterate over each transition over a token (shifts).  */
+#define FOR_EACH_SHIFT(Transitions, Iter)                      \
+  for (Iter = 0;                                               \
+       Iter < Transitions->num                                 \
+        && (TRANSITION_IS_DISABLED (Transitions, Iter)         \
+            || TRANSITION_IS_SHIFT (Transitions, Iter));       \
+       ++Iter)                                                 \
+    if (!TRANSITION_IS_DISABLED (Transitions, Iter))
+
 
 /* Return the state such these TRANSITIONS contain a shift/goto to it on
    SYMBOL.  Aborts if none found.  */
@@ -151,10 +165,10 @@ struct state_s *transitions_to PARAMS ((transitions_t *state,
 typedef struct errs_s
 {
   short num;
-  symbol_number_t symbols[1];
+  symbol_t *symbols[1];
 } errs_t;
 
-errs_t *errs_new PARAMS ((int num, symbol_number_t *tokens));
+errs_t *errs_new PARAMS ((int num, symbol_t **tokens));
 
 
 /*-------------.
@@ -164,16 +178,16 @@ errs_t *errs_new PARAMS ((int num, symbol_number_t *tokens));
 typedef struct reductions_s
 {
   short num;
-  rule_number_t rules[1];
+  rule_t *rules[1];
 } reductions_t;
 
 
 
-/*----------.
-| State_t.  |
-`----------*/
+/*---------.
+| States.  |
+`---------*/
 
-typedef struct state_s
+struct state_s
 {
   state_number_t number;
   symbol_number_t accessing_symbol;
@@ -203,7 +217,7 @@ typedef struct state_s
      */
   unsigned short nitems;
   item_number_t items[1];
-} state_t;
+};
 
 extern state_number_t nstates;
 extern state_t *final_state;
@@ -214,15 +228,15 @@ state_t *state_new PARAMS ((symbol_number_t accessing_symbol,
 
 /* Set the transitions of STATE.  */
 void state_transitions_set PARAMS ((state_t *state,
-                                   int num, state_number_t *transitions));
+                                   int num, state_t **transitions));
 
 /* Set the reductions of STATE.  */
 void state_reductions_set PARAMS ((state_t *state,
-                                  int num, rule_number_t *reductions));
+                                  int num, rule_t **reductions));
 
 /* Set the errs of STATE.  */
 void state_errs_set PARAMS ((state_t *state,
-                            int num, symbol_number_t *errs));
+                            int num, symbol_t **errs));
 
 /* Print on OUT all the lookaheads such that this STATE wants to
    reduce this RULE.  */