1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print information on generated parser, for bison, 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1984, 1986, 1989, 2000-2005, 2007, 2009-2012 Free 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang Software Foundation, Inc. 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This file is part of Bison, the GNU Compiler Compiler. 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation, either version 3 of the License, or 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang (at your option) any later version. 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is distributed in the hope that it will be useful, 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h> 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h" 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitset.h> 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "LR0.h" 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "closure.h" 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "conflicts.h" 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h" 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h" 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "lalr.h" 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "muscle-tab.h" 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "print.h" 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reduce.h" 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "state.h" 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h" 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "tables.h" 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic bitset no_reduce_set; 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if 0 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_token (int extnum, int token) 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, _(" type %d is %s\n"), extnum, tags[token]); 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------. 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| *WIDTH := max (*WIDTH, strlen (STR)). | 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------*/ 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmax_length (size_t *width, const char *str) 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t len = strlen (str); 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (len > *width) 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *width = len; 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------. 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report information on a state. | 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------*/ 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_core (FILE *out, state *s) 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t i; 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *sitems = s->items; 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t snritems = s->nitems; 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *previous_lhs = NULL; 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Output all the items of a state, not only its kernel. */ 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (report_flag & report_itemsets) 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project closure (sitems, snritems); 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sitems = itemset; 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang snritems = nitemset; 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!snritems) 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < snritems; i++) 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *sp; 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *sp1; 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sp1 = sp = ritem + sitems[i]; 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (*sp >= 0) 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sp++; 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r = item_number_as_rule_number (*sp); 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_lhs_print (&rules[r], previous_lhs, out); 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project previous_lhs = rules[r].lhs; 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (sp = rules[r].rhs; sp < sp1; sp++) 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", symbols[*sp]->tag); 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs (" .", out); 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (/* Nothing */; *sp >= 0; ++sp) 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", symbols[*sp]->tag); 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Display the lookahead tokens? */ 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (report_flag & report_lookahead_tokens 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang && item_number_is_rule_number (*sp1)) 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang state_rule_lookahead_tokens_print (s, &rules[r], out); 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------. 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of S on | 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| OUT. | 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------*/ 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_transitions (state *s, FILE *out, bool display_transitions_p) 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project transitions *trans = s->transitions; 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t width = 0; 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Compute the width of the lookahead token column. */ 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < trans->num; i++) 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!TRANSITION_IS_DISABLED (trans, i) 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p) 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)]; 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max_length (&width, sym->tag); 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Nothing to report. */ 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!width) 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width += 2; 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Report lookahead tokens and shifts. */ 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < trans->num; i++) 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!TRANSITION_IS_DISABLED (trans, i) 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p) 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)]; 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const char *tag = sym->tag; 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project state *s1 = trans->states[i]; 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j; 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", tag); 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = width - strlen (tag); j > 0; --j) 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (' ', out); 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (display_transitions_p) 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, _("shift, and go to state %d\n"), s1->number); 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, _("go to state %d\n"), s1->number); 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------------------. 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report the explicit errors of S raised from %nonassoc. | 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------*/ 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_errs (FILE *out, state *s) 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project errs *errp = s->errs; 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t width = 0; 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i; 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Compute the width of the lookahead token column. */ 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < errp->num; ++i) 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (errp->symbols[i]) 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max_length (&width, errp->symbols[i]->tag); 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Nothing to report. */ 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!width) 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width += 2; 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Report lookahead tokens and errors. */ 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < errp->num; ++i) 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (errp->symbols[i]) 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const char *tag = errp->symbols[i]->tag; 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j; 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", tag); 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = width - strlen (tag); j > 0; --j) 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (' ', out); 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs (_("error (nonassociative)\n"), out); 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*-------------------------------------------------------------------------. 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Report a reduction of RULE on LOOKAHEAD_TOKEN (which can be `default'). | 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang| If not ENABLED, the rule is masked by a shift or a reduce (S/R and | 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang| R/R conflicts). | 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang`-------------------------------------------------------------------------*/ 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_reduction (FILE *out, size_t width, 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *lookahead_token, 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule *r, bool enabled) 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int j; 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, " %s", lookahead_token); 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (j = width - strlen (lookahead_token); j > 0; --j) 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (' ', out); 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!enabled) 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('[', out); 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (r->number) 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, _("reduce using rule %d (%s)"), r->number, r->lhs->tag); 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, _("accept")); 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!enabled) 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (']', out); 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------. 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report on OUT the reduction actions of S. | 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------*/ 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_reductions (FILE *out, state *s) 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project transitions *trans = s->transitions; 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reductions *reds = s->reductions; 24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule *default_reduction = NULL; 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t width = 0; 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int i, j; 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool default_reduction_only = true; 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (reds->num == 0) 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (yydefact[s->number] != 0) 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang default_reduction = &rules[yydefact[s->number] - 1]; 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_zero (no_reduce_set); 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FOR_EACH_SHIFT (trans, i) 25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i)); 25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (i = 0; i < s->errs->num; ++i) 25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (s->errs->symbols[i]) 26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_set (no_reduce_set, s->errs->symbols[i]->number); 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Compute the width of the lookahead token column. */ 26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (default_reduction) 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width = strlen (_("$default")); 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reds->lookahead_tokens) 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; i++) 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool count = bitset_test (no_reduce_set, i); 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = 0; j < reds->num; ++j) 27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (reds->lookahead_tokens[j], i)) 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! count) 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reds->rules[j] != default_reduction) 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max_length (&width, symbols[i]->tag); 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project count = true; 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max_length (&width, symbols[i]->tag); 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Nothing to report. */ 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!width) 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width += 2; 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Report lookahead tokens (or $default) and reductions. */ 29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reds->lookahead_tokens) 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < ntokens; i++) 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool defaulted = false; 29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool count = bitset_test (no_reduce_set, i); 30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (count) 30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang default_reduction_only = false; 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (j = 0; j < reds->num; ++j) 30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bitset_test (reds->lookahead_tokens[j], i)) 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! count) 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (reds->rules[j] != default_reduction) 30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang default_reduction_only = false; 31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang print_reduction (out, width, 31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang symbols[i]->tag, 31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang reds->rules[j], true); 31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project defaulted = true; 317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project count = true; 318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang default_reduction_only = false; 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (defaulted) 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_reduction (out, width, 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols[i]->tag, 32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang default_reduction, true); 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project defaulted = false; 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_reduction (out, width, 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols[i]->tag, 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reds->rules[j], false); 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (default_reduction) 33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *default_reductions = 33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang muscle_percent_define_get ("lr.default-reductions"); 33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang print_reduction (out, width, _("$default"), default_reduction, true); 33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang aver (0 == strcmp (default_reductions, "most") 34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang || (0 == strcmp (default_reductions, "consistent") 34105436638acc7c010349a69c3395f1a57c642dc62Ying Wang && default_reduction_only) 34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang || (reds->num == 1 && reds->rules[0]->number == 0)); 34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (default_reductions); 34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------------------------. 349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report on OUT all the actions (shifts, gotos, reductions, and | 350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| explicit erros from %nonassoc) of S. | 351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------------*/ 352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_actions (FILE *out, state *s) 355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Print shifts. */ 357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_transitions (s, out, true); 358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_errs (out, s); 359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_reductions (out, s); 360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Print gotos. */ 361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_transitions (s, out, false); 362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------. 366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report all the data on S on OUT. | 367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------*/ 368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_state (FILE *out, state *s) 371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("\n\n", out); 37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, _("State %d"), s->number); 374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_core (out, s); 376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_actions (out, s); 377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if ((report_flag & report_solved_conflicts) && s->solved_conflicts) 378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs (s->solved_conflicts, out); 381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------. 385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Print information on the whole grammar. | 386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------*/ 387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define END_TEST(End) \ 389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdo { \ 390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (column + strlen(buffer) > (End)) \ 391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { \ 392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n ", buffer); \ 393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = 3; \ 394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project buffer[0] = 0; \ 395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } \ 396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} while (0) 397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_grammar (FILE *out) 401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number i; 403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char buffer[90]; 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int column = 0; 405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project grammar_rules_print (out); 407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* TERMINAL (type #) : rule #s terminal is on RHS */ 409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); 410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < max_user_token_number + 1; i++) 411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (token_translations[i] != undeftoken->number) 412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const char *tag = symbols[token_translations[i]]->tag; 414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp; 416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project buffer[0] = 0; 418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = strlen (tag); 419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs (tag, out); 42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang END_TEST (65); 421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer, " (%d)", i); 422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; r++) 424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) 425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (item_number_as_symbol_number (*rhsp) == token_translations[i]) 426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project END_TEST (65); 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer + strlen (buffer), " %d", r); 429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n", buffer); 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("\n\n", out); 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear")); 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; i++) 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int left_count = 0, right_count = 0; 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const char *tag = symbols[i]->tag; 442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; r++) 444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp; 446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (rules[r].lhs->number == i) 447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project left_count++; 448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) 449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (item_number_as_symbol_number (*rhsp) == i) 450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project right_count++; 452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project buffer[0] = 0; 457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs (tag, out); 458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = strlen (tag); 459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer, " (%d)", i); 460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project END_TEST (0); 461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (left_count > 0) 463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang END_TEST (65); 465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer + strlen (buffer), _(" on left:")); 466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; r++) 468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (rules[r].lhs->number == i) 47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang END_TEST (65); 47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang sprintf (buffer + strlen (buffer), " %d", r); 47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (right_count > 0) 478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (left_count > 0) 480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer + strlen (buffer), ","); 48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang END_TEST (65); 482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer + strlen (buffer), _(" on right:")); 483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; r++) 484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp; 486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) 487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (item_number_as_symbol_number (*rhsp) == i) 488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project END_TEST (65); 490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project sprintf (buffer + strlen (buffer), " %d", r); 491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n", buffer); 496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_results (void) 501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project state_number i; 503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We used to use just .out if SPEC_NAME_PREFIX (-p) was used, but 505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project that conflicts with Posix. */ 506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FILE *out = xfopen (spec_verbose_file, "w"); 507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reduce_output (out); 509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project grammar_rules_partial_print (out, 51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _("Rules useless in parser due to conflicts"), 51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule_useless_in_parser_p); 512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project conflicts_output (out); 513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_grammar (out); 515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* If the whole state item sets, not only the kernels, are wanted, 517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `closure' will be run, which needs memory allocation/deallocation. */ 518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (report_flag & report_itemsets) 519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_closure (nritems); 520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Storage for print_reductions. */ 52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang no_reduce_set = bitset_create (ntokens, BITSET_FIXED); 522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nstates; i++) 523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project print_state (out, states[i]); 52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bitset_free (no_reduce_set); 525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (report_flag & report_itemsets) 526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free_closure (); 527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xfclose (out); 529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 530