]>
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 struct obstack output_obstack
;
126 int error_verbose
= 0;
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
);
172 short *values
= XCALLOC (short, nrules
+ 1);
173 for (i
= 0; i
< nrules
+ 1; ++i
)
174 values
[i
] = rule_table
[i
].rhs
;
175 output_table_data (&output_obstack
, values
,
180 muscle_insert ("prhs", obstack_finish (&output_obstack
));
183 size_t yyrhs_size
= 1;
187 for (sp
= ritem
+ 1; *sp
; sp
++)
189 yyrhs
= XMALLOC (short, yyrhs_size
);
191 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
192 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
194 output_table_data (&output_obstack
, yyrhs
,
195 ritem
[0], 1, yyrhs_size
);
196 muscle_insert ("rhs", obstack_finish (&output_obstack
));
207 short *values
= (short *) alloca (sizeof (short) * nstates
);
208 for (i
= 0; i
< nstates
; ++i
)
209 values
[i
] = state_table
[i
]->accessing_symbol
;
210 output_table_data (&output_obstack
, values
,
212 muscle_insert ("stos", obstack_finish (&output_obstack
));
217 output_rule_data (void)
221 short *short_tab
= NULL
;
224 short *values
= XCALLOC (short, nrules
+ 1);
225 for (i
= 0; i
< nrules
+ 1; ++i
)
226 values
[i
] = rule_table
[i
].line
;
227 output_table_data (&output_obstack
, values
,
229 muscle_insert ("rline", obstack_finish (&output_obstack
));
235 for (i
= 0; i
< nsyms
; i
++)
237 /* Be sure not to use twice the same quotearg slot. */
239 quotearg_n_style (1, c_quoting_style
,
240 quotearg_style (escape_quoting_style
, tags
[i
]));
241 /* Width of the next token, including the two quotes, the coma
243 int strsize
= strlen (cp
) + 2;
245 if (j
+ strsize
> 75)
247 obstack_sgrow (&output_obstack
, "\n ");
251 obstack_sgrow (&output_obstack
, cp
);
252 obstack_sgrow (&output_obstack
, ", ");
255 /* add a NULL entry to list of tokens */
256 obstack_sgrow (&output_obstack
, "NULL");
258 /* Finish table and store. */
259 obstack_1grow (&output_obstack
, 0);
260 muscle_insert ("tname", obstack_finish (&output_obstack
));
262 /* Output YYTOKNUM. */
263 output_table_data (&output_obstack
, user_toknums
,
265 muscle_insert ("toknum", obstack_finish (&output_obstack
));
269 short *values
= XCALLOC (short, nrules
+ 1);
270 for (i
= 0; i
< nrules
+ 1; ++i
)
271 values
[i
] = rule_table
[i
].lhs
;
272 output_table_data (&output_obstack
, values
,
274 muscle_insert ("r1", obstack_finish (&output_obstack
));
279 short_tab
= XMALLOC (short, nrules
+ 1);
280 for (i
= 1; i
< nrules
; i
++)
281 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
282 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
283 output_table_data (&output_obstack
, short_tab
,
285 muscle_insert ("r2", obstack_finish (&output_obstack
));
289 /*------------------------------------------------------------------.
290 | Decide what to do for each type of token if seen as the lookahead |
291 | token in specified state. The value returned is used as the |
292 | default action (yydefact) for the state. In addition, actrow is |
293 | filled with what to do for each kind of token, index by symbol |
294 | number, with zero meaning do the default action. The value |
295 | MINSHORT, a very negative number, means this situation is an |
296 | error. The parser recognizes this value specially. |
298 | This is where conflicts are resolved. The loop over lookahead |
299 | rules considered lower-numbered rules last, and the last rule |
300 | considered that likes a token gets to handle it. |
301 `------------------------------------------------------------------*/
304 action_row (int state
)
319 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
321 for (i
= 0; i
< ntokens
; i
++)
326 redp
= state_table
[state
]->reductions
;
334 /* loop over all the rules available here which require
336 m
= state_table
[state
]->lookaheads
;
337 n
= state_table
[state
+ 1]->lookaheads
;
339 for (i
= n
- 1; i
>= m
; i
--)
340 /* and find each token which the rule finds acceptable
342 for (j
= 0; j
< ntokens
; j
++)
343 /* and record this rule as the rule to use if that
345 if (BITISSET (LA (i
), j
))
346 actrow
[j
] = -LAruleno
[i
];
350 /* Now see which tokens are allowed for shifts in this state. For
351 them, record the shift as the thing to do. So shift is preferred
353 shiftp
= state_table
[state
]->shifts
;
354 for (i
= 0; i
< shiftp
->nshifts
; i
++)
356 shift_state
= shiftp
->shifts
[i
];
360 symbol
= state_table
[shift_state
]->accessing_symbol
;
365 actrow
[symbol
] = shift_state
;
367 /* Do not use any default reduction if there is a shift for
369 if (symbol
== error_token_number
)
373 /* See which tokens are an explicit error in this state (due to
374 %nonassoc). For them, record MINSHORT as the action. */
375 errp
= state_table
[state
]->errs
;
381 for (i
= 0; i
< k
; i
++)
383 symbol
= errp
->errs
[i
];
384 actrow
[symbol
] = MINSHORT
;
388 /* Now find the most common reduction and make it the default action
391 if (nreds
>= 1 && !nodefault
)
393 if (state_table
[state
]->consistent
)
394 default_rule
= redp
->rules
[0];
398 for (i
= m
; i
< n
; i
++)
403 for (j
= 0; j
< ntokens
; j
++)
405 if (actrow
[j
] == rule
)
416 /* actions which match the default are replaced with zero,
417 which means "use the default" */
421 for (j
= 0; j
< ntokens
; j
++)
423 if (actrow
[j
] == default_rule
)
427 default_rule
= -default_rule
;
432 /* If have no default rule, the default is an error.
433 So replace any action which says "error" with "use default". */
435 if (default_rule
== 0)
436 for (j
= 0; j
< ntokens
; j
++)
438 if (actrow
[j
] == MINSHORT
)
456 for (i
= 0; i
< ntokens
; i
++)
465 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
466 tos
[state
] = sp2
= XCALLOC (short, count
);
468 for (i
= 0; i
< ntokens
; i
++)
477 tally
[state
] = count
;
478 width
[state
] = sp1
[-1] - sp
[0] + 1;
482 /*------------------------------------------------------------------.
483 | Figure out the actions for the specified state, indexed by |
484 | lookahead token type. |
486 | The YYDEFACT table is output now. The detailed info is saved for |
487 | putting into YYTABLE later. |
488 `------------------------------------------------------------------*/
494 short *yydefact
= XCALLOC (short, nstates
);
496 actrow
= XCALLOC (short, ntokens
);
497 for (i
= 0; i
< nstates
; ++i
)
499 yydefact
[i
] = action_row (i
);
503 output_table_data (&output_obstack
, yydefact
,
504 yydefact
[0], 1, nstates
);
505 muscle_insert ("defact", obstack_finish (&output_obstack
));
512 /*-----------------------------.
513 | Output the actions to OOUT. |
514 `-----------------------------*/
517 actions_output (FILE *out
)
520 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
521 if (rule_table
[rule
].action
)
523 fprintf (out
, " case %d:\n", rule
);
526 fprintf (out
, muscle_find ("linef"),
527 rule_table
[rule
].action_line
,
528 quotearg_style (c_quoting_style
,
529 muscle_find ("filename")));
530 /* As a Bison extension, add the ending semicolon. Since some
531 Yacc don't do that, help people using bison as a Yacc
532 finding their missing semicolons. */
533 fprintf (out
, "{ %s%s }\n break;\n\n",
534 rule_table
[rule
].action
,
535 yacc_flag
? ";" : "");
541 save_column (int symbol
, int default_state
)
550 short begin
= goto_map
[symbol
];
551 short end
= goto_map
[symbol
+ 1];
554 for (i
= begin
; i
< end
; i
++)
556 if (to_state
[i
] != default_state
)
563 symno
= symbol
- ntokens
+ nstates
;
565 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
566 tos
[symno
] = sp2
= XCALLOC (short, count
);
568 for (i
= begin
; i
< end
; i
++)
570 if (to_state
[i
] != default_state
)
572 *sp1
++ = from_state
[i
];
573 *sp2
++ = to_state
[i
];
577 tally
[symno
] = count
;
578 width
[symno
] = sp1
[-1] - sp
[0] + 1;
582 default_goto (int symbol
)
590 m
= goto_map
[symbol
];
591 n
= goto_map
[symbol
+ 1];
596 for (i
= 0; i
< nstates
; i
++)
599 for (i
= m
; i
< n
; i
++)
600 state_count
[to_state
[i
]]++;
605 for (i
= 0; i
< nstates
; i
++)
607 if (state_count
[i
] > max
)
609 max
= state_count
[i
];
614 return default_state
;
618 /*-------------------------------------------------------------------.
619 | Figure out what to do after reducing with each rule, depending on |
620 | the saved state from before the beginning of parsing the data that |
621 | matched this rule. |
623 | The YYDEFGOTO table is output now. The detailed info is saved for |
624 | putting into YYTABLE later. |
625 `-------------------------------------------------------------------*/
631 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
633 state_count
= XCALLOC (short, nstates
);
634 for (i
= ntokens
; i
< nsyms
; ++i
)
636 int default_state
= default_goto (i
);
637 save_column (i
, default_state
);
638 yydefgoto
[i
- ntokens
] = default_state
;
641 output_table_data (&output_obstack
, yydefgoto
,
642 yydefgoto
[0], 1, nsyms
- ntokens
);
643 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
650 /* The next few functions decide how to pack the actions and gotos
651 information into yytable. */
662 order
= XCALLOC (short, nvectors
);
665 for (i
= 0; i
< nvectors
; i
++)
673 while (j
>= 0 && (width
[order
[j
]] < w
))
676 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
679 for (k
= nentries
- 1; k
> j
; k
--)
680 order
[k
+ 1] = order
[k
];
690 matching_state (int vector
)
707 for (prev
= vector
- 1; prev
>= 0; prev
--)
710 if (width
[j
] != w
|| tally
[j
] != t
)
714 for (k
= 0; match
&& k
< t
; k
++)
716 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
729 pack_vector (int vector
)
748 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
752 for (k
= 0; ok
&& k
< t
; k
++)
756 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
762 for (k
= 0; ok
&& k
< vector
; k
++)
770 for (k
= 0; k
< t
; k
++)
774 check
[loc
] = from
[k
];
777 while (table
[lowzero
] != 0)
787 assert (!"pack_vector");
799 base
= XCALLOC (short, nvectors
);
800 pos
= XCALLOC (short, nentries
);
801 table
= XCALLOC (short, MAXTABLE
);
802 check
= XCALLOC (short, MAXTABLE
);
807 for (i
= 0; i
< nvectors
; i
++)
810 for (i
= 0; i
< MAXTABLE
; i
++)
813 for (i
= 0; i
< nentries
; i
++)
815 state
= matching_state (i
);
818 place
= pack_vector (i
);
823 base
[order
[i
]] = place
;
826 for (i
= 0; i
< nvectors
; i
++)
839 /* the following functions output yytable, yycheck
840 and the vectors whose elements index the portion starts */
846 output_table_data (&output_obstack
, base
,
847 base
[0], 1, nstates
);
848 muscle_insert ("pact", obstack_finish (&output_obstack
));
851 output_table_data (&output_obstack
, base
,
852 base
[nstates
], nstates
+ 1, nvectors
);
853 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
862 output_table_data (&output_obstack
, table
,
863 table
[0], 1, high
+ 1);
864 muscle_insert ("table", obstack_finish (&output_obstack
));
872 output_table_data (&output_obstack
, check
,
873 check
[0], 1, high
+ 1);
874 muscle_insert ("check", obstack_finish (&output_obstack
));
878 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
882 output_actions (void)
885 nvectors
= nstates
+ nvars
;
887 froms
= XCALLOC (short *, nvectors
);
888 tos
= XCALLOC (short *, nvectors
);
889 tally
= XCALLOC (short, nvectors
);
890 width
= XCALLOC (short, nvectors
);
897 XFREE (goto_map
+ ntokens
);
909 for (i
= 0; i
< nstates
; ++i
)
911 XFREE (state_table
[i
]->shifts
);
912 XFREE (state_table
[i
]->reductions
);
913 XFREE (state_table
[i
]->errs
);
914 free (state_table
[i
]);
920 /*------------------------------------------------------------.
921 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
922 | and do the muscle substitution. |
923 `------------------------------------------------------------*/
926 output_parser (const char *skel_filename
, FILE *out
)
932 fskel
= xfopen (skel_filename
, "r");
934 /* New output code. */
946 else if ((c
= getc (fskel
)) == '%')
948 /* Read the muscle. */
949 const char *muscle_key
= 0;
950 const char *muscle_value
= 0;
952 while (isalnum (c
= getc (fskel
)) || c
== '-')
953 obstack_1grow (&muscle_obstack
, c
);
954 obstack_1grow (&muscle_obstack
, 0);
956 /* Output the right value, or see if it's something special. */
957 muscle_key
= obstack_finish (&muscle_obstack
);
958 muscle_value
= muscle_find (muscle_key
);
959 if (!strcmp (muscle_key
, "actions"))
960 actions_output (out
);
961 else if (!strcmp (muscle_key
, "line"))
962 fprintf (out
, "%d", line
+ 1);
963 else if (muscle_value
)
964 fputs (muscle_value
, out
);
968 fputs (muscle_key
, out
);
979 /*----------------------------------------.
980 | Prepare the master parser to be output |
981 `----------------------------------------*/
984 output_master_parser (void)
986 FILE *parser
= xfopen (parser_file_name
, "w");
990 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
992 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
994 muscle_insert ("skeleton", skeleton
);
996 output_parser (skeleton
, parser
);
1003 #define MUSCLE_INSERT_INT(Key, Value) \
1005 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1006 obstack_1grow (&muscle_obstack, 0); \
1007 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1010 #define MUSCLE_INSERT_STRING(Key, Value) \
1012 obstack_sgrow (&muscle_obstack, Value); \
1013 obstack_1grow (&muscle_obstack, 0); \
1014 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1017 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1019 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1020 obstack_1grow (&muscle_obstack, 0); \
1021 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1027 MUSCLE_INSERT_INT ("last", high
);
1028 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1029 MUSCLE_INSERT_INT ("pure", pure_parser
);
1030 MUSCLE_INSERT_INT ("nsym", nsyms
);
1031 MUSCLE_INSERT_INT ("debug", debug_flag
);
1032 MUSCLE_INSERT_INT ("final", final_state
);
1033 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1034 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1035 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1036 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1038 MUSCLE_INSERT_INT ("nnts", nvars
);
1039 MUSCLE_INSERT_INT ("nrules", nrules
);
1040 MUSCLE_INSERT_INT ("nstates", nstates
);
1041 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1043 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1047 /*-------------------------.
1048 | Output the header file. |
1049 `-------------------------*/
1052 header_output (void)
1054 FILE *out
= xfopen (spec_defines_file
, "w");
1055 char *macro_name
= compute_header_macro ();
1057 fprintf (out
, "#ifndef %s\n", macro_name
);
1058 fprintf (out
, "# define %s\n\n", macro_name
);
1060 fputs (muscle_find ("tokendef"), out
);
1065 # define YYSTYPE yystype\n\
1067 muscle_find ("stype"));
1070 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1072 if (semantic_parser
)
1076 for (i
= ntokens
; i
< nsyms
; i
++)
1077 /* don't make these for dummy nonterminals made by gensym. */
1078 if (*tags
[i
] != '@')
1079 fprintf (out
, "# define\tNT%s\t%d\n", tags
[i
], i
);
1082 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1088 /*----------------------------------------------------------.
1089 | Output the parsing tables and the parser code to ftable. |
1090 `----------------------------------------------------------*/
1095 obstack_init (&output_obstack
);
1097 output_token_translations ();
1101 if (semantic_parser
)
1103 output_rule_data ();
1104 XFREE (user_toknums
);
1108 /* Copy definitions in directive. */
1109 obstack_1grow (&attrs_obstack
, 0);
1110 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1112 /* Output the parser. */
1113 output_master_parser ();
1114 /* Output the header if needed. */
1118 free (rule_table
+ 1);
1119 obstack_free (&muscle_obstack
, 0);
1120 obstack_free (&output_obstack
, 0);
1121 obstack_free (&action_obstack
, 0);