]>
git.saurik.com Git - bison.git/blob - src/output.c
3833ec9e746f5bc258d65ca57ca52a61b83b45ef
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
++)
237 /* this used to be i<=nsyms, but that output a final "" symbol
238 almost by accident */
240 /* Width of the next token, including the two quotes, the coma
245 for (p
= tags
[i
]; p
&& *p
; p
++)
246 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
249 else if (*p
< 040 || *p
>= 0177)
254 if (j
+ strsize
> 75)
256 obstack_sgrow (&output_obstack
, "\n ");
260 obstack_1grow (&output_obstack
, '\"');
261 for (p
= tags
[i
]; p
&& *p
; p
++)
263 if (*p
== '"' || *p
== '\\')
264 obstack_fgrow1 (&output_obstack
, "\\%c", *p
);
266 obstack_sgrow (&output_obstack
, "\\n");
268 obstack_sgrow (&output_obstack
, "\\t");
270 obstack_sgrow (&output_obstack
, "\\b");
271 else if (*p
< 040 || *p
>= 0177)
272 obstack_fgrow1 (&output_obstack
, "\\%03o", *p
);
274 obstack_1grow (&output_obstack
, *p
);
277 obstack_sgrow (&output_obstack
, "\", ");
280 /* add a NULL entry to list of tokens */
281 obstack_sgrow (&output_obstack
, "NULL");
283 /* Finish table and store. */
284 obstack_1grow (&output_obstack
, 0);
285 muscle_insert ("tname", obstack_finish (&output_obstack
));
287 /* Output YYTOKNUM. */
288 output_table_data (&output_obstack
, user_toknums
,
290 muscle_insert ("toknum", obstack_finish (&output_obstack
));
294 short *values
= XCALLOC (short, nrules
+ 1);
295 for (i
= 0; i
< nrules
+ 1; ++i
)
296 values
[i
] = rule_table
[i
].lhs
;
297 output_table_data (&output_obstack
, values
,
299 muscle_insert ("r1", obstack_finish (&output_obstack
));
304 short_tab
= XMALLOC (short, nrules
+ 1);
305 for (i
= 1; i
< nrules
; i
++)
306 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
307 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
308 output_table_data (&output_obstack
, short_tab
,
310 muscle_insert ("r2", obstack_finish (&output_obstack
));
313 XFREE (rule_table
+ 1);
316 /*------------------------------------------------------------------.
317 | Decide what to do for each type of token if seen as the lookahead |
318 | token in specified state. The value returned is used as the |
319 | default action (yydefact) for the state. In addition, actrow is |
320 | filled with what to do for each kind of token, index by symbol |
321 | number, with zero meaning do the default action. The value |
322 | MINSHORT, a very negative number, means this situation is an |
323 | error. The parser recognizes this value specially. |
325 | This is where conflicts are resolved. The loop over lookahead |
326 | rules considered lower-numbered rules last, and the last rule |
327 | considered that likes a token gets to handle it. |
328 `------------------------------------------------------------------*/
331 action_row (int state
)
346 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
348 for (i
= 0; i
< ntokens
; i
++)
353 redp
= state_table
[state
]->reductions
;
361 /* loop over all the rules available here which require
363 m
= state_table
[state
]->lookaheads
;
364 n
= state_table
[state
+ 1]->lookaheads
;
366 for (i
= n
- 1; i
>= m
; i
--)
367 /* and find each token which the rule finds acceptable
369 for (j
= 0; j
< ntokens
; j
++)
370 /* and record this rule as the rule to use if that
372 if (BITISSET (LA (i
), j
))
373 actrow
[j
] = -LAruleno
[i
];
377 /* Now see which tokens are allowed for shifts in this state. For
378 them, record the shift as the thing to do. So shift is preferred
380 shiftp
= state_table
[state
]->shifts
;
381 for (i
= 0; i
< shiftp
->nshifts
; i
++)
383 shift_state
= shiftp
->shifts
[i
];
387 symbol
= state_table
[shift_state
]->accessing_symbol
;
392 actrow
[symbol
] = shift_state
;
394 /* Do not use any default reduction if there is a shift for
396 if (symbol
== error_token_number
)
400 /* See which tokens are an explicit error in this state (due to
401 %nonassoc). For them, record MINSHORT as the action. */
402 errp
= state_table
[state
]->errs
;
408 for (i
= 0; i
< k
; i
++)
410 symbol
= errp
->errs
[i
];
411 actrow
[symbol
] = MINSHORT
;
415 /* Now find the most common reduction and make it the default action
418 if (nreds
>= 1 && !nodefault
)
420 if (state_table
[state
]->consistent
)
421 default_rule
= redp
->rules
[0];
425 for (i
= m
; i
< n
; i
++)
430 for (j
= 0; j
< ntokens
; j
++)
432 if (actrow
[j
] == rule
)
443 /* actions which match the default are replaced with zero,
444 which means "use the default" */
448 for (j
= 0; j
< ntokens
; j
++)
450 if (actrow
[j
] == default_rule
)
454 default_rule
= -default_rule
;
459 /* If have no default rule, the default is an error.
460 So replace any action which says "error" with "use default". */
462 if (default_rule
== 0)
463 for (j
= 0; j
< ntokens
; j
++)
465 if (actrow
[j
] == MINSHORT
)
483 for (i
= 0; i
< ntokens
; i
++)
492 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
493 tos
[state
] = sp2
= XCALLOC (short, count
);
495 for (i
= 0; i
< ntokens
; i
++)
504 tally
[state
] = count
;
505 width
[state
] = sp1
[-1] - sp
[0] + 1;
509 /*------------------------------------------------------------------.
510 | Figure out the actions for the specified state, indexed by |
511 | lookahead token type. |
513 | The YYDEFACT table is output now. The detailed info is saved for |
514 | putting into YYTABLE later. |
515 `------------------------------------------------------------------*/
521 short *yydefact
= XCALLOC (short, nstates
);
523 actrow
= XCALLOC (short, ntokens
);
524 for (i
= 0; i
< nstates
; ++i
)
526 yydefact
[i
] = action_row (i
);
530 output_table_data (&output_obstack
, yydefact
,
531 yydefact
[0], 1, nstates
);
532 muscle_insert ("defact", obstack_finish (&output_obstack
));
540 save_column (int symbol
, int default_state
)
549 short begin
= goto_map
[symbol
];
550 short end
= goto_map
[symbol
+ 1];
553 for (i
= begin
; i
< end
; i
++)
555 if (to_state
[i
] != default_state
)
562 symno
= symbol
- ntokens
+ nstates
;
564 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
565 tos
[symno
] = sp2
= XCALLOC (short, count
);
567 for (i
= begin
; i
< end
; i
++)
569 if (to_state
[i
] != default_state
)
571 *sp1
++ = from_state
[i
];
572 *sp2
++ = to_state
[i
];
576 tally
[symno
] = count
;
577 width
[symno
] = sp1
[-1] - sp
[0] + 1;
581 default_goto (int symbol
)
589 m
= goto_map
[symbol
];
590 n
= goto_map
[symbol
+ 1];
595 for (i
= 0; i
< nstates
; i
++)
598 for (i
= m
; i
< n
; i
++)
599 state_count
[to_state
[i
]]++;
604 for (i
= 0; i
< nstates
; i
++)
606 if (state_count
[i
] > max
)
608 max
= state_count
[i
];
613 return default_state
;
617 /*-------------------------------------------------------------------.
618 | Figure out what to do after reducing with each rule, depending on |
619 | the saved state from before the beginning of parsing the data that |
620 | matched this rule. |
622 | The YYDEFGOTO table is output now. The detailed info is saved for |
623 | putting into YYTABLE later. |
624 `-------------------------------------------------------------------*/
630 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
632 state_count
= XCALLOC (short, nstates
);
633 for (i
= ntokens
; i
< nsyms
; ++i
)
635 int default_state
= default_goto (i
);
636 save_column (i
, default_state
);
637 yydefgoto
[i
- ntokens
] = default_state
;
640 output_table_data (&output_obstack
, yydefgoto
,
641 yydefgoto
[0], 1, nsyms
- ntokens
);
642 muscle_insert ("defgoto", obstack_finish (&output_obstack
));
649 /* The next few functions decide how to pack the actions and gotos
650 information into yytable. */
661 order
= XCALLOC (short, nvectors
);
664 for (i
= 0; i
< nvectors
; i
++)
672 while (j
>= 0 && (width
[order
[j
]] < w
))
675 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
678 for (k
= nentries
- 1; k
> j
; k
--)
679 order
[k
+ 1] = order
[k
];
689 matching_state (int vector
)
706 for (prev
= vector
- 1; prev
>= 0; prev
--)
709 if (width
[j
] != w
|| tally
[j
] != t
)
713 for (k
= 0; match
&& k
< t
; k
++)
715 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
728 pack_vector (int vector
)
747 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
751 for (k
= 0; ok
&& k
< t
; k
++)
755 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
761 for (k
= 0; ok
&& k
< vector
; k
++)
769 for (k
= 0; k
< t
; k
++)
773 check
[loc
] = from
[k
];
776 while (table
[lowzero
] != 0)
786 assert (!"pack_vector");
798 base
= XCALLOC (short, nvectors
);
799 pos
= XCALLOC (short, nentries
);
800 table
= XCALLOC (short, MAXTABLE
);
801 check
= XCALLOC (short, MAXTABLE
);
806 for (i
= 0; i
< nvectors
; i
++)
809 for (i
= 0; i
< MAXTABLE
; i
++)
812 for (i
= 0; i
< nentries
; i
++)
814 state
= matching_state (i
);
817 place
= pack_vector (i
);
822 base
[order
[i
]] = place
;
825 for (i
= 0; i
< nvectors
; i
++)
838 /* the following functions output yytable, yycheck
839 and the vectors whose elements index the portion starts */
845 output_table_data (&output_obstack
, base
,
846 base
[0], 1, nstates
);
847 muscle_insert ("pact", obstack_finish (&output_obstack
));
850 output_table_data (&output_obstack
, base
,
851 base
[nstates
], nstates
+ 1, nvectors
);
852 muscle_insert ("pgoto", obstack_finish (&output_obstack
));
861 output_table_data (&output_obstack
, table
,
862 table
[0], 1, high
+ 1);
863 muscle_insert ("table", obstack_finish (&output_obstack
));
871 output_table_data (&output_obstack
, check
,
872 check
[0], 1, high
+ 1);
873 muscle_insert ("check", obstack_finish (&output_obstack
));
877 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
881 output_actions (void)
884 nvectors
= nstates
+ nvars
;
886 froms
= XCALLOC (short *, nvectors
);
887 tos
= XCALLOC (short *, nvectors
);
888 tally
= XCALLOC (short, nvectors
);
889 width
= XCALLOC (short, nvectors
);
896 XFREE (goto_map
+ ntokens
);
908 for (i
= 0; i
< nstates
; ++i
)
910 XFREE (state_table
[i
]->shifts
);
911 XFREE (state_table
[i
]->reductions
);
912 XFREE (state_table
[i
]->errs
);
913 free (state_table
[i
]);
919 /*------------------------------------------------------------.
920 | Copy the parser code from SKEL_FILENAME into OOUT obstack. |
921 | and do the muscle substitution. |
922 `------------------------------------------------------------*/
925 output_parser (const char *skel_filename
, struct obstack
*oout
)
931 fskel
= xfopen (skel_filename
, "r");
933 /* New output code. */
942 obstack_1grow (oout
, c
);
945 else if ((c
= getc (fskel
)) == '%')
947 /* Read the muscle. */
948 const char *muscle_key
= 0;
949 const char *muscle_value
= 0;
951 while (isalnum (c
= getc (fskel
)) || c
== '-')
952 obstack_1grow (&muscle_obstack
, c
);
953 obstack_1grow (&muscle_obstack
, 0);
955 /* Output the right value, or see if it's something special. */
956 muscle_key
= obstack_finish (&muscle_obstack
);
957 muscle_value
= muscle_find (muscle_key
);
959 obstack_sgrow (oout
, muscle_value
);
960 else if (!strcmp (muscle_key
, "line"))
961 obstack_fgrow1 (oout
, "%d", line
+ 1);
962 /* How can lineno be correct after having finished reading
963 input file ? --Marc. */
964 else if (!strcmp (muscle_key
, "input-line"))
965 obstack_fgrow1 (oout
, "%d", lineno
);
968 obstack_sgrow (oout
, "%%");
969 obstack_sgrow (oout
, muscle_key
);
973 obstack_1grow (oout
, '%');
980 /*----------------------------------------.
981 | Prepare the master parser to be output |
982 `----------------------------------------*/
985 output_master_parser (void)
990 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
992 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
994 muscle_insert ("skeleton", skeleton
);
995 output_parser (skeleton
, &table_obstack
);
1001 #define MUSCLE_INSERT_INT(Key, Value) \
1003 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1004 obstack_1grow (&muscle_obstack, 0); \
1005 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1008 #define MUSCLE_INSERT_STRING(Key, Value) \
1010 obstack_sgrow (&muscle_obstack, Value); \
1011 obstack_1grow (&muscle_obstack, 0); \
1012 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1015 #define MUSCLE_INSERT_PREFIX(Key, Value) \
1017 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1018 obstack_1grow (&muscle_obstack, 0); \
1019 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
1025 MUSCLE_INSERT_INT ("last", high
);
1026 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1027 MUSCLE_INSERT_INT ("pure", pure_parser
);
1028 MUSCLE_INSERT_INT ("nsym", nsyms
);
1029 MUSCLE_INSERT_INT ("debug", debug_flag
);
1030 MUSCLE_INSERT_INT ("final", final_state
);
1031 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1032 MUSCLE_INSERT_INT ("ntbase", ntokens
);
1033 MUSCLE_INSERT_INT ("error-verbose", error_verbose
);
1034 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
);
1036 MUSCLE_INSERT_INT ("nnts", nvars
);
1037 MUSCLE_INSERT_INT ("nrules", nrules
);
1038 MUSCLE_INSERT_INT ("nstates", nstates
);
1039 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1041 MUSCLE_INSERT_INT ("locations-flag", locations_flag
);
1043 /* We need to save the actions in the muscle %%action. */
1044 obstack_1grow (&action_obstack
, 0);
1045 muscle_insert ("action", obstack_finish (&action_obstack
));
1049 /*----------------------------------------------------------.
1050 | Output the parsing tables and the parser code to ftable. |
1051 `----------------------------------------------------------*/
1056 obstack_init (&output_obstack
);
1058 output_token_translations ();
1062 if (semantic_parser
)
1064 output_rule_data ();
1065 XFREE (user_toknums
);
1069 /* Copy definitions in directive. */
1070 obstack_1grow (&attrs_obstack
, 0);
1071 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1073 output_master_parser ();
1075 obstack_free (&muscle_obstack
, 0);
1076 obstack_free (&output_obstack
, 0);
1077 obstack_free (&action_obstack
, 0);