]>
git.saurik.com Git - bison.git/blob - src/output.c
ff8b72c0409a1b44efd965c0aca8c2f77e6096c9
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"
107 extern void berror
PARAMS((const char *));
111 static short **froms
= NULL
;
112 static short **tos
= NULL
;
113 static short *tally
= NULL
;
114 static short *width
= NULL
;
115 static short *actrow
= NULL
;
116 static short *state_count
= NULL
;
117 static short *order
= NULL
;
118 static short *base
= NULL
;
119 static short *pos
= NULL
;
120 static short *table
= NULL
;
121 static short *check
= NULL
;
125 struct obstack muscle_obstack
;
126 struct obstack output_obstack
;
131 output_table_data (struct obstack
*oout
,
140 obstack_fgrow1 (oout
, "%6d", first
);
141 for (i
= begin
; i
< end
; ++i
)
143 obstack_1grow (oout
, ',');
146 obstack_sgrow (oout
, "\n ");
151 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
153 obstack_1grow (oout
, 0);
158 output_token_translations (void)
160 output_table_data (&output_obstack
, token_translations
,
161 0, 1, max_user_token_number
+ 1);
162 muscle_insert ("translate", obstack_finish (&output_obstack
));
163 XFREE (token_translations
);
170 output_table_data (&output_obstack
, rrhs
,
172 muscle_insert ("prhs", obstack_finish (&output_obstack
));
175 size_t yyrhs_size
= 1;
179 for (sp
= ritem
+ 1; *sp
; sp
++)
181 yyrhs
= XMALLOC (short, yyrhs_size
);
183 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
184 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
186 output_table_data (&output_obstack
, yyrhs
,
187 ritem
[0], 1, yyrhs_size
);
188 muscle_insert ("rhs", obstack_finish (&output_obstack
));
194 if (!semantic_parser
&& !no_parser_flag
)
195 obstack_sgrow (&table_obstack
, "\n#endif\n");
204 short *values
= (short *) alloca (sizeof (short) * nstates
);
205 for (i
= 0; i
< nstates
; ++i
)
206 values
[i
] = state_table
[i
].accessing_symbol
;
207 output_table_data (&output_obstack
, values
,
209 muscle_insert ("stos", obstack_finish (&output_obstack
));
214 output_rule_data (void)
218 short *short_tab
= NULL
;
220 output_table_data (&output_obstack
, rline
,
222 muscle_insert ("rline", obstack_finish (&output_obstack
));
225 for (i
= 0; i
< nsyms
; i
++)
226 /* this used to be i<=nsyms, but that output a final "" symbol
227 almost by accident */
229 /* Width of the next token, including the two quotes, the coma
234 for (p
= tags
[i
]; p
&& *p
; p
++)
235 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
238 else if (*p
< 040 || *p
>= 0177)
243 if (j
+ strsize
> 75)
245 obstack_sgrow (&output_obstack
, "\n ");
249 obstack_1grow (&output_obstack
, '\"');
250 for (p
= tags
[i
]; p
&& *p
; p
++)
252 if (*p
== '"' || *p
== '\\')
253 obstack_fgrow1 (&output_obstack
, "\\%c", *p
);
255 obstack_sgrow (&output_obstack
, "\\n");
257 obstack_sgrow (&output_obstack
, "\\t");
259 obstack_sgrow (&output_obstack
, "\\b");
260 else if (*p
< 040 || *p
>= 0177)
261 obstack_fgrow1 (&output_obstack
, "\\%03o", *p
);
263 obstack_1grow (&output_obstack
, *p
);
266 obstack_sgrow (&output_obstack
, "\", ");
269 /* add a NULL entry to list of tokens */
270 obstack_sgrow (&output_obstack
, "NULL");
272 /* Finish table and store. */
273 obstack_1grow (&output_obstack
, 0);
274 muscle_insert ("tname", obstack_finish (&output_obstack
));
276 /* Output YYTOKNUM. */
277 output_table_data (&output_obstack
, user_toknums
,
279 muscle_insert ("toknum", obstack_finish (&output_obstack
));
282 output_table_data (&output_obstack
, rlhs
,
284 muscle_insert ("r1", obstack_finish (&output_obstack
));
288 short_tab
= XMALLOC (short, nrules
+ 1);
289 for (i
= 1; i
< nrules
; i
++)
290 short_tab
[i
] = rrhs
[i
+ 1] - rrhs
[i
] - 1;
291 short_tab
[nrules
] = nitems
- rrhs
[nrules
] - 1;
292 output_table_data (&output_obstack
, short_tab
,
294 muscle_insert ("r2", obstack_finish (&output_obstack
));
300 /*------------------------------------------------------------------.
301 | Decide what to do for each type of token if seen as the lookahead |
302 | token in specified state. The value returned is used as the |
303 | default action (yydefact) for the state. In addition, actrow is |
304 | filled with what to do for each kind of token, index by symbol |
305 | number, with zero meaning do the default action. The value |
306 | MINSHORT, a very negative number, means this situation is an |
307 | error. The parser recognizes this value specially. |
309 | This is where conflicts are resolved. The loop over lookahead |
310 | rules considered lower-numbered rules last, and the last rule |
311 | considered that likes a token gets to handle it. |
312 `------------------------------------------------------------------*/
315 action_row (int state
)
334 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
336 for (i
= 0; i
< ntokens
; i
++)
341 redp
= reduction_table
[state
];
349 /* loop over all the rules available here which require
351 m
= lookaheads
[state
];
352 n
= lookaheads
[state
+ 1];
354 for (i
= n
- 1; i
>= m
; i
--)
357 wordp
= LA
+ i
* tokensetsize
;
360 /* and find each token which the rule finds acceptable
362 for (j
= 0; j
< ntokens
; j
++)
364 /* and record this rule as the rule to use if that
380 shiftp
= shift_table
[state
];
382 /* Now see which tokens are allowed for shifts in this state. For
383 them, record the shift as the thing to do. So shift is preferred
390 for (i
= 0; i
< k
; i
++)
392 shift_state
= shiftp
->shifts
[i
];
396 symbol
= state_table
[shift_state
].accessing_symbol
;
401 actrow
[symbol
] = shift_state
;
403 /* Do not use any default reduction if there is a shift for
405 if (symbol
== error_token_number
)
410 errp
= err_table
[state
];
412 /* See which tokens are an explicit error in this state (due to
413 %nonassoc). For them, record MINSHORT as the action. */
419 for (i
= 0; i
< k
; i
++)
421 symbol
= errp
->errs
[i
];
422 actrow
[symbol
] = MINSHORT
;
426 /* Now find the most common reduction and make it the default action
429 if (nreds
>= 1 && !nodefault
)
431 if (consistent
[state
])
432 default_rule
= redp
->rules
[0];
436 for (i
= m
; i
< n
; i
++)
441 for (j
= 0; j
< ntokens
; j
++)
443 if (actrow
[j
] == rule
)
454 /* actions which match the default are replaced with zero,
455 which means "use the default" */
459 for (j
= 0; j
< ntokens
; j
++)
461 if (actrow
[j
] == default_rule
)
465 default_rule
= -default_rule
;
470 /* If have no default rule, the default is an error.
471 So replace any action which says "error" with "use default". */
473 if (default_rule
== 0)
474 for (j
= 0; j
< ntokens
; j
++)
476 if (actrow
[j
] == MINSHORT
)
494 for (i
= 0; i
< ntokens
; i
++)
503 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
504 tos
[state
] = sp2
= XCALLOC (short, count
);
506 for (i
= 0; i
< ntokens
; i
++)
515 tally
[state
] = count
;
516 width
[state
] = sp1
[-1] - sp
[0] + 1;
520 /*------------------------------------------------------------------.
521 | Figure out the actions for the specified state, indexed by |
522 | lookahead token type. |
524 | The YYDEFACT table is output now. The detailed info is saved for |
525 | putting into YYTABLE later. |
526 `------------------------------------------------------------------*/
532 short *yydefact
= XCALLOC (short, nstates
);
534 actrow
= XCALLOC (short, ntokens
);
535 for (i
= 0; i
< nstates
; ++i
)
537 yydefact
[i
] = action_row (i
);
541 output_table_data (&output_obstack
, yydefact
,
542 yydefact
[0], 1, nstates
);
543 muscle_insert ("defact", obstack_finish (&output_obstack
));
553 shifts
*sp
, *sptmp
; /* JF derefrenced freed ptr */
557 for (sp
= first_shift
; sp
; sp
= sptmp
)
566 free_reductions (void)
568 reductions
*rp
, *rptmp
; /* JF fixed freed ptr */
570 XFREE (reduction_table
);
572 for (rp
= first_reduction
; rp
; rp
= rptmp
)
582 save_column (int symbol
, int default_state
)
591 short begin
= goto_map
[symbol
];
592 short end
= goto_map
[symbol
+ 1];
595 for (i
= begin
; i
< end
; i
++)
597 if (to_state
[i
] != default_state
)
604 symno
= symbol
- ntokens
+ nstates
;
606 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
607 tos
[symno
] = sp2
= XCALLOC (short, count
);
609 for (i
= begin
; i
< end
; i
++)
611 if (to_state
[i
] != default_state
)
613 *sp1
++ = from_state
[i
];
614 *sp2
++ = to_state
[i
];
618 tally
[symno
] = count
;
619 width
[symno
] = sp1
[-1] - sp
[0] + 1;
623 default_goto (int symbol
)
631 m
= goto_map
[symbol
];
632 n
= goto_map
[symbol
+ 1];
637 for (i
= 0; i
< nstates
; i
++)
640 for (i
= m
; i
< n
; i
++)
641 state_count
[to_state
[i
]]++;
646 for (i
= 0; i
< nstates
; i
++)
648 if (state_count
[i
] > max
)
650 max
= state_count
[i
];
655 return default_state
;
659 /*-------------------------------------------------------------------.
660 | Figure out what to do after reducing with each rule, depending on |
661 | the saved state from before the beginning of parsing the data that |
662 | matched this rule. |
664 | The YYDEFGOTO table is output now. The detailed info is saved for |
665 | putting into YYTABLE later. |
666 `-------------------------------------------------------------------*/
672 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
674 state_count
= XCALLOC (short, nstates
);
675 for (i
= ntokens
; i
< nsyms
; ++i
)
677 int default_state
= default_goto (i
);
678 save_column (i
, default_state
);
679 yydefgoto
[i
- ntokens
] = default_state
;
682 output_table_data (&output_obstack
, yydefgoto
,
683 yydefgoto
[0], 1, nsyms
- ntokens
);
684 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
691 /* The next few functions decide how to pack the actions and gotos
692 information into yytable. */
703 order
= XCALLOC (short, nvectors
);
706 for (i
= 0; i
< nvectors
; i
++)
714 while (j
>= 0 && (width
[order
[j
]] < w
))
717 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
720 for (k
= nentries
- 1; k
> j
; k
--)
721 order
[k
+ 1] = order
[k
];
731 matching_state (int vector
)
748 for (prev
= vector
- 1; prev
>= 0; prev
--)
751 if (width
[j
] != w
|| tally
[j
] != t
)
755 for (k
= 0; match
&& k
< t
; k
++)
757 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
770 pack_vector (int vector
)
789 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
793 for (k
= 0; ok
&& k
< t
; k
++)
797 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
803 for (k
= 0; ok
&& k
< vector
; k
++)
811 for (k
= 0; k
< t
; k
++)
815 check
[loc
] = from
[k
];
818 while (table
[lowzero
] != 0)
828 berror ("pack_vector");
829 return 0; /* JF keep lint happy */
840 base
= XCALLOC (short, nvectors
);
841 pos
= XCALLOC (short, nentries
);
842 table
= XCALLOC (short, MAXTABLE
);
843 check
= XCALLOC (short, MAXTABLE
);
848 for (i
= 0; i
< nvectors
; i
++)
851 for (i
= 0; i
< MAXTABLE
; i
++)
854 for (i
= 0; i
< nentries
; i
++)
856 state
= matching_state (i
);
859 place
= pack_vector (i
);
864 base
[order
[i
]] = place
;
867 for (i
= 0; i
< nvectors
; i
++)
880 /* the following functions output yytable, yycheck
881 and the vectors whose elements index the portion starts */
887 output_table_data (&output_obstack
, base
,
888 base
[0], 1, nstates
);
889 muscle_insert ("pact", obstack_finish (&output_obstack
));
892 output_table_data (&output_obstack
, base
,
893 base
[nstates
], nstates
+ 1, nvectors
);
894 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
903 output_table_data (&output_obstack
, table
,
904 table
[0], 1, high
+ 1);
905 muscle_insert ("table", obstack_finish (&output_obstack
));
913 output_table_data (&output_obstack
, check
,
914 check
[0], 1, high
+ 1);
915 muscle_insert ("check", obstack_finish (&output_obstack
));
919 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
923 output_actions (void)
925 nvectors
= nstates
+ nvars
;
927 froms
= XCALLOC (short *, nvectors
);
928 tos
= XCALLOC (short *, nvectors
);
929 tally
= XCALLOC (short, nvectors
);
930 width
= XCALLOC (short, nvectors
);
940 XFREE (goto_map
+ ntokens
);
955 /*------------------------------------------------------------.
956 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
957 | and do the muscle substitution. |
958 `------------------------------------------------------------*/
961 output_parser (const char *skel_filename
, struct obstack
*oout
)
967 fskel
= xfopen (skel_filename
, "r");
969 /* New output code. */
978 obstack_1grow (oout
, c
);
981 else if ((c
= getc (fskel
)) == '%')
983 /* Read the muscle. */
984 const char *muscle_key
= 0;
985 const char *muscle_value
= 0;
987 while (isalnum (c
= getc (fskel
)) || c
== '_')
988 obstack_1grow (&muscle_obstack
, c
);
989 obstack_1grow (&muscle_obstack
, 0);
991 /* Output the right value, or see if it's something special. */
992 muscle_key
= obstack_finish (&muscle_obstack
);
993 muscle_value
= muscle_find (muscle_key
);
995 obstack_sgrow (oout
, muscle_value
);
996 else if (!strcmp (muscle_key
, "line"))
997 obstack_fgrow1 (oout
, "%d", line
+ 1);
998 else if (!strcmp (muscle_key
, "input_line"))
999 obstack_fgrow1 (oout
, "%d", lineno
);
1000 /* FIXME: Insert the code to recognize %%sub-skeleton for exemple. */
1003 obstack_sgrow (oout
, "%%");
1004 obstack_sgrow (oout
, muscle_key
);
1008 obstack_1grow (oout
, '%');
1015 /*----------------------------------------.
1016 | Prepare the master parser to be output |
1017 `----------------------------------------*/
1020 output_master_parser (void)
1024 if (semantic_parser
)
1025 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1027 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1029 output_parser (skeleton
, &table_obstack
);
1034 free_itemsets (void)
1037 for (cp
= first_state
; cp
; cp
= cptmp
)
1046 #define MUSCLE_INSERT_INT(Key, Value) \
1048 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1049 obstack_1grow (&muscle_obstack, 0); \
1050 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1053 #define MUSCLE_INSERT_STRING(Key, Value) \
1055 obstack_sgrow (&muscle_obstack, Value); \
1056 obstack_1grow (&muscle_obstack, 0); \
1057 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1060 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1062 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1063 obstack_1grow (&muscle_obstack, 0); \
1064 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1070 MUSCLE_INSERT_INT ("last", high
);
1071 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1072 MUSCLE_INSERT_INT ("pure", pure_parser
);
1073 MUSCLE_INSERT_INT ("nsym", nsyms
);
1074 MUSCLE_INSERT_INT ("debug", debug_flag
);
1075 MUSCLE_INSERT_INT ("final", final_state
);
1076 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1077 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1078 MUSCLE_INSERT_INT ("verbose", 0);
1080 MUSCLE_INSERT_INT ("nnts", nvars
);
1081 MUSCLE_INSERT_INT ("nrules", nrules
);
1082 MUSCLE_INSERT_INT ("nstates", nstates
);
1083 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1085 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1087 /* We need to save the actions in the muscle %%action. */
1088 muscle_insert ("action", obstack_finish (&action_obstack
));
1090 if (spec_name_prefix
)
1091 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1094 /*----------------------------------------------------------.
1095 | Output the parsing tables and the parser code to ftable. |
1096 `----------------------------------------------------------*/
1101 obstack_init (&output_obstack
);
1105 output_token_translations ();
1109 if (semantic_parser
)
1111 output_rule_data ();
1112 XFREE (user_toknums
);
1116 if (!no_parser_flag
) */
1119 /* Copy definitions in directive. */
1120 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1122 output_master_parser ();
1124 obstack_free (&muscle_obstack
, 0);
1125 obstack_free (&output_obstack
, 0);
1126 obstack_free (&action_obstack
, 0);