105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Print an xml on generated parser, for Bison,
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This file is part of Bison, the GNU Compiler Compiler.
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "system.h"
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdarg.h>
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <bitset.h>
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "LR0.h"
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "closure.h"
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "conflicts.h"
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "files.h"
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "getargs.h"
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gram.h"
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "lalr.h"
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "print.h"
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "print-xml.h"
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "reader.h"
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "reduce.h"
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "state.h"
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "symtab.h"
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "tables.h"
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bitset no_reduce_set;
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct escape_buf
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char *ptr;
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t size;
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang};
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic struct escape_buf escape_bufs[3];
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------.
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report information on a state.  |
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------*/
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_core (FILE *out, int level, state *s)
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t i;
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  item_number *sitems = s->items;
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t snritems = s->nitems;
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Output all the items of a state, not only its kernel.  */
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  closure (sitems, snritems);
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  sitems = itemset;
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  snritems = nitemset;
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!snritems) {
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_puts (out, level, "<itemset/>");
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<itemset>");
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < snritems; i++)
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      bool printed = false;
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      item_number *sp;
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      item_number *sp1;
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      rule_number r;
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      sp1 = sp = ritem + sitems[i];
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      while (*sp >= 0)
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	sp++;
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      r = item_number_as_rule_number (*sp);
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      sp = rules[r].rhs;
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      /* Display the lookahead tokens?  */
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (item_number_is_rule_number (*sp1))
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	{
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  reductions *reds = s->reductions;
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  int red = state_reduction_find (s, &rules[r]);
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  /* Print item with lookaheads if there are. */
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  if (reds->lookahead_tokens && red != -1)
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    {
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      xml_printf (out, level + 1,
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang			  "<item rule-number=\"%d\" point=\"%d\">",
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang			  rules[r].number, sp1 - sp);
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      state_rule_lookahead_tokens_print_xml (s, &rules[r],
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang						     out, level + 2);
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      xml_puts (out, level + 1, "</item>");
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      printed = true;
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    }
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	}
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      if (!printed)
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	{
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  xml_printf (out, level + 1,
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      "<item rule-number=\"%d\" point=\"%d\"/>",
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      rules[r].number,
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		      sp1 - sp);
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	}
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</itemset>");
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-----------------------------------------------------------.
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report the shifts if DISPLAY_SHIFTS_P or the gotos of S on |
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang| OUT.                                                       |
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-----------------------------------------------------------*/
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_transitions (state *s, FILE *out, int level)
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  transitions *trans = s->transitions;
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int n = 0;
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int i;
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < trans->num; i++)
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (!TRANSITION_IS_DISABLED (trans, i))
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	n++;
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Nothing to report. */
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!n) {
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_puts (out, level, "<transitions/>");
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Report lookahead tokens and shifts.  */
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<transitions>");
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < trans->num; i++)
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (!TRANSITION_IS_DISABLED (trans, i)
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang	&& TRANSITION_IS_SHIFT (trans, i))
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	char const *tag = sym->tag;
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	state *s1 = trans->states[i];
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	xml_printf (out, level + 1,
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    "<transition type=\"shift\" symbol=\"%s\" state=\"%d\"/>",
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    xml_escape (tag), s1->number);
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < trans->num; i++)
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (!TRANSITION_IS_DISABLED (trans, i)
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	&& !TRANSITION_IS_SHIFT (trans, i))
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	char const *tag = sym->tag;
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	state *s1 = trans->states[i];
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang	xml_printf (out, level + 1,
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    "<transition type=\"goto\" symbol=\"%s\" state=\"%d\"/>",
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    xml_escape (tag), s1->number);
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</transitions>");
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------------------------------.
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report the explicit errors of S raised from %nonassoc.  |
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------------------------*/
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_errs (FILE *out, int level, state *s)
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  errs *errp = s->errs;
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bool count = false;
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int i;
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < errp->num; ++i)
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (errp->symbols[i])
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      count = true;
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Nothing to report. */
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!count) {
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_puts (out, level, "<errors/>");
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Report lookahead tokens and errors.  */
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<errors>");
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < errp->num; ++i)
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (errp->symbols[i])
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	char const *tag = errp->symbols[i]->tag;
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	xml_printf (out, level + 1,
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    "<error symbol=\"%s\">nonassociative</error>",
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    xml_escape (tag));
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</errors>");
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-------------------------------------------------------------------------.
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report a reduction of RULE on LOOKAHEAD_TOKEN (which can be `default').  |
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang| If not ENABLED, the rule is masked by a shift or a reduce (S/R and       |
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang| R/R conflicts).                                                          |
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-------------------------------------------------------------------------*/
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_reduction (FILE *out, int level, char const *lookahead_token,
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		 rule *r, bool enabled)
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (r->number)
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_printf (out, level,
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		"<reduction symbol=\"%s\" rule=\"%d\" enabled=\"%s\"/>",
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		xml_escape (lookahead_token),
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang		r->number,
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		enabled ? "true" : "false");
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_printf (out, level,
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		"<reduction symbol=\"%s\" rule=\"accept\" enabled=\"%s\"/>",
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		xml_escape (lookahead_token),
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		enabled ? "true" : "false");
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-------------------------------------------.
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report on OUT the reduction actions of S.  |
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-------------------------------------------*/
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_reductions (FILE *out, int level, state *s)
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  transitions *trans = s->transitions;
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  reductions *reds = s->reductions;
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  rule *default_reduction = NULL;
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int report = false;
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int i, j;
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (reds->num == 0)
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_puts (out, level, "<reductions/>");
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      return;
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (yydefact[s->number] != 0)
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    default_reduction = &rules[yydefact[s->number] - 1];
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bitset_zero (no_reduce_set);
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  FOR_EACH_SHIFT (trans, i)
25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i));
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < s->errs->num; ++i)
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (s->errs->symbols[i])
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      bitset_set (no_reduce_set, s->errs->symbols[i]->number);
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (default_reduction)
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    report = true;
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (reds->lookahead_tokens)
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (i = 0; i < ntokens; i++)
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	bool count = bitset_test (no_reduce_set, i);
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	for (j = 0; j < reds->num; ++j)
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  if (bitset_test (reds->lookahead_tokens[j], i))
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    {
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      if (! count)
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		{
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  if (reds->rules[j] != default_reduction)
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    report = true;
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  count = true;
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		}
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      else
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		{
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  report = true;
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		}
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    }
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Nothing to report. */
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (!report) {
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_puts (out, level, "<reductions/>");
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return;
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  }
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<reductions>");
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Report lookahead tokens (or $default) and reductions.  */
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (reds->lookahead_tokens)
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    for (i = 0; i < ntokens; i++)
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang	bool defaulted = false;
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang	bool count = bitset_test (no_reduce_set, i);
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang	for (j = 0; j < reds->num; ++j)
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	  if (bitset_test (reds->lookahead_tokens[j], i))
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    {
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      if (! count)
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		{
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  if (reds->rules[j] != default_reduction)
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    print_reduction (out, level + 1, symbols[i]->tag,
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang				     reds->rules[j], true);
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  else
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    defaulted = true;
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  count = true;
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang		}
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      else
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		{
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  if (defaulted)
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		    print_reduction (out, level + 1, symbols[i]->tag,
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang				     default_reduction, true);
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  defaulted = false;
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  print_reduction (out, level + 1, symbols[i]->tag,
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang				   reds->rules[j], false);
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang		}
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	    }
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (default_reduction)
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    print_reduction (out, level + 1,
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang		     "$default", default_reduction, true);
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</reductions>");
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*--------------------------------------------------------------.
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report on OUT all the actions (shifts, gotos, reductions, and |
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang| explicit erros from %nonassoc) of S.                          |
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang`--------------------------------------------------------------*/
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
34105436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_actions (FILE *out, int level, state *s)
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<actions>");
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_transitions (s, out, level + 1);
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_errs (out, level + 1, s);
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_reductions (out, level + 1, s);
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</actions>");
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*----------------------------------.
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report all the data on S on OUT.  |
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang`----------------------------------*/
35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_state (FILE *out, int level, state *s)
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_printf (out, level, "<state number=\"%d\">", s->number);
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_core (out, level + 1, s);
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_actions (out, level + 1, s);
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (s->solved_conflicts_xml)
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_puts (out, level + 1, "<solved-conflicts>");
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      fputs (s->solved_conflicts_xml, out);
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_puts (out, level + 1, "</solved-conflicts>");
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    xml_puts (out, level + 1, "<solved-conflicts/>");
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</state>");
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-----------------------------------------.
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Print information on the whole grammar.  |
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-----------------------------------------*/
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_grammar (FILE *out, int level)
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  symbol_number i;
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "<grammar>");
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  grammar_rules_print_xml (out, level);
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Terminals */
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "<terminals>");
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < max_user_token_number + 1; i++)
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if (token_translations[i] != undeftoken->number)
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang	char const *tag = symbols[token_translations[i]]->tag;
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int precedence = symbols[token_translations[i]]->prec;
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        assoc associativity = symbols[token_translations[i]]->assoc;
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        xml_indent (out, level + 2);
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fprintf (out,
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "<terminal symbol-number=\"%d\" token-number=\"%d\""
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 " name=\"%s\" usefulness=\"%s\"",
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 token_translations[i], i, xml_escape (tag),
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 reduce_token_unused_in_grammar (token_translations[i])
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   ? "unused-in-grammar" : "useful");
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (precedence)
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          fprintf (out, " prec=\"%d\"", precedence);
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if (associativity != undef_assoc)
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          fprintf (out, " assoc=\"%s\"", assoc_to_string (associativity) + 1);
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        fputs ("/>\n", out);
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "</terminals>");
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Nonterminals */
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "<nonterminals>");
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = ntokens; i < nsyms + nuseless_nonterminals; i++)
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      char const *tag = symbols[i]->tag;
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      xml_printf (out, level + 2,
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  "<nonterminal symbol-number=\"%d\" name=\"%s\""
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  " usefulness=\"%s\"/>",
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang		  i, xml_escape (tag),
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  reduce_nonterminal_useless_in_grammar (i)
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    ? "useless-in-grammar" : "useful");
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "</nonterminals>");
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level, "</grammar>");
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_indent (FILE *out, int level)
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int i;
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < level; i++)
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fputs ("  ", out);
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_puts (FILE *out, int level, char const *s)
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_indent (out, level);
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputs (s, out);
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_printf (FILE *out, int level, char const *fmt, ...)
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  va_list arglist;
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_indent (out, level);
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  va_start (arglist, fmt);
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  vfprintf (out, fmt, arglist);
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  va_end (arglist);
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
45605436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic char const *
45705436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_escape_string (struct escape_buf *buf, char const *str)
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t len = strlen (str);
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  size_t max_expansion = sizeof "&quot;" - 1;
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char *p;
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (buf->size <= max_expansion * len)
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      buf->size = max_expansion * len + 1;
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      buf->ptr = x2realloc (buf->ptr, &buf->size);
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  p = buf->ptr;
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (; *str; str++)
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    switch (*str)
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      {
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      default: *p++ = *str; break;
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case '&': p = stpcpy (p, "&amp;" ); break;
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case '<': p = stpcpy (p, "&lt;"  ); break;
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case '>': p = stpcpy (p, "&gt;"  ); break;
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      case '"': p = stpcpy (p, "&quot;"); break;
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      }
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  *p = '\0';
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return buf->ptr;
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar const *
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_escape_n (int n, char const *str)
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return xml_escape_string (escape_bufs + n, str);
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar const *
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wangxml_escape (char const *str)
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return xml_escape_n (0, str);
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wangprint_xml (void)
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  state_number i;
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int level = 0;
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  FILE *out = xfopen (spec_xml_file, "w");
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputs ("<?xml version=\"1.0\"?>\n\n", out);
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_printf (out, level,
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              "<bison-xml-report version=\"%s\" bug-report=\"%s\""
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              " url=\"%s\">",
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang              xml_escape_n (0, VERSION),
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang              xml_escape_n (1, PACKAGE_BUGREPORT),
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang              xml_escape_n (2, PACKAGE_URL));
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_printf (out, level + 1, "<filename>%s</filename>",
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang	      xml_escape (grammar_file));
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* print grammar */
51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  print_grammar (out, level + 1);
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  new_closure (nritems);
52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  no_reduce_set =  bitset_create (ntokens, BITSET_FIXED);
52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* print automaton */
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fputc ('\n', out);
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "<automaton>");
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  for (i = 0; i < nstates; i++)
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    print_state (out, level + 2, states[i]);
52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, level + 1, "</automaton>");
52805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  bitset_free (no_reduce_set);
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  free_closure ();
53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xml_puts (out, 0, "</bison-xml-report>");
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  free (escape_bufs[0].ptr);
53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  free (escape_bufs[1].ptr);
53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  xfclose (out);
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
539