X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/825b9e4ef4bde9d53deb5be6006dc210a854fbe3..e89a22bfab22e4d2ee73be49dcb66b51f8d0e892:/src/lalr.c?ds=sidebyside diff --git a/src/lalr.c b/src/lalr.c index e6738bda..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,13 +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 shifts, even if reduced to 0 shifts. */ + { + int i; + for (i = 0; i < nstates; i++) + if (!state_table[i].shifts) + state_table[i].shifts = shifts_new (0); } /* Initializing the lookaheads members. Please note that it must be @@ -174,24 +183,23 @@ 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; if (rp - && (rp->nreds > 1 || (sp && SHIFT_IS_SHIFT (sp, 0)))) + && (rp->nreds > 1 || (sp->nshifts && SHIFT_IS_SHIFT (sp, 0)))) count += rp->nreds; else state_table[i].consistent = 1; - if (sp) - for (k = 0; k < sp->nshifts; k++) - if (SHIFT_IS_ERROR (sp, k)) - { - state_table[i].consistent = 0; - break; - } + for (k = 0; k < sp->nshifts; k++) + if (SHIFT_IS_ERROR (sp, k)) + { + state_table[i].consistent = 0; + break; + } } state_table[nstates].lookaheads = count; } @@ -217,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]; } @@ -239,7 +247,7 @@ set_goto_map (void) ngotos = 0; for (sp = first_shift; sp; sp = sp->next) - { + if (sp->nshifts) for (i = sp->nshifts - 1; i >= 0 && SHIFT_IS_GOTO (sp, i); --i) { symbol = state_table[sp->shifts[i]].accessing_symbol; @@ -250,7 +258,6 @@ set_goto_map (void) ngotos++; goto_map[symbol]++; } - } k = 0; for (i = ntokens; i < nsyms; i++) @@ -271,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); @@ -334,31 +342,28 @@ 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; - if (sp) + int j; + for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++) { - 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); - } + int symbol = state_table[sp->shifts[j]].accessing_symbol; + SETBIT (F (i), symbol); + } - for (; j < sp->nshifts; j++) - { - int symbol = state_table[sp->shifts[j]].accessing_symbol; - if (nullable[symbol]) - edge[nedges++] = map_goto (stateno, symbol); - } + for (; j < sp->nshifts; j++) + { + int symbol = state_table[sp->shifts[j]].accessing_symbol; + if (nullable[symbol]) + edge[nedges++] = map_goto (stateno, symbol); + } - if (nedges) - { - reads[i] = XCALLOC (short, nedges + 1); - shortcpy (reads[i], edge, nedges); - reads[i][nedges] = -1; - nedges = 0; - } + if (nedges) + { + reads[i] = XCALLOC (short, nedges + 1); + shortcpy (reads[i], edge, nedges); + reads[i][nedges] = -1; + nedges = 0; } } @@ -512,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++) {