/* Type definitions for nondeterministic finite state machine for Bison.
- Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
+#include <config.h>
#include "system.h"
#include <hash.h>
}
-/*-------------------------------------------------------------------.
-| Return the state such these TRANSITIONS contain a shift/goto to it |
-| on S. Abort if none found. |
-`-------------------------------------------------------------------*/
+/*-------------------------------------------------------.
+| Return the state such that SHIFTS contain a shift/goto |
+| to it on SYM. Abort if none found. |
+`-------------------------------------------------------*/
state *
-transitions_to (transitions *shifts, symbol_number s)
+transitions_to (transitions *shifts, symbol_number sym)
{
int j;
- for (j = 0; j < shifts->num; j++)
- if (TRANSITION_SYMBOL (shifts, j) == s)
- return shifts->states[j];
- abort ();
+ for (j = 0; ; j++)
+ {
+ aver (j < shifts->num);
+ if (TRANSITION_SYMBOL (shifts, j) == sym)
+ return shifts->states[j];
+ }
}
size_t rules_size = num * sizeof *reds;
reductions *res = xmalloc (offsetof (reductions, rules) + rules_size);
res->num = num;
- res->lookaheads = NULL;
+ res->lookahead_tokens = NULL;
memcpy (res->rules, reds, rules_size);
return res;
}
state *res;
size_t items_size = nitems * sizeof *core;
- if (STATE_NUMBER_MAXIMUM <= nstates)
- abort ();
+ aver (nstates < STATE_NUMBER_MAXIMUM);
res = xmalloc (offsetof (state, items) + items_size);
res->number = nstates++;
void
state_transitions_set (state *s, int num, state **trans)
{
- if (s->transitions)
- abort ();
+ aver (!s->transitions);
s->transitions = transitions_new (num, trans);
}
void
state_reductions_set (state *s, int num, rule **reds)
{
- if (s->reductions)
- abort ();
+ aver (!s->reductions);
s->reductions = reductions_new (num, reds);
}
void
state_errs_set (state *s, int num, symbol **tokens)
{
- if (s->errs)
- abort ();
+ aver (!s->errs);
s->errs = errs_new (num, tokens);
}
-/*-----------------------------------------------------.
-| Print on OUT all the lookaheads such that S wants to |
-| reduce R. |
-`-----------------------------------------------------*/
+/*--------------------------------------------------.
+| Print on OUT all the lookahead tokens such that S |
+| wants to reduce R. |
+`--------------------------------------------------*/
void
-state_rule_lookaheads_print (state *s, rule *r, FILE *out)
+state_rule_lookahead_tokens_print (state *s, rule *r, FILE *out)
{
/* Find the reduction we are handling. */
reductions *reds = s->reductions;
int red = state_reduction_find (s, r);
/* Print them if there are. */
- if (reds->lookaheads && red != -1)
+ if (reds->lookahead_tokens && red != -1)
{
bitset_iterator biter;
int k;
- int not_first = 0;
+ char const *sep = "";
fprintf (out, " [");
- BITSET_FOR_EACH (biter, reds->lookaheads[red], k, 0)
- fprintf (out, "%s%s",
- not_first++ ? ", " : "",
- symbols[k]->tag);
+ BITSET_FOR_EACH (biter, reds->lookahead_tokens[red], k, 0)
+ {
+ fprintf (out, "%s%s", sep, symbols[k]->tag);
+ sep = ", ";
+ }
fprintf (out, "]");
}
}
-/*----------------------.
+/*---------------------.
| A state hash table. |
-`----------------------*/
+`---------------------*/
/* Initial capacity of states hash table. */
#define HT_INITIAL_CAPACITY 257
static inline bool
state_compare (state const *s1, state const *s2)
{
- int i;
+ size_t i;
if (s1->nitems != s2->nitems)
return false;
return state_compare (s1, s2);
}
-static inline unsigned int
-state_hash (state const *s, unsigned int tablesize)
+static inline size_t
+state_hash (state const *s, size_t tablesize)
{
/* Add up the state's item numbers to get a hash key. */
- unsigned int key = 0;
- int i;
+ size_t key = 0;
+ size_t i;
for (i = 0; i < s->nitems; ++i)
key += s->items[i];
return key % tablesize;
}
-static unsigned int
-state_hasher (void const *s, unsigned int tablesize)
+static size_t
+state_hasher (void const *s, size_t tablesize)
{
return state_hash (s, tablesize);
}