extern action
*parse_actions();
extern action
*get_shifts();
extern action
*add_reductions();
extern action
*add_reduce();
parser
= NEW2(nstates
, action
*);
for (i
= 0; i
< nstates
; i
++)
parser
[i
] = parse_actions(i
);
if (SRtotal
+ RRtotal
> 0) total_conflicts();
register action
*actions
;
actions
= get_shifts(stateno
);
actions
= add_reductions(stateno
, actions
);
register action
*actions
, *temp
;
register short *to_state
;
sp
= shift_table
[stateno
];
for (i
= sp
->nshifts
- 1; i
>= 0; i
--)
symbol
= accessing_symbol
[k
];
temp
->prec
= symbol_prec
[symbol
];
temp
->action_code
= SHIFT
;
temp
->assoc
= symbol_assoc
[symbol
];
add_reductions(stateno
, actions
)
register action
*actions
;
register int ruleno
, tokensetsize
;
tokensetsize
= WORDSIZE(ntokens
);
n
= lookaheads
[stateno
+ 1];
rowp
= LA
+ i
* tokensetsize
;
for (j
= ntokens
- 1; j
>= 0; j
--)
actions
= add_reduce(actions
, ruleno
, j
);
add_reduce(actions
, ruleno
, symbol
)
register action
*actions
;
register int ruleno
, symbol
;
register action
*temp
, *prev
, *next
;
for (next
= actions
; next
&& next
->symbol
< symbol
; next
= next
->next
)
while (next
&& next
->symbol
== symbol
&& next
->action_code
== SHIFT
)
while (next
&& next
->symbol
== symbol
&&
next
->action_code
== REDUCE
&& next
->number
< ruleno
)
temp
->prec
= rprec
[ruleno
];
temp
->action_code
= REDUCE
;
temp
->assoc
= rassoc
[ruleno
];
register short *to_state
;
for (i
= p
->nshifts
- 1; i
>= 0; --i
)
final_state
= to_state
[i
];
if (accessing_symbol
[final_state
] == goal
) break;
rules_used
= (short *) MALLOC(nrules
*sizeof(short));
if (rules_used
== 0) no_space();
for (i
= 0; i
< nrules
; ++i
)
for (i
= 0; i
< nstates
; ++i
)
for (p
= parser
[i
]; p
; p
= p
->next
)
if (p
->action_code
== REDUCE
&& p
->suppressed
== 0)
rules_used
[p
->number
] = 1;
for (i
= 3; i
< nrules
; ++i
)
if (!rules_used
[i
]) ++nunused
;
fprintf(stderr
, "%s: 1 rule never reduced\n", myname
);
fprintf(stderr
, "%s: %d rules never reduced\n", myname
, nunused
);
register action
*p
, *pref
;
SRconflicts
= NEW2(nstates
, short);
RRconflicts
= NEW2(nstates
, short);
for (i
= 0; i
< nstates
; i
++)
for (p
= parser
[i
]; p
; p
= p
->next
)
else if (i
== final_state
&& symbol
== 0)
else if (pref
->action_code
== SHIFT
)
if (pref
->prec
> 0 && p
->prec
> 0)
if (pref
->prec
< p
->prec
)
else if (pref
->prec
> p
->prec
)
else if (pref
->assoc
== LEFT
)
else if (pref
->assoc
== RIGHT
)
SRconflicts
[i
] = SRcount
;
RRconflicts
[i
] = RRcount
;
fprintf(stderr
, "%s: ", myname
);
fprintf(stderr
, "1 shift/reduce conflict");
fprintf(stderr
, "%d shift/reduce conflicts", SRtotal
);
fprintf(stderr
, "1 reduce/reduce conflict");
fprintf(stderr
, "%d reduce/reduce conflicts", RRtotal
);
register int count
, ruleno
;
for (p
= parser
[stateno
]; p
; p
= p
->next
)
if (p
->action_code
== SHIFT
&& p
->suppressed
== 0)
else if (p
->action_code
== REDUCE
&& p
->suppressed
== 0)
if (ruleno
> 0 && p
->number
!= ruleno
)
defred
= NEW2(nstates
, short);
for (i
= 0; i
< nstates
; i
++)
defred
[i
] = sole_reduction(i
);
for (i
= 0; i
< nstates
; i
++)
free_action_row(parser
[i
]);