]>
git.saurik.com Git - bison.git/blob - src/output.c
acb453c63f496514ab269f9d164d2c506292c878
   1 /* Output the generated parsing program for bison, 
   2    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002 
   3    Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify it 
   8    under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, but 
  13    WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  15    General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to the Free 
  19    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  23 /* The parser tables consist of these tables.  Marked ones needed only 
  24    for the semantic parser.  Double marked are output only if switches 
  27    YYTRANSLATE = vector mapping yylex's token numbers into bison's 
  30    ++ YYTNAME = vector of string-names indexed by bison token number. 
  32    ++ YYTOKNUM = vector of yylex token numbers corresponding to 
  35    YYRLINE = vector of line-numbers of all rules.  For yydebug 
  38    YYRHS = vector of items of all rules.  This is exactly what RITEMS 
  39    contains.  For yydebug and for semantic parser. 
  41    YYPRHS[R] = index in YYRHS of first item for rule R. 
  43    YYR1[R] = symbol number of symbol that rule R derives. 
  45    YYR2[R] = number of symbols composing right hand side of rule R. 
  47    + YYSTOS[S] = the symbol number of the symbol that leads to state 
  50    YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE 
  51    doesn't specify something else to do.  Zero means the default is an 
  54    YYDEFGOTO[I] = default state to go to after a reduction of a rule 
  55    that generates variable NTOKENS + I, except when YYTABLE specifies 
  58    YYPACT[S] = index in YYTABLE of the portion describing state S. 
  59    The lookahead token's type is used to index that portion to find 
  62    If the value in YYTABLE is positive, we shift the token and go to 
  65    If the value is negative, it is minus a rule number to reduce by. 
  67    If the value is zero, the default action from YYDEFACT[S] is used. 
  69    YYPGOTO[I] = the index in YYTABLE of the portion describing what to 
  70    do after reducing a rule that derives variable I + NTOKENS.  This 
  71    portion is indexed by the parser state number, S, as of before the 
  72    text for this nonterminal was read.  The value from YYTABLE is the 
  73    state to go to if the corresponding value in YYCHECK is S. 
  75    YYTABLE = a vector filled with portions for different uses, found 
  76    via YYPACT and YYPGOTO. 
  78    YYCHECK = a vector indexed in parallel with YYTABLE.  It indicates, 
  79    in a roundabout way, the bounds of the portion you are trying to 
  82    Suppose that the portion of yytable starts at index P and the index 
  83    to be examined within the portion is I.  Then if YYCHECK[P+I] != I, 
  84    I is outside the bounds of what is actually allocated, and the 
  85    default (from YYDEFACT or YYDEFGOTO) should be used.  Otherwise, 
  86    YYTABLE[P+I] should be used. 
  88    YYFINAL = the state number of the termination state.  YYFLAG = most 
  89    negative short int.  Used to flag ??  */ 
 104 #include "conflicts.h" 
 105 #include "muscle_tab.h" 
 107 /* From lib/readpipe.h.  */ 
 108 FILE *readpipe 
PARAMS ((const char *, ...)); 
 110 /* From src/scan-skel.l. */ 
 111 int skel_lex 
PARAMS ((void)); 
 112 extern FILE *skel_in
; 
 116 static short **froms 
= NULL
; 
 117 static short **tos 
= NULL
; 
 118 static short *tally 
= NULL
; 
 119 static short *width 
= NULL
; 
 120 static short *actrow 
= NULL
; 
 121 static short *state_count 
= NULL
; 
 122 static short *order 
= NULL
; 
 123 static short *base 
= NULL
; 
 124 static short *pos 
= NULL
; 
 125 static short *table 
= NULL
; 
 126 static short *check 
= NULL
; 
 130 struct obstack muscle_obstack
; 
 131 static struct obstack format_obstack
; 
 133 int error_verbose 
= 0; 
 135 /* Returns the number of lines of S.  */ 
 137 get_lines_number (const char *s
) 
 142   for (i 
= 0; s
[i
]; ++i
) 
 153 output_table_data (struct obstack 
*oout
, 
 162   obstack_fgrow1 (oout
, "%6d", first
); 
 163   for (i 
= begin
; i 
< end
; ++i
) 
 165       obstack_1grow (oout
, ','); 
 168           obstack_sgrow (oout
, "\n  "); 
 173       obstack_fgrow1 (oout
, "%6d", table_data
[i
]); 
 175   obstack_1grow (oout
, 0); 
 180 output_token_translations (void) 
 182   output_table_data (&format_obstack
, token_translations
, 
 183                      0, 1, max_user_token_number 
+ 1); 
 184   muscle_insert ("translate", obstack_finish (&format_obstack
)); 
 185   XFREE (token_translations
); 
 194     short *values 
= XCALLOC (short, nrules 
+ 1); 
 195     for (i 
= 1; i 
< nrules 
+ 1; ++i
) 
 196       values
[i
] = rules
[i
].rhs 
- ritem
; 
 197     output_table_data (&format_obstack
, values
, 
 202   muscle_insert ("prhs", obstack_finish (&format_obstack
)); 
 208     yyrhs 
= XMALLOC (short, nritems
); 
 210     for (i 
= 1; i 
< nritems
; ++i
) 
 211       yyrhs
[i
] = ritem
[i
] >= 0 ? ritem
[i
] : -1; 
 213     output_table_data (&format_obstack
, yyrhs
, 
 214                        ritem
[0], 1, nritems
); 
 215     muscle_insert ("rhs", obstack_finish (&format_obstack
)); 
 221   if (!semantic_parser
) 
 222     obstack_sgrow (&table_obstack
, "\n#endif\n"); 
 231   short *values 
= (short *) alloca (sizeof (short) * nstates
); 
 232   for (i 
= 0; i 
< nstates
; ++i
) 
 233     values
[i
] = states
[i
]->accessing_symbol
; 
 234   output_table_data (&format_obstack
, values
, 
 236   muscle_insert ("stos", obstack_finish (&format_obstack
)); 
 241 output_rule_data (void) 
 245   short *short_tab 
= NULL
; 
 248     short *values 
= XCALLOC (short, nrules 
+ 1); 
 249     for (i 
= 1; i 
< nrules 
+ 1; ++i
) 
 250       values
[i
] = rules
[i
].line
; 
 251     output_table_data (&format_obstack
, values
, 
 253     muscle_insert ("rline", obstack_finish (&format_obstack
)); 
 259   for (i 
= 0; i 
< nsyms
; i
++) 
 261       /* Be sure not to use twice the same quotearg slot. */ 
 263         quotearg_n_style (1, c_quoting_style
, 
 264                           quotearg_style (escape_quoting_style
, symbols
[i
]->tag
)); 
 265       /* Width of the next token, including the two quotes, the coma 
 267       int strsize 
= strlen (cp
) + 2; 
 269       if (j 
+ strsize 
> 75) 
 271           obstack_sgrow (&format_obstack
, "\n  "); 
 275       obstack_sgrow (&format_obstack
, cp
); 
 276       obstack_sgrow (&format_obstack
, ", "); 
 279   /* Add a NULL entry to list of tokens (well, 0, as NULL might not be 
 281   obstack_sgrow (&format_obstack
, "0"); 
 283   /* Finish table and store. */ 
 284   obstack_1grow (&format_obstack
, 0); 
 285   muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 287   /* Output YYTOKNUM. */ 
 289     short *values 
= XCALLOC (short, ntokens 
+ 1); 
 290     for (i 
= 0; i 
< ntokens 
+ 1; ++i
) 
 291       values
[i
] = symbols
[i
]->user_token_number
; 
 292     output_table_data (&format_obstack
, values
, 
 294     muscle_insert ("toknum", obstack_finish (&format_obstack
)); 
 301     short *values 
= XCALLOC (short, nrules 
+ 1); 
 302     for (i 
= 1; i 
< nrules 
+ 1; ++i
) 
 303       values
[i
] = rules
[i
].lhs
->number
; 
 304     output_table_data (&format_obstack
, values
, 
 306     muscle_insert ("r1", obstack_finish (&format_obstack
)); 
 311   short_tab 
= XMALLOC (short, nrules 
+ 1); 
 312   for (i 
= 1; i 
< nrules
; i
++) 
 313     short_tab
[i
] = rules
[i 
+ 1].rhs 
- rules
[i
].rhs 
- 1; 
 314   short_tab
[nrules
] =  nritems 
- (rules
[nrules
].rhs 
- ritem
) - 1; 
 315   output_table_data (&format_obstack
, short_tab
, 
 317   muscle_insert ("r2", obstack_finish (&format_obstack
)); 
 321 /*------------------------------------------------------------------. 
 322 | Decide what to do for each type of token if seen as the lookahead | 
 323 | token in specified state.  The value returned is used as the      | 
 324 | default action (yydefact) for the state.  In addition, actrow is  | 
 325 | filled with what to do for each kind of token, index by symbol    | 
 326 | number, with zero meaning do the default action.  The value       | 
 327 | MINSHORT, a very negative number, means this situation is an      | 
 328 | error.  The parser recognizes this value specially.               | 
 330 | This is where conflicts are resolved.  The loop over lookahead    | 
 331 | rules considered lower-numbered rules last, and the last rule     | 
 332 | considered that likes a token gets to handle it.                  | 
 333 `------------------------------------------------------------------*/ 
 336 action_row (state_t 
*state
) 
 339   int default_rule 
= 0; 
 340   reductions 
*redp 
= state
->reductions
; 
 341   shifts 
*shiftp 
= state
->shifts
; 
 342   errs 
*errp 
= state
->errs
; 
 343   /* set nonzero to inhibit having any default reduction */ 
 346   for (i 
= 0; i 
< ntokens
; i
++) 
 349   if (redp
->nreds 
>= 1) 
 352       /* loop over all the rules available here which require 
 354       for (i 
= state
->nlookaheads 
- 1; i 
>= 0; --i
) 
 355         /* and find each token which the rule finds acceptable 
 357         for (j 
= 0; j 
< ntokens
; j
++) 
 358           /* and record this rule as the rule to use if that 
 360           if (bitset_test (LA
[state
->lookaheadsp 
+ i
], j
)) 
 361             actrow
[j
] = -LAruleno
[state
->lookaheadsp 
+ i
]; 
 364   /* Now see which tokens are allowed for shifts in this state.  For 
 365      them, record the shift as the thing to do.  So shift is preferred 
 367   for (i 
= 0; i 
< shiftp
->nshifts
; i
++) 
 370       int shift_state 
= shiftp
->shifts
[i
]; 
 374       symbol 
= states
[shift_state
]->accessing_symbol
; 
 379       actrow
[symbol
] = shift_state
; 
 381       /* Do not use any default reduction if there is a shift for 
 383       if (symbol 
== error_token_number
) 
 387   /* See which tokens are an explicit error in this state (due to 
 388      %nonassoc).  For them, record MINSHORT as the action.  */ 
 389   for (i 
= 0; i 
< errp
->nerrs
; i
++) 
 391       int symbol 
= errp
->errs
[i
]; 
 392       actrow
[symbol
] = MINSHORT
; 
 395   /* Now find the most common reduction and make it the default action 
 398   if (redp
->nreds 
>= 1 && !nodefault
) 
 400       if (state
->consistent
) 
 401         default_rule 
= redp
->rules
[0]; 
 405           for (i 
= 0; i 
< state
->nlookaheads
; i
++) 
 408               int rule 
= -LAruleno
[state
->lookaheadsp 
+ i
]; 
 411               for (j 
= 0; j 
< ntokens
; j
++) 
 412                 if (actrow
[j
] == rule
) 
 422           /* actions which match the default are replaced with zero, 
 423              which means "use the default" */ 
 428               for (j 
= 0; j 
< ntokens
; j
++) 
 429                 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 (i 
= 0; i 
< ntokens
; i
++) 
 442       if (actrow
[i
] == MINSHORT
) 
 459   for (i 
= 0; i 
< ntokens
; i
++) 
 466   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 467   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 469   for (i 
= 0; i 
< ntokens
; i
++) 
 476   tally
[state
] = count
; 
 477   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 481 /*------------------------------------------------------------------. 
 482 | Figure out the actions for the specified state, indexed by        | 
 483 | lookahead token type.                                             | 
 485 | The YYDEFACT table is output now.  The detailed info is saved for | 
 486 | putting into YYTABLE later.                                       | 
 487 `------------------------------------------------------------------*/ 
 493   short *yydefact 
= XCALLOC (short, nstates
); 
 495   actrow 
= XCALLOC (short, ntokens
); 
 496   for (i 
= 0; i 
< nstates
; ++i
) 
 498       yydefact
[i
] = action_row (states
[i
]); 
 502   output_table_data (&format_obstack
, yydefact
, 
 503                      yydefact
[0], 1, nstates
); 
 504   muscle_insert ("defact", obstack_finish (&format_obstack
)); 
 511 /*-----------------------------. 
 512 | Output the actions to OOUT.  | 
 513 `-----------------------------*/ 
 516 actions_output (FILE *out
) 
 519   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 520     if (rules
[rule
].action
) 
 522         fprintf (out
, "  case %d:\n", rule
); 
 525           fprintf (out
, muscle_find ("linef"), 
 526                    rules
[rule
].action_line
, 
 527                    quotearg_style (c_quoting_style
, 
 528                                    muscle_find ("filename"))); 
 529         /* As a Bison extension, add the ending semicolon.  Since some 
 530            Yacc don't do that, help people using bison as a Yacc 
 531            finding their missing semicolons.  */ 
 532         fprintf (out
, "{ %s%s }\n    break;\n\n", 
 534                  yacc_flag 
? ";" : ""); 
 539 /*----------------------------. 
 540 | Output the guards to OOUT.  | 
 541 `----------------------------*/ 
 544 guards_output (FILE *out
) 
 547   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 548     if (rules
[rule
].guard
) 
 550         fprintf (out
, "  case %d:\n", rule
); 
 553           fprintf (out
, muscle_find ("linef"), 
 554                    rules
[rule
].guard_line
, 
 555                    quotearg_style (c_quoting_style
, 
 556                                    muscle_find ("filename"))); 
 557         fprintf (out
, "{ %s; }\n    break;\n\n", 
 563 /*---------------------------------------. 
 564 | Output the tokens definition to OOUT.  | 
 565 `---------------------------------------*/ 
 568 token_definitions_output (FILE *out
) 
 572   for (i 
= 0; i 
< ntokens
; ++i
) 
 574       bucket 
*symbol 
= symbols
[i
]; 
 575       int number 
= symbol
->user_token_number
; 
 577       if (number 
== SALIAS
) 
 579       /* Skip error token.  */ 
 580       if (symbol
->number 
== error_token_number
) 
 582       if (symbol
->tag
[0] == '\'') 
 583         continue;               /* skip literal character */ 
 584       if (symbol
->tag
[0] == '\"') 
 586           /* use literal string only if given a symbol with an alias */ 
 588             symbol 
= symbol
->alias
; 
 593       /* Don't #define nonliteral tokens whose names contain periods 
 594          or '$' (as does the default value of the EOF token).  */ 
 595       if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$')) 
 598       fprintf (out
, "%s  [[[%s]], [%d]]", 
 599                first 
? "" : ",\n", symbol
->tag
, number
); 
 601         /* FIXME: This is probably wrong, and should be just as 
 603         fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->number
); 
 610 save_column (int symbol
, int default_state
) 
 617   int symno 
= symbol 
- ntokens 
+ nstates
; 
 619   short begin 
= goto_map
[symbol
]; 
 620   short end 
= goto_map
[symbol 
+ 1]; 
 623   for (i 
= begin
; i 
< end
; i
++) 
 624     if (to_state
[i
] != default_state
) 
 630   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 631   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 633   for (i 
= begin
; i 
< end
; i
++) 
 634     if (to_state
[i
] != default_state
) 
 636         *sp1
++ = from_state
[i
]; 
 637         *sp2
++ = to_state
[i
]; 
 640   tally
[symno
] = count
; 
 641   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 645 default_goto (int symbol
) 
 648   size_t m 
= goto_map
[symbol
]; 
 649   size_t n 
= goto_map
[symbol 
+ 1]; 
 650   int default_state 
= -1; 
 656   for (i 
= 0; i 
< nstates
; i
++) 
 659   for (i 
= m
; i 
< n
; i
++) 
 660     state_count
[to_state
[i
]]++; 
 662   for (i 
= 0; i 
< nstates
; i
++) 
 663     if (state_count
[i
] > max
) 
 665         max 
= state_count
[i
]; 
 669   return default_state
; 
 673 /*-------------------------------------------------------------------. 
 674 | Figure out what to do after reducing with each rule, depending on  | 
 675 | the saved state from before the beginning of parsing the data that | 
 676 | matched this rule.                                                 | 
 678 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 679 | putting into YYTABLE later.                                        | 
 680 `-------------------------------------------------------------------*/ 
 686   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 688   state_count 
= XCALLOC (short, nstates
); 
 689   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 691       int default_state 
= default_goto (i
); 
 692       save_column (i
, default_state
); 
 693       yydefgoto
[i 
- ntokens
] = default_state
; 
 696   output_table_data (&format_obstack
, yydefgoto
, 
 697                      yydefgoto
[0], 1, nsyms 
- ntokens
); 
 698   muscle_insert ("defgoto", obstack_finish (&format_obstack
)); 
 705 /* The next few functions decide how to pack the actions and gotos 
 706    information into yytable. */ 
 713   order 
= XCALLOC (short, nvectors
); 
 716   for (i 
= 0; i 
< nvectors
; i
++) 
 722         int j 
= nentries 
- 1; 
 724         while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 727         while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 730         for (k 
= nentries 
- 1; k 
> j
; k
--) 
 731           order
[k 
+ 1] = order
[k
]; 
 740 matching_state (int vector
) 
 742   int i 
= order
[vector
]; 
 747   if (i 
>= (int) nstates
) 
 753   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 759       if (width
[j
] != w 
|| tally
[j
] != t
) 
 762       for (k 
= 0; match 
&& k 
< t
; k
++) 
 763         if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 775 pack_vector (int vector
) 
 777   int i 
= order
[vector
]; 
 781   short *from 
= froms
[i
]; 
 786   for (j 
= lowzero 
- from
[0]; j 
< MAXTABLE
; j
++) 
 791       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 795             fatal (_("maximum table size (%d) exceeded"), MAXTABLE
); 
 801       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 807           for (k 
= 0; k 
< t
; k
++) 
 811               check
[loc
] = from
[k
]; 
 814           while (table
[lowzero
] != 0) 
 823 #define pack_vector_succeeded 0 
 824   assert (pack_vector_succeeded
); 
 836   base 
= XCALLOC (short, nvectors
); 
 837   pos 
= XCALLOC (short, nentries
); 
 838   table 
= XCALLOC (short, MAXTABLE
); 
 839   check 
= XCALLOC (short, MAXTABLE
); 
 844   for (i 
= 0; i 
< nvectors
; i
++) 
 847   for (i 
= 0; i 
< MAXTABLE
; i
++) 
 850   for (i 
= 0; i 
< nentries
; i
++) 
 852       state 
= matching_state (i
); 
 855         place 
= pack_vector (i
); 
 860       base
[order
[i
]] = place
; 
 863   for (i 
= 0; i 
< nvectors
; i
++) 
 874 /* the following functions output yytable, yycheck 
 875    and the vectors whose elements index the portion starts */ 
 881   output_table_data (&format_obstack
, base
, 
 882                      base
[0], 1, nstates
); 
 883   muscle_insert ("pact", obstack_finish (&format_obstack
)); 
 886   output_table_data (&format_obstack
, base
, 
 887                      base
[nstates
], nstates 
+ 1, nvectors
); 
 888   muscle_insert ("pgoto", obstack_finish (&format_obstack
)); 
 897   output_table_data (&format_obstack
, table
, 
 898                      table
[0], 1, high 
+ 1); 
 899   muscle_insert ("table", obstack_finish (&format_obstack
)); 
 907   output_table_data (&format_obstack
, check
, 
 908                      check
[0], 1, high 
+ 1); 
 909   muscle_insert ("check", obstack_finish (&format_obstack
)); 
 913 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable 
 917 output_actions (void) 
 920   nvectors 
= nstates 
+ nvars
; 
 922   froms 
= XCALLOC (short *, nvectors
); 
 923   tos 
= XCALLOC (short *, nvectors
); 
 924   tally 
= XCALLOC (short, nvectors
); 
 925   width 
= XCALLOC (short, nvectors
); 
 932   XFREE (goto_map 
+ ntokens
); 
 944   for (i 
= 0; i 
< nstates
; ++i
) 
 946       free (states
[i
]->shifts
); 
 947       XFREE (states
[i
]->reductions
); 
 948       free (states
[i
]->errs
); 
 955 /*---------------------------. 
 956 | Call the skeleton parser.  | 
 957 `---------------------------*/ 
 960 output_skeleton (void) 
 962   /* Store the definition of all the muscles. */ 
 963   const char *tempdir 
= getenv ("TMPDIR"); 
 964   char *tempfile 
= NULL
; 
 969     tempdir 
= DEFAULT_TMPDIR
; 
 970   tempfile 
= xmalloc (strlen (tempdir
) + 11); 
 971   sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
); 
 972   fd 
= mkstemp (tempfile
); 
 974     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
 976   out 
= fdopen (fd
, "w"); 
 978     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
 980   /* There are no comments, especially not `#': we do want M4 expansion 
 981      after `#': think of CPP macros!  */ 
 982   fputs ("m4_changecom()\n", out
); 
 983   fputs ("m4_init()\n", out
); 
 985   fputs ("m4_define([b4_actions], \n[[", out
); 
 986   actions_output (out
); 
 987   fputs ("]])\n\n", out
); 
 989   fputs ("m4_define([b4_guards], \n[[", out
); 
 991   fputs ("]])\n\n", out
); 
 993   fputs ("m4_define([b4_tokens], \n[", out
); 
 994   token_definitions_output (out
); 
 995   fputs ("])\n\n", out
); 
 997   muscles_m4_output (out
); 
 999   fputs ("m4_wrap([m4_divert_pop(0)])\n", out
); 
1000   fputs ("m4_divert_push(0)dnl\n", out
); 
1003   /* Invoke m4 on the definition of the muscles, and the skeleton. */ 
1005     const char *bison_pkgdatadir 
= getenv ("BISON_PKGDATADIR"); 
1006     const char *m4 
= getenv ("M4"); 
1009     if (!bison_pkgdatadir
) 
1010       bison_pkgdatadir 
= PKGDATADIR
; 
1013                "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n", 
1014                m4
, bison_pkgdatadir
, tempfile
, skeleton
); 
1015     skel_in 
= readpipe (m4
, 
1016                         "-I", bison_pkgdatadir
, 
1017                         "m4sugar/m4sugar.m4", 
1022       error (EXIT_FAILURE
, errno
, "cannot run m4"); 
1025     /* If `debugging', keep this file alive. */ 
1034   MUSCLE_INSERT_INT ("last", high
); 
1035   MUSCLE_INSERT_INT ("flag", MINSHORT
); 
1036   MUSCLE_INSERT_INT ("pure", pure_parser
); 
1037   MUSCLE_INSERT_INT ("nsym", nsyms
); 
1038   MUSCLE_INSERT_INT ("debug", debug_flag
); 
1039   MUSCLE_INSERT_INT ("final", final_state
); 
1040   MUSCLE_INSERT_INT ("maxtok", max_user_token_number
); 
1041   MUSCLE_INSERT_INT ("error_verbose", error_verbose
); 
1042   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix 
? spec_name_prefix 
: "yy"); 
1044   /* FIXME: This is wrong: the muscles should decide whether they hold 
1045      a copy or not, but the situation is too obscure currently.  */ 
1046   MUSCLE_INSERT_STRING ("output_infix", output_infix 
? output_infix 
: ""); 
1047   MUSCLE_INSERT_STRING ("output_prefix", short_base_name
); 
1048   MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
); 
1049   MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
); 
1051   MUSCLE_INSERT_INT ("nnts", nvars
); 
1052   MUSCLE_INSERT_INT ("nrules", nrules
); 
1053   MUSCLE_INSERT_INT ("nstates", nstates
); 
1054   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1056   MUSCLE_INSERT_INT ("locations_flag", locations_flag
); 
1057   MUSCLE_INSERT_INT ("defines_flag", defines_flag
); 
1059   /* Copy definitions in directive.  */ 
1060   obstack_1grow (&attrs_obstack
, 0); 
1061   muscle_insert ("prologue", obstack_finish (&attrs_obstack
)); 
1063   /* Find the right skeleton file.  */ 
1066       if (semantic_parser
) 
1067         skeleton 
= "bison.hairy"; 
1069         skeleton 
= "bison.simple"; 
1072   /* Parse the skeleton file and output the needed parsers.  */ 
1073   muscle_insert ("skeleton", skeleton
); 
1077 /*----------------------------------------------------------. 
1078 | Output the parsing tables and the parser code to ftable.  | 
1079 `----------------------------------------------------------*/ 
1084   obstack_init (&format_obstack
); 
1086   output_token_translations (); 
1089   if (semantic_parser
) 
1091   output_rule_data (); 
1096   /* Process the selected skeleton file.  */ 
1099   obstack_free (&muscle_obstack
, NULL
); 
1100   obstack_free (&format_obstack
, NULL
); 
1101   obstack_free (&action_obstack
, NULL
); 
1102   obstack_free (&attrs_obstack
, NULL
);