* src/state.h, src/state.c (shifts_to): New.
authorAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:31:37 +0000 (17:31 +0000)
committerAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:31:37 +0000 (17:31 +0000)
* src/lalr.c (build_relations): Use it.

ChangeLog
src/lalr.c
src/state.c
src/state.h

index ed8ec2e..32efdc1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2002-06-30  Akim Demaille  <akim@epita.fr>
 
+       * src/state.h, src/state.c (shifts_to): New.
+       * src/lalr.c (build_relations): Use it.
+
+       
+2002-06-30  Akim Demaille  <akim@epita.fr>
+
        * src/gram.h (rule_number_t, RULE_NUMBER_MAX, int_of_rule_number)
        (item_number_of_rule_number, rule_number_of_item_number): New.
        * src/LR0.c, src/closure.c, src/derives.c, src/derives.h,
index b1f8460..c3a55cc 100644 (file)
@@ -420,16 +420,8 @@ build_relations (void)
 
          for (rp = rules[*rulep].rhs; *rp >= 0; rp++)
            {
-             shifts_t *sp = state->shifts;
-             int j;
-             for (j = 0; j < sp->nshifts; j++)
-               {
-                 state = states[sp->shifts[j]];
-                 if (state->accessing_symbol
-                     == item_number_as_symbol_number (*rp))
-                   break;
-               }
-
+             state = shifts_to (state->shifts,
+                                item_number_as_symbol_number (*rp));
              states1[length++] = state->number;
            }
 
index dd8ec75..f365039 100644 (file)
@@ -49,6 +49,20 @@ shifts_new (int nshifts, state_number_t *shifts)
 }
 
 
+/*-----------------------------------------------------------------.
+| Return the state such these SHIFTS contain a shift/goto to it on |
+| SYMBOL.  Aborts if none found.                                   |
+`-----------------------------------------------------------------*/
+
+state_t *
+shifts_to (shifts_t *shifts, symbol_number_t s)
+{
+  int j;
+  for (j = 0; j < shifts->nshifts; j++)
+    if (SHIFT_SYMBOL (shifts, j) == s)
+      return states[shifts->shifts[j]];
+  abort ();
+}
 
 
                        /*--------------------.
index 074b1ee..674e171 100644 (file)
@@ -139,6 +139,10 @@ typedef struct shifts_s
 #define SHIFT_IS_DISABLED(Shifts, Shift) \
   (Shifts->shifts[Shift] == 0)
 
+/* Return the state such these SHIFTS contain a shift/goto to it on
+   SYMBOL.  Aborts if none found.  */
+struct state_s;
+struct state_s *shifts_to PARAMS ((shifts_t *shifts, symbol_number_t s));
 
 /*-------.
 | Errs.  |