* 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.
This commit is contained in:
Akim Demaille
2002-04-07 17:40:16 +00:00
parent b4c4ccc2b3
commit 643a599471
7 changed files with 81 additions and 23 deletions

View File

@@ -1,3 +1,23 @@
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> 2002-04-07 Akim Demaille <akim@epita.fr>
* src/LR0.c (allocate_itemsets): Don't loop over ritem: loop over * src/LR0.c (allocate_itemsets): Don't loop over ritem: loop over

9
NEWS
View File

@@ -3,6 +3,15 @@ Bison News
Changes in version 1.49a: 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. * False `Token not used' report fixed.
On a grammar such as On a grammar such as

View File

@@ -35,7 +35,7 @@
#include "lalr.h" #include "lalr.h"
#include "reduce.h" #include "reduce.h"
unsigned int nstates; unsigned int nstates = 0;
/* Initialize the final state to -1, otherwise, it might be set to 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 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, state, we end up not computing the reductions of the initial state,
@@ -190,7 +190,7 @@ new_state (int symbol)
if (trace_flag) if (trace_flag)
fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n", 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) if (nstates >= MAXSHORT)
fatal (_("too many states (max %d)"), MAXSHORT); fatal (_("too many states (max %d)"), MAXSHORT);
@@ -202,14 +202,19 @@ new_state (int symbol)
shortcpy (p->items, kernel_base[symbol], kernel_size[symbol]); 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
last_state = p; this is the final state. */
nstates++; if (symbol == 0 && first_state)
/* If this is the eoftoken, then this is the final state. */
if (symbol == 0)
final_state = p->number; final_state = p->number;
if (!first_state)
first_state = p;
if (last_state)
last_state->next = p;
last_state = p;
nstates++;
return p; return p;
} }
@@ -317,8 +322,10 @@ append_states (void)
static void static void
new_states (void) new_states (void)
{ {
first_state = last_state = this_state = STATE_ALLOC (0); /* The 0 at the lhs is the index of the item of this initial rule. */
nstates = 1; kernel_base[0][0] = 0;
kernel_size[0] = 1;
this_state = new_state (0);
} }

View File

@@ -244,18 +244,11 @@ closure (short *core, int n)
if (trace_flag) if (trace_flag)
print_closure ("input", core, n); print_closure ("input", core, n);
if (n == 0) bitset_zero (ruleset);
{
bitset_copy (ruleset, FDERIVES (start_symbol));
}
else
{
bitset_zero (ruleset);
for (c = 0; c < n; ++c) for (c = 0; c < n; ++c)
if (ISVAR (ritem[core[c]])) if (ISVAR (ritem[core[c]]))
bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]])); bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]]));
}
nitemset = 0; nitemset = 0;
c = 0; c = 0;

View File

@@ -55,7 +55,7 @@ TESTSUITE_AT = \
TESTSUITE = $(srcdir)/testsuite TESTSUITE = $(srcdir)/testsuite
AUTOTEST = $(AUTOM4TE) --language=autotest AUTOTEST = $(AUTOM4TE) --language=autotest
$(srcdir)/$(TESTSUITE): package.m4 $(TESTSUITE_AT) $(TESTSUITE): package.m4 $(TESTSUITE_AT)
$(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
mv $@.tmp $@ mv $@.tmp $@

View File

@@ -1,5 +1,5 @@
# Exercising Bison on conflicts. -*- Autotest -*- # 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 # 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 # it under the terms of the GNU General Public License as published by
@@ -19,6 +19,28 @@
AT_BANNER([[Conflicts.]]) 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. ## ## %nonassoc and eof. ##
## ------------------- ## ## ------------------- ##
@@ -143,6 +165,8 @@ exp (6)
state 0 state 0
$axiom -> . exp $ (rule 0)
NUM shift, and go to state 1 NUM shift, and go to state 1
exp go to state 2 exp go to state 2
@@ -247,6 +271,8 @@ exp (6)
state 0 state 0
$axiom -> . exp $ (rule 0)
NUM shift, and go to state 1 NUM shift, and go to state 1
exp go to state 2 exp go to state 2

View File

@@ -139,6 +139,8 @@ expr (7)
state 0 state 0
$axiom -> . expr $ (rule 0)
'a' shift, and go to state 1 'a' shift, and go to state 1
$default reduce using rule 3 (@2) $default reduce using rule 3 (@2)
@@ -348,6 +350,7 @@ CONST_DEC (10)
@1 (11) @1 (11)
on left: 4, on right: 5 on left: 4, on right: 5
state 0 state 0
$axiom -> . CONST_DEC_PART $ (rule 0)
$default reduce using rule 4 (@1) $default reduce using rule 4 (@1)
CONST_DEC_PART go to state 1 CONST_DEC_PART go to state 1
CONST_DEC_LIST go to state 2 CONST_DEC_LIST go to state 2