mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
* src/print.c (print_shifts, print_gotos): Merge into...
(print_transitions): this. (print_transitions, print_errs, print_reductions): Align the lookaheads columns. (print_core, print_transitions, print_errs, print_state, print_grammar): Output empty lines separator before, not after. (state_default_rule_compute): Rename as... (state_default_rule): this. * tests/conflicts.at (Defaulted Conflicted Reduction), (Unresolved SR Conflicts, Resolved SR Conflicts): Adjust. * tests/regression.at (Rule Line Numbers, Web2c Report): Adjust.
This commit is contained in:
14
ChangeLog
14
ChangeLog
@@ -1,3 +1,17 @@
|
|||||||
|
2002-06-30 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
* src/print.c (print_shifts, print_gotos): Merge into...
|
||||||
|
(print_transitions): this.
|
||||||
|
(print_transitions, print_errs, print_reductions): Align the
|
||||||
|
lookaheads columns.
|
||||||
|
(print_core, print_transitions, print_errs, print_state,
|
||||||
|
print_grammar): Output empty lines separator before, not after.
|
||||||
|
(state_default_rule_compute): Rename as...
|
||||||
|
(state_default_rule): this.
|
||||||
|
* tests/conflicts.at (Defaulted Conflicted Reduction),
|
||||||
|
(Unresolved SR Conflicts, Resolved SR Conflicts): Adjust.
|
||||||
|
* tests/regression.at (Rule Line Numbers, Web2c Report): Adjust.
|
||||||
|
|
||||||
2002-06-30 Akim Demaille <akim@epita.fr>
|
2002-06-30 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
Display items as we display rules.
|
Display items as we display rules.
|
||||||
|
|||||||
227
src/print.c
227
src/print.c
@@ -48,6 +48,19 @@ print_token (int extnum, int token)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------.
|
||||||
|
| *WIDTH := max (*WIDTH, strlen (STR)). |
|
||||||
|
`---------------------------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
max_length (size_t *width, const char *str)
|
||||||
|
{
|
||||||
|
size_t len = strlen (str);
|
||||||
|
if (len > *width)
|
||||||
|
*width = len;
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------.
|
/*--------------------------------.
|
||||||
| Report information on a state. |
|
| Report information on a state. |
|
||||||
`--------------------------------*/
|
`--------------------------------*/
|
||||||
@@ -71,6 +84,8 @@ print_core (FILE *out, state_t *state)
|
|||||||
if (!snritems)
|
if (!snritems)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
fputc ('\n', out);
|
||||||
|
|
||||||
for (i = 0; i < snritems; i++)
|
for (i = 0; i < snritems; i++)
|
||||||
{
|
{
|
||||||
item_number_t *sp;
|
item_number_t *sp;
|
||||||
@@ -99,70 +114,92 @@ print_core (FILE *out, state_t *state)
|
|||||||
|
|
||||||
fputc ('\n', out);
|
fputc ('\n', out);
|
||||||
}
|
}
|
||||||
|
|
||||||
fputc ('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------.
|
||||||
|
| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of STATE on |
|
||||||
|
| OUT. |
|
||||||
|
`----------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_shifts (FILE *out, state_t *state)
|
print_transitions (state_t *state, FILE *out, bool display_shifts_p)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
shifts_t *shiftp = state->shifts;
|
shifts_t *shiftp = state->shifts;
|
||||||
|
size_t width = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
/* Compute the width of the lookaheads column. */
|
||||||
if (!SHIFT_IS_DISABLED (shiftp, i))
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
|
if (!SHIFT_IS_DISABLED (shiftp, i)
|
||||||
|
&& SHIFT_IS_SHIFT (shiftp, i) == display_shifts_p)
|
||||||
{
|
{
|
||||||
state_number_t state1 = shiftp->shifts[i];
|
symbol_t *symbol = symbols[SHIFT_SYMBOL (shiftp, i)];
|
||||||
symbol_number_t symbol = states[state1]->accessing_symbol;
|
max_length (&width, symbol_tag_get (symbol));
|
||||||
fprintf (out,
|
|
||||||
_(" %-4s\tshift, and go to state %d\n"),
|
|
||||||
symbol_tag_get (symbols[symbol]), state1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i > 0)
|
/* Nothing to report. */
|
||||||
fputc ('\n', out);
|
if (!width)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fputc ('\n', out);
|
||||||
|
width += 2;
|
||||||
|
|
||||||
|
/* Report lookaheads and shifts. */
|
||||||
|
for (i = 0; i < shiftp->nshifts; i++)
|
||||||
|
if (!SHIFT_IS_DISABLED (shiftp, i)
|
||||||
|
&& SHIFT_IS_SHIFT (shiftp, i) == display_shifts_p)
|
||||||
|
{
|
||||||
|
symbol_t *symbol = symbols[SHIFT_SYMBOL (shiftp, i)];
|
||||||
|
const char *tag = symbol_tag_get (symbol);
|
||||||
|
state_number_t state1 = shiftp->shifts[i];
|
||||||
|
int j;
|
||||||
|
|
||||||
|
fprintf (out, " %s", tag);
|
||||||
|
for (j = width - strlen (tag); j > 0; --j)
|
||||||
|
fputc (' ', out);
|
||||||
|
if (display_shifts_p)
|
||||||
|
fprintf (out, _("shift, and go to state %d\n"), state1);
|
||||||
|
else
|
||||||
|
fprintf (out, _("go to state %d\n"), state1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------.
|
||||||
|
| Report the explicit errors of STATE raised from %nonassoc. |
|
||||||
|
`------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_errs (FILE *out, state_t *state)
|
print_errs (FILE *out, state_t *state)
|
||||||
{
|
{
|
||||||
errs_t *errp = state->errs;
|
errs_t *errp = state->errs;
|
||||||
|
size_t width = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Compute the width of the lookaheads column. */
|
||||||
for (i = 0; i < errp->nerrs; ++i)
|
for (i = 0; i < errp->nerrs; ++i)
|
||||||
if (errp->errs[i])
|
if (errp->errs[i])
|
||||||
fprintf (out, _(" %-4s\terror (nonassociative)\n"),
|
max_length (&width, symbol_tag_get (symbols[errp->errs[i]]));
|
||||||
symbol_tag_get (symbols[errp->errs[i]]));
|
|
||||||
|
|
||||||
if (i > 0)
|
/* Nothing to report. */
|
||||||
fputc ('\n', out);
|
if (!width)
|
||||||
}
|
return;
|
||||||
|
|
||||||
|
fputc ('\n', out);
|
||||||
|
width += 2;
|
||||||
|
|
||||||
static void
|
/* Report lookaheads and errors. */
|
||||||
print_gotos (FILE *out, state_t *state)
|
for (i = 0; i < errp->nerrs; ++i)
|
||||||
{
|
if (errp->errs[i])
|
||||||
int i;
|
{
|
||||||
shifts_t *shiftp = state->shifts;
|
const char *tag = symbol_tag_get (symbols[errp->errs[i]]);
|
||||||
|
int j;
|
||||||
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
|
fprintf (out, " %s", tag);
|
||||||
/* Skip token shifts. */;
|
for (j = width - strlen (tag); j > 0; --j)
|
||||||
|
fputc (' ', out);
|
||||||
if (i < shiftp->nshifts)
|
fputs (_("error (nonassociative)\n"), out);
|
||||||
{
|
}
|
||||||
for (; i < shiftp->nshifts; i++)
|
|
||||||
if (!SHIFT_IS_DISABLED (shiftp, i))
|
|
||||||
{
|
|
||||||
state_number_t state1 = shiftp->shifts[i];
|
|
||||||
symbol_number_t symbol = states[state1]->accessing_symbol;
|
|
||||||
fprintf (out, _(" %-4s\tgo to state %d\n"),
|
|
||||||
symbol_tag_get (symbols[symbol]), state1);
|
|
||||||
}
|
|
||||||
|
|
||||||
fputc ('\n', out);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -172,7 +209,7 @@ print_gotos (FILE *out, state_t *state)
|
|||||||
`----------------------------------------------------------*/
|
`----------------------------------------------------------*/
|
||||||
|
|
||||||
static rule_t *
|
static rule_t *
|
||||||
state_default_rule_compute (state_t *state)
|
state_default_rule (state_t *state)
|
||||||
{
|
{
|
||||||
reductions_t *redp = state->reductions;
|
reductions_t *redp = state->reductions;
|
||||||
rule_t *default_rule = NULL;
|
rule_t *default_rule = NULL;
|
||||||
@@ -233,6 +270,31 @@ state_default_rule_compute (state_t *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------.
|
||||||
|
| Report a reduction of RULE on LOOKAHEADS (which can be `default'). |
|
||||||
|
| If not ENABLED, the rule is masked by a shift or a reduce (S/R and |
|
||||||
|
| R/R conflicts). |
|
||||||
|
`--------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_reduction (FILE *out, size_t width,
|
||||||
|
const char *lookahead,
|
||||||
|
rule_t *rule, bool enabled)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
fprintf (out, " %s", lookahead);
|
||||||
|
for (j = width - strlen (lookahead); j > 0; --j)
|
||||||
|
fputc (' ', out);
|
||||||
|
if (!enabled)
|
||||||
|
fputc ('[', out);
|
||||||
|
fprintf (out, _("reduce using rule %d (%s)"),
|
||||||
|
rule->number - 1, symbol_tag_get (rule->lhs));
|
||||||
|
if (!enabled)
|
||||||
|
fputc (']', out);
|
||||||
|
fputc ('\n', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------.
|
/*----------------------------------------------------.
|
||||||
| Report on OUT the reduction actions of this STATE. |
|
| Report on OUT the reduction actions of this STATE. |
|
||||||
`----------------------------------------------------*/
|
`----------------------------------------------------*/
|
||||||
@@ -240,24 +302,55 @@ state_default_rule_compute (state_t *state)
|
|||||||
static void
|
static void
|
||||||
print_reductions (FILE *out, state_t *state)
|
print_reductions (FILE *out, state_t *state)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
shifts_t *shiftp = state->shifts;
|
shifts_t *shiftp = state->shifts;
|
||||||
reductions_t *redp = state->reductions;
|
reductions_t *redp = state->reductions;
|
||||||
rule_t *default_rule = NULL;
|
rule_t *default_rule = NULL;
|
||||||
|
size_t width = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
if (redp->nreds == 0)
|
if (redp->nreds == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default_rule = state_default_rule_compute (state);
|
default_rule = state_default_rule (state);
|
||||||
|
|
||||||
bitset_zero (shiftset);
|
bitset_zero (shiftset);
|
||||||
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))
|
||||||
bitset_set (shiftset, SHIFT_SYMBOL (shiftp, i));
|
bitset_set (shiftset, SHIFT_SYMBOL (shiftp, i));
|
||||||
|
|
||||||
|
/* Compute the width of the lookaheads column. */
|
||||||
|
if (default_rule)
|
||||||
|
width = strlen (_("$default"));
|
||||||
|
for (i = 0; i < ntokens; i++)
|
||||||
|
{
|
||||||
|
int count = bitset_test (shiftset, i);
|
||||||
|
|
||||||
|
for (j = 0; j < state->nlookaheads; ++j)
|
||||||
|
if (bitset_test (state->lookaheads[j], i))
|
||||||
|
{
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
if (state->lookaheads_rule[j] != default_rule)
|
||||||
|
max_length (&width, symbol_tag_get (symbols[i]));
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
max_length (&width, symbol_tag_get (symbols[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nothing to report. */
|
||||||
|
if (!width)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fputc ('\n', out);
|
||||||
|
width += 2;
|
||||||
|
|
||||||
|
/* Report lookaheads (or $default) and reductions. */
|
||||||
for (i = 0; i < ntokens; i++)
|
for (i = 0; i < ntokens; i++)
|
||||||
{
|
{
|
||||||
int j;
|
|
||||||
int defaulted = 0;
|
int defaulted = 0;
|
||||||
int count = bitset_test (shiftset, i);
|
int count = bitset_test (shiftset, i);
|
||||||
|
|
||||||
@@ -267,11 +360,9 @@ print_reductions (FILE *out, state_t *state)
|
|||||||
if (count == 0)
|
if (count == 0)
|
||||||
{
|
{
|
||||||
if (state->lookaheads_rule[j] != default_rule)
|
if (state->lookaheads_rule[j] != default_rule)
|
||||||
fprintf (out,
|
print_reduction (out, width,
|
||||||
_(" %-4s\treduce using rule %d (%s)\n"),
|
symbol_tag_get (symbols[i]),
|
||||||
symbol_tag_get (symbols[i]),
|
state->lookaheads_rule[j], TRUE);
|
||||||
state->lookaheads_rule[j]->number - 1,
|
|
||||||
symbol_tag_get_n (state->lookaheads_rule[j]->lhs, 1));
|
|
||||||
else
|
else
|
||||||
defaulted = 1;
|
defaulted = 1;
|
||||||
count++;
|
count++;
|
||||||
@@ -279,26 +370,20 @@ print_reductions (FILE *out, state_t *state)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (defaulted)
|
if (defaulted)
|
||||||
fprintf (out,
|
print_reduction (out, width,
|
||||||
_(" %-4s\treduce using rule %d (%s)\n"),
|
symbol_tag_get (symbols[i]),
|
||||||
symbol_tag_get (symbols[i]),
|
default_rule, TRUE);
|
||||||
default_rule->number - 1,
|
|
||||||
symbol_tag_get_n (default_rule->lhs, 1));
|
|
||||||
defaulted = 0;
|
defaulted = 0;
|
||||||
fprintf (out,
|
print_reduction (out, width,
|
||||||
_(" %-4s\t[reduce using rule %d (%s)]\n"),
|
symbol_tag_get (symbols[i]),
|
||||||
symbol_tag_get (symbols[i]),
|
state->lookaheads_rule[j], FALSE);
|
||||||
state->lookaheads_rule[j]->number - 1,
|
|
||||||
symbol_tag_get_n (state->lookaheads_rule[j]->lhs, 1));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (default_rule)
|
if (default_rule)
|
||||||
fprintf (out, _(" $default\treduce using rule %d (%s)\n"),
|
print_reduction (out, width,
|
||||||
default_rule->number - 1,
|
_("$default"), default_rule, TRUE);
|
||||||
symbol_tag_get (default_rule->lhs));
|
|
||||||
fputc ('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -315,6 +400,7 @@ print_actions (FILE *out, state_t *state)
|
|||||||
|
|
||||||
if (shiftp->nshifts == 0 && redp->nreds == 0)
|
if (shiftp->nshifts == 0 && redp->nreds == 0)
|
||||||
{
|
{
|
||||||
|
fputc ('\n', out);
|
||||||
if (state->number == final_state->number)
|
if (state->number == final_state->number)
|
||||||
fprintf (out, _(" $default\taccept\n"));
|
fprintf (out, _(" $default\taccept\n"));
|
||||||
else
|
else
|
||||||
@@ -322,24 +408,30 @@ print_actions (FILE *out, state_t *state)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_shifts (out, state);
|
/* Print shifts. */
|
||||||
|
print_transitions (state, out, TRUE);
|
||||||
print_errs (out, state);
|
print_errs (out, state);
|
||||||
print_reductions (out, state);
|
print_reductions (out, state);
|
||||||
print_gotos (out, state);
|
/* Print gotos. */
|
||||||
|
print_transitions (state, out, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------.
|
||||||
|
| Report all the data on STATE on OUT. |
|
||||||
|
`--------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_state (FILE *out, state_t *state)
|
print_state (FILE *out, state_t *state)
|
||||||
{
|
{
|
||||||
fprintf (out, _("state %d"), state->number);
|
|
||||||
fputs ("\n\n", out);
|
fputs ("\n\n", out);
|
||||||
|
fprintf (out, _("state %d"), state->number);
|
||||||
|
fputc ('\n', out);
|
||||||
print_core (out, state);
|
print_core (out, state);
|
||||||
print_actions (out, state);
|
print_actions (out, state);
|
||||||
if ((report_flag & report_solved_conflicts)
|
if ((report_flag & report_solved_conflicts)
|
||||||
&& state->solved_conflicts)
|
&& state->solved_conflicts)
|
||||||
fputs (state->solved_conflicts, out);
|
fputs (state->solved_conflicts, out);
|
||||||
fputs ("\n\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------.
|
/*-----------------------------------------.
|
||||||
@@ -453,7 +545,6 @@ print_grammar (FILE *out)
|
|||||||
}
|
}
|
||||||
fprintf (out, "%s\n", buffer);
|
fprintf (out, "%s\n", buffer);
|
||||||
}
|
}
|
||||||
fputs ("\n\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -178,18 +178,16 @@ state 0
|
|||||||
1 exp: . exp OP exp
|
1 exp: . exp OP exp
|
||||||
2 | . NUM
|
2 | . NUM
|
||||||
|
|
||||||
NUM shift, and go to state 1
|
NUM shift, and go to state 1
|
||||||
|
|
||||||
exp go to state 2
|
|
||||||
|
|
||||||
|
exp go to state 2
|
||||||
|
|
||||||
|
|
||||||
state 1
|
state 1
|
||||||
|
|
||||||
2 exp: NUM .
|
2 exp: NUM .
|
||||||
|
|
||||||
$default reduce using rule 2 (exp)
|
$default reduce using rule 2 (exp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 2
|
state 2
|
||||||
@@ -197,9 +195,8 @@ state 2
|
|||||||
0 $axiom: exp . $
|
0 $axiom: exp . $
|
||||||
1 exp: exp . OP exp
|
1 exp: exp . OP exp
|
||||||
|
|
||||||
$ shift, and go to state 3
|
$ shift, and go to state 3
|
||||||
OP shift, and go to state 4
|
OP shift, and go to state 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 3
|
state 3
|
||||||
@@ -215,10 +212,9 @@ state 4
|
|||||||
1 | exp OP . exp
|
1 | exp OP . exp
|
||||||
2 | . NUM
|
2 | . NUM
|
||||||
|
|
||||||
NUM shift, and go to state 1
|
NUM shift, and go to state 1
|
||||||
|
|
||||||
exp go to state 5
|
|
||||||
|
|
||||||
|
exp go to state 5
|
||||||
|
|
||||||
|
|
||||||
state 5
|
state 5
|
||||||
@@ -226,13 +222,10 @@ state 5
|
|||||||
1 exp: exp . OP exp [$, OP]
|
1 exp: exp . OP exp [$, OP]
|
||||||
1 | exp OP exp . [$, OP]
|
1 | exp OP exp . [$, OP]
|
||||||
|
|
||||||
OP shift, and go to state 4
|
OP shift, and go to state 4
|
||||||
|
|
||||||
OP [reduce using rule 1 (exp)]
|
|
||||||
$default reduce using rule 1 (exp)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
OP [reduce using rule 1 (exp)]
|
||||||
|
$default reduce using rule 1 (exp)
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
@@ -288,18 +281,16 @@ state 0
|
|||||||
1 exp: . exp OP exp
|
1 exp: . exp OP exp
|
||||||
2 | . NUM
|
2 | . NUM
|
||||||
|
|
||||||
NUM shift, and go to state 1
|
NUM shift, and go to state 1
|
||||||
|
|
||||||
exp go to state 2
|
|
||||||
|
|
||||||
|
exp go to state 2
|
||||||
|
|
||||||
|
|
||||||
state 1
|
state 1
|
||||||
|
|
||||||
2 exp: NUM .
|
2 exp: NUM .
|
||||||
|
|
||||||
$default reduce using rule 2 (exp)
|
$default reduce using rule 2 (exp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 2
|
state 2
|
||||||
@@ -307,9 +298,8 @@ state 2
|
|||||||
0 $axiom: exp . $
|
0 $axiom: exp . $
|
||||||
1 exp: exp . OP exp
|
1 exp: exp . OP exp
|
||||||
|
|
||||||
$ shift, and go to state 3
|
$ shift, and go to state 3
|
||||||
OP shift, and go to state 4
|
OP shift, and go to state 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 3
|
state 3
|
||||||
@@ -325,10 +315,9 @@ state 4
|
|||||||
1 | exp OP . exp
|
1 | exp OP . exp
|
||||||
2 | . NUM
|
2 | . NUM
|
||||||
|
|
||||||
NUM shift, and go to state 1
|
NUM shift, and go to state 1
|
||||||
|
|
||||||
exp go to state 5
|
|
||||||
|
|
||||||
|
exp go to state 5
|
||||||
|
|
||||||
|
|
||||||
state 5
|
state 5
|
||||||
@@ -336,12 +325,8 @@ state 5
|
|||||||
1 exp: exp . OP exp [$, OP]
|
1 exp: exp . OP exp [$, OP]
|
||||||
1 | exp OP exp . [$, OP]
|
1 | exp OP exp . [$, OP]
|
||||||
|
|
||||||
|
$default reduce using rule 1 (exp)
|
||||||
$default reduce using rule 1 (exp)
|
|
||||||
|
|
||||||
Conflict between rule 2 and token OP resolved as shift (%left OP).
|
Conflict between rule 2 and token OP resolved as shift (%left OP).
|
||||||
|
|
||||||
|
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
@@ -431,12 +416,11 @@ state 0
|
|||||||
3 num: . '0'
|
3 num: . '0'
|
||||||
4 id: . '0'
|
4 id: . '0'
|
||||||
|
|
||||||
'0' shift, and go to state 1
|
'0' shift, and go to state 1
|
||||||
|
|
||||||
exp go to state 2
|
|
||||||
num go to state 3
|
|
||||||
id go to state 4
|
|
||||||
|
|
||||||
|
exp go to state 2
|
||||||
|
num go to state 3
|
||||||
|
id go to state 4
|
||||||
|
|
||||||
|
|
||||||
state 1
|
state 1
|
||||||
@@ -444,34 +428,30 @@ state 1
|
|||||||
3 num: '0' . [$]
|
3 num: '0' . [$]
|
||||||
4 id: '0' . [$]
|
4 id: '0' . [$]
|
||||||
|
|
||||||
$ reduce using rule 3 (num)
|
$ reduce using rule 3 (num)
|
||||||
$ [reduce using rule 4 (id)]
|
$ [reduce using rule 4 (id)]
|
||||||
$default reduce using rule 3 (num)
|
$default reduce using rule 3 (num)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 2
|
state 2
|
||||||
|
|
||||||
0 $axiom: exp . $
|
0 $axiom: exp . $
|
||||||
|
|
||||||
$ shift, and go to state 5
|
$ shift, and go to state 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 3
|
state 3
|
||||||
|
|
||||||
1 exp: num .
|
1 exp: num .
|
||||||
|
|
||||||
$default reduce using rule 1 (exp)
|
$default reduce using rule 1 (exp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 4
|
state 4
|
||||||
|
|
||||||
2 exp: id .
|
2 exp: id .
|
||||||
|
|
||||||
$default reduce using rule 2 (exp)
|
$default reduce using rule 2 (exp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 5
|
state 5
|
||||||
@@ -479,8 +459,6 @@ state 5
|
|||||||
0 $axiom: exp $ .
|
0 $axiom: exp $ .
|
||||||
|
|
||||||
$default accept
|
$default accept
|
||||||
|
|
||||||
|
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|||||||
@@ -186,47 +186,42 @@ state 0
|
|||||||
|
|
||||||
0 $axiom: . expr $
|
0 $axiom: . expr $
|
||||||
|
|
||||||
'a' shift, and go to state 1
|
'a' shift, and go to state 1
|
||||||
|
|
||||||
$default reduce using rule 3 (@2)
|
$default reduce using rule 3 (@2)
|
||||||
|
|
||||||
expr go to state 2
|
|
||||||
@2 go to state 3
|
|
||||||
|
|
||||||
|
expr go to state 2
|
||||||
|
@2 go to state 3
|
||||||
|
|
||||||
|
|
||||||
state 1
|
state 1
|
||||||
|
|
||||||
2 expr: 'a' . @1 'b'
|
2 expr: 'a' . @1 'b'
|
||||||
|
|
||||||
$default reduce using rule 1 (@1)
|
$default reduce using rule 1 (@1)
|
||||||
|
|
||||||
@1 go to state 4
|
|
||||||
|
|
||||||
|
@1 go to state 4
|
||||||
|
|
||||||
|
|
||||||
state 2
|
state 2
|
||||||
|
|
||||||
0 $axiom: expr . $
|
0 $axiom: expr . $
|
||||||
|
|
||||||
$ shift, and go to state 5
|
$ shift, and go to state 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 3
|
state 3
|
||||||
|
|
||||||
4 expr: @2 . 'c'
|
4 expr: @2 . 'c'
|
||||||
|
|
||||||
'c' shift, and go to state 6
|
'c' shift, and go to state 6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 4
|
state 4
|
||||||
|
|
||||||
2 expr: 'a' @1 . 'b'
|
2 expr: 'a' @1 . 'b'
|
||||||
|
|
||||||
'b' shift, and go to state 7
|
'b' shift, and go to state 7
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 5
|
state 5
|
||||||
@@ -240,18 +235,14 @@ state 6
|
|||||||
|
|
||||||
4 expr: @2 'c' .
|
4 expr: @2 'c' .
|
||||||
|
|
||||||
$default reduce using rule 4 (expr)
|
$default reduce using rule 4 (expr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state 7
|
state 7
|
||||||
|
|
||||||
2 expr: 'a' @1 'b' .
|
2 expr: 'a' @1 'b' .
|
||||||
|
|
||||||
$default reduce using rule 2 (expr)
|
$default reduce using rule 2 (expr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
@@ -378,23 +369,33 @@ CONST_DEC:
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CHECK([bison -v input.y])
|
AT_CHECK([bison -v input.y])
|
||||||
sed -n 's/ *$//;/^$/!p' input.output >input.report
|
AT_CHECK([cat input.output], 0,
|
||||||
AT_CHECK([cat input.report], 0,
|
|
||||||
[[Grammar
|
[[Grammar
|
||||||
|
|
||||||
0 $axiom: CONST_DEC_PART $
|
0 $axiom: CONST_DEC_PART $
|
||||||
|
|
||||||
1 CONST_DEC_PART: CONST_DEC_LIST
|
1 CONST_DEC_PART: CONST_DEC_LIST
|
||||||
|
|
||||||
2 CONST_DEC_LIST: CONST_DEC
|
2 CONST_DEC_LIST: CONST_DEC
|
||||||
3 | CONST_DEC_LIST CONST_DEC
|
3 | CONST_DEC_LIST CONST_DEC
|
||||||
|
|
||||||
4 @1: /* empty */
|
4 @1: /* empty */
|
||||||
|
|
||||||
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
|
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
|
||||||
|
|
||||||
|
|
||||||
Terminals, with rules where they appear
|
Terminals, with rules where they appear
|
||||||
|
|
||||||
$ (0) 0
|
$ (0) 0
|
||||||
';' (59) 5
|
';' (59) 5
|
||||||
'=' (61) 5
|
'=' (61) 5
|
||||||
error (256)
|
error (256)
|
||||||
undef_id_tok (258) 5
|
undef_id_tok (258) 5
|
||||||
const_id_tok (259) 5
|
const_id_tok (259) 5
|
||||||
|
|
||||||
|
|
||||||
Nonterminals, with rules where they appear
|
Nonterminals, with rules where they appear
|
||||||
|
|
||||||
$axiom (7)
|
$axiom (7)
|
||||||
on left: 0
|
on left: 0
|
||||||
CONST_DEC_PART (8)
|
CONST_DEC_PART (8)
|
||||||
@@ -405,47 +406,93 @@ CONST_DEC (10)
|
|||||||
on left: 5, on right: 2 3
|
on left: 5, on right: 2 3
|
||||||
@1 (11)
|
@1 (11)
|
||||||
on left: 4, on right: 5
|
on left: 4, on right: 5
|
||||||
|
|
||||||
|
|
||||||
state 0
|
state 0
|
||||||
|
|
||||||
0 $axiom: . CONST_DEC_PART $
|
0 $axiom: . CONST_DEC_PART $
|
||||||
$default reduce using rule 4 (@1)
|
|
||||||
CONST_DEC_PART go to state 1
|
$default reduce using rule 4 (@1)
|
||||||
CONST_DEC_LIST go to state 2
|
|
||||||
CONST_DEC go to state 3
|
CONST_DEC_PART go to state 1
|
||||||
@1 go to state 4
|
CONST_DEC_LIST go to state 2
|
||||||
|
CONST_DEC go to state 3
|
||||||
|
@1 go to state 4
|
||||||
|
|
||||||
|
|
||||||
state 1
|
state 1
|
||||||
|
|
||||||
0 $axiom: CONST_DEC_PART . $
|
0 $axiom: CONST_DEC_PART . $
|
||||||
$ shift, and go to state 5
|
|
||||||
|
$ shift, and go to state 5
|
||||||
|
|
||||||
|
|
||||||
state 2
|
state 2
|
||||||
|
|
||||||
1 CONST_DEC_PART: CONST_DEC_LIST .
|
1 CONST_DEC_PART: CONST_DEC_LIST .
|
||||||
3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
|
3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
|
||||||
undef_id_tok reduce using rule 4 (@1)
|
|
||||||
$default reduce using rule 1 (CONST_DEC_PART)
|
undef_id_tok reduce using rule 4 (@1)
|
||||||
CONST_DEC go to state 6
|
$default reduce using rule 1 (CONST_DEC_PART)
|
||||||
@1 go to state 4
|
|
||||||
|
CONST_DEC go to state 6
|
||||||
|
@1 go to state 4
|
||||||
|
|
||||||
|
|
||||||
state 3
|
state 3
|
||||||
|
|
||||||
2 CONST_DEC_LIST: CONST_DEC .
|
2 CONST_DEC_LIST: CONST_DEC .
|
||||||
$default reduce using rule 2 (CONST_DEC_LIST)
|
|
||||||
|
$default reduce using rule 2 (CONST_DEC_LIST)
|
||||||
|
|
||||||
|
|
||||||
state 4
|
state 4
|
||||||
|
|
||||||
5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
|
5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
|
||||||
undef_id_tok shift, and go to state 7
|
|
||||||
|
undef_id_tok shift, and go to state 7
|
||||||
|
|
||||||
|
|
||||||
state 5
|
state 5
|
||||||
|
|
||||||
0 $axiom: CONST_DEC_PART $ .
|
0 $axiom: CONST_DEC_PART $ .
|
||||||
|
|
||||||
$default accept
|
$default accept
|
||||||
|
|
||||||
|
|
||||||
state 6
|
state 6
|
||||||
|
|
||||||
3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
|
3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
|
||||||
$default reduce using rule 3 (CONST_DEC_LIST)
|
|
||||||
|
$default reduce using rule 3 (CONST_DEC_LIST)
|
||||||
|
|
||||||
|
|
||||||
state 7
|
state 7
|
||||||
|
|
||||||
5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
|
5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
|
||||||
'=' shift, and go to state 8
|
|
||||||
|
'=' shift, and go to state 8
|
||||||
|
|
||||||
|
|
||||||
state 8
|
state 8
|
||||||
|
|
||||||
5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
|
5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
|
||||||
const_id_tok shift, and go to state 9
|
|
||||||
|
const_id_tok shift, and go to state 9
|
||||||
|
|
||||||
|
|
||||||
state 9
|
state 9
|
||||||
|
|
||||||
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
|
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
|
||||||
';' shift, and go to state 10
|
|
||||||
|
';' shift, and go to state 10
|
||||||
|
|
||||||
|
|
||||||
state 10
|
state 10
|
||||||
|
|
||||||
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
|
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
|
||||||
$default reduce using rule 5 (CONST_DEC)
|
|
||||||
|
$default reduce using rule 5 (CONST_DEC)
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|||||||
Reference in New Issue
Block a user