bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

12-fyi-shift-is.patch


From: Akim Demaille
Subject: 12-fyi-shift-is.patch
Date: Wed, 05 Dec 2001 08:25:02 +0100

Index: ChangeLog
from  Akim Demaille  <address@hidden>
        * src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New.
        * src/lalr.c: Use them.
        
        
Index: src/lalr.c
--- src/lalr.c Sat, 01 Dec 2001 16:40:26 +0100 akim
+++ src/lalr.c Sat, 01 Dec 2001 17:46:18 +0100 akim
@@ -42,15 +42,11 @@
 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 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 @@
        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 @@
   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 @@
   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 @@
       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: src/state.h
--- src/state.h Sat, 17 Nov 2001 16:20:18 +0100 akim
+++ src/state.h Sat, 01 Dec 2001 17:44:28 +0100 akim
@@ -88,6 +88,11 @@
 #ifndef STATE_H_
 # define STATE_H_
 
+
+/*-------.
+| Core.  |
+`-------*/
+
 typedef struct core
 {
   struct core *next;
@@ -96,39 +101,63 @@
   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 @@
   short number;
   short nreds;
   short rules[1];
-}
-reductions;
+} reductions;
 
 #define REDUCTIONS_ALLOC(Nreductions)                                  \
   (reductions *) xcalloc ((unsigned) (sizeof (reductions)              \



reply via email to

[Prev in Thread] Current Thread [Next in Thread]