static void print_reductions (FILE *out, state *s) { transitions *trans = s->transitions; reductions *reds = s->reductions; rule *default_rule = NULL; size_t width = 0; int i, j; if (reds->num == 0) return; default_rule = state_default_rule (s); bitset_zero (shift_set); FOR_EACH_SHIFT (trans, i) bitset_set (shift_set, TRANSITION_SYMBOL (trans, i)); /* Compute the width of the look-ahead token column. */ if (default_rule) width = strlen (_("$default")); if (reds->look_ahead_tokens) for (i = 0; i < ntokens; i++) { bool count = bitset_test (shift_set, i); for (j = 0; j < reds->num; ++j) if (bitset_test (reds->look_ahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_rule) max_length (&width, symbols[i]->tag); count = true; } else { max_length (&width, symbols[i]->tag); } } } /* Nothing to report. */ if (!width) return; fputc ('\n', out); width += 2; /* Report look-ahead tokens (or $default) and reductions. */ if (reds->look_ahead_tokens) for (i = 0; i < ntokens; i++) { bool defaulted = false; bool count = bitset_test (shift_set, i); for (j = 0; j < reds->num; ++j) if (bitset_test (reds->look_ahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_rule) print_reduction (out, width, symbols[i]->tag, reds->rules[j], true); else defaulted = true; count = true; } else { if (defaulted) print_reduction (out, width, symbols[i]->tag, default_rule, true); defaulted = false; print_reduction (out, width, symbols[i]->tag, reds->rules[j], false); } } } if (default_rule) print_reduction (out, width, _("$default"), default_rule, true); }
static void print_reductions (FILE *out, int level, state *s) { transitions *trans = s->transitions; reductions *reds = s->reductions; rule *default_reduction = NULL; int report = false; int i, j; if (reds->num == 0) { xml_puts (out, level, "<reductions/>"); return; } if (yydefact[s->number] != 0) default_reduction = &rules[yydefact[s->number] - 1]; bitset_zero (no_reduce_set); FOR_EACH_SHIFT (trans, i) bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i)); for (i = 0; i < s->errs->num; ++i) if (s->errs->symbols[i]) bitset_set (no_reduce_set, s->errs->symbols[i]->number); if (default_reduction) report = true; if (reds->lookahead_tokens) for (i = 0; i < ntokens; i++) { bool count = bitset_test (no_reduce_set, i); for (j = 0; j < reds->num; ++j) if (bitset_test (reds->lookahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_reduction) report = true; count = true; } else { report = true; } } } /* Nothing to report. */ if (!report) { xml_puts (out, level, "<reductions/>"); return; } xml_puts (out, level, "<reductions>"); /* Report lookahead tokens (or $default) and reductions. */ if (reds->lookahead_tokens) for (i = 0; i < ntokens; i++) { bool defaulted = false; bool count = bitset_test (no_reduce_set, i); for (j = 0; j < reds->num; ++j) if (bitset_test (reds->lookahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_reduction) print_reduction (out, level + 1, symbols[i]->tag, reds->rules[j], true); else defaulted = true; count = true; } else { if (defaulted) print_reduction (out, level + 1, symbols[i]->tag, default_reduction, true); defaulted = false; print_reduction (out, level + 1, symbols[i]->tag, reds->rules[j], false); } } } if (default_reduction) print_reduction (out, level + 1, "$default", default_reduction, true); xml_puts (out, level, "</reductions>"); }
static void print_reductions (FILE *out, state *s) { transitions *trans = s->transitions; reductions *reds = s->reductions; rule *default_reduction = NULL; size_t width = 0; int i, j; bool default_reduction_only = true; if (reds->num == 0) return; if (yydefact[s->number] != 0) default_reduction = &rules[yydefact[s->number] - 1]; bitset_zero (no_reduce_set); FOR_EACH_SHIFT (trans, i) bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i)); for (i = 0; i < s->errs->num; ++i) if (s->errs->symbols[i]) bitset_set (no_reduce_set, s->errs->symbols[i]->number); /* Compute the width of the lookahead token column. */ if (default_reduction) width = strlen (_("$default")); if (reds->lookahead_tokens) for (i = 0; i < ntokens; i++) { bool count = bitset_test (no_reduce_set, i); for (j = 0; j < reds->num; ++j) if (bitset_test (reds->lookahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_reduction) max_length (&width, symbols[i]->tag); count = true; } else { max_length (&width, symbols[i]->tag); } } } /* Nothing to report. */ if (!width) return; fputc ('\n', out); width += 2; /* Report lookahead tokens (or $default) and reductions. */ if (reds->lookahead_tokens) for (i = 0; i < ntokens; i++) { bool defaulted = false; bool count = bitset_test (no_reduce_set, i); if (count) default_reduction_only = false; for (j = 0; j < reds->num; ++j) if (bitset_test (reds->lookahead_tokens[j], i)) { if (! count) { if (reds->rules[j] != default_reduction) { default_reduction_only = false; print_reduction (out, width, symbols[i]->tag, reds->rules[j], true); } else defaulted = true; count = true; } else { default_reduction_only = false; if (defaulted) print_reduction (out, width, symbols[i]->tag, default_reduction, true); defaulted = false; print_reduction (out, width, symbols[i]->tag, reds->rules[j], false); } } } if (default_reduction) { char *default_reductions = muscle_percent_define_get ("lr.default-reductions"); print_reduction (out, width, _("$default"), default_reduction, true); aver (0 == strcmp (default_reductions, "most") || (0 == strcmp (default_reductions, "consistent") && default_reduction_only) || (reds->num == 1 && reds->rules[0]->number == 0)); free (default_reductions); } }