* src/print.c (print_shifts, print_gotos): Merge into...
authorAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:33:20 +0000 (17:33 +0000)
committerAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:33:20 +0000 (17:33 +0000)
(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
src/print.c
tests/conflicts.at
tests/regression.at

index 0ee7b2a..acdcfdb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 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.
 
        * src/gram.h, src/gram.c (rule_lhs_print): New.
index 76e5f74..f1dbe12 100644 (file)
@@ -48,6 +48,19 @@ print_token (int extnum, int token)
 #endif
 
 \f
+
+/*---------------------------------------.
+| *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);
 }
 \f
 /*-----------------------------------------.
@@ -453,7 +545,6 @@ print_grammar (FILE *out)
        }
       fprintf (out, "%s\n", buffer);
     }
-  fputs ("\n\n", out);
 }
 \f
 void
index 63e494d..808fd6f 100644 (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
index 456f5a8..48c111c 100644 (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