newly created state.
Adjust to initialize first_state and last_state if needed.
Be sure to distinguish the initial from the final state.
(new_states): Create the itemset of the initial state, and use
new_state.
* src/closure.c (closure): Now that the initial state has its
items properly set, there is no need for a special case when
creating `ruleset'.
As a result, now the rule 0, reducing to $axiom, is visible in the
outputs. Adjust the test suite.
* tests/conflicts.at (Solved SR Conflicts)
(Unresolved SR Conflicts): Adjust.
* tests/regression.at (Web2c Report, Rule Line Numbers): Idem.
* tests/conflicts.at (S/R in initial): New.
+2002-04-07 Akim Demaille <akim@epita.fr>
+
+ * src/LR0.c (new_state): Display `nstates' as the name of the
+ newly created state.
+ Adjust to initialize first_state and last_state if needed.
+ Be sure to distinguish the initial from the final state.
+ (new_states): Create the itemset of the initial state, and use
+ new_state.
+ * src/closure.c (closure): Now that the initial state has its
+ items properly set, there is no need for a special case when
+ creating `ruleset'.
+
+ As a result, now the rule 0, reducing to $axiom, is visible in the
+ outputs. Adjust the test suite.
+
+ * tests/conflicts.at (Solved SR Conflicts)
+ (Unresolved SR Conflicts): Adjust.
+ * tests/regression.at (Web2c Report, Rule Line Numbers): Idem.
+ * tests/conflicts.at (S/R in initial): New.
+
2002-04-07 Akim Demaille <akim@epita.fr>
* src/LR0.c (allocate_itemsets): Don't loop over ritem: loop over
Changes in version 1.49a:
+* The initial rule is explicit.
+ Bison used to play hacks with the initial rule, which the user does
+ not write. It is now explicit, and visible in the reports and
+ graphs as rule 0.
+
+* Useless rules are actually removed.
+ Before, Bison reported the useless rules, but, although not used,
+ included them in the parsers.
+
* False `Token not used' report fixed.
On a grammar such as
#include "lalr.h"
#include "reduce.h"
-unsigned int nstates;
+unsigned int nstates = 0;
/* Initialize the final state to -1, otherwise, it might be set to 0
by default, and since we don't compute the reductions of the final
state, we end up not computing the reductions of the initial state,
if (trace_flag)
fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n",
- this_state->number, symbol, symbols[symbol]->tag);
+ nstates, symbol, symbols[symbol]->tag);
if (nstates >= MAXSHORT)
fatal (_("too many states (max %d)"), MAXSHORT);
shortcpy (p->items, kernel_base[symbol], kernel_size[symbol]);
- last_state->next = p;
+ /* If this is the eoftoken, and this is not the initial state, then
+ this is the final state. */
+ if (symbol == 0 && first_state)
+ final_state = p->number;
+
+ if (!first_state)
+ first_state = p;
+ if (last_state)
+ last_state->next = p;
last_state = p;
- nstates++;
- /* If this is the eoftoken, then this is the final state. */
- if (symbol == 0)
- final_state = p->number;
+ nstates++;
return p;
}
static void
new_states (void)
{
- first_state = last_state = this_state = STATE_ALLOC (0);
- nstates = 1;
+ /* The 0 at the lhs is the index of the item of this initial rule. */
+ kernel_base[0][0] = 0;
+ kernel_size[0] = 1;
+ this_state = new_state (0);
}
if (trace_flag)
print_closure ("input", core, n);
- if (n == 0)
- {
- bitset_copy (ruleset, FDERIVES (start_symbol));
- }
- else
- {
- bitset_zero (ruleset);
+ bitset_zero (ruleset);
- for (c = 0; c < n; ++c)
- if (ISVAR (ritem[core[c]]))
- bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
- }
+ for (c = 0; c < n; ++c)
+ if (ISVAR (ritem[core[c]]))
+ bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
nitemset = 0;
c = 0;
TESTSUITE = $(srcdir)/testsuite
AUTOTEST = $(AUTOM4TE) --language=autotest
-$(srcdir)/$(TESTSUITE): package.m4 $(TESTSUITE_AT)
+$(TESTSUITE): package.m4 $(TESTSUITE_AT)
$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
mv $@.tmp $@
# Exercising Bison on conflicts. -*- Autotest -*-
-# Copyright 2002 Free Software Foundation, Inc.
+# Copyright (C) 2002 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
AT_BANNER([[Conflicts.]])
+## ---------------- ##
+## S/R in initial. ##
+## ---------------- ##
+
+# I once hacked Bison in such a way that it lost its reductions on the
+# initial state (because it was confusing it with the last state). It
+# took me a while to strip down my failures to this simple case. So
+# make sure it finds the s/r conflict below.
+
+AT_SETUP([S/R in initial])
+
+AT_DATA([[input.y]],
+[[%expect 1
+%%
+exp: e 'e';
+e: 'e' | /* Nothing. */;
+]])
+
+AT_CHECK([bison input.y -o input.c])
+
+AT_CLEANUP
+
## ------------------- ##
## %nonassoc and eof. ##
## ------------------- ##
state 0
+ $axiom -> . exp $ (rule 0)
+
NUM shift, and go to state 1
exp go to state 2
state 0
+ $axiom -> . exp $ (rule 0)
+
NUM shift, and go to state 1
exp go to state 2
state 0
+ $axiom -> . expr $ (rule 0)
+
'a' shift, and go to state 1
$default reduce using rule 3 (@2)
@1 (11)
on left: 4, on right: 5
state 0
+ $axiom -> . CONST_DEC_PART $ (rule 0)
$default reduce using rule 4 (@1)
CONST_DEC_PART go to state 1
CONST_DEC_LIST go to state 2