* 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:
Akim Demaille
2002-06-30 17:33:20 +00:00
parent ce4ccb4b11
commit 87675353bf
4 changed files with 287 additions and 157 deletions

View File

@@ -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>
Display items as we display rules.

View File

@@ -48,6 +48,19 @@ print_token (int extnum, int token)
#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. |
`--------------------------------*/
@@ -71,6 +84,8 @@ print_core (FILE *out, state_t *state)
if (!snritems)
return;
fputc ('\n', out);
for (i = 0; i < snritems; i++)
{
item_number_t *sp;
@@ -99,70 +114,92 @@ print_core (FILE *out, state_t *state)
fputc ('\n', out);
}
fputc ('\n', out);
}
/*----------------------------------------------------------------.
| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of STATE on |
| OUT. |
`----------------------------------------------------------------*/
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;
size_t width = 0;
int i;
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
if (!SHIFT_IS_DISABLED (shiftp, i))
/* Compute the width of the lookaheads column. */
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_number_t symbol = states[state1]->accessing_symbol;
fprintf (out,
_(" %-4s\tshift, and go to state %d\n"),
symbol_tag_get (symbols[symbol]), state1);
symbol_t *symbol = symbols[SHIFT_SYMBOL (shiftp, i)];
max_length (&width, symbol_tag_get (symbol));
}
if (i > 0)
fputc ('\n', out);
/* Nothing to report. */
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
print_errs (FILE *out, state_t *state)
{
errs_t *errp = state->errs;
size_t width = 0;
int i;
/* Compute the width of the lookaheads column. */
for (i = 0; i < errp->nerrs; ++i)
if (errp->errs[i])
fprintf (out, _(" %-4s\terror (nonassociative)\n"),
symbol_tag_get (symbols[errp->errs[i]]));
max_length (&width, symbol_tag_get (symbols[errp->errs[i]]));
if (i > 0)
fputc ('\n', out);
}
/* Nothing to report. */
if (!width)
return;
fputc ('\n', out);
width += 2;
static void
print_gotos (FILE *out, state_t *state)
{
int i;
shifts_t *shiftp = state->shifts;
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
/* Skip token shifts. */;
if (i < shiftp->nshifts)
{
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);
}
/* Report lookaheads and errors. */
for (i = 0; i < errp->nerrs; ++i)
if (errp->errs[i])
{
const char *tag = symbol_tag_get (symbols[errp->errs[i]]);
int j;
fprintf (out, " %s", tag);
for (j = width - strlen (tag); j > 0; --j)
fputc (' ', out);
fputs (_("error (nonassociative)\n"), out);
}
}
@@ -172,7 +209,7 @@ print_gotos (FILE *out, state_t *state)
`----------------------------------------------------------*/
static rule_t *
state_default_rule_compute (state_t *state)
state_default_rule (state_t *state)
{
reductions_t *redp = state->reductions;
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. |
`----------------------------------------------------*/
@@ -240,24 +302,55 @@ state_default_rule_compute (state_t *state)
static void
print_reductions (FILE *out, state_t *state)
{
int i;
shifts_t *shiftp = state->shifts;
reductions_t *redp = state->reductions;
rule_t *default_rule = NULL;
size_t width = 0;
int i, j;
if (redp->nreds == 0)
return;
default_rule = state_default_rule_compute (state);
default_rule = state_default_rule (state);
bitset_zero (shiftset);
for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
if (!SHIFT_IS_DISABLED (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++)
{
int j;
int defaulted = 0;
int count = bitset_test (shiftset, i);
@@ -267,11 +360,9 @@ print_reductions (FILE *out, state_t *state)
if (count == 0)
{
if (state->lookaheads_rule[j] != default_rule)
fprintf (out,
_(" %-4s\treduce using rule %d (%s)\n"),
symbol_tag_get (symbols[i]),
state->lookaheads_rule[j]->number - 1,
symbol_tag_get_n (state->lookaheads_rule[j]->lhs, 1));
print_reduction (out, width,
symbol_tag_get (symbols[i]),
state->lookaheads_rule[j], TRUE);
else
defaulted = 1;
count++;
@@ -279,26 +370,20 @@ print_reductions (FILE *out, state_t *state)
else
{
if (defaulted)
fprintf (out,
_(" %-4s\treduce using rule %d (%s)\n"),
symbol_tag_get (symbols[i]),
default_rule->number - 1,
symbol_tag_get_n (default_rule->lhs, 1));
print_reduction (out, width,
symbol_tag_get (symbols[i]),
default_rule, TRUE);
defaulted = 0;
fprintf (out,
_(" %-4s\t[reduce using rule %d (%s)]\n"),
symbol_tag_get (symbols[i]),
state->lookaheads_rule[j]->number - 1,
symbol_tag_get_n (state->lookaheads_rule[j]->lhs, 1));
print_reduction (out, width,
symbol_tag_get (symbols[i]),
state->lookaheads_rule[j], FALSE);
}
}
}
if (default_rule)
fprintf (out, _(" $default\treduce using rule %d (%s)\n"),
default_rule->number - 1,
symbol_tag_get (default_rule->lhs));
fputc ('\n', out);
print_reduction (out, width,
_("$default"), default_rule, TRUE);
}
@@ -315,6 +400,7 @@ print_actions (FILE *out, state_t *state)
if (shiftp->nshifts == 0 && redp->nreds == 0)
{
fputc ('\n', out);
if (state->number == final_state->number)
fprintf (out, _(" $default\taccept\n"));
else
@@ -322,24 +408,30 @@ print_actions (FILE *out, state_t *state)
return;
}
print_shifts (out, state);
/* Print shifts. */
print_transitions (state, out, TRUE);
print_errs (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
print_state (FILE *out, state_t *state)
{
fprintf (out, _("state %d"), state->number);
fputs ("\n\n", out);
fprintf (out, _("state %d"), state->number);
fputc ('\n', out);
print_core (out, state);
print_actions (out, state);
if ((report_flag & report_solved_conflicts)
&& state->solved_conflicts)
fputs (state->solved_conflicts, out);
fputs ("\n\n", out);
}
/*-----------------------------------------.
@@ -453,7 +545,6 @@ print_grammar (FILE *out)
}
fprintf (out, "%s\n", buffer);
}
fputs ("\n\n", out);
}
void

View File

@@ -178,18 +178,16 @@ state 0
1 exp: . exp OP exp
2 | . NUM
NUM shift, and go to state 1
exp go to state 2
NUM shift, and go to state 1
exp go to state 2
state 1
2 exp: NUM .
$default reduce using rule 2 (exp)
$default reduce using rule 2 (exp)
state 2
@@ -197,9 +195,8 @@ state 2
0 $axiom: exp . $
1 exp: exp . OP exp
$ shift, and go to state 3
OP shift, and go to state 4
$ shift, and go to state 3
OP shift, and go to state 4
state 3
@@ -215,10 +212,9 @@ state 4
1 | exp OP . exp
2 | . NUM
NUM shift, and go to state 1
exp go to state 5
NUM shift, and go to state 1
exp go to state 5
state 5
@@ -226,13 +222,10 @@ state 5
1 exp: exp . OP exp [$, OP]
1 | exp OP exp . [$, OP]
OP shift, and go to state 4
OP [reduce using rule 1 (exp)]
$default reduce using rule 1 (exp)
OP shift, and go to state 4
OP [reduce using rule 1 (exp)]
$default reduce using rule 1 (exp)
]])
AT_CLEANUP
@@ -288,18 +281,16 @@ state 0
1 exp: . exp OP exp
2 | . NUM
NUM shift, and go to state 1
exp go to state 2
NUM shift, and go to state 1
exp go to state 2
state 1
2 exp: NUM .
$default reduce using rule 2 (exp)
$default reduce using rule 2 (exp)
state 2
@@ -307,9 +298,8 @@ state 2
0 $axiom: exp . $
1 exp: exp . OP exp
$ shift, and go to state 3
OP shift, and go to state 4
$ shift, and go to state 3
OP shift, and go to state 4
state 3
@@ -325,10 +315,9 @@ state 4
1 | exp OP . exp
2 | . NUM
NUM shift, and go to state 1
exp go to state 5
NUM shift, and go to state 1
exp go to state 5
state 5
@@ -336,12 +325,8 @@ state 5
1 exp: 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).
]])
AT_CLEANUP
@@ -431,12 +416,11 @@ state 0
3 num: . '0'
4 id: . '0'
'0' shift, and go to state 1
exp go to state 2
num go to state 3
id go to state 4
'0' shift, and go to state 1
exp go to state 2
num go to state 3
id go to state 4
state 1
@@ -444,34 +428,30 @@ state 1
3 num: '0' . [$]
4 id: '0' . [$]
$ reduce using rule 3 (num)
$ [reduce using rule 4 (id)]
$default reduce using rule 3 (num)
$ reduce using rule 3 (num)
$ [reduce using rule 4 (id)]
$default reduce using rule 3 (num)
state 2
0 $axiom: exp . $
$ shift, and go to state 5
$ shift, and go to state 5
state 3
1 exp: num .
$default reduce using rule 1 (exp)
$default reduce using rule 1 (exp)
state 4
2 exp: id .
$default reduce using rule 2 (exp)
$default reduce using rule 2 (exp)
state 5
@@ -479,8 +459,6 @@ state 5
0 $axiom: exp $ .
$default accept
]])
AT_CLEANUP

View File

@@ -186,47 +186,42 @@ state 0
0 $axiom: . expr $
'a' shift, and go to state 1
'a' shift, and go to state 1
$default reduce using rule 3 (@2)
expr go to state 2
@2 go to state 3
$default reduce using rule 3 (@2)
expr go to state 2
@2 go to state 3
state 1
2 expr: 'a' . @1 'b'
$default reduce using rule 1 (@1)
@1 go to state 4
$default reduce using rule 1 (@1)
@1 go to state 4
state 2
0 $axiom: expr . $
$ shift, and go to state 5
$ shift, and go to state 5
state 3
4 expr: @2 . 'c'
'c' shift, and go to state 6
'c' shift, and go to state 6
state 4
2 expr: 'a' @1 . 'b'
'b' shift, and go to state 7
'b' shift, and go to state 7
state 5
@@ -240,18 +235,14 @@ state 6
4 expr: @2 'c' .
$default reduce using rule 4 (expr)
$default reduce using rule 4 (expr)
state 7
2 expr: 'a' @1 'b' .
$default reduce using rule 2 (expr)
$default reduce using rule 2 (expr)
]])
AT_CLEANUP
@@ -378,23 +369,33 @@ CONST_DEC:
]])
AT_CHECK([bison -v input.y])
sed -n 's/ *$//;/^$/!p' input.output >input.report
AT_CHECK([cat input.report], 0,
AT_CHECK([cat input.output], 0,
[[Grammar
0 $axiom: CONST_DEC_PART $
1 CONST_DEC_PART: CONST_DEC_LIST
2 CONST_DEC_LIST: CONST_DEC
3 | CONST_DEC_LIST CONST_DEC
4 @1: /* empty */
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
Terminals, with rules where they appear
$ (0) 0
';' (59) 5
'=' (61) 5
error (256)
undef_id_tok (258) 5
const_id_tok (259) 5
Nonterminals, with rules where they appear
$axiom (7)
on left: 0
CONST_DEC_PART (8)
@@ -405,47 +406,93 @@ CONST_DEC (10)
on left: 5, on right: 2 3
@1 (11)
on left: 4, on right: 5
state 0
0 $axiom: . CONST_DEC_PART $
$default reduce using rule 4 (@1)
CONST_DEC_PART go to state 1
CONST_DEC_LIST go to state 2
CONST_DEC go to state 3
@1 go to state 4
$default reduce using rule 4 (@1)
CONST_DEC_PART go to state 1
CONST_DEC_LIST go to state 2
CONST_DEC go to state 3
@1 go to state 4
state 1
0 $axiom: CONST_DEC_PART . $
$ shift, and go to state 5
$ shift, and go to state 5
state 2
1 CONST_DEC_PART: CONST_DEC_LIST .
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)
CONST_DEC go to state 6
@1 go to state 4
undef_id_tok reduce using rule 4 (@1)
$default reduce using rule 1 (CONST_DEC_PART)
CONST_DEC go to state 6
@1 go to state 4
state 3
2 CONST_DEC_LIST: CONST_DEC .
$default reduce using rule 2 (CONST_DEC_LIST)
$default reduce using rule 2 (CONST_DEC_LIST)
state 4
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
0 $axiom: CONST_DEC_PART $ .
$default accept
state 6
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
5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
'=' shift, and go to state 8
'=' shift, and go to state 8
state 8
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
5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
';' shift, and go to state 10
';' shift, and go to state 10
state 10
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