- if (symbol->tag[0] == '\'')
- continue; /* skip literal character */
- if (symbol->tag[0] == '\"')
- {
- /* use literal string only if given a symbol with an alias */
- if (symbol->alias)
- symbol = symbol->alias;
- else
- continue;
- }
-
- /* Don't #define nonliteral tokens whose names contain periods
- or '$' (as does the default value of the EOF token). */
- if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
- continue;
-
- fprintf (out, "%s [[[%s]], [%d]]",
- first ? "" : ",\n", symbol->tag, number);
- if (semantic_parser)
- /* FIXME: This is probably wrong, and should be just as
- above. --akim. */
- fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->number);
- first = 0;
- }
-}
-
-
-static void
-save_column (int symbol, int default_state)
-{
- int i;
- short *sp;
- short *sp1;
- short *sp2;
- int count;
- int symno = symbol - ntokens + nstates;
-
- short begin = goto_map[symbol];
- short end = goto_map[symbol + 1];
-
- count = 0;
- for (i = begin; i < end; i++)
- if (to_state[i] != default_state)
- count++;
-
- if (count == 0)
- return;
-
- froms[symno] = sp1 = sp = XCALLOC (short, count);
- tos[symno] = sp2 = XCALLOC (short, count);
-
- for (i = begin; i < end; i++)
- if (to_state[i] != default_state)
- {
- *sp1++ = from_state[i];
- *sp2++ = to_state[i];
- }
-
- tally[symno] = count;
- width[symno] = sp1[-1] - sp[0] + 1;
-}
-
-static int
-default_goto (int symbol)
-{
- size_t i;
- size_t m = goto_map[symbol];
- size_t n = goto_map[symbol + 1];
- int default_state = -1;
- int max = 0;
-
- if (m == n)
- return -1;
-
- for (i = 0; i < nstates; i++)
- state_count[i] = 0;
-
- for (i = m; i < n; i++)
- state_count[to_state[i]]++;
-
- for (i = 0; i < nstates; i++)
- if (state_count[i] > max)
- {
- max = state_count[i];
- default_state = i;
- }
-
- return default_state;
-}
-
-
-/*-------------------------------------------------------------------.
-| Figure out what to do after reducing with each rule, depending on |
-| the saved state from before the beginning of parsing the data that |
-| matched this rule. |
-| |
-| The YYDEFGOTO table is output now. The detailed info is saved for |
-| putting into YYTABLE later. |
-`-------------------------------------------------------------------*/
-
-static void
-goto_actions (void)
-{
- int i;
- short *yydefgoto = XMALLOC (short, nsyms - ntokens);
-
- state_count = XCALLOC (short, nstates);
- for (i = ntokens; i < nsyms; ++i)
- {
- int default_state = default_goto (i);
- save_column (i, default_state);
- yydefgoto[i - ntokens] = default_state;
- }
-
- output_table_data (&format_obstack, yydefgoto,
- yydefgoto[0], 1, nsyms - ntokens);
- muscle_insert ("defgoto", obstack_finish (&format_obstack));