/[bison]/bison/src/lalr.c
ViewVC logotype

Diff of /bison/src/lalr.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.27 by akim, Mon Nov 19 10:31:49 2001 UTC revision 1.28 by akim, Wed Dec 5 09:27:47 2001 UTC
# Line 50  extern void berror PARAMS ((const char * Line 50  extern void berror PARAMS ((const char *
50  static int infinity;  static int infinity;
51  static int ngotos;  static int ngotos;
52    
53  /* And for the famous F variable, which named is so descriptive that a  /* And for the famous F variable, which name is so descriptive that a
54     comment is hardly needed.  <grin>.  */     comment is hardly needed.  <grin>.  */
55  static unsigned *F = NULL;  static unsigned *F = NULL;
56  #define F(Rule)  (F + (Rule) * tokensetsize)  #define F(Rule)  (F + (Rule) * tokensetsize)
# Line 66  static int top; Line 66  static int top;
66  static void  static void
67  traverse (int i)  traverse (int i)
68  {  {
   unsigned *fp1;  
   unsigned *fp2;  
   unsigned *fp3;  
69    int j;    int j;
70    short *rp;    size_t k;
   
71    int height;    int height;
72    unsigned *base;    size_t size = F (i + 1) - F(i);
73    
74    VERTICES[++top] = i;    VERTICES[++top] = i;
75    INDEX[i] = height = top;    INDEX[i] = height = top;
76    
77    base = F (i);    if (R[i])
78    fp3 = F (i + 1);      for (j = 0; R[i][j] >= 0; ++j)
79          {
80            if (INDEX[R[i][j]] == 0)
81              traverse (R[i][j]);
82    
83    rp = R[i];          if (INDEX[i] > INDEX[R[i][j]])
84    if (rp)            INDEX[i] = INDEX[R[i][j]];
85      {  
86        while ((j = *rp++) >= 0)          for (k = 0; k < size; ++k)
87          {            F (i)[k] |= F (R[i][j])[k];
88            if (INDEX[j] == 0)        }
             traverse (j);  
   
           if (INDEX[i] > INDEX[j])  
             INDEX[i] = INDEX[j];  
   
           fp1 = base;  
           fp2 = F (j);  
   
           while (fp1 < fp3)  
             *fp1++ |= *fp2++;  
         }  
     }  
89    
90    if (INDEX[i] == height)    if (INDEX[i] == height)
91      {      for (;;)
92        for (;;)        {
93          {          j = VERTICES[top--];
94            j = VERTICES[top--];          INDEX[j] = infinity;
95            INDEX[j] = infinity;  
96            if (i == j)
97            if (i == j)            break;
98              break;  
99            for (k = 0; k < size; ++k)
100            fp1 = base;            F (i)[k] = F (j)[k];
101            fp2 = F (j);        }
   
           while (fp1 < fp3)  
             *fp2++ = *fp1++;  
         }  
     }  
102  }  }
103    
104    
# Line 212  set_state_table (void) Line 194  set_state_table (void)
194  }  }
195    
196    
197  /* Return the size of the longest ride hand side of the rules. */  /*------------------------------------------.
198    | Return the size of the longest rule RHS.  |
199    `------------------------------------------*/
200    
201  static size_t  static size_t
202  maxrhs (void)  maxrhs (void)
203  {  {

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.28

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26