Display items as we display rules.
authorAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:33:08 +0000 (17:33 +0000)
committerAkim Demaille <akim@epita.fr>
Sun, 30 Jun 2002 17:33:08 +0000 (17:33 +0000)
* src/gram.h, src/gram.c (rule_lhs_print): New.
* src/gram.c (grammar_rules_partial_print): Use it.
* src/print.c (print_core): Likewise.
* tests/conflicts.at (Defaulted Conflicted Reduction),
(Unresolved SR Conflicts): Adjust.
(Unresolved SR Conflicts): Adjust and rename as...
(Resolved SR Conflicts): this, as was meant.
* tests/regression.at (Web2c Report): Adjust.

ChangeLog
src/gram.c
src/gram.h
src/print.c
tests/conflicts.at
tests/regression.at

index 42008b9..0ee7b2a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2002-06-30  Akim Demaille  <akim@epita.fr>
 
+       Display items as we display rules.
+
+       * src/gram.h, src/gram.c (rule_lhs_print): New.
+       * src/gram.c (grammar_rules_partial_print): Use it.
+       * src/print.c (print_core): Likewise.
+       * tests/conflicts.at (Defaulted Conflicted Reduction),
+       (Unresolved SR Conflicts): Adjust.
+       (Unresolved SR Conflicts): Adjust and rename as...
+       (Resolved SR Conflicts): this, as was meant.
+       * tests/regression.at (Web2c Report): Adjust.
+
+2002-06-30  Akim Demaille  <akim@epita.fr>
+
        * src/print.c (state_default_rule_compute): New, extracted from...
        (print_reductions): here.
        Pessimize, but clarify the code.
index 708922d..72086e3 100644 (file)
@@ -47,6 +47,30 @@ int glr_parser = 0;
 int pure_parser = 0;
 
 
+/*----------------------------------------------------------------.
+| Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was |
+| already displayed (by a previous call for another rule), avoid  |
+| useless repetitions.                                            |
+`----------------------------------------------------------------*/
+
+void
+rule_lhs_print (rule_t *rule, symbol_t *previous_lhs, FILE *out)
+{
+  fprintf (out, "  %3d ", rule->number - 1);
+  if (previous_lhs != rule->lhs)
+    {
+      fprintf (out, "%s:", symbol_tag_get (rule->lhs));
+    }
+  else
+    {
+      int n;
+      for (n = strlen (symbol_tag_get (previous_lhs)); n > 0; --n)
+       fputc (' ', out);
+      fputc ('|', out);
+    }
+}
+
+
 /*--------------------------------------.
 | Return the number of symbols in RHS.  |
 `--------------------------------------*/
@@ -139,39 +163,22 @@ ritem_longest_rhs (void)
 | (exclusive) on OUT under TITLE.                                 |
 `----------------------------------------------------------------*/
 
-static inline void
-blanks_print (unsigned n, FILE *out)
-{
-  for (/* Nothing*/; n > 0; --n)
-    fputc (' ', out);
-}
-
 void
 grammar_rules_partial_print (FILE *out, const char *title,
                             rule_number_t begin, rule_number_t end)
 {
   int r;
-  symbol_t *last_lhs = NULL;
+  symbol_t *previous_lhs = NULL;
 
   /* rule # : LHS -> RHS */
   fprintf (out, "%s\n\n", title);
   for (r = begin; r < end; r++)
     {
-      if (last_lhs && last_lhs != rules[r].lhs)
+      if (previous_lhs && previous_lhs != rules[r].lhs)
        fputc ('\n', out);
-
-      fprintf (out, "  %3d ", r - 1);
-      if (last_lhs != rules[r].lhs)
-       {
-         last_lhs = rules[r].lhs;
-         fprintf (out, "%s:", symbol_tag_get (last_lhs));
-       }
-      else
-       {
-         blanks_print (strlen (symbol_tag_get (last_lhs)), out);
-         fputc ('|', out);
-       }
+      rule_lhs_print (&rules[r], previous_lhs, out);
       rule_rhs_print (&rules[r], out);
+      previous_lhs = rules[r].lhs;
     }
   fputs ("\n\n", out);
 }
index 1aa5cd7..71191a5 100644 (file)
@@ -193,6 +193,11 @@ extern int glr_parser;
 
 extern int pure_parser;
 
+/* Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was
+   already displayed (by a previous call for another rule), avoid
+   useless repetitions.  */
+void rule_lhs_print PARAMS ((rule_t *rule, symbol_t *previous_lhs, FILE *out));
+
 /* Return the length of the RHS.  */
 int rule_rhs_length PARAMS ((rule_t *rule));
 
index 9ed6919..76e5f74 100644 (file)
@@ -58,6 +58,7 @@ print_core (FILE *out, state_t *state)
   int i;
   item_number_t *sitems = state->items;
   int snritems   = state->nitems;
+  symbol_t *previous_lhs = NULL;
 
   /* Output all the items of a state, not only its kernel.  */
   if (report_flag & report_itemsets)
@@ -67,40 +68,39 @@ print_core (FILE *out, state_t *state)
       snritems = nritemset;
     }
 
-  if (snritems)
-    {
-      for (i = 0; i < snritems; i++)
-       {
-         item_number_t *sp;
-         item_number_t *sp1;
-         int rule;
-
-         sp1 = sp = ritem + sitems[i];
+  if (!snritems)
+    return;
 
-         while (*sp >= 0)
-           sp++;
+  for (i = 0; i < snritems; i++)
+    {
+      item_number_t *sp;
+      item_number_t *sp1;
+      int rule;
 
-         rule = -(*sp);
-         fprintf (out, "    %s  ->  ", symbol_tag_get (rules[rule].lhs));
+      sp1 = sp = ritem + sitems[i];
 
-         for (sp = rules[rule].rhs; sp < sp1; sp++)
-           fprintf (out, "%s ", symbol_tag_get (symbols[*sp]));
+      while (*sp >= 0)
+       sp++;
 
-         fputc ('.', out);
+      rule = -(*sp);
 
-         for (/* Nothing */; *sp >= 0; ++sp)
-           fprintf (out, " %s", symbol_tag_get (symbols[*sp]));
+      rule_lhs_print (&rules[rule], previous_lhs, out);
+      previous_lhs = rules[rule].lhs;
 
-         /* Display the lookaheads?  */
-         if (report_flag & report_lookaheads)
-           state_rule_lookaheads_print (state, &rules[rule], out);
+      for (sp = rules[rule].rhs; sp < sp1; sp++)
+       fprintf (out, " %s", symbol_tag_get (symbols[*sp]));
+      fputs (" .", out);
+      for (/* Nothing */; *sp >= 0; ++sp)
+       fprintf (out, " %s", symbol_tag_get (symbols[*sp]));
 
-         fprintf (out, _("   (rule %d)"), rule - 1);
-         fputc ('\n', out);
-       }
+      /* Display the lookaheads?  */
+      if (report_flag & report_lookaheads)
+       state_rule_lookaheads_print (state, &rules[rule], out);
 
       fputc ('\n', out);
     }
+
+  fputc ('\n', out);
 }
 
 
index 38f8f0e..63e494d 100644 (file)
@@ -174,9 +174,9 @@ exp (6)
 
 state 0
 
-    $axiom  ->  . exp $   (rule 0)
-    exp  ->  . exp OP exp   (rule 1)
-    exp  ->  . NUM   (rule 2)
+    0 $axiom: . exp $
+    1 exp: . exp OP exp
+    2    | . NUM
 
     NUM        shift, and go to state 1
 
@@ -186,7 +186,7 @@ state 0
 
 state 1
 
-    exp  ->  NUM .   (rule 2)
+    2 exp: NUM .
 
     $default   reduce using rule 2 (exp)
 
@@ -194,8 +194,8 @@ state 1
 
 state 2
 
-    $axiom  ->  exp . $   (rule 0)
-    exp  ->  exp . OP exp   (rule 1)
+    0 $axiom: exp . $
+    1 exp: exp . OP exp
 
     $          shift, and go to state 3
     OP         shift, and go to state 4
@@ -204,16 +204,16 @@ state 2
 
 state 3
 
-    $axiom  ->  exp $ .   (rule 0)
+    0 $axiom: exp $ .
 
     $default   accept
 
 
 state 4
 
-    exp  ->  . exp OP exp   (rule 1)
-    exp  ->  exp OP . exp   (rule 1)
-    exp  ->  . NUM   (rule 2)
+    1 exp: . exp OP exp
+    1    | exp OP . exp
+    2    | . NUM
 
     NUM        shift, and go to state 1
 
@@ -223,8 +223,8 @@ state 4
 
 state 5
 
-    exp  ->  exp . OP exp  [$, OP]   (rule 1)
-    exp  ->  exp OP exp .  [$, OP]   (rule 1)
+    1 exp: exp . OP exp  [$, OP]
+    1    | exp OP exp .  [$, OP]
 
     OP         shift, and go to state 4
 
@@ -238,30 +238,27 @@ state 5
 AT_CLEANUP
 
 
-## ------------------------- ##
-## Unresolved SR Conflicts.  ##
-## ------------------------- ##
 
-AT_SETUP([Unresolved SR Conflicts])
+## ----------------------- ##
+## Resolved SR Conflicts.  ##
+## ----------------------- ##
+
+AT_SETUP([Resolved SR Conflicts])
 
 AT_KEYWORDS([report])
 
 AT_DATA([input.y],
 [[%token NUM OP
+%left OP
 %%
 exp: exp OP exp | NUM;
 ]])
 
-AT_CHECK([bison input.y -o input.c --report=all], 0, [],
-[input.y contains 1 shift/reduce conflict.
-])
+AT_CHECK([bison input.y -o input.c --report=all])
 
 # Check the contents of the report.
 AT_CHECK([cat input.output], [],
-[[State 5 contains 1 shift/reduce conflict.
-
-
-Grammar
+[[Grammar
 
     0 $axiom: exp $
 
@@ -287,9 +284,9 @@ exp (6)
 
 state 0
 
-    $axiom  ->  . exp $   (rule 0)
-    exp  ->  . exp OP exp   (rule 1)
-    exp  ->  . NUM   (rule 2)
+    0 $axiom: . exp $
+    1 exp: . exp OP exp
+    2    | . NUM
 
     NUM        shift, and go to state 1
 
@@ -299,7 +296,7 @@ state 0
 
 state 1
 
-    exp  ->  NUM .   (rule 2)
+    2 exp: NUM .
 
     $default   reduce using rule 2 (exp)
 
@@ -307,8 +304,8 @@ state 1
 
 state 2
 
-    $axiom  ->  exp . $   (rule 0)
-    exp  ->  exp . OP exp   (rule 1)
+    0 $axiom: exp . $
+    1 exp: exp . OP exp
 
     $          shift, and go to state 3
     OP         shift, and go to state 4
@@ -317,16 +314,16 @@ state 2
 
 state 3
 
-    $axiom  ->  exp $ .   (rule 0)
+    0 $axiom: exp $ .
 
     $default   accept
 
 
 state 4
 
-    exp  ->  . exp OP exp   (rule 1)
-    exp  ->  exp OP . exp   (rule 1)
-    exp  ->  . NUM   (rule 2)
+    1 exp: . exp OP exp
+    1    | exp OP . exp
+    2    | . NUM
 
     NUM        shift, and go to state 1
 
@@ -336,14 +333,13 @@ state 4
 
 state 5
 
-    exp  ->  exp . OP exp  [$, OP]   (rule 1)
-    exp  ->  exp OP exp .  [$, OP]   (rule 1)
+    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)
 
+    Conflict between rule 2 and token OP resolved as shift (%left OP).
 
 
 ]])
@@ -351,7 +347,6 @@ state 5
 AT_CLEANUP
 
 
-
 ## -------------------------------- ##
 ## Defaulted Conflicted Reduction.  ##
 ## -------------------------------- ##
@@ -430,11 +425,11 @@ id (7)
 
 state 0
 
-    $axiom  ->  . exp $   (rule 0)
-    exp  ->  . num   (rule 1)
-    exp  ->  . id   (rule 2)
-    num  ->  . '0'   (rule 3)
-    id  ->  . '0'   (rule 4)
+    0 $axiom: . exp $
+    1 exp: . num
+    2    | . id
+    3 num: . '0'
+    4 id: . '0'
 
     '0'        shift, and go to state 1
 
@@ -446,8 +441,8 @@ state 0
 
 state 1
 
-    num  ->  '0' .  [$]   (rule 3)
-    id  ->  '0' .  [$]   (rule 4)
+    3 num: '0' .  [$]
+    4 id: '0' .  [$]
 
     $          reduce using rule 3 (num)
     $          [reduce using rule 4 (id)]
@@ -457,7 +452,7 @@ state 1
 
 state 2
 
-    $axiom  ->  exp . $   (rule 0)
+    0 $axiom: exp . $
 
     $          shift, and go to state 5
 
@@ -465,7 +460,7 @@ state 2
 
 state 3
 
-    exp  ->  num .   (rule 1)
+    1 exp: num .
 
     $default   reduce using rule 1 (exp)
 
@@ -473,7 +468,7 @@ state 3
 
 state 4
 
-    exp  ->  id .   (rule 2)
+    2 exp: id .
 
     $default   reduce using rule 2 (exp)
 
@@ -481,7 +476,7 @@ state 4
 
 state 5
 
-    $axiom  ->  exp $ .   (rule 0)
+    0 $axiom: exp $ .
 
     $default   accept
 
index 3620200..456f5a8 100644 (file)
@@ -184,7 +184,7 @@ expr (7)
 
 state 0
 
-    $axiom  ->  . expr $   (rule 0)
+    0 $axiom: . expr $
 
     'a'        shift, and go to state 1
 
@@ -197,7 +197,7 @@ state 0
 
 state 1
 
-    expr  ->  'a' . @1 'b'   (rule 2)
+    2 expr: 'a' . @1 'b'
 
     $default   reduce using rule 1 (@1)
 
@@ -207,7 +207,7 @@ state 1
 
 state 2
 
-    $axiom  ->  expr . $   (rule 0)
+    0 $axiom: expr . $
 
     $          shift, and go to state 5
 
@@ -215,7 +215,7 @@ state 2
 
 state 3
 
-    expr  ->  @2 . 'c'   (rule 4)
+    4 expr: @2 . 'c'
 
     'c'        shift, and go to state 6
 
@@ -223,7 +223,7 @@ state 3
 
 state 4
 
-    expr  ->  'a' @1 . 'b'   (rule 2)
+    2 expr: 'a' @1 . 'b'
 
     'b'        shift, and go to state 7
 
@@ -231,14 +231,14 @@ state 4
 
 state 5
 
-    $axiom  ->  expr $ .   (rule 0)
+    0 $axiom: expr $ .
 
     $default   accept
 
 
 state 6
 
-    expr  ->  @2 'c' .   (rule 4)
+    4 expr: @2 'c' .
 
     $default   reduce using rule 4 (expr)
 
@@ -246,7 +246,7 @@ state 6
 
 state 7
 
-    expr  ->  'a' @1 'b' .   (rule 2)
+    2 expr: 'a' @1 'b' .
 
     $default   reduce using rule 2 (expr)
 
@@ -375,12 +375,11 @@ CONST_DEC:
          { } undef_id_tok '=' const_id_tok ';'
         ;
 %%
-
 ]])
 
 AT_CHECK([bison -v input.y])
-
-AT_CHECK([sed -n 's/  *$//;/^$/!p' input.output], 0,
+sed -n 's/  *$//;/^$/!p' input.output >input.report
+AT_CHECK([cat input.report], 0,
 [[Grammar
     0 $axiom: CONST_DEC_PART $
     1 CONST_DEC_PART: CONST_DEC_LIST
@@ -407,45 +406,45 @@ CONST_DEC (10)
 @1 (11)
     on left: 4, on right: 5
 state 0
-    $axiom  ->  . CONST_DEC_PART $   (rule 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
 state 1
-    $axiom  ->  CONST_DEC_PART . $   (rule 0)
+    0 $axiom: CONST_DEC_PART . $
     $          shift, and go to state 5
 state 2
-    CONST_DEC_PART  ->  CONST_DEC_LIST .   (rule 1)
-    CONST_DEC_LIST  ->  CONST_DEC_LIST . CONST_DEC   (rule 3)
+    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
 state 3
-    CONST_DEC_LIST  ->  CONST_DEC .   (rule 2)
+    2 CONST_DEC_LIST: CONST_DEC .
     $default   reduce using rule 2 (CONST_DEC_LIST)
 state 4
-    CONST_DEC  ->  @1 . undef_id_tok '=' const_id_tok ';'   (rule 5)
+    5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';'
     undef_id_tok       shift, and go to state 7
 state 5
-    $axiom  ->  CONST_DEC_PART $ .   (rule 0)
+    0 $axiom: CONST_DEC_PART $ .
     $default   accept
 state 6
-    CONST_DEC_LIST  ->  CONST_DEC_LIST CONST_DEC .   (rule 3)
+    3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC .
     $default   reduce using rule 3 (CONST_DEC_LIST)
 state 7
-    CONST_DEC  ->  @1 undef_id_tok . '=' const_id_tok ';'   (rule 5)
+    5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';'
     '='        shift, and go to state 8
 state 8
-    CONST_DEC  ->  @1 undef_id_tok '=' . const_id_tok ';'   (rule 5)
+    5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';'
     const_id_tok       shift, and go to state 9
 state 9
-    CONST_DEC  ->  @1 undef_id_tok '=' const_id_tok . ';'   (rule 5)
+    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';'
     ';'        shift, and go to state 10
 state 10
-    CONST_DEC  ->  @1 undef_id_tok '=' const_id_tok ';' .   (rule 5)
+    5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' .
     $default   reduce using rule 5 (CONST_DEC)
 ]])
 
@@ -491,7 +490,9 @@ AT_CHECK([bison -v input.y -o input.c])
 
 # Check only the tables.  We don't use --no-parser, because it is
 # still to be implemented in the experimental branch of Bison.
-AT_CHECK([[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' input.c]], 0,
+[sed -n 's/  *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c]
+
+AT_CHECK([[cat tables.c]], 0,
 [[static const unsigned char yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,