* src/conflicts.c (conflict_report): New function.

(conflict_log, verbose_conflict_log): Replace with...
(print_conflicts): this function.
Adjust dependencies.
* src/conflicts.h: New file.
Propagate its inclusion.
This commit is contained in:
Akim Demaille
2000-10-02 08:08:52 +00:00
parent 3519ec76a3
commit 0619caf0b1
6 changed files with 107 additions and 123 deletions

View File

@@ -1,3 +1,13 @@
2000-10-02 Akim Demaille <akim@epita.fr>
* src/conflicts.c (conflict_report): New function.
(conflict_log, verbose_conflict_log): Replace with...
(print_conflicts): this function.
Adjust dependencies.
* src/conflicts.h: New file.
Propagate its inclusion.
2000-10-02 Akim Demaille <akim@epita.fr>
* src/nullable.h: New file.

View File

@@ -18,7 +18,7 @@ bison_SOURCES = LR0.c allocate.c closure.c complain.c conflicts.c \
EXTRA_bison_SOURCES = vmsgetargs.c
noinst_HEADERS = alloc.h closure.h complain.h \
noinst_HEADERS = alloc.h closure.h complain.h conflicts.h \
derives.h \
files.h getargs.h gram.h lalr.h lex.h nullable.h \
output.h state.h \

View File

@@ -25,22 +25,16 @@
#include "gram.h"
#include "state.h"
#include "lalr.h"
#include "conflicts.h"
extern char **tags;
extern int fixed_outfiles;
extern void initialize_conflicts PARAMS ((void));
extern void conflict_log PARAMS ((void));
extern void verbose_conflict_log PARAMS ((void));
extern void print_reductions PARAMS ((int));
extern void finalize_conflicts PARAMS ((void));
char any_conflicts;
int any_conflicts = 0;
errs **err_table;
int expected_conflicts;
static char *conflicts;
static unsigned *shiftset;
static unsigned *lookaheadset;
static int src_total;
@@ -275,7 +269,6 @@ void
initialize_conflicts (void)
{
int i;
/* errs *sp; JF unused */
conflicts = NEW2 (nstates, char);
shiftset = NEW2 (tokensetsize, unsigned);
@@ -290,13 +283,6 @@ initialize_conflicts (void)
}
/*---------------------------------------------.
| Count the number of shift/reduce conflicts. |
`---------------------------------------------*/
@@ -422,20 +408,68 @@ count_rr_conflicts (int state)
}
}
/*------------------------------------.
| Give a report about the conflicts. |
`------------------------------------*/
/*----------------------------------------------------------.
| Output to OUT a human readable report on shift/reduce and |
| reduce/reduce conflict numbers (SRC_NUM, RRC_NUM). |
`----------------------------------------------------------*/
static void
total_conflicts (void)
conflict_report (FILE *out, int src_num, int rrc_num)
{
if (src_total == expected_conflicts && rrc_total == 0)
return;
if (src_num == 1)
fprintf (out, _(" 1 shift/reduce conflict"));
else if (src_num > 1)
fprintf (out, _(" %d shift/reduce conflicts"), src_num);
if (src_num > 0 && rrc_num > 0)
fprintf (out, _(" and"));
if (rrc_num == 1)
fprintf (out, _(" 1 reduce/reduce conflict"));
else if (rrc_num > 1)
fprintf (out, _(" %d reduce/reduce conflicts"), rrc_num);
putc ('.', out);
putc ('\n', out);
}
/*---------------------------------------------.
| Compute and give a report on the conflicts. |
`---------------------------------------------*/
void
print_conflicts (void)
{
int i;
src_total = 0;
rrc_total = 0;
/* Count the total number of conflicts, and if wanted, give a
detailed report in FOUTPUT. */
for (i = 0; i < nstates; i++)
{
if (conflicts[i])
{
count_sr_conflicts (i);
count_rr_conflicts (i);
src_total += src_count;
rrc_total += rrc_count;
if (verboseflag)
{
fprintf (foutput, _("State %d contains"), i);
conflict_report (foutput, src_count, rrc_count);
}
}
}
/* Report the total number of conflicts on STDERR. */
if (fixed_outfiles)
{
/* If invoked under the name `yacc', use the output format
specified by POSIX. */
/* If invoked with `--yacc', use the output format specified by
POSIX. */
fprintf (stderr, _("conflicts: "));
if (src_total > 0)
fprintf (stderr, _(" %d shift/reduce"), src_total);
@@ -448,98 +482,11 @@ total_conflicts (void)
else
{
fprintf (stderr, _("%s contains"), infile);
if (src_total == 1)
fprintf (stderr, _(" 1 shift/reduce conflict"));
else if (src_total > 1)
fprintf (stderr, _(" %d shift/reduce conflicts"), src_total);
if (src_total > 0 && rrc_total > 0)
fprintf (stderr, _(" and"));
if (rrc_total == 1)
fprintf (stderr, _(" 1 reduce/reduce conflict"));
else if (rrc_total > 1)
fprintf (stderr, _(" %d reduce/reduce conflicts"), rrc_total);
putc ('.', stderr);
putc ('\n', stderr);
conflict_report (stderr, src_total, rrc_total);
}
}
/*---------------------------------------------.
| Compute and give a report on the conflicts. |
`---------------------------------------------*/
void
conflict_log (void)
{
int i;
src_total = 0;
rrc_total = 0;
for (i = 0; i < nstates; i++)
{
if (conflicts[i])
{
count_sr_conflicts (i);
count_rr_conflicts (i);
src_total += src_count;
rrc_total += rrc_count;
}
}
total_conflicts ();
}
void
verbose_conflict_log (void)
{
int i;
src_total = 0;
rrc_total = 0;
for (i = 0; i < nstates; i++)
{
if (conflicts[i])
{
count_sr_conflicts (i);
count_rr_conflicts (i);
src_total += src_count;
rrc_total += rrc_count;
fprintf (foutput, _("State %d contains"), i);
if (src_count == 1)
fprintf (foutput, _(" 1 shift/reduce conflict"));
else if (src_count > 1)
fprintf (foutput, _(" %d shift/reduce conflicts"), src_count);
if (src_count > 0 && rrc_count > 0)
fprintf (foutput, _(" and"));
if (rrc_count == 1)
fprintf (foutput, _(" 1 reduce/reduce conflict"));
else if (rrc_count > 1)
fprintf (foutput, _(" %d reduce/reduce conflicts"), rrc_count);
putc ('.', foutput);
putc ('\n', foutput);
}
}
total_conflicts ();
}
void
print_reductions (int state)
{

33
src/conflicts.h Normal file
View File

@@ -0,0 +1,33 @@
/* Find and resolve or report look-ahead conflicts for bison,
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Bison is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Bison is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#ifndef CONFLICTS_H_
# define CONFLICTS_H_
void initialize_conflicts PARAMS ((void));
void print_conflicts PARAMS ((void));
void print_reductions PARAMS ((int));
void finalize_conflicts PARAMS ((void));
/* Were there conflicts? */
extern int any_conflicts;
extern errs **err_table;
extern int expected_conflicts;
#endif /* !CONFLICTS_H_ */

View File

@@ -100,13 +100,13 @@
#include "output.h"
#include "lalr.h"
#include "reader.h"
#include "conflicts.h"
extern void berror PARAMS((const char *));
extern char **tags;
extern short *user_toknums;
extern int final_state;
extern errs **err_table;
static int nvectors;

View File

@@ -25,18 +25,12 @@
#include "gram.h"
#include "state.h"
#include "lalr.h"
#include "conflicts.h"
extern char **tags;
extern int nstates;
extern errs **err_table;
extern char any_conflicts;
extern char *conflicts;
extern int final_state;
extern void conflict_log PARAMS ((void));
extern void verbose_conflict_log PARAMS ((void));
extern void print_reductions PARAMS ((int));
extern void terse PARAMS ((void));
extern void verbose PARAMS ((void));
@@ -53,7 +47,7 @@ void
terse (void)
{
if (any_conflicts)
conflict_log ();
print_conflicts ();
}
@@ -63,7 +57,7 @@ verbose (void)
int i;
if (any_conflicts)
verbose_conflict_log ();
print_conflicts ();
print_grammar ();