1234949Sbapt/* $Id: lalr.c,v 1.9 2009/10/27 09:49:27 tom Exp $ */ 2234949Sbapt 3234949Sbapt#include "defs.h" 4234949Sbapt 5234949Sbapttypedef struct shorts 6234949Sbapt{ 7234949Sbapt struct shorts *next; 8234949Sbapt Value_t value; 9234949Sbapt} 10234949Sbaptshorts; 11234949Sbapt 12234949Sbaptstatic Value_t map_goto(int state, int symbol); 13234949Sbaptstatic Value_t **transpose(Value_t ** R, int n); 14234949Sbaptstatic void add_lookback_edge(int stateno, int ruleno, int gotono); 15234949Sbaptstatic void build_relations(void); 16234949Sbaptstatic void compute_FOLLOWS(void); 17234949Sbaptstatic void compute_lookaheads(void); 18234949Sbaptstatic void digraph(Value_t ** relation); 19234949Sbaptstatic void initialize_F(void); 20234949Sbaptstatic void initialize_LA(void); 21234949Sbaptstatic void set_accessing_symbol(void); 22234949Sbaptstatic void set_goto_map(void); 23234949Sbaptstatic void set_maxrhs(void); 24234949Sbaptstatic void set_reduction_table(void); 25234949Sbaptstatic void set_shift_table(void); 26234949Sbaptstatic void set_state_table(void); 27234949Sbaptstatic void traverse(int i); 28234949Sbapt 29234949Sbaptstatic int tokensetsize; 30234949SbaptValue_t *lookaheads; 31234949SbaptValue_t *LAruleno; 32234949Sbaptunsigned *LA; 33234949SbaptValue_t *accessing_symbol; 34234949Sbaptcore **state_table; 35234949Sbaptshifts **shift_table; 36234949Sbaptreductions **reduction_table; 37234949SbaptValue_t *goto_map; 38234949SbaptValue_t *from_state; 39234949SbaptValue_t *to_state; 40234949Sbapt 41234949Sbaptstatic Value_t infinity; 42234949Sbaptstatic int maxrhs; 43234949Sbaptstatic int ngotos; 44234949Sbaptstatic unsigned *F; 45234949Sbaptstatic Value_t **includes; 46234949Sbaptstatic shorts **lookback; 47234949Sbaptstatic Value_t **R; 48234949Sbaptstatic Value_t *INDEX; 49234949Sbaptstatic Value_t *VERTICES; 50234949Sbaptstatic Value_t top; 51234949Sbapt 52234949Sbaptvoid 53234949Sbaptlalr(void) 54234949Sbapt{ 55234949Sbapt tokensetsize = WORDSIZE(ntokens); 56234949Sbapt 57234949Sbapt set_state_table(); 58234949Sbapt set_accessing_symbol(); 59234949Sbapt set_shift_table(); 60234949Sbapt set_reduction_table(); 61234949Sbapt set_maxrhs(); 62234949Sbapt initialize_LA(); 63234949Sbapt set_goto_map(); 64234949Sbapt initialize_F(); 65234949Sbapt build_relations(); 66234949Sbapt compute_FOLLOWS(); 67234949Sbapt compute_lookaheads(); 68234949Sbapt} 69234949Sbapt 70234949Sbaptstatic void 71234949Sbaptset_state_table(void) 72234949Sbapt{ 73234949Sbapt core *sp; 74234949Sbapt 75234949Sbapt state_table = NEW2(nstates, core *); 76234949Sbapt for (sp = first_state; sp; sp = sp->next) 77234949Sbapt state_table[sp->number] = sp; 78234949Sbapt} 79234949Sbapt 80234949Sbaptstatic void 81234949Sbaptset_accessing_symbol(void) 82234949Sbapt{ 83234949Sbapt core *sp; 84234949Sbapt 85234949Sbapt accessing_symbol = NEW2(nstates, Value_t); 86234949Sbapt for (sp = first_state; sp; sp = sp->next) 87234949Sbapt accessing_symbol[sp->number] = sp->accessing_symbol; 88234949Sbapt} 89234949Sbapt 90234949Sbaptstatic void 91234949Sbaptset_shift_table(void) 92234949Sbapt{ 93234949Sbapt shifts *sp; 94234949Sbapt 95234949Sbapt shift_table = NEW2(nstates, shifts *); 96234949Sbapt for (sp = first_shift; sp; sp = sp->next) 97234949Sbapt shift_table[sp->number] = sp; 98234949Sbapt} 99234949Sbapt 100234949Sbaptstatic void 101234949Sbaptset_reduction_table(void) 102234949Sbapt{ 103234949Sbapt reductions *rp; 104234949Sbapt 105234949Sbapt reduction_table = NEW2(nstates, reductions *); 106234949Sbapt for (rp = first_reduction; rp; rp = rp->next) 107234949Sbapt reduction_table[rp->number] = rp; 108234949Sbapt} 109234949Sbapt 110234949Sbaptstatic void 111234949Sbaptset_maxrhs(void) 112234949Sbapt{ 113234949Sbapt Value_t *itemp; 114234949Sbapt Value_t *item_end; 115234949Sbapt int length; 116234949Sbapt int max; 117234949Sbapt 118234949Sbapt length = 0; 119234949Sbapt max = 0; 120234949Sbapt item_end = ritem + nitems; 121234949Sbapt for (itemp = ritem; itemp < item_end; itemp++) 122234949Sbapt { 123234949Sbapt if (*itemp >= 0) 124234949Sbapt { 125234949Sbapt length++; 126234949Sbapt } 127234949Sbapt else 128234949Sbapt { 129234949Sbapt if (length > max) 130234949Sbapt max = length; 131234949Sbapt length = 0; 132234949Sbapt } 133234949Sbapt } 134234949Sbapt 135234949Sbapt maxrhs = max; 136234949Sbapt} 137234949Sbapt 138234949Sbaptstatic void 139234949Sbaptinitialize_LA(void) 140234949Sbapt{ 141234949Sbapt int i, j, k; 142234949Sbapt reductions *rp; 143234949Sbapt 144234949Sbapt lookaheads = NEW2(nstates + 1, Value_t); 145234949Sbapt 146234949Sbapt k = 0; 147234949Sbapt for (i = 0; i < nstates; i++) 148234949Sbapt { 149234949Sbapt lookaheads[i] = (Value_t) k; 150234949Sbapt rp = reduction_table[i]; 151234949Sbapt if (rp) 152234949Sbapt k += rp->nreds; 153234949Sbapt } 154234949Sbapt lookaheads[nstates] = (Value_t) k; 155234949Sbapt 156234949Sbapt LA = NEW2(k * tokensetsize, unsigned); 157234949Sbapt LAruleno = NEW2(k, Value_t); 158234949Sbapt lookback = NEW2(k, shorts *); 159234949Sbapt 160234949Sbapt k = 0; 161234949Sbapt for (i = 0; i < nstates; i++) 162234949Sbapt { 163234949Sbapt rp = reduction_table[i]; 164234949Sbapt if (rp) 165234949Sbapt { 166234949Sbapt for (j = 0; j < rp->nreds; j++) 167234949Sbapt { 168234949Sbapt LAruleno[k] = rp->rules[j]; 169234949Sbapt k++; 170234949Sbapt } 171234949Sbapt } 172234949Sbapt } 173234949Sbapt} 174234949Sbapt 175234949Sbaptstatic void 176234949Sbaptset_goto_map(void) 177234949Sbapt{ 178234949Sbapt shifts *sp; 179234949Sbapt int i; 180234949Sbapt int symbol; 181234949Sbapt int k; 182234949Sbapt Value_t *temp_map; 183234949Sbapt Value_t state2; 184234949Sbapt Value_t state1; 185234949Sbapt 186234949Sbapt goto_map = NEW2(nvars + 1, Value_t) - ntokens; 187234949Sbapt temp_map = NEW2(nvars + 1, Value_t) - ntokens; 188234949Sbapt 189234949Sbapt ngotos = 0; 190234949Sbapt for (sp = first_shift; sp; sp = sp->next) 191234949Sbapt { 192234949Sbapt for (i = sp->nshifts - 1; i >= 0; i--) 193234949Sbapt { 194234949Sbapt symbol = accessing_symbol[sp->shift[i]]; 195234949Sbapt 196234949Sbapt if (ISTOKEN(symbol)) 197234949Sbapt break; 198234949Sbapt 199234949Sbapt if (ngotos == MAXSHORT) 200234949Sbapt fatal("too many gotos"); 201234949Sbapt 202234949Sbapt ngotos++; 203234949Sbapt goto_map[symbol]++; 204234949Sbapt } 205234949Sbapt } 206234949Sbapt 207234949Sbapt k = 0; 208234949Sbapt for (i = ntokens; i < nsyms; i++) 209234949Sbapt { 210234949Sbapt temp_map[i] = (Value_t) k; 211234949Sbapt k += goto_map[i]; 212234949Sbapt } 213234949Sbapt 214234949Sbapt for (i = ntokens; i < nsyms; i++) 215234949Sbapt goto_map[i] = temp_map[i]; 216234949Sbapt 217234949Sbapt goto_map[nsyms] = (Value_t) ngotos; 218234949Sbapt temp_map[nsyms] = (Value_t) ngotos; 219234949Sbapt 220234949Sbapt from_state = NEW2(ngotos, Value_t); 221234949Sbapt to_state = NEW2(ngotos, Value_t); 222234949Sbapt 223234949Sbapt for (sp = first_shift; sp; sp = sp->next) 224234949Sbapt { 225234949Sbapt state1 = sp->number; 226234949Sbapt for (i = sp->nshifts - 1; i >= 0; i--) 227234949Sbapt { 228234949Sbapt state2 = sp->shift[i]; 229234949Sbapt symbol = accessing_symbol[state2]; 230234949Sbapt 231234949Sbapt if (ISTOKEN(symbol)) 232234949Sbapt break; 233234949Sbapt 234234949Sbapt k = temp_map[symbol]++; 235234949Sbapt from_state[k] = state1; 236234949Sbapt to_state[k] = state2; 237234949Sbapt } 238234949Sbapt } 239234949Sbapt 240234949Sbapt FREE(temp_map + ntokens); 241234949Sbapt} 242234949Sbapt 243234949Sbapt/* Map_goto maps a state/symbol pair into its numeric representation. */ 244234949Sbapt 245234949Sbaptstatic Value_t 246234949Sbaptmap_goto(int state, int symbol) 247234949Sbapt{ 248234949Sbapt int high; 249234949Sbapt int low; 250234949Sbapt int middle; 251234949Sbapt int s; 252234949Sbapt 253234949Sbapt low = goto_map[symbol]; 254234949Sbapt high = goto_map[symbol + 1]; 255234949Sbapt 256234949Sbapt for (;;) 257234949Sbapt { 258234949Sbapt assert(low <= high); 259234949Sbapt middle = (low + high) >> 1; 260234949Sbapt s = from_state[middle]; 261234949Sbapt if (s == state) 262234949Sbapt return (Value_t) (middle); 263234949Sbapt else if (s < state) 264234949Sbapt low = middle + 1; 265234949Sbapt else 266234949Sbapt high = middle - 1; 267234949Sbapt } 268234949Sbapt} 269234949Sbapt 270234949Sbaptstatic void 271234949Sbaptinitialize_F(void) 272234949Sbapt{ 273234949Sbapt int i; 274234949Sbapt int j; 275234949Sbapt int k; 276234949Sbapt shifts *sp; 277234949Sbapt Value_t *edge; 278234949Sbapt unsigned *rowp; 279234949Sbapt Value_t *rp; 280234949Sbapt Value_t **reads; 281234949Sbapt int nedges; 282234949Sbapt int stateno; 283234949Sbapt int symbol; 284234949Sbapt int nwords; 285234949Sbapt 286234949Sbapt nwords = ngotos * tokensetsize; 287234949Sbapt F = NEW2(nwords, unsigned); 288234949Sbapt 289234949Sbapt reads = NEW2(ngotos, Value_t *); 290234949Sbapt edge = NEW2(ngotos + 1, Value_t); 291234949Sbapt nedges = 0; 292234949Sbapt 293234949Sbapt rowp = F; 294234949Sbapt for (i = 0; i < ngotos; i++) 295234949Sbapt { 296234949Sbapt stateno = to_state[i]; 297234949Sbapt sp = shift_table[stateno]; 298234949Sbapt 299234949Sbapt if (sp) 300234949Sbapt { 301234949Sbapt k = sp->nshifts; 302234949Sbapt 303234949Sbapt for (j = 0; j < k; j++) 304234949Sbapt { 305234949Sbapt symbol = accessing_symbol[sp->shift[j]]; 306234949Sbapt if (ISVAR(symbol)) 307234949Sbapt break; 308234949Sbapt SETBIT(rowp, symbol); 309234949Sbapt } 310234949Sbapt 311234949Sbapt for (; j < k; j++) 312234949Sbapt { 313234949Sbapt symbol = accessing_symbol[sp->shift[j]]; 314234949Sbapt if (nullable[symbol]) 315234949Sbapt edge[nedges++] = map_goto(stateno, symbol); 316234949Sbapt } 317234949Sbapt 318234949Sbapt if (nedges) 319234949Sbapt { 320234949Sbapt reads[i] = rp = NEW2(nedges + 1, Value_t); 321234949Sbapt 322234949Sbapt for (j = 0; j < nedges; j++) 323234949Sbapt rp[j] = edge[j]; 324234949Sbapt 325234949Sbapt rp[nedges] = -1; 326234949Sbapt nedges = 0; 327234949Sbapt } 328234949Sbapt } 329234949Sbapt 330234949Sbapt rowp += tokensetsize; 331234949Sbapt } 332234949Sbapt 333234949Sbapt SETBIT(F, 0); 334234949Sbapt digraph(reads); 335234949Sbapt 336234949Sbapt for (i = 0; i < ngotos; i++) 337234949Sbapt { 338234949Sbapt if (reads[i]) 339234949Sbapt FREE(reads[i]); 340234949Sbapt } 341234949Sbapt 342234949Sbapt FREE(reads); 343234949Sbapt FREE(edge); 344234949Sbapt} 345234949Sbapt 346234949Sbaptstatic void 347234949Sbaptbuild_relations(void) 348234949Sbapt{ 349234949Sbapt int i; 350234949Sbapt int j; 351234949Sbapt int k; 352234949Sbapt Value_t *rulep; 353234949Sbapt Value_t *rp; 354234949Sbapt shifts *sp; 355234949Sbapt int length; 356234949Sbapt int nedges; 357234949Sbapt int done_flag; 358234949Sbapt Value_t state1; 359234949Sbapt Value_t stateno; 360234949Sbapt int symbol1; 361234949Sbapt int symbol2; 362234949Sbapt Value_t *shortp; 363234949Sbapt Value_t *edge; 364234949Sbapt Value_t *states; 365234949Sbapt Value_t **new_includes; 366234949Sbapt 367234949Sbapt includes = NEW2(ngotos, Value_t *); 368234949Sbapt edge = NEW2(ngotos + 1, Value_t); 369234949Sbapt states = NEW2(maxrhs + 1, Value_t); 370234949Sbapt 371234949Sbapt for (i = 0; i < ngotos; i++) 372234949Sbapt { 373234949Sbapt nedges = 0; 374234949Sbapt state1 = from_state[i]; 375234949Sbapt symbol1 = accessing_symbol[to_state[i]]; 376234949Sbapt 377234949Sbapt for (rulep = derives[symbol1]; *rulep >= 0; rulep++) 378234949Sbapt { 379234949Sbapt length = 1; 380234949Sbapt states[0] = state1; 381234949Sbapt stateno = state1; 382234949Sbapt 383234949Sbapt for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++) 384234949Sbapt { 385234949Sbapt symbol2 = *rp; 386234949Sbapt sp = shift_table[stateno]; 387234949Sbapt k = sp->nshifts; 388234949Sbapt 389234949Sbapt for (j = 0; j < k; j++) 390234949Sbapt { 391234949Sbapt stateno = sp->shift[j]; 392234949Sbapt if (accessing_symbol[stateno] == symbol2) 393234949Sbapt break; 394234949Sbapt } 395234949Sbapt 396234949Sbapt states[length++] = stateno; 397234949Sbapt } 398234949Sbapt 399234949Sbapt add_lookback_edge(stateno, *rulep, i); 400234949Sbapt 401234949Sbapt length--; 402234949Sbapt done_flag = 0; 403234949Sbapt while (!done_flag) 404234949Sbapt { 405234949Sbapt done_flag = 1; 406234949Sbapt rp--; 407234949Sbapt if (ISVAR(*rp)) 408234949Sbapt { 409234949Sbapt stateno = states[--length]; 410234949Sbapt edge[nedges++] = map_goto(stateno, *rp); 411234949Sbapt if (nullable[*rp] && length > 0) 412234949Sbapt done_flag = 0; 413234949Sbapt } 414234949Sbapt } 415234949Sbapt } 416234949Sbapt 417234949Sbapt if (nedges) 418234949Sbapt { 419234949Sbapt includes[i] = shortp = NEW2(nedges + 1, Value_t); 420234949Sbapt for (j = 0; j < nedges; j++) 421234949Sbapt shortp[j] = edge[j]; 422234949Sbapt shortp[nedges] = -1; 423234949Sbapt } 424234949Sbapt } 425234949Sbapt 426234949Sbapt new_includes = transpose(includes, ngotos); 427234949Sbapt 428234949Sbapt for (i = 0; i < ngotos; i++) 429234949Sbapt if (includes[i]) 430234949Sbapt FREE(includes[i]); 431234949Sbapt 432234949Sbapt FREE(includes); 433234949Sbapt 434234949Sbapt includes = new_includes; 435234949Sbapt 436234949Sbapt FREE(edge); 437234949Sbapt FREE(states); 438234949Sbapt} 439234949Sbapt 440234949Sbaptstatic void 441234949Sbaptadd_lookback_edge(int stateno, int ruleno, int gotono) 442234949Sbapt{ 443234949Sbapt int i, k; 444234949Sbapt int found; 445234949Sbapt shorts *sp; 446234949Sbapt 447234949Sbapt i = lookaheads[stateno]; 448234949Sbapt k = lookaheads[stateno + 1]; 449234949Sbapt found = 0; 450234949Sbapt while (!found && i < k) 451234949Sbapt { 452234949Sbapt if (LAruleno[i] == ruleno) 453234949Sbapt found = 1; 454234949Sbapt else 455234949Sbapt ++i; 456234949Sbapt } 457234949Sbapt assert(found); 458234949Sbapt 459234949Sbapt sp = NEW(shorts); 460234949Sbapt sp->next = lookback[i]; 461234949Sbapt sp->value = (Value_t) gotono; 462234949Sbapt lookback[i] = sp; 463234949Sbapt} 464234949Sbapt 465234949Sbaptstatic Value_t ** 466234949Sbapttranspose(Value_t ** R2, int n) 467234949Sbapt{ 468234949Sbapt Value_t **new_R; 469234949Sbapt Value_t **temp_R; 470234949Sbapt Value_t *nedges; 471234949Sbapt Value_t *sp; 472234949Sbapt int i; 473234949Sbapt int k; 474234949Sbapt 475234949Sbapt nedges = NEW2(n, Value_t); 476234949Sbapt 477234949Sbapt for (i = 0; i < n; i++) 478234949Sbapt { 479234949Sbapt sp = R2[i]; 480234949Sbapt if (sp) 481234949Sbapt { 482234949Sbapt while (*sp >= 0) 483234949Sbapt nedges[*sp++]++; 484234949Sbapt } 485234949Sbapt } 486234949Sbapt 487234949Sbapt new_R = NEW2(n, Value_t *); 488234949Sbapt temp_R = NEW2(n, Value_t *); 489234949Sbapt 490234949Sbapt for (i = 0; i < n; i++) 491234949Sbapt { 492234949Sbapt k = nedges[i]; 493234949Sbapt if (k > 0) 494234949Sbapt { 495234949Sbapt sp = NEW2(k + 1, Value_t); 496234949Sbapt new_R[i] = sp; 497234949Sbapt temp_R[i] = sp; 498234949Sbapt sp[k] = -1; 499234949Sbapt } 500234949Sbapt } 501234949Sbapt 502234949Sbapt FREE(nedges); 503234949Sbapt 504234949Sbapt for (i = 0; i < n; i++) 505234949Sbapt { 506234949Sbapt sp = R2[i]; 507234949Sbapt if (sp) 508234949Sbapt { 509234949Sbapt while (*sp >= 0) 510234949Sbapt *temp_R[*sp++]++ = (Value_t) i; 511234949Sbapt } 512234949Sbapt } 513234949Sbapt 514234949Sbapt FREE(temp_R); 515234949Sbapt 516234949Sbapt return (new_R); 517234949Sbapt} 518234949Sbapt 519234949Sbaptstatic void 520234949Sbaptcompute_FOLLOWS(void) 521234949Sbapt{ 522234949Sbapt digraph(includes); 523234949Sbapt} 524234949Sbapt 525234949Sbaptstatic void 526234949Sbaptcompute_lookaheads(void) 527234949Sbapt{ 528234949Sbapt int i, n; 529234949Sbapt unsigned *fp1, *fp2, *fp3; 530234949Sbapt shorts *sp, *next; 531234949Sbapt unsigned *rowp; 532234949Sbapt 533234949Sbapt rowp = LA; 534234949Sbapt n = lookaheads[nstates]; 535234949Sbapt for (i = 0; i < n; i++) 536234949Sbapt { 537234949Sbapt fp3 = rowp + tokensetsize; 538234949Sbapt for (sp = lookback[i]; sp; sp = sp->next) 539234949Sbapt { 540234949Sbapt fp1 = rowp; 541234949Sbapt fp2 = F + tokensetsize * sp->value; 542234949Sbapt while (fp1 < fp3) 543234949Sbapt *fp1++ |= *fp2++; 544234949Sbapt } 545234949Sbapt rowp = fp3; 546234949Sbapt } 547234949Sbapt 548234949Sbapt for (i = 0; i < n; i++) 549234949Sbapt for (sp = lookback[i]; sp; sp = next) 550234949Sbapt { 551234949Sbapt next = sp->next; 552234949Sbapt FREE(sp); 553234949Sbapt } 554234949Sbapt 555234949Sbapt FREE(lookback); 556234949Sbapt FREE(F); 557234949Sbapt} 558234949Sbapt 559234949Sbaptstatic void 560234949Sbaptdigraph(Value_t ** relation) 561234949Sbapt{ 562234949Sbapt int i; 563234949Sbapt 564234949Sbapt infinity = (Value_t) (ngotos + 2); 565234949Sbapt INDEX = NEW2(ngotos + 1, Value_t); 566234949Sbapt VERTICES = NEW2(ngotos + 1, Value_t); 567234949Sbapt top = 0; 568234949Sbapt 569234949Sbapt R = relation; 570234949Sbapt 571234949Sbapt for (i = 0; i < ngotos; i++) 572234949Sbapt INDEX[i] = 0; 573234949Sbapt 574234949Sbapt for (i = 0; i < ngotos; i++) 575234949Sbapt { 576234949Sbapt if (INDEX[i] == 0 && R[i]) 577234949Sbapt traverse(i); 578234949Sbapt } 579234949Sbapt 580234949Sbapt FREE(INDEX); 581234949Sbapt FREE(VERTICES); 582234949Sbapt} 583234949Sbapt 584234949Sbaptstatic void 585234949Sbapttraverse(int i) 586234949Sbapt{ 587234949Sbapt unsigned *fp1; 588234949Sbapt unsigned *fp2; 589234949Sbapt unsigned *fp3; 590234949Sbapt int j; 591234949Sbapt Value_t *rp; 592234949Sbapt 593234949Sbapt Value_t height; 594234949Sbapt unsigned *base; 595234949Sbapt 596234949Sbapt VERTICES[++top] = (Value_t) i; 597234949Sbapt INDEX[i] = height = top; 598234949Sbapt 599234949Sbapt base = F + i * tokensetsize; 600234949Sbapt fp3 = base + tokensetsize; 601234949Sbapt 602234949Sbapt rp = R[i]; 603234949Sbapt if (rp) 604234949Sbapt { 605234949Sbapt while ((j = *rp++) >= 0) 606234949Sbapt { 607234949Sbapt if (INDEX[j] == 0) 608234949Sbapt traverse(j); 609234949Sbapt 610234949Sbapt if (INDEX[i] > INDEX[j]) 611234949Sbapt INDEX[i] = INDEX[j]; 612234949Sbapt 613234949Sbapt fp1 = base; 614234949Sbapt fp2 = F + j * tokensetsize; 615234949Sbapt 616234949Sbapt while (fp1 < fp3) 617234949Sbapt *fp1++ |= *fp2++; 618234949Sbapt } 619234949Sbapt } 620234949Sbapt 621234949Sbapt if (INDEX[i] == height) 622234949Sbapt { 623234949Sbapt for (;;) 624234949Sbapt { 625234949Sbapt j = VERTICES[top--]; 626234949Sbapt INDEX[j] = infinity; 627234949Sbapt 628234949Sbapt if (i == j) 629234949Sbapt break; 630234949Sbapt 631234949Sbapt fp1 = base; 632234949Sbapt fp2 = F + j * tokensetsize; 633234949Sbapt 634234949Sbapt while (fp1 < fp3) 635234949Sbapt *fp2++ = *fp1++; 636234949Sbapt } 637234949Sbapt } 638234949Sbapt} 639234949Sbapt 640234949Sbapt#ifdef NO_LEAKS 641234949Sbaptvoid 642234949Sbaptlalr_leaks(void) 643234949Sbapt{ 644234949Sbapt int i; 645234949Sbapt 646234949Sbapt if (includes != 0) 647234949Sbapt { 648234949Sbapt for (i = 0; i < ngotos; i++) 649234949Sbapt { 650234949Sbapt free(includes[i]); 651234949Sbapt } 652234949Sbapt DO_FREE(includes); 653234949Sbapt } 654234949Sbapt} 655234949Sbapt#endif 656