void muscle_pair_list_grow (const char *muscle, const char *a1, const char *a2) { char *pair; obstack_fgrow2 (&muscle_obstack, "[[[%s]], [[%s]]]", a1, a2); obstack_1grow (&muscle_obstack, 0); pair = obstack_finish (&muscle_obstack); muscle_grow (muscle, pair, ",\n"); obstack_free (&muscle_obstack, pair); }
static inline void log_resolution (rule *r, symbol_number token, enum conflict_resolution resolution) { if (report_flag & report_solved_conflicts) { /* The description of the resolution. */ switch (resolution) { case shift_resolution: case right_resolution: obstack_fgrow2 (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as shift"), r->number, symbols[token]->tag); break; case reduce_resolution: case left_resolution: obstack_fgrow2 (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as reduce"), r->number, symbols[token]->tag); break; case nonassoc_resolution: obstack_fgrow2 (&solved_conflicts_obstack, _(" Conflict between rule %d and token %s" " resolved as an error"), r->number, symbols[token]->tag); break; } /* The reason. */ switch (resolution) { case shift_resolution: obstack_fgrow2 (&solved_conflicts_obstack, " (%s < %s)", r->prec->tag, symbols[token]->tag); break; case reduce_resolution: obstack_fgrow2 (&solved_conflicts_obstack, " (%s < %s)", symbols[token]->tag, r->prec->tag); break; case left_resolution: obstack_fgrow1 (&solved_conflicts_obstack, " (%%left %s)", symbols[token]->tag); break; case right_resolution: obstack_fgrow1 (&solved_conflicts_obstack, " (%%right %s)", symbols[token]->tag); break; case nonassoc_resolution: obstack_fgrow1 (&solved_conflicts_obstack, " (%%nonassoc %s)", symbols[token]->tag); break; } obstack_sgrow (&solved_conflicts_obstack, ".\n"); } /* XML report */ if (xml_flag) { /* The description of the resolution. */ switch (resolution) { case shift_resolution: case right_resolution: obstack_fgrow2 (&solved_conflicts_xml_obstack, " <resolution rule=\"%d\" symbol=\"%s\"" " type=\"shift\">", r->number, xml_escape (symbols[token]->tag)); break; case reduce_resolution: case left_resolution: obstack_fgrow2 (&solved_conflicts_xml_obstack, " <resolution rule=\"%d\" symbol=\"%s\"" " type=\"reduce\">", r->number, xml_escape (symbols[token]->tag)); break; case nonassoc_resolution: obstack_fgrow2 (&solved_conflicts_xml_obstack, " <resolution rule=\"%d\" symbol=\"%s\"" " type=\"error\">", r->number, xml_escape (symbols[token]->tag)); break; } /* The reason. */ switch (resolution) { case shift_resolution: obstack_fgrow2 (&solved_conflicts_xml_obstack, "%s < %s", xml_escape_n (0, r->prec->tag), xml_escape_n (1, symbols[token]->tag)); break; case reduce_resolution: obstack_fgrow2 (&solved_conflicts_xml_obstack, "%s < %s", xml_escape_n (0, symbols[token]->tag), xml_escape_n (1, r->prec->tag)); break; case left_resolution: obstack_fgrow1 (&solved_conflicts_xml_obstack, "%%left %s", xml_escape (symbols[token]->tag)); break; case right_resolution: obstack_fgrow1 (&solved_conflicts_xml_obstack, "%%right %s", xml_escape (symbols[token]->tag)); break; case nonassoc_resolution: obstack_fgrow1 (&solved_conflicts_xml_obstack, "%%nonassoc %s", xml_escape (symbols[token]->tag)); break; } obstack_sgrow (&solved_conflicts_xml_obstack, "</resolution>\n"); } }