* src/conflicts.c (err_table): Remove.

(resolve_sr_conflict): Adjust.
* src/lalr.h (state_t.reduction_table, state_t.shift_table):
Rename as...
(state_t.reductions, state_t.shifts): this.
This commit is contained in:
Akim Demaille
2001-12-05 09:44:26 +00:00
parent 076ab0334d
commit 92b16366dd
8 changed files with 99 additions and 99 deletions

View File

@@ -1,3 +1,12 @@
2001-12-05 Akim Demaille <akim@epita.fr>
* src/conflicts.c (err_table): Remove.
(resolve_sr_conflict): Adjust.
* src/lalr.h (state_t.reduction_table, state_t.shift_table):
Rename as...
(state_t.reductions, state_t.shifts): this.
2001-12-05 Akim Demaille <akim@epita.fr> 2001-12-05 Akim Demaille <akim@epita.fr>
* src/reduce.c (reduce_grammar_tables): No longer disable the * src/reduce.c (reduce_grammar_tables): No longer disable the

View File

@@ -29,7 +29,6 @@
#include "reader.h" #include "reader.h"
#include "LR0.h" #include "LR0.h"
errs **err_table = NULL;
/* -1 stands for not specified. */ /* -1 stands for not specified. */
int expected_conflicts = -1; int expected_conflicts = -1;
static char *conflicts = NULL; static char *conflicts = NULL;
@@ -57,7 +56,7 @@ Conflict in state %d between rule %d and token %s resolved as %s.\n"),
static void static void
flush_shift (int state, int token) flush_shift (int state, int token)
{ {
shifts *shiftp = state_table[state].shift_table; shifts *shiftp = state_table[state].shifts;
int i; int i;
for (i = 0; i < shiftp->nshifts; i++) for (i = 0; i < shiftp->nshifts; i++)
@@ -83,79 +82,73 @@ resolve_sr_conflict (int state, int lookaheadnum)
short *errtokens = errp->errs; short *errtokens = errp->errs;
for (i = 0; i < ntokens; i++) for (i = 0; i < ntokens; i++)
{ if (BITISSET (LA (lookaheadnum), i)
if (BITISSET (LA (lookaheadnum), i) && BITISSET (lookaheadset, i)
&& BITISSET (lookaheadset, i) && sprec[i])
&& sprec[i]) /* Shift-reduce conflict occurs for token number i
/* Shift-reduce conflict occurs for token number i and it has a precedence.
and it has a precedence. The precedence of shifting is that of token i. */
The precedence of shifting is that of token i. */ {
{ if (sprec[i] < redprec)
if (sprec[i] < redprec) {
{ log_resolution (state, lookaheadnum, i, _("reduce"));
log_resolution (state, lookaheadnum, i, _("reduce")); /* flush the shift for this token */
/* flush the shift for this token */ RESETBIT (lookaheadset, i);
RESETBIT (lookaheadset, i); flush_shift (state, i);
flush_shift (state, i); }
} else if (sprec[i] > redprec)
else if (sprec[i] > redprec) {
{ log_resolution (state, lookaheadnum, i, _("shift"));
log_resolution (state, lookaheadnum, i, _("shift")); /* flush the reduce for this token */
/* flush the reduce for this token */ RESETBIT (LA (lookaheadnum), i);
RESETBIT (LA (lookaheadnum), i); }
} else
else {
{ /* Matching precedence levels.
/* Matching precedence levels. For left association, keep only the reduction.
For left association, keep only the reduction. For right association, keep only the shift.
For right association, keep only the shift. For nonassociation, keep neither. */
For nonassociation, keep neither. */
switch (sassoc[i]) switch (sassoc[i])
{ {
case right_assoc: case right_assoc:
log_resolution (state, lookaheadnum, i, _("shift")); log_resolution (state, lookaheadnum, i, _("shift"));
break; break;
case left_assoc: case left_assoc:
log_resolution (state, lookaheadnum, i, _("reduce")); log_resolution (state, lookaheadnum, i, _("reduce"));
break; break;
case non_assoc: case non_assoc:
log_resolution (state, lookaheadnum, i, _("an error")); log_resolution (state, lookaheadnum, i, _("an error"));
break; break;
} }
if (sassoc[i] != right_assoc)
{
/* flush the shift for this token */
RESETBIT (lookaheadset, i);
flush_shift (state, i);
}
if (sassoc[i] != left_assoc)
{
/* flush the reduce for this token */
RESETBIT (LA (lookaheadnum), i);
}
if (sassoc[i] == non_assoc)
{
/* Record an explicit error for this token. */
*errtokens++ = i;
}
}
}
if (sassoc[i] != right_assoc)
{
/* flush the shift for this token */
RESETBIT (lookaheadset, i);
flush_shift (state, i);
}
if (sassoc[i] != left_assoc)
{
/* flush the reduce for this token */
RESETBIT (LA (lookaheadnum), i);
}
if (sassoc[i] == non_assoc)
{
/* Record an explicit error for this token. */
*errtokens++ = i;
}
}
}
}
errp->nerrs = errtokens - errp->errs; errp->nerrs = errtokens - errp->errs;
if (errp->nerrs) /* Some tokens have been explicitly made errors. Allocate a
{ permanent errs structure for this state, to record them. */
/* Some tokens have been explicitly made errors. Allocate i = (char *) errtokens - (char *) errp;
a permanent errs structure for this state, to record them. */ state_table[state].errs = ERRS_ALLOC (i + 1);
i = (char *) errtokens - (char *) errp; memcpy (state_table[state].errs, errp, i);
err_table[state] = ERRS_ALLOC (i + 1);
bcopy (errp, err_table[state], i);
}
else
err_table[state] = 0;
free (errp); free (errp);
} }
@@ -172,7 +165,7 @@ set_conflicts (int state)
for (i = 0; i < tokensetsize; i++) for (i = 0; i < tokensetsize; i++)
lookaheadset[i] = 0; lookaheadset[i] = 0;
shiftp = state_table[state].shift_table; shiftp = state_table[state].shifts;
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++) for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
if (!SHIFT_IS_DISABLED (shiftp, i)) if (!SHIFT_IS_DISABLED (shiftp, i))
SETBIT (lookaheadset, SHIFT_SYMBOL (shiftp, i)); SETBIT (lookaheadset, SHIFT_SYMBOL (shiftp, i));
@@ -216,8 +209,6 @@ solve_conflicts (void)
shiftset = XCALLOC (unsigned, tokensetsize); shiftset = XCALLOC (unsigned, tokensetsize);
lookaheadset = XCALLOC (unsigned, tokensetsize); lookaheadset = XCALLOC (unsigned, tokensetsize);
err_table = XCALLOC (errs *, nstates);
for (i = 0; i < nstates; i++) for (i = 0; i < nstates; i++)
set_conflicts (i); set_conflicts (i);
} }
@@ -232,7 +223,7 @@ count_sr_conflicts (int state)
{ {
int i, k; int i, k;
int src_count = 0; int src_count = 0;
shifts *shiftp = state_table[state].shift_table; shifts *shiftp = state_table[state].shifts;
if (!shiftp) if (!shiftp)
return 0; return 0;
@@ -433,7 +424,7 @@ print_reductions (FILE *out, int state)
for (i = 0; i < tokensetsize; i++) for (i = 0; i < tokensetsize; i++)
shiftset[i] = 0; shiftset[i] = 0;
shiftp = state_table[state].shift_table; shiftp = state_table[state].shifts;
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++) for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
if (!SHIFT_IS_DISABLED (shiftp, i)) if (!SHIFT_IS_DISABLED (shiftp, i))
{ {
@@ -444,7 +435,7 @@ print_reductions (FILE *out, int state)
SETBIT (shiftset, SHIFT_SYMBOL (shiftp, i)); SETBIT (shiftset, SHIFT_SYMBOL (shiftp, i));
} }
errp = err_table[state]; errp = state_table[state].errs;
if (errp) if (errp)
for (i = 0; i < errp->nerrs; i++) for (i = 0; i < errp->nerrs; i++)
if (errp->errs[i]) if (errp->errs[i])

View File

@@ -1,5 +1,5 @@
/* Find and resolve or report look-ahead conflicts for bison, /* Find and resolve or report look-ahead conflicts for bison,
Copyright 2000 Free Software Foundation, Inc. Copyright 2000, 2001 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -29,6 +29,5 @@ void print_reductions PARAMS ((FILE*out, int state));
void free_conflicts PARAMS ((void)); void free_conflicts PARAMS ((void));
/* Were there conflicts? */ /* Were there conflicts? */
extern errs **err_table;
extern int expected_conflicts; extern int expected_conflicts;
#endif /* !CONFLICTS_H_ */ #endif /* !CONFLICTS_H_ */

View File

@@ -156,22 +156,22 @@ set_state_table (void)
{ {
shifts *sp; shifts *sp;
for (sp = first_shift; sp; sp = sp->next) for (sp = first_shift; sp; sp = sp->next)
state_table[sp->number].shift_table = sp; state_table[sp->number].shifts = sp;
} }
{ {
reductions *rp; reductions *rp;
for (rp = first_reduction; rp; rp = rp->next) for (rp = first_reduction; rp; rp = rp->next)
state_table[rp->number].reduction_table = rp; state_table[rp->number].reductions = rp;
} }
/* Pessimization, but simplification of the code: make sense all the /* Pessimization, but simplification of the code: make sense all the
states have a shift_table, even if reduced to 0 shifts. */ states have a shifts, even if reduced to 0 shifts. */
{ {
int i; int i;
for (i = 0; i < nstates; i++) for (i = 0; i < nstates; i++)
if (!state_table[i].shift_table) if (!state_table[i].shifts)
state_table[i].shift_table = shifts_new (0); state_table[i].shifts = shifts_new (0);
} }
/* Initializing the lookaheads members. Please note that it must be /* Initializing the lookaheads members. Please note that it must be
@@ -183,8 +183,8 @@ set_state_table (void)
for (i = 0; i < nstates; i++) for (i = 0; i < nstates; i++)
{ {
int k; int k;
reductions *rp = state_table[i].reduction_table; reductions *rp = state_table[i].reductions;
shifts *sp = state_table[i].shift_table; shifts *sp = state_table[i].shifts;
state_table[i].lookaheads = count; state_table[i].lookaheads = count;
@@ -225,7 +225,7 @@ initialize_LA (void)
np = LAruleno; np = LAruleno;
for (i = 0; i < nstates; i++) for (i = 0; i < nstates; i++)
if (!state_table[i].consistent) if (!state_table[i].consistent)
if ((rp = state_table[i].reduction_table)) if ((rp = state_table[i].reductions))
for (j = 0; j < rp->nreds; j++) for (j = 0; j < rp->nreds; j++)
*np++ = rp->rules[j]; *np++ = rp->rules[j];
} }
@@ -340,13 +340,13 @@ initialize_F (void)
for (i = 0; i < ngotos; i++) for (i = 0; i < ngotos; i++)
{ {
int stateno = to_state[i]; int stateno = to_state[i];
shifts *sp = state_table[stateno].shift_table; shifts *sp = state_table[stateno].shifts;
int j; int j;
for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++) for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++)
{ {
int symbol = state_table[sp->shifts[j]].accessing_symbol; int symbol = state_table[sp->shifts[j]].accessing_symbol;
SETBIT (F + i * tokensetsize, symbol); SETBIT (F (i), symbol);
} }
for (; j < sp->nshifts; j++) for (; j < sp->nshifts; j++)
@@ -515,7 +515,7 @@ build_relations (void)
for (rp = ritem + rule_table[*rulep].rhs; *rp > 0; rp++) for (rp = ritem + rule_table[*rulep].rhs; *rp > 0; rp++)
{ {
shifts *sp = state_table[stateno].shift_table; shifts *sp = state_table[stateno].shifts;
int j; int j;
for (j = 0; j < sp->nshifts; j++) for (j = 0; j < sp->nshifts; j++)
{ {

View File

@@ -78,8 +78,9 @@ typedef struct state_s
/* Its accessing symbol. */ /* Its accessing symbol. */
short accessing_symbol; short accessing_symbol;
shifts *shift_table; shifts *shifts;
reductions *reduction_table; reductions *reductions;
errs *errs;
/* Nonzero if no lookahead is needed to decide what to do in state /* Nonzero if no lookahead is needed to decide what to do in state
S. */ S. */

View File

@@ -355,7 +355,7 @@ action_row (int state)
default_rule = 0; default_rule = 0;
nreds = 0; nreds = 0;
redp = state_table[state].reduction_table; redp = state_table[state].reductions;
if (redp) if (redp)
{ {
@@ -382,7 +382,7 @@ action_row (int state)
/* Now see which tokens are allowed for shifts in this state. For /* Now see which tokens are allowed for shifts in this state. For
them, record the shift as the thing to do. So shift is preferred them, record the shift as the thing to do. So shift is preferred
to reduce. */ to reduce. */
shiftp = state_table[state].shift_table; shiftp = state_table[state].shifts;
for (i = 0; i < shiftp->nshifts; i++) for (i = 0; i < shiftp->nshifts; i++)
{ {
shift_state = shiftp->shifts[i]; shift_state = shiftp->shifts[i];
@@ -404,7 +404,7 @@ action_row (int state)
/* See which tokens are an explicit error in this state (due to /* See which tokens are an explicit error in this state (due to
%nonassoc). For them, record MINSHORT as the action. */ %nonassoc). For them, record MINSHORT as the action. */
errp = err_table[state]; errp = state_table[state].errs;
if (errp) if (errp)
{ {

View File

@@ -98,9 +98,9 @@ print_actions (FILE *out, int state)
{ {
int i; int i;
shifts *shiftp = state_table[state].shift_table; shifts *shiftp = state_table[state].shifts;
reductions *redp = state_table[state].reduction_table; reductions *redp = state_table[state].reductions;
errs *errp = err_table[state]; errs *errp = state_table[state].errs;
if (!shiftp->nshifts && !redp) if (!shiftp->nshifts && !redp)
{ {

View File

@@ -85,8 +85,8 @@ print_actions (int state, const char *node_name)
{ {
int i; int i;
shifts *shiftp = state_table[state].shift_table; shifts *shiftp = state_table[state].shifts;
reductions *redp = state_table[state].reduction_table; reductions *redp = state_table[state].reductions;
#if 0 #if 0
errs *errp = err_table[state]; errs *errp = err_table[state];
#endif #endif