diff options
Diffstat (limited to 'lr0.c')
-rw-r--r-- | lr0.c | 36 |
1 files changed, 19 insertions, 17 deletions
@@ -1,4 +1,4 @@ -/* $Id: lr0.c,v 1.19 2016/06/07 00:21:53 tom Exp $ */ +/* $Id: lr0.c,v 1.21 2021/05/20 23:57:23 tom Exp $ */ #include "defs.h" @@ -16,7 +16,7 @@ static void save_shifts(void); static void set_derives(void); static void set_nullable(void); -int nstates; +Value_t nstates; core *first_state; shifts *first_shift; reductions *first_reduction; @@ -44,7 +44,6 @@ allocate_itemsets(void) { Value_t *itemp; Value_t *item_end; - int symbol; int i; int count; int max; @@ -56,7 +55,8 @@ allocate_itemsets(void) item_end = ritem + nitems; for (itemp = ritem; itemp < item_end; itemp++) { - symbol = *itemp; + int symbol = *itemp; + if (symbol >= 0) { count++; @@ -94,7 +94,6 @@ static void append_states(void) { int i; - int j; Value_t symbol; #ifdef TRACE @@ -102,8 +101,9 @@ append_states(void) #endif for (i = 1; i < nshifts; i++) { + int j = i; + symbol = shift_symbol[i]; - j = i; while (j > 0 && shift_symbol[j - 1] > symbol) { shift_symbol[j] = shift_symbol[j - 1]; @@ -161,10 +161,8 @@ get_state(int symbol) { int key; Value_t *isp1; - Value_t *isp2; Value_t *iend; core *sp; - int found; int n; #ifdef TRACE @@ -180,11 +178,14 @@ get_state(int symbol) sp = state_set[key]; if (sp) { - found = 0; + int found = 0; + while (!found) { if (sp->nitems == n) { + Value_t *isp2; + found = 1; isp1 = kernel_base[symbol]; isp2 = sp->items; @@ -252,7 +253,6 @@ new_itemsets(void) int shiftcount; Value_t *isp; Value_t *ksp; - Value_t symbol; for (i = 0; i < nsyms; i++) kernel_end[i] = 0; @@ -261,8 +261,9 @@ new_itemsets(void) isp = itemset; while (isp < itemsetend) { - i = *isp++; - symbol = ritem[i]; + int j = *isp++; + Value_t symbol = ritem[j]; + if (symbol > 0) { ksp = kernel_end[symbol]; @@ -272,7 +273,7 @@ new_itemsets(void) ksp = kernel_base[symbol]; } - *ksp++ = (Value_t)(i + 1); + *ksp++ = (Value_t)(j + 1); kernel_end[symbol] = ksp; } } @@ -435,16 +436,14 @@ save_reductions(void) { Value_t *isp; Value_t *rp1; - Value_t *rp2; - int item; Value_t count; reductions *p; - Value_t *rend; count = 0; for (isp = itemset; isp < itemsetend; isp++) { - item = ritem[*isp]; + int item = ritem[*isp]; + if (item < 0) { redset[count++] = (Value_t)-item; @@ -453,6 +452,9 @@ save_reductions(void) if (count) { + Value_t *rp2; + Value_t *rend; + p = (reductions *)allocate((sizeof(reductions) + (unsigned)(count - 1) * sizeof(Value_t))); |