* src/LR0.c (new_state, get_state): Instead of using the global

`kernel_size' and `kernel_base', have two new arguments:
`core_size' and `core'.
Adjust callers.
This commit is contained in:
Akim Demaille
2002-05-06 08:23:41 +00:00
parent a900a6248c
commit 458be8e0ed
2 changed files with 26 additions and 15 deletions

View File

@@ -1,3 +1,11 @@
2002-05-06 Akim Demaille <akim@epita.fr>
* src/LR0.c (new_state, get_state): Instead of using the global
`kernel_size' and `kernel_base', have two new arguments:
`core_size' and `core'.
Adjust callers.
2002-05-06 Akim Demaille <akim@epita.fr> 2002-05-06 Akim Demaille <akim@epita.fr>
* src/reader.c (packgram): No longer end `ritem' with a 0 * src/reader.c (packgram): No longer end `ritem' with a 0

View File

@@ -185,7 +185,7 @@ new_itemsets (void)
`-----------------------------------------------------------------*/ `-----------------------------------------------------------------*/
static state_t * static state_t *
new_state (token_number_t symbol) new_state (token_number_t symbol, size_t core_size, item_number_t *core)
{ {
state_t *p; state_t *p;
@@ -197,13 +197,12 @@ new_state (token_number_t symbol)
if (nstates >= SHRT_MAX) if (nstates >= SHRT_MAX)
fatal (_("too many states (max %d)"), SHRT_MAX); fatal (_("too many states (max %d)"), SHRT_MAX);
p = STATE_ALLOC (kernel_size[symbol]); p = STATE_ALLOC (core_size);
p->accessing_symbol = symbol; p->accessing_symbol = symbol;
p->number = nstates; p->number = nstates;
p->nitems = kernel_size[symbol]; p->nitems = core_size;
memcpy (p->items, kernel_base[symbol], memcpy (p->items, core, core_size * sizeof (core[0]));
kernel_size[symbol] * sizeof (kernel_base[symbol][0]));
/* If this is the eoftoken, and this is not the initial state, then /* If this is the eoftoken, and this is not the initial state, then
this is the final state. */ this is the final state. */
@@ -229,7 +228,7 @@ new_state (token_number_t symbol)
`--------------------------------------------------------------*/ `--------------------------------------------------------------*/
static int static int
get_state (token_number_t symbol) get_state (token_number_t symbol, size_t core_size, item_number_t *core)
{ {
int key; int key;
int i; int i;
@@ -243,8 +242,8 @@ get_state (token_number_t symbol)
/* Add up the target state's active item numbers to get a hash key. /* Add up the target state's active item numbers to get a hash key.
*/ */
key = 0; key = 0;
for (i = 0; i < kernel_size[symbol]; ++i) for (i = 0; i < core_size; ++i)
key += kernel_base[symbol][i]; key += core[i];
key = key % STATE_HASH_SIZE; key = key % STATE_HASH_SIZE;
sp = state_hash[key]; sp = state_hash[key];
@@ -253,11 +252,11 @@ get_state (token_number_t symbol)
int found = 0; int found = 0;
while (!found) while (!found)
{ {
if (sp->nitems == kernel_size[symbol]) if (sp->nitems == core_size)
{ {
found = 1; found = 1;
for (i = 0; i < kernel_size[symbol]; ++i) for (i = 0; i < core_size; ++i)
if (kernel_base[symbol][i] != sp->items[i]) if (core[i] != sp->items[i])
found = 0; found = 0;
} }
@@ -269,7 +268,7 @@ get_state (token_number_t symbol)
} }
else /* bucket exhausted and no match */ else /* bucket exhausted and no match */
{ {
sp = sp->link = new_state (symbol); sp = sp->link = new_state (symbol, core_size, core);
found = 1; found = 1;
} }
} }
@@ -277,7 +276,7 @@ get_state (token_number_t symbol)
} }
else /* bucket is empty */ else /* bucket is empty */
{ {
state_hash[key] = sp = new_state (symbol); state_hash[key] = sp = new_state (symbol, core_size, core);
} }
if (trace_flag) if (trace_flag)
@@ -319,7 +318,11 @@ append_states (void)
} }
for (i = 0; i < nshifts; i++) for (i = 0; i < nshifts; i++)
shiftset[i] = get_state (shift_symbol[i]); {
symbol = shift_symbol[i];
shiftset[i] = get_state (symbol,
kernel_size[symbol], kernel_base[symbol]);
}
} }
@@ -329,7 +332,7 @@ new_states (void)
/* The 0 at the lhs is the index of the item of this initial rule. */ /* The 0 at the lhs is the index of the item of this initial rule. */
kernel_base[0][0] = 0; kernel_base[0][0] = 0;
kernel_size[0] = 1; kernel_size[0] = 1;
this_state = new_state (0); this_state = new_state (0, kernel_size[0], kernel_base[0]);
} }