(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>
+
+ * 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.
2002-06-30 Akim Demaille <akim@epita.fr>
Display items as we display rules.
+
+/*---------------------------------------.
+| *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. |
`--------------------------------*/
for (i = 0; i < snritems; i++)
{
item_number_t *sp;
for (i = 0; i < snritems; i++)
{
item_number_t *sp;
+/*----------------------------------------------------------------.
+| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of STATE on |
+| OUT. |
+`----------------------------------------------------------------*/
+
-print_shifts (FILE *out, state_t *state)
+print_transitions (state_t *state, FILE *out, bool display_shifts_p)
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++)
- 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;
static void
print_errs (FILE *out, state_t *state)
{
errs_t *errp = state->errs;
+ /* Compute the width of the lookaheads column. */
for (i = 0; i < errp->nerrs; ++i)
if (errp->errs[i])
for (i = 0; i < errp->nerrs; ++i)
if (errp->errs[i])
- fprintf (out, _(" %-4s\terror (nonassociative)\n"),
- symbol_tag_get (symbols[errp->errs[i]]));
-
- if (i > 0)
- fputc ('\n', out);
-}
-
-
-static void
-print_gotos (FILE *out, state_t *state)
-{
- int i;
- shifts_t *shiftp = state->shifts;
+ max_length (&width, symbol_tag_get (symbols[errp->errs[i]]));
- for (i = 0; i < shiftp->nshifts && SHIFT_IS_SHIFT (shiftp, i); i++)
- /* Skip token shifts. */;
+ /* Nothing to report. */
+ if (!width)
+ return;
- 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);
+ width += 2;
+ /* 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);
+ }
`----------------------------------------------------------*/
static rule_t *
`----------------------------------------------------------*/
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;
{
reductions_t *redp = state->reductions;
rule_t *default_rule = NULL;
+/*--------------------------------------------------------------------.
+| 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. |
`----------------------------------------------------*/
static void
print_reductions (FILE *out, state_t *state)
{
static void
print_reductions (FILE *out, state_t *state)
{
shifts_t *shiftp = state->shifts;
reductions_t *redp = state->reductions;
rule_t *default_rule = NULL;
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;
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));
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++)
{
for (i = 0; i < ntokens; i++)
{
int defaulted = 0;
int count = bitset_test (shiftset, i);
int defaulted = 0;
int count = bitset_test (shiftset, i);
if (count == 0)
{
if (state->lookaheads_rule[j] != default_rule)
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++;
else
defaulted = 1;
count++;
- 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);
- 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);
- 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);
if (shiftp->nshifts == 0 && redp->nreds == 0)
{
if (shiftp->nshifts == 0 && redp->nreds == 0)
{
if (state->number == final_state->number)
fprintf (out, _(" $default\taccept\n"));
else
if (state->number == final_state->number)
fprintf (out, _(" $default\taccept\n"));
else
- print_shifts (out, state);
+ /* Print shifts. */
+ print_transitions (state, out, TRUE);
print_errs (out, state);
print_reductions (out, state);
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)
{
static void
print_state (FILE *out, state_t *state)
{
- fprintf (out, _("state %d"), state->number);
+ 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);
print_core (out, state);
print_actions (out, state);
if ((report_flag & report_solved_conflicts)
&& state->solved_conflicts)
fputs (state->solved_conflicts, out);
}
\f
/*-----------------------------------------.
}
\f
/*-----------------------------------------.
}
fprintf (out, "%s\n", buffer);
}
}
fprintf (out, "%s\n", buffer);
}
1 exp: . exp OP exp
2 | . NUM
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
- $default reduce using rule 2 (exp)
-
+ $default reduce using rule 2 (exp)
0 $axiom: exp . $
1 exp: exp . OP exp
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
1 | exp OP . exp
2 | . NUM
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
1 exp: exp . OP exp [$, OP]
1 | exp OP exp . [$, OP]
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)
1 exp: . exp OP exp
2 | . NUM
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
- $default reduce using rule 2 (exp)
-
+ $default reduce using rule 2 (exp)
0 $axiom: exp . $
1 exp: exp . OP exp
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
1 | exp OP . exp
2 | . NUM
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
1 exp: exp . OP exp [$, OP]
1 | exp OP exp . [$, OP]
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).
Conflict between rule 2 and token OP resolved as shift (%left OP).
- '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
3 num: '0' . [$]
4 id: '0' . [$]
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 . $
state 2
0 $axiom: exp . $
- $ shift, and go to state 5
-
+ $ shift, and go to state 5
- $default reduce using rule 1 (exp)
-
+ $default reduce using rule 1 (exp)
- $default reduce using rule 2 (exp)
-
+ $default reduce using rule 2 (exp)
0 $axiom: exp $ .
$default accept
0 $axiom: exp $ .
$default accept
- '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'
state 1
2 expr: 'a' . @1 'b'
- $default reduce using rule 1 (@1)
-
- @1 go to state 4
+ $default reduce using rule 1 (@1)
state 2
0 $axiom: expr . $
state 2
0 $axiom: expr . $
- $ shift, and go to state 5
-
+ $ shift, and go to state 5
- 'c' shift, and go to state 6
-
+ 'c' shift, and go to state 6
state 4
2 expr: 'a' @1 . 'b'
state 4
2 expr: 'a' @1 . 'b'
- 'b' shift, and go to state 7
-
+ 'b' shift, and go to state 7
- $default reduce using rule 4 (expr)
-
+ $default reduce using rule 4 (expr)
state 7
2 expr: 'a' @1 'b' .
state 7
2 expr: 'a' @1 'b' .
- $default reduce using rule 2 (expr)
-
-
-
+ $default reduce using rule 2 (expr)
]])
AT_CHECK([bison -v input.y])
]])
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,
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
3 | CONST_DEC_LIST CONST_DEC
2 CONST_DEC_LIST: CONST_DEC
3 | CONST_DEC_LIST CONST_DEC
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
';' (59) 5
'=' (61) 5
error (256)
undef_id_tok (258) 5
const_id_tok (259) 5
$ (0) 0
';' (59) 5
'=' (61) 5
error (256)
undef_id_tok (258) 5
const_id_tok (259) 5
Nonterminals, with rules where they appear
Nonterminals, with rules where they appear
$axiom (7)
on left: 0
CONST_DEC_PART (8)
$axiom (7)
on left: 0
CONST_DEC_PART (8)
on left: 5, on right: 2 3
@1 (11)
on left: 4, on right: 5
on left: 5, on right: 2 3
@1 (11)
on left: 4, on right: 5
0 $axiom: . CONST_DEC_PART $
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
+
+
0 $axiom: CONST_DEC_PART . $
0 $axiom: CONST_DEC_PART . $
- $ shift, and go to state 5
+
+ $ shift, and go to state 5
+
+
1 CONST_DEC_PART: CONST_DEC_LIST .
3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC
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
+
+
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)
+
+
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
+
+
0 $axiom: CONST_DEC_PART $ .
0 $axiom: CONST_DEC_PART $ .
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)
+
+
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
+
+
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
+
+
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
+
+
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)