]>
git.saurik.com Git - bison.git/blob - src/output.c
4b1f999ea99eef3507ad95711bb75106f6107c5c
   1 /* Output the generated parsing program for bison, 
   2    Copyright 1984, 1986, 1989, 1992, 2000, 2001 
   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 ??  */ 
 102 #include "conflicts.h" 
 103 #include "muscle_tab.h" 
 108 static short **froms 
= NULL
; 
 109 static short **tos 
= NULL
; 
 110 static short *tally 
= NULL
; 
 111 static short *width 
= NULL
; 
 112 static short *actrow 
= NULL
; 
 113 static short *state_count 
= NULL
; 
 114 static short *order 
= NULL
; 
 115 static short *base 
= NULL
; 
 116 static short *pos 
= NULL
; 
 117 static short *table 
= NULL
; 
 118 static short *check 
= NULL
; 
 122 struct obstack muscle_obstack
; 
 123 static struct obstack format_obstack
; 
 125 int error_verbose 
= 0; 
 127 /* Returns the number of lines of S.  */ 
 129 get_lines_number (const char *s
) 
 134   for (i 
= 0; s
[i
]; ++i
) 
 145 output_table_data (struct obstack 
*oout
, 
 154   obstack_fgrow1 (oout
, "%6d", first
); 
 155   for (i 
= begin
; i 
< end
; ++i
) 
 157       obstack_1grow (oout
, ','); 
 160           obstack_sgrow (oout
, "\n  "); 
 165       obstack_fgrow1 (oout
, "%6d", table_data
[i
]); 
 167   obstack_1grow (oout
, 0); 
 172 output_token_translations (void) 
 174   output_table_data (&format_obstack
, token_translations
, 
 175                      0, 1, max_user_token_number 
+ 1); 
 176   muscle_insert ("translate", obstack_finish (&format_obstack
)); 
 177   XFREE (token_translations
); 
 186     short *values 
= XCALLOC (short, nrules 
+ 1); 
 187     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 188       values
[i
] = rules
[i
].rhs
; 
 189     output_table_data (&format_obstack
, values
, 
 194   muscle_insert ("prhs", obstack_finish (&format_obstack
)); 
 200     yyrhs 
= XMALLOC (short, nritems
); 
 202     for (i 
= 1; i 
< nritems
; ++i
) 
 203       yyrhs
[i
] = ritem
[i
] >= 0 ? ritem
[i
] : -1; 
 205     output_table_data (&format_obstack
, yyrhs
, 
 206                        ritem
[0], 1, nritems
); 
 207     muscle_insert ("rhs", obstack_finish (&format_obstack
)); 
 213   if (!semantic_parser
) 
 214     obstack_sgrow (&table_obstack
, "\n#endif\n"); 
 223   short *values 
= (short *) alloca (sizeof (short) * nstates
); 
 224   for (i 
= 0; i 
< nstates
; ++i
) 
 225     values
[i
] = states
[i
]->accessing_symbol
; 
 226   output_table_data (&format_obstack
, values
, 
 228   muscle_insert ("stos", obstack_finish (&format_obstack
)); 
 233 output_rule_data (void) 
 237   short *short_tab 
= NULL
; 
 240     short *values 
= XCALLOC (short, nrules 
+ 1); 
 241     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 242       values
[i
] = rules
[i
].line
; 
 243     output_table_data (&format_obstack
, values
, 
 245     muscle_insert ("rline", obstack_finish (&format_obstack
)); 
 251   for (i 
= 0; i 
< nsyms
; i
++) 
 253       /* Be sure not to use twice the same quotearg slot. */ 
 255         quotearg_n_style (1, c_quoting_style
, 
 256                           quotearg_style (escape_quoting_style
, symbols
[i
]->tag
)); 
 257       /* Width of the next token, including the two quotes, the coma 
 259       int strsize 
= strlen (cp
) + 2; 
 261       if (j 
+ strsize 
> 75) 
 263           obstack_sgrow (&format_obstack
, "\n  "); 
 267       obstack_sgrow (&format_obstack
, cp
); 
 268       obstack_sgrow (&format_obstack
, ", "); 
 271   /* add a NULL entry to list of tokens */ 
 272   obstack_sgrow (&format_obstack
, "NULL"); 
 274   /* Finish table and store. */ 
 275   obstack_1grow (&format_obstack
, 0); 
 276   muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 278   /* Output YYTOKNUM. */ 
 280     short *values 
= XCALLOC (short, ntokens 
+ 1); 
 281     for (i 
= 0; i 
< ntokens 
+ 1; ++i
) 
 282       values
[i
] = symbols
[i
]->user_token_number
; 
 283     output_table_data (&format_obstack
, values
, 
 285     muscle_insert ("toknum", obstack_finish (&format_obstack
)); 
 292     short *values 
= XCALLOC (short, nrules 
+ 1); 
 293     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 294       values
[i
] = rules
[i
].lhs
; 
 295     output_table_data (&format_obstack
, values
, 
 297     muscle_insert ("r1", obstack_finish (&format_obstack
)); 
 302   short_tab 
= XMALLOC (short, nrules 
+ 1); 
 303   for (i 
= 1; i 
< nrules
; i
++) 
 304     short_tab
[i
] = rules
[i 
+ 1].rhs 
- rules
[i
].rhs 
- 1; 
 305   short_tab
[nrules
] =  nritems 
- rules
[nrules
].rhs 
- 1; 
 306   output_table_data (&format_obstack
, short_tab
, 
 308   muscle_insert ("r2", obstack_finish (&format_obstack
)); 
 312 /*------------------------------------------------------------------. 
 313 | Decide what to do for each type of token if seen as the lookahead | 
 314 | token in specified state.  The value returned is used as the      | 
 315 | default action (yydefact) for the state.  In addition, actrow is  | 
 316 | filled with what to do for each kind of token, index by symbol    | 
 317 | number, with zero meaning do the default action.  The value       | 
 318 | MINSHORT, a very negative number, means this situation is an      | 
 319 | error.  The parser recognizes this value specially.               | 
 321 | This is where conflicts are resolved.  The loop over lookahead    | 
 322 | rules considered lower-numbered rules last, and the last rule     | 
 323 | considered that likes a token gets to handle it.                  | 
 324 `------------------------------------------------------------------*/ 
 327 action_row (state_t 
*state
) 
 330   int default_rule 
= 0; 
 331   reductions 
*redp 
= state
->reductions
; 
 332   shifts 
*shiftp 
= state
->shifts
; 
 333   errs 
*errp 
= state
->errs
; 
 334   /* set nonzero to inhibit having any default reduction */ 
 337   for (i 
= 0; i 
< ntokens
; i
++) 
 340   if (redp
->nreds 
>= 1) 
 343       /* loop over all the rules available here which require 
 345       for (i 
= state
->nlookaheads 
- 1; i 
>= 0; --i
) 
 346         /* and find each token which the rule finds acceptable 
 348         for (j 
= 0; j 
< ntokens
; j
++) 
 349           /* and record this rule as the rule to use if that 
 351           if (BITISSET (LA (state
->lookaheadsp 
+ i
), j
)) 
 352             actrow
[j
] = -LAruleno
[state
->lookaheadsp 
+ i
]; 
 355   /* Now see which tokens are allowed for shifts in this state.  For 
 356      them, record the shift as the thing to do.  So shift is preferred 
 358   for (i 
= 0; i 
< shiftp
->nshifts
; i
++) 
 361       int shift_state 
= shiftp
->shifts
[i
]; 
 365       symbol 
= states
[shift_state
]->accessing_symbol
; 
 370       actrow
[symbol
] = shift_state
; 
 372       /* Do not use any default reduction if there is a shift for 
 374       if (symbol 
== error_token_number
) 
 378   /* See which tokens are an explicit error in this state (due to 
 379      %nonassoc).  For them, record MINSHORT as the action.  */ 
 380   for (i 
= 0; i 
< errp
->nerrs
; i
++) 
 382       int symbol 
= errp
->errs
[i
]; 
 383       actrow
[symbol
] = MINSHORT
; 
 386   /* Now find the most common reduction and make it the default action 
 389   if (redp
->nreds 
>= 1 && !nodefault
) 
 391       if (state
->consistent
) 
 392         default_rule 
= redp
->rules
[0]; 
 396           for (i 
= 0; i 
< state
->nlookaheads
; i
++) 
 399               int rule 
= -LAruleno
[state
->lookaheadsp 
+ i
]; 
 402               for (j 
= 0; j 
< ntokens
; j
++) 
 403                 if (actrow
[j
] == rule
) 
 413           /* actions which match the default are replaced with zero, 
 414              which means "use the default" */ 
 419               for (j 
= 0; j 
< ntokens
; j
++) 
 420                 if (actrow
[j
] == default_rule
) 
 423               default_rule 
= -default_rule
; 
 428   /* If have no default rule, the default is an error. 
 429      So replace any action which says "error" with "use default".  */ 
 431   if (default_rule 
== 0) 
 432     for (i 
= 0; i 
< ntokens
; i
++) 
 433       if (actrow
[i
] == MINSHORT
) 
 450   for (i 
= 0; i 
< ntokens
; i
++) 
 457   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 458   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 460   for (i 
= 0; i 
< ntokens
; i
++) 
 467   tally
[state
] = count
; 
 468   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 472 /*------------------------------------------------------------------. 
 473 | Figure out the actions for the specified state, indexed by        | 
 474 | lookahead token type.                                             | 
 476 | The YYDEFACT table is output now.  The detailed info is saved for | 
 477 | putting into YYTABLE later.                                       | 
 478 `------------------------------------------------------------------*/ 
 484   short *yydefact 
= XCALLOC (short, nstates
); 
 486   actrow 
= XCALLOC (short, ntokens
); 
 487   for (i 
= 0; i 
< nstates
; ++i
) 
 489       yydefact
[i
] = action_row (states
[i
]); 
 493   output_table_data (&format_obstack
, yydefact
, 
 494                      yydefact
[0], 1, nstates
); 
 495   muscle_insert ("defact", obstack_finish (&format_obstack
)); 
 502 /*-----------------------------. 
 503 | Output the actions to OOUT.  | 
 504 `-----------------------------*/ 
 507 actions_output (FILE *out
, size_t *line
) 
 510   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 511     if (rules
[rule
].action
) 
 513         fprintf (out
, "  case %d:\n", rule
); 
 516           fprintf (out
, muscle_find ("linef"), 
 517                    rules
[rule
].action_line
, 
 518                    quotearg_style (c_quoting_style
, 
 519                                    muscle_find ("filename"))); 
 520         /* As a Bison extension, add the ending semicolon.  Since some 
 521            Yacc don't do that, help people using bison as a Yacc 
 522            finding their missing semicolons.  */ 
 523         fprintf (out
, "{ %s%s }\n    break;\n\n", 
 525                  yacc_flag 
? ";" : ""); 
 527         /* We always output 4 '\n' per action.  */ 
 529         /* Plus one if !no_lines_flag.  */ 
 532         /* Get the number of lines written by the user.  */ 
 533         *line 
+= get_lines_number (rules
[rule
].action
); 
 538 /*----------------------------. 
 539 | Output the guards to OOUT.  | 
 540 `----------------------------*/ 
 543 guards_output (FILE *out
, size_t *line
) 
 546   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 547     if (rules
[rule
].action
) 
 549         fprintf (out
, "  case %d:\n", rule
); 
 552           fprintf (out
, muscle_find ("linef"), 
 553                    rules
[rule
].guard_line
, 
 554                    quotearg_style (c_quoting_style
, 
 555                                    muscle_find ("filename"))); 
 556         fprintf (out
, "{ %s; }\n    break;\n\n", 
 559         /* We always output 4 '\n' per action.  */ 
 561         /* Plus one if !no_lines_flag.  */ 
 564         /* Get the number of lines written by the user.  */ 
 565         *line 
+= get_lines_number (rules
[rule
].guard
); 
 570 /*---------------------------------------. 
 571 | Output the tokens definition to OOUT.  | 
 572 `---------------------------------------*/ 
 575 token_definitions_output (FILE *out
, size_t *line
) 
 578   for (i 
= 0; i 
< ntokens
; ++i
) 
 580       bucket 
*symbol 
= symbols
[i
]; 
 581       int number 
= symbol
->user_token_number
; 
 583       if (number 
== SALIAS
) 
 585       /* Skip error token.  */ 
 586       if (symbol
->value 
== error_token_number
) 
 588       if (symbol
->tag
[0] == '\'') 
 589         continue;               /* skip literal character */ 
 590       if (symbol
->tag
[0] == '\"') 
 592           /* use literal string only if given a symbol with an alias */ 
 594             symbol 
= symbol
->alias
; 
 599       /* Don't #define nonliteral tokens whose names contain periods 
 600          or '$' (as does the default value of the EOF token).  */ 
 601       if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$')) 
 604       fprintf (out
, "# define %s\t%d\n", 
 605                symbol
->tag
, number
); 
 609           /* FIXME: This is probably wrong, and should be just as 
 611           fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->value
); 
 619 save_column (int symbol
, int default_state
) 
 626   int symno 
= symbol 
- ntokens 
+ nstates
; 
 628   short begin 
= goto_map
[symbol
]; 
 629   short end 
= goto_map
[symbol 
+ 1]; 
 632   for (i 
= begin
; i 
< end
; i
++) 
 633     if (to_state
[i
] != default_state
) 
 639   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 640   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 642   for (i 
= begin
; i 
< end
; i
++) 
 643     if (to_state
[i
] != default_state
) 
 645         *sp1
++ = from_state
[i
]; 
 646         *sp2
++ = to_state
[i
]; 
 649   tally
[symno
] = count
; 
 650   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 654 default_goto (int symbol
) 
 657   int m 
= goto_map
[symbol
]; 
 658   int n 
= goto_map
[symbol 
+ 1]; 
 659   int default_state 
= -1; 
 665   for (i 
= 0; i 
< nstates
; i
++) 
 668   for (i 
= m
; i 
< n
; i
++) 
 669     state_count
[to_state
[i
]]++; 
 671   for (i 
= 0; i 
< nstates
; i
++) 
 672     if (state_count
[i
] > max
) 
 674         max 
= state_count
[i
]; 
 678   return default_state
; 
 682 /*-------------------------------------------------------------------. 
 683 | Figure out what to do after reducing with each rule, depending on  | 
 684 | the saved state from before the beginning of parsing the data that | 
 685 | matched this rule.                                                 | 
 687 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 688 | putting into YYTABLE later.                                        | 
 689 `-------------------------------------------------------------------*/ 
 695   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 697   state_count 
= XCALLOC (short, nstates
); 
 698   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 700       int default_state 
= default_goto (i
); 
 701       save_column (i
, default_state
); 
 702       yydefgoto
[i 
- ntokens
] = default_state
; 
 705   output_table_data (&format_obstack
, yydefgoto
, 
 706                      yydefgoto
[0], 1, nsyms 
- ntokens
); 
 707   muscle_insert ("defgoto", obstack_finish (&format_obstack
)); 
 714 /* The next few functions decide how to pack the actions and gotos 
 715    information into yytable. */ 
 722   order 
= XCALLOC (short, nvectors
); 
 725   for (i 
= 0; i 
< nvectors
; i
++) 
 731         int j 
= nentries 
- 1; 
 733         while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 736         while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 739         for (k 
= nentries 
- 1; k 
> j
; k
--) 
 740           order
[k 
+ 1] = order
[k
]; 
 749 matching_state (int vector
) 
 751   int i 
= order
[vector
]; 
 762   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 768       if (width
[j
] != w 
|| tally
[j
] != t
) 
 771       for (k 
= 0; match 
&& k 
< t
; k
++) 
 772         if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 784 pack_vector (int vector
) 
 786   int i 
= order
[vector
]; 
 790   short *from 
= froms
[i
]; 
 795   for (j 
= lowzero 
- from
[0]; j 
< MAXTABLE
; j
++) 
 800       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 804             fatal (_("maximum table size (%d) exceeded"), MAXTABLE
); 
 810       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 816           for (k 
= 0; k 
< t
; k
++) 
 820               check
[loc
] = from
[k
]; 
 823           while (table
[lowzero
] != 0) 
 832 #define pack_vector_succeeded 0 
 833   assert (pack_vector_succeeded
); 
 845   base 
= XCALLOC (short, nvectors
); 
 846   pos 
= XCALLOC (short, nentries
); 
 847   table 
= XCALLOC (short, MAXTABLE
); 
 848   check 
= XCALLOC (short, MAXTABLE
); 
 853   for (i 
= 0; i 
< nvectors
; i
++) 
 856   for (i 
= 0; i 
< MAXTABLE
; i
++) 
 859   for (i 
= 0; i 
< nentries
; i
++) 
 861       state 
= matching_state (i
); 
 864         place 
= pack_vector (i
); 
 869       base
[order
[i
]] = place
; 
 872   for (i 
= 0; i 
< nvectors
; i
++) 
 883 /* the following functions output yytable, yycheck 
 884    and the vectors whose elements index the portion starts */ 
 890   output_table_data (&format_obstack
, base
, 
 891                      base
[0], 1, nstates
); 
 892   muscle_insert ("pact", obstack_finish (&format_obstack
)); 
 895   output_table_data (&format_obstack
, base
, 
 896                      base
[nstates
], nstates 
+ 1, nvectors
); 
 897   muscle_insert ("pgoto", obstack_finish (&format_obstack
)); 
 906   output_table_data (&format_obstack
, table
, 
 907                      table
[0], 1, high 
+ 1); 
 908   muscle_insert ("table", obstack_finish (&format_obstack
)); 
 916   output_table_data (&format_obstack
, check
, 
 917                      check
[0], 1, high 
+ 1); 
 918   muscle_insert ("check", obstack_finish (&format_obstack
)); 
 922 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable 
 926 output_actions (void) 
 929   nvectors 
= nstates 
+ nvars
; 
 931   froms 
= XCALLOC (short *, nvectors
); 
 932   tos 
= XCALLOC (short *, nvectors
); 
 933   tally 
= XCALLOC (short, nvectors
); 
 934   width 
= XCALLOC (short, nvectors
); 
 941   XFREE (goto_map 
+ ntokens
); 
 953   for (i 
= 0; i 
< nstates
; ++i
) 
 955       free (states
[i
]->shifts
); 
 956       XFREE (states
[i
]->reductions
); 
 957       free (states
[i
]->errs
); 
 964 /*------------------------------------------------------------. 
 965 | Copy the parser code from SKEL_FILENAME into OOUT obstack.  | 
 966 | and do the muscle substitution.                             | 
 967 `------------------------------------------------------------*/ 
 970 output_parser (const char *skel_filename
, FILE *out
) 
 975   size_t skeleton_line
; 
 977   fskel 
= xfopen (skel_filename
, "r"); 
 979   /* New output code.  */ 
 995       else if ((c 
= getc (fskel
)) == '%') 
 997           /* Read the muscle.  */ 
 998           const char *muscle_key 
= 0; 
 999           const char *muscle_value 
= 0; 
1001           while (isalnum (c 
= getc (fskel
)) || c 
== '-') 
1002             obstack_1grow (&muscle_obstack
, c
); 
1003           obstack_1grow (&muscle_obstack
, 0); 
1005           /* Output the right value, or see if it's something special.  */ 
1006           muscle_key 
= obstack_finish (&muscle_obstack
); 
1007           muscle_value 
= muscle_find (muscle_key
); 
1008           if (!strcmp (muscle_key
, "actions")) 
1009             actions_output (out
, &output_line
); 
1010           else if (!strcmp (muscle_key
, "guards")) 
1011             guards_output (out
, &output_line
); 
1012           else if (!strcmp (muscle_key
, "line")) 
1013             fprintf (out
, "%d", output_line
); 
1014           else if (!strcmp (muscle_key
, "tokendef")) 
1015             token_definitions_output (out
, &output_line
); 
1016           else if (!strcmp (muscle_key
, "skeleton-line")) 
1017             fprintf (out
, "%d", skeleton_line
); 
1018           else if (muscle_value
) 
1020               fputs (muscle_value
, out
); 
1021               output_line 
+= get_lines_number (muscle_value
); 
1026               fputs (muscle_key
, out
); 
1037 /*----------------------------------------. 
1038 | Prepare the master parser to be output  | 
1039 `----------------------------------------*/ 
1042 output_master_parser (void) 
1044   FILE *parser 
= xfopen (parser_file_name
, "w"); 
1047       if (semantic_parser
) 
1048         skeleton 
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
); 
1050         skeleton 
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
); 
1052   muscle_insert ("skeleton", skeleton
); 
1053   muscle_insert ("parser-file-name", parser_file_name
); 
1055   output_parser (skeleton
, parser
); 
1062 #define MUSCLE_INSERT_INT(Key, Value)                           \ 
1064   obstack_fgrow1 (&muscle_obstack, "%d", Value);                \ 
1065   obstack_1grow (&muscle_obstack, 0);                           \ 
1066   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1069 #define MUSCLE_INSERT_STRING(Key, Value)                        \ 
1071   obstack_sgrow (&muscle_obstack, Value);                       \ 
1072   obstack_1grow (&muscle_obstack, 0);                           \ 
1073   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1076 #define MUSCLE_INSERT_PREFIX(Key, Value)                                \ 
1078   obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value);    \ 
1079   obstack_1grow (&muscle_obstack, 0);                                   \ 
1080   muscle_insert (Key, obstack_finish (&muscle_obstack));                \ 
1086   MUSCLE_INSERT_INT ("last", high
); 
1087   MUSCLE_INSERT_INT ("flag", MINSHORT
); 
1088   MUSCLE_INSERT_INT ("pure", pure_parser
); 
1089   MUSCLE_INSERT_INT ("nsym", nsyms
); 
1090   MUSCLE_INSERT_INT ("debug", debug_flag
); 
1091   MUSCLE_INSERT_INT ("final", final_state
); 
1092   MUSCLE_INSERT_INT ("maxtok", max_user_token_number
); 
1093   MUSCLE_INSERT_INT ("error-verbose", error_verbose
); 
1094   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
); 
1096   MUSCLE_INSERT_INT ("nnts", nvars
); 
1097   MUSCLE_INSERT_INT ("nrules", nrules
); 
1098   MUSCLE_INSERT_INT ("nstates", nstates
); 
1099   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1101   MUSCLE_INSERT_INT ("locations-flag", locations_flag
); 
1105 /*-------------------------. 
1106 | Output the header file.  | 
1107 `-------------------------*/ 
1110 header_output (void) 
1113   FILE *out 
= xfopen (spec_defines_file
, "w"); 
1114   char *macro_name 
= compute_header_macro (); 
1116   fprintf (out
, "#ifndef %s\n", macro_name
); 
1117   fprintf (out
, "# define %s\n\n", macro_name
); 
1119   token_definitions_output (out
, &dummy_line
); 
1124 # define YYSTYPE yystype\n\ 
1126                     muscle_find ("stype")); 
1129     fprintf (out
, "\nextern YYSTYPE %slval;\n", 
1134       fputs ("\n\n", out
); 
1137 typedef struct yyltype\n\ 
1140   int first_column;\n\ 
1144 # define YYLTYPE yyltype\n\ 
1147         fprintf (out
, "\nextern YYLTYPE %slloc;\n", 
1151   if (semantic_parser
) 
1155       for (i 
= ntokens
; i 
< nsyms
; i
++) 
1156         /* don't make these for dummy nonterminals made by gensym.  */ 
1157         if (*symbols
[i
]->tag 
!= '@') 
1158           fprintf (out
, "# define NT%s\t%d\n", symbols
[i
]->tag
, i
); 
1161   fprintf (out
, "\n#endif /* not %s */\n", macro_name
); 
1167 /*----------------------------------------------------------. 
1168 | Output the parsing tables and the parser code to ftable.  | 
1169 `----------------------------------------------------------*/ 
1174   obstack_init (&format_obstack
); 
1176   output_token_translations (); 
1180   if (semantic_parser
) 
1182   output_rule_data (); 
1186   /* Copy definitions in directive.  */ 
1187   obstack_1grow (&attrs_obstack
, 0); 
1188   muscle_insert ("prologue", obstack_finish (&attrs_obstack
)); 
1190   /* Output the parser. */ 
1191   output_master_parser (); 
1192   /* Output the header if needed. */ 
1197   obstack_free (&muscle_obstack
, NULL
); 
1198   obstack_free (&format_obstack
, NULL
); 
1199   obstack_free (&action_obstack
, NULL
); 
1200   obstack_free (&attrs_obstack
, NULL
);