]>
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 ??
100 #include "complain.h"
104 #include "conflicts.h"
105 #include "muscle_tab.h"
110 static short **froms
= NULL
;
111 static short **tos
= NULL
;
112 static short *tally
= NULL
;
113 static short *width
= NULL
;
114 static short *actrow
= NULL
;
115 static short *state_count
= NULL
;
116 static short *order
= NULL
;
117 static short *base
= NULL
;
118 static short *pos
= NULL
;
119 static short *table
= NULL
;
120 static short *check
= NULL
;
124 struct obstack muscle_obstack
;
125 struct obstack output_obstack
;
127 int error_verbose
= 0;
132 output_table_data (struct obstack
*oout
,
141 obstack_fgrow1 (oout
, "%6d", first
);
142 for (i
= begin
; i
< end
; ++i
)
144 obstack_1grow (oout
, ',');
147 obstack_sgrow (oout
, "\n ");
152 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
154 obstack_1grow (oout
, 0);
159 output_token_translations (void)
161 output_table_data (&output_obstack
, token_translations
,
162 0, 1, max_user_token_number
+ 1);
163 muscle_insert ("translate", obstack_finish (&output_obstack
));
164 XFREE (token_translations
);
173 short *values
= XCALLOC (short, nrules
+ 1);
174 for (i
= 0; i
< nrules
+ 1; ++i
)
175 values
[i
] = rule_table
[i
].rhs
;
176 output_table_data (&output_obstack
, values
,
181 muscle_insert ("prhs", obstack_finish (&output_obstack
));
184 size_t yyrhs_size
= 1;
188 for (sp
= ritem
+ 1; *sp
; sp
++)
190 yyrhs
= XMALLOC (short, yyrhs_size
);
192 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
193 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
195 output_table_data (&output_obstack
, yyrhs
,
196 ritem
[0], 1, yyrhs_size
);
197 muscle_insert ("rhs", obstack_finish (&output_obstack
));
208 short *values
= (short *) alloca (sizeof (short) * nstates
);
209 for (i
= 0; i
< nstates
; ++i
)
210 values
[i
] = state_table
[i
]->accessing_symbol
;
211 output_table_data (&output_obstack
, values
,
213 muscle_insert ("stos", obstack_finish (&output_obstack
));
218 output_rule_data (void)
222 short *short_tab
= NULL
;
225 short *values
= XCALLOC (short, nrules
+ 1);
226 for (i
= 0; i
< nrules
+ 1; ++i
)
227 values
[i
] = rule_table
[i
].line
;
228 output_table_data (&output_obstack
, values
,
230 muscle_insert ("rline", obstack_finish (&output_obstack
));
236 for (i
= 0; i
< nsyms
; i
++)
238 /* Be sure not to use twice the same quotearg slot. */
240 quotearg_n_style (1, c_quoting_style
,
241 quotearg_style (escape_quoting_style
, tags
[i
]));
242 /* Width of the next token, including the two quotes, the coma
244 int strsize
= strlen (cp
) + 2;
246 if (j
+ strsize
> 75)
248 obstack_sgrow (&output_obstack
, "\n ");
252 obstack_sgrow (&output_obstack
, cp
);
253 obstack_sgrow (&output_obstack
, ", ");
256 /* add a NULL entry to list of tokens */
257 obstack_sgrow (&output_obstack
, "NULL");
259 /* Finish table and store. */
260 obstack_1grow (&output_obstack
, 0);
261 muscle_insert ("tname", obstack_finish (&output_obstack
));
263 /* Output YYTOKNUM. */
264 output_table_data (&output_obstack
, user_toknums
,
266 muscle_insert ("toknum", obstack_finish (&output_obstack
));
270 short *values
= XCALLOC (short, nrules
+ 1);
271 for (i
= 0; i
< nrules
+ 1; ++i
)
272 values
[i
] = rule_table
[i
].lhs
;
273 output_table_data (&output_obstack
, values
,
275 muscle_insert ("r1", obstack_finish (&output_obstack
));
280 short_tab
= XMALLOC (short, nrules
+ 1);
281 for (i
= 1; i
< nrules
; i
++)
282 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
283 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
284 output_table_data (&output_obstack
, short_tab
,
286 muscle_insert ("r2", obstack_finish (&output_obstack
));
290 /*------------------------------------------------------------------.
291 | Decide what to do for each type of token if seen as the lookahead |
292 | token in specified state. The value returned is used as the |
293 | default action (yydefact) for the state. In addition, actrow is |
294 | filled with what to do for each kind of token, index by symbol |
295 | number, with zero meaning do the default action. The value |
296 | MINSHORT, a very negative number, means this situation is an |
297 | error. The parser recognizes this value specially. |
299 | This is where conflicts are resolved. The loop over lookahead |
300 | rules considered lower-numbered rules last, and the last rule |
301 | considered that likes a token gets to handle it. |
302 `------------------------------------------------------------------*/
305 action_row (int state
)
320 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
322 for (i
= 0; i
< ntokens
; i
++)
327 redp
= state_table
[state
]->reductions
;
335 /* loop over all the rules available here which require
337 m
= state_table
[state
]->lookaheads
;
338 n
= state_table
[state
+ 1]->lookaheads
;
340 for (i
= n
- 1; i
>= m
; i
--)
341 /* and find each token which the rule finds acceptable
343 for (j
= 0; j
< ntokens
; j
++)
344 /* and record this rule as the rule to use if that
346 if (BITISSET (LA (i
), j
))
347 actrow
[j
] = -LAruleno
[i
];
351 /* Now see which tokens are allowed for shifts in this state. For
352 them, record the shift as the thing to do. So shift is preferred
354 shiftp
= state_table
[state
]->shifts
;
355 for (i
= 0; i
< shiftp
->nshifts
; i
++)
357 shift_state
= shiftp
->shifts
[i
];
361 symbol
= state_table
[shift_state
]->accessing_symbol
;
366 actrow
[symbol
] = shift_state
;
368 /* Do not use any default reduction if there is a shift for
370 if (symbol
== error_token_number
)
374 /* See which tokens are an explicit error in this state (due to
375 %nonassoc). For them, record MINSHORT as the action. */
376 errp
= state_table
[state
]->errs
;
382 for (i
= 0; i
< k
; i
++)
384 symbol
= errp
->errs
[i
];
385 actrow
[symbol
] = MINSHORT
;
389 /* Now find the most common reduction and make it the default action
392 if (nreds
>= 1 && !nodefault
)
394 if (state_table
[state
]->consistent
)
395 default_rule
= redp
->rules
[0];
399 for (i
= m
; i
< n
; i
++)
404 for (j
= 0; j
< ntokens
; j
++)
406 if (actrow
[j
] == rule
)
417 /* actions which match the default are replaced with zero,
418 which means "use the default" */
422 for (j
= 0; j
< ntokens
; j
++)
424 if (actrow
[j
] == default_rule
)
428 default_rule
= -default_rule
;
433 /* If have no default rule, the default is an error.
434 So replace any action which says "error" with "use default". */
436 if (default_rule
== 0)
437 for (j
= 0; j
< ntokens
; j
++)
439 if (actrow
[j
] == MINSHORT
)
457 for (i
= 0; i
< ntokens
; i
++)
466 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
467 tos
[state
] = sp2
= XCALLOC (short, count
);
469 for (i
= 0; i
< ntokens
; i
++)
478 tally
[state
] = count
;
479 width
[state
] = sp1
[-1] - sp
[0] + 1;
483 /*------------------------------------------------------------------.
484 | Figure out the actions for the specified state, indexed by |
485 | lookahead token type. |
487 | The YYDEFACT table is output now. The detailed info is saved for |
488 | putting into YYTABLE later. |
489 `------------------------------------------------------------------*/
495 short *yydefact
= XCALLOC (short, nstates
);
497 actrow
= XCALLOC (short, ntokens
);
498 for (i
= 0; i
< nstates
; ++i
)
500 yydefact
[i
] = action_row (i
);
504 output_table_data (&output_obstack
, yydefact
,
505 yydefact
[0], 1, nstates
);
506 muscle_insert ("defact", obstack_finish (&output_obstack
));
513 /*-----------------------------.
514 | Output the actions to OOUT. |
515 `-----------------------------*/
518 actions_output (FILE *out
)
521 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
522 if (rule_table
[rule
].action
)
524 fprintf (out
, " case %d:\n", rule
);
527 fprintf (out
, muscle_find ("linef"),
528 rule_table
[rule
].action_line
,
529 quotearg_style (c_quoting_style
,
530 muscle_find ("filename")));
531 /* As a Bison extension, add the ending semicolon. Since some
532 Yacc don't do that, help people using bison as a Yacc
533 finding their missing semicolons. */
534 fprintf (out
, "{ %s%s }\n break;\n\n",
535 rule_table
[rule
].action
,
536 yacc_flag
? ";" : "");
542 save_column (int symbol
, int default_state
)
551 short begin
= goto_map
[symbol
];
552 short end
= goto_map
[symbol
+ 1];
555 for (i
= begin
; i
< end
; i
++)
557 if (to_state
[i
] != default_state
)
564 symno
= symbol
- ntokens
+ nstates
;
566 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
567 tos
[symno
] = sp2
= XCALLOC (short, count
);
569 for (i
= begin
; i
< end
; i
++)
571 if (to_state
[i
] != default_state
)
573 *sp1
++ = from_state
[i
];
574 *sp2
++ = to_state
[i
];
578 tally
[symno
] = count
;
579 width
[symno
] = sp1
[-1] - sp
[0] + 1;
583 default_goto (int symbol
)
591 m
= goto_map
[symbol
];
592 n
= goto_map
[symbol
+ 1];
597 for (i
= 0; i
< nstates
; i
++)
600 for (i
= m
; i
< n
; i
++)
601 state_count
[to_state
[i
]]++;
606 for (i
= 0; i
< nstates
; i
++)
608 if (state_count
[i
] > max
)
610 max
= state_count
[i
];
615 return default_state
;
619 /*-------------------------------------------------------------------.
620 | Figure out what to do after reducing with each rule, depending on |
621 | the saved state from before the beginning of parsing the data that |
622 | matched this rule. |
624 | The YYDEFGOTO table is output now. The detailed info is saved for |
625 | putting into YYTABLE later. |
626 `-------------------------------------------------------------------*/
632 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
634 state_count
= XCALLOC (short, nstates
);
635 for (i
= ntokens
; i
< nsyms
; ++i
)
637 int default_state
= default_goto (i
);
638 save_column (i
, default_state
);
639 yydefgoto
[i
- ntokens
] = default_state
;
642 output_table_data (&output_obstack
, yydefgoto
,
643 yydefgoto
[0], 1, nsyms
- ntokens
);
644 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
651 /* The next few functions decide how to pack the actions and gotos
652 information into yytable. */
663 order
= XCALLOC (short, nvectors
);
666 for (i
= 0; i
< nvectors
; i
++)
674 while (j
>= 0 && (width
[order
[j
]] < w
))
677 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
680 for (k
= nentries
- 1; k
> j
; k
--)
681 order
[k
+ 1] = order
[k
];
691 matching_state (int vector
)
708 for (prev
= vector
- 1; prev
>= 0; prev
--)
711 if (width
[j
] != w
|| tally
[j
] != t
)
715 for (k
= 0; match
&& k
< t
; k
++)
717 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
730 pack_vector (int vector
)
749 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
753 for (k
= 0; ok
&& k
< t
; k
++)
757 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
763 for (k
= 0; ok
&& k
< vector
; k
++)
771 for (k
= 0; k
< t
; k
++)
775 check
[loc
] = from
[k
];
778 while (table
[lowzero
] != 0)
788 assert (!"pack_vector");
800 base
= XCALLOC (short, nvectors
);
801 pos
= XCALLOC (short, nentries
);
802 table
= XCALLOC (short, MAXTABLE
);
803 check
= XCALLOC (short, MAXTABLE
);
808 for (i
= 0; i
< nvectors
; i
++)
811 for (i
= 0; i
< MAXTABLE
; i
++)
814 for (i
= 0; i
< nentries
; i
++)
816 state
= matching_state (i
);
819 place
= pack_vector (i
);
824 base
[order
[i
]] = place
;
827 for (i
= 0; i
< nvectors
; i
++)
840 /* the following functions output yytable, yycheck
841 and the vectors whose elements index the portion starts */
847 output_table_data (&output_obstack
, base
,
848 base
[0], 1, nstates
);
849 muscle_insert ("pact", obstack_finish (&output_obstack
));
852 output_table_data (&output_obstack
, base
,
853 base
[nstates
], nstates
+ 1, nvectors
);
854 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
863 output_table_data (&output_obstack
, table
,
864 table
[0], 1, high
+ 1);
865 muscle_insert ("table", obstack_finish (&output_obstack
));
873 output_table_data (&output_obstack
, check
,
874 check
[0], 1, high
+ 1);
875 muscle_insert ("check", obstack_finish (&output_obstack
));
879 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
883 output_actions (void)
886 nvectors
= nstates
+ nvars
;
888 froms
= XCALLOC (short *, nvectors
);
889 tos
= XCALLOC (short *, nvectors
);
890 tally
= XCALLOC (short, nvectors
);
891 width
= XCALLOC (short, nvectors
);
898 XFREE (goto_map
+ ntokens
);
910 for (i
= 0; i
< nstates
; ++i
)
912 XFREE (state_table
[i
]->shifts
);
913 XFREE (state_table
[i
]->reductions
);
914 XFREE (state_table
[i
]->errs
);
915 free (state_table
[i
]);
921 /*------------------------------------------------------------.
922 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
923 | and do the muscle substitution. |
924 `------------------------------------------------------------*/
927 output_parser (const char *skel_filename
, FILE *out
)
933 fskel
= xfopen (skel_filename
, "r");
935 /* New output code. */
947 else if ((c
= getc (fskel
)) == '%')
949 /* Read the muscle. */
950 const char *muscle_key
= 0;
951 const char *muscle_value
= 0;
953 while (isalnum (c
= getc (fskel
)) || c
== '-')
954 obstack_1grow (&muscle_obstack
, c
);
955 obstack_1grow (&muscle_obstack
, 0);
957 /* Output the right value, or see if it's something special. */
958 muscle_key
= obstack_finish (&muscle_obstack
);
959 muscle_value
= muscle_find (muscle_key
);
960 if (!strcmp (muscle_key
, "actions"))
961 actions_output (out
);
962 else if (!strcmp (muscle_key
, "line"))
963 fprintf (out
, "%d", line
+ 1);
964 else if (muscle_value
)
965 fputs (muscle_value
, out
);
969 fputs (muscle_key
, out
);
980 /*----------------------------------------.
981 | Prepare the master parser to be output |
982 `----------------------------------------*/
985 output_master_parser (void)
987 FILE *parser
= xfopen (parser_file_name
, "w");
991 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
993 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
995 muscle_insert ("skeleton", skeleton
);
997 output_parser (skeleton
, parser
);
1004 #define MUSCLE_INSERT_INT(Key, Value) \
1006 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1007 obstack_1grow (&muscle_obstack, 0); \
1008 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1011 #define MUSCLE_INSERT_STRING(Key, Value) \
1013 obstack_sgrow (&muscle_obstack, Value); \
1014 obstack_1grow (&muscle_obstack, 0); \
1015 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1018 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1020 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1021 obstack_1grow (&muscle_obstack, 0); \
1022 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1028 MUSCLE_INSERT_INT ("last", high
);
1029 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1030 MUSCLE_INSERT_INT ("pure", pure_parser
);
1031 MUSCLE_INSERT_INT ("nsym", nsyms
);
1032 MUSCLE_INSERT_INT ("debug", debug_flag
);
1033 MUSCLE_INSERT_INT ("final", final_state
);
1034 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1035 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1036 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1037 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1039 MUSCLE_INSERT_INT ("nnts", nvars
);
1040 MUSCLE_INSERT_INT ("nrules", nrules
);
1041 MUSCLE_INSERT_INT ("nstates", nstates
);
1042 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1044 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1047 /*----------------------------------------------------------.
1048 | Output the parsing tables and the parser code to ftable. |
1049 `----------------------------------------------------------*/
1054 obstack_init (&output_obstack
);
1056 output_token_translations ();
1060 if (semantic_parser
)
1062 output_rule_data ();
1063 XFREE (user_toknums
);
1067 /* Copy definitions in directive. */
1068 obstack_1grow (&attrs_obstack
, 0);
1069 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1071 output_master_parser ();
1073 free (rule_table
+ 1);
1074 obstack_free (&muscle_obstack
, 0);
1075 obstack_free (&output_obstack
, 0);
1076 obstack_free (&action_obstack
, 0);