02111-1307, USA. */
#include "system.h"
+#include "complain.h"
#include "getargs.h"
#include "files.h"
#include "gram.h"
#include "LR0.h"
errs **err_table = NULL;
-int expected_conflicts;
+/* -1 stands for not specified. */
+int expected_conflicts = -1;
static char *conflicts = NULL;
static unsigned *shiftset = NULL;
shifts *shiftp;
int k, i;
- shiftp = shift_table[state];
+ shiftp = state_table[state].shift_table;
if (shiftp)
{
for (i = 0; i < k; i++)
{
if (shiftp->shifts[i]
- && token == accessing_symbol[shiftp->shifts[i]])
+ && token == state_table[shiftp->shifts[i]].accessing_symbol)
(shiftp->shifts[i]) = 0;
}
}
redprec = rprec[LAruleno[lookaheadnum]];
mask = 1;
- fp1 = LA + lookaheadnum * tokensetsize;
+ fp1 = LA (lookaheadnum);
fp2 = lookaheadset;
for (i = 0; i < ntokens; i++)
{
unsigned *fp1;
int symbol;
- if (consistent[state])
+ if (state_table[state].consistent)
return;
for (i = 0; i < tokensetsize; i++)
lookaheadset[i] = 0;
- shiftp = shift_table[state];
+ shiftp = state_table[state].shift_table;
if (shiftp)
{
k = shiftp->nshifts;
for (i = 0; i < k; i++)
{
- symbol = accessing_symbol[shiftp->shifts[i]];
+ symbol = state_table[shiftp->shifts[i]].accessing_symbol;
if (ISVAR (symbol))
break;
SETBIT (lookaheadset, symbol);
}
}
- k = lookaheads[state + 1];
+ k = state_table[state + 1].lookaheads;
fp4 = lookaheadset + tokensetsize;
/* Loop over all rules which require lookahead in this state. First
check for shift-reduce conflict, and try to resolve using
precedence */
- for (i = lookaheads[state]; i < k; i++)
+ for (i = state_table[state].lookaheads; i < k; i++)
if (rprec[LAruleno[i]])
{
- fp1 = LA + i * tokensetsize;
+ fp1 = LA (i);
fp2 = fp1;
fp3 = lookaheadset;
/* Loop over all rules which require lookahead in this state. Check
for conflicts not resolved above. */
- for (i = lookaheads[state]; i < k; i++)
+ for (i = state_table[state].lookaheads; i < k; i++)
{
- fp1 = LA + i * tokensetsize;
+ fp1 = LA (i);
fp2 = fp1;
fp3 = lookaheadset;
int src_count = 0;
- shiftp = shift_table[state];
+ shiftp = state_table[state].shift_table;
if (!shiftp)
return 0;
{
if (!shiftp->shifts[i])
continue;
- symbol = accessing_symbol[shiftp->shifts[i]];
+ symbol = state_table[shiftp->shifts[i]].accessing_symbol;
if (ISVAR (symbol))
break;
SETBIT (shiftset, symbol);
}
- k = lookaheads[state + 1];
+ k = state_table[state + 1].lookaheads;
fp3 = lookaheadset + tokensetsize;
- for (i = lookaheads[state]; i < k; i++)
+ for (i = state_table[state].lookaheads; i < k; i++)
{
- fp1 = LA + i * tokensetsize;
+ fp1 = LA (i);
fp2 = lookaheadset;
while (fp2 < fp3)
int rrc_count = 0;
- int m = lookaheads[state];
- int n = lookaheads[state + 1];
+ int m = state_table[state].lookaheads;
+ int n = state_table[state + 1].lookaheads;
if (n - m < 2)
return 0;
mask = 1;
- baseword = LA + m * tokensetsize;
+ baseword = LA (m);
for (i = 0; i < ntokens; i++)
{
unsigned *wordp = baseword;
static char res[4096];
char *cp = res;
- if (src_num == 1)
+ if (src_num >= 1)
{
- sprintf (cp, _(" 1 shift/reduce conflict"));
- cp += strlen (cp);
- }
- else if (src_num > 1)
- {
- sprintf (cp, _(" %d shift/reduce conflicts"), src_num);
+ sprintf (cp, ngettext ("%d shift/reduce conflict",
+ "%d shift/reduce conflicts", src_num), src_num);
cp += strlen (cp);
}
if (src_num > 0 && rrc_num > 0)
{
- sprintf (cp, _(" and"));
+ sprintf (cp, " %s ", _("and"));
cp += strlen (cp);
}
- if (rrc_num == 1)
- {
- sprintf (cp, _(" 1 reduce/reduce conflict"));
- cp += strlen (cp);
- }
- else if (rrc_num > 1)
+ if (rrc_num >= 1)
{
- sprintf (cp, _(" %d reduce/reduce conflicts"), rrc_num);
+ sprintf (cp, ngettext ("%d reduce/reduce conflict",
+ "%d reduce/reduce conflicts", rrc_num), rrc_num);
cp += strlen (cp);
}
for (i = 0; i < nstates; i++)
if (conflicts[i])
{
- fprintf (out, _("State %d contains"), i);
+ fprintf (out, _("State %d contains "), i);
fputs (conflict_report (count_sr_conflicts (i),
count_rr_conflicts (i)), out);
}
/* Report the total number of conflicts on STDERR. */
if (src_total || rrc_total)
- if (yacc_flag)
- {
- /* 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);
- if (src_total > 0 && rrc_total > 0)
- fprintf (stderr, ",");
- if (rrc_total > 0)
- fprintf (stderr, _(" %d reduce/reduce"), rrc_total);
- putc ('\n', stderr);
- }
- else
- {
- fprintf (stderr, _("%s contains"), infile);
- fputs (conflict_report (src_total, rrc_total), stderr);
- }
+ {
+ if (yacc_flag)
+ {
+ /* 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);
+ if (src_total > 0 && rrc_total > 0)
+ fprintf (stderr, ",");
+ if (rrc_total > 0)
+ fprintf (stderr, _(" %d reduce/reduce"), rrc_total);
+ putc ('\n', stderr);
+ }
+ else
+ {
+ fprintf (stderr, _("%s contains "), infile);
+ fputs (conflict_report (src_total, rrc_total), stderr);
+ }
+ }
+
+ if (expected_conflicts != -1
+ && src_total != expected_conflicts)
+ {
+ complain_message_count++;
+ fprintf (stderr, ngettext ("expected %d shift/reduce conflict",
+ "expected %d shift/reduce conflicts",
+ expected_conflicts),
+ expected_conflicts);
+ }
}
void
-print_reductions (int state)
+print_reductions (FILE *out, int state)
{
int i;
int j;
for (i = 0; i < tokensetsize; i++)
shiftset[i] = 0;
- shiftp = shift_table[state];
+ shiftp = state_table[state].shift_table;
if (shiftp)
{
k = shiftp->nshifts;
{
if (!shiftp->shifts[i])
continue;
- symbol = accessing_symbol[shiftp->shifts[i]];
+ symbol = state_table[shiftp->shifts[i]].accessing_symbol;
if (ISVAR (symbol))
break;
/* if this state has a shift for the error token,
}
}
- m = lookaheads[state];
- n = lookaheads[state + 1];
+ m = state_table[state].lookaheads;
+ n = state_table[state + 1].lookaheads;
if (n - m == 1 && !nodefault)
{
default_rule = LAruleno[m];
- fp1 = LA + m * tokensetsize;
+ fp1 = LA (m);
fp2 = shiftset;
fp3 = lookaheadset;
fp4 = lookaheadset + tokensetsize;
for (i = 0; i < ntokens; i++)
{
if (mask & *fp3)
- obstack_fgrow3 (&output_obstack,
- _(" %-4s\t[reduce using rule %d (%s)]\n"),
- tags[i], default_rule, tags[rlhs[default_rule]]);
+ fprintf (out, _(" %-4s\t[reduce using rule %d (%s)]\n"),
+ tags[i], default_rule, tags[rlhs[default_rule]]);
mask <<= 1;
if (mask == 0)
}
}
- obstack_fgrow2 (&output_obstack,
- _(" $default\treduce using rule %d (%s)\n\n"),
- default_rule, tags[rlhs[default_rule]]);
+ fprintf (out, _(" $default\treduce using rule %d (%s)\n\n"),
+ default_rule, tags[rlhs[default_rule]]);
}
else if (n - m >= 1)
{
if (!nodefault)
for (i = m; i < n; i++)
{
- fp1 = LA + i * tokensetsize;
+ fp1 = LA (i);
fp2 = shiftset;
fp3 = lookaheadset;
{
if (!shiftp->shifts[i])
continue;
- symbol = accessing_symbol[shiftp->shifts[i]];
+ symbol = state_table[shiftp->shifts[i]].accessing_symbol;
if (ISVAR (symbol))
break;
SETBIT (shiftset, symbol);
}
mask = 1;
- fp1 = LA + m * tokensetsize;
+ fp1 = LA (m);
fp2 = shiftset;
for (i = 0; i < ntokens; i++)
{
if (j != default_LA)
{
rule = LAruleno[j];
- obstack_fgrow3 (&output_obstack,
+ fprintf (out,
_(" %-4s\treduce using rule %d (%s)\n"),
tags[i], rule, tags[rlhs[rule]]);
}
if (defaulted)
{
rule = LAruleno[default_LA];
- obstack_fgrow3 (&output_obstack,
+ fprintf (out,
_(" %-4s\treduce using rule %d (%s)\n"),
tags[i], rule, tags[rlhs[rule]]);
defaulted = 0;
}
rule = LAruleno[j];
- obstack_fgrow3 (&output_obstack,
+ fprintf (out,
_(" %-4s\t[reduce using rule %d (%s)]\n"),
tags[i], rule, tags[rlhs[rule]]);
}
}
if (default_LA >= 0)
- obstack_fgrow2 (&output_obstack,
- _(" $default\treduce using rule %d (%s)\n"),
- default_rule, tags[rlhs[default_rule]]);
-
- obstack_1grow (&output_obstack, '\n');
+ fprintf (out, _(" $default\treduce using rule %d (%s)\n"),
+ default_rule, tags[rlhs[default_rule]]);
}
}