bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

11-byacc-reports.patch


From: Akim Demaille
Subject: 11-byacc-reports.patch
Date: Sat, 15 Jun 2002 20:19:32 +0200

Index: ChangeLog
from  Akim Demaille  <address@hidden>
        Copy BYacc's nice way to report the grammar.
        
        * src/gram.h, src/gram.c (grammar_rhs_print, grammar_rules_print):
        New.
        Don't print the rules' location, it is confusing and useless.
        (rule_print): Use grammar_rhs_print.
        * src/print.c (print_grammar): Use grammar_rules_print.
        
        
Index: src/gram.c
--- src/gram.c Sat, 15 Jun 2002 15:50:16 +0200 akim
+++ src/gram.c Sat, 15 Jun 2002 16:11:06 +0200 akim
@@ -61,14 +61,13 @@
 }
 
 
-/*-------------------------.
-| Print this RULE on OUT.  |
-`-------------------------*/
+/*-------------------------------.
+| Print this RULE's RHS on OUT.  |
+`-------------------------------*/
 
 void
-rule_print (rule_t *rule, FILE *out)
+rule_rhs_print (rule_t *rule, FILE *out)
 {
-  fprintf (out, "%s:", symbol_tag_get (rule->lhs));
   if (*rule->rhs >= 0)
     {
       item_number_t *r;
@@ -83,6 +82,18 @@
 }
 
 
+/*-------------------------.
+| Print this RULE on OUT.  |
+`-------------------------*/
+
+void
+rule_print (rule_t *rule, FILE *out)
+{
+  fprintf (out, "%s:", symbol_tag_get (rule->lhs));
+  rule_rhs_print (rule, out);
+}
+
+
 /*------------------------.
 | Dump RITEM for traces.  |
 `------------------------*/
@@ -121,6 +132,46 @@
   return max;
 }
 
+
+/*-----------------------------------.
+| Print the grammar's rules on OUT.  |
+`-----------------------------------*/
+
+static inline void
+blanks_print (unsigned n, FILE *out)
+{
+  for (/* Nothing*/; n > 0; --n)
+    fputc (' ', out);
+}
+
+void
+grammar_rules_print (FILE *out)
+{
+  int r;
+  symbol_t *last_lhs = NULL;
+
+  /* rule # : LHS -> RHS */
+  fprintf (out, "%s\n\n", _("Grammar"));
+  for (r = 1; r < nrules + 1; r++)
+    {
+      if (last_lhs && last_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_rhs_print (&rules[r], out);
+    }
+  fputs ("\n\n", out);
+}
 
 /*-------------------.
 | Dump the grammar.  |
Index: src/gram.h
--- src/gram.h Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ src/gram.h Sat, 15 Jun 2002 16:00:02 +0200 akim
@@ -171,6 +171,9 @@
 /* Return the length of the RHS.  */
 int rule_rhs_length PARAMS ((rule_t *rule));
 
+/* Print this RULE's RHS on OUT.  */
+void rule_rhs_print PARAMS ((rule_t *rule, FILE *out));
+
 /* Print this RULE on OUT.  */
 void rule_print PARAMS ((rule_t *rule, FILE *out));
 
@@ -180,6 +183,8 @@
 /* Return the size of the longest rule RHS.  */
 size_t ritem_longest_rhs PARAMS ((void));
 
+/* Print the grammar's rules on OUT.  */
+void grammar_rules_print PARAMS ((FILE *out));
 
 /* Dump the grammar. */
 void grammar_dump PARAMS ((FILE *out, const char *title));
Index: src/print.c
--- src/print.c Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ src/print.c Sat, 15 Jun 2002 16:12:57 +0200 akim
@@ -375,21 +375,11 @@
 print_grammar (FILE *out)
 {
   symbol_number_t i;
-  int j;
   item_number_t *rule;
   char buffer[90];
   int column = 0;
 
-  /* rule # : LHS -> RHS */
-  fprintf (out, "%s\n\n", _("Grammar"));
-  fprintf (out, "  %s\n", _("Number, Line, Rule"));
-  for (j = 1; j < nrules + 1; j++)
-    {
-      fprintf (out, "  %3d %3d ", j - 1, rules[j].location.first_line);
-      rule_print (&rules[j], out);
-    }
-  fputs ("\n\n", out);
-
+  grammar_rules_print (out);
 
   /* TERMINAL (type #) : rule #s terminal is on RHS */
   fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
@@ -397,18 +387,19 @@
     if (token_translations[i] != undeftoken->number)
       {
        const char *tag = symbol_tag_get (symbols[token_translations[i]]);
+       int r;
        buffer[0] = 0;
        column = strlen (tag);
        fputs (tag, out);
        END_TEST (50);
        sprintf (buffer, " (%d)", i);
 
-       for (j = 1; j < nrules + 1; j++)
-         for (rule = rules[j].rhs; *rule >= 0; rule++)
+       for (r = 1; r < nrules + 1; r++)
+         for (rule = rules[r].rhs; *rule >= 0; rule++)
            if (item_number_as_symbol_number (*rule) == token_translations[i])
              {
                END_TEST (65);
-               sprintf (buffer + strlen (buffer), " %d", j - 1);
+               sprintf (buffer + strlen (buffer), " %d", r - 1);
                break;
              }
        fprintf (out, "%s\n", buffer);
@@ -420,13 +411,14 @@
   for (i = ntokens; i < nsyms; i++)
     {
       int left_count = 0, right_count = 0;
+      int r;
       const char *tag = symbol_tag_get (symbols[i]);
 
-      for (j = 1; j < nrules + 1; j++)
+      for (r = 1; r < nrules + 1; r++)
        {
-         if (rules[j].lhs->number == i)
+         if (rules[r].lhs->number == i)
            left_count++;
-         for (rule = rules[j].rhs; *rule >= 0; rule++)
+         for (rule = rules[r].rhs; *rule >= 0; rule++)
            if (item_number_as_symbol_number (*rule) == i)
              {
                right_count++;
@@ -445,11 +437,11 @@
          END_TEST (50);
          sprintf (buffer + strlen (buffer), _(" on left:"));
 
-         for (j = 1; j < nrules + 1; j++)
+         for (r = 1; r < nrules + 1; r++)
            {
              END_TEST (65);
-             if (rules[j].lhs->number == i)
-               sprintf (buffer + strlen (buffer), " %d", j - 1);
+             if (rules[r].lhs->number == i)
+               sprintf (buffer + strlen (buffer), " %d", r - 1);
            }
        }
 
@@ -459,13 +451,13 @@
            sprintf (buffer + strlen (buffer), ",");
          END_TEST (50);
          sprintf (buffer + strlen (buffer), _(" on right:"));
-         for (j = 1; j < nrules + 1; j++)
+         for (r = 1; r < nrules + 1; r++)
            {
-             for (rule = rules[j].rhs; *rule >= 0; rule++)
+             for (rule = rules[r].rhs; *rule >= 0; rule++)
                if (item_number_as_symbol_number (*rule) == i)
                  {
                    END_TEST (65);
-                   sprintf (buffer + strlen (buffer), " %d", j - 1);
+                   sprintf (buffer + strlen (buffer), " %d", r - 1);
                    break;
                  }
            }
Index: tests/conflicts.at
--- tests/conflicts.at Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ tests/conflicts.at Sat, 15 Jun 2002 16:20:13 +0200 akim
@@ -130,6 +130,8 @@ expr: expr '<' expr
 
 AT_SETUP([Unresolved SR Conflicts])
 
+AT_KEYWORDS([report])
+
 AT_DATA([input.y],
 [[%token NUM OP
 %%
@@ -147,10 +149,10 @@ exp: exp OP exp | NUM;
 
 Grammar
 
-  Number, Line, Rule
-    0   3 $axiom: exp $
-    1   3 exp: exp OP exp
-    2   3 exp: NUM
+    0 $axiom: exp $
+
+    1 exp: exp OP exp
+    2    | NUM
 
 
 Terminals, with rules where they appear
@@ -241,6 +243,8 @@ exp: exp OP exp | NUM;
 
 AT_SETUP([Solved SR Conflicts])
 
+AT_KEYWORDS([report])
+
 AT_DATA([input.y],
 [[%token NUM OP
 %right OP
@@ -254,10 +258,10 @@ exp: exp OP exp | NUM;
 AT_CHECK([cat input.output], [],
 [[Grammar
 
-  Number, Line, Rule
-    0   4 $axiom: exp $
-    1   4 exp: exp OP exp
-    2   4 exp: NUM
+    0 $axiom: exp $
+
+    1 exp: exp OP exp
+    2    | NUM
 
 
 Terminals, with rules where they appear
Index: tests/regression.at
--- tests/regression.at Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ tests/regression.at Sat, 15 Jun 2002 16:19:16 +0200 akim
@@ -112,6 +112,8 @@ exp: '(' exp ')' | NUM ;
 
 AT_SETUP([Rule Line Numbers])
 
+AT_KEYWORDS([report])
+
 AT_DATA([input.y],
 [[%%
 expr:
@@ -148,12 +150,15 @@ expr:
 AT_CHECK([cat input.output], [],
 [[Grammar
 
-  Number, Line, Rule
-    0   5 $axiom: expr $
-    1   5 @1: /* empty */
-    2   2 expr: 'a' @1 'b'
-    3  18 @2: /* empty */
-    4  15 expr: @2 'c'
+    0 $axiom: expr $
+
+    1 @1: /* empty */
+
+    2 expr: 'a' @1 'b'
+
+    3 @2: /* empty */
+
+    4 expr: @2 'c'
 
 
 Terminals, with rules where they appear
@@ -349,6 +354,8 @@ exp: "a";
 
 AT_SETUP([Web2c Report])
 
+AT_KEYWORDS([report])
+
 AT_DATA([input.y],
 [[%token       undef_id_tok const_id_tok
 
@@ -375,13 +382,12 @@ exp: "a";
 
 AT_CHECK([sed -n 's/  *$//;/^$/!p' input.output], 0,
 [[Grammar
-  Number, Line, Rule
-    0   6 $axiom: CONST_DEC_PART $
-    1   6 CONST_DEC_PART: CONST_DEC_LIST
-    2  10 CONST_DEC_LIST: CONST_DEC
-    3  12 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC
-    4  16 @1: /* empty */
-    5  15 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
+    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
@@ -469,6 +475,8 @@ exp: "a";
 
 
 AT_SETUP([Web2c Actions])
+
+AT_KEYWORDS([report])
 
 AT_DATA([input.y],
 [[%%



reply via email to

[Prev in Thread] Current Thread [Next in Thread]