]> git.saurik.com Git - bison.git/blame - src/output.c
* src/muscle_tab.c (muscle_find, muscle_insert): Don't initialize
[bison.git] / src / output.c
CommitLineData
c3e23647 1/* Output the generated parsing program for bison,
5bb18f9a 2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
255ef638 3 Free Software Foundation, Inc.
c3e23647 4
9ee3c97b 5 This file is part of Bison, the GNU Compiler Compiler.
c3e23647 6
9ee3c97b
AD
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
c3e23647 11
9ee3c97b
AD
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
c3e23647 16
9ee3c97b
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
c3e23647
RS
21
22
255ef638
AD
23/* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
25 are set.
c3e23647 26
255ef638
AD
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
c3e23647 29
255ef638 30 ++ YYTNAME = vector of string-names indexed by bison token number.
c3e23647 31
255ef638
AD
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
c3e23647 34
255ef638
AD
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
c3e23647 37
255ef638
AD
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
c3e23647 40
255ef638 41 YYPRHS[R] = index in YYRHS of first item for rule R.
c3e23647 42
255ef638 43 YYR1[R] = symbol number of symbol that rule R derives.
c3e23647 44
255ef638 45 YYR2[R] = number of symbols composing right hand side of rule R.
c3e23647 46
255ef638
AD
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
e372befa 49
255ef638
AD
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
52 error.
c3e23647 53
255ef638
AD
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
56 something else to do.
c3e23647 57
255ef638
AD
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
60 out what to do.
c3e23647 61
255ef638
AD
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
c3e23647 64
6c89f1c1 65 If the value is negative, it is minus a rule number to reduce by.
c3e23647 66
255ef638
AD
67 If the value is zero, the default action from YYDEFACT[S] is used.
68
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
74
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
77
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
80 examine.
81
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
87
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
c3e23647 90
c3e23647 91#include "system.h"
914feea9 92#include "bitsetv.h"
14d3eb9b 93#include "quotearg.h"
be2a1a68 94#include "error.h"
ceed8467 95#include "getargs.h"
c3e23647
RS
96#include "files.h"
97#include "gram.h"
b2ca4022 98#include "LR0.h"
a0f6b076 99#include "complain.h"
6c89f1c1 100#include "output.h"
720d742f 101#include "lalr.h"
a70083a3 102#include "reader.h"
ad949da9 103#include "symtab.h"
0619caf0 104#include "conflicts.h"
11d82f03 105#include "muscle_tab.h"
be2a1a68
AD
106
107/* From lib/readpipe.h. */
108FILE *readpipe PARAMS ((const char *, ...));
109
110/* From src/scan-skel.l. */
111int skel_lex PARAMS ((void));
112extern FILE *skel_in;
d019d655 113
c3e23647
RS
114static int nvectors;
115static int nentries;
342b8b6e
AD
116static short **froms = NULL;
117static short **tos = NULL;
118static short *tally = NULL;
119static short *width = NULL;
120static short *actrow = NULL;
121static short *state_count = NULL;
122static short *order = NULL;
123static short *base = NULL;
124static short *pos = NULL;
133c20e2
AD
125
126/* TABLE_SIZE is the allocated size of both TABLE and CHECK.
127 We start with the original hard-coded value: SHRT_MAX
128 (yes, not USHRT_MAX). */
129static size_t table_size = SHRT_MAX;
342b8b6e
AD
130static short *table = NULL;
131static short *check = NULL;
c3e23647
RS
132static int lowzero;
133static int high;
134
11d82f03 135struct obstack muscle_obstack;
f87685c3 136static struct obstack format_obstack;
c3e23647 137
c7925b99
MA
138int error_verbose = 0;
139
f0440388 140
133c20e2
AD
141/*----------------------------------------------------------------.
142| If TABLE (and CHECK) appear to be small to be addressed at |
143| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
144| the desired size is at least DESIRED + 1. |
145`----------------------------------------------------------------*/
146
147static void
148table_grow (size_t desired)
149{
150 size_t old_size = table_size;
151
152 while (table_size <= desired)
153 table_size *= 2;
154
155 if (trace_flag)
156 fprintf (stderr, "growing table and check from: %d to %d\n",
157 old_size, table_size);
158
159 table = XREALLOC (table, short, table_size);
160 check = XREALLOC (check, short, table_size);
161
162 for (/* Nothing. */; old_size < table_size; ++old_size)
163 {
164 table[old_size] = 0;
165 check[old_size] = -1;
166 }
167}
168
169
5372019f
AD
170/*-------------------------------------------------------------------.
171| Create a function NAME which associates to the muscle NAME the |
172| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
173| TYPE), and to the muscle NAME_max, the max value of the |
174| TABLE_DATA. |
175`-------------------------------------------------------------------*/
62a3e4f0 176
62a3e4f0 177
5372019f 178#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 179 \
5372019f
AD
180static void \
181Name (const char *name, \
5fbb0954
AD
182 Type *table_data, \
183 Type first, \
184 int begin, \
185 int end) \
186{ \
0c2d3f4c 187 Type max = first; \
5fbb0954
AD
188 int i; \
189 int j = 1; \
190 \
5372019f 191 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
192 for (i = begin; i < end; ++i) \
193 { \
5372019f 194 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
195 if (j >= 10) \
196 { \
5372019f 197 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
198 j = 1; \
199 } \
200 else \
201 ++j; \
5372019f 202 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
5fbb0954
AD
203 if (table_data[i] > max) \
204 max = table_data[i]; \
205 } \
5372019f
AD
206 obstack_1grow (&format_obstack, 0); \
207 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 208 \
5372019f
AD
209 /* Build `NAME_max' in the obstack. */ \
210 obstack_fgrow1 (&format_obstack, "%s_max", name); \
211 obstack_1grow (&format_obstack, 0); \
0c2d3f4c
AD
212 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
213 (long int) max); \
62a3e4f0
AD
214}
215
5372019f
AD
216GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
217GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
a49aecd5 218GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
5372019f 219GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
c3e23647
RS
220
221
b0940840
AD
222/*-----------------------------------------------------------------.
223| Prepare the muscles related to the tokens: translate, tname, and |
224| toknum. |
225`-----------------------------------------------------------------*/
226
4a120d45 227static void
b0940840 228prepare_tokens (void)
c3e23647 229{
a49aecd5 230 muscle_insert_symbol_number_table ("translate",
5372019f
AD
231 token_translations,
232 0, 1, max_user_token_number + 1);
c3e23647 233
b0940840
AD
234 {
235 int i;
236 int j = 0;
237 for (i = 0; i < nsyms; i++)
238 {
239 /* Be sure not to use twice the same quotearg slot. */
240 const char *cp =
241 quotearg_n_style (1, c_quoting_style,
242 quotearg_style (escape_quoting_style,
243 symbols[i]->tag));
244 /* Width of the next token, including the two quotes, the coma
245 and the space. */
246 int strsize = strlen (cp) + 2;
247
248 if (j + strsize > 75)
249 {
250 obstack_sgrow (&format_obstack, "\n ");
251 j = 2;
252 }
253
254 obstack_sgrow (&format_obstack, cp);
255 obstack_sgrow (&format_obstack, ", ");
256 j += strsize;
257 }
258 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
259 defined). */
260 obstack_sgrow (&format_obstack, "0");
c3e23647 261
b0940840
AD
262 /* Finish table and store. */
263 obstack_1grow (&format_obstack, 0);
264 muscle_insert ("tname", obstack_finish (&format_obstack));
265 }
266
267 /* Output YYTOKNUM. */
b2ed6e58
AD
268 {
269 int i;
b0940840
AD
270 short *values = XCALLOC (short, ntokens + 1);
271 for (i = 0; i < ntokens + 1; ++i)
272 values[i] = symbols[i]->user_token_number;
5372019f
AD
273 muscle_insert_short_table ("toknum", values,
274 0, 1, ntokens + 1);
b0940840 275 free (values);
b2ed6e58 276 }
b0940840 277}
b2ed6e58 278
b0940840
AD
279
280/*-------------------------------------------------------------.
281| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
282| rline. |
283`-------------------------------------------------------------*/
284
285static void
286prepare_rules (void)
287{
b0940840 288 int r;
5df5f6d5 289 unsigned int i = 0;
62a3e4f0 290 item_number_t *rhs = XMALLOC (item_number_t, nritems);
5df5f6d5
AD
291 unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
292 unsigned int *rline = XMALLOC (unsigned int, nrules + 1);
a49aecd5 293 symbol_number_t *r1 = XMALLOC (symbol_number_t, nrules + 1);
5df5f6d5 294 unsigned int *r2 = XMALLOC (unsigned int, nrules + 1);
b0940840
AD
295
296 for (r = 1; r < nrules + 1; ++r)
297 {
5df5f6d5 298 item_number_t *rhsp;
b0940840
AD
299 /* Index of rule R in RHS. */
300 prhs[r] = i;
301 /* RHS of the rule R. */
302 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
303 rhs[i++] = *rhsp;
304 /* LHS of the rule R. */
305 r1[r] = rules[r].lhs->number;
306 /* Length of rule R's RHS. */
307 r2[r] = i - prhs[r];
308 /* Separator in RHS. */
309 rhs[i++] = -1;
310 /* Line where rule was defined. */
311 rline[r] = rules[r].line;
312 }
313 assert (i == nritems);
314
5372019f
AD
315 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
316 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 1, nrules + 1);
317 muscle_insert_unsigned_int_table ("rline", rline, 0, 1, nrules + 1);
a49aecd5 318 muscle_insert_symbol_number_table ("r1", r1, 0, 1, nrules + 1);
5372019f 319 muscle_insert_unsigned_int_table ("r2", r2, 0, 1, nrules + 1);
796d61fb 320
b0940840
AD
321 free (rhs);
322 free (prhs);
5df5f6d5
AD
323 free (rline);
324 free (r1);
b0940840 325 free (r2);
c3e23647
RS
326}
327
b0940840
AD
328/*--------------------------------------------.
329| Prepare the muscles related to the states. |
330`--------------------------------------------*/
c3e23647 331
4a120d45 332static void
b0940840 333prepare_states (void)
c3e23647 334{
602bbf31 335 size_t i;
a49aecd5
AD
336 symbol_number_t *values =
337 (symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
9703cc49 338 for (i = 0; i < nstates; ++i)
29e88316 339 values[i] = states[i]->accessing_symbol;
a49aecd5 340 muscle_insert_symbol_number_table ("stos", values,
5372019f 341 0, 1, nstates);
c3e23647
RS
342}
343
344
6c89f1c1
AD
345/*------------------------------------------------------------------.
346| Decide what to do for each type of token if seen as the lookahead |
347| token in specified state. The value returned is used as the |
348| default action (yydefact) for the state. In addition, actrow is |
349| filled with what to do for each kind of token, index by symbol |
350| number, with zero meaning do the default action. The value |
62a3e4f0 351| SHRT_MIN, a very negative number, means this situation is an |
6c89f1c1
AD
352| error. The parser recognizes this value specially. |
353| |
354| This is where conflicts are resolved. The loop over lookahead |
355| rules considered lower-numbered rules last, and the last rule |
356| considered that likes a token gets to handle it. |
357`------------------------------------------------------------------*/
c3e23647 358
4a120d45 359static int
f9507c28 360action_row (state_t *state)
c3e23647 361{
6c89f1c1 362 int i;
837491d8 363 int default_rule = 0;
f9507c28 364 reductions *redp = state->reductions;
f9507c28
AD
365 shifts *shiftp = state->shifts;
366 errs *errp = state->errs;
837491d8
AD
367 /* set nonzero to inhibit having any default reduction */
368 int nodefault = 0;
c3e23647
RS
369
370 for (i = 0; i < ntokens; i++)
371 actrow[i] = 0;
372
80dac38c 373 if (redp->nreds >= 1)
c3e23647 374 {
837491d8
AD
375 int j;
376 /* loop over all the rules available here which require
377 lookahead */
f9507c28 378 for (i = state->nlookaheads - 1; i >= 0; --i)
837491d8
AD
379 /* and find each token which the rule finds acceptable
380 to come next */
381 for (j = 0; j < ntokens; j++)
382 /* and record this rule as the rule to use if that
383 token follows. */
602bbf31 384 if (bitset_test (LA[state->lookaheadsp + i], j))
b0299a2e 385 actrow[j] = -LArule[state->lookaheadsp + i]->number;
c3e23647
RS
386 }
387
36281465
AD
388 /* Now see which tokens are allowed for shifts in this state. For
389 them, record the shift as the thing to do. So shift is preferred
390 to reduce. */
d954473d 391 for (i = 0; i < shiftp->nshifts; i++)
c3e23647 392 {
a49aecd5 393 symbol_number_t symbol;
837491d8 394 int shift_state = shiftp->shifts[i];
d954473d
AD
395 if (!shift_state)
396 continue;
c3e23647 397
29e88316 398 symbol = states[shift_state]->accessing_symbol;
c3e23647 399
d954473d
AD
400 if (ISVAR (symbol))
401 break;
c3e23647 402
d954473d 403 actrow[symbol] = shift_state;
c3e23647 404
d954473d
AD
405 /* Do not use any default reduction if there is a shift for
406 error */
007a50a4 407 if (symbol == errtoken->number)
d954473d 408 nodefault = 1;
c3e23647
RS
409 }
410
36281465 411 /* See which tokens are an explicit error in this state (due to
62a3e4f0 412 %nonassoc). For them, record SHRT_MIN as the action. */
2cec70b9
AD
413 for (i = 0; i < errp->nerrs; i++)
414 {
415 int symbol = errp->errs[i];
62a3e4f0 416 actrow[symbol] = SHRT_MIN;
2cec70b9 417 }
c3e23647 418
36281465
AD
419 /* Now find the most common reduction and make it the default action
420 for this state. */
c3e23647 421
80dac38c 422 if (redp->nreds >= 1 && !nodefault)
c3e23647 423 {
f9507c28 424 if (state->consistent)
c3e23647
RS
425 default_rule = redp->rules[0];
426 else
427 {
7a5350ba 428 int max = 0;
f9507c28 429 for (i = 0; i < state->nlookaheads; i++)
c3e23647 430 {
7a5350ba 431 int count = 0;
b0299a2e 432 int rule = -LArule[state->lookaheadsp + i]->number;
837491d8 433 int j;
9ee3c97b 434
c3e23647 435 for (j = 0; j < ntokens; j++)
837491d8
AD
436 if (actrow[j] == rule)
437 count++;
9ee3c97b 438
c3e23647
RS
439 if (count > max)
440 {
441 max = count;
442 default_rule = rule;
443 }
444 }
9ee3c97b 445
c3e23647
RS
446 /* actions which match the default are replaced with zero,
447 which means "use the default" */
9ee3c97b 448
c3e23647
RS
449 if (max > 0)
450 {
837491d8 451 int j;
c3e23647 452 for (j = 0; j < ntokens; j++)
837491d8
AD
453 if (actrow[j] == default_rule)
454 actrow[j] = 0;
9ee3c97b 455
ceed8467 456 default_rule = -default_rule;
c3e23647
RS
457 }
458 }
459 }
460
461 /* If have no default rule, the default is an error.
462 So replace any action which says "error" with "use default". */
463
464 if (default_rule == 0)
837491d8 465 for (i = 0; i < ntokens; i++)
62a3e4f0 466 if (actrow[i] == SHRT_MIN)
837491d8 467 actrow[i] = 0;
c3e23647 468
36281465 469 return default_rule;
c3e23647
RS
470}
471
472
4a120d45 473static void
d2729d44 474save_row (int state)
c3e23647 475{
6c89f1c1
AD
476 int i;
477 int count;
478 short *sp;
479 short *sp1;
480 short *sp2;
c3e23647
RS
481
482 count = 0;
483 for (i = 0; i < ntokens; i++)
796d61fb
AD
484 if (actrow[i] != 0)
485 count++;
c3e23647
RS
486
487 if (count == 0)
488 return;
489
d7913476
AD
490 froms[state] = sp1 = sp = XCALLOC (short, count);
491 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
492
493 for (i = 0; i < ntokens; i++)
796d61fb
AD
494 if (actrow[i] != 0)
495 {
496 *sp1++ = i;
497 *sp2++ = actrow[i];
498 }
c3e23647
RS
499
500 tally[state] = count;
501 width[state] = sp1[-1] - sp[0] + 1;
502}
503
504
6c89f1c1
AD
505/*------------------------------------------------------------------.
506| Figure out the actions for the specified state, indexed by |
507| lookahead token type. |
508| |
f2acea59
AD
509| The YYDEFACT table is output now. The detailed info is saved for |
510| putting into YYTABLE later. |
6c89f1c1 511`------------------------------------------------------------------*/
c3e23647 512
4a120d45 513static void
6c89f1c1 514token_actions (void)
c3e23647 515{
602bbf31 516 size_t i;
d7913476 517 short *yydefact = XCALLOC (short, nstates);
c3e23647 518
d7913476 519 actrow = XCALLOC (short, ntokens);
f2acea59 520 for (i = 0; i < nstates; ++i)
c3e23647 521 {
29e88316 522 yydefact[i] = action_row (states[i]);
6c89f1c1 523 save_row (i);
c3e23647 524 }
bbb5bcc6 525
5372019f
AD
526 muscle_insert_short_table ("defact", yydefact,
527 yydefact[0], 1, nstates);
26f609ff 528 XFREE (actrow);
d7913476 529 XFREE (yydefact);
c3e23647
RS
530}
531
532
3f96f4dc
AD
533/*-----------------------------.
534| Output the actions to OOUT. |
535`-----------------------------*/
536
9b3add5b 537void
be2a1a68 538actions_output (FILE *out)
3f96f4dc
AD
539{
540 int rule;
541 for (rule = 1; rule < nrules + 1; ++rule)
1a2b5d37 542 if (rules[rule].action)
3f96f4dc 543 {
ea52d706 544 fprintf (out, " case %d:\n", rule);
3f96f4dc
AD
545
546 if (!no_lines_flag)
ea52d706 547 fprintf (out, muscle_find ("linef"),
1a2b5d37 548 rules[rule].action_line,
ea52d706
AD
549 quotearg_style (c_quoting_style,
550 muscle_find ("filename")));
3f96f4dc
AD
551 /* As a Bison extension, add the ending semicolon. Since some
552 Yacc don't do that, help people using bison as a Yacc
553 finding their missing semicolons. */
ea52d706 554 fprintf (out, "{ %s%s }\n break;\n\n",
1a2b5d37 555 rules[rule].action,
ea52d706 556 yacc_flag ? ";" : "");
3f96f4dc
AD
557 }
558}
559
560
091e20bb
AD
561/*---------------------------------------.
562| Output the tokens definition to OOUT. |
563`---------------------------------------*/
564
9b3add5b 565void
be2a1a68 566token_definitions_output (FILE *out)
091e20bb
AD
567{
568 int i;
0d8bed56 569 int first = 1;
091e20bb
AD
570 for (i = 0; i < ntokens; ++i)
571 {
db8837cb 572 symbol_t *symbol = symbols[i];
091e20bb
AD
573 int number = symbol->user_token_number;
574
b87f8b21
AD
575 /* At this stage, if there are literal aliases, they are part of
576 SYMBOLS, so we should not find symbols which are the aliases
577 here. */
578 assert (number != USER_NUMBER_ALIAS);
579
091e20bb 580 /* Skip error token. */
007a50a4 581 if (symbol == errtoken)
091e20bb 582 continue;
b87f8b21
AD
583
584 /* If this string has an alias, then it is necessarily the alias
585 which is to be output. */
586 if (symbol->alias)
587 symbol = symbol->alias;
588
589 /* Don't output literal chars or strings (when defined only as a
590 string). Note that must be done after the alias resolution:
591 think about `%token 'f' "f"'. */
592 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
593 continue;
091e20bb
AD
594
595 /* Don't #define nonliteral tokens whose names contain periods
596 or '$' (as does the default value of the EOF token). */
597 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
598 continue;
599
83ccf991 600 fprintf (out, "%s[[[%s]], [%d]]",
0d8bed56 601 first ? "" : ",\n", symbol->tag, number);
b87f8b21 602
0d8bed56 603 first = 0;
091e20bb
AD
604 }
605}
606
607
4a120d45 608static void
d2729d44 609save_column (int symbol, int default_state)
c3e23647 610{
6c89f1c1 611 int i;
6c89f1c1
AD
612 short *sp;
613 short *sp1;
614 short *sp2;
615 int count;
837491d8 616 int symno = symbol - ntokens + nstates;
c3e23647 617
43591cec
AD
618 short begin = goto_map[symbol];
619 short end = goto_map[symbol + 1];
c3e23647
RS
620
621 count = 0;
43591cec 622 for (i = begin; i < end; i++)
796d61fb
AD
623 if (to_state[i] != default_state)
624 count++;
c3e23647
RS
625
626 if (count == 0)
627 return;
628
d7913476
AD
629 froms[symno] = sp1 = sp = XCALLOC (short, count);
630 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 631
43591cec 632 for (i = begin; i < end; i++)
796d61fb
AD
633 if (to_state[i] != default_state)
634 {
635 *sp1++ = from_state[i];
636 *sp2++ = to_state[i];
637 }
c3e23647
RS
638
639 tally[symno] = count;
640 width[symno] = sp1[-1] - sp[0] + 1;
641}
642
6c89f1c1
AD
643static int
644default_goto (int symbol)
645{
602bbf31
AD
646 size_t i;
647 size_t m = goto_map[symbol];
648 size_t n = goto_map[symbol + 1];
837491d8
AD
649 int default_state = -1;
650 int max = 0;
6c89f1c1
AD
651
652 if (m == n)
653 return -1;
654
655 for (i = 0; i < nstates; i++)
656 state_count[i] = 0;
657
658 for (i = m; i < n; i++)
659 state_count[to_state[i]]++;
660
6c89f1c1 661 for (i = 0; i < nstates; i++)
796d61fb
AD
662 if (state_count[i] > max)
663 {
664 max = state_count[i];
665 default_state = i;
666 }
6c89f1c1
AD
667
668 return default_state;
669}
670
671
672/*-------------------------------------------------------------------.
673| Figure out what to do after reducing with each rule, depending on |
674| the saved state from before the beginning of parsing the data that |
675| matched this rule. |
676| |
677| The YYDEFGOTO table is output now. The detailed info is saved for |
678| putting into YYTABLE later. |
679`-------------------------------------------------------------------*/
680
681static void
682goto_actions (void)
683{
43591cec 684 int i;
bbb5bcc6 685 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 686
26f609ff 687 state_count = XCALLOC (short, nstates);
43591cec 688 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 689 {
43591cec
AD
690 int default_state = default_goto (i);
691 save_column (i, default_state);
692 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
693 }
694
5372019f
AD
695 muscle_insert_short_table ("defgoto", yydefgoto,
696 yydefgoto[0], 1, nsyms - ntokens);
d7913476 697 XFREE (state_count);
43591cec 698 XFREE (yydefgoto);
6c89f1c1 699}
c3e23647
RS
700
701
9ee3c97b
AD
702/* The next few functions decide how to pack the actions and gotos
703 information into yytable. */
c3e23647 704
4a120d45 705static void
d2729d44 706sort_actions (void)
c3e23647 707{
6c89f1c1 708 int i;
c3e23647 709
d7913476 710 order = XCALLOC (short, nvectors);
c3e23647
RS
711 nentries = 0;
712
713 for (i = 0; i < nvectors; i++)
796d61fb
AD
714 if (tally[i] > 0)
715 {
837491d8
AD
716 int k;
717 int t = tally[i];
718 int w = width[i];
719 int j = nentries - 1;
c3e23647 720
796d61fb
AD
721 while (j >= 0 && (width[order[j]] < w))
722 j--;
c3e23647 723
796d61fb
AD
724 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
725 j--;
c3e23647 726
796d61fb
AD
727 for (k = nentries - 1; k > j; k--)
728 order[k + 1] = order[k];
c3e23647 729
796d61fb
AD
730 order[j + 1] = i;
731 nentries++;
732 }
c3e23647
RS
733}
734
735
4a120d45 736static int
d2729d44 737matching_state (int vector)
c3e23647 738{
837491d8 739 int i = order[vector];
6c89f1c1
AD
740 int t;
741 int w;
6c89f1c1 742 int prev;
c3e23647 743
602bbf31 744 if (i >= (int) nstates)
36281465 745 return -1;
c3e23647
RS
746
747 t = tally[i];
748 w = width[i];
749
750 for (prev = vector - 1; prev >= 0; prev--)
751 {
837491d8
AD
752 int j = order[prev];
753 int k;
754 int match = 1;
755
c3e23647 756 if (width[j] != w || tally[j] != t)
36281465 757 return -1;
c3e23647 758
c3e23647 759 for (k = 0; match && k < t; k++)
796d61fb
AD
760 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
761 match = 0;
c3e23647
RS
762
763 if (match)
36281465 764 return j;
c3e23647
RS
765 }
766
36281465 767 return -1;
c3e23647
RS
768}
769
770
4a120d45 771static int
d2729d44 772pack_vector (int vector)
c3e23647 773{
837491d8 774 int i = order[vector];
6c89f1c1 775 int j;
837491d8 776 int t = tally[i];
6c89f1c1 777 int loc = 0;
837491d8
AD
778 short *from = froms[i];
779 short *to = tos[i];
c3e23647 780
340ef489 781 assert (t);
c3e23647 782
133c20e2 783 for (j = lowzero - from[0]; j < (int) table_size; j++)
c3e23647 784 {
837491d8
AD
785 int k;
786 int ok = 1;
c3e23647
RS
787
788 for (k = 0; ok && k < t; k++)
789 {
790 loc = j + from[k];
133c20e2
AD
791 if (loc > (int) table_size)
792 table_grow (loc);
c3e23647
RS
793
794 if (table[loc] != 0)
795 ok = 0;
796 }
797
798 for (k = 0; ok && k < vector; k++)
796d61fb
AD
799 if (pos[k] == j)
800 ok = 0;
c3e23647
RS
801
802 if (ok)
803 {
804 for (k = 0; k < t; k++)
805 {
806 loc = j + from[k];
807 table[loc] = to[k];
808 check[loc] = from[k];
809 }
810
811 while (table[lowzero] != 0)
812 lowzero++;
813
814 if (loc > high)
815 high = loc;
816
36281465 817 return j;
c3e23647
RS
818 }
819 }
275fc3ad
AD
820#define pack_vector_succeeded 0
821 assert (pack_vector_succeeded);
3843c413 822 return 0;
c3e23647
RS
823}
824
825
6c89f1c1
AD
826static void
827pack_table (void)
828{
829 int i;
830 int place;
831 int state;
832
d7913476
AD
833 base = XCALLOC (short, nvectors);
834 pos = XCALLOC (short, nentries);
133c20e2
AD
835 table = XCALLOC (short, table_size);
836 check = XCALLOC (short, table_size);
6c89f1c1
AD
837
838 lowzero = 0;
839 high = 0;
840
841 for (i = 0; i < nvectors; i++)
62a3e4f0 842 base[i] = SHRT_MIN;
6c89f1c1 843
133c20e2 844 for (i = 0; i < (int) table_size; i++)
6c89f1c1
AD
845 check[i] = -1;
846
847 for (i = 0; i < nentries; i++)
848 {
849 state = matching_state (i);
850
851 if (state < 0)
852 place = pack_vector (i);
853 else
854 place = base[state];
855
856 pos[i] = place;
857 base[order[i]] = place;
858 }
859
860 for (i = 0; i < nvectors; i++)
861 {
796d61fb
AD
862 XFREE (froms[i]);
863 XFREE (tos[i]);
6c89f1c1
AD
864 }
865
d7913476
AD
866 XFREE (froms);
867 XFREE (tos);
868 XFREE (pos);
6c89f1c1 869}
c3e23647
RS
870
871/* the following functions output yytable, yycheck
872 and the vectors whose elements index the portion starts */
873
4a120d45 874static void
d2729d44 875output_base (void)
c3e23647 876{
26f609ff 877 /* Output pact. */
5372019f
AD
878 muscle_insert_short_table ("pact", base,
879 base[0], 1, nstates);
c3e23647 880
26f609ff 881 /* Output pgoto. */
5372019f
AD
882 muscle_insert_short_table ("pgoto", base,
883 base[nstates], nstates + 1, nvectors);
d7913476 884 XFREE (base);
c3e23647
RS
885}
886
887
4a120d45 888static void
d2729d44 889output_table (void)
c3e23647 890{
5372019f
AD
891 muscle_insert_short_table ("table", table,
892 table[0], 1, high + 1);
d7913476 893 XFREE (table);
c3e23647
RS
894}
895
896
4a120d45 897static void
d2729d44 898output_check (void)
c3e23647 899{
5372019f
AD
900 muscle_insert_short_table ("check", check,
901 check[0], 1, high + 1);
d7913476 902 XFREE (check);
c3e23647
RS
903}
904
b0940840
AD
905/*-----------------------------------------------------------------.
906| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
907| and yycheck. |
908`-----------------------------------------------------------------*/
6c89f1c1
AD
909
910static void
911output_actions (void)
912{
602bbf31 913 size_t i;
6c89f1c1 914 nvectors = nstates + nvars;
c3e23647 915
d7913476
AD
916 froms = XCALLOC (short *, nvectors);
917 tos = XCALLOC (short *, nvectors);
918 tally = XCALLOC (short, nvectors);
919 width = XCALLOC (short, nvectors);
6c89f1c1
AD
920
921 token_actions ();
914feea9 922 bitsetv_free (LA);
b0299a2e 923 free (LArule);
6c89f1c1
AD
924
925 goto_actions ();
d7913476
AD
926 XFREE (goto_map + ntokens);
927 XFREE (from_state);
928 XFREE (to_state);
6c89f1c1
AD
929
930 sort_actions ();
931 pack_table ();
4e5caae2 932
6c89f1c1
AD
933 output_base ();
934 output_table ();
4e5caae2 935
6c89f1c1 936 output_check ();
49701457
AD
937
938 for (i = 0; i < nstates; ++i)
939 {
29e88316
AD
940 free (states[i]->shifts);
941 XFREE (states[i]->reductions);
942 free (states[i]->errs);
943 free (states[i]);
49701457 944 }
29e88316 945 XFREE (states);
6c89f1c1 946}
c3e23647 947
652def80 948\f
1239777d
AD
949/*---------------------------.
950| Call the skeleton parser. |
951`---------------------------*/
c3e23647 952
4a120d45 953static void
1239777d 954output_skeleton (void)
9b3add5b 955{
be2a1a68 956 /* Store the definition of all the muscles. */
d0039cbc 957 const char *tempdir = getenv ("TMPDIR");
381fb12e
AD
958 char *tempfile = NULL;
959 FILE *out = NULL;
381fb12e
AD
960 int fd;
961
962 if (tempdir == NULL)
963 tempdir = DEFAULT_TMPDIR;
964 tempfile = xmalloc (strlen (tempdir) + 11);
965 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
966 fd = mkstemp (tempfile);
967 if (fd == -1)
968 error (EXIT_FAILURE, errno, "%s", tempfile);
969
970 out = fdopen (fd, "w");
971 if (out == NULL)
972 error (EXIT_FAILURE, errno, "%s", tempfile);
973
974 /* There are no comments, especially not `#': we do want M4 expansion
975 after `#': think of CPP macros! */
976 fputs ("m4_changecom()\n", out);
977 fputs ("m4_init()\n", out);
978
979 fputs ("m4_define([b4_actions], \n[[", out);
980 actions_output (out);
981 fputs ("]])\n\n", out);
982
0d8bed56 983 fputs ("m4_define([b4_tokens], \n[", out);
381fb12e 984 token_definitions_output (out);
0d8bed56 985 fputs ("])\n\n", out);
be2a1a68 986
381fb12e 987 muscles_m4_output (out);
be2a1a68 988
381fb12e
AD
989 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
990 fputs ("m4_divert_push(0)dnl\n", out);
991 xfclose (out);
be2a1a68
AD
992
993 /* Invoke m4 on the definition of the muscles, and the skeleton. */
994 {
995 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
abe017f6 996 const char *m4 = getenv ("M4");
7067cb36
PH
997 int pkg_data_len;
998 char *full_skeleton;
999
abe017f6
AD
1000 if (!m4)
1001 m4 = M4;
be2a1a68
AD
1002 if (!bison_pkgdatadir)
1003 bison_pkgdatadir = PKGDATADIR;
7067cb36 1004 pkg_data_len = strlen (bison_pkgdatadir);
670ddffd 1005 full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
7067cb36
PH
1006 if (bison_pkgdatadir[pkg_data_len-1] == '/')
1007 sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
1008 else
1009 sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
381fb12e
AD
1010 if (trace_flag)
1011 fprintf (stderr,
abe017f6 1012 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
7067cb36 1013 m4, bison_pkgdatadir, tempfile, full_skeleton);
abe017f6
AD
1014 skel_in = readpipe (m4,
1015 "-I", bison_pkgdatadir,
be2a1a68 1016 "m4sugar/m4sugar.m4",
381fb12e 1017 tempfile,
7067cb36 1018 full_skeleton,
be2a1a68 1019 NULL);
7067cb36 1020 XFREE (full_skeleton);
be2a1a68
AD
1021 if (!skel_in)
1022 error (EXIT_FAILURE, errno, "cannot run m4");
1023 skel_lex ();
381fb12e
AD
1024
1025 /* If `debugging', keep this file alive. */
1026 if (!trace_flag)
1027 unlink (tempfile);
be2a1a68 1028 }
26f609ff
RA
1029}
1030
1031static void
1032prepare (void)
1033{
11d82f03 1034 MUSCLE_INSERT_INT ("last", high);
62a3e4f0 1035 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
11d82f03
MA
1036 MUSCLE_INSERT_INT ("pure", pure_parser);
1037 MUSCLE_INSERT_INT ("nsym", nsyms);
1038 MUSCLE_INSERT_INT ("debug", debug_flag);
1039 MUSCLE_INSERT_INT ("final", final_state);
007a50a4
AD
1040 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1041 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
be2a1a68 1042 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
b5b61c61 1043 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
11d82f03 1044
b85810ae
AD
1045 /* FIXME: This is wrong: the muscles should decide whether they hold
1046 a copy or not, but the situation is too obscure currently. */
be2a1a68
AD
1047 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1048 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1049 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1050 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
b85810ae 1051
11d82f03
MA
1052 MUSCLE_INSERT_INT ("nnts", nvars);
1053 MUSCLE_INSERT_INT ("nrules", nrules);
1054 MUSCLE_INSERT_INT ("nstates", nstates);
1055 MUSCLE_INSERT_INT ("ntokens", ntokens);
1056
be2a1a68
AD
1057 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1058 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
381fb12e
AD
1059
1060 /* Copy definitions in directive. */
0dd1580a
RA
1061 obstack_1grow (&pre_prologue_obstack, 0);
1062 obstack_1grow (&post_prologue_obstack, 0);
1063 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1064 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
381fb12e
AD
1065
1066 /* Find the right skeleton file. */
1067 if (!skeleton)
fdbcd8e2 1068 skeleton = "bison.simple";
381fb12e
AD
1069
1070 /* Parse the skeleton file and output the needed parsers. */
1071 muscle_insert ("skeleton", skeleton);
26f609ff 1072}
c3e23647 1073
93ede233 1074
6c89f1c1
AD
1075/*----------------------------------------------------------.
1076| Output the parsing tables and the parser code to ftable. |
1077`----------------------------------------------------------*/
c3e23647 1078
6c89f1c1
AD
1079void
1080output (void)
1081{
f87685c3 1082 obstack_init (&format_obstack);
dd60faec 1083
b0940840
AD
1084 prepare_tokens ();
1085 prepare_rules ();
1086 prepare_states ();
6c89f1c1 1087 output_actions ();
342b8b6e 1088
26f609ff 1089 prepare ();
652def80 1090
9b3add5b
RA
1091 /* Process the selected skeleton file. */
1092 output_skeleton ();
1093
f499b062
AD
1094 obstack_free (&muscle_obstack, NULL);
1095 obstack_free (&format_obstack, NULL);
1096 obstack_free (&action_obstack, NULL);
0dd1580a
RA
1097 obstack_free (&pre_prologue_obstack, NULL);
1098 obstack_free (&post_prologue_obstack, NULL);
c3e23647 1099}