xref: /freebsd/contrib/byacc/mkpar.c (revision 8e022d3cdea10ee1039a632f670c27fd93f65625)
1*8e022d3cSDag-Erling Smørgrav /* $Id: mkpar.c,v 1.18 2021/05/20 23:57:23 tom Exp $ */
298e903e7SBaptiste Daroussin 
398e903e7SBaptiste Daroussin #include "defs.h"
498e903e7SBaptiste Daroussin 
50c8de5b0SBaptiste Daroussin #define NotSuppressed(p)	((p)->suppressed == 0)
60c8de5b0SBaptiste Daroussin 
70c8de5b0SBaptiste Daroussin #if defined(YYBTYACC)
80c8de5b0SBaptiste Daroussin #define MaySuppress(p)		((backtrack ? ((p)->suppressed <= 1) : (p)->suppressed == 0))
90c8de5b0SBaptiste Daroussin     /* suppress the preferred action => enable backtracking */
100c8de5b0SBaptiste Daroussin #define StartBacktrack(p)	if (backtrack && (p) != NULL && NotSuppressed(p)) (p)->suppressed = 1
110c8de5b0SBaptiste Daroussin #else
120c8de5b0SBaptiste Daroussin #define MaySuppress(p)		((p)->suppressed == 0)
130c8de5b0SBaptiste Daroussin #define StartBacktrack(p)	/*nothing */
140c8de5b0SBaptiste Daroussin #endif
150c8de5b0SBaptiste Daroussin 
1698e903e7SBaptiste Daroussin static action *add_reduce(action *actions, int ruleno, int symbol);
1798e903e7SBaptiste Daroussin static action *add_reductions(int stateno, action *actions);
1898e903e7SBaptiste Daroussin static action *get_shifts(int stateno);
1998e903e7SBaptiste Daroussin static action *parse_actions(int stateno);
2098e903e7SBaptiste Daroussin static int sole_reduction(int stateno);
2198e903e7SBaptiste Daroussin static void defreds(void);
2298e903e7SBaptiste Daroussin static void find_final_state(void);
2398e903e7SBaptiste Daroussin static void free_action_row(action *p);
2498e903e7SBaptiste Daroussin static void remove_conflicts(void);
2598e903e7SBaptiste Daroussin static void total_conflicts(void);
2698e903e7SBaptiste Daroussin static void unused_rules(void);
2798e903e7SBaptiste Daroussin 
2898e903e7SBaptiste Daroussin action **parser;
2998e903e7SBaptiste Daroussin 
3098e903e7SBaptiste Daroussin int SRexpect;
3198e903e7SBaptiste Daroussin int RRexpect;
3298e903e7SBaptiste Daroussin 
3398e903e7SBaptiste Daroussin int SRtotal;
3498e903e7SBaptiste Daroussin int RRtotal;
3598e903e7SBaptiste Daroussin 
3698e903e7SBaptiste Daroussin Value_t *SRconflicts;
3798e903e7SBaptiste Daroussin Value_t *RRconflicts;
3898e903e7SBaptiste Daroussin Value_t *defred;
3998e903e7SBaptiste Daroussin Value_t *rules_used;
4098e903e7SBaptiste Daroussin Value_t nunused;
4198e903e7SBaptiste Daroussin Value_t final_state;
4298e903e7SBaptiste Daroussin 
4398e903e7SBaptiste Daroussin static Value_t SRcount;
4498e903e7SBaptiste Daroussin static Value_t RRcount;
4598e903e7SBaptiste Daroussin 
4698e903e7SBaptiste Daroussin void
make_parser(void)4798e903e7SBaptiste Daroussin make_parser(void)
4898e903e7SBaptiste Daroussin {
4998e903e7SBaptiste Daroussin     int i;
5098e903e7SBaptiste Daroussin 
5198e903e7SBaptiste Daroussin     parser = NEW2(nstates, action *);
5298e903e7SBaptiste Daroussin     for (i = 0; i < nstates; i++)
5398e903e7SBaptiste Daroussin 	parser[i] = parse_actions(i);
5498e903e7SBaptiste Daroussin 
5598e903e7SBaptiste Daroussin     find_final_state();
5698e903e7SBaptiste Daroussin     remove_conflicts();
5798e903e7SBaptiste Daroussin     unused_rules();
5898e903e7SBaptiste Daroussin     if (SRtotal + RRtotal > 0)
5998e903e7SBaptiste Daroussin 	total_conflicts();
6098e903e7SBaptiste Daroussin     defreds();
6198e903e7SBaptiste Daroussin }
6298e903e7SBaptiste Daroussin 
6398e903e7SBaptiste Daroussin static action *
parse_actions(int stateno)6498e903e7SBaptiste Daroussin parse_actions(int stateno)
6598e903e7SBaptiste Daroussin {
6698e903e7SBaptiste Daroussin     action *actions;
6798e903e7SBaptiste Daroussin 
6898e903e7SBaptiste Daroussin     actions = get_shifts(stateno);
6998e903e7SBaptiste Daroussin     actions = add_reductions(stateno, actions);
7098e903e7SBaptiste Daroussin     return (actions);
7198e903e7SBaptiste Daroussin }
7298e903e7SBaptiste Daroussin 
7398e903e7SBaptiste Daroussin static action *
get_shifts(int stateno)7498e903e7SBaptiste Daroussin get_shifts(int stateno)
7598e903e7SBaptiste Daroussin {
7698e903e7SBaptiste Daroussin     action *actions, *temp;
7798e903e7SBaptiste Daroussin     shifts *sp;
7898e903e7SBaptiste Daroussin     Value_t *to_state2;
7998e903e7SBaptiste Daroussin 
8098e903e7SBaptiste Daroussin     actions = 0;
8198e903e7SBaptiste Daroussin     sp = shift_table[stateno];
8298e903e7SBaptiste Daroussin     if (sp)
8398e903e7SBaptiste Daroussin     {
84*8e022d3cSDag-Erling Smørgrav 	Value_t i;
85*8e022d3cSDag-Erling Smørgrav 
8698e903e7SBaptiste Daroussin 	to_state2 = sp->shift;
8798e903e7SBaptiste Daroussin 	for (i = (Value_t)(sp->nshifts - 1); i >= 0; i--)
8898e903e7SBaptiste Daroussin 	{
89*8e022d3cSDag-Erling Smørgrav 	    Value_t k = to_state2[i];
90*8e022d3cSDag-Erling Smørgrav 	    Value_t symbol = accessing_symbol[k];
91*8e022d3cSDag-Erling Smørgrav 
9298e903e7SBaptiste Daroussin 	    if (ISTOKEN(symbol))
9398e903e7SBaptiste Daroussin 	    {
9498e903e7SBaptiste Daroussin 		temp = NEW(action);
9598e903e7SBaptiste Daroussin 		temp->next = actions;
9698e903e7SBaptiste Daroussin 		temp->symbol = symbol;
9798e903e7SBaptiste Daroussin 		temp->number = k;
9898e903e7SBaptiste Daroussin 		temp->prec = symbol_prec[symbol];
9998e903e7SBaptiste Daroussin 		temp->action_code = SHIFT;
10098e903e7SBaptiste Daroussin 		temp->assoc = symbol_assoc[symbol];
10198e903e7SBaptiste Daroussin 		actions = temp;
10298e903e7SBaptiste Daroussin 	    }
10398e903e7SBaptiste Daroussin 	}
10498e903e7SBaptiste Daroussin     }
10598e903e7SBaptiste Daroussin     return (actions);
10698e903e7SBaptiste Daroussin }
10798e903e7SBaptiste Daroussin 
10898e903e7SBaptiste Daroussin static action *
add_reductions(int stateno,action * actions)10998e903e7SBaptiste Daroussin add_reductions(int stateno, action *actions)
11098e903e7SBaptiste Daroussin {
11198e903e7SBaptiste Daroussin     int i, j, m, n;
112*8e022d3cSDag-Erling Smørgrav     int tokensetsize;
11398e903e7SBaptiste Daroussin 
11498e903e7SBaptiste Daroussin     tokensetsize = WORDSIZE(ntokens);
11598e903e7SBaptiste Daroussin     m = lookaheads[stateno];
11698e903e7SBaptiste Daroussin     n = lookaheads[stateno + 1];
11798e903e7SBaptiste Daroussin     for (i = m; i < n; i++)
11898e903e7SBaptiste Daroussin     {
119*8e022d3cSDag-Erling Smørgrav 	int ruleno = LAruleno[i];
120*8e022d3cSDag-Erling Smørgrav 	unsigned *rowp = LA + i * tokensetsize;
121*8e022d3cSDag-Erling Smørgrav 
12298e903e7SBaptiste Daroussin 	for (j = ntokens - 1; j >= 0; j--)
12398e903e7SBaptiste Daroussin 	{
12498e903e7SBaptiste Daroussin 	    if (BIT(rowp, j))
12598e903e7SBaptiste Daroussin 		actions = add_reduce(actions, ruleno, j);
12698e903e7SBaptiste Daroussin 	}
12798e903e7SBaptiste Daroussin     }
12898e903e7SBaptiste Daroussin     return (actions);
12998e903e7SBaptiste Daroussin }
13098e903e7SBaptiste Daroussin 
13198e903e7SBaptiste Daroussin static action *
add_reduce(action * actions,int ruleno,int symbol)13298e903e7SBaptiste Daroussin add_reduce(action *actions,
13398e903e7SBaptiste Daroussin 	   int ruleno,
13498e903e7SBaptiste Daroussin 	   int symbol)
13598e903e7SBaptiste Daroussin {
13698e903e7SBaptiste Daroussin     action *temp, *prev, *next;
13798e903e7SBaptiste Daroussin 
13898e903e7SBaptiste Daroussin     prev = 0;
13998e903e7SBaptiste Daroussin     for (next = actions; next && next->symbol < symbol; next = next->next)
14098e903e7SBaptiste Daroussin 	prev = next;
14198e903e7SBaptiste Daroussin 
14298e903e7SBaptiste Daroussin     while (next && next->symbol == symbol && next->action_code == SHIFT)
14398e903e7SBaptiste Daroussin     {
14498e903e7SBaptiste Daroussin 	prev = next;
14598e903e7SBaptiste Daroussin 	next = next->next;
14698e903e7SBaptiste Daroussin     }
14798e903e7SBaptiste Daroussin 
14898e903e7SBaptiste Daroussin     while (next && next->symbol == symbol &&
14998e903e7SBaptiste Daroussin 	   next->action_code == REDUCE && next->number < ruleno)
15098e903e7SBaptiste Daroussin     {
15198e903e7SBaptiste Daroussin 	prev = next;
15298e903e7SBaptiste Daroussin 	next = next->next;
15398e903e7SBaptiste Daroussin     }
15498e903e7SBaptiste Daroussin 
15598e903e7SBaptiste Daroussin     temp = NEW(action);
15698e903e7SBaptiste Daroussin     temp->next = next;
15798e903e7SBaptiste Daroussin     temp->symbol = (Value_t)symbol;
15898e903e7SBaptiste Daroussin     temp->number = (Value_t)ruleno;
15998e903e7SBaptiste Daroussin     temp->prec = rprec[ruleno];
16098e903e7SBaptiste Daroussin     temp->action_code = REDUCE;
16198e903e7SBaptiste Daroussin     temp->assoc = rassoc[ruleno];
16298e903e7SBaptiste Daroussin 
16398e903e7SBaptiste Daroussin     if (prev)
16498e903e7SBaptiste Daroussin 	prev->next = temp;
16598e903e7SBaptiste Daroussin     else
16698e903e7SBaptiste Daroussin 	actions = temp;
16798e903e7SBaptiste Daroussin 
16898e903e7SBaptiste Daroussin     return (actions);
16998e903e7SBaptiste Daroussin }
17098e903e7SBaptiste Daroussin 
17198e903e7SBaptiste Daroussin static void
find_final_state(void)17298e903e7SBaptiste Daroussin find_final_state(void)
17398e903e7SBaptiste Daroussin {
17498e903e7SBaptiste Daroussin     Value_t *to_state2;
17598e903e7SBaptiste Daroussin     shifts *p;
17698e903e7SBaptiste Daroussin 
177b53bb29fSJung-uk Kim     if ((p = shift_table[0]) != 0)
178b53bb29fSJung-uk Kim     {
179*8e022d3cSDag-Erling Smørgrav 	int i;
180*8e022d3cSDag-Erling Smørgrav 	int goal = ritem[1];
181*8e022d3cSDag-Erling Smørgrav 
18298e903e7SBaptiste Daroussin 	to_state2 = p->shift;
18398e903e7SBaptiste Daroussin 	for (i = p->nshifts - 1; i >= 0; --i)
18498e903e7SBaptiste Daroussin 	{
18598e903e7SBaptiste Daroussin 	    final_state = to_state2[i];
18698e903e7SBaptiste Daroussin 	    if (accessing_symbol[final_state] == goal)
18798e903e7SBaptiste Daroussin 		break;
18898e903e7SBaptiste Daroussin 	}
18998e903e7SBaptiste Daroussin     }
190b53bb29fSJung-uk Kim }
19198e903e7SBaptiste Daroussin 
19298e903e7SBaptiste Daroussin static void
unused_rules(void)19398e903e7SBaptiste Daroussin unused_rules(void)
19498e903e7SBaptiste Daroussin {
19598e903e7SBaptiste Daroussin     int i;
19698e903e7SBaptiste Daroussin     action *p;
19798e903e7SBaptiste Daroussin 
1983e066022SBaptiste Daroussin     rules_used = TMALLOC(Value_t, nrules);
19998e903e7SBaptiste Daroussin     NO_SPACE(rules_used);
20098e903e7SBaptiste Daroussin 
20198e903e7SBaptiste Daroussin     for (i = 0; i < nrules; ++i)
20298e903e7SBaptiste Daroussin 	rules_used[i] = 0;
20398e903e7SBaptiste Daroussin 
20498e903e7SBaptiste Daroussin     for (i = 0; i < nstates; ++i)
20598e903e7SBaptiste Daroussin     {
20698e903e7SBaptiste Daroussin 	for (p = parser[i]; p; p = p->next)
20798e903e7SBaptiste Daroussin 	{
2080c8de5b0SBaptiste Daroussin 	    if ((p->action_code == REDUCE) && MaySuppress(p))
20998e903e7SBaptiste Daroussin 		rules_used[p->number] = 1;
21098e903e7SBaptiste Daroussin 	}
21198e903e7SBaptiste Daroussin     }
21298e903e7SBaptiste Daroussin 
21398e903e7SBaptiste Daroussin     nunused = 0;
21498e903e7SBaptiste Daroussin     for (i = 3; i < nrules; ++i)
21598e903e7SBaptiste Daroussin 	if (!rules_used[i])
21698e903e7SBaptiste Daroussin 	    ++nunused;
21798e903e7SBaptiste Daroussin 
21898e903e7SBaptiste Daroussin     if (nunused)
21998e903e7SBaptiste Daroussin     {
22098e903e7SBaptiste Daroussin 	if (nunused == 1)
22198e903e7SBaptiste Daroussin 	    fprintf(stderr, "%s: 1 rule never reduced\n", myname);
22298e903e7SBaptiste Daroussin 	else
223*8e022d3cSDag-Erling Smørgrav 	    fprintf(stderr, "%s: %ld rules never reduced\n", myname, (long)nunused);
22498e903e7SBaptiste Daroussin     }
22598e903e7SBaptiste Daroussin }
22698e903e7SBaptiste Daroussin 
22798e903e7SBaptiste Daroussin static void
remove_conflicts(void)22898e903e7SBaptiste Daroussin remove_conflicts(void)
22998e903e7SBaptiste Daroussin {
23098e903e7SBaptiste Daroussin     int i;
23198e903e7SBaptiste Daroussin     action *p, *pref = 0;
23298e903e7SBaptiste Daroussin 
23398e903e7SBaptiste Daroussin     SRtotal = 0;
23498e903e7SBaptiste Daroussin     RRtotal = 0;
23598e903e7SBaptiste Daroussin     SRconflicts = NEW2(nstates, Value_t);
23698e903e7SBaptiste Daroussin     RRconflicts = NEW2(nstates, Value_t);
23798e903e7SBaptiste Daroussin     for (i = 0; i < nstates; i++)
23898e903e7SBaptiste Daroussin     {
239*8e022d3cSDag-Erling Smørgrav 	int symbol = -1;
240*8e022d3cSDag-Erling Smørgrav 
24198e903e7SBaptiste Daroussin 	SRcount = 0;
24298e903e7SBaptiste Daroussin 	RRcount = 0;
2430c8de5b0SBaptiste Daroussin #if defined(YYBTYACC)
2440c8de5b0SBaptiste Daroussin 	pref = NULL;
2450c8de5b0SBaptiste Daroussin #endif
24698e903e7SBaptiste Daroussin 	for (p = parser[i]; p; p = p->next)
24798e903e7SBaptiste Daroussin 	{
24898e903e7SBaptiste Daroussin 	    if (p->symbol != symbol)
24998e903e7SBaptiste Daroussin 	    {
2500c8de5b0SBaptiste Daroussin 		/* the first parse action for each symbol is the preferred action */
25198e903e7SBaptiste Daroussin 		pref = p;
25298e903e7SBaptiste Daroussin 		symbol = p->symbol;
25398e903e7SBaptiste Daroussin 	    }
2540c8de5b0SBaptiste Daroussin 	    /* following conditions handle multiple, i.e., conflicting, parse actions */
25598e903e7SBaptiste Daroussin 	    else if (i == final_state && symbol == 0)
25698e903e7SBaptiste Daroussin 	    {
25798e903e7SBaptiste Daroussin 		SRcount++;
25898e903e7SBaptiste Daroussin 		p->suppressed = 1;
2590c8de5b0SBaptiste Daroussin 		StartBacktrack(pref);
26098e903e7SBaptiste Daroussin 	    }
26198e903e7SBaptiste Daroussin 	    else if (pref != 0 && pref->action_code == SHIFT)
26298e903e7SBaptiste Daroussin 	    {
26398e903e7SBaptiste Daroussin 		if (pref->prec > 0 && p->prec > 0)
26498e903e7SBaptiste Daroussin 		{
26598e903e7SBaptiste Daroussin 		    if (pref->prec < p->prec)
26698e903e7SBaptiste Daroussin 		    {
26798e903e7SBaptiste Daroussin 			pref->suppressed = 2;
26898e903e7SBaptiste Daroussin 			pref = p;
26998e903e7SBaptiste Daroussin 		    }
27098e903e7SBaptiste Daroussin 		    else if (pref->prec > p->prec)
27198e903e7SBaptiste Daroussin 		    {
27298e903e7SBaptiste Daroussin 			p->suppressed = 2;
27398e903e7SBaptiste Daroussin 		    }
27498e903e7SBaptiste Daroussin 		    else if (pref->assoc == LEFT)
27598e903e7SBaptiste Daroussin 		    {
27698e903e7SBaptiste Daroussin 			pref->suppressed = 2;
27798e903e7SBaptiste Daroussin 			pref = p;
27898e903e7SBaptiste Daroussin 		    }
27998e903e7SBaptiste Daroussin 		    else if (pref->assoc == RIGHT)
28098e903e7SBaptiste Daroussin 		    {
28198e903e7SBaptiste Daroussin 			p->suppressed = 2;
28298e903e7SBaptiste Daroussin 		    }
28398e903e7SBaptiste Daroussin 		    else
28498e903e7SBaptiste Daroussin 		    {
28598e903e7SBaptiste Daroussin 			pref->suppressed = 2;
28698e903e7SBaptiste Daroussin 			p->suppressed = 2;
28798e903e7SBaptiste Daroussin 		    }
28898e903e7SBaptiste Daroussin 		}
28998e903e7SBaptiste Daroussin 		else
29098e903e7SBaptiste Daroussin 		{
29198e903e7SBaptiste Daroussin 		    SRcount++;
29298e903e7SBaptiste Daroussin 		    p->suppressed = 1;
2930c8de5b0SBaptiste Daroussin 		    StartBacktrack(pref);
29498e903e7SBaptiste Daroussin 		}
29598e903e7SBaptiste Daroussin 	    }
29698e903e7SBaptiste Daroussin 	    else
29798e903e7SBaptiste Daroussin 	    {
29898e903e7SBaptiste Daroussin 		RRcount++;
29998e903e7SBaptiste Daroussin 		p->suppressed = 1;
3000c8de5b0SBaptiste Daroussin 		StartBacktrack(pref);
30198e903e7SBaptiste Daroussin 	    }
30298e903e7SBaptiste Daroussin 	}
30398e903e7SBaptiste Daroussin 	SRtotal += SRcount;
30498e903e7SBaptiste Daroussin 	RRtotal += RRcount;
30598e903e7SBaptiste Daroussin 	SRconflicts[i] = SRcount;
30698e903e7SBaptiste Daroussin 	RRconflicts[i] = RRcount;
30798e903e7SBaptiste Daroussin     }
30898e903e7SBaptiste Daroussin }
30998e903e7SBaptiste Daroussin 
31098e903e7SBaptiste Daroussin static void
total_conflicts(void)31198e903e7SBaptiste Daroussin total_conflicts(void)
31298e903e7SBaptiste Daroussin {
31398e903e7SBaptiste Daroussin     fprintf(stderr, "%s: ", myname);
31498e903e7SBaptiste Daroussin     if (SRtotal == 1)
31598e903e7SBaptiste Daroussin 	fprintf(stderr, "1 shift/reduce conflict");
31698e903e7SBaptiste Daroussin     else if (SRtotal > 1)
31798e903e7SBaptiste Daroussin 	fprintf(stderr, "%d shift/reduce conflicts", SRtotal);
31898e903e7SBaptiste Daroussin 
31998e903e7SBaptiste Daroussin     if (SRtotal && RRtotal)
32098e903e7SBaptiste Daroussin 	fprintf(stderr, ", ");
32198e903e7SBaptiste Daroussin 
32298e903e7SBaptiste Daroussin     if (RRtotal == 1)
32398e903e7SBaptiste Daroussin 	fprintf(stderr, "1 reduce/reduce conflict");
32498e903e7SBaptiste Daroussin     else if (RRtotal > 1)
32598e903e7SBaptiste Daroussin 	fprintf(stderr, "%d reduce/reduce conflicts", RRtotal);
32698e903e7SBaptiste Daroussin 
32798e903e7SBaptiste Daroussin     fprintf(stderr, ".\n");
32898e903e7SBaptiste Daroussin 
32998e903e7SBaptiste Daroussin     if (SRexpect >= 0 && SRtotal != SRexpect)
33098e903e7SBaptiste Daroussin     {
33198e903e7SBaptiste Daroussin 	fprintf(stderr, "%s: ", myname);
33298e903e7SBaptiste Daroussin 	fprintf(stderr, "expected %d shift/reduce conflict%s.\n",
33398e903e7SBaptiste Daroussin 		SRexpect, PLURAL(SRexpect));
33498e903e7SBaptiste Daroussin 	exit_code = EXIT_FAILURE;
33598e903e7SBaptiste Daroussin     }
33698e903e7SBaptiste Daroussin     if (RRexpect >= 0 && RRtotal != RRexpect)
33798e903e7SBaptiste Daroussin     {
33898e903e7SBaptiste Daroussin 	fprintf(stderr, "%s: ", myname);
33998e903e7SBaptiste Daroussin 	fprintf(stderr, "expected %d reduce/reduce conflict%s.\n",
34098e903e7SBaptiste Daroussin 		RRexpect, PLURAL(RRexpect));
34198e903e7SBaptiste Daroussin 	exit_code = EXIT_FAILURE;
34298e903e7SBaptiste Daroussin     }
34398e903e7SBaptiste Daroussin }
34498e903e7SBaptiste Daroussin 
34598e903e7SBaptiste Daroussin static int
sole_reduction(int stateno)34698e903e7SBaptiste Daroussin sole_reduction(int stateno)
34798e903e7SBaptiste Daroussin {
34898e903e7SBaptiste Daroussin     int count, ruleno;
34998e903e7SBaptiste Daroussin     action *p;
35098e903e7SBaptiste Daroussin 
35198e903e7SBaptiste Daroussin     count = 0;
35298e903e7SBaptiste Daroussin     ruleno = 0;
35398e903e7SBaptiste Daroussin     for (p = parser[stateno]; p; p = p->next)
35498e903e7SBaptiste Daroussin     {
3550c8de5b0SBaptiste Daroussin 	if (p->action_code == SHIFT && MaySuppress(p))
35698e903e7SBaptiste Daroussin 	    return (0);
3570c8de5b0SBaptiste Daroussin 	else if ((p->action_code == REDUCE) && MaySuppress(p))
35898e903e7SBaptiste Daroussin 	{
35998e903e7SBaptiste Daroussin 	    if (ruleno > 0 && p->number != ruleno)
36098e903e7SBaptiste Daroussin 		return (0);
36198e903e7SBaptiste Daroussin 	    if (p->symbol != 1)
36298e903e7SBaptiste Daroussin 		++count;
36398e903e7SBaptiste Daroussin 	    ruleno = p->number;
36498e903e7SBaptiste Daroussin 	}
36598e903e7SBaptiste Daroussin     }
36698e903e7SBaptiste Daroussin 
36798e903e7SBaptiste Daroussin     if (count == 0)
36898e903e7SBaptiste Daroussin 	return (0);
36998e903e7SBaptiste Daroussin     return (ruleno);
37098e903e7SBaptiste Daroussin }
37198e903e7SBaptiste Daroussin 
37298e903e7SBaptiste Daroussin static void
defreds(void)37398e903e7SBaptiste Daroussin defreds(void)
37498e903e7SBaptiste Daroussin {
37598e903e7SBaptiste Daroussin     int i;
37698e903e7SBaptiste Daroussin 
37798e903e7SBaptiste Daroussin     defred = NEW2(nstates, Value_t);
37898e903e7SBaptiste Daroussin     for (i = 0; i < nstates; i++)
37998e903e7SBaptiste Daroussin 	defred[i] = (Value_t)sole_reduction(i);
38098e903e7SBaptiste Daroussin }
38198e903e7SBaptiste Daroussin 
38298e903e7SBaptiste Daroussin static void
free_action_row(action * p)38398e903e7SBaptiste Daroussin free_action_row(action *p)
38498e903e7SBaptiste Daroussin {
38598e903e7SBaptiste Daroussin     action *q;
38698e903e7SBaptiste Daroussin 
38798e903e7SBaptiste Daroussin     while (p)
38898e903e7SBaptiste Daroussin     {
38998e903e7SBaptiste Daroussin 	q = p->next;
39098e903e7SBaptiste Daroussin 	FREE(p);
39198e903e7SBaptiste Daroussin 	p = q;
39298e903e7SBaptiste Daroussin     }
39398e903e7SBaptiste Daroussin }
39498e903e7SBaptiste Daroussin 
39598e903e7SBaptiste Daroussin void
free_parser(void)39698e903e7SBaptiste Daroussin free_parser(void)
39798e903e7SBaptiste Daroussin {
39898e903e7SBaptiste Daroussin     int i;
39998e903e7SBaptiste Daroussin 
40098e903e7SBaptiste Daroussin     for (i = 0; i < nstates; i++)
40198e903e7SBaptiste Daroussin 	free_action_row(parser[i]);
40298e903e7SBaptiste Daroussin 
40398e903e7SBaptiste Daroussin     FREE(parser);
40498e903e7SBaptiste Daroussin }
40598e903e7SBaptiste Daroussin 
40698e903e7SBaptiste Daroussin #ifdef NO_LEAKS
40798e903e7SBaptiste Daroussin void
mkpar_leaks(void)40898e903e7SBaptiste Daroussin mkpar_leaks(void)
40998e903e7SBaptiste Daroussin {
41098e903e7SBaptiste Daroussin     DO_FREE(defred);
41198e903e7SBaptiste Daroussin     DO_FREE(rules_used);
41298e903e7SBaptiste Daroussin     DO_FREE(SRconflicts);
41398e903e7SBaptiste Daroussin     DO_FREE(RRconflicts);
41498e903e7SBaptiste Daroussin }
41598e903e7SBaptiste Daroussin #endif
416