]>
git.saurik.com Git - bison.git/blob - src/output.c
f38d63bae36c7ee9601e3024292c3f4dcbfe965e
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
));
289 XFREE (rule_table
+ 1);
292 /*------------------------------------------------------------------.
293 | Decide what to do for each type of token if seen as the lookahead |
294 | token in specified state. The value returned is used as the |
295 | default action (yydefact) for the state. In addition, actrow is |
296 | filled with what to do for each kind of token, index by symbol |
297 | number, with zero meaning do the default action. The value |
298 | MINSHORT, a very negative number, means this situation is an |
299 | error. The parser recognizes this value specially. |
301 | This is where conflicts are resolved. The loop over lookahead |
302 | rules considered lower-numbered rules last, and the last rule |
303 | considered that likes a token gets to handle it. |
304 `------------------------------------------------------------------*/
307 action_row (int state
)
322 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
324 for (i
= 0; i
< ntokens
; i
++)
329 redp
= state_table
[state
]->reductions
;
337 /* loop over all the rules available here which require
339 m
= state_table
[state
]->lookaheads
;
340 n
= state_table
[state
+ 1]->lookaheads
;
342 for (i
= n
- 1; i
>= m
; i
--)
343 /* and find each token which the rule finds acceptable
345 for (j
= 0; j
< ntokens
; j
++)
346 /* and record this rule as the rule to use if that
348 if (BITISSET (LA (i
), j
))
349 actrow
[j
] = -LAruleno
[i
];
353 /* Now see which tokens are allowed for shifts in this state. For
354 them, record the shift as the thing to do. So shift is preferred
356 shiftp
= state_table
[state
]->shifts
;
357 for (i
= 0; i
< shiftp
->nshifts
; i
++)
359 shift_state
= shiftp
->shifts
[i
];
363 symbol
= state_table
[shift_state
]->accessing_symbol
;
368 actrow
[symbol
] = shift_state
;
370 /* Do not use any default reduction if there is a shift for
372 if (symbol
== error_token_number
)
376 /* See which tokens are an explicit error in this state (due to
377 %nonassoc). For them, record MINSHORT as the action. */
378 errp
= state_table
[state
]->errs
;
384 for (i
= 0; i
< k
; i
++)
386 symbol
= errp
->errs
[i
];
387 actrow
[symbol
] = MINSHORT
;
391 /* Now find the most common reduction and make it the default action
394 if (nreds
>= 1 && !nodefault
)
396 if (state_table
[state
]->consistent
)
397 default_rule
= redp
->rules
[0];
401 for (i
= m
; i
< n
; i
++)
406 for (j
= 0; j
< ntokens
; j
++)
408 if (actrow
[j
] == rule
)
419 /* actions which match the default are replaced with zero,
420 which means "use the default" */
424 for (j
= 0; j
< ntokens
; j
++)
426 if (actrow
[j
] == default_rule
)
430 default_rule
= -default_rule
;
435 /* If have no default rule, the default is an error.
436 So replace any action which says "error" with "use default". */
438 if (default_rule
== 0)
439 for (j
= 0; j
< ntokens
; j
++)
441 if (actrow
[j
] == MINSHORT
)
459 for (i
= 0; i
< ntokens
; i
++)
468 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
469 tos
[state
] = sp2
= XCALLOC (short, count
);
471 for (i
= 0; i
< ntokens
; i
++)
480 tally
[state
] = count
;
481 width
[state
] = sp1
[-1] - sp
[0] + 1;
485 /*------------------------------------------------------------------.
486 | Figure out the actions for the specified state, indexed by |
487 | lookahead token type. |
489 | The YYDEFACT table is output now. The detailed info is saved for |
490 | putting into YYTABLE later. |
491 `------------------------------------------------------------------*/
497 short *yydefact
= XCALLOC (short, nstates
);
499 actrow
= XCALLOC (short, ntokens
);
500 for (i
= 0; i
< nstates
; ++i
)
502 yydefact
[i
] = action_row (i
);
506 output_table_data (&output_obstack
, yydefact
,
507 yydefact
[0], 1, nstates
);
508 muscle_insert ("defact", obstack_finish (&output_obstack
));
516 save_column (int symbol
, int default_state
)
525 short begin
= goto_map
[symbol
];
526 short end
= goto_map
[symbol
+ 1];
529 for (i
= begin
; i
< end
; i
++)
531 if (to_state
[i
] != default_state
)
538 symno
= symbol
- ntokens
+ nstates
;
540 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
541 tos
[symno
] = sp2
= XCALLOC (short, count
);
543 for (i
= begin
; i
< end
; i
++)
545 if (to_state
[i
] != default_state
)
547 *sp1
++ = from_state
[i
];
548 *sp2
++ = to_state
[i
];
552 tally
[symno
] = count
;
553 width
[symno
] = sp1
[-1] - sp
[0] + 1;
557 default_goto (int symbol
)
565 m
= goto_map
[symbol
];
566 n
= goto_map
[symbol
+ 1];
571 for (i
= 0; i
< nstates
; i
++)
574 for (i
= m
; i
< n
; i
++)
575 state_count
[to_state
[i
]]++;
580 for (i
= 0; i
< nstates
; i
++)
582 if (state_count
[i
] > max
)
584 max
= state_count
[i
];
589 return default_state
;
593 /*-------------------------------------------------------------------.
594 | Figure out what to do after reducing with each rule, depending on |
595 | the saved state from before the beginning of parsing the data that |
596 | matched this rule. |
598 | The YYDEFGOTO table is output now. The detailed info is saved for |
599 | putting into YYTABLE later. |
600 `-------------------------------------------------------------------*/
606 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
608 state_count
= XCALLOC (short, nstates
);
609 for (i
= ntokens
; i
< nsyms
; ++i
)
611 int default_state
= default_goto (i
);
612 save_column (i
, default_state
);
613 yydefgoto
[i
- ntokens
] = default_state
;
616 output_table_data (&output_obstack
, yydefgoto
,
617 yydefgoto
[0], 1, nsyms
- ntokens
);
618 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
625 /* The next few functions decide how to pack the actions and gotos
626 information into yytable. */
637 order
= XCALLOC (short, nvectors
);
640 for (i
= 0; i
< nvectors
; i
++)
648 while (j
>= 0 && (width
[order
[j
]] < w
))
651 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
654 for (k
= nentries
- 1; k
> j
; k
--)
655 order
[k
+ 1] = order
[k
];
665 matching_state (int vector
)
682 for (prev
= vector
- 1; prev
>= 0; prev
--)
685 if (width
[j
] != w
|| tally
[j
] != t
)
689 for (k
= 0; match
&& k
< t
; k
++)
691 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
704 pack_vector (int vector
)
723 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
727 for (k
= 0; ok
&& k
< t
; k
++)
731 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
737 for (k
= 0; ok
&& k
< vector
; k
++)
745 for (k
= 0; k
< t
; k
++)
749 check
[loc
] = from
[k
];
752 while (table
[lowzero
] != 0)
762 assert (!"pack_vector");
774 base
= XCALLOC (short, nvectors
);
775 pos
= XCALLOC (short, nentries
);
776 table
= XCALLOC (short, MAXTABLE
);
777 check
= XCALLOC (short, MAXTABLE
);
782 for (i
= 0; i
< nvectors
; i
++)
785 for (i
= 0; i
< MAXTABLE
; i
++)
788 for (i
= 0; i
< nentries
; i
++)
790 state
= matching_state (i
);
793 place
= pack_vector (i
);
798 base
[order
[i
]] = place
;
801 for (i
= 0; i
< nvectors
; i
++)
814 /* the following functions output yytable, yycheck
815 and the vectors whose elements index the portion starts */
821 output_table_data (&output_obstack
, base
,
822 base
[0], 1, nstates
);
823 muscle_insert ("pact", obstack_finish (&output_obstack
));
826 output_table_data (&output_obstack
, base
,
827 base
[nstates
], nstates
+ 1, nvectors
);
828 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
837 output_table_data (&output_obstack
, table
,
838 table
[0], 1, high
+ 1);
839 muscle_insert ("table", obstack_finish (&output_obstack
));
847 output_table_data (&output_obstack
, check
,
848 check
[0], 1, high
+ 1);
849 muscle_insert ("check", obstack_finish (&output_obstack
));
853 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
857 output_actions (void)
860 nvectors
= nstates
+ nvars
;
862 froms
= XCALLOC (short *, nvectors
);
863 tos
= XCALLOC (short *, nvectors
);
864 tally
= XCALLOC (short, nvectors
);
865 width
= XCALLOC (short, nvectors
);
872 XFREE (goto_map
+ ntokens
);
884 for (i
= 0; i
< nstates
; ++i
)
886 XFREE (state_table
[i
]->shifts
);
887 XFREE (state_table
[i
]->reductions
);
888 XFREE (state_table
[i
]->errs
);
889 free (state_table
[i
]);
895 /*------------------------------------------------------------.
896 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
897 | and do the muscle substitution. |
898 `------------------------------------------------------------*/
901 output_parser (const char *skel_filename
, struct obstack
*oout
)
907 fskel
= xfopen (skel_filename
, "r");
909 /* New output code. */
918 obstack_1grow (oout
, c
);
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
);
935 obstack_sgrow (oout
, muscle_value
);
936 else if (!strcmp (muscle_key
, "line"))
937 obstack_fgrow1 (oout
, "%d", line
+ 1);
940 obstack_sgrow (oout
, "%%");
941 obstack_sgrow (oout
, muscle_key
);
945 obstack_1grow (oout
, '%');
952 /*----------------------------------------.
953 | Prepare the master parser to be output |
954 `----------------------------------------*/
957 output_master_parser (void)
962 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
964 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
966 muscle_insert ("skeleton", skeleton
);
967 output_parser (skeleton
, &table_obstack
);
973 #define MUSCLE_INSERT_INT(Key, Value) \
975 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
976 obstack_1grow (&muscle_obstack, 0); \
977 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
980 #define MUSCLE_INSERT_STRING(Key, Value) \
982 obstack_sgrow (&muscle_obstack, Value); \
983 obstack_1grow (&muscle_obstack, 0); \
984 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
987 #define MUSCLE_INSERT_PREFIX(Key, Value) \
989 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
990 obstack_1grow (&muscle_obstack, 0); \
991 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
997 MUSCLE_INSERT_INT ("last", high
);
998 MUSCLE_INSERT_INT ("flag", MINSHORT
);
999 MUSCLE_INSERT_INT ("pure", pure_parser
);
1000 MUSCLE_INSERT_INT ("nsym", nsyms
);
1001 MUSCLE_INSERT_INT ("debug", debug_flag
);
1002 MUSCLE_INSERT_INT ("final", final_state
);
1003 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1004 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1005 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1006 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1008 MUSCLE_INSERT_INT ("nnts", nvars
);
1009 MUSCLE_INSERT_INT ("nrules", nrules
);
1010 MUSCLE_INSERT_INT ("nstates", nstates
);
1011 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1013 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1015 /* We need to save the actions in the muscle %%action. */
1016 obstack_1grow (&action_obstack
, 0);
1017 muscle_insert ("action", obstack_finish (&action_obstack
));
1021 /*----------------------------------------------------------.
1022 | Output the parsing tables and the parser code to ftable. |
1023 `----------------------------------------------------------*/
1028 obstack_init (&output_obstack
);
1030 output_token_translations ();
1034 if (semantic_parser
)
1036 output_rule_data ();
1037 XFREE (user_toknums
);
1041 /* Copy definitions in directive. */
1042 obstack_1grow (&attrs_obstack
, 0);
1043 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1045 output_master_parser ();
1047 obstack_free (&muscle_obstack
, 0);
1048 obstack_free (&output_obstack
, 0);
1049 obstack_free (&action_obstack
, 0);