]> git.saurik.com Git - bison.git/commitdiff
* src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New.
authorAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:30:00 +0000 (09:30 +0000)
committerAkim Demaille <akim@epita.fr>
Wed, 5 Dec 2001 09:30:00 +0000 (09:30 +0000)
* src/lalr.c: Use them.

ChangeLog
src/lalr.c
src/state.h

index 647503080ccd396181594d7cc43a6edbdf8838da..a8687e6538094f5bd6f68328986c79d6cf046724 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-12-05  Akim Demaille  <akim@epita.fr>
+
+       * src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New.
+       * src/lalr.c: Use them.
+
+       
 2001-12-05  Akim Demaille  <akim@epita.fr>
 
        * src/LR0.c (augment_automaton): Formatting changes.
index eb226f4483321439f1ac816df6bd4b6914f85432..e6738bdac55172a97d92f58c83ebde44d4ae5a18 100644 (file)
@@ -42,15 +42,11 @@ int tokensetsize;
 short *LAruleno;
 unsigned *LA;
 
+static int ngotos;
 short *goto_map;
 short *from_state;
 short *to_state;
 
-extern void berror PARAMS ((const char *));
-
-static int infinity;
-static int ngotos;
-
 /* And for the famous F variable, which name is so descriptive that a
    comment is hardly needed.  <grin>.  */
 static unsigned *F = NULL;
@@ -58,11 +54,20 @@ static unsigned *F = NULL;
 
 static short **includes;
 static shorts **lookback;
+
+
+/*---------------------------------------------------------------.
+| digraph & traverse.                                            |
+|                                                                |
+| The following variables are used as common storage between the |
+| two.                                                           |
+`---------------------------------------------------------------*/
+
 static short **R;
 static short *INDEX;
 static short *VERTICES;
 static int top;
-
+static int infinity;
 
 static void
 traverse (int i)
@@ -175,16 +180,14 @@ set_state_table (void)
        state_table[i].lookaheads = count;
 
        if (rp
-           && (rp->nreds > 1
-               || (sp && !ISVAR (state_table[sp->shifts[0]].accessing_symbol))))
+           && (rp->nreds > 1 || (sp && SHIFT_IS_SHIFT (sp, 0))))
          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)
+           if (SHIFT_IS_ERROR (sp, k))
              {
                state_table[i].consistent = 0;
                break;
@@ -237,13 +240,10 @@ set_goto_map (void)
   ngotos = 0;
   for (sp = first_shift; sp; sp = sp->next)
     {
-      for (i = sp->nshifts - 1; i >= 0; i--)
+      for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i)
        {
          symbol = state_table[sp->shifts[i]].accessing_symbol;
 
-         if (ISTOKEN (symbol))
-           break;
-
          if (ngotos == MAXSHORT)
            fatal (_("too many gotos (max %d)"), MAXSHORT);
 
@@ -271,14 +271,11 @@ set_goto_map (void)
   for (sp = first_shift; sp; sp = sp->next)
     {
       state1 = sp->number;
-      for (i = sp->nshifts - 1; i >= 0; i--)
+      for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i)
        {
          state2 = sp->shifts[i];
          symbol = state_table[state2].accessing_symbol;
 
-         if (ISTOKEN (symbol))
-           break;
-
          k = temp_map[symbol]++;
          from_state[k] = state1;
          to_state[k] = state2;
@@ -342,11 +339,9 @@ initialize_F (void)
       if (sp)
        {
          int j;
-         for (j = 0; j < sp->nshifts; j++)
+         for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++)
            {
              int symbol = state_table[sp->shifts[j]].accessing_symbol;
-             if (ISVAR (symbol))
-               break;
              SETBIT (F + i * tokensetsize, symbol);
            }
 
index 4c60a271268689937b0a60b0b254926d128552cf..37598cb0ff7642573057307a18b85549f9b74e4b 100644 (file)
 #ifndef STATE_H_
 # define STATE_H_
 
+
+/*-------.
+| Core.  |
+`-------*/
+
 typedef struct core
 {
   struct core *next;
@@ -96,39 +101,63 @@ typedef struct core
   short accessing_symbol;
   short nitems;
   short items[1];
-}
-core;
+} core;
 
 #define CORE_ALLOC(Nitems)                                             \
   (core *) xcalloc ((unsigned) (sizeof (core)                          \
                                 + (Nitems - 1) * sizeof (short)), 1)
 
+/*---------.
+| Shifts.  |
+`---------*/
+
 typedef struct shifts
 {
   struct shifts *next;
   short number;
   short nshifts;
   short shifts[1];
-}
-shifts;
+} shifts;
+
 
 #define SHIFTS_ALLOC(Nshifts)                                          \
   (shifts *) xcalloc ((unsigned) (sizeof (shifts)                      \
                                   + (Nshifts - 1) * sizeof (short)), 1)
 
+/* Is the SHIFTS->shifts[Shift] a real shift? (as opposed to gotos.) */
+
+#define SHIFT_IS_SHIFT(Shifts, Shift) \
+  (ISTOKEN (state_table[Shifts->shifts[Shift]].accessing_symbol))
+
+/* Is the SHIFTS->shifts[Shift] a goto?. */
+
+#define SHIFT_IS_GOTO(Shifts, Shift) \
+  (!SHIFT_IS_SHIFT (Shifts, Shift))
+
+/* Is the SHIFTS->shifts[Shift] then handling of the error token?. */
+
+#define SHIFT_IS_ERROR(Shifts, Shift) \
+  (state_table[Shifts->shifts[Shift]].accessing_symbol == error_token_number)
+
+
+/*-------.
+| Errs.  |
+`-------*/
 
 typedef struct errs
 {
   short nerrs;
   short errs[1];
-}
-errs;
+} errs;
 
 #define ERRS_ALLOC(Nerrs)                                              \
   (errs *) xcalloc ((unsigned) (sizeof (errs)                          \
                                   + (Nerrs - 1) * sizeof (short)), 1)
 
 
+/*-------------.
+| Reductions.  |
+`-------------*/
 
 typedef struct reductions
 {
@@ -136,8 +165,7 @@ typedef struct reductions
   short number;
   short nreds;
   short rules[1];
-}
-reductions;
+} reductions;
 
 #define REDUCTIONS_ALLOC(Nreductions)                                  \
   (reductions *) xcalloc ((unsigned) (sizeof (reductions)              \