X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/06a2f464b12323e85887a102d38bb2cefd038931..e89a22bfab22e4d2ee73be49dcb66b51f8d0e892:/src/lalr.c diff --git a/src/lalr.c b/src/lalr.c index 4b1a4d49..d05d4ff5 100644 --- a/src/lalr.c +++ b/src/lalr.c @@ -103,7 +103,7 @@ traverse (int i) break; for (k = 0; k < size; ++k) - F (i)[k] = F (j)[k]; + F (j)[k] = F (i)[k]; } } @@ -156,22 +156,22 @@ set_state_table (void) { shifts *sp; for (sp = first_shift; sp; sp = sp->next) - state_table[sp->number].shift_table = sp; + state_table[sp->number].shifts = sp; } { reductions *rp; for (rp = first_reduction; rp; rp = rp->next) - state_table[rp->number].reduction_table = rp; + state_table[rp->number].reductions = rp; } /* Pessimization, but simplification of the code: make sense all the - states have a shift_table, even if reduced to 0 shifts. */ + states have a shifts, even if reduced to 0 shifts. */ { int i; for (i = 0; i < nstates; i++) - if (!state_table[i].shift_table) - state_table[i].shift_table = shifts_new (0); + if (!state_table[i].shifts) + state_table[i].shifts = shifts_new (0); } /* Initializing the lookaheads members. Please note that it must be @@ -183,8 +183,8 @@ set_state_table (void) for (i = 0; i < nstates; i++) { int k; - reductions *rp = state_table[i].reduction_table; - shifts *sp = state_table[i].shift_table; + reductions *rp = state_table[i].reductions; + shifts *sp = state_table[i].shifts; state_table[i].lookaheads = count; @@ -225,7 +225,7 @@ initialize_LA (void) np = LAruleno; for (i = 0; i < nstates; i++) if (!state_table[i].consistent) - if ((rp = state_table[i].reduction_table)) + if ((rp = state_table[i].reductions)) for (j = 0; j < rp->nreds; j++) *np++ = rp->rules[j]; } @@ -247,16 +247,17 @@ set_goto_map (void) ngotos = 0; for (sp = first_shift; sp; sp = sp->next) - for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i) - { - symbol = state_table[sp->shifts[i]].accessing_symbol; + if (sp->nshifts) + for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i) + { + symbol = state_table[sp->shifts[i]].accessing_symbol; - if (ngotos == MAXSHORT) - fatal (_("too many gotos (max %d)"), MAXSHORT); + if (ngotos == MAXSHORT) + fatal (_("too many gotos (max %d)"), MAXSHORT); - ngotos++; - goto_map[symbol]++; - } + ngotos++; + goto_map[symbol]++; + } k = 0; for (i = ntokens; i < nsyms; i++) @@ -277,15 +278,16 @@ set_goto_map (void) for (sp = first_shift; sp; sp = sp->next) { state1 = sp->number; - for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i) - { - state2 = sp->shifts[i]; - symbol = state_table[state2].accessing_symbol; - - k = temp_map[symbol]++; - from_state[k] = state1; - to_state[k] = state2; - } + if (sp->nshifts) + for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i) + { + state2 = sp->shifts[i]; + symbol = state_table[state2].accessing_symbol; + + k = temp_map[symbol]++; + from_state[k] = state1; + to_state[k] = state2; + } } XFREE (temp_map + ntokens); @@ -340,13 +342,13 @@ initialize_F (void) for (i = 0; i < ngotos; i++) { int stateno = to_state[i]; - shifts *sp = state_table[stateno].shift_table; + shifts *sp = state_table[stateno].shifts; int j; for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++) { int symbol = state_table[sp->shifts[j]].accessing_symbol; - SETBIT (F + i * tokensetsize, symbol); + SETBIT (F (i), symbol); } for (; j < sp->nshifts; j++) @@ -515,7 +517,7 @@ build_relations (void) for (rp = ritem + rule_table[*rulep].rhs; *rp > 0; rp++) { - shifts *sp = state_table[stateno].shift_table; + shifts *sp = state_table[stateno].shifts; int j; for (j = 0; j < sp->nshifts; j++) {