]>
git.saurik.com Git - bison.git/blob - src/output.c
1 /* Output the generated parsing program for bison,
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001 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 it
7 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, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 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 the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 /* The parser tables consist of these tables.
23 Starred ones needed only for the semantic parser.
24 Double starred are output only if switches are set.
26 yytranslate = vector mapping yylex's token numbers into bison's token
29 ** yytname = vector of string-names indexed by bison token number
31 ** yytoknum = vector of yylex token numbers corresponding to entries
34 yyrline = vector of line-numbers of all rules. For yydebug printouts.
36 yyrhs = vector of items of all rules.
37 This is exactly what ritems contains. For yydebug and for semantic
40 yyprhs[r] = index in yyrhs of first item for rule r.
42 yyr1[r] = symbol number of symbol that rule r derives.
44 yyr2[r] = number of symbols composing right hand side of rule r.
46 * yystos[s] = the symbol number of the symbol that leads to state s.
48 yydefact[s] = default rule to reduce with in state s,
49 when yytable doesn't specify something else to do.
50 Zero means the default is an error.
52 yydefgoto[i] = default state to go to after a reduction of a rule that
53 generates variable ntokens + i, except when yytable
54 specifies something else to do.
56 yypact[s] = index in yytable of the portion describing state s.
57 The lookahead token's type is used to index that portion
58 to find out what to do.
60 If the value in yytable is positive,
61 we shift the token and go to that state.
63 If the value is negative, it is minus a rule number to reduce by.
65 If the value is zero, the default action from yydefact[s] is used.
67 yypgoto[i] = the index in yytable of the portion describing
68 what to do after reducing a rule that derives variable i + ntokens.
69 This portion is indexed by the parser state number, s,
70 as of before the text for this nonterminal was read.
71 The value from yytable is the state to go to if
72 the corresponding value in yycheck is s.
74 yytable = a vector filled with portions for different uses,
75 found via yypact and yypgoto.
77 yycheck = a vector indexed in parallel with yytable.
78 It indicates, in a roundabout way, the bounds of the
79 portion you are trying to examine.
81 Suppose that the portion of yytable starts at index p
82 and the index to be examined within the portion is i.
83 Then if yycheck[p+i] != i, i is outside the bounds
84 of what is actually allocated, and the default
85 (from yydefact or yydefgoto) should be used.
86 Otherwise, yytable[p+i] should be used.
88 YYFINAL = the state number of the termination state.
89 YYFLAG = most negative short int. Used to flag ??
103 #include "conflicts.h"
104 #include "muscle_tab.h"
109 static short **froms
= NULL
;
110 static short **tos
= NULL
;
111 static short *tally
= NULL
;
112 static short *width
= NULL
;
113 static short *actrow
= NULL
;
114 static short *state_count
= NULL
;
115 static short *order
= NULL
;
116 static short *base
= NULL
;
117 static short *pos
= NULL
;
118 static short *table
= NULL
;
119 static short *check
= NULL
;
123 struct obstack muscle_obstack
;
124 static struct obstack format_obstack
;
126 int error_verbose
= 0;
128 /* Returns the number of lines of S. */
130 get_lines_number (const char *s
)
135 for (i
= 0; s
[i
]; ++i
)
148 output_table_data (struct obstack
*oout
,
157 obstack_fgrow1 (oout
, "%6d", first
);
158 for (i
= begin
; i
< end
; ++i
)
160 obstack_1grow (oout
, ',');
163 obstack_sgrow (oout
, "\n ");
168 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
170 obstack_1grow (oout
, 0);
175 output_token_translations (void)
177 output_table_data (&format_obstack
, token_translations
,
178 0, 1, max_user_token_number
+ 1);
179 muscle_insert ("translate", obstack_finish (&format_obstack
));
180 XFREE (token_translations
);
189 short *values
= XCALLOC (short, nrules
+ 1);
190 for (i
= 0; i
< nrules
+ 1; ++i
)
191 values
[i
] = rule_table
[i
].rhs
;
192 output_table_data (&format_obstack
, values
,
197 muscle_insert ("prhs", obstack_finish (&format_obstack
));
200 size_t yyrhs_size
= 1;
204 for (sp
= ritem
+ 1; *sp
; sp
++)
206 yyrhs
= XMALLOC (short, yyrhs_size
);
208 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
209 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
211 output_table_data (&format_obstack
, yyrhs
,
212 ritem
[0], 1, yyrhs_size
);
213 muscle_insert ("rhs", obstack_finish (&format_obstack
));
219 if (!semantic_parser
)
220 obstack_sgrow (&table_obstack
, "\n#endif\n");
229 short *values
= (short *) alloca (sizeof (short) * nstates
);
230 for (i
= 0; i
< nstates
; ++i
)
231 values
[i
] = state_table
[i
]->accessing_symbol
;
232 output_table_data (&format_obstack
, values
,
234 muscle_insert ("stos", obstack_finish (&format_obstack
));
239 output_rule_data (void)
243 short *short_tab
= NULL
;
246 short *values
= XCALLOC (short, nrules
+ 1);
247 for (i
= 0; i
< nrules
+ 1; ++i
)
248 values
[i
] = rule_table
[i
].line
;
249 output_table_data (&format_obstack
, values
,
251 muscle_insert ("rline", obstack_finish (&format_obstack
));
257 for (i
= 0; i
< nsyms
; i
++)
259 /* Be sure not to use twice the same quotearg slot. */
261 quotearg_n_style (1, c_quoting_style
,
262 quotearg_style (escape_quoting_style
, tags
[i
]));
263 /* Width of the next token, including the two quotes, the coma
265 int strsize
= strlen (cp
) + 2;
267 if (j
+ strsize
> 75)
269 obstack_sgrow (&format_obstack
, "\n ");
273 obstack_sgrow (&format_obstack
, cp
);
274 obstack_sgrow (&format_obstack
, ", ");
277 /* add a NULL entry to list of tokens */
278 obstack_sgrow (&format_obstack
, "NULL");
280 /* Finish table and store. */
281 obstack_1grow (&format_obstack
, 0);
282 muscle_insert ("tname", obstack_finish (&format_obstack
));
284 /* Output YYTOKNUM. */
285 output_table_data (&format_obstack
, user_toknums
,
287 muscle_insert ("toknum", obstack_finish (&format_obstack
));
291 short *values
= XCALLOC (short, nrules
+ 1);
292 for (i
= 0; i
< nrules
+ 1; ++i
)
293 values
[i
] = rule_table
[i
].lhs
;
294 output_table_data (&format_obstack
, values
,
296 muscle_insert ("r1", obstack_finish (&format_obstack
));
301 short_tab
= XMALLOC (short, nrules
+ 1);
302 for (i
= 1; i
< nrules
; i
++)
303 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
304 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
305 output_table_data (&format_obstack
, short_tab
,
307 muscle_insert ("r2", obstack_finish (&format_obstack
));
311 /*------------------------------------------------------------------.
312 | Decide what to do for each type of token if seen as the lookahead |
313 | token in specified state. The value returned is used as the |
314 | default action (yydefact) for the state. In addition, actrow is |
315 | filled with what to do for each kind of token, index by symbol |
316 | number, with zero meaning do the default action. The value |
317 | MINSHORT, a very negative number, means this situation is an |
318 | error. The parser recognizes this value specially. |
320 | This is where conflicts are resolved. The loop over lookahead |
321 | rules considered lower-numbered rules last, and the last rule |
322 | considered that likes a token gets to handle it. |
323 `------------------------------------------------------------------*/
326 action_row (int state
)
331 int default_rule
= 0;
332 reductions
*redp
= state_table
[state
]->reductions
;
333 int nreds
= redp
? redp
->nreds
: 0;
334 shifts
*shiftp
= state_table
[state
]->shifts
;
335 errs
*errp
= state_table
[state
]->errs
;
336 /* set nonzero to inhibit having any default reduction */
339 for (i
= 0; i
< ntokens
; i
++)
345 /* loop over all the rules available here which require
347 m
= state_table
[state
]->lookaheadsp
;
348 n
= state_table
[state
+ 1]->lookaheadsp
;
350 for (i
= n
- 1; i
>= m
; i
--)
351 /* and find each token which the rule finds acceptable
353 for (j
= 0; j
< ntokens
; j
++)
354 /* and record this rule as the rule to use if that
356 if (BITISSET (LA (i
), j
))
357 actrow
[j
] = -LAruleno
[i
];
360 /* Now see which tokens are allowed for shifts in this state. For
361 them, record the shift as the thing to do. So shift is preferred
363 for (i
= 0; i
< shiftp
->nshifts
; i
++)
366 int shift_state
= shiftp
->shifts
[i
];
370 symbol
= state_table
[shift_state
]->accessing_symbol
;
375 actrow
[symbol
] = shift_state
;
377 /* Do not use any default reduction if there is a shift for
379 if (symbol
== error_token_number
)
383 /* See which tokens are an explicit error in this state (due to
384 %nonassoc). For them, record MINSHORT as the action. */
386 for (i
= 0; i
< errp
->nerrs
; i
++)
388 int symbol
= errp
->errs
[i
];
389 actrow
[symbol
] = MINSHORT
;
392 /* Now find the most common reduction and make it the default action
395 if (nreds
>= 1 && !nodefault
)
397 if (state_table
[state
]->consistent
)
398 default_rule
= redp
->rules
[0];
402 for (i
= m
; i
< n
; i
++)
405 int rule
= -LAruleno
[i
];
408 for (j
= 0; j
< ntokens
; j
++)
409 if (actrow
[j
] == rule
)
419 /* actions which match the default are replaced with zero,
420 which means "use the default" */
425 for (j
= 0; j
< ntokens
; j
++)
426 if (actrow
[j
] == default_rule
)
429 default_rule
= -default_rule
;
434 /* If have no default rule, the default is an error.
435 So replace any action which says "error" with "use default". */
437 if (default_rule
== 0)
438 for (i
= 0; i
< ntokens
; i
++)
439 if (actrow
[i
] == MINSHORT
)
456 for (i
= 0; i
< ntokens
; i
++)
463 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
464 tos
[state
] = sp2
= XCALLOC (short, count
);
466 for (i
= 0; i
< ntokens
; i
++)
473 tally
[state
] = count
;
474 width
[state
] = sp1
[-1] - sp
[0] + 1;
478 /*------------------------------------------------------------------.
479 | Figure out the actions for the specified state, indexed by |
480 | lookahead token type. |
482 | The YYDEFACT table is output now. The detailed info is saved for |
483 | putting into YYTABLE later. |
484 `------------------------------------------------------------------*/
490 short *yydefact
= XCALLOC (short, nstates
);
492 actrow
= XCALLOC (short, ntokens
);
493 for (i
= 0; i
< nstates
; ++i
)
495 yydefact
[i
] = action_row (i
);
499 output_table_data (&format_obstack
, yydefact
,
500 yydefact
[0], 1, nstates
);
501 muscle_insert ("defact", obstack_finish (&format_obstack
));
508 /*-----------------------------.
509 | Output the actions to OOUT. |
510 `-----------------------------*/
513 actions_output (FILE *out
, size_t *line
)
516 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
517 if (rule_table
[rule
].action
)
519 fprintf (out
, " case %d:\n", rule
);
522 fprintf (out
, muscle_find ("linef"),
523 rule_table
[rule
].action_line
,
524 quotearg_style (c_quoting_style
,
525 muscle_find ("filename")));
526 /* As a Bison extension, add the ending semicolon. Since some
527 Yacc don't do that, help people using bison as a Yacc
528 finding their missing semicolons. */
529 fprintf (out
, "{ %s%s }\n break;\n\n",
530 rule_table
[rule
].action
,
531 yacc_flag
? ";" : "");
533 /* We always output 4 '\n' per action. */
535 /* Plus one if !no_lines_flag. */
538 /* Get the number of lines written by the user. */
539 *line
+= get_lines_number (rule_table
[rule
].action
);
545 save_column (int symbol
, int default_state
)
552 int symno
= symbol
- ntokens
+ nstates
;
554 short begin
= goto_map
[symbol
];
555 short end
= goto_map
[symbol
+ 1];
558 for (i
= begin
; i
< end
; i
++)
559 if (to_state
[i
] != default_state
)
565 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
566 tos
[symno
] = sp2
= XCALLOC (short, count
);
568 for (i
= begin
; i
< end
; i
++)
569 if (to_state
[i
] != default_state
)
571 *sp1
++ = from_state
[i
];
572 *sp2
++ = to_state
[i
];
575 tally
[symno
] = count
;
576 width
[symno
] = sp1
[-1] - sp
[0] + 1;
580 default_goto (int symbol
)
583 int m
= goto_map
[symbol
];
584 int n
= goto_map
[symbol
+ 1];
585 int default_state
= -1;
591 for (i
= 0; i
< nstates
; i
++)
594 for (i
= m
; i
< n
; i
++)
595 state_count
[to_state
[i
]]++;
597 for (i
= 0; i
< nstates
; i
++)
598 if (state_count
[i
] > max
)
600 max
= state_count
[i
];
604 return default_state
;
608 /*-------------------------------------------------------------------.
609 | Figure out what to do after reducing with each rule, depending on |
610 | the saved state from before the beginning of parsing the data that |
611 | matched this rule. |
613 | The YYDEFGOTO table is output now. The detailed info is saved for |
614 | putting into YYTABLE later. |
615 `-------------------------------------------------------------------*/
621 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
623 state_count
= XCALLOC (short, nstates
);
624 for (i
= ntokens
; i
< nsyms
; ++i
)
626 int default_state
= default_goto (i
);
627 save_column (i
, default_state
);
628 yydefgoto
[i
- ntokens
] = default_state
;
631 output_table_data (&format_obstack
, yydefgoto
,
632 yydefgoto
[0], 1, nsyms
- ntokens
);
633 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
640 /* The next few functions decide how to pack the actions and gotos
641 information into yytable. */
648 order
= XCALLOC (short, nvectors
);
651 for (i
= 0; i
< nvectors
; i
++)
657 int j
= nentries
- 1;
659 while (j
>= 0 && (width
[order
[j
]] < w
))
662 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
665 for (k
= nentries
- 1; k
> j
; k
--)
666 order
[k
+ 1] = order
[k
];
675 matching_state (int vector
)
677 int i
= order
[vector
];
688 for (prev
= vector
- 1; prev
>= 0; prev
--)
694 if (width
[j
] != w
|| tally
[j
] != t
)
697 for (k
= 0; match
&& k
< t
; k
++)
698 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
710 pack_vector (int vector
)
712 int i
= order
[vector
];
716 short *from
= froms
[i
];
721 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
726 for (k
= 0; ok
&& k
< t
; k
++)
730 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
736 for (k
= 0; ok
&& k
< vector
; k
++)
742 for (k
= 0; k
< t
; k
++)
746 check
[loc
] = from
[k
];
749 while (table
[lowzero
] != 0)
758 #define pack_vector_succeeded 0
759 assert (pack_vector_succeeded
);
771 base
= XCALLOC (short, nvectors
);
772 pos
= XCALLOC (short, nentries
);
773 table
= XCALLOC (short, MAXTABLE
);
774 check
= XCALLOC (short, MAXTABLE
);
779 for (i
= 0; i
< nvectors
; i
++)
782 for (i
= 0; i
< MAXTABLE
; i
++)
785 for (i
= 0; i
< nentries
; i
++)
787 state
= matching_state (i
);
790 place
= pack_vector (i
);
795 base
[order
[i
]] = place
;
798 for (i
= 0; i
< nvectors
; i
++)
809 /* the following functions output yytable, yycheck
810 and the vectors whose elements index the portion starts */
816 output_table_data (&format_obstack
, base
,
817 base
[0], 1, nstates
);
818 muscle_insert ("pact", obstack_finish (&format_obstack
));
821 output_table_data (&format_obstack
, base
,
822 base
[nstates
], nstates
+ 1, nvectors
);
823 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
832 output_table_data (&format_obstack
, table
,
833 table
[0], 1, high
+ 1);
834 muscle_insert ("table", obstack_finish (&format_obstack
));
842 output_table_data (&format_obstack
, check
,
843 check
[0], 1, high
+ 1);
844 muscle_insert ("check", obstack_finish (&format_obstack
));
848 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
852 output_actions (void)
855 nvectors
= nstates
+ nvars
;
857 froms
= XCALLOC (short *, nvectors
);
858 tos
= XCALLOC (short *, nvectors
);
859 tally
= XCALLOC (short, nvectors
);
860 width
= XCALLOC (short, nvectors
);
867 XFREE (goto_map
+ ntokens
);
879 for (i
= 0; i
< nstates
; ++i
)
881 XFREE (state_table
[i
]->shifts
);
882 XFREE (state_table
[i
]->reductions
);
883 XFREE (state_table
[i
]->errs
);
884 free (state_table
[i
]);
890 /*------------------------------------------------------------.
891 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
892 | and do the muscle substitution. |
893 `------------------------------------------------------------*/
896 output_parser (const char *skel_filename
, FILE *out
)
901 size_t skeleton_line
;
903 fskel
= xfopen (skel_filename
, "r");
905 /* New output code. */
921 else if ((c
= getc (fskel
)) == '%')
923 /* Read the muscle. */
924 const char *muscle_key
= 0;
925 const char *muscle_value
= 0;
927 while (isalnum (c
= getc (fskel
)) || c
== '-')
928 obstack_1grow (&muscle_obstack
, c
);
929 obstack_1grow (&muscle_obstack
, 0);
931 /* Output the right value, or see if it's something special. */
932 muscle_key
= obstack_finish (&muscle_obstack
);
933 muscle_value
= muscle_find (muscle_key
);
934 if (!strcmp (muscle_key
, "actions"))
935 actions_output (out
, &output_line
);
936 else if (!strcmp (muscle_key
, "line"))
937 fprintf (out
, "%d", output_line
);
938 else if (!strcmp (muscle_key
, "skeleton-line"))
939 fprintf (out
, "%d", skeleton_line
);
940 else if (muscle_value
)
942 fputs (muscle_value
, out
);
943 output_line
+= get_lines_number (muscle_value
);
948 fputs (muscle_key
, out
);
959 /*----------------------------------------.
960 | Prepare the master parser to be output |
961 `----------------------------------------*/
964 output_master_parser (void)
966 FILE *parser
= xfopen (parser_file_name
, "w");
970 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
972 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
974 muscle_insert ("skeleton", skeleton
);
975 muscle_insert ("parser-file-name", parser_file_name
);
977 output_parser (skeleton
, parser
);
984 #define MUSCLE_INSERT_INT(Key, Value) \
986 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
987 obstack_1grow (&muscle_obstack, 0); \
988 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
991 #define MUSCLE_INSERT_STRING(Key, Value) \
993 obstack_sgrow (&muscle_obstack, Value); \
994 obstack_1grow (&muscle_obstack, 0); \
995 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
998 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1000 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1001 obstack_1grow (&muscle_obstack, 0); \
1002 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1008 MUSCLE_INSERT_INT ("last", high
);
1009 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1010 MUSCLE_INSERT_INT ("pure", pure_parser
);
1011 MUSCLE_INSERT_INT ("nsym", nsyms
);
1012 MUSCLE_INSERT_INT ("debug", debug_flag
);
1013 MUSCLE_INSERT_INT ("final", final_state
);
1014 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1015 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1016 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1018 MUSCLE_INSERT_INT ("nnts", nvars
);
1019 MUSCLE_INSERT_INT ("nrules", nrules
);
1020 MUSCLE_INSERT_INT ("nstates", nstates
);
1021 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1023 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1027 /*-------------------------.
1028 | Output the header file. |
1029 `-------------------------*/
1032 header_output (void)
1034 FILE *out
= xfopen (spec_defines_file
, "w");
1035 char *macro_name
= compute_header_macro ();
1037 fprintf (out
, "#ifndef %s\n", macro_name
);
1038 fprintf (out
, "# define %s\n\n", macro_name
);
1040 fputs (muscle_find ("tokendef"), out
);
1045 # define YYSTYPE yystype\n\
1047 muscle_find ("stype"));
1050 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1052 if (semantic_parser
)
1056 for (i
= ntokens
; i
< nsyms
; i
++)
1057 /* don't make these for dummy nonterminals made by gensym. */
1058 if (*tags
[i
] != '@')
1059 fprintf (out
, "# define NT%s\t%d\n", tags
[i
], i
);
1062 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1068 /*----------------------------------------------------------.
1069 | Output the parsing tables and the parser code to ftable. |
1070 `----------------------------------------------------------*/
1075 obstack_init (&format_obstack
);
1077 output_token_translations ();
1081 if (semantic_parser
)
1083 output_rule_data ();
1084 XFREE (user_toknums
);
1088 /* Copy definitions in directive. */
1089 obstack_1grow (&attrs_obstack
, 0);
1090 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1092 /* Output the parser. */
1093 output_master_parser ();
1094 /* Output the header if needed. */
1098 free (rule_table
+ 1);
1099 obstack_free (&muscle_obstack
, 0);
1100 obstack_free (&format_obstack
, 0);
1101 obstack_free (&action_obstack
, 0);