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