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 """ - 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, "&" ); break; 47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '<': p = stpcpy (p, "<" ); break; 47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '>': p = stpcpy (p, ">" ); break; 47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang case '"': p = stpcpy (p, """); 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