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