]>
git.saurik.com Git - bison.git/blob - src/gram.c
263411a4ab30f8c10a26fd60df2e24dcc28e91fc
1 /* Allocate input grammar variables for bison,
2 Copyright (C) 1984, 1986, 1989, 2001, 2002 Free Software Foundation, Inc.
4 This file is part of Bison, the GNU Compiler Compiler.
6 Bison is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 Bison is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Bison; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
29 /* Comments for these variables are in gram.h. */
31 item_number_t
*ritem
= NULL
;
32 unsigned int nritems
= 0;
35 rule_number_t nrules
= 0;
37 symbol_t
**symbols
= NULL
;
42 symbol_number_t
*token_translations
= NULL
;
44 int max_user_token_number
= 256;
50 /*--------------------------------------------------------------.
51 | Return true IFF the rule has a `number' smaller than NRULES. |
52 `--------------------------------------------------------------*/
55 rule_useful_p (rule_t
*r
)
57 return r
->number
< nrules
;
61 /*-------------------------------------------------------------.
62 | Return true IFF the rule has a `number' higher than NRULES. |
63 `-------------------------------------------------------------*/
66 rule_useless_p (rule_t
*r
)
68 return r
->number
>= nrules
;
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 `--------------------------------------------------------------------*/
78 rule_never_reduced_p (rule_t
*r
)
80 return !r
->useful
&& r
->number
< nrules
;
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 `----------------------------------------------------------------*/
91 rule_lhs_print (rule_t
*rule
, symbol_t
*previous_lhs
, FILE *out
)
93 fprintf (out
, " %3d ", rule
->number
);
94 if (previous_lhs
!= rule
->lhs
)
96 fprintf (out
, "%s:", rule
->lhs
->tag
);
101 for (n
= strlen (previous_lhs
->tag
); n
> 0; --n
)
108 /*--------------------------------------.
109 | Return the number of symbols in RHS. |
110 `--------------------------------------*/
113 rule_rhs_length (rule_t
*rule
)
117 for (rhsp
= rule
->rhs
; *rhsp
>= 0; ++rhsp
)
123 /*-------------------------------.
124 | Print this RULE's RHS on OUT. |
125 `-------------------------------*/
128 rule_rhs_print (rule_t
*rule
, FILE *out
)
133 for (r
= rule
->rhs
; *r
>= 0; r
++)
134 fprintf (out
, " %s", symbols
[*r
]->tag
);
139 fprintf (out
, " /* %s */\n", _("empty"));
144 /*-------------------------.
145 | Print this RULE on OUT. |
146 `-------------------------*/
149 rule_print (rule_t
*rule
, FILE *out
)
151 fprintf (out
, "%s:", rule
->lhs
->tag
);
152 rule_rhs_print (rule
, out
);
156 /*------------------------.
157 | Dump RITEM for traces. |
158 `------------------------*/
161 ritem_print (FILE *out
)
164 fputs ("RITEM\n", out
);
165 for (i
= 0; i
< nritems
; ++i
)
167 fprintf (out
, " %s", symbols
[ritem
[i
]]->tag
);
169 fprintf (out
, " (rule %d)\n", item_number_as_rule_number (ritem
[i
]));
174 /*------------------------------------------.
175 | Return the size of the longest rule RHS. |
176 `------------------------------------------*/
179 ritem_longest_rhs (void)
184 for (r
= 0; r
< nrules
; ++r
)
186 int length
= rule_rhs_length (&rules
[r
]);
195 /*-----------------------------------------------------------------.
196 | Print the grammar's rules that match FILTER on OUT under TITLE. |
197 `-----------------------------------------------------------------*/
200 grammar_rules_partial_print (FILE *out
, const char *title
,
201 rule_filter_t filter
)
205 symbol_t
*previous_lhs
= NULL
;
207 /* rule # : LHS -> RHS */
208 for (r
= 0; r
< nrules
+ nuseless_productions
; r
++)
210 if (filter
&& !filter (&rules
[r
]))
213 fprintf (out
, "%s\n\n", title
);
214 else if (previous_lhs
&& previous_lhs
!= rules
[r
].lhs
)
217 rule_lhs_print (&rules
[r
], previous_lhs
, out
);
218 rule_rhs_print (&rules
[r
], out
);
219 previous_lhs
= rules
[r
].lhs
;
226 /*------------------------------------------.
227 | Print the grammar's useful rules on OUT. |
228 `------------------------------------------*/
231 grammar_rules_print (FILE *out
)
233 grammar_rules_partial_print (out
, _("Grammar"), rule_useful_p
);
237 /*-------------------.
238 | Dump the grammar. |
239 `-------------------*/
242 grammar_dump (FILE *out
, const char *title
)
244 fprintf (out
, "%s\n\n", title
);
246 "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n",
247 ntokens
, nvars
, nsyms
, nrules
, nritems
);
250 fprintf (out
, "Variables\n---------\n\n");
253 fprintf (out
, "Value Sprec Sassoc Tag\n");
255 for (i
= ntokens
; i
< nsyms
; i
++)
256 fprintf (out
, "%5d %5d %5d %s\n",
258 symbols
[i
]->prec
, symbols
[i
]->assoc
,
260 fprintf (out
, "\n\n");
263 fprintf (out
, "Rules\n-----\n\n");
266 fprintf (out
, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n");
267 for (i
= 0; i
< nrules
+ nuseless_productions
; i
++)
269 rule_t
*rule
= &rules
[i
];
270 item_number_t
*r
= NULL
;
272 /* Find the last RHS index in ritems. */
273 for (r
= rule
->rhs
; *r
>= 0; ++r
)
275 fprintf (out
, "%3d (%2d, %2d, %2d, %2d-%2d) %2d ->",
277 rule
->prec
? rule
->prec
->prec
: 0,
278 rule
->prec
? rule
->prec
->assoc
: 0,
281 rule
->rhs
- ritem
+ rhs_count
- 1,
283 /* Dumped the RHS. */
284 for (r
= rule
->rhs
; *r
>= 0; r
++)
285 fprintf (out
, " %3d", *r
);
286 fprintf (out
, " [%d]\n", item_number_as_rule_number (*r
));
289 fprintf (out
, "\n\n");
291 fprintf (out
, "Rules interpreted\n-----------------\n\n");
294 for (r
= 0; r
< nrules
+ nuseless_productions
; r
++)
296 fprintf (out
, "%-5d ", r
);
297 rule_print (&rules
[r
], out
);
300 fprintf (out
, "\n\n");
304 /*------------------------------------------------------------------.
305 | Report on STDERR the rules that are not flagged USEFUL, using the |
306 | MESSAGE (which can be `useless rule' when invoked after grammar |
307 | reduction, or `never reduced' after conflicts were taken into |
309 `------------------------------------------------------------------*/
312 grammar_rules_never_reduced_report (const char *message
)
315 for (r
= 0; r
< nrules
; ++r
)
316 if (!rules
[r
].useful
)
318 LOCATION_PRINT (stderr
, rules
[r
].location
);
319 fprintf (stderr
, ": %s: %s: ",
320 _("warning"), message
);
321 rule_print (&rules
[r
], stderr
);
330 XFREE (token_translations
);
331 /* Free the symbol table data structure. */
333 free_merger_functions ();