From 87675353bfb6d024d99d0b0298e65c9897600706 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 30 Jun 2002 17:33:20 +0000 Subject: [PATCH] * 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. --- ChangeLog | 14 ++++ src/print.c | 227 ++++++++++++++++++++++++++++++++++++---------------- tests/conflicts.at | 78 +++++++----------- tests/regression.at | 125 ++++++++++++++++++++--------- 4 files changed, 287 insertions(+), 157 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ee7b2a..acdcfdb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2002-06-30 Akim Demaille + * 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 + Display items as we display rules. * src/gram.h, src/gram.c (rule_lhs_print): New. diff --git a/src/print.c b/src/print.c index 76e5f74..f1dbe12 100644 --- a/src/print.c +++ b/src/print.c @@ -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]])); - - 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; - 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 diff --git a/tests/conflicts.at b/tests/conflicts.at index 63e494d..808fd6f 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -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 diff --git a/tests/regression.at b/tests/regression.at index 456f5a8..48c111c 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -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 -- 2.7.4