1*8e022d3cSDag-Erling Smørgrav /* $Id: verbose.c,v 1.14 2021/05/20 23:57:23 tom Exp $ */
298e903e7SBaptiste Daroussin
398e903e7SBaptiste Daroussin #include "defs.h"
498e903e7SBaptiste Daroussin
598e903e7SBaptiste Daroussin static void log_conflicts(void);
698e903e7SBaptiste Daroussin static void log_unused(void);
798e903e7SBaptiste Daroussin static void print_actions(int stateno);
898e903e7SBaptiste Daroussin static void print_conflicts(int state);
998e903e7SBaptiste Daroussin static void print_core(int state);
1098e903e7SBaptiste Daroussin static void print_gotos(int stateno);
1198e903e7SBaptiste Daroussin static void print_nulls(int state);
1298e903e7SBaptiste Daroussin static void print_shifts(action *p);
1398e903e7SBaptiste Daroussin static void print_state(int state);
1498e903e7SBaptiste Daroussin static void print_reductions(action *p, int defred2);
1598e903e7SBaptiste Daroussin
160c8de5b0SBaptiste Daroussin static Value_t *null_rules;
1798e903e7SBaptiste Daroussin
1898e903e7SBaptiste Daroussin void
verbose(void)1998e903e7SBaptiste Daroussin verbose(void)
2098e903e7SBaptiste Daroussin {
2198e903e7SBaptiste Daroussin int i;
2298e903e7SBaptiste Daroussin
2398e903e7SBaptiste Daroussin if (!vflag)
2498e903e7SBaptiste Daroussin return;
2598e903e7SBaptiste Daroussin
260c8de5b0SBaptiste Daroussin null_rules = TMALLOC(Value_t, nrules);
2798e903e7SBaptiste Daroussin NO_SPACE(null_rules);
2898e903e7SBaptiste Daroussin
2998e903e7SBaptiste Daroussin fprintf(verbose_file, "\f\n");
3098e903e7SBaptiste Daroussin for (i = 0; i < nstates; i++)
3198e903e7SBaptiste Daroussin print_state(i);
3298e903e7SBaptiste Daroussin FREE(null_rules);
3398e903e7SBaptiste Daroussin
3498e903e7SBaptiste Daroussin if (nunused)
3598e903e7SBaptiste Daroussin log_unused();
3698e903e7SBaptiste Daroussin if (SRtotal || RRtotal)
3798e903e7SBaptiste Daroussin log_conflicts();
3898e903e7SBaptiste Daroussin
39*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "\n\n%ld terminals, %ld nonterminals\n",
40*8e022d3cSDag-Erling Smørgrav (long)ntokens, (long)nvars);
41*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "%ld grammar rules, %ld states\n",
42*8e022d3cSDag-Erling Smørgrav (long)(nrules - 2), (long)nstates);
430c8de5b0SBaptiste Daroussin #if defined(YYBTYACC)
440c8de5b0SBaptiste Daroussin { /* print out the grammar symbol # and parser internal symbol # for each
450c8de5b0SBaptiste Daroussin symbol as an aide to writing the implementation for YYDESTRUCT_CALL()
460c8de5b0SBaptiste Daroussin and YYSTYPE_TOSTRING() */
470c8de5b0SBaptiste Daroussin int maxtok = 0;
480c8de5b0SBaptiste Daroussin
490c8de5b0SBaptiste Daroussin fputs("\ngrammar parser grammar\n", verbose_file);
500c8de5b0SBaptiste Daroussin fputs("symbol# value# symbol\n", verbose_file);
510c8de5b0SBaptiste Daroussin for (i = 0; i < ntokens; ++i)
520c8de5b0SBaptiste Daroussin {
530c8de5b0SBaptiste Daroussin fprintf(verbose_file, " %5d %5d %s\n",
540c8de5b0SBaptiste Daroussin i, symbol_value[i], symbol_name[i]);
550c8de5b0SBaptiste Daroussin if (symbol_value[i] > maxtok)
560c8de5b0SBaptiste Daroussin maxtok = symbol_value[i];
570c8de5b0SBaptiste Daroussin }
580c8de5b0SBaptiste Daroussin for (i = ntokens; i < nsyms; ++i)
590c8de5b0SBaptiste Daroussin fprintf(verbose_file, " %5d %5d %s\n",
600c8de5b0SBaptiste Daroussin i, (maxtok + 1) + symbol_value[i] + 1, symbol_name[i]);
610c8de5b0SBaptiste Daroussin }
620c8de5b0SBaptiste Daroussin #endif
6398e903e7SBaptiste Daroussin }
6498e903e7SBaptiste Daroussin
6598e903e7SBaptiste Daroussin static void
log_unused(void)6698e903e7SBaptiste Daroussin log_unused(void)
6798e903e7SBaptiste Daroussin {
6898e903e7SBaptiste Daroussin int i;
690c8de5b0SBaptiste Daroussin Value_t *p;
7098e903e7SBaptiste Daroussin
7198e903e7SBaptiste Daroussin fprintf(verbose_file, "\n\nRules never reduced:\n");
7298e903e7SBaptiste Daroussin for (i = 3; i < nrules; ++i)
7398e903e7SBaptiste Daroussin {
7498e903e7SBaptiste Daroussin if (!rules_used[i])
7598e903e7SBaptiste Daroussin {
7698e903e7SBaptiste Daroussin fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
7798e903e7SBaptiste Daroussin for (p = ritem + rrhs[i]; *p >= 0; ++p)
7898e903e7SBaptiste Daroussin fprintf(verbose_file, " %s", symbol_name[*p]);
7998e903e7SBaptiste Daroussin fprintf(verbose_file, " (%d)\n", i - 2);
8098e903e7SBaptiste Daroussin }
8198e903e7SBaptiste Daroussin }
8298e903e7SBaptiste Daroussin }
8398e903e7SBaptiste Daroussin
8498e903e7SBaptiste Daroussin static void
log_conflicts(void)8598e903e7SBaptiste Daroussin log_conflicts(void)
8698e903e7SBaptiste Daroussin {
8798e903e7SBaptiste Daroussin int i;
8898e903e7SBaptiste Daroussin
8998e903e7SBaptiste Daroussin fprintf(verbose_file, "\n\n");
9098e903e7SBaptiste Daroussin for (i = 0; i < nstates; i++)
9198e903e7SBaptiste Daroussin {
9298e903e7SBaptiste Daroussin if (SRconflicts[i] || RRconflicts[i])
9398e903e7SBaptiste Daroussin {
9498e903e7SBaptiste Daroussin fprintf(verbose_file, "State %d contains ", i);
9598e903e7SBaptiste Daroussin if (SRconflicts[i] > 0)
96*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "%ld shift/reduce conflict%s",
97*8e022d3cSDag-Erling Smørgrav (long)SRconflicts[i],
9898e903e7SBaptiste Daroussin PLURAL(SRconflicts[i]));
9998e903e7SBaptiste Daroussin if (SRconflicts[i] && RRconflicts[i])
10098e903e7SBaptiste Daroussin fprintf(verbose_file, ", ");
10198e903e7SBaptiste Daroussin if (RRconflicts[i] > 0)
102*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "%ld reduce/reduce conflict%s",
103*8e022d3cSDag-Erling Smørgrav (long)RRconflicts[i],
10498e903e7SBaptiste Daroussin PLURAL(RRconflicts[i]));
10598e903e7SBaptiste Daroussin fprintf(verbose_file, ".\n");
10698e903e7SBaptiste Daroussin }
10798e903e7SBaptiste Daroussin }
10898e903e7SBaptiste Daroussin }
10998e903e7SBaptiste Daroussin
11098e903e7SBaptiste Daroussin static void
print_state(int state)11198e903e7SBaptiste Daroussin print_state(int state)
11298e903e7SBaptiste Daroussin {
11398e903e7SBaptiste Daroussin if (state)
11498e903e7SBaptiste Daroussin fprintf(verbose_file, "\n\n");
11598e903e7SBaptiste Daroussin if (SRconflicts[state] || RRconflicts[state])
11698e903e7SBaptiste Daroussin print_conflicts(state);
11798e903e7SBaptiste Daroussin fprintf(verbose_file, "state %d\n", state);
11898e903e7SBaptiste Daroussin print_core(state);
11998e903e7SBaptiste Daroussin print_nulls(state);
12098e903e7SBaptiste Daroussin print_actions(state);
12198e903e7SBaptiste Daroussin }
12298e903e7SBaptiste Daroussin
12398e903e7SBaptiste Daroussin static void
print_conflicts(int state)12498e903e7SBaptiste Daroussin print_conflicts(int state)
12598e903e7SBaptiste Daroussin {
12698e903e7SBaptiste Daroussin int symbol, act, number;
12798e903e7SBaptiste Daroussin action *p;
12898e903e7SBaptiste Daroussin
12998e903e7SBaptiste Daroussin act = 0; /* not shift/reduce... */
13098e903e7SBaptiste Daroussin number = -1;
13198e903e7SBaptiste Daroussin symbol = -1;
13298e903e7SBaptiste Daroussin for (p = parser[state]; p; p = p->next)
13398e903e7SBaptiste Daroussin {
13498e903e7SBaptiste Daroussin if (p->suppressed == 2)
13598e903e7SBaptiste Daroussin continue;
13698e903e7SBaptiste Daroussin
13798e903e7SBaptiste Daroussin if (p->symbol != symbol)
13898e903e7SBaptiste Daroussin {
13998e903e7SBaptiste Daroussin symbol = p->symbol;
14098e903e7SBaptiste Daroussin number = p->number;
14198e903e7SBaptiste Daroussin if (p->action_code == SHIFT)
14298e903e7SBaptiste Daroussin act = SHIFT;
14398e903e7SBaptiste Daroussin else
14498e903e7SBaptiste Daroussin act = REDUCE;
14598e903e7SBaptiste Daroussin }
14698e903e7SBaptiste Daroussin else if (p->suppressed == 1)
14798e903e7SBaptiste Daroussin {
14898e903e7SBaptiste Daroussin if (state == final_state && symbol == 0)
14998e903e7SBaptiste Daroussin {
15098e903e7SBaptiste Daroussin fprintf(verbose_file, "%d: shift/reduce conflict \
151*8e022d3cSDag-Erling Smørgrav (accept, reduce %ld) on $end\n", state, (long)(p->number - 2));
15298e903e7SBaptiste Daroussin }
15398e903e7SBaptiste Daroussin else
15498e903e7SBaptiste Daroussin {
15598e903e7SBaptiste Daroussin if (act == SHIFT)
15698e903e7SBaptiste Daroussin {
15798e903e7SBaptiste Daroussin fprintf(verbose_file, "%d: shift/reduce conflict \
158*8e022d3cSDag-Erling Smørgrav (shift %ld, reduce %ld) on %s\n", state, (long)number, (long)(p->number - 2),
15998e903e7SBaptiste Daroussin symbol_name[symbol]);
16098e903e7SBaptiste Daroussin }
16198e903e7SBaptiste Daroussin else
16298e903e7SBaptiste Daroussin {
16398e903e7SBaptiste Daroussin fprintf(verbose_file, "%d: reduce/reduce conflict \
164*8e022d3cSDag-Erling Smørgrav (reduce %ld, reduce %ld) on %s\n", state, (long)(number - 2), (long)(p->number - 2),
16598e903e7SBaptiste Daroussin symbol_name[symbol]);
16698e903e7SBaptiste Daroussin }
16798e903e7SBaptiste Daroussin }
16898e903e7SBaptiste Daroussin }
16998e903e7SBaptiste Daroussin }
17098e903e7SBaptiste Daroussin }
17198e903e7SBaptiste Daroussin
17298e903e7SBaptiste Daroussin static void
print_core(int state)17398e903e7SBaptiste Daroussin print_core(int state)
17498e903e7SBaptiste Daroussin {
17598e903e7SBaptiste Daroussin int i;
176*8e022d3cSDag-Erling Smørgrav core *statep = state_table[state];
177*8e022d3cSDag-Erling Smørgrav int k = statep->nitems;
17898e903e7SBaptiste Daroussin
17998e903e7SBaptiste Daroussin for (i = 0; i < k; i++)
18098e903e7SBaptiste Daroussin {
181*8e022d3cSDag-Erling Smørgrav int rule;
182*8e022d3cSDag-Erling Smørgrav Value_t *sp = ritem + statep->items[i];
183*8e022d3cSDag-Erling Smørgrav Value_t *sp1 = sp;
18498e903e7SBaptiste Daroussin
18598e903e7SBaptiste Daroussin while (*sp >= 0)
18698e903e7SBaptiste Daroussin ++sp;
18798e903e7SBaptiste Daroussin rule = -(*sp);
18898e903e7SBaptiste Daroussin fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
18998e903e7SBaptiste Daroussin
19098e903e7SBaptiste Daroussin for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
19198e903e7SBaptiste Daroussin fprintf(verbose_file, "%s ", symbol_name[*sp]);
19298e903e7SBaptiste Daroussin
19398e903e7SBaptiste Daroussin putc('.', verbose_file);
19498e903e7SBaptiste Daroussin
19598e903e7SBaptiste Daroussin while (*sp >= 0)
19698e903e7SBaptiste Daroussin {
19798e903e7SBaptiste Daroussin fprintf(verbose_file, " %s", symbol_name[*sp]);
19898e903e7SBaptiste Daroussin sp++;
19998e903e7SBaptiste Daroussin }
200*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, " (%ld)\n", (long)(-2 - *sp));
20198e903e7SBaptiste Daroussin }
20298e903e7SBaptiste Daroussin }
20398e903e7SBaptiste Daroussin
20498e903e7SBaptiste Daroussin static void
print_nulls(int state)20598e903e7SBaptiste Daroussin print_nulls(int state)
20698e903e7SBaptiste Daroussin {
20798e903e7SBaptiste Daroussin action *p;
20898e903e7SBaptiste Daroussin Value_t i, j, k, nnulls;
20998e903e7SBaptiste Daroussin
21098e903e7SBaptiste Daroussin nnulls = 0;
21198e903e7SBaptiste Daroussin for (p = parser[state]; p; p = p->next)
21298e903e7SBaptiste Daroussin {
21398e903e7SBaptiste Daroussin if (p->action_code == REDUCE &&
21498e903e7SBaptiste Daroussin (p->suppressed == 0 || p->suppressed == 1))
21598e903e7SBaptiste Daroussin {
21698e903e7SBaptiste Daroussin i = p->number;
21798e903e7SBaptiste Daroussin if (rrhs[i] + 1 == rrhs[i + 1])
21898e903e7SBaptiste Daroussin {
21998e903e7SBaptiste Daroussin for (j = 0; j < nnulls && i > null_rules[j]; ++j)
22098e903e7SBaptiste Daroussin continue;
22198e903e7SBaptiste Daroussin
22298e903e7SBaptiste Daroussin if (j == nnulls)
22398e903e7SBaptiste Daroussin {
22498e903e7SBaptiste Daroussin ++nnulls;
22598e903e7SBaptiste Daroussin null_rules[j] = i;
22698e903e7SBaptiste Daroussin }
22798e903e7SBaptiste Daroussin else if (i != null_rules[j])
22898e903e7SBaptiste Daroussin {
22998e903e7SBaptiste Daroussin ++nnulls;
23098e903e7SBaptiste Daroussin for (k = (Value_t)(nnulls - 1); k > j; --k)
23198e903e7SBaptiste Daroussin null_rules[k] = null_rules[k - 1];
23298e903e7SBaptiste Daroussin null_rules[j] = i;
23398e903e7SBaptiste Daroussin }
23498e903e7SBaptiste Daroussin }
23598e903e7SBaptiste Daroussin }
23698e903e7SBaptiste Daroussin }
23798e903e7SBaptiste Daroussin
23898e903e7SBaptiste Daroussin for (i = 0; i < nnulls; ++i)
23998e903e7SBaptiste Daroussin {
24098e903e7SBaptiste Daroussin j = null_rules[i];
241*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "\t%s : . (%ld)\n", symbol_name[rlhs[j]],
242*8e022d3cSDag-Erling Smørgrav (long)(j - 2));
24398e903e7SBaptiste Daroussin }
24498e903e7SBaptiste Daroussin fprintf(verbose_file, "\n");
24598e903e7SBaptiste Daroussin }
24698e903e7SBaptiste Daroussin
24798e903e7SBaptiste Daroussin static void
print_actions(int stateno)24898e903e7SBaptiste Daroussin print_actions(int stateno)
24998e903e7SBaptiste Daroussin {
25098e903e7SBaptiste Daroussin action *p;
25198e903e7SBaptiste Daroussin shifts *sp;
25298e903e7SBaptiste Daroussin
25398e903e7SBaptiste Daroussin if (stateno == final_state)
25498e903e7SBaptiste Daroussin fprintf(verbose_file, "\t$end accept\n");
25598e903e7SBaptiste Daroussin
25698e903e7SBaptiste Daroussin p = parser[stateno];
25798e903e7SBaptiste Daroussin if (p)
25898e903e7SBaptiste Daroussin {
25998e903e7SBaptiste Daroussin print_shifts(p);
26098e903e7SBaptiste Daroussin print_reductions(p, defred[stateno]);
26198e903e7SBaptiste Daroussin }
26298e903e7SBaptiste Daroussin
26398e903e7SBaptiste Daroussin sp = shift_table[stateno];
26498e903e7SBaptiste Daroussin if (sp && sp->nshifts > 0)
26598e903e7SBaptiste Daroussin {
266*8e022d3cSDag-Erling Smørgrav int as = accessing_symbol[sp->shift[sp->nshifts - 1]];
267*8e022d3cSDag-Erling Smørgrav
26898e903e7SBaptiste Daroussin if (ISVAR(as))
26998e903e7SBaptiste Daroussin print_gotos(stateno);
27098e903e7SBaptiste Daroussin }
27198e903e7SBaptiste Daroussin }
27298e903e7SBaptiste Daroussin
27398e903e7SBaptiste Daroussin static void
print_shifts(action * p)27498e903e7SBaptiste Daroussin print_shifts(action *p)
27598e903e7SBaptiste Daroussin {
27698e903e7SBaptiste Daroussin int count;
27798e903e7SBaptiste Daroussin action *q;
27898e903e7SBaptiste Daroussin
27998e903e7SBaptiste Daroussin count = 0;
28098e903e7SBaptiste Daroussin for (q = p; q; q = q->next)
28198e903e7SBaptiste Daroussin {
28298e903e7SBaptiste Daroussin if (q->suppressed < 2 && q->action_code == SHIFT)
28398e903e7SBaptiste Daroussin ++count;
28498e903e7SBaptiste Daroussin }
28598e903e7SBaptiste Daroussin
28698e903e7SBaptiste Daroussin if (count > 0)
28798e903e7SBaptiste Daroussin {
28898e903e7SBaptiste Daroussin for (; p; p = p->next)
28998e903e7SBaptiste Daroussin {
29098e903e7SBaptiste Daroussin if (p->action_code == SHIFT && p->suppressed == 0)
291*8e022d3cSDag-Erling Smørgrav fprintf(verbose_file, "\t%s shift %ld\n",
292*8e022d3cSDag-Erling Smørgrav symbol_name[p->symbol], (long)p->number);
2930c8de5b0SBaptiste Daroussin #if defined(YYBTYACC)
2940c8de5b0SBaptiste Daroussin if (backtrack && p->action_code == SHIFT && p->suppressed == 1)
2950c8de5b0SBaptiste Daroussin fprintf(verbose_file, "\t%s [trial] shift %d\n",
2960c8de5b0SBaptiste Daroussin symbol_name[p->symbol], p->number);
2970c8de5b0SBaptiste Daroussin #endif
29898e903e7SBaptiste Daroussin }
29998e903e7SBaptiste Daroussin }
30098e903e7SBaptiste Daroussin }
30198e903e7SBaptiste Daroussin
30298e903e7SBaptiste Daroussin static void
print_reductions(action * p,int defred2)30398e903e7SBaptiste Daroussin print_reductions(action *p, int defred2)
30498e903e7SBaptiste Daroussin {
305*8e022d3cSDag-Erling Smørgrav int anyreds;
30698e903e7SBaptiste Daroussin action *q;
30798e903e7SBaptiste Daroussin
30898e903e7SBaptiste Daroussin anyreds = 0;
30998e903e7SBaptiste Daroussin for (q = p; q; q = q->next)
31098e903e7SBaptiste Daroussin {
31198e903e7SBaptiste Daroussin if (q->action_code == REDUCE && q->suppressed < 2)
31298e903e7SBaptiste Daroussin {
31398e903e7SBaptiste Daroussin anyreds = 1;
31498e903e7SBaptiste Daroussin break;
31598e903e7SBaptiste Daroussin }
31698e903e7SBaptiste Daroussin }
31798e903e7SBaptiste Daroussin
31898e903e7SBaptiste Daroussin if (anyreds == 0)
31998e903e7SBaptiste Daroussin fprintf(verbose_file, "\t. error\n");
32098e903e7SBaptiste Daroussin else
32198e903e7SBaptiste Daroussin {
32298e903e7SBaptiste Daroussin for (; p; p = p->next)
32398e903e7SBaptiste Daroussin {
32498e903e7SBaptiste Daroussin if (p->action_code == REDUCE && p->number != defred2)
32598e903e7SBaptiste Daroussin {
326*8e022d3cSDag-Erling Smørgrav int k = p->number - 2;
327*8e022d3cSDag-Erling Smørgrav
32898e903e7SBaptiste Daroussin if (p->suppressed == 0)
32998e903e7SBaptiste Daroussin fprintf(verbose_file, "\t%s reduce %d\n",
33098e903e7SBaptiste Daroussin symbol_name[p->symbol], k);
3310c8de5b0SBaptiste Daroussin #if defined(YYBTYACC)
3320c8de5b0SBaptiste Daroussin if (backtrack && p->suppressed == 1)
3330c8de5b0SBaptiste Daroussin fprintf(verbose_file, "\t%s [trial] reduce %d\n",
3340c8de5b0SBaptiste Daroussin symbol_name[p->symbol], k);
3350c8de5b0SBaptiste Daroussin #endif
33698e903e7SBaptiste Daroussin }
33798e903e7SBaptiste Daroussin }
33898e903e7SBaptiste Daroussin
33998e903e7SBaptiste Daroussin if (defred2 > 0)
34098e903e7SBaptiste Daroussin fprintf(verbose_file, "\t. reduce %d\n", defred2 - 2);
34198e903e7SBaptiste Daroussin }
34298e903e7SBaptiste Daroussin }
34398e903e7SBaptiste Daroussin
34498e903e7SBaptiste Daroussin static void
print_gotos(int stateno)34598e903e7SBaptiste Daroussin print_gotos(int stateno)
34698e903e7SBaptiste Daroussin {
347*8e022d3cSDag-Erling Smørgrav int i;
3480c8de5b0SBaptiste Daroussin Value_t *to_state2;
34998e903e7SBaptiste Daroussin shifts *sp;
35098e903e7SBaptiste Daroussin
35198e903e7SBaptiste Daroussin putc('\n', verbose_file);
35298e903e7SBaptiste Daroussin sp = shift_table[stateno];
35398e903e7SBaptiste Daroussin to_state2 = sp->shift;
35498e903e7SBaptiste Daroussin for (i = 0; i < sp->nshifts; ++i)
35598e903e7SBaptiste Daroussin {
356*8e022d3cSDag-Erling Smørgrav int k = to_state2[i];
357*8e022d3cSDag-Erling Smørgrav int as = accessing_symbol[k];
358*8e022d3cSDag-Erling Smørgrav
35998e903e7SBaptiste Daroussin if (ISVAR(as))
36098e903e7SBaptiste Daroussin fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k);
36198e903e7SBaptiste Daroussin }
36298e903e7SBaptiste Daroussin }
363