]> git.saurik.com Git - bison.git/blame - src/output.c
* data/bison.simple, data/bison.c++: Rename as...
[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
f87685c3 135static struct obstack format_obstack;
c3e23647 136
c7925b99
MA
137int error_verbose = 0;
138
f0440388 139
133c20e2
AD
140/*----------------------------------------------------------------.
141| If TABLE (and CHECK) appear to be small to be addressed at |
142| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
143| the desired size is at least DESIRED + 1. |
144`----------------------------------------------------------------*/
145
146static void
147table_grow (size_t desired)
148{
149 size_t old_size = table_size;
150
151 while (table_size <= desired)
152 table_size *= 2;
153
154 if (trace_flag)
155 fprintf (stderr, "growing table and check from: %d to %d\n",
156 old_size, table_size);
157
158 table = XREALLOC (table, short, table_size);
159 check = XREALLOC (check, short, table_size);
160
161 for (/* Nothing. */; old_size < table_size; ++old_size)
162 {
163 table[old_size] = 0;
164 check[old_size] = -1;
165 }
166}
167
168
5372019f
AD
169/*-------------------------------------------------------------------.
170| Create a function NAME which associates to the muscle NAME the |
171| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
172| TYPE), and to the muscle NAME_max, the max value of the |
173| TABLE_DATA. |
174`-------------------------------------------------------------------*/
62a3e4f0 175
62a3e4f0 176
5372019f 177#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 178 \
5372019f
AD
179static void \
180Name (const char *name, \
5fbb0954
AD
181 Type *table_data, \
182 Type first, \
183 int begin, \
184 int end) \
185{ \
0c2d3f4c 186 Type max = first; \
5fbb0954
AD
187 int i; \
188 int j = 1; \
189 \
5372019f 190 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
191 for (i = begin; i < end; ++i) \
192 { \
5372019f 193 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
194 if (j >= 10) \
195 { \
5372019f 196 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
197 j = 1; \
198 } \
199 else \
200 ++j; \
5372019f 201 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
5fbb0954
AD
202 if (table_data[i] > max) \
203 max = table_data[i]; \
204 } \
5372019f
AD
205 obstack_1grow (&format_obstack, 0); \
206 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 207 \
5372019f
AD
208 /* Build `NAME_max' in the obstack. */ \
209 obstack_fgrow1 (&format_obstack, "%s_max", name); \
210 obstack_1grow (&format_obstack, 0); \
0c2d3f4c
AD
211 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
212 (long int) max); \
62a3e4f0
AD
213}
214
5372019f
AD
215GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
216GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
a49aecd5 217GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
5372019f 218GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
c3e23647
RS
219
220
b0940840
AD
221/*-----------------------------------------------------------------.
222| Prepare the muscles related to the tokens: translate, tname, and |
223| toknum. |
224`-----------------------------------------------------------------*/
225
4a120d45 226static void
b0940840 227prepare_tokens (void)
c3e23647 228{
a49aecd5 229 muscle_insert_symbol_number_table ("translate",
5372019f
AD
230 token_translations,
231 0, 1, max_user_token_number + 1);
c3e23647 232
b0940840
AD
233 {
234 int i;
235 int j = 0;
236 for (i = 0; i < nsyms; i++)
237 {
6b98e4b5
AD
238 /* Be sure not to use twice the same QUOTEARG slot:
239 SYMBOL_TAG_GET uses slot 0. */
b0940840
AD
240 const char *cp =
241 quotearg_n_style (1, c_quoting_style,
6b98e4b5 242 symbol_tag_get (symbols[i]));
b0940840
AD
243 /* Width of the next token, including the two quotes, the coma
244 and the space. */
245 int strsize = strlen (cp) + 2;
246
247 if (j + strsize > 75)
248 {
249 obstack_sgrow (&format_obstack, "\n ");
250 j = 2;
251 }
252
253 obstack_sgrow (&format_obstack, cp);
254 obstack_sgrow (&format_obstack, ", ");
255 j += strsize;
256 }
257 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
258 defined). */
259 obstack_sgrow (&format_obstack, "0");
c3e23647 260
b0940840
AD
261 /* Finish table and store. */
262 obstack_1grow (&format_obstack, 0);
263 muscle_insert ("tname", obstack_finish (&format_obstack));
264 }
265
266 /* Output YYTOKNUM. */
b2ed6e58
AD
267 {
268 int i;
b0940840
AD
269 short *values = XCALLOC (short, ntokens + 1);
270 for (i = 0; i < ntokens + 1; ++i)
271 values[i] = symbols[i]->user_token_number;
5372019f
AD
272 muscle_insert_short_table ("toknum", values,
273 0, 1, ntokens + 1);
b0940840 274 free (values);
b2ed6e58 275 }
b0940840 276}
b2ed6e58 277
b0940840
AD
278
279/*-------------------------------------------------------------.
280| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
281| rline. |
282`-------------------------------------------------------------*/
283
284static void
285prepare_rules (void)
286{
b0940840 287 int r;
5df5f6d5 288 unsigned int i = 0;
62a3e4f0 289 item_number_t *rhs = XMALLOC (item_number_t, nritems);
5df5f6d5
AD
290 unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
291 unsigned int *rline = XMALLOC (unsigned int, nrules + 1);
a49aecd5 292 symbol_number_t *r1 = XMALLOC (symbol_number_t, nrules + 1);
5df5f6d5 293 unsigned int *r2 = XMALLOC (unsigned int, nrules + 1);
b0940840
AD
294
295 for (r = 1; r < nrules + 1; ++r)
296 {
5df5f6d5 297 item_number_t *rhsp;
b0940840
AD
298 /* Index of rule R in RHS. */
299 prhs[r] = i;
300 /* RHS of the rule R. */
301 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
302 rhs[i++] = *rhsp;
303 /* LHS of the rule R. */
304 r1[r] = rules[r].lhs->number;
305 /* Length of rule R's RHS. */
306 r2[r] = i - prhs[r];
307 /* Separator in RHS. */
308 rhs[i++] = -1;
309 /* Line where rule was defined. */
8efe435c 310 rline[r] = rules[r].location.first_line;
b0940840
AD
311 }
312 assert (i == nritems);
313
5372019f
AD
314 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
315 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 1, nrules + 1);
316 muscle_insert_unsigned_int_table ("rline", rline, 0, 1, nrules + 1);
a49aecd5 317 muscle_insert_symbol_number_table ("r1", r1, 0, 1, nrules + 1);
5372019f 318 muscle_insert_unsigned_int_table ("r2", r2, 0, 1, nrules + 1);
796d61fb 319
b0940840
AD
320 free (rhs);
321 free (prhs);
5df5f6d5
AD
322 free (rline);
323 free (r1);
b0940840 324 free (r2);
c3e23647
RS
325}
326
b0940840
AD
327/*--------------------------------------------.
328| Prepare the muscles related to the states. |
329`--------------------------------------------*/
c3e23647 330
4a120d45 331static void
b0940840 332prepare_states (void)
c3e23647 333{
602bbf31 334 size_t i;
a49aecd5
AD
335 symbol_number_t *values =
336 (symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
9703cc49 337 for (i = 0; i < nstates; ++i)
29e88316 338 values[i] = states[i]->accessing_symbol;
a49aecd5 339 muscle_insert_symbol_number_table ("stos", values,
5372019f 340 0, 1, nstates);
c3e23647
RS
341}
342
343
6c89f1c1
AD
344/*------------------------------------------------------------------.
345| Decide what to do for each type of token if seen as the lookahead |
346| token in specified state. The value returned is used as the |
347| default action (yydefact) for the state. In addition, actrow is |
348| filled with what to do for each kind of token, index by symbol |
349| number, with zero meaning do the default action. The value |
62a3e4f0 350| SHRT_MIN, a very negative number, means this situation is an |
6c89f1c1
AD
351| error. The parser recognizes this value specially. |
352| |
353| This is where conflicts are resolved. The loop over lookahead |
354| rules considered lower-numbered rules last, and the last rule |
355| considered that likes a token gets to handle it. |
356`------------------------------------------------------------------*/
c3e23647 357
4a120d45 358static int
f9507c28 359action_row (state_t *state)
c3e23647 360{
6c89f1c1 361 int i;
837491d8 362 int default_rule = 0;
f9507c28 363 reductions *redp = state->reductions;
f9507c28
AD
364 shifts *shiftp = state->shifts;
365 errs *errp = state->errs;
837491d8
AD
366 /* set nonzero to inhibit having any default reduction */
367 int nodefault = 0;
c3e23647
RS
368
369 for (i = 0; i < ntokens; i++)
370 actrow[i] = 0;
371
80dac38c 372 if (redp->nreds >= 1)
c3e23647 373 {
837491d8
AD
374 int j;
375 /* loop over all the rules available here which require
376 lookahead */
f9507c28 377 for (i = state->nlookaheads - 1; i >= 0; --i)
837491d8
AD
378 /* and find each token which the rule finds acceptable
379 to come next */
380 for (j = 0; j < ntokens; j++)
381 /* and record this rule as the rule to use if that
382 token follows. */
c0263492
AD
383 if (bitset_test (state->lookaheads[i], j))
384 actrow[j] = -state->lookaheads_rule[i]->number;
c3e23647
RS
385 }
386
36281465
AD
387 /* Now see which tokens are allowed for shifts in this state. For
388 them, record the shift as the thing to do. So shift is preferred
389 to reduce. */
d954473d 390 for (i = 0; i < shiftp->nshifts; i++)
c3e23647 391 {
a49aecd5 392 symbol_number_t symbol;
837491d8 393 int shift_state = shiftp->shifts[i];
d954473d
AD
394 if (!shift_state)
395 continue;
c3e23647 396
29e88316 397 symbol = states[shift_state]->accessing_symbol;
c3e23647 398
d954473d
AD
399 if (ISVAR (symbol))
400 break;
c3e23647 401
d954473d 402 actrow[symbol] = shift_state;
c3e23647 403
d954473d
AD
404 /* Do not use any default reduction if there is a shift for
405 error */
007a50a4 406 if (symbol == errtoken->number)
d954473d 407 nodefault = 1;
c3e23647
RS
408 }
409
36281465 410 /* See which tokens are an explicit error in this state (due to
62a3e4f0 411 %nonassoc). For them, record SHRT_MIN as the action. */
2cec70b9
AD
412 for (i = 0; i < errp->nerrs; i++)
413 {
414 int symbol = errp->errs[i];
62a3e4f0 415 actrow[symbol] = SHRT_MIN;
2cec70b9 416 }
c3e23647 417
36281465
AD
418 /* Now find the most common reduction and make it the default action
419 for this state. */
c3e23647 420
80dac38c 421 if (redp->nreds >= 1 && !nodefault)
c3e23647 422 {
f9507c28 423 if (state->consistent)
c3e23647
RS
424 default_rule = redp->rules[0];
425 else
426 {
7a5350ba 427 int max = 0;
f9507c28 428 for (i = 0; i < state->nlookaheads; i++)
c3e23647 429 {
7a5350ba 430 int count = 0;
c0263492 431 int rule = -state->lookaheads_rule[i]->number;
837491d8 432 int j;
9ee3c97b 433
c3e23647 434 for (j = 0; j < ntokens; j++)
837491d8
AD
435 if (actrow[j] == rule)
436 count++;
9ee3c97b 437
c3e23647
RS
438 if (count > max)
439 {
440 max = count;
441 default_rule = rule;
442 }
443 }
9ee3c97b 444
c3e23647
RS
445 /* actions which match the default are replaced with zero,
446 which means "use the default" */
9ee3c97b 447
c3e23647
RS
448 if (max > 0)
449 {
837491d8 450 int j;
c3e23647 451 for (j = 0; j < ntokens; j++)
837491d8
AD
452 if (actrow[j] == default_rule)
453 actrow[j] = 0;
9ee3c97b 454
ceed8467 455 default_rule = -default_rule;
c3e23647
RS
456 }
457 }
458 }
459
460 /* If have no default rule, the default is an error.
461 So replace any action which says "error" with "use default". */
462
463 if (default_rule == 0)
837491d8 464 for (i = 0; i < ntokens; i++)
62a3e4f0 465 if (actrow[i] == SHRT_MIN)
837491d8 466 actrow[i] = 0;
c3e23647 467
36281465 468 return default_rule;
c3e23647
RS
469}
470
471
4a120d45 472static void
d2729d44 473save_row (int state)
c3e23647 474{
6c89f1c1
AD
475 int i;
476 int count;
477 short *sp;
478 short *sp1;
479 short *sp2;
c3e23647
RS
480
481 count = 0;
482 for (i = 0; i < ntokens; i++)
796d61fb
AD
483 if (actrow[i] != 0)
484 count++;
c3e23647
RS
485
486 if (count == 0)
487 return;
488
d7913476
AD
489 froms[state] = sp1 = sp = XCALLOC (short, count);
490 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
491
492 for (i = 0; i < ntokens; i++)
796d61fb
AD
493 if (actrow[i] != 0)
494 {
495 *sp1++ = i;
496 *sp2++ = actrow[i];
497 }
c3e23647
RS
498
499 tally[state] = count;
500 width[state] = sp1[-1] - sp[0] + 1;
501}
502
503
6c89f1c1
AD
504/*------------------------------------------------------------------.
505| Figure out the actions for the specified state, indexed by |
506| lookahead token type. |
507| |
f2acea59
AD
508| The YYDEFACT table is output now. The detailed info is saved for |
509| putting into YYTABLE later. |
6c89f1c1 510`------------------------------------------------------------------*/
c3e23647 511
4a120d45 512static void
6c89f1c1 513token_actions (void)
c3e23647 514{
602bbf31 515 size_t i;
d7913476 516 short *yydefact = XCALLOC (short, nstates);
c3e23647 517
d7913476 518 actrow = XCALLOC (short, ntokens);
f2acea59 519 for (i = 0; i < nstates; ++i)
c3e23647 520 {
29e88316 521 yydefact[i] = action_row (states[i]);
6c89f1c1 522 save_row (i);
c3e23647 523 }
bbb5bcc6 524
5372019f
AD
525 muscle_insert_short_table ("defact", yydefact,
526 yydefact[0], 1, nstates);
26f609ff 527 XFREE (actrow);
d7913476 528 XFREE (yydefact);
c3e23647
RS
529}
530
531
3f96f4dc
AD
532/*-----------------------------.
533| Output the actions to OOUT. |
534`-----------------------------*/
535
9b3add5b 536void
be2a1a68 537actions_output (FILE *out)
3f96f4dc
AD
538{
539 int rule;
dafdc66f
AD
540
541 fputs ("m4_define([b4_actions], \n[[", out);
3f96f4dc 542 for (rule = 1; rule < nrules + 1; ++rule)
1a2b5d37 543 if (rules[rule].action)
3f96f4dc 544 {
ea52d706 545 fprintf (out, " case %d:\n", rule);
3f96f4dc
AD
546
547 if (!no_lines_flag)
ea52d706 548 fprintf (out, muscle_find ("linef"),
8efe435c 549 rules[rule].action_location.first_line,
ea52d706
AD
550 quotearg_style (c_quoting_style,
551 muscle_find ("filename")));
e9955c83
AD
552 fprintf (out, " %s\n break;\n\n",
553 rules[rule].action);
3f96f4dc 554 }
dafdc66f 555 fputs ("]])\n\n", out);
3f96f4dc
AD
556}
557
558
091e20bb
AD
559/*---------------------------------------.
560| Output the tokens definition to OOUT. |
561`---------------------------------------*/
562
9b3add5b 563void
be2a1a68 564token_definitions_output (FILE *out)
091e20bb
AD
565{
566 int i;
0d8bed56 567 int first = 1;
dafdc66f
AD
568
569 fputs ("m4_define([b4_tokens], \n[", out);
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 604 }
dafdc66f 605 fputs ("])\n\n", out);
091e20bb
AD
606}
607
608
9280d3ef
AD
609/*----------------------------------------.
610| Output the symbol destructors to OOUT. |
611`----------------------------------------*/
612
613static void
614symbol_destructors_output (FILE *out)
615{
616 int i;
617 int first = 1;
618
619 fputs ("m4_define([b4_symbol_destructors], \n[", out);
620 for (i = 0; i < nsyms; ++i)
621 if (symbols[i]->destructor)
622 {
623 symbol_t *symbol = symbols[i];
624
24c0aad7
AD
625 /* Filename, lineno,
626 Symbol-name, Symbol-number,
627 destructor, typename. */
628 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
9280d3ef 629 first ? "" : ",\n",
24c0aad7
AD
630 infile, symbol->destructor_location.first_line,
631 symbol_tag_get (symbol),
632 symbol->number,
633 symbol->destructor,
634 symbol->type_name);
9280d3ef
AD
635
636 first = 0;
637 }
638 fputs ("])\n\n", out);
639}
640
641
366eea36
AD
642/*-------------------------------------.
643| Output the symbol printers to OOUT. |
644`-------------------------------------*/
645
646static void
647symbol_printers_output (FILE *out)
648{
649 int i;
650 int first = 1;
651
652 fputs ("m4_define([b4_symbol_printers], \n[", out);
653 for (i = 0; i < nsyms; ++i)
654 if (symbols[i]->destructor)
655 {
656 symbol_t *symbol = symbols[i];
657
658 /* Filename, lineno,
659 Symbol-name, Symbol-number,
660 destructor, typename. */
661 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
662 first ? "" : ",\n",
663 infile, symbol->printer_location.first_line,
664 symbol_tag_get (symbol),
665 symbol->number,
666 symbol->printer,
667 symbol->type_name);
668
669 first = 0;
670 }
671 fputs ("])\n\n", out);
672}
673
674
4a120d45 675static void
d2729d44 676save_column (int symbol, int default_state)
c3e23647 677{
6c89f1c1 678 int i;
6c89f1c1
AD
679 short *sp;
680 short *sp1;
681 short *sp2;
682 int count;
837491d8 683 int symno = symbol - ntokens + nstates;
c3e23647 684
43591cec
AD
685 short begin = goto_map[symbol];
686 short end = goto_map[symbol + 1];
c3e23647
RS
687
688 count = 0;
43591cec 689 for (i = begin; i < end; i++)
796d61fb
AD
690 if (to_state[i] != default_state)
691 count++;
c3e23647
RS
692
693 if (count == 0)
694 return;
695
d7913476
AD
696 froms[symno] = sp1 = sp = XCALLOC (short, count);
697 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 698
43591cec 699 for (i = begin; i < end; i++)
796d61fb
AD
700 if (to_state[i] != default_state)
701 {
702 *sp1++ = from_state[i];
703 *sp2++ = to_state[i];
704 }
c3e23647
RS
705
706 tally[symno] = count;
707 width[symno] = sp1[-1] - sp[0] + 1;
708}
709
6c89f1c1
AD
710static int
711default_goto (int symbol)
712{
602bbf31
AD
713 size_t i;
714 size_t m = goto_map[symbol];
715 size_t n = goto_map[symbol + 1];
837491d8
AD
716 int default_state = -1;
717 int max = 0;
6c89f1c1
AD
718
719 if (m == n)
720 return -1;
721
722 for (i = 0; i < nstates; i++)
723 state_count[i] = 0;
724
725 for (i = m; i < n; i++)
726 state_count[to_state[i]]++;
727
6c89f1c1 728 for (i = 0; i < nstates; i++)
796d61fb
AD
729 if (state_count[i] > max)
730 {
731 max = state_count[i];
732 default_state = i;
733 }
6c89f1c1
AD
734
735 return default_state;
736}
737
738
739/*-------------------------------------------------------------------.
740| Figure out what to do after reducing with each rule, depending on |
741| the saved state from before the beginning of parsing the data that |
742| matched this rule. |
743| |
744| The YYDEFGOTO table is output now. The detailed info is saved for |
745| putting into YYTABLE later. |
746`-------------------------------------------------------------------*/
747
748static void
749goto_actions (void)
750{
43591cec 751 int i;
bbb5bcc6 752 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 753
26f609ff 754 state_count = XCALLOC (short, nstates);
43591cec 755 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 756 {
43591cec
AD
757 int default_state = default_goto (i);
758 save_column (i, default_state);
759 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
760 }
761
5372019f
AD
762 muscle_insert_short_table ("defgoto", yydefgoto,
763 yydefgoto[0], 1, nsyms - ntokens);
d7913476 764 XFREE (state_count);
43591cec 765 XFREE (yydefgoto);
6c89f1c1 766}
c3e23647
RS
767
768
9ee3c97b
AD
769/* The next few functions decide how to pack the actions and gotos
770 information into yytable. */
c3e23647 771
4a120d45 772static void
d2729d44 773sort_actions (void)
c3e23647 774{
6c89f1c1 775 int i;
c3e23647 776
d7913476 777 order = XCALLOC (short, nvectors);
c3e23647
RS
778 nentries = 0;
779
780 for (i = 0; i < nvectors; i++)
796d61fb
AD
781 if (tally[i] > 0)
782 {
837491d8
AD
783 int k;
784 int t = tally[i];
785 int w = width[i];
786 int j = nentries - 1;
c3e23647 787
796d61fb
AD
788 while (j >= 0 && (width[order[j]] < w))
789 j--;
c3e23647 790
796d61fb
AD
791 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
792 j--;
c3e23647 793
796d61fb
AD
794 for (k = nentries - 1; k > j; k--)
795 order[k + 1] = order[k];
c3e23647 796
796d61fb
AD
797 order[j + 1] = i;
798 nentries++;
799 }
c3e23647
RS
800}
801
802
4a120d45 803static int
d2729d44 804matching_state (int vector)
c3e23647 805{
837491d8 806 int i = order[vector];
6c89f1c1
AD
807 int t;
808 int w;
6c89f1c1 809 int prev;
c3e23647 810
602bbf31 811 if (i >= (int) nstates)
36281465 812 return -1;
c3e23647
RS
813
814 t = tally[i];
815 w = width[i];
816
817 for (prev = vector - 1; prev >= 0; prev--)
818 {
837491d8
AD
819 int j = order[prev];
820 int k;
821 int match = 1;
822
c3e23647 823 if (width[j] != w || tally[j] != t)
36281465 824 return -1;
c3e23647 825
c3e23647 826 for (k = 0; match && k < t; k++)
796d61fb
AD
827 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
828 match = 0;
c3e23647
RS
829
830 if (match)
36281465 831 return j;
c3e23647
RS
832 }
833
36281465 834 return -1;
c3e23647
RS
835}
836
837
4a120d45 838static int
d2729d44 839pack_vector (int vector)
c3e23647 840{
837491d8 841 int i = order[vector];
6c89f1c1 842 int j;
837491d8 843 int t = tally[i];
6c89f1c1 844 int loc = 0;
837491d8
AD
845 short *from = froms[i];
846 short *to = tos[i];
c3e23647 847
340ef489 848 assert (t);
c3e23647 849
133c20e2 850 for (j = lowzero - from[0]; j < (int) table_size; j++)
c3e23647 851 {
837491d8
AD
852 int k;
853 int ok = 1;
c3e23647
RS
854
855 for (k = 0; ok && k < t; k++)
856 {
857 loc = j + from[k];
133c20e2
AD
858 if (loc > (int) table_size)
859 table_grow (loc);
c3e23647
RS
860
861 if (table[loc] != 0)
862 ok = 0;
863 }
864
865 for (k = 0; ok && k < vector; k++)
796d61fb
AD
866 if (pos[k] == j)
867 ok = 0;
c3e23647
RS
868
869 if (ok)
870 {
871 for (k = 0; k < t; k++)
872 {
873 loc = j + from[k];
874 table[loc] = to[k];
875 check[loc] = from[k];
876 }
877
878 while (table[lowzero] != 0)
879 lowzero++;
880
881 if (loc > high)
882 high = loc;
883
36281465 884 return j;
c3e23647
RS
885 }
886 }
275fc3ad
AD
887#define pack_vector_succeeded 0
888 assert (pack_vector_succeeded);
3843c413 889 return 0;
c3e23647
RS
890}
891
892
6c89f1c1
AD
893static void
894pack_table (void)
895{
896 int i;
897 int place;
898 int state;
899
d7913476
AD
900 base = XCALLOC (short, nvectors);
901 pos = XCALLOC (short, nentries);
133c20e2
AD
902 table = XCALLOC (short, table_size);
903 check = XCALLOC (short, table_size);
6c89f1c1
AD
904
905 lowzero = 0;
906 high = 0;
907
908 for (i = 0; i < nvectors; i++)
62a3e4f0 909 base[i] = SHRT_MIN;
6c89f1c1 910
133c20e2 911 for (i = 0; i < (int) table_size; i++)
6c89f1c1
AD
912 check[i] = -1;
913
914 for (i = 0; i < nentries; i++)
915 {
916 state = matching_state (i);
917
918 if (state < 0)
919 place = pack_vector (i);
920 else
921 place = base[state];
922
923 pos[i] = place;
924 base[order[i]] = place;
925 }
926
927 for (i = 0; i < nvectors; i++)
928 {
796d61fb
AD
929 XFREE (froms[i]);
930 XFREE (tos[i]);
6c89f1c1
AD
931 }
932
d7913476
AD
933 XFREE (froms);
934 XFREE (tos);
935 XFREE (pos);
6c89f1c1 936}
c3e23647
RS
937
938/* the following functions output yytable, yycheck
939 and the vectors whose elements index the portion starts */
940
4a120d45 941static void
d2729d44 942output_base (void)
c3e23647 943{
26f609ff 944 /* Output pact. */
5372019f
AD
945 muscle_insert_short_table ("pact", base,
946 base[0], 1, nstates);
c3e23647 947
26f609ff 948 /* Output pgoto. */
5372019f
AD
949 muscle_insert_short_table ("pgoto", base,
950 base[nstates], nstates + 1, nvectors);
d7913476 951 XFREE (base);
c3e23647
RS
952}
953
954
4a120d45 955static void
d2729d44 956output_table (void)
c3e23647 957{
5372019f
AD
958 muscle_insert_short_table ("table", table,
959 table[0], 1, high + 1);
d7913476 960 XFREE (table);
c3e23647
RS
961}
962
963
4a120d45 964static void
d2729d44 965output_check (void)
c3e23647 966{
5372019f
AD
967 muscle_insert_short_table ("check", check,
968 check[0], 1, high + 1);
d7913476 969 XFREE (check);
c3e23647
RS
970}
971
b0940840
AD
972/*-----------------------------------------------------------------.
973| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
974| and yycheck. |
975`-----------------------------------------------------------------*/
6c89f1c1
AD
976
977static void
978output_actions (void)
979{
602bbf31 980 size_t i;
6c89f1c1 981 nvectors = nstates + nvars;
c3e23647 982
d7913476
AD
983 froms = XCALLOC (short *, nvectors);
984 tos = XCALLOC (short *, nvectors);
985 tally = XCALLOC (short, nvectors);
986 width = XCALLOC (short, nvectors);
6c89f1c1
AD
987
988 token_actions ();
914feea9 989 bitsetv_free (LA);
b0299a2e 990 free (LArule);
6c89f1c1
AD
991
992 goto_actions ();
d7913476
AD
993 XFREE (goto_map + ntokens);
994 XFREE (from_state);
995 XFREE (to_state);
6c89f1c1
AD
996
997 sort_actions ();
998 pack_table ();
4e5caae2 999
6c89f1c1
AD
1000 output_base ();
1001 output_table ();
4e5caae2 1002
6c89f1c1 1003 output_check ();
49701457
AD
1004
1005 for (i = 0; i < nstates; ++i)
1006 {
29e88316
AD
1007 free (states[i]->shifts);
1008 XFREE (states[i]->reductions);
1009 free (states[i]->errs);
1010 free (states[i]);
49701457 1011 }
29e88316 1012 XFREE (states);
6c89f1c1 1013}
c3e23647 1014
652def80 1015\f
f958596b
AD
1016/*----------------------.
1017| Run our backend, M4. |
1018`----------------------*/
1019
1020static void
1021m4_invoke (const char *definitions)
1022{
1023 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1024 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1025 const char *m4 = getenv ("M4");
1026 int pkg_data_len;
1027 char *full_skeleton;
1028
1029 if (!m4)
1030 m4 = M4;
1031 if (!bison_pkgdatadir)
1032 bison_pkgdatadir = PKGDATADIR;
1033 pkg_data_len = strlen (bison_pkgdatadir);
1034 full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
1035 if (bison_pkgdatadir[pkg_data_len-1] == '/')
1036 sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
1037 else
1038 sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
1039 if (trace_flag)
1040 fprintf (stderr,
1041 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1042 m4, bison_pkgdatadir, definitions, full_skeleton);
1043 skel_in = readpipe (m4,
1044 "-I", bison_pkgdatadir,
1045 "m4sugar/m4sugar.m4",
1046 definitions,
1047 full_skeleton,
1048 NULL);
1049 XFREE (full_skeleton);
1050 if (!skel_in)
1051 error (EXIT_FAILURE, errno, "cannot run m4");
1052 skel_lex ();
1053
1054}
1055
1239777d
AD
1056/*---------------------------.
1057| Call the skeleton parser. |
1058`---------------------------*/
c3e23647 1059
4a120d45 1060static void
1239777d 1061output_skeleton (void)
9b3add5b 1062{
be2a1a68 1063 /* Store the definition of all the muscles. */
d0039cbc 1064 const char *tempdir = getenv ("TMPDIR");
381fb12e
AD
1065 char *tempfile = NULL;
1066 FILE *out = NULL;
381fb12e
AD
1067 int fd;
1068
1069 if (tempdir == NULL)
1070 tempdir = DEFAULT_TMPDIR;
1071 tempfile = xmalloc (strlen (tempdir) + 11);
1072 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
1073 fd = mkstemp (tempfile);
1074 if (fd == -1)
1075 error (EXIT_FAILURE, errno, "%s", tempfile);
1076
1077 out = fdopen (fd, "w");
1078 if (out == NULL)
1079 error (EXIT_FAILURE, errno, "%s", tempfile);
1080
1081 /* There are no comments, especially not `#': we do want M4 expansion
1082 after `#': think of CPP macros! */
1083 fputs ("m4_changecom()\n", out);
1084 fputs ("m4_init()\n", out);
1085
381fb12e 1086 actions_output (out);
381fb12e 1087 token_definitions_output (out);
9280d3ef 1088 symbol_destructors_output (out);
366eea36 1089 symbol_printers_output (out);
be2a1a68 1090
381fb12e 1091 muscles_m4_output (out);
be2a1a68 1092
381fb12e
AD
1093 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1094 fputs ("m4_divert_push(0)dnl\n", out);
1095 xfclose (out);
be2a1a68 1096
f958596b
AD
1097 m4_invoke (tempfile);
1098
1099 /* If `debugging', keep this file alive. */
1100 if (!trace_flag)
1101 unlink (tempfile);
1102
1103 free (tempfile);
26f609ff
RA
1104}
1105
1106static void
1107prepare (void)
1108{
11d82f03 1109 MUSCLE_INSERT_INT ("last", high);
62a3e4f0 1110 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
11d82f03
MA
1111 MUSCLE_INSERT_INT ("pure", pure_parser);
1112 MUSCLE_INSERT_INT ("nsym", nsyms);
1113 MUSCLE_INSERT_INT ("debug", debug_flag);
1114 MUSCLE_INSERT_INT ("final", final_state);
007a50a4
AD
1115 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1116 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
be2a1a68 1117 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
b5b61c61 1118 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
11d82f03 1119
b85810ae
AD
1120 /* FIXME: This is wrong: the muscles should decide whether they hold
1121 a copy or not, but the situation is too obscure currently. */
be2a1a68
AD
1122 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1123 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1124 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1125 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
b85810ae 1126
11d82f03
MA
1127 MUSCLE_INSERT_INT ("nnts", nvars);
1128 MUSCLE_INSERT_INT ("nrules", nrules);
1129 MUSCLE_INSERT_INT ("nstates", nstates);
1130 MUSCLE_INSERT_INT ("ntokens", ntokens);
1131
be2a1a68
AD
1132 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1133 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
381fb12e
AD
1134
1135 /* Copy definitions in directive. */
0dd1580a
RA
1136 obstack_1grow (&pre_prologue_obstack, 0);
1137 obstack_1grow (&post_prologue_obstack, 0);
1138 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1139 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
381fb12e
AD
1140
1141 /* Find the right skeleton file. */
1142 if (!skeleton)
60491a94 1143 skeleton = "yacc.c";
381fb12e
AD
1144
1145 /* Parse the skeleton file and output the needed parsers. */
1146 muscle_insert ("skeleton", skeleton);
26f609ff 1147}
c3e23647 1148
93ede233 1149
6c89f1c1
AD
1150/*----------------------------------------------------------.
1151| Output the parsing tables and the parser code to ftable. |
1152`----------------------------------------------------------*/
c3e23647 1153
6c89f1c1
AD
1154void
1155output (void)
1156{
f87685c3 1157 obstack_init (&format_obstack);
dd60faec 1158
b0940840
AD
1159 prepare_tokens ();
1160 prepare_rules ();
1161 prepare_states ();
6c89f1c1 1162 output_actions ();
342b8b6e 1163
26f609ff 1164 prepare ();
652def80 1165
9b3add5b
RA
1166 /* Process the selected skeleton file. */
1167 output_skeleton ();
1168
f499b062 1169 obstack_free (&format_obstack, NULL);
0dd1580a
RA
1170 obstack_free (&pre_prologue_obstack, NULL);
1171 obstack_free (&post_prologue_obstack, NULL);
c3e23647 1172}