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
; 
 126 /* TABLE_SIZE is the allocated size of both TABLE and CHECK. 
 127    We start with the original hard-coded value: SHRT_MAX 
 128    (yes, not USHRT_MAX). */ 
 129 static size_t table_size 
= SHRT_MAX
; 
 130 static short *table 
= NULL
; 
 131 static short *check 
= NULL
; 
 135 static struct obstack format_obstack
; 
 137 int error_verbose 
= 0; 
 140 /*----------------------------------------------------------------. 
 141 | If TABLE (and CHECK) appear to be small to be addressed at      | 
 142 | DESIRED, grow them.  Note that TABLE[DESIRED] is to be used, so | 
 143 | the desired size is at least DESIRED + 1.                       | 
 144 `----------------------------------------------------------------*/ 
 147 table_grow (size_t desired
) 
 149   size_t old_size 
= table_size
; 
 151   while (table_size 
<= desired
) 
 155     fprintf (stderr
, "growing table and check from: %d to %d\n", 
 156              old_size
, table_size
); 
 158   table 
= XREALLOC (table
, short, table_size
); 
 159   check 
= XREALLOC (check
, short, table_size
); 
 161   for (/* Nothing. */; old_size 
< table_size
; ++old_size
) 
 164       check
[old_size
] = -1; 
 169 /*-------------------------------------------------------------------. 
 170 | Create a function NAME which associates to the muscle NAME the     | 
 171 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of | 
 172 | TYPE), and to the muscle NAME_max, the max value of the            | 
 174 `-------------------------------------------------------------------*/ 
 177 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type)                        \ 
 180 Name (const char *name,                                                 \ 
 190   obstack_fgrow1 (&format_obstack, "%6d", first);                       \ 
 191   for (i = begin; i < end; ++i)                                         \ 
 193       obstack_1grow (&format_obstack, ',');                             \ 
 196           obstack_sgrow (&format_obstack, "\n  ");                      \ 
 201       obstack_fgrow1 (&format_obstack, "%6d", table_data[i]);           \ 
 202       if (table_data[i] > max)                                          \ 
 203         max = table_data[i];                                            \ 
 205   obstack_1grow (&format_obstack, 0);                                   \ 
 206   muscle_insert (name, obstack_finish (&format_obstack));               \ 
 208   /* Build `NAME_max' in the obstack. */                                \ 
 209   obstack_fgrow1 (&format_obstack, "%s_max", name);                     \ 
 210   obstack_1grow (&format_obstack, 0);                                   \ 
 211   MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack),             \ 
 215 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int) 
 216 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table
, short) 
 217 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number_t
) 
 218 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number_t
) 
 221 /*-----------------------------------------------------------------. 
 222 | Prepare the muscles related to the tokens: translate, tname, and | 
 224 `-----------------------------------------------------------------*/ 
 227 prepare_tokens (void) 
 229   muscle_insert_symbol_number_table ("translate", 
 231                                     0, 1, max_user_token_number 
+ 1); 
 236     for (i 
= 0; i 
< nsyms
; i
++) 
 238         /* Be sure not to use twice the same QUOTEARG slot: 
 239            SYMBOL_TAG_GET uses slot 0.  */ 
 241           quotearg_n_style (1, c_quoting_style
, 
 242                             symbol_tag_get (symbols
[i
])); 
 243         /* Width of the next token, including the two quotes, the coma 
 245         int strsize 
= strlen (cp
) + 2; 
 247         if (j 
+ strsize 
> 75) 
 249             obstack_sgrow (&format_obstack
, "\n  "); 
 253         obstack_sgrow (&format_obstack
, cp
); 
 254         obstack_sgrow (&format_obstack
, ", "); 
 257     /* Add a NULL entry to list of tokens (well, 0, as NULL might not be 
 259     obstack_sgrow (&format_obstack
, "0"); 
 261     /* Finish table and store. */ 
 262     obstack_1grow (&format_obstack
, 0); 
 263     muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 266     /* Output YYTOKNUM. */ 
 269     short *values 
= XCALLOC (short, ntokens 
+ 1); 
 270     for (i 
= 0; i 
< ntokens 
+ 1; ++i
) 
 271       values
[i
] = symbols
[i
]->user_token_number
; 
 272     muscle_insert_short_table ("toknum", values
, 
 279 /*-------------------------------------------------------------. 
 280 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 
 282 `-------------------------------------------------------------*/ 
 289   item_number_t 
*rhs 
= XMALLOC (item_number_t
, nritems
); 
 290   unsigned int *prhs 
= XMALLOC (unsigned int, nrules 
+ 1); 
 291   unsigned int *rline 
= XMALLOC (unsigned int, nrules 
+ 1); 
 292   symbol_number_t 
*r1 
= XMALLOC (symbol_number_t
, nrules 
+ 1); 
 293   unsigned int *r2 
= XMALLOC (unsigned int, nrules 
+ 1); 
 295   for (r 
= 1; r 
< nrules 
+ 1; ++r
) 
 298       /* Index of rule R in RHS. */ 
 300       /* RHS of the rule R. */ 
 301       for (rhsp 
= rules
[r
].rhs
; *rhsp 
>= 0; ++rhsp
) 
 303       /* LHS of the rule R. */ 
 304       r1
[r
] = rules
[r
].lhs
->number
; 
 305       /* Length of rule R's RHS. */ 
 307       /* Separator in RHS. */ 
 309       /* Line where rule was defined. */ 
 310       rline
[r
] = rules
[r
].location
.first_line
; 
 312   assert (i 
== nritems
); 
 314   muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
); 
 315   muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 1, nrules 
+ 1); 
 316   muscle_insert_unsigned_int_table ("rline", rline
, 0, 1, nrules 
+ 1); 
 317   muscle_insert_symbol_number_table ("r1", r1
, 0, 1, nrules 
+ 1); 
 318   muscle_insert_unsigned_int_table ("r2", r2
, 0, 1, nrules 
+ 1); 
 327 /*--------------------------------------------. 
 328 | Prepare the muscles related to the states.  | 
 329 `--------------------------------------------*/ 
 332 prepare_states (void) 
 335   symbol_number_t 
*values 
= 
 336     (symbol_number_t 
*) alloca (sizeof (symbol_number_t
) * nstates
); 
 337   for (i 
= 0; i 
< nstates
; ++i
) 
 338     values
[i
] = states
[i
]->accessing_symbol
; 
 339   muscle_insert_symbol_number_table ("stos", values
, 
 344 /*------------------------------------------------------------------. 
 345 | Decide what to do for each type of token if seen as the lookahead | 
 346 | token in specified state.  The value returned is used as the      | 
 347 | default action (yydefact) for the state.  In addition, actrow is  | 
 348 | filled with what to do for each kind of token, index by symbol    | 
 349 | number, with zero meaning do the default action.  The value       | 
 350 | SHRT_MIN, a very negative number, means this situation is an      | 
 351 | error.  The parser recognizes this value specially.               | 
 353 | This is where conflicts are resolved.  The loop over lookahead    | 
 354 | rules considered lower-numbered rules last, and the last rule     | 
 355 | considered that likes a token gets to handle it.                  | 
 356 `------------------------------------------------------------------*/ 
 359 action_row (state_t 
*state
) 
 362   int default_rule 
= 0; 
 363   reductions 
*redp 
= state
->reductions
; 
 364   shifts 
*shiftp 
= state
->shifts
; 
 365   errs 
*errp 
= state
->errs
; 
 366   /* set nonzero to inhibit having any default reduction */ 
 369   for (i 
= 0; i 
< ntokens
; i
++) 
 372   if (redp
->nreds 
>= 1) 
 375       /* loop over all the rules available here which require 
 377       for (i 
= state
->nlookaheads 
- 1; i 
>= 0; --i
) 
 378         /* and find each token which the rule finds acceptable 
 380         for (j 
= 0; j 
< ntokens
; j
++) 
 381           /* and record this rule as the rule to use if that 
 383           if (bitset_test (state
->lookaheads
[i
], j
)) 
 384             actrow
[j
] = -state
->lookaheads_rule
[i
]->number
; 
 387   /* Now see which tokens are allowed for shifts in this state.  For 
 388      them, record the shift as the thing to do.  So shift is preferred 
 390   for (i 
= 0; i 
< shiftp
->nshifts
; i
++) 
 392       symbol_number_t symbol
; 
 393       int shift_state 
= shiftp
->shifts
[i
]; 
 397       symbol 
= states
[shift_state
]->accessing_symbol
; 
 402       actrow
[symbol
] = shift_state
; 
 404       /* Do not use any default reduction if there is a shift for 
 406       if (symbol 
== errtoken
->number
) 
 410   /* See which tokens are an explicit error in this state (due to 
 411      %nonassoc).  For them, record SHRT_MIN as the action.  */ 
 412   for (i 
= 0; i 
< errp
->nerrs
; i
++) 
 414       int symbol 
= errp
->errs
[i
]; 
 415       actrow
[symbol
] = SHRT_MIN
; 
 418   /* Now find the most common reduction and make it the default action 
 421   if (redp
->nreds 
>= 1 && !nodefault
) 
 423       if (state
->consistent
) 
 424         default_rule 
= redp
->rules
[0]; 
 428           for (i 
= 0; i 
< state
->nlookaheads
; i
++) 
 431               int rule 
= -state
->lookaheads_rule
[i
]->number
; 
 434               for (j 
= 0; j 
< ntokens
; j
++) 
 435                 if (actrow
[j
] == rule
) 
 445           /* actions which match the default are replaced with zero, 
 446              which means "use the default" */ 
 451               for (j 
= 0; j 
< ntokens
; j
++) 
 452                 if (actrow
[j
] == default_rule
) 
 455               default_rule 
= -default_rule
; 
 460   /* If have no default rule, the default is an error. 
 461      So replace any action which says "error" with "use default".  */ 
 463   if (default_rule 
== 0) 
 464     for (i 
= 0; i 
< ntokens
; i
++) 
 465       if (actrow
[i
] == SHRT_MIN
) 
 482   for (i 
= 0; i 
< ntokens
; i
++) 
 489   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 490   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 492   for (i 
= 0; i 
< ntokens
; i
++) 
 499   tally
[state
] = count
; 
 500   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 504 /*------------------------------------------------------------------. 
 505 | Figure out the actions for the specified state, indexed by        | 
 506 | lookahead token type.                                             | 
 508 | The YYDEFACT table is output now.  The detailed info is saved for | 
 509 | putting into YYTABLE later.                                       | 
 510 `------------------------------------------------------------------*/ 
 516   short *yydefact 
= XCALLOC (short, nstates
); 
 518   actrow 
= XCALLOC (short, ntokens
); 
 519   for (i 
= 0; i 
< nstates
; ++i
) 
 521       yydefact
[i
] = action_row (states
[i
]); 
 525   muscle_insert_short_table ("defact", yydefact
, 
 526                              yydefact
[0], 1, nstates
); 
 532 /*-----------------------------. 
 533 | Output the actions to OOUT.  | 
 534 `-----------------------------*/ 
 537 actions_output (FILE *out
) 
 540   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 541     if (rules
[rule
].action
) 
 543         fprintf (out
, "  case %d:\n", rule
); 
 546           fprintf (out
, muscle_find ("linef"), 
 547                    rules
[rule
].action_location
.first_line
, 
 548                    quotearg_style (c_quoting_style
, 
 549                                    muscle_find ("filename"))); 
 550         fprintf (out
, "    %s\n    break;\n\n", 
 556 /*---------------------------------------. 
 557 | Output the tokens definition to OOUT.  | 
 558 `---------------------------------------*/ 
 561 token_definitions_output (FILE *out
) 
 565   for (i 
= 0; i 
< ntokens
; ++i
) 
 567       symbol_t 
*symbol 
= symbols
[i
]; 
 568       int number 
= symbol
->user_token_number
; 
 570       /* At this stage, if there are literal aliases, they are part of 
 571          SYMBOLS, so we should not find symbols which are the aliases 
 573       assert (number 
!= USER_NUMBER_ALIAS
); 
 575       /* Skip error token.  */ 
 576       if (symbol 
== errtoken
) 
 579       /* If this string has an alias, then it is necessarily the alias 
 580          which is to be output.  */ 
 582         symbol 
= symbol
->alias
; 
 584       /* Don't output literal chars or strings (when defined only as a 
 585          string).  Note that must be done after the alias resolution: 
 586          think about `%token 'f' "f"'.  */ 
 587       if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"') 
 590       /* Don't #define nonliteral tokens whose names contain periods 
 591          or '$' (as does the default value of the EOF token).  */ 
 592       if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$')) 
 595       fprintf (out
, "%s[[[%s]], [%d]]", 
 596                first 
? "" : ",\n", symbol
->tag
, number
); 
 604 save_column (int symbol
, int default_state
) 
 611   int symno 
= symbol 
- ntokens 
+ nstates
; 
 613   short begin 
= goto_map
[symbol
]; 
 614   short end 
= goto_map
[symbol 
+ 1]; 
 617   for (i 
= begin
; i 
< end
; i
++) 
 618     if (to_state
[i
] != default_state
) 
 624   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 625   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 627   for (i 
= begin
; i 
< end
; i
++) 
 628     if (to_state
[i
] != default_state
) 
 630         *sp1
++ = from_state
[i
]; 
 631         *sp2
++ = to_state
[i
]; 
 634   tally
[symno
] = count
; 
 635   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 639 default_goto (int symbol
) 
 642   size_t m 
= goto_map
[symbol
]; 
 643   size_t n 
= goto_map
[symbol 
+ 1]; 
 644   int default_state 
= -1; 
 650   for (i 
= 0; i 
< nstates
; i
++) 
 653   for (i 
= m
; i 
< n
; i
++) 
 654     state_count
[to_state
[i
]]++; 
 656   for (i 
= 0; i 
< nstates
; i
++) 
 657     if (state_count
[i
] > max
) 
 659         max 
= state_count
[i
]; 
 663   return default_state
; 
 667 /*-------------------------------------------------------------------. 
 668 | Figure out what to do after reducing with each rule, depending on  | 
 669 | the saved state from before the beginning of parsing the data that | 
 670 | matched this rule.                                                 | 
 672 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 673 | putting into YYTABLE later.                                        | 
 674 `-------------------------------------------------------------------*/ 
 680   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 682   state_count 
= XCALLOC (short, nstates
); 
 683   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 685       int default_state 
= default_goto (i
); 
 686       save_column (i
, default_state
); 
 687       yydefgoto
[i 
- ntokens
] = default_state
; 
 690   muscle_insert_short_table ("defgoto", yydefgoto
, 
 691                              yydefgoto
[0], 1, nsyms 
- ntokens
); 
 697 /* The next few functions decide how to pack the actions and gotos 
 698    information into yytable. */ 
 705   order 
= XCALLOC (short, nvectors
); 
 708   for (i 
= 0; i 
< nvectors
; i
++) 
 714         int j 
= nentries 
- 1; 
 716         while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 719         while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 722         for (k 
= nentries 
- 1; k 
> j
; k
--) 
 723           order
[k 
+ 1] = order
[k
]; 
 732 matching_state (int vector
) 
 734   int i 
= order
[vector
]; 
 739   if (i 
>= (int) nstates
) 
 745   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 751       if (width
[j
] != w 
|| tally
[j
] != t
) 
 754       for (k 
= 0; match 
&& k 
< t
; k
++) 
 755         if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 767 pack_vector (int vector
) 
 769   int i 
= order
[vector
]; 
 773   short *from 
= froms
[i
]; 
 778   for (j 
= lowzero 
- from
[0]; j 
< (int) table_size
; j
++) 
 783       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 786           if (loc 
> (int) table_size
) 
 793       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 799           for (k 
= 0; k 
< t
; k
++) 
 803               check
[loc
] = from
[k
]; 
 806           while (table
[lowzero
] != 0) 
 815 #define pack_vector_succeeded 0 
 816   assert (pack_vector_succeeded
); 
 828   base 
= XCALLOC (short, nvectors
); 
 829   pos 
= XCALLOC (short, nentries
); 
 830   table 
= XCALLOC (short, table_size
); 
 831   check 
= XCALLOC (short, table_size
); 
 836   for (i 
= 0; i 
< nvectors
; i
++) 
 839   for (i 
= 0; i 
< (int) table_size
; i
++) 
 842   for (i 
= 0; i 
< nentries
; i
++) 
 844       state 
= matching_state (i
); 
 847         place 
= pack_vector (i
); 
 852       base
[order
[i
]] = place
; 
 855   for (i 
= 0; i 
< nvectors
; i
++) 
 866 /* the following functions output yytable, yycheck 
 867    and the vectors whose elements index the portion starts */ 
 873   muscle_insert_short_table ("pact", base
, 
 874                              base
[0], 1, nstates
); 
 877   muscle_insert_short_table ("pgoto", base
, 
 878                              base
[nstates
], nstates 
+ 1, nvectors
); 
 886   muscle_insert_short_table ("table", table
, 
 887                              table
[0], 1, high 
+ 1); 
 895   muscle_insert_short_table ("check", check
, 
 896                              check
[0], 1, high 
+ 1); 
 900 /*-----------------------------------------------------------------. 
 901 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable | 
 903 `-----------------------------------------------------------------*/ 
 906 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
); 
 921   XFREE (goto_map 
+ ntokens
); 
 933   for (i 
= 0; i 
< nstates
; ++i
) 
 935       free (states
[i
]->shifts
); 
 936       XFREE (states
[i
]->reductions
); 
 937       free (states
[i
]->errs
); 
 944 /*----------------------. 
 945 | Run our backend, M4.  | 
 946 `----------------------*/ 
 949 m4_invoke (const char *definitions
) 
 951   /* Invoke m4 on the definition of the muscles, and the skeleton. */ 
 952   const char *bison_pkgdatadir 
= getenv ("BISON_PKGDATADIR"); 
 953   const char *m4 
= getenv ("M4"); 
 959   if (!bison_pkgdatadir
) 
 960     bison_pkgdatadir 
= PKGDATADIR
; 
 961   pkg_data_len 
= strlen (bison_pkgdatadir
); 
 962   full_skeleton 
= XMALLOC (char, pkg_data_len 
+ strlen (skeleton
) + 2); 
 963   if (bison_pkgdatadir
[pkg_data_len
-1] == '/') 
 964     sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
); 
 966     sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
); 
 969              "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n", 
 970              m4
, bison_pkgdatadir
, definitions
, full_skeleton
); 
 971   skel_in 
= readpipe (m4
, 
 972                       "-I", bison_pkgdatadir
, 
 973                       "m4sugar/m4sugar.m4", 
 977   XFREE (full_skeleton
); 
 979     error (EXIT_FAILURE
, errno
, "cannot run m4"); 
 984 /*---------------------------. 
 985 | Call the skeleton parser.  | 
 986 `---------------------------*/ 
 989 output_skeleton (void) 
 991   /* Store the definition of all the muscles. */ 
 992   const char *tempdir 
= getenv ("TMPDIR"); 
 993   char *tempfile 
= NULL
; 
 998     tempdir 
= DEFAULT_TMPDIR
; 
 999   tempfile 
= xmalloc (strlen (tempdir
) + 11); 
1000   sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
); 
1001   fd 
= mkstemp (tempfile
); 
1003     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
1005   out 
= fdopen (fd
, "w"); 
1007     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
1009   /* There are no comments, especially not `#': we do want M4 expansion 
1010      after `#': think of CPP macros!  */ 
1011   fputs ("m4_changecom()\n", out
); 
1012   fputs ("m4_init()\n", out
); 
1014   fputs ("m4_define([b4_actions], \n[[", out
); 
1015   actions_output (out
); 
1016   fputs ("]])\n\n", out
); 
1018   fputs ("m4_define([b4_tokens], \n[", out
); 
1019   token_definitions_output (out
); 
1020   fputs ("])\n\n", out
); 
1022   muscles_m4_output (out
); 
1024   fputs ("m4_wrap([m4_divert_pop(0)])\n", out
); 
1025   fputs ("m4_divert_push(0)dnl\n", out
); 
1028   m4_invoke (tempfile
); 
1030   /* If `debugging', keep this file alive. */ 
1040   MUSCLE_INSERT_INT ("last", high
); 
1041   MUSCLE_INSERT_INT ("flag", SHRT_MIN
); 
1042   MUSCLE_INSERT_INT ("pure", pure_parser
); 
1043   MUSCLE_INSERT_INT ("nsym", nsyms
); 
1044   MUSCLE_INSERT_INT ("debug", debug_flag
); 
1045   MUSCLE_INSERT_INT ("final", final_state
); 
1046   MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
); 
1047   MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
); 
1048   MUSCLE_INSERT_INT ("error_verbose", error_verbose
); 
1049   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix 
? spec_name_prefix 
: "yy"); 
1051   /* FIXME: This is wrong: the muscles should decide whether they hold 
1052      a copy or not, but the situation is too obscure currently.  */ 
1053   MUSCLE_INSERT_STRING ("output_infix", output_infix 
? output_infix 
: ""); 
1054   MUSCLE_INSERT_STRING ("output_prefix", short_base_name
); 
1055   MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
); 
1056   MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
); 
1058   MUSCLE_INSERT_INT ("nnts", nvars
); 
1059   MUSCLE_INSERT_INT ("nrules", nrules
); 
1060   MUSCLE_INSERT_INT ("nstates", nstates
); 
1061   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1063   MUSCLE_INSERT_INT ("locations_flag", locations_flag
); 
1064   MUSCLE_INSERT_INT ("defines_flag", defines_flag
); 
1066   /* Copy definitions in directive.  */ 
1067   obstack_1grow (&pre_prologue_obstack
, 0); 
1068   obstack_1grow (&post_prologue_obstack
, 0); 
1069   muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
)); 
1070   muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
)); 
1072   /* Find the right skeleton file.  */ 
1074     skeleton 
= "bison.simple"; 
1076   /* Parse the skeleton file and output the needed parsers.  */ 
1077   muscle_insert ("skeleton", skeleton
); 
1081 /*----------------------------------------------------------. 
1082 | Output the parsing tables and the parser code to ftable.  | 
1083 `----------------------------------------------------------*/ 
1088   obstack_init (&format_obstack
); 
1097   /* Process the selected skeleton file.  */ 
1100   obstack_free (&format_obstack
, NULL
); 
1101   obstack_free (&pre_prologue_obstack
, NULL
); 
1102   obstack_free (&post_prologue_obstack
, NULL
);