mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 18:23:03 +00:00
In some (weird) cases, the final state number is incorrect.
Reported by Alexandre Duret-Lutz. * src/LR0.c (state_list_append): Remove the computation of final_state. (save_reductions): Do it here. (get_state): Alpha conversion. (generate_states): Use a for loop. * src/gram.h (item_number_is_rule_number) (item_number_is_symbol_number): New. * src/state.c: Use assert. * src/system.h: Include assert.h. * tests/sets.at (Accept): New.
This commit is contained in:
23
ChangeLog
23
ChangeLog
@@ -1,14 +1,29 @@
|
|||||||
|
2005-11-03 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
In some (weird) cases, the final state number is incorrect.
|
||||||
|
Reported by Alexandre Duret-Lutz.
|
||||||
|
* src/LR0.c (state_list_append): Remove the computation of
|
||||||
|
final_state.
|
||||||
|
(save_reductions): Do it here.
|
||||||
|
(get_state): Alpha conversion.
|
||||||
|
(generate_states): Use a for loop.
|
||||||
|
* src/gram.h (item_number_is_rule_number)
|
||||||
|
(item_number_is_symbol_number): New.
|
||||||
|
* src/state.c: Use assert.
|
||||||
|
* src/system.h: Include assert.h.
|
||||||
|
* tests/sets.at (Accept): New.
|
||||||
|
|
||||||
2005-10-30 Paul Hilfinger <hilfingr@tully.CS.Berkeley.EDU>
|
2005-10-30 Paul Hilfinger <hilfingr@tully.CS.Berkeley.EDU>
|
||||||
|
|
||||||
* data/glr.c (yyfill): Adjust comment.
|
* data/glr.c (yyfill): Adjust comment.
|
||||||
(yyresolveAction): Initialize default location properly
|
(yyresolveAction): Initialize default location properly
|
||||||
for empty right-hand sides.
|
for empty right-hand sides.
|
||||||
(yydoAction): Ditto.
|
(yydoAction): Ditto.
|
||||||
Add comment explaining apparently dead code.
|
Add comment explaining apparently dead code.
|
||||||
* tests/glr-regression.at
|
* tests/glr-regression.at
|
||||||
(Incorrectly initialized location for empty right-hand side in GLR):
|
(Incorrectly initialized location for empty right-hand side in GLR):
|
||||||
New test.
|
New test.
|
||||||
|
|
||||||
2005-10-30 Paul Eggert <eggert@cs.ucla.edu>
|
2005-10-30 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
* bootstrap (cleanup_gnulib): New function. Use it to clean up
|
* bootstrap (cleanup_gnulib): New function. Use it to clean up
|
||||||
|
|||||||
43
src/LR0.c
43
src/LR0.c
@@ -1,6 +1,6 @@
|
|||||||
/* Generate the nondeterministic finite state machine for Bison.
|
/* Generate the nondeterministic finite state machine for Bison.
|
||||||
|
|
||||||
Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2004 Free
|
Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2004, 2005 Free
|
||||||
Software Foundation, Inc.
|
Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
@@ -66,11 +66,6 @@ state_list_append (symbol_number sym, size_t core_size, item_number *core)
|
|||||||
fprintf (stderr, "state_list_append (state = %d, symbol = %d (%s))\n",
|
fprintf (stderr, "state_list_append (state = %d, symbol = %d (%s))\n",
|
||||||
nstates, sym, symbols[sym]->tag);
|
nstates, sym, symbols[sym]->tag);
|
||||||
|
|
||||||
/* If this is the endtoken, and this is not the initial state, then
|
|
||||||
this is the final state. */
|
|
||||||
if (sym == 0 && first_state)
|
|
||||||
final_state = s;
|
|
||||||
|
|
||||||
node->next = NULL;
|
node->next = NULL;
|
||||||
node->state = s;
|
node->state = s;
|
||||||
|
|
||||||
@@ -213,20 +208,20 @@ new_itemsets (state *s)
|
|||||||
static state *
|
static state *
|
||||||
get_state (symbol_number sym, size_t core_size, item_number *core)
|
get_state (symbol_number sym, size_t core_size, item_number *core)
|
||||||
{
|
{
|
||||||
state *sp;
|
state *s;
|
||||||
|
|
||||||
if (trace_flag & trace_automaton)
|
if (trace_flag & trace_automaton)
|
||||||
fprintf (stderr, "Entering get_state, symbol = %d (%s)\n",
|
fprintf (stderr, "Entering get_state, symbol = %d (%s)\n",
|
||||||
sym, symbols[sym]->tag);
|
sym, symbols[sym]->tag);
|
||||||
|
|
||||||
sp = state_hash_lookup (core_size, core);
|
s = state_hash_lookup (core_size, core);
|
||||||
if (!sp)
|
if (!s)
|
||||||
sp = state_list_append (sym, core_size, core);
|
s = state_list_append (sym, core_size, core);
|
||||||
|
|
||||||
if (trace_flag & trace_automaton)
|
if (trace_flag & trace_automaton)
|
||||||
fprintf (stderr, "Exiting get_state => %d\n", sp->number);
|
fprintf (stderr, "Exiting get_state => %d\n", s->number);
|
||||||
|
|
||||||
return sp;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------.
|
/*---------------------------------------------------------------.
|
||||||
@@ -278,9 +273,18 @@ save_reductions (state *s)
|
|||||||
/* Find and count the active items that represent ends of rules. */
|
/* Find and count the active items that represent ends of rules. */
|
||||||
for (i = 0; i < nritemset; ++i)
|
for (i = 0; i < nritemset; ++i)
|
||||||
{
|
{
|
||||||
int item = ritem[itemset[i]];
|
item_number item = ritem[itemset[i]];
|
||||||
if (item < 0)
|
if (item_number_is_rule_number (item))
|
||||||
redset[count++] = &rules[item_number_as_rule_number (item)];
|
{
|
||||||
|
rule_number r = item_number_as_rule_number (item);
|
||||||
|
redset[count++] = &rules[r];
|
||||||
|
if (r == 0)
|
||||||
|
{
|
||||||
|
/* This is "reduce 0", i.e., accept. */
|
||||||
|
assert (!final_state);
|
||||||
|
final_state = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make a reductions structure and copy the data into it. */
|
/* Make a reductions structure and copy the data into it. */
|
||||||
@@ -338,9 +342,8 @@ generate_states (void)
|
|||||||
item of this initial rule. */
|
item of this initial rule. */
|
||||||
state_list_append (0, 1, &initial_core);
|
state_list_append (0, 1, &initial_core);
|
||||||
|
|
||||||
list = first_state;
|
/* States are queued when they are created; process them all. */
|
||||||
|
for (list = first_state; list; list = list->next)
|
||||||
while (list)
|
|
||||||
{
|
{
|
||||||
state *s = list->state;
|
state *s = list->state;
|
||||||
if (trace_flag & trace_automaton)
|
if (trace_flag & trace_automaton)
|
||||||
@@ -362,10 +365,6 @@ generate_states (void)
|
|||||||
/* Create the shifts structures for the shifts to those states,
|
/* Create the shifts structures for the shifts to those states,
|
||||||
now that the state numbers transitioning to are known. */
|
now that the state numbers transitioning to are known. */
|
||||||
state_transitions_set (s, nshifts, shiftset);
|
state_transitions_set (s, nshifts, shiftset);
|
||||||
|
|
||||||
/* states are queued when they are created; process them all.
|
|
||||||
*/
|
|
||||||
list = list->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* discard various storage */
|
/* discard various storage */
|
||||||
|
|||||||
13
src/gram.h
13
src/gram.h
@@ -1,6 +1,6 @@
|
|||||||
/* Data definitions for internal representation of Bison's input.
|
/* Data definitions for internal representation of Bison's input.
|
||||||
|
|
||||||
Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003, 2004
|
Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003, 2004, 2005
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
@@ -138,6 +138,12 @@ item_number_as_symbol_number (item_number i)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
item_number_is_symbol_number (item_number i)
|
||||||
|
{
|
||||||
|
return i >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Rule numbers. */
|
/* Rule numbers. */
|
||||||
typedef int rule_number;
|
typedef int rule_number;
|
||||||
extern rule_number nrules;
|
extern rule_number nrules;
|
||||||
@@ -154,6 +160,11 @@ item_number_as_rule_number (item_number i)
|
|||||||
return -1 - i;
|
return -1 - i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
item_number_is_rule_number (item_number i)
|
||||||
|
{
|
||||||
|
return i < 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*--------.
|
/*--------.
|
||||||
| Rules. |
|
| Rules. |
|
||||||
|
|||||||
12
src/state.c
12
src/state.c
@@ -1,6 +1,6 @@
|
|||||||
/* Type definitions for nondeterministic finite state machine for Bison.
|
/* Type definitions for nondeterministic finite state machine for Bison.
|
||||||
|
|
||||||
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -174,8 +174,7 @@ state_free (state *s)
|
|||||||
void
|
void
|
||||||
state_transitions_set (state *s, int num, state **trans)
|
state_transitions_set (state *s, int num, state **trans)
|
||||||
{
|
{
|
||||||
if (s->transitions)
|
assert (!s->transitions);
|
||||||
abort ();
|
|
||||||
s->transitions = transitions_new (num, trans);
|
s->transitions = transitions_new (num, trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,8 +186,7 @@ state_transitions_set (state *s, int num, state **trans)
|
|||||||
void
|
void
|
||||||
state_reductions_set (state *s, int num, rule **reds)
|
state_reductions_set (state *s, int num, rule **reds)
|
||||||
{
|
{
|
||||||
if (s->reductions)
|
assert (!s->reductions);
|
||||||
abort ();
|
|
||||||
s->reductions = reductions_new (num, reds);
|
s->reductions = reductions_new (num, reds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,9 +246,9 @@ state_rule_look_ahead_tokens_print (state *s, rule *r, FILE *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*----------------------.
|
/*---------------------.
|
||||||
| A state hash table. |
|
| A state hash table. |
|
||||||
`----------------------*/
|
`---------------------*/
|
||||||
|
|
||||||
/* Initial capacity of states hash table. */
|
/* Initial capacity of states hash table. */
|
||||||
#define HT_INITIAL_CAPACITY 257
|
#define HT_INITIAL_CAPACITY 257
|
||||||
|
|||||||
@@ -52,6 +52,8 @@
|
|||||||
typedef size_t uintptr_t;
|
typedef size_t uintptr_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <verify.h>
|
#include <verify.h>
|
||||||
#include <xalloc.h>
|
#include <xalloc.h>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user