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