version 1.11, 2014/01/08 21:40:25 |
version 1.12, 2014/03/13 00:56:39 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
/* $NetBSD: verbose.c,v 1.4 1996/03/19 03:21:50 jtc Exp $ */ |
/* $NetBSD: verbose.c,v 1.4 1996/03/19 03:21:50 jtc Exp $ */ |
|
|
/* |
/* |
* Copyright (c) 1989 The Regents of the University of California. |
* Copyright (c) 1989 The Regents of the University of California. |
|
|
void |
void |
verbose(void) |
verbose(void) |
{ |
{ |
int i; |
int i; |
|
|
if (!vflag) return; |
if (!vflag) |
|
return; |
|
|
null_rules = (short *) malloc(nrules*sizeof(short)); |
null_rules = malloc(nrules * sizeof(short)); |
if (null_rules == 0) no_space(); |
if (null_rules == NULL) |
fprintf(verbose_file, "\f\n"); |
no_space(); |
for (i = 0; i < nstates; i++) |
fprintf(verbose_file, "\f\n"); |
print_state(i); |
for (i = 0; i < nstates; i++) |
free(null_rules); |
print_state(i); |
|
free(null_rules); |
|
|
if (nunused) |
if (nunused) |
log_unused(); |
log_unused(); |
if (SRtotal || RRtotal) |
if (SRtotal || RRtotal) |
log_conflicts(); |
log_conflicts(); |
|
|
fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens, |
fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens, |
nvars); |
nvars); |
fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates); |
fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, |
|
nstates); |
} |
} |
|
|
|
|
void |
void |
log_unused(void) |
log_unused(void) |
{ |
{ |
int i; |
int i; |
short *p; |
short *p; |
|
|
fprintf(verbose_file, "\n\nRules never reduced:\n"); |
fprintf(verbose_file, "\n\nRules never reduced:\n"); |
for (i = 3; i < nrules; ++i) |
for (i = 3; i < nrules; ++i) { |
{ |
if (!rules_used[i]) { |
if (!rules_used[i]) |
fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]); |
{ |
for (p = ritem + rrhs[i]; *p >= 0; ++p) |
fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]); |
fprintf(verbose_file, " %s", symbol_name[*p]); |
for (p = ritem + rrhs[i]; *p >= 0; ++p) |
fprintf(verbose_file, " (%d)\n", i - 2); |
fprintf(verbose_file, " %s", symbol_name[*p]); |
} |
fprintf(verbose_file, " (%d)\n", i - 2); |
|
} |
} |
} |
|
} |
} |
|
|
|
|
void |
void |
log_conflicts(void) |
log_conflicts(void) |
{ |
{ |
int i; |
int i; |
|
|
fprintf(verbose_file, "\n\n"); |
fprintf(verbose_file, "\n\n"); |
for (i = 0; i < nstates; i++) |
for (i = 0; i < nstates; i++) { |
{ |
if (SRconflicts[i] || RRconflicts[i]) { |
if (SRconflicts[i] || RRconflicts[i]) |
fprintf(verbose_file, "State %d contains ", i); |
{ |
if (SRconflicts[i] == 1) |
fprintf(verbose_file, "State %d contains ", i); |
fprintf(verbose_file, "1 shift/reduce conflict"); |
if (SRconflicts[i] == 1) |
else if (SRconflicts[i] > 1) |
fprintf(verbose_file, "1 shift/reduce conflict"); |
fprintf(verbose_file, "%d shift/reduce conflicts", |
else if (SRconflicts[i] > 1) |
SRconflicts[i]); |
fprintf(verbose_file, "%d shift/reduce conflicts", |
if (SRconflicts[i] && RRconflicts[i]) |
SRconflicts[i]); |
fprintf(verbose_file, ", "); |
if (SRconflicts[i] && RRconflicts[i]) |
if (RRconflicts[i] == 1) |
fprintf(verbose_file, ", "); |
fprintf(verbose_file, "1 reduce/reduce conflict"); |
if (RRconflicts[i] == 1) |
else if (RRconflicts[i] > 1) |
fprintf(verbose_file, "1 reduce/reduce conflict"); |
fprintf(verbose_file, "%d reduce/reduce conflicts", |
else if (RRconflicts[i] > 1) |
RRconflicts[i]); |
fprintf(verbose_file, "%d reduce/reduce conflicts", |
fprintf(verbose_file, ".\n"); |
RRconflicts[i]); |
} |
fprintf(verbose_file, ".\n"); |
|
} |
} |
} |
|
} |
} |
|
|
|
|
void |
void |
print_state(int state) |
print_state(int state) |
{ |
{ |
if (state) |
if (state) |
fprintf(verbose_file, "\n\n"); |
fprintf(verbose_file, "\n\n"); |
if (SRconflicts[state] || RRconflicts[state]) |
if (SRconflicts[state] || RRconflicts[state]) |
print_conflicts(state); |
print_conflicts(state); |
fprintf(verbose_file, "state %d\n", state); |
fprintf(verbose_file, "state %d\n", state); |
print_core(state); |
print_core(state); |
print_nulls(state); |
print_nulls(state); |
print_actions(state); |
print_actions(state); |
} |
} |
|
|
|
|
void |
void |
print_conflicts(int state) |
print_conflicts(int state) |
{ |
{ |
int symbol, act = REDUCE, number = 0; |
int symbol, act = REDUCE, number = 0; |
action *p; |
action *p; |
|
|
symbol = -1; |
symbol = -1; |
for (p = parser[state]; p; p = p->next) |
for (p = parser[state]; p; p = p->next) { |
{ |
if (p->suppressed == 2) |
if (p->suppressed == 2) |
continue; |
continue; |
|
|
|
if (p->symbol != symbol) |
if (p->symbol != symbol) { |
{ |
symbol = p->symbol; |
symbol = p->symbol; |
number = p->number; |
number = p->number; |
if (p->action_code == SHIFT) |
if (p->action_code == SHIFT) |
act = SHIFT; |
act = SHIFT; |
else |
else |
act = REDUCE; |
act = REDUCE; |
} else if (p->suppressed == 1) { |
} |
if (state == final_state && symbol == 0) { |
else if (p->suppressed == 1) |
fprintf(verbose_file, |
{ |
"%d: shift/reduce conflict " |
if (state == final_state && symbol == 0) |
"(accept, reduce %d) on $end\n", |
{ |
state, p->number - 2); |
fprintf(verbose_file, "%d: shift/reduce conflict \ |
} else { |
(accept, reduce %d) on $end\n", state, p->number - 2); |
if (act == SHIFT) { |
} |
fprintf(verbose_file, |
else |
"%d: shift/reduce conflict " |
{ |
"(shift %d, reduce %d) on %s\n", |
if (act == SHIFT) |
state, number, p->number - 2, |
{ |
symbol_name[symbol]); |
fprintf(verbose_file, "%d: shift/reduce conflict \ |
} else { |
(shift %d, reduce %d) on %s\n", state, number, p->number - 2, |
fprintf(verbose_file, |
symbol_name[symbol]); |
"%d: reduce/reduce conflict " |
|
"(reduce %d, reduce %d) on %s\n", |
|
state, number - 2, p->number - 2, |
|
symbol_name[symbol]); |
|
} |
|
} |
} |
} |
else |
|
{ |
|
fprintf(verbose_file, "%d: reduce/reduce conflict \ |
|
(reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2, |
|
symbol_name[symbol]); |
|
} |
|
} |
|
} |
} |
} |
|
} |
} |
|
|
|
|
void |
void |
print_core(int state) |
print_core(int state) |
{ |
{ |
int i; |
int i; |
int k; |
int k; |
int rule; |
int rule; |
core *statep; |
core *statep; |
short *sp; |
short *sp; |
short *sp1; |
short *sp1; |
|
|
statep = state_table[state]; |
statep = state_table[state]; |
k = statep->nitems; |
k = statep->nitems; |
|
|
for (i = 0; i < k; i++) |
for (i = 0; i < k; i++) { |
{ |
sp1 = sp = ritem + statep->items[i]; |
sp1 = sp = ritem + statep->items[i]; |
|
|
|
while (*sp >= 0) ++sp; |
while (*sp >= 0) |
rule = -(*sp); |
++sp; |
fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]); |
rule = -(*sp); |
|
fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]); |
|
|
for (sp = ritem + rrhs[rule]; sp < sp1; sp++) |
for (sp = ritem + rrhs[rule]; sp < sp1; sp++) |
fprintf(verbose_file, "%s ", symbol_name[*sp]); |
fprintf(verbose_file, "%s ", symbol_name[*sp]); |
|
|
putc('.', verbose_file); |
putc('.', verbose_file); |
|
|
while (*sp >= 0) |
while (*sp >= 0) { |
{ |
fprintf(verbose_file, " %s", symbol_name[*sp]); |
fprintf(verbose_file, " %s", symbol_name[*sp]); |
sp++; |
sp++; |
} |
|
fprintf(verbose_file, " (%d)\n", -2 - *sp); |
} |
} |
fprintf(verbose_file, " (%d)\n", -2 - *sp); |
|
} |
|
} |
} |
|
|
|
|
void |
void |
print_nulls(int state) |
print_nulls(int state) |
{ |
{ |
action *p; |
action *p; |
int i, j, k, nnulls; |
int i, j, k, nnulls; |
|
|
nnulls = 0; |
nnulls = 0; |
for (p = parser[state]; p; p = p->next) |
for (p = parser[state]; p; p = p->next) { |
{ |
if (p->action_code == REDUCE && |
if (p->action_code == REDUCE && |
(p->suppressed == 0 || p->suppressed == 1)) { |
(p->suppressed == 0 || p->suppressed == 1)) |
i = p->number; |
{ |
if (rrhs[i] + 1 == rrhs[i + 1]) { |
i = p->number; |
for (j = 0; j < nnulls && i > null_rules[j]; ++j) |
if (rrhs[i] + 1 == rrhs[i+1]) |
continue; |
{ |
|
for (j = 0; j < nnulls && i > null_rules[j]; ++j) |
|
continue; |
|
|
|
if (j == nnulls) |
if (j == nnulls) { |
{ |
++nnulls; |
++nnulls; |
null_rules[j] = i; |
null_rules[j] = i; |
} else if (i != null_rules[j]) { |
|
++nnulls; |
|
for (k = nnulls - 1; k > j; --k) |
|
null_rules[k] = null_rules[k - 1]; |
|
null_rules[j] = i; |
|
} |
|
} |
} |
} |
else if (i != null_rules[j]) |
|
{ |
|
++nnulls; |
|
for (k = nnulls - 1; k > j; --k) |
|
null_rules[k] = null_rules[k-1]; |
|
null_rules[j] = i; |
|
} |
|
} |
|
} |
} |
} |
|
|
|
for (i = 0; i < nnulls; ++i) |
for (i = 0; i < nnulls; ++i) { |
{ |
j = null_rules[i]; |
j = null_rules[i]; |
fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]], |
fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]], |
j - 2); |
j - 2); |
} |
} |
fprintf(verbose_file, "\n"); |
fprintf(verbose_file, "\n"); |
|
} |
} |
|
|
|
|
void |
void |
print_actions(int stateno) |
print_actions(int stateno) |
{ |
{ |
action *p; |
action *p; |
shifts *sp; |
shifts *sp; |
int as; |
int as; |
|
|
if (stateno == final_state) |
if (stateno == final_state) |
fprintf(verbose_file, "\t$end accept\n"); |
fprintf(verbose_file, "\t$end accept\n"); |
|
|
p = parser[stateno]; |
p = parser[stateno]; |
if (p) |
if (p) { |
{ |
print_shifts(p); |
print_shifts(p); |
print_reductions(p, defred[stateno]); |
print_reductions(p, defred[stateno]); |
} |
} |
sp = shift_table[stateno]; |
|
if (sp && sp->nshifts > 0) { |
sp = shift_table[stateno]; |
as = accessing_symbol[sp->shift[sp->nshifts - 1]]; |
if (sp && sp->nshifts > 0) |
if (ISVAR(as)) |
{ |
print_gotos(stateno); |
as = accessing_symbol[sp->shift[sp->nshifts - 1]]; |
} |
if (ISVAR(as)) |
|
print_gotos(stateno); |
|
} |
|
} |
} |
|
|
|
|
void |
void |
print_shifts(action *p) |
print_shifts(action * p) |
{ |
{ |
int count; |
int count; |
action *q; |
action *q; |
|
|
count = 0; |
count = 0; |
for (q = p; q; q = q->next) |
for (q = p; q; q = q->next) { |
{ |
if (q->suppressed < 2 && q->action_code == SHIFT) |
if (q->suppressed < 2 && q->action_code == SHIFT) |
++count; |
++count; |
} |
} |
|
|
|
if (count > 0) |
if (count > 0) { |
{ |
for (; p; p = p->next) { |
for (; p; p = p->next) |
if (p->action_code == SHIFT && p->suppressed == 0) |
{ |
fprintf(verbose_file, "\t%s shift %d\n", |
if (p->action_code == SHIFT && p->suppressed == 0) |
symbol_name[p->symbol], p->number); |
fprintf(verbose_file, "\t%s shift %d\n", |
} |
symbol_name[p->symbol], p->number); |
|
} |
} |
} |
|
} |
} |
|
|
|
|
void |
void |
print_reductions(action *p, int defred) |
print_reductions(action * p, int defred) |
{ |
{ |
int k, anyreds; |
int k, anyreds; |
action *q; |
action *q; |
|
|
anyreds = 0; |
anyreds = 0; |
for (q = p; q ; q = q->next) |
for (q = p; q; q = q->next) { |
{ |
if (q->action_code == REDUCE && q->suppressed < 2) { |
if (q->action_code == REDUCE && q->suppressed < 2) |
anyreds = 1; |
{ |
break; |
anyreds = 1; |
} |
break; |
|
} |
} |
} |
|
|
|
if (anyreds == 0) |
if (anyreds == 0) |
fprintf(verbose_file, "\t. error\n"); |
fprintf(verbose_file, "\t. error\n"); |
else |
else { |
{ |
for (; p; p = p->next) { |
for (; p; p = p->next) |
if (p->action_code == REDUCE && p->number != defred) { |
{ |
k = p->number - 2; |
if (p->action_code == REDUCE && p->number != defred) |
if (p->suppressed == 0) |
{ |
fprintf(verbose_file, "\t%s reduce %d\n", |
k = p->number - 2; |
symbol_name[p->symbol], k); |
if (p->suppressed == 0) |
} |
fprintf(verbose_file, "\t%s reduce %d\n", |
} |
symbol_name[p->symbol], k); |
|
} |
|
} |
|
|
|
if (defred > 0) |
if (defred > 0) |
fprintf(verbose_file, "\t. reduce %d\n", defred - 2); |
fprintf(verbose_file, "\t. reduce %d\n", defred - 2); |
} |
} |
} |
} |
|
|
|
|
void |
void |
print_gotos(int stateno) |
print_gotos(int stateno) |
{ |
{ |
int i, k; |
int i, k; |
int as; |
int as; |
short *to_state; |
short *to_state; |
shifts *sp; |
shifts *sp; |
|
|
putc('\n', verbose_file); |
putc('\n', verbose_file); |
sp = shift_table[stateno]; |
sp = shift_table[stateno]; |
to_state = sp->shift; |
to_state = sp->shift; |
for (i = 0; i < sp->nshifts; ++i) |
for (i = 0; i < sp->nshifts; ++i) { |
{ |
k = to_state[i]; |
k = to_state[i]; |
as = accessing_symbol[k]; |
as = accessing_symbol[k]; |
if (ISVAR(as)) |
if (ISVAR(as)) |
fprintf(verbose_file, "\t%s goto %d\n", |
fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k); |
symbol_name[as], k); |
} |
} |
} |
} |