]> git.saurik.com Git - bison.git/blame - src/gram.c
Adjust to Autoconf 2.60 and today's gnulib.
[bison.git] / src / gram.c
CommitLineData
6f84e9ab
PE
1/* Allocate input grammar variables for Bison.
2
e9ad4aec 3 Copyright (C) 1984, 1986, 1989, 2001, 2002, 2003, 2005, 2006 Free
2cec9080 4 Software Foundation, Inc.
f7d4d87a 5
076ab033 6 This file is part of Bison, the GNU Compiler Compiler.
f7d4d87a 7
076ab033
AD
8 Bison is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
f7d4d87a 12
076ab033
AD
13 Bison is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
f7d4d87a 17
076ab033
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to
0fb669f9
PE
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
f7d4d87a 22
2cec9080 23#include <config.h>
4a120d45 24#include "system.h"
81ebdef9
PE
25
26#include <quotearg.h>
27
78ab8f67 28#include "gram.h"
3067fbef 29#include "reader.h"
81ebdef9
PE
30#include "reduce.h"
31#include "symtab.h"
4a120d45 32
6b98e4b5 33/* Comments for these variables are in gram.h. */
f7d4d87a 34
81ebdef9 35item_number *ritem = NULL;
0c2d3f4c 36unsigned int nritems = 0;
75142d45 37
81ebdef9
PE
38rule *rules = NULL;
39rule_number nrules = 0;
0e78e603 40
81ebdef9 41symbol **symbols = NULL;
5123689b
AD
42int nsyms = 0;
43int ntokens = 1;
44int nvars = 0;
45
81ebdef9 46symbol_number *token_translations = NULL;
f7d4d87a 47
280a38c3 48int max_user_token_number = 256;
f7d4d87a 49
c8f002c7
AD
50/*--------------------------------------------------------------.
51| Return true IFF the rule has a `number' smaller than NRULES. |
52`--------------------------------------------------------------*/
53
54bool
81ebdef9 55rule_useful_p (rule *r)
c8f002c7
AD
56{
57 return r->number < nrules;
58}
59
60
61/*-------------------------------------------------------------.
62| Return true IFF the rule has a `number' higher than NRULES. |
63`-------------------------------------------------------------*/
64
65bool
81ebdef9 66rule_useless_p (rule *r)
c8f002c7 67{
affac613 68 return !rule_useful_p (r);
c8f002c7
AD
69}
70
71
72/*--------------------------------------------------------------------.
73| Return true IFF the rule is not flagged as useful *and* is useful. |
74| In other words, it was discarded because of conflicts. |
75`--------------------------------------------------------------------*/
76
77bool
81ebdef9 78rule_never_reduced_p (rule *r)
c8f002c7 79{
affac613 80 return !r->useful && rule_useful_p (r);
c8f002c7
AD
81}
82
83
ce4ccb4b
AD
84/*----------------------------------------------------------------.
85| Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was |
86| already displayed (by a previous call for another rule), avoid |
87| useless repetitions. |
88`----------------------------------------------------------------*/
89
90void
81ebdef9 91rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out)
ce4ccb4b 92{
81ebdef9
PE
93 fprintf (out, " %3d ", r->number);
94 if (previous_lhs != r->lhs)
ce4ccb4b 95 {
81ebdef9 96 fprintf (out, "%s:", r->lhs->tag);
ce4ccb4b
AD
97 }
98 else
99 {
100 int n;
97650f4e 101 for (n = strlen (previous_lhs->tag); n > 0; --n)
ce4ccb4b
AD
102 fputc (' ', out);
103 fputc ('|', out);
104 }
105}
106
107
c3b407f4
AD
108/*--------------------------------------.
109| Return the number of symbols in RHS. |
110`--------------------------------------*/
111
112int
81ebdef9 113rule_rhs_length (rule *r)
c3b407f4
AD
114{
115 int res = 0;
81ebdef9
PE
116 item_number *rhsp;
117 for (rhsp = r->rhs; *rhsp >= 0; ++rhsp)
c3b407f4
AD
118 ++res;
119 return res;
120}
121
122
6b98e4b5 123/*-------------------------------.
81ebdef9 124| Print this rule's RHS on OUT. |
6b98e4b5
AD
125`-------------------------------*/
126
127void
81ebdef9 128rule_rhs_print (rule *r, FILE *out)
6b98e4b5 129{
81ebdef9 130 if (*r->rhs >= 0)
6b98e4b5 131 {
81ebdef9
PE
132 item_number *rp;
133 for (rp = r->rhs; *rp >= 0; rp++)
134 fprintf (out, " %s", symbols[*rp]->tag);
6b98e4b5
AD
135 fputc ('\n', out);
136 }
137 else
138 {
139 fprintf (out, " /* %s */\n", _("empty"));
140 }
141}
142
143
144/*-------------------------.
81ebdef9 145| Print this rule on OUT. |
6b98e4b5
AD
146`-------------------------*/
147
148void
81ebdef9 149rule_print (rule *r, FILE *out)
6b98e4b5 150{
81ebdef9
PE
151 fprintf (out, "%s:", r->lhs->tag);
152 rule_rhs_print (r, out);
6b98e4b5
AD
153}
154
155
c2713865
AD
156/*------------------------.
157| Dump RITEM for traces. |
158`------------------------*/
159
cbbe7505 160void
3067fbef 161ritem_print (FILE *out)
f7d4d87a 162{
0c2d3f4c 163 unsigned int i;
3067fbef 164 fputs ("RITEM\n", out);
75142d45
AD
165 for (i = 0; i < nritems; ++i)
166 if (ritem[i] >= 0)
97650f4e 167 fprintf (out, " %s", symbols[ritem[i]]->tag);
3067fbef 168 else
4b3d3a8e 169 fprintf (out, " (rule %d)\n", item_number_as_rule_number (ritem[i]));
3067fbef 170 fputs ("\n\n", out);
f7d4d87a 171}
c2713865
AD
172
173
174/*------------------------------------------.
175| Return the size of the longest rule RHS. |
176`------------------------------------------*/
177
178size_t
179ritem_longest_rhs (void)
180{
c3b407f4 181 int max = 0;
81ebdef9 182 rule_number r;
c2713865 183
4b3d3a8e 184 for (r = 0; r < nrules; ++r)
c3b407f4 185 {
9222837b 186 int length = rule_rhs_length (&rules[r]);
c3b407f4
AD
187 if (length > max)
188 max = length;
189 }
c2713865
AD
190
191 return max;
192}
78ab8f67
AD
193
194
c8f002c7
AD
195/*-----------------------------------------------------------------.
196| Print the grammar's rules that match FILTER on OUT under TITLE. |
197`-----------------------------------------------------------------*/
6b98e4b5 198
6b98e4b5 199void
9757c359 200grammar_rules_partial_print (FILE *out, const char *title,
81ebdef9 201 rule_filter filter)
6b98e4b5 202{
a737b216 203 rule_number r;
637c4b28 204 bool first = true;
81ebdef9 205 symbol *previous_lhs = NULL;
6b98e4b5
AD
206
207 /* rule # : LHS -> RHS */
c8f002c7 208 for (r = 0; r < nrules + nuseless_productions; r++)
6b98e4b5 209 {
c8f002c7
AD
210 if (filter && !filter (&rules[r]))
211 continue;
212 if (first)
213 fprintf (out, "%s\n\n", title);
214 else if (previous_lhs && previous_lhs != rules[r].lhs)
6b98e4b5 215 fputc ('\n', out);
637c4b28 216 first = false;
ce4ccb4b 217 rule_lhs_print (&rules[r], previous_lhs, out);
6b98e4b5 218 rule_rhs_print (&rules[r], out);
ce4ccb4b 219 previous_lhs = rules[r].lhs;
6b98e4b5 220 }
c8f002c7
AD
221 if (!first)
222 fputs ("\n\n", out);
6b98e4b5
AD
223}
224
9757c359
AD
225
226/*------------------------------------------.
227| Print the grammar's useful rules on OUT. |
228`------------------------------------------*/
229
230void
231grammar_rules_print (FILE *out)
232{
c8f002c7 233 grammar_rules_partial_print (out, _("Grammar"), rule_useful_p);
9757c359
AD
234}
235
236
78ab8f67
AD
237/*-------------------.
238| Dump the grammar. |
239`-------------------*/
240
241void
242grammar_dump (FILE *out, const char *title)
243{
78ab8f67
AD
244 fprintf (out, "%s\n\n", title);
245 fprintf (out,
246 "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
247 ntokens, nvars, nsyms, nrules, nritems);
9222837b
AD
248
249
2f4f028d 250 fprintf (out, "Variables\n---------\n\n");
9222837b 251 {
81ebdef9 252 symbol_number i;
2f4f028d
PE
253 fprintf (out, "Value Sprec Sassoc Tag\n");
254
9222837b
AD
255 for (i = ntokens; i < nsyms; i++)
256 fprintf (out, "%5d %5d %5d %s\n",
257 i,
258 symbols[i]->prec, symbols[i]->assoc,
97650f4e 259 symbols[i]->tag);
2f4f028d 260 fprintf (out, "\n\n");
9222837b
AD
261 }
262
2f4f028d 263 fprintf (out, "Rules\n-----\n\n");
9222837b 264 {
81ebdef9 265 rule_number i;
2f4f028d 266 fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
4b3d3a8e 267 for (i = 0; i < nrules + nuseless_productions; i++)
9222837b 268 {
81ebdef9 269 rule *rule_i = &rules[i];
a737b216 270 item_number *rp = NULL;
81ebdef9 271 unsigned int rhs_itemno = rule_i->rhs - ritem;
04098407 272 unsigned int rhs_count = 0;
9222837b 273 /* Find the last RHS index in ritems. */
a737b216 274 for (rp = rule_i->rhs; *rp >= 0; ++rp)
9222837b 275 ++rhs_count;
e3fbd37f 276 fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u) %2d ->",
4b3d3a8e 277 i,
81ebdef9
PE
278 rule_i->prec ? rule_i->prec->prec : 0,
279 rule_i->prec ? rule_i->prec->assoc : 0,
280 rule_i->useful,
e3fbd37f
PE
281 rhs_itemno,
282 rhs_itemno + rhs_count - 1,
81ebdef9 283 rule_i->lhs->number);
9222837b 284 /* Dumped the RHS. */
a737b216
PE
285 for (rp = rule_i->rhs; *rp >= 0; rp++)
286 fprintf (out, " %3d", *rp);
287 fprintf (out, " [%d]\n", item_number_as_rule_number (*rp));
9222837b
AD
288 }
289 }
2f4f028d 290 fprintf (out, "\n\n");
9222837b 291
2f4f028d 292 fprintf (out, "Rules interpreted\n-----------------\n\n");
9222837b 293 {
81ebdef9 294 rule_number r;
4b3d3a8e 295 for (r = 0; r < nrules + nuseless_productions; r++)
9222837b
AD
296 {
297 fprintf (out, "%-5d ", r);
298 rule_print (&rules[r], out);
299 }
300 }
2f4f028d 301 fprintf (out, "\n\n");
78ab8f67 302}
5372019f
AD
303
304
c8f002c7
AD
305/*------------------------------------------------------------------.
306| Report on STDERR the rules that are not flagged USEFUL, using the |
307| MESSAGE (which can be `useless rule' when invoked after grammar |
308| reduction, or `never reduced' after conflicts were taken into |
309| account). |
310`------------------------------------------------------------------*/
311
312void
313grammar_rules_never_reduced_report (const char *message)
314{
81ebdef9 315 rule_number r;
c8f002c7
AD
316 for (r = 0; r < nrules ; ++r)
317 if (!rules[r].useful)
318 {
5fcdb07b 319 location_print (stderr, rules[r].location);
affac613 320 fprintf (stderr, ": %s: %s: ", _("warning"), message);
c8f002c7
AD
321 rule_print (&rules[r], stderr);
322 }
323}
324
5372019f
AD
325void
326grammar_free (void)
327{
e9ad4aec
PE
328 if (ritem)
329 free (ritem - 1);
4b3d3a8e 330 free (rules);
afbb696d 331 free (token_translations);
5372019f
AD
332 /* Free the symbol table data structure. */
333 symbols_free ();
676385e2 334 free_merger_functions ();
5372019f 335}