* src/reduce.c (dump_grammar): Move to...

* src/gram.h, src/gram.c (grammar_dump): here.
Be sure to separate long item numbers.
Don't read the members of a rule's prec if its nil.
This commit is contained in:
Akim Demaille
2002-04-22 08:23:07 +00:00
parent 133c20e252
commit 78ab8f674f
5 changed files with 74 additions and 55 deletions

View File

@@ -1,3 +1,10 @@
2002-04-22 Akim Demaille <akim@epita.fr>
* src/reduce.c (dump_grammar): Move to...
* src/gram.h, src/gram.c (grammar_dump): here.
Be sure to separate long item numbers.
Don't read the members of a rule's prec if its nil.
2002-04-22 Akim Demaille <akim@epita.fr> 2002-04-22 Akim Demaille <akim@epita.fr>
* src/output.c (table_size, table_grow): New. * src/output.c (table_size, table_grow): New.

View File

@@ -21,8 +21,9 @@
#include "system.h" #include "system.h"
#include "quotearg.h" #include "quotearg.h"
#include "gram.h"
#include "symtab.h" #include "symtab.h"
#include "gram.h"
#include "reduce.h"
#include "reader.h" #include "reader.h"
/* comments for these variables are in gram.h */ /* comments for these variables are in gram.h */
@@ -102,3 +103,61 @@ ritem_longest_rhs (void)
return max; return max;
} }
/*-------------------.
| Dump the grammar. |
`-------------------*/
void
grammar_dump (FILE *out, const char *title)
{
int i;
item_number_t *r;
fprintf (out, "%s\n\n", title);
fprintf (out,
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
ntokens, nvars, nsyms, nrules, nritems);
fprintf (out, "Variables\n---------\n\n");
fprintf (out, "Value Sprec Sassoc Tag\n");
for (i = ntokens; i < nsyms; i++)
fprintf (out, "%5d %5d %5d %s\n",
i,
symbols[i]->prec, symbols[i]->assoc,
quotearg_style (escape_quoting_style, symbols[i]->tag));
fprintf (out, "\n\n");
fprintf (out, "Rules\n-----\n\n");
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
for (i = 1; i < nrules + nuseless_productions + 1; i++)
{
int rhs_count = 0;
/* Find the last RHS index in ritems. */
for (r = rules[i].rhs; *r >= 0; ++r)
++rhs_count;
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->",
i - 1,
rules[i].prec ? rules[i].prec->prec : 0,
rules[i].prec ? rules[i].prec->assoc : 0,
rules[i].useful,
rules[i].rhs - ritem,
rules[i].rhs - ritem + rhs_count - 1,
rules[i].lhs->number);
/* Dumped the RHS. */
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, " %3d", *r);
fprintf (out, " [%d]\n", -(*r) - 1);
}
fprintf (out, "\n\n");
fprintf (out, "Rules interpreted\n-----------------\n\n");
for (i = 1; i < nrules + nuseless_productions + 1; i++)
{
fprintf (out, "%-5d %s :",
i, quotearg_style (escape_quoting_style, rules[i].lhs->tag));
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, " %s",
quotearg_style (escape_quoting_style, symbols[*r]->tag));
fputc ('\n', out);
}
fprintf (out, "\n\n");
}

View File

@@ -186,4 +186,7 @@ void ritem_print PARAMS ((FILE *out));
/* Return the size of the longest rule RHS. */ /* Return the size of the longest rule RHS. */
size_t ritem_longest_rhs PARAMS ((void)); size_t ritem_longest_rhs PARAMS ((void));
/* Dump the grammar. */
void grammar_dump PARAMS ((FILE *out, const char *title));
#endif /* !GRAM_H_ */ #endif /* !GRAM_H_ */

View File

@@ -51,7 +51,7 @@ static bitset V;
static bitset V1; static bitset V1;
static int nuseful_productions; static int nuseful_productions;
static int nuseless_productions; int nuseless_productions;
static int nuseful_nonterminals; static int nuseful_nonterminals;
int nuseless_nonterminals; int nuseless_nonterminals;
@@ -371,58 +371,7 @@ reduce_output (FILE *out)
} }
} }
static void
dump_grammar (FILE *out)
{
int i;
item_number_t *r;
fprintf (out, "REDUCED GRAMMAR\n\n");
fprintf (out,
"ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
ntokens, nvars, nsyms, nrules, nritems);
fprintf (out, "Variables\n---------\n\n");
fprintf (out, "Value Sprec Sassoc Tag\n");
for (i = ntokens; i < nsyms; i++)
fprintf (out, "%5d %5d %5d %s\n",
i,
symbols[i]->prec, symbols[i]->assoc,
quotearg_style (escape_quoting_style, symbols[i]->tag));
fprintf (out, "\n\n");
fprintf (out, "Rules\n-----\n\n");
fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
for (i = 1; i < nrules + nuseless_productions + 1; i++)
{
int rhs_count = 0;
/* Find the last RHS index in ritems. */
for (r = rules[i].rhs; *r >= 0; ++r)
++rhs_count;
fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->",
i - 1,
rules[i].prec->prec,
rules[i].prec->assoc,
rules[i].useful,
rules[i].rhs - ritem,
rules[i].rhs - ritem + rhs_count - 1,
rules[i].lhs->number);
/* Dumped the RHS. */
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, "%3d", *r);
fprintf (out, " [%d]\n", -(*r) - 1);
}
fprintf (out, "\n\n");
fprintf (out, "Rules interpreted\n-----------------\n\n");
for (i = 1; i < nrules + nuseless_productions + 1; i++)
{
fprintf (out, "%-5d %s :",
i, quotearg_style (escape_quoting_style, rules[i].lhs->tag));
for (r = rules[i].rhs; *r >= 0; r++)
fprintf (out, " %s",
quotearg_style (escape_quoting_style, symbols[*r]->tag));
fputc ('\n', out);
}
fprintf (out, "\n\n");
}
@@ -494,7 +443,7 @@ reduce_grammar (void)
if (trace_flag) if (trace_flag)
{ {
dump_grammar (stderr); grammar_dump (stderr, "Reduced Grammar");
fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\ fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\
, and %d productions.\n", , and %d productions.\n",

View File

@@ -1,5 +1,5 @@
/* Grammar reduction for Bison. /* Grammar reduction for Bison.
Copyright 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -26,4 +26,5 @@ void reduce_output PARAMS ((FILE *out));
void reduce_free PARAMS ((void)); void reduce_free PARAMS ((void));
extern int nuseless_nonterminals; extern int nuseless_nonterminals;
extern int nuseless_productions;
#endif /* !REDUCE_H_ */ #endif /* !REDUCE_H_ */