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-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>
* data/glr.c (yyfill): Adjust comment.
- (yyresolveAction): Initialize default location properly
+ (yyresolveAction): Initialize default location properly
for empty right-hand sides.
(yydoAction): Ditto.
Add comment explaining apparently dead code.
- * tests/glr-regression.at
- (Incorrectly initialized location for empty right-hand side in GLR):
+ * tests/glr-regression.at
+ (Incorrectly initialized location for empty right-hand side in GLR):
New test.
-
+
2005-10-30 Paul Eggert <eggert@cs.ucla.edu>
* bootstrap (cleanup_gnulib): New function. Use it to clean up
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
fprintf (stderr, "state_list_append (state = %d, symbol = %d (%s))\n",
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->state = s;
static state *
get_state (symbol_number sym, size_t core_size, item_number *core)
{
- state *sp;
+ state *s;
if (trace_flag & trace_automaton)
fprintf (stderr, "Entering get_state, symbol = %d (%s)\n",
sym, symbols[sym]->tag);
- sp = state_hash_lookup (core_size, core);
- if (!sp)
- sp = state_list_append (sym, core_size, core);
+ s = state_hash_lookup (core_size, core);
+ if (!s)
+ s = state_list_append (sym, core_size, core);
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;
}
/*---------------------------------------------------------------.
/* Find and count the active items that represent ends of rules. */
for (i = 0; i < nritemset; ++i)
{
- int item = ritem[itemset[i]];
- if (item < 0)
- redset[count++] = &rules[item_number_as_rule_number (item)];
+ item_number item = ritem[itemset[i]];
+ if (item_number_is_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. */
item of this initial rule. */
state_list_append (0, 1, &initial_core);
- list = first_state;
-
- while (list)
+ /* States are queued when they are created; process them all. */
+ for (list = first_state; list; list = list->next)
{
state *s = list->state;
if (trace_flag & trace_automaton)
/* Create the shifts structures for the shifts to those states,
now that the state numbers transitioning to are known. */
state_transitions_set (s, nshifts, shiftset);
-
- /* states are queued when they are created; process them all.
- */
- list = list->next;
}
/* discard various storage */
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
return i;
}
+static inline bool
+item_number_is_symbol_number (item_number i)
+{
+ return i >= 0;
+}
+
/* Rule numbers. */
typedef int rule_number;
extern rule_number nrules;
return -1 - i;
}
+static inline bool
+item_number_is_rule_number (item_number i)
+{
+ return i < 0;
+}
/*--------.
| Rules. |
/* 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.
void
state_transitions_set (state *s, int num, state **trans)
{
- if (s->transitions)
- abort ();
+ assert (!s->transitions);
s->transitions = transitions_new (num, trans);
}
void
state_reductions_set (state *s, int num, rule **reds)
{
- if (s->reductions)
- abort ();
+ assert (!s->reductions);
s->reductions = reductions_new (num, reds);
}
}
-/*----------------------.
+/*---------------------.
| A state hash table. |
-`----------------------*/
+`---------------------*/
/* Initial capacity of states hash table. */
#define HT_INITIAL_CAPACITY 257
typedef size_t uintptr_t;
#endif
+#include <assert.h>
+
#include <verify.h>
#include <xalloc.h>