1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate input grammar variables for Bison. 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1984, 1986, 1989, 2001-2003, 2005-2012 Free Software 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 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 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "complain.h" 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "getargs.h" 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "print-xml.h" 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reduce.h" 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h" 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Comments for these variables are in gram.h. */ 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectitem_number *ritem = NULL; 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunsigned int nritems = 0; 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule *rules = NULL; 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_number nrules = 0; 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol **symbols = NULL; 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint nsyms = 0; 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint ntokens = 1; 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint nvars = 0; 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_number *token_translations = NULL; 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint max_user_token_number = 256; 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wangrule_useful_in_grammar_p (rule *r) 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return r->number < nrules; 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wangrule_useless_in_grammar_p (rule *r) 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return !rule_useful_in_grammar_p (r); 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wangrule_useless_in_parser_p (rule *r) 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return !r->useful && rule_useful_in_grammar_p (r); 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_lhs_print (rule *r, symbol *previous_lhs, FILE *out) 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %3d ", r->number); 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (previous_lhs != r->lhs) 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s:", r->lhs->tag); 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int n; 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (n = strlen (previous_lhs->tag); n > 0; --n) 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc (' ', out); 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('|', out); 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wangrule_lhs_print_xml (rule *r, FILE *out, int level) 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_printf (out, level, "<lhs>%s</lhs>", r->lhs->tag); 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_rhs_length (rule *r) 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int res = 0; 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rhsp; 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rhsp = r->rhs; *rhsp >= 0; ++rhsp) 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++res; 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return res; 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_rhs_print (rule *r, FILE *out) 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (*r->rhs >= 0) 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rp; 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rp = r->rhs; *rp >= 0; rp++) 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", symbols[*rp]->tag); 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " /* %s */\n", _("empty")); 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic void 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wangrule_rhs_print_xml (rule *r, FILE *out, int level) 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (*r->rhs >= 0) 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang item_number *rp; 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level, "<rhs>"); 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (rp = r->rhs; *rp >= 0; rp++) 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_printf (out, level + 1, "<symbol>%s</symbol>", 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_escape (symbols[*rp]->tag)); 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level, "</rhs>"); 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level, "<rhs>"); 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level + 1, "<empty/>"); 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level, "</rhs>"); 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_print (rule *r, FILE *out) 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s:", r->lhs->tag); 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_rhs_print (r, out); 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectritem_print (FILE *out) 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int i; 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("RITEM\n", out); 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nritems; ++i) 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ritem[i] >= 0) 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %s", symbols[ritem[i]]->tag); 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " (rule %d)\n", item_number_as_rule_number (ritem[i])); 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("\n\n", out); 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectritem_longest_rhs (void) 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int max = 0; 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules; ++r) 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int length = rule_rhs_length (&rules[r]); 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (length > max) 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max = length; 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return max; 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar_rules_partial_print (FILE *out, const char *title, 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_filter filter) 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool first = true; 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol *previous_lhs = NULL; 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* rule # : LHS -> RHS */ 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules + nuseless_productions; r++) 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (filter && !filter (&rules[r])) 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (first) 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n\n", title); 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (previous_lhs && previous_lhs != rules[r].lhs) 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputc ('\n', out); 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project first = false; 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_lhs_print (&rules[r], previous_lhs, out); 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_rhs_print (&rules[r], out); 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project previous_lhs = rules[r].lhs; 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!first) 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fputs ("\n\n", out); 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar_rules_print (FILE *out) 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang grammar_rules_partial_print (out, _("Grammar"), rule_useful_in_grammar_p); 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wanggrammar_rules_print_xml (FILE *out, int level) 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule_number r; 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool first = true; 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (r = 0; r < nrules + nuseless_productions; r++) 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (first) 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level + 1, "<rules>"); 21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang first = false; 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *usefulness; 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (rule_useless_in_grammar_p (&rules[r])) 21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang usefulness = "useless-in-grammar"; 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (rule_useless_in_parser_p (&rules[r])) 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang usefulness = "useless-in-parser"; 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang usefulness = "useful"; 22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_indent (out, level + 2); 22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, "<rule number=\"%d\" usefulness=\"%s\"", 22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang rules[r].number, usefulness); 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (rules[r].precsym) 22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang fprintf (out, " percent_prec=\"%s\"", 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_escape (rules[r].precsym->tag)); 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang fputs (">\n", out); 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule_lhs_print_xml (&rules[r], out, level + 3); 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule_rhs_print_xml (&rules[r], out, level + 3); 23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level + 2, "</rule>"); 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!first) 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level + 1, "</rules>"); 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang xml_puts (out, level + 1, "<rules/>"); 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar_dump (FILE *out, const char *title) 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%s\n\n", title); 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n", 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ntokens, nvars, nsyms, nrules, nritems); 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "Variables\n---------\n\n"); 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_number i; 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "Value Sprec Sassoc Tag\n"); 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = ntokens; i < nsyms; i++) 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%5d %5d %5d %s\n", 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project i, 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols[i]->prec, symbols[i]->assoc, 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols[i]->tag); 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "\n\n"); 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "Rules\n-----\n\n"); 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number i; 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = 0; i < nrules + nuseless_productions; i++) 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule *rule_i = &rules[i]; 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project item_number *rp = NULL; 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int rhs_itemno = rule_i->rhs - ritem; 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int rhs_count = 0; 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Find the last RHS index in ritems. */ 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rp = rule_i->rhs; *rp >= 0; ++rp) 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++rhs_count; 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u) %2d ->", 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project i, 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_i->prec ? rule_i->prec->prec : 0, 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_i->prec ? rule_i->prec->assoc : 0, 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_i->useful, 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs_itemno, 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rhs_itemno + rhs_count - 1, 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_i->lhs->number); 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Dumped the RHS. */ 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (rp = rule_i->rhs; *rp >= 0; rp++) 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " %3d", *rp); 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, " [%d]\n", item_number_as_rule_number (*rp)); 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "\n\n"); 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "Rules interpreted\n-----------------\n\n"); 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules + nuseless_productions; r++) 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "%-5d ", r); 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_print (&rules[r], out); 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (out, "\n\n"); 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 30505436638acc7c010349a69c3395f1a57c642dc62Ying Wanggrammar_rules_useless_report (const char *message) 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_number r; 308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (r = 0; r < nrules ; ++r) 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!rules[r].useful) 310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (feature_flag & feature_caret) 31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (rules[r].location, "%s", message); 31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (rules[r].location, "%s: ", message); 31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (warnings_flag & warnings_other) 31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang rule_print (&rules[r], stderr); 31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang fflush (stderr); 32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrammar_free (void) 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ritem) 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (ritem - 1); 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (rules); 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free (token_translations); 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Free the symbol table data structure. */ 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbols_free (); 334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free_merger_functions (); 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 336