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