* src/lalr.c (traverse): Use arrays instead of pointers.

This commit is contained in:
Akim Demaille
2001-12-05 09:27:47 +00:00
parent e3e4e81446
commit fe96109760
2 changed files with 30 additions and 41 deletions

View File

@@ -1,3 +1,7 @@
2001-12-05 Akim Demaille <akim@epita.fr>
* src/lalr.c (traverse): Use arrays instead of pointers.
2001-12-05 Akim Demaille <akim@epita.fr> 2001-12-05 Akim Demaille <akim@epita.fr>
* src/nullable.c (set_nullable): Use a for loop to de-obfuscate * src/nullable.c (set_nullable): Use a for loop to de-obfuscate

View File

@@ -50,7 +50,7 @@ extern void berror PARAMS ((const char *));
static int infinity; static int infinity;
static int ngotos; static int ngotos;
/* 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
comment is hardly needed. <grin>. */ comment is hardly needed. <grin>. */
static unsigned *F = NULL; static unsigned *F = NULL;
#define F(Rule) (F + (Rule) * tokensetsize) #define F(Rule) (F + (Rule) * tokensetsize)
@@ -66,57 +66,39 @@ static int top;
static void static void
traverse (int i) traverse (int i)
{ {
unsigned *fp1;
unsigned *fp2;
unsigned *fp3;
int j; int j;
short *rp; size_t k;
int height; int height;
unsigned *base; size_t size = F (i + 1) - F(i);
VERTICES[++top] = i; VERTICES[++top] = i;
INDEX[i] = height = top; INDEX[i] = height = top;
base = F (i); if (R[i])
fp3 = F (i + 1); for (j = 0; R[i][j] >= 0; ++j)
{
if (INDEX[R[i][j]] == 0)
traverse (R[i][j]);
rp = R[i]; if (INDEX[i] > INDEX[R[i][j]])
if (rp) INDEX[i] = INDEX[R[i][j]];
{
while ((j = *rp++) >= 0)
{
if (INDEX[j] == 0)
traverse (j);
if (INDEX[i] > INDEX[j]) for (k = 0; k < size; ++k)
INDEX[i] = INDEX[j]; F (i)[k] |= F (R[i][j])[k];
}
fp1 = base;
fp2 = F (j);
while (fp1 < fp3)
*fp1++ |= *fp2++;
}
}
if (INDEX[i] == height) if (INDEX[i] == height)
{ for (;;)
for (;;) {
{ j = VERTICES[top--];
j = VERTICES[top--]; INDEX[j] = infinity;
INDEX[j] = infinity;
if (i == j) if (i == j)
break; break;
fp1 = base; for (k = 0; k < size; ++k)
fp2 = F (j); F (i)[k] = F (j)[k];
}
while (fp1 < fp3)
*fp2++ = *fp1++;
}
}
} }
@@ -212,7 +194,10 @@ set_state_table (void)
} }
/* Return the size of the longest ride hand side of the rules. */ /*------------------------------------------.
| Return the size of the longest rule RHS. |
`------------------------------------------*/
static size_t static size_t
maxrhs (void) maxrhs (void)
{ {