* 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>
* 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 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>. */
static unsigned *F = NULL;
#define F(Rule) (F + (Rule) * tokensetsize)
@@ -66,57 +66,39 @@ static int top;
static void
traverse (int i)
{
unsigned *fp1;
unsigned *fp2;
unsigned *fp3;
int j;
short *rp;
size_t k;
int height;
unsigned *base;
size_t size = F (i + 1) - F(i);
VERTICES[++top] = i;
INDEX[i] = height = top;
base = F (i);
fp3 = F (i + 1);
if (R[i])
for (j = 0; R[i][j] >= 0; ++j)
{
if (INDEX[R[i][j]] == 0)
traverse (R[i][j]);
rp = R[i];
if (rp)
{
while ((j = *rp++) >= 0)
{
if (INDEX[j] == 0)
traverse (j);
if (INDEX[i] > INDEX[R[i][j]])
INDEX[i] = INDEX[R[i][j]];
if (INDEX[i] > INDEX[j])
INDEX[i] = INDEX[j];
fp1 = base;
fp2 = F (j);
while (fp1 < fp3)
*fp1++ |= *fp2++;
}
}
for (k = 0; k < size; ++k)
F (i)[k] |= F (R[i][j])[k];
}
if (INDEX[i] == height)
{
for (;;)
{
j = VERTICES[top--];
INDEX[j] = infinity;
for (;;)
{
j = VERTICES[top--];
INDEX[j] = infinity;
if (i == j)
break;
if (i == j)
break;
fp1 = base;
fp2 = F (j);
while (fp1 < fp3)
*fp2++ = *fp1++;
}
}
for (k = 0; k < size; ++k)
F (i)[k] = F (j)[k];
}
}
@@ -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
maxrhs (void)
{