1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Print information on generated parser, for bison,
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003, 2004, 2005
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Free 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
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison 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
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison 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
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with Bison; see the file COPYING.  If not, write to
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Boston, MA 02110-1301, USA.  */
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <bitset.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "LR0.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "closure.h"
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "conflicts.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h"
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h"
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "lalr.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "print.h"
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h"
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reduce.h"
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "state.h"
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "symtab.h"
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset shift_set;
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bitset look_ahead_set;
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if 0
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_token (int extnum, int token)
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, _(" type %d is %s\n"), extnum, tags[token]);
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------------.
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| *WIDTH := max (*WIDTH, strlen (STR)).  |
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------------*/
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmax_length (size_t *width, const char *str)
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t len = strlen (str);
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (len > *width)
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    *width = len;
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------.
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report information on a state.  |
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------*/
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_core (FILE *out, state *s)
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t i;
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  item_number *sitems = s->items;
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t snritems = s->nitems;
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol *previous_lhs = NULL;
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Output all the items of a state, not only its kernel.  */
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (report_flag & report_itemsets)
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      closure (sitems, snritems);
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sitems = itemset;
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      snritems = nritemset;
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!snritems)
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < snritems; i++)
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      item_number *sp;
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      item_number *sp1;
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_number r;
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sp1 = sp = ritem + sitems[i];
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (*sp >= 0)
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	sp++;
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      r = item_number_as_rule_number (*sp);
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_lhs_print (&rules[r], previous_lhs, out);
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      previous_lhs = rules[r].lhs;
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (sp = rules[r].rhs; sp < sp1; sp++)
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (out, " %s", symbols[*sp]->tag);
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (" .", out);
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (/* Nothing */; *sp >= 0; ++sp)
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (out, " %s", symbols[*sp]->tag);
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Display the look-ahead tokens?  */
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (report_flag & report_look_ahead_tokens)
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	state_rule_look_ahead_tokens_print (s, &rules[r], out);
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputc ('\n', out);
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/*------------------------------------------------------------.
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of S on |
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| OUT.                                                        |
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------*/
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_transitions (state *s, FILE *out, bool display_transitions_p)
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  transitions *trans = s->transitions;
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t width = 0;
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Compute the width of the look-ahead token column.  */
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < trans->num; i++)
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (!TRANSITION_IS_DISABLED (trans, i)
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	&& TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	max_length (&width, sym->tag);
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Nothing to report. */
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!width)
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width += 2;
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Report look-ahead tokens and shifts.  */
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < trans->num; i++)
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (!TRANSITION_IS_DISABLED (trans, i)
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	&& TRANSITION_IS_SHIFT (trans, i) == display_transitions_p)
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)];
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	const char *tag = sym->tag;
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	state *s1 = trans->states[i];
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int j;
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (out, "    %s", tag);
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (j = width - strlen (tag); j > 0; --j)
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fputc (' ', out);
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (display_transitions_p)
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (out, _("shift, and go to state %d\n"), s1->number);
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	else
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fprintf (out, _("go to state %d\n"), s1->number);
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/*--------------------------------------------------------.
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report the explicit errors of S raised from %nonassoc.  |
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------*/
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_errs (FILE *out, state *s)
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  errs *errp = s->errs;
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t width = 0;
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Compute the width of the look-ahead token column.  */
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < errp->num; ++i)
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (errp->symbols[i])
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      max_length (&width, errp->symbols[i]->tag);
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Nothing to report. */
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!width)
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width += 2;
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Report look-ahead tokens and errors.  */
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < errp->num; ++i)
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (errp->symbols[i])
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	const char *tag = errp->symbols[i]->tag;
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	int j;
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (out, "    %s", tag);
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (j = width - strlen (tag); j > 0; --j)
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  fputc (' ', out);
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fputs (_("error (nonassociative)\n"), out);
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------.
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Return the default rule of S if it has one, NULL otherwise.  |
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------*/
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic rule *
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstate_default_rule (state *s)
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule *default_rule = NULL;
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int cmax = 0;
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i;
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* No need for a look-ahead.  */
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (s->consistent)
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return reds->rules[0];
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* 1. Each reduction is possibly masked by the look-ahead tokens on which
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     we shift (S/R conflicts)...  */
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_zero (shift_set);
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    transitions *trans = s->transitions;
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    FOR_EACH_SHIFT (trans, i)
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	/* If this state has a shift for the error token, don't use a
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	     default rule.  */
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	if (TRANSITION_IS_ERROR (trans, i))
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  return NULL;
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  }
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* 2. Each reduction is possibly masked by the look-ahead tokens on which
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     we raise an error (due to %nonassoc).  */
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    errs *errp = s->errs;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (i = 0; i < errp->num; i++)
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (errp->symbols[i])
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	bitset_set (shift_set, errp->symbols[i]->number);
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  }
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < reds->num; ++i)
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int count = 0;
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* How many non-masked look-ahead tokens are there for this
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 reduction?  */
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_andn (look_ahead_set, reds->look_ahead_tokens[i], shift_set);
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      count = bitset_count (look_ahead_set);
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (count > cmax)
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  cmax = count;
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  default_rule = reds->rules[i];
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* 3. And finally, each reduction is possibly masked by previous
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 reductions (in R/R conflicts, we keep the first reductions).
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 */
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      bitset_or (shift_set, shift_set, reds->look_ahead_tokens[i]);
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return default_rule;
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------------------------------------.
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report a reduction of RULE on LOOK_AHEAD_TOKEN (which can be `default').  |
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| If not ENABLED, the rule is masked by a shift or a reduce (S/R and        |
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| R/R conflicts).                                                           |
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------------------------*/
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_reduction (FILE *out, size_t width,
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		 const char *look_ahead_token,
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		 rule *r, bool enabled)
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int j;
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, "    %s", look_ahead_token);
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (j = width - strlen (look_ahead_token); j > 0; --j)
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fputc (' ', out);
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!enabled)
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fputc ('[', out);
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (r->number)
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (out, _("reduce using rule %d (%s)"), r->number, r->lhs->tag);
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fprintf (out, _("accept"));
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!enabled)
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fputc (']', out);
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------.
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report on OUT the reduction actions of S.  |
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------*/
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_reductions (FILE *out, state *s)
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  transitions *trans = s->transitions;
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reductions *reds = s->reductions;
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  rule *default_rule = NULL;
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t width = 0;
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int i, j;
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (reds->num == 0)
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  default_rule = state_default_rule (s);
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_zero (shift_set);
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FOR_EACH_SHIFT (trans, i)
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    bitset_set (shift_set, TRANSITION_SYMBOL (trans, i));
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Compute the width of the look-ahead token column.  */
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (default_rule)
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    width = strlen (_("$default"));
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (reds->look_ahead_tokens)
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (i = 0; i < ntokens; i++)
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	bool count = bitset_test (shift_set, i);
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (j = 0; j < reds->num; ++j)
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (bitset_test (reds->look_ahead_tokens[j], i))
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      if (! count)
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		{
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  if (reds->rules[j] != default_rule)
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    max_length (&width, symbols[i]->tag);
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  count = true;
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		}
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      else
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		{
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  max_length (&width, symbols[i]->tag);
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		}
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Nothing to report. */
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!width)
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  width += 2;
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Report look-ahead tokens (or $default) and reductions.  */
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (reds->look_ahead_tokens)
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    for (i = 0; i < ntokens; i++)
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	bool defaulted = false;
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	bool count = bitset_test (shift_set, i);
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (j = 0; j < reds->num; ++j)
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (bitset_test (reds->look_ahead_tokens[j], i))
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      if (! count)
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		{
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  if (reds->rules[j] != default_rule)
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    print_reduction (out, width,
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				     symbols[i]->tag,
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				     reds->rules[j], true);
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  else
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    defaulted = true;
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  count = true;
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		}
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      else
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		{
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  if (defaulted)
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    print_reduction (out, width,
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				     symbols[i]->tag,
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				     default_rule, true);
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  defaulted = false;
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  print_reduction (out, width,
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   symbols[i]->tag,
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   reds->rules[j], false);
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		}
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (default_rule)
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_reduction (out, width,
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		     _("$default"), default_rule, true);
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------------------------------.
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report on OUT all the actions (shifts, gotos, reductions, and |
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| explicit erros from %nonassoc) of S.                          |
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------------------------------*/
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_actions (FILE *out, state *s)
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Print shifts.  */
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_transitions (s, out, true);
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_errs (out, s);
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_reductions (out, s);
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Print gotos.  */
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_transitions (s, out, false);
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------.
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report all the data on S on OUT.  |
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------*/
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_state (FILE *out, state *s)
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("\n\n", out);
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, _("state %d"), s->number);
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputc ('\n', out);
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_core (out, s);
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_actions (out, s);
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if ((report_flag & report_solved_conflicts) && s->solved_conflicts)
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputc ('\n', out);
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (s->solved_conflicts, out);
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------.
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Print information on the whole grammar.  |
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------*/
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define END_TEST(End)				\
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdo {						\
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (column + strlen(buffer) > (End))		\
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {						\
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (out, "%s\n   ", buffer);		\
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      column = 3;				\
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      buffer[0] = 0;				\
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }						\
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} while (0)
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_grammar (FILE *out)
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol_number i;
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char buffer[90];
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int column = 0;
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  grammar_rules_print (out);
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* TERMINAL (type #) : rule #s terminal is on RHS */
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < max_user_token_number + 1; i++)
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (token_translations[i] != undeftoken->number)
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	const char *tag = symbols[token_translations[i]]->tag;
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	rule_number r;
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	item_number *rhsp;
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	buffer[0] = 0;
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	column = strlen (tag);
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fputs (tag, out);
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	END_TEST (50);
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	sprintf (buffer, " (%d)", i);
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	for (r = 0; r < nrules; r++)
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    if (item_number_as_symbol_number (*rhsp) == token_translations[i])
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      {
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		END_TEST (65);
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		sprintf (buffer + strlen (buffer), " %d", r);
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		break;
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      }
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	fprintf (out, "%s\n", buffer);
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      }
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs ("\n\n", out);
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear"));
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = ntokens; i < nsyms; i++)
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int left_count = 0, right_count = 0;
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      rule_number r;
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      const char *tag = symbols[i]->tag;
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (r = 0; r < nrules; r++)
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  item_number *rhsp;
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (rules[r].lhs->number == i)
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    left_count++;
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    if (item_number_as_symbol_number (*rhsp) == i)
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      {
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		right_count++;
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		break;
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      }
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      buffer[0] = 0;
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fputs (tag, out);
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      column = strlen (tag);
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sprintf (buffer, " (%d)", i);
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      END_TEST (0);
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (left_count > 0)
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  END_TEST (50);
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  sprintf (buffer + strlen (buffer), _(" on left:"));
513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (r = 0; r < nrules; r++)
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      END_TEST (65);
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      if (rules[r].lhs->number == i)
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		sprintf (buffer + strlen (buffer), " %d", r);
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (right_count > 0)
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	{
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  if (left_count > 0)
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    sprintf (buffer + strlen (buffer), ",");
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  END_TEST (50);
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  sprintf (buffer + strlen (buffer), _(" on right:"));
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  for (r = 0; r < nrules; r++)
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    {
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      item_number *rhsp;
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	      for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++)
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		if (item_number_as_symbol_number (*rhsp) == i)
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  {
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    END_TEST (65);
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    sprintf (buffer + strlen (buffer), " %d", r);
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    break;
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  }
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    }
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	}
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (out, "%s\n", buffer);
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_results (void)
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  state_number i;
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* We used to use just .out if SPEC_NAME_PREFIX (-p) was used, but
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     that conflicts with Posix.  */
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FILE *out = xfopen (spec_verbose_file, "w");
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  reduce_output (out);
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  grammar_rules_partial_print (out,
555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			       _("Rules never reduced"), rule_never_reduced_p);
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  conflicts_output (out);
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  print_grammar (out);
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If the whole state item sets, not only the kernels, are wanted,
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     `closure' will be run, which needs memory allocation/deallocation.   */
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (report_flag & report_itemsets)
563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    new_closure (nritems);
564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Storage for print_reductions.  */
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  shift_set =  bitset_create (ntokens, BITSET_FIXED);
566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  look_ahead_set = bitset_create (ntokens, BITSET_FIXED);
567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (i = 0; i < nstates; i++)
568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    print_state (out, states[i]);
569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_free (shift_set);
570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bitset_free (look_ahead_set);
571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (report_flag & report_itemsets)
572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    free_closure ();
573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  xfclose (out);
575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
576