]>
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
));
202 if (!semantic_parser
)
203 obstack_sgrow (&table_obstack
, "\n#endif\n");
212 short *values
= (short *) alloca (sizeof (short) * nstates
);
213 for (i
= 0; i
< nstates
; ++i
)
214 values
[i
] = state_table
[i
]->accessing_symbol
;
215 output_table_data (&output_obstack
, values
,
217 muscle_insert ("stos", obstack_finish (&output_obstack
));
222 output_rule_data (void)
226 short *short_tab
= NULL
;
229 short *values
= XCALLOC (short, nrules
+ 1);
230 for (i
= 0; i
< nrules
+ 1; ++i
)
231 values
[i
] = rule_table
[i
].line
;
232 output_table_data (&output_obstack
, values
,
234 muscle_insert ("rline", obstack_finish (&output_obstack
));
240 for (i
= 0; i
< nsyms
; i
++)
242 /* Be sure not to use twice the same quotearg slot. */
244 quotearg_n_style (1, c_quoting_style
,
245 quotearg_style (escape_quoting_style
, tags
[i
]));
246 /* Width of the next token, including the two quotes, the coma
248 int strsize
= strlen (cp
) + 2;
250 if (j
+ strsize
> 75)
252 obstack_sgrow (&output_obstack
, "\n ");
256 obstack_sgrow (&output_obstack
, cp
);
257 obstack_sgrow (&output_obstack
, ", ");
260 /* add a NULL entry to list of tokens */
261 obstack_sgrow (&output_obstack
, "NULL");
263 /* Finish table and store. */
264 obstack_1grow (&output_obstack
, 0);
265 muscle_insert ("tname", obstack_finish (&output_obstack
));
267 /* Output YYTOKNUM. */
268 output_table_data (&output_obstack
, user_toknums
,
270 muscle_insert ("toknum", obstack_finish (&output_obstack
));
274 short *values
= XCALLOC (short, nrules
+ 1);
275 for (i
= 0; i
< nrules
+ 1; ++i
)
276 values
[i
] = rule_table
[i
].lhs
;
277 output_table_data (&output_obstack
, values
,
279 muscle_insert ("r1", obstack_finish (&output_obstack
));
284 short_tab
= XMALLOC (short, nrules
+ 1);
285 for (i
= 1; i
< nrules
; i
++)
286 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
287 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
288 output_table_data (&output_obstack
, short_tab
,
290 muscle_insert ("r2", obstack_finish (&output_obstack
));
294 /*------------------------------------------------------------------.
295 | Decide what to do for each type of token if seen as the lookahead |
296 | token in specified state. The value returned is used as the |
297 | default action (yydefact) for the state. In addition, actrow is |
298 | filled with what to do for each kind of token, index by symbol |
299 | number, with zero meaning do the default action. The value |
300 | MINSHORT, a very negative number, means this situation is an |
301 | error. The parser recognizes this value specially. |
303 | This is where conflicts are resolved. The loop over lookahead |
304 | rules considered lower-numbered rules last, and the last rule |
305 | considered that likes a token gets to handle it. |
306 `------------------------------------------------------------------*/
309 action_row (int state
)
324 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
326 for (i
= 0; i
< ntokens
; i
++)
331 redp
= state_table
[state
]->reductions
;
339 /* loop over all the rules available here which require
341 m
= state_table
[state
]->lookaheads
;
342 n
= state_table
[state
+ 1]->lookaheads
;
344 for (i
= n
- 1; i
>= m
; i
--)
345 /* and find each token which the rule finds acceptable
347 for (j
= 0; j
< ntokens
; j
++)
348 /* and record this rule as the rule to use if that
350 if (BITISSET (LA (i
), j
))
351 actrow
[j
] = -LAruleno
[i
];
355 /* Now see which tokens are allowed for shifts in this state. For
356 them, record the shift as the thing to do. So shift is preferred
358 shiftp
= state_table
[state
]->shifts
;
359 for (i
= 0; i
< shiftp
->nshifts
; i
++)
361 shift_state
= shiftp
->shifts
[i
];
365 symbol
= state_table
[shift_state
]->accessing_symbol
;
370 actrow
[symbol
] = shift_state
;
372 /* Do not use any default reduction if there is a shift for
374 if (symbol
== error_token_number
)
378 /* See which tokens are an explicit error in this state (due to
379 %nonassoc). For them, record MINSHORT as the action. */
380 errp
= state_table
[state
]->errs
;
386 for (i
= 0; i
< k
; i
++)
388 symbol
= errp
->errs
[i
];
389 actrow
[symbol
] = MINSHORT
;
393 /* Now find the most common reduction and make it the default action
396 if (nreds
>= 1 && !nodefault
)
398 if (state_table
[state
]->consistent
)
399 default_rule
= redp
->rules
[0];
403 for (i
= m
; i
< n
; i
++)
408 for (j
= 0; j
< ntokens
; j
++)
410 if (actrow
[j
] == rule
)
421 /* actions which match the default are replaced with zero,
422 which means "use the default" */
426 for (j
= 0; j
< ntokens
; j
++)
428 if (actrow
[j
] == default_rule
)
432 default_rule
= -default_rule
;
437 /* If have no default rule, the default is an error.
438 So replace any action which says "error" with "use default". */
440 if (default_rule
== 0)
441 for (j
= 0; j
< ntokens
; j
++)
443 if (actrow
[j
] == MINSHORT
)
461 for (i
= 0; i
< ntokens
; i
++)
470 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
471 tos
[state
] = sp2
= XCALLOC (short, count
);
473 for (i
= 0; i
< ntokens
; i
++)
482 tally
[state
] = count
;
483 width
[state
] = sp1
[-1] - sp
[0] + 1;
487 /*------------------------------------------------------------------.
488 | Figure out the actions for the specified state, indexed by |
489 | lookahead token type. |
491 | The YYDEFACT table is output now. The detailed info is saved for |
492 | putting into YYTABLE later. |
493 `------------------------------------------------------------------*/
499 short *yydefact
= XCALLOC (short, nstates
);
501 actrow
= XCALLOC (short, ntokens
);
502 for (i
= 0; i
< nstates
; ++i
)
504 yydefact
[i
] = action_row (i
);
508 output_table_data (&output_obstack
, yydefact
,
509 yydefact
[0], 1, nstates
);
510 muscle_insert ("defact", obstack_finish (&output_obstack
));
517 /*-----------------------------.
518 | Output the actions to OOUT. |
519 `-----------------------------*/
522 actions_output (FILE *out
)
525 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
526 if (rule_table
[rule
].action
)
528 fprintf (out
, " case %d:\n", rule
);
531 fprintf (out
, muscle_find ("linef"),
532 rule_table
[rule
].action_line
,
533 quotearg_style (c_quoting_style
,
534 muscle_find ("filename")));
535 /* As a Bison extension, add the ending semicolon. Since some
536 Yacc don't do that, help people using bison as a Yacc
537 finding their missing semicolons. */
538 fprintf (out
, "{ %s%s }\n break;\n\n",
539 rule_table
[rule
].action
,
540 yacc_flag
? ";" : "");
546 save_column (int symbol
, int default_state
)
555 short begin
= goto_map
[symbol
];
556 short end
= goto_map
[symbol
+ 1];
559 for (i
= begin
; i
< end
; i
++)
561 if (to_state
[i
] != default_state
)
568 symno
= symbol
- ntokens
+ nstates
;
570 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
571 tos
[symno
] = sp2
= XCALLOC (short, count
);
573 for (i
= begin
; i
< end
; i
++)
575 if (to_state
[i
] != default_state
)
577 *sp1
++ = from_state
[i
];
578 *sp2
++ = to_state
[i
];
582 tally
[symno
] = count
;
583 width
[symno
] = sp1
[-1] - sp
[0] + 1;
587 default_goto (int symbol
)
595 m
= goto_map
[symbol
];
596 n
= goto_map
[symbol
+ 1];
601 for (i
= 0; i
< nstates
; i
++)
604 for (i
= m
; i
< n
; i
++)
605 state_count
[to_state
[i
]]++;
610 for (i
= 0; i
< nstates
; i
++)
612 if (state_count
[i
] > max
)
614 max
= state_count
[i
];
619 return default_state
;
623 /*-------------------------------------------------------------------.
624 | Figure out what to do after reducing with each rule, depending on |
625 | the saved state from before the beginning of parsing the data that |
626 | matched this rule. |
628 | The YYDEFGOTO table is output now. The detailed info is saved for |
629 | putting into YYTABLE later. |
630 `-------------------------------------------------------------------*/
636 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
638 state_count
= XCALLOC (short, nstates
);
639 for (i
= ntokens
; i
< nsyms
; ++i
)
641 int default_state
= default_goto (i
);
642 save_column (i
, default_state
);
643 yydefgoto
[i
- ntokens
] = default_state
;
646 output_table_data (&output_obstack
, yydefgoto
,
647 yydefgoto
[0], 1, nsyms
- ntokens
);
648 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
655 /* The next few functions decide how to pack the actions and gotos
656 information into yytable. */
667 order
= XCALLOC (short, nvectors
);
670 for (i
= 0; i
< nvectors
; i
++)
678 while (j
>= 0 && (width
[order
[j
]] < w
))
681 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
684 for (k
= nentries
- 1; k
> j
; k
--)
685 order
[k
+ 1] = order
[k
];
695 matching_state (int vector
)
712 for (prev
= vector
- 1; prev
>= 0; prev
--)
715 if (width
[j
] != w
|| tally
[j
] != t
)
719 for (k
= 0; match
&& k
< t
; k
++)
721 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
734 pack_vector (int vector
)
753 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
757 for (k
= 0; ok
&& k
< t
; k
++)
761 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
767 for (k
= 0; ok
&& k
< vector
; k
++)
775 for (k
= 0; k
< t
; k
++)
779 check
[loc
] = from
[k
];
782 while (table
[lowzero
] != 0)
792 assert (!"pack_vector");
804 base
= XCALLOC (short, nvectors
);
805 pos
= XCALLOC (short, nentries
);
806 table
= XCALLOC (short, MAXTABLE
);
807 check
= XCALLOC (short, MAXTABLE
);
812 for (i
= 0; i
< nvectors
; i
++)
815 for (i
= 0; i
< MAXTABLE
; i
++)
818 for (i
= 0; i
< nentries
; i
++)
820 state
= matching_state (i
);
823 place
= pack_vector (i
);
828 base
[order
[i
]] = place
;
831 for (i
= 0; i
< nvectors
; i
++)
844 /* the following functions output yytable, yycheck
845 and the vectors whose elements index the portion starts */
851 output_table_data (&output_obstack
, base
,
852 base
[0], 1, nstates
);
853 muscle_insert ("pact", obstack_finish (&output_obstack
));
856 output_table_data (&output_obstack
, base
,
857 base
[nstates
], nstates
+ 1, nvectors
);
858 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
867 output_table_data (&output_obstack
, table
,
868 table
[0], 1, high
+ 1);
869 muscle_insert ("table", obstack_finish (&output_obstack
));
877 output_table_data (&output_obstack
, check
,
878 check
[0], 1, high
+ 1);
879 muscle_insert ("check", obstack_finish (&output_obstack
));
883 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
887 output_actions (void)
890 nvectors
= nstates
+ nvars
;
892 froms
= XCALLOC (short *, nvectors
);
893 tos
= XCALLOC (short *, nvectors
);
894 tally
= XCALLOC (short, nvectors
);
895 width
= XCALLOC (short, nvectors
);
902 XFREE (goto_map
+ ntokens
);
914 for (i
= 0; i
< nstates
; ++i
)
916 XFREE (state_table
[i
]->shifts
);
917 XFREE (state_table
[i
]->reductions
);
918 XFREE (state_table
[i
]->errs
);
919 free (state_table
[i
]);
925 /*------------------------------------------------------------.
926 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
927 | and do the muscle substitution. |
928 `------------------------------------------------------------*/
931 output_parser (const char *skel_filename
, FILE *out
)
937 fskel
= xfopen (skel_filename
, "r");
939 /* New output code. */
951 else if ((c
= getc (fskel
)) == '%')
953 /* Read the muscle. */
954 const char *muscle_key
= 0;
955 const char *muscle_value
= 0;
957 while (isalnum (c
= getc (fskel
)) || c
== '-')
958 obstack_1grow (&muscle_obstack
, c
);
959 obstack_1grow (&muscle_obstack
, 0);
961 /* Output the right value, or see if it's something special. */
962 muscle_key
= obstack_finish (&muscle_obstack
);
963 muscle_value
= muscle_find (muscle_key
);
964 if (!strcmp (muscle_key
, "actions"))
965 actions_output (out
);
966 else if (!strcmp (muscle_key
, "line"))
967 fprintf (out
, "%d", line
+ 1);
968 else if (muscle_value
)
969 fputs (muscle_value
, out
);
973 fputs (muscle_key
, out
);
984 /*----------------------------------------.
985 | Prepare the master parser to be output |
986 `----------------------------------------*/
989 output_master_parser (void)
991 FILE *parser
= xfopen (parser_file_name
, "w");
995 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
997 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
999 muscle_insert ("skeleton", skeleton
);
1001 output_parser (skeleton
, parser
);
1008 #define MUSCLE_INSERT_INT(Key, Value) \
1010 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1011 obstack_1grow (&muscle_obstack, 0); \
1012 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1015 #define MUSCLE_INSERT_STRING(Key, Value) \
1017 obstack_sgrow (&muscle_obstack, Value); \
1018 obstack_1grow (&muscle_obstack, 0); \
1019 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1022 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1024 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1025 obstack_1grow (&muscle_obstack, 0); \
1026 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1032 MUSCLE_INSERT_INT ("last", high
);
1033 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1034 MUSCLE_INSERT_INT ("pure", pure_parser
);
1035 MUSCLE_INSERT_INT ("nsym", nsyms
);
1036 MUSCLE_INSERT_INT ("debug", debug_flag
);
1037 MUSCLE_INSERT_INT ("final", final_state
);
1038 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1039 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1040 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1041 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1043 MUSCLE_INSERT_INT ("nnts", nvars
);
1044 MUSCLE_INSERT_INT ("nrules", nrules
);
1045 MUSCLE_INSERT_INT ("nstates", nstates
);
1046 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1048 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1052 /*-------------------------.
1053 | Output the header file. |
1054 `-------------------------*/
1057 header_output (void)
1059 FILE *out
= xfopen (spec_defines_file
, "w");
1060 char *macro_name
= compute_header_macro ();
1062 fprintf (out
, "#ifndef %s\n", macro_name
);
1063 fprintf (out
, "# define %s\n\n", macro_name
);
1065 fputs (muscle_find ("tokendef"), out
);
1070 # define YYSTYPE yystype\n\
1072 muscle_find ("stype"));
1075 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1077 if (semantic_parser
)
1081 for (i
= ntokens
; i
< nsyms
; i
++)
1082 /* don't make these for dummy nonterminals made by gensym. */
1083 if (*tags
[i
] != '@')
1084 fprintf (out
, "# define\tNT%s\t%d\n", tags
[i
], i
);
1087 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1093 /*----------------------------------------------------------.
1094 | Output the parsing tables and the parser code to ftable. |
1095 `----------------------------------------------------------*/
1100 obstack_init (&output_obstack
);
1102 output_token_translations ();
1106 if (semantic_parser
)
1108 output_rule_data ();
1109 XFREE (user_toknums
);
1113 /* Copy definitions in directive. */
1114 obstack_1grow (&attrs_obstack
, 0);
1115 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1117 /* Output the parser. */
1118 output_master_parser ();
1119 /* Output the header if needed. */
1123 free (rule_table
+ 1);
1124 obstack_free (&muscle_obstack
, 0);
1125 obstack_free (&output_obstack
, 0);
1126 obstack_free (&action_obstack
, 0);