]>
git.saurik.com Git - bison.git/blob - src/output.c
dd64fe7d03d7328f47fa07bc35ba2eaad2f5c4fa
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
;
128 int error_verbose
= 0;
133 output_table_data (struct obstack
*oout
,
142 obstack_fgrow1 (oout
, "%6d", first
);
143 for (i
= begin
; i
< end
; ++i
)
145 obstack_1grow (oout
, ',');
148 obstack_sgrow (oout
, "\n ");
153 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
155 obstack_1grow (oout
, 0);
160 output_token_translations (void)
162 output_table_data (&output_obstack
, token_translations
,
163 0, 1, max_user_token_number
+ 1);
164 muscle_insert ("translate", obstack_finish (&output_obstack
));
165 XFREE (token_translations
);
174 short *values
= XCALLOC (short, nrules
+ 1);
175 for (i
= 0; i
< nrules
+ 1; ++i
)
176 values
[i
] = rule_table
[i
].rhs
;
177 output_table_data (&output_obstack
, values
,
182 muscle_insert ("prhs", obstack_finish (&output_obstack
));
185 size_t yyrhs_size
= 1;
189 for (sp
= ritem
+ 1; *sp
; sp
++)
191 yyrhs
= XMALLOC (short, yyrhs_size
);
193 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
194 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
196 output_table_data (&output_obstack
, yyrhs
,
197 ritem
[0], 1, yyrhs_size
);
198 muscle_insert ("rhs", obstack_finish (&output_obstack
));
204 if (!semantic_parser
&& !no_parser_flag
)
205 obstack_sgrow (&table_obstack
, "\n#endif\n");
214 short *values
= (short *) alloca (sizeof (short) * nstates
);
215 for (i
= 0; i
< nstates
; ++i
)
216 values
[i
] = state_table
[i
].accessing_symbol
;
217 output_table_data (&output_obstack
, values
,
219 muscle_insert ("stos", obstack_finish (&output_obstack
));
224 output_rule_data (void)
228 short *short_tab
= NULL
;
231 short *values
= XCALLOC (short, nrules
+ 1);
232 for (i
= 0; i
< nrules
+ 1; ++i
)
233 values
[i
] = rule_table
[i
].line
;
234 output_table_data (&output_obstack
, values
,
236 muscle_insert ("rline", obstack_finish (&output_obstack
));
242 for (i
= 0; i
< nsyms
; i
++)
243 /* this used to be i<=nsyms, but that output a final "" symbol
244 almost by accident */
246 /* Width of the next token, including the two quotes, the coma
251 for (p
= tags
[i
]; p
&& *p
; p
++)
252 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
255 else if (*p
< 040 || *p
>= 0177)
260 if (j
+ strsize
> 75)
262 obstack_sgrow (&output_obstack
, "\n ");
266 obstack_1grow (&output_obstack
, '\"');
267 for (p
= tags
[i
]; p
&& *p
; p
++)
269 if (*p
== '"' || *p
== '\\')
270 obstack_fgrow1 (&output_obstack
, "\\%c", *p
);
272 obstack_sgrow (&output_obstack
, "\\n");
274 obstack_sgrow (&output_obstack
, "\\t");
276 obstack_sgrow (&output_obstack
, "\\b");
277 else if (*p
< 040 || *p
>= 0177)
278 obstack_fgrow1 (&output_obstack
, "\\%03o", *p
);
280 obstack_1grow (&output_obstack
, *p
);
283 obstack_sgrow (&output_obstack
, "\", ");
286 /* add a NULL entry to list of tokens */
287 obstack_sgrow (&output_obstack
, "NULL");
289 /* Finish table and store. */
290 obstack_1grow (&output_obstack
, 0);
291 muscle_insert ("tname", obstack_finish (&output_obstack
));
293 /* Output YYTOKNUM. */
294 output_table_data (&output_obstack
, user_toknums
,
296 muscle_insert ("toknum", obstack_finish (&output_obstack
));
300 short *values
= XCALLOC (short, nrules
+ 1);
301 for (i
= 0; i
< nrules
+ 1; ++i
)
302 values
[i
] = rule_table
[i
].lhs
;
303 output_table_data (&output_obstack
, values
,
305 muscle_insert ("r1", obstack_finish (&output_obstack
));
310 short_tab
= XMALLOC (short, nrules
+ 1);
311 for (i
= 1; i
< nrules
; i
++)
312 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
313 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
314 output_table_data (&output_obstack
, short_tab
,
316 muscle_insert ("r2", obstack_finish (&output_obstack
));
319 XFREE (rule_table
+ 1);
322 /*------------------------------------------------------------------.
323 | Decide what to do for each type of token if seen as the lookahead |
324 | token in specified state. The value returned is used as the |
325 | default action (yydefact) for the state. In addition, actrow is |
326 | filled with what to do for each kind of token, index by symbol |
327 | number, with zero meaning do the default action. The value |
328 | MINSHORT, a very negative number, means this situation is an |
329 | error. The parser recognizes this value specially. |
331 | This is where conflicts are resolved. The loop over lookahead |
332 | rules considered lower-numbered rules last, and the last rule |
333 | considered that likes a token gets to handle it. |
334 `------------------------------------------------------------------*/
337 action_row (int state
)
356 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
358 for (i
= 0; i
< ntokens
; i
++)
363 redp
= state_table
[state
].reduction_table
;
371 /* loop over all the rules available here which require
373 m
= state_table
[state
].lookaheads
;
374 n
= state_table
[state
+ 1].lookaheads
;
376 for (i
= n
- 1; i
>= m
; i
--)
382 /* and find each token which the rule finds acceptable
384 for (j
= 0; j
< ntokens
; j
++)
386 /* and record this rule as the rule to use if that
402 /* Now see which tokens are allowed for shifts in this state. For
403 them, record the shift as the thing to do. So shift is preferred
405 shiftp
= state_table
[state
].shift_table
;
407 for (i
= 0; i
< shiftp
->nshifts
; i
++)
409 shift_state
= shiftp
->shifts
[i
];
413 symbol
= state_table
[shift_state
].accessing_symbol
;
418 actrow
[symbol
] = shift_state
;
420 /* Do not use any default reduction if there is a shift for
422 if (symbol
== error_token_number
)
426 /* See which tokens are an explicit error in this state (due to
427 %nonassoc). For them, record MINSHORT as the action. */
428 errp
= err_table
[state
];
434 for (i
= 0; i
< k
; i
++)
436 symbol
= errp
->errs
[i
];
437 actrow
[symbol
] = MINSHORT
;
441 /* Now find the most common reduction and make it the default action
444 if (nreds
>= 1 && !nodefault
)
446 if (state_table
[state
].consistent
)
447 default_rule
= redp
->rules
[0];
451 for (i
= m
; i
< n
; i
++)
456 for (j
= 0; j
< ntokens
; j
++)
458 if (actrow
[j
] == rule
)
469 /* actions which match the default are replaced with zero,
470 which means "use the default" */
474 for (j
= 0; j
< ntokens
; j
++)
476 if (actrow
[j
] == default_rule
)
480 default_rule
= -default_rule
;
485 /* If have no default rule, the default is an error.
486 So replace any action which says "error" with "use default". */
488 if (default_rule
== 0)
489 for (j
= 0; j
< ntokens
; j
++)
491 if (actrow
[j
] == MINSHORT
)
509 for (i
= 0; i
< ntokens
; i
++)
518 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
519 tos
[state
] = sp2
= XCALLOC (short, count
);
521 for (i
= 0; i
< ntokens
; i
++)
530 tally
[state
] = count
;
531 width
[state
] = sp1
[-1] - sp
[0] + 1;
535 /*------------------------------------------------------------------.
536 | Figure out the actions for the specified state, indexed by |
537 | lookahead token type. |
539 | The YYDEFACT table is output now. The detailed info is saved for |
540 | putting into YYTABLE later. |
541 `------------------------------------------------------------------*/
547 short *yydefact
= XCALLOC (short, nstates
);
549 actrow
= XCALLOC (short, ntokens
);
550 for (i
= 0; i
< nstates
; ++i
)
552 yydefact
[i
] = action_row (i
);
556 output_table_data (&output_obstack
, yydefact
,
557 yydefact
[0], 1, nstates
);
558 muscle_insert ("defact", obstack_finish (&output_obstack
));
566 save_column (int symbol
, int default_state
)
575 short begin
= goto_map
[symbol
];
576 short end
= goto_map
[symbol
+ 1];
579 for (i
= begin
; i
< end
; i
++)
581 if (to_state
[i
] != default_state
)
588 symno
= symbol
- ntokens
+ nstates
;
590 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
591 tos
[symno
] = sp2
= XCALLOC (short, count
);
593 for (i
= begin
; i
< end
; i
++)
595 if (to_state
[i
] != default_state
)
597 *sp1
++ = from_state
[i
];
598 *sp2
++ = to_state
[i
];
602 tally
[symno
] = count
;
603 width
[symno
] = sp1
[-1] - sp
[0] + 1;
607 default_goto (int symbol
)
615 m
= goto_map
[symbol
];
616 n
= goto_map
[symbol
+ 1];
621 for (i
= 0; i
< nstates
; i
++)
624 for (i
= m
; i
< n
; i
++)
625 state_count
[to_state
[i
]]++;
630 for (i
= 0; i
< nstates
; i
++)
632 if (state_count
[i
] > max
)
634 max
= state_count
[i
];
639 return default_state
;
643 /*-------------------------------------------------------------------.
644 | Figure out what to do after reducing with each rule, depending on |
645 | the saved state from before the beginning of parsing the data that |
646 | matched this rule. |
648 | The YYDEFGOTO table is output now. The detailed info is saved for |
649 | putting into YYTABLE later. |
650 `-------------------------------------------------------------------*/
656 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
658 state_count
= XCALLOC (short, nstates
);
659 for (i
= ntokens
; i
< nsyms
; ++i
)
661 int default_state
= default_goto (i
);
662 save_column (i
, default_state
);
663 yydefgoto
[i
- ntokens
] = default_state
;
666 output_table_data (&output_obstack
, yydefgoto
,
667 yydefgoto
[0], 1, nsyms
- ntokens
);
668 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
675 /* The next few functions decide how to pack the actions and gotos
676 information into yytable. */
687 order
= XCALLOC (short, nvectors
);
690 for (i
= 0; i
< nvectors
; i
++)
698 while (j
>= 0 && (width
[order
[j
]] < w
))
701 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
704 for (k
= nentries
- 1; k
> j
; k
--)
705 order
[k
+ 1] = order
[k
];
715 matching_state (int vector
)
732 for (prev
= vector
- 1; prev
>= 0; prev
--)
735 if (width
[j
] != w
|| tally
[j
] != t
)
739 for (k
= 0; match
&& k
< t
; k
++)
741 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
754 pack_vector (int vector
)
773 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
777 for (k
= 0; ok
&& k
< t
; k
++)
781 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
787 for (k
= 0; ok
&& k
< vector
; k
++)
795 for (k
= 0; k
< t
; k
++)
799 check
[loc
] = from
[k
];
802 while (table
[lowzero
] != 0)
812 berror ("pack_vector");
813 return 0; /* JF keep lint happy */
824 base
= XCALLOC (short, nvectors
);
825 pos
= XCALLOC (short, nentries
);
826 table
= XCALLOC (short, MAXTABLE
);
827 check
= XCALLOC (short, MAXTABLE
);
832 for (i
= 0; i
< nvectors
; i
++)
835 for (i
= 0; i
< MAXTABLE
; i
++)
838 for (i
= 0; i
< nentries
; i
++)
840 state
= matching_state (i
);
843 place
= pack_vector (i
);
848 base
[order
[i
]] = place
;
851 for (i
= 0; i
< nvectors
; i
++)
864 /* the following functions output yytable, yycheck
865 and the vectors whose elements index the portion starts */
871 output_table_data (&output_obstack
, base
,
872 base
[0], 1, nstates
);
873 muscle_insert ("pact", obstack_finish (&output_obstack
));
876 output_table_data (&output_obstack
, base
,
877 base
[nstates
], nstates
+ 1, nvectors
);
878 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
887 output_table_data (&output_obstack
, table
,
888 table
[0], 1, high
+ 1);
889 muscle_insert ("table", obstack_finish (&output_obstack
));
897 output_table_data (&output_obstack
, check
,
898 check
[0], 1, high
+ 1);
899 muscle_insert ("check", obstack_finish (&output_obstack
));
903 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
907 output_actions (void)
909 nvectors
= nstates
+ nvars
;
911 froms
= XCALLOC (short *, nvectors
);
912 tos
= XCALLOC (short *, nvectors
);
913 tally
= XCALLOC (short, nvectors
);
914 width
= XCALLOC (short, nvectors
);
917 LIST_FREE (shifts
, first_shift
);
918 LIST_FREE (reductions
, first_reduction
);
923 XFREE (goto_map
+ ntokens
);
938 /*------------------------------------------------------------.
939 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
940 | and do the muscle substitution. |
941 `------------------------------------------------------------*/
944 output_parser (const char *skel_filename
, struct obstack
*oout
)
950 fskel
= xfopen (skel_filename
, "r");
952 /* New output code. */
961 obstack_1grow (oout
, c
);
964 else if ((c
= getc (fskel
)) == '%')
966 /* Read the muscle. */
967 const char *muscle_key
= 0;
968 const char *muscle_value
= 0;
970 while (isalnum (c
= getc (fskel
)) || c
== '-')
971 obstack_1grow (&muscle_obstack
, c
);
972 obstack_1grow (&muscle_obstack
, 0);
974 /* Output the right value, or see if it's something special. */
975 muscle_key
= obstack_finish (&muscle_obstack
);
976 muscle_value
= muscle_find (muscle_key
);
978 obstack_sgrow (oout
, muscle_value
);
979 else if (!strcmp (muscle_key
, "line"))
980 obstack_fgrow1 (oout
, "%d", line
+ 1);
981 else if (!strcmp (muscle_key
, "input-line"))
982 obstack_fgrow1 (oout
, "%d", lineno
);
985 obstack_sgrow (oout
, "%%");
986 obstack_sgrow (oout
, muscle_key
);
990 obstack_1grow (oout
, '%');
997 /*----------------------------------------.
998 | Prepare the master parser to be output |
999 `----------------------------------------*/
1002 output_master_parser (void)
1006 if (semantic_parser
)
1007 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1009 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1011 muscle_insert ("skeleton", skeleton
);
1012 output_parser (skeleton
, &table_obstack
);
1018 #define MUSCLE_INSERT_INT(Key, Value) \
1020 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1021 obstack_1grow (&muscle_obstack, 0); \
1022 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1025 #define MUSCLE_INSERT_STRING(Key, Value) \
1027 obstack_sgrow (&muscle_obstack, Value); \
1028 obstack_1grow (&muscle_obstack, 0); \
1029 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1032 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1034 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1035 obstack_1grow (&muscle_obstack, 0); \
1036 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1042 MUSCLE_INSERT_INT ("last", high
);
1043 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1044 MUSCLE_INSERT_INT ("pure", pure_parser
);
1045 MUSCLE_INSERT_INT ("nsym", nsyms
);
1046 MUSCLE_INSERT_INT ("debug", debug_flag
);
1047 MUSCLE_INSERT_INT ("final", final_state
);
1048 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1049 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1050 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1052 MUSCLE_INSERT_INT ("nnts", nvars
);
1053 MUSCLE_INSERT_INT ("nrules", nrules
);
1054 MUSCLE_INSERT_INT ("nstates", nstates
);
1055 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1057 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1059 /* We need to save the actions in the muscle %%action. */
1060 muscle_insert ("action", obstack_finish (&action_obstack
));
1062 if (spec_name_prefix
)
1063 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1066 /*----------------------------------------------------------.
1067 | Output the parsing tables and the parser code to ftable. |
1068 `----------------------------------------------------------*/
1073 obstack_init (&output_obstack
);
1075 LIST_FREE (core
, first_state
);
1077 output_token_translations ();
1081 if (semantic_parser
)
1083 output_rule_data ();
1084 XFREE (user_toknums
);
1088 if (!no_parser_flag
) */
1091 /* Copy definitions in directive. */
1092 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1094 output_master_parser ();
1096 obstack_free (&muscle_obstack
, 0);
1097 obstack_free (&output_obstack
, 0);
1098 obstack_free (&action_obstack
, 0);