]>
git.saurik.com Git - bison.git/blob - src/output.c
   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 ?? 
 103 #include "conflicts.h" 
 104 #include "muscle_tab.h" 
 109 static short **froms 
= NULL
; 
 110 static short **tos 
= NULL
; 
 111 static short *tally 
= NULL
; 
 112 static short *width 
= NULL
; 
 113 static short *actrow 
= NULL
; 
 114 static short *state_count 
= NULL
; 
 115 static short *order 
= NULL
; 
 116 static short *base 
= NULL
; 
 117 static short *pos 
= NULL
; 
 118 static short *table 
= NULL
; 
 119 static short *check 
= NULL
; 
 123 struct obstack muscle_obstack
; 
 124 static struct obstack format_obstack
; 
 126 int error_verbose 
= 0; 
 128 /* Returns the number of lines of S.  */ 
 130 get_lines_number (const char *s
) 
 135   for (i 
= 0; s
[i
]; ++i
) 
 146 output_table_data (struct obstack 
*oout
, 
 155   obstack_fgrow1 (oout
, "%6d", first
); 
 156   for (i 
= begin
; i 
< end
; ++i
) 
 158       obstack_1grow (oout
, ','); 
 161           obstack_sgrow (oout
, "\n  "); 
 166       obstack_fgrow1 (oout
, "%6d", table_data
[i
]); 
 168   obstack_1grow (oout
, 0); 
 173 output_token_translations (void) 
 175   output_table_data (&format_obstack
, token_translations
, 
 176                      0, 1, max_user_token_number 
+ 1); 
 177   muscle_insert ("translate", obstack_finish (&format_obstack
)); 
 178   XFREE (token_translations
); 
 187     short *values 
= XCALLOC (short, nrules 
+ 1); 
 188     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 189       values
[i
] = rule_table
[i
].rhs
; 
 190     output_table_data (&format_obstack
, values
, 
 195   muscle_insert ("prhs", obstack_finish (&format_obstack
)); 
 198     size_t yyrhs_size 
= 1; 
 202     for (sp 
= ritem 
+ 1; *sp
; sp
++) 
 204     yyrhs 
= XMALLOC (short, yyrhs_size
); 
 206     for (sp 
= ritem 
+ 1, i 
= 1; *sp
; ++sp
, ++i
) 
 207       yyrhs
[i
] = *sp 
> 0 ? *sp 
: 0; 
 209     output_table_data (&format_obstack
, yyrhs
, 
 210                        ritem
[0], 1, yyrhs_size
); 
 211     muscle_insert ("rhs", obstack_finish (&format_obstack
)); 
 217   if (!semantic_parser
) 
 218     obstack_sgrow (&table_obstack
, "\n#endif\n"); 
 227   short *values 
= (short *) alloca (sizeof (short) * nstates
); 
 228   for (i 
= 0; i 
< nstates
; ++i
) 
 229     values
[i
] = state_table
[i
]->accessing_symbol
; 
 230   output_table_data (&format_obstack
, values
, 
 232   muscle_insert ("stos", obstack_finish (&format_obstack
)); 
 237 output_rule_data (void) 
 241   short *short_tab 
= NULL
; 
 244     short *values 
= XCALLOC (short, nrules 
+ 1); 
 245     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 246       values
[i
] = rule_table
[i
].line
; 
 247     output_table_data (&format_obstack
, values
, 
 249     muscle_insert ("rline", obstack_finish (&format_obstack
)); 
 255   for (i 
= 0; i 
< nsyms
; i
++) 
 257       /* Be sure not to use twice the same quotearg slot. */ 
 259         quotearg_n_style (1, c_quoting_style
, 
 260                           quotearg_style (escape_quoting_style
, tags
[i
])); 
 261       /* Width of the next token, including the two quotes, the coma 
 263       int strsize 
= strlen (cp
) + 2; 
 265       if (j 
+ strsize 
> 75) 
 267           obstack_sgrow (&format_obstack
, "\n  "); 
 271       obstack_sgrow (&format_obstack
, cp
); 
 272       obstack_sgrow (&format_obstack
, ", "); 
 275   /* add a NULL entry to list of tokens */ 
 276   obstack_sgrow (&format_obstack
, "NULL"); 
 278   /* Finish table and store. */ 
 279   obstack_1grow (&format_obstack
, 0); 
 280   muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 282   /* Output YYTOKNUM. */ 
 283   output_table_data (&format_obstack
, user_toknums
, 
 285   muscle_insert ("toknum", obstack_finish (&format_obstack
)); 
 289     short *values 
= XCALLOC (short, nrules 
+ 1); 
 290     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 291       values
[i
] = rule_table
[i
].lhs
; 
 292     output_table_data (&format_obstack
, values
, 
 294     muscle_insert ("r1", obstack_finish (&format_obstack
)); 
 299   short_tab 
= XMALLOC (short, nrules 
+ 1); 
 300   for (i 
= 1; i 
< nrules
; i
++) 
 301     short_tab
[i
] = rule_table
[i 
+ 1].rhs 
- rule_table
[i
].rhs 
- 1; 
 302   short_tab
[nrules
] =  nitems 
- rule_table
[nrules
].rhs 
- 1; 
 303   output_table_data (&format_obstack
, short_tab
, 
 305   muscle_insert ("r2", obstack_finish (&format_obstack
)); 
 309 /*------------------------------------------------------------------. 
 310 | Decide what to do for each type of token if seen as the lookahead | 
 311 | token in specified state.  The value returned is used as the      | 
 312 | default action (yydefact) for the state.  In addition, actrow is  | 
 313 | filled with what to do for each kind of token, index by symbol    | 
 314 | number, with zero meaning do the default action.  The value       | 
 315 | MINSHORT, a very negative number, means this situation is an      | 
 316 | error.  The parser recognizes this value specially.               | 
 318 | This is where conflicts are resolved.  The loop over lookahead    | 
 319 | rules considered lower-numbered rules last, and the last rule     | 
 320 | considered that likes a token gets to handle it.                  | 
 321 `------------------------------------------------------------------*/ 
 324 action_row (state_t 
*state
) 
 327   int default_rule 
= 0; 
 328   reductions 
*redp 
= state
->reductions
; 
 329   int nreds 
= redp 
? redp
->nreds 
: 0; 
 330   shifts 
*shiftp 
= state
->shifts
; 
 331   errs 
*errp 
= state
->errs
; 
 332   /* set nonzero to inhibit having any default reduction */ 
 335   for (i 
= 0; i 
< ntokens
; i
++) 
 341       /* loop over all the rules available here which require 
 343       for (i 
= state
->nlookaheads 
- 1; i 
>= 0; --i
) 
 344         /* and find each token which the rule finds acceptable 
 346         for (j 
= 0; j 
< ntokens
; j
++) 
 347           /* and record this rule as the rule to use if that 
 349           if (BITISSET (LA (state
->lookaheadsp 
+ i
), j
)) 
 350             actrow
[j
] = -LAruleno
[state
->lookaheadsp 
+ i
]; 
 353   /* Now see which tokens are allowed for shifts in this state.  For 
 354      them, record the shift as the thing to do.  So shift is preferred 
 356   for (i 
= 0; i 
< shiftp
->nshifts
; i
++) 
 359       int shift_state 
= shiftp
->shifts
[i
]; 
 363       symbol 
= state_table
[shift_state
]->accessing_symbol
; 
 368       actrow
[symbol
] = shift_state
; 
 370       /* Do not use any default reduction if there is a shift for 
 372       if (symbol 
== error_token_number
) 
 376   /* See which tokens are an explicit error in this state (due to 
 377      %nonassoc).  For them, record MINSHORT as the action.  */ 
 378   for (i 
= 0; i 
< errp
->nerrs
; i
++) 
 380       int symbol 
= errp
->errs
[i
]; 
 381       actrow
[symbol
] = MINSHORT
; 
 384   /* Now find the most common reduction and make it the default action 
 387   if (nreds 
>= 1 && !nodefault
) 
 389       if (state
->consistent
) 
 390         default_rule 
= redp
->rules
[0]; 
 394           for (i 
= 0; i 
< state
->nlookaheads
; i
++) 
 397               int rule 
= -LAruleno
[state
->lookaheadsp 
+ i
]; 
 400               for (j 
= 0; j 
< ntokens
; j
++) 
 401                 if (actrow
[j
] == rule
) 
 411           /* actions which match the default are replaced with zero, 
 412              which means "use the default" */ 
 417               for (j 
= 0; j 
< ntokens
; j
++) 
 418                 if (actrow
[j
] == default_rule
) 
 421               default_rule 
= -default_rule
; 
 426   /* If have no default rule, the default is an error. 
 427      So replace any action which says "error" with "use default".  */ 
 429   if (default_rule 
== 0) 
 430     for (i 
= 0; i 
< ntokens
; i
++) 
 431       if (actrow
[i
] == MINSHORT
) 
 448   for (i 
= 0; i 
< ntokens
; i
++) 
 455   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 456   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 458   for (i 
= 0; i 
< ntokens
; i
++) 
 465   tally
[state
] = count
; 
 466   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 470 /*------------------------------------------------------------------. 
 471 | Figure out the actions for the specified state, indexed by        | 
 472 | lookahead token type.                                             | 
 474 | The YYDEFACT table is output now.  The detailed info is saved for | 
 475 | putting into YYTABLE later.                                       | 
 476 `------------------------------------------------------------------*/ 
 482   short *yydefact 
= XCALLOC (short, nstates
); 
 484   actrow 
= XCALLOC (short, ntokens
); 
 485   for (i 
= 0; i 
< nstates
; ++i
) 
 487       yydefact
[i
] = action_row (state_table
[i
]); 
 491   output_table_data (&format_obstack
, yydefact
, 
 492                      yydefact
[0], 1, nstates
); 
 493   muscle_insert ("defact", obstack_finish (&format_obstack
)); 
 500 /*-----------------------------. 
 501 | Output the actions to OOUT.  | 
 502 `-----------------------------*/ 
 505 actions_output (FILE *out
, size_t *line
) 
 508   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 509     if (rule_table
[rule
].action
) 
 511         fprintf (out
, "  case %d:\n", rule
); 
 514           fprintf (out
, muscle_find ("linef"), 
 515                    rule_table
[rule
].action_line
, 
 516                    quotearg_style (c_quoting_style
, 
 517                                    muscle_find ("filename"))); 
 518         /* As a Bison extension, add the ending semicolon.  Since some 
 519            Yacc don't do that, help people using bison as a Yacc 
 520            finding their missing semicolons.  */ 
 521         fprintf (out
, "{ %s%s }\n    break;\n\n", 
 522                  rule_table
[rule
].action
, 
 523                  yacc_flag 
? ";" : ""); 
 525         /* We always output 4 '\n' per action.  */ 
 527         /* Plus one if !no_lines_flag.  */ 
 530         /* Get the number of lines written by the user.  */ 
 531         *line 
+= get_lines_number (rule_table
[rule
].action
); 
 536 /*----------------------------. 
 537 | Output the guards to OOUT.  | 
 538 `----------------------------*/ 
 541 guards_output (FILE *out
, size_t *line
) 
 544   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 545     if (rule_table
[rule
].action
) 
 547         fprintf (out
, "  case %d:\n", rule
); 
 550           fprintf (out
, muscle_find ("linef"), 
 551                    rule_table
[rule
].guard_line
, 
 552                    quotearg_style (c_quoting_style
, 
 553                                    muscle_find ("filename"))); 
 554         fprintf (out
, "{ %s; }\n    break;\n\n", 
 555                  rule_table
[rule
].guard
); 
 557         /* We always output 4 '\n' per action.  */ 
 559         /* Plus one if !no_lines_flag.  */ 
 562         /* Get the number of lines written by the user.  */ 
 563         *line 
+= get_lines_number (rule_table
[rule
].guard
); 
 569 save_column (int symbol
, int default_state
) 
 576   int symno 
= symbol 
- ntokens 
+ nstates
; 
 578   short begin 
= goto_map
[symbol
]; 
 579   short end 
= goto_map
[symbol 
+ 1]; 
 582   for (i 
= begin
; i 
< end
; i
++) 
 583     if (to_state
[i
] != default_state
) 
 589   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 590   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 592   for (i 
= begin
; i 
< end
; i
++) 
 593     if (to_state
[i
] != default_state
) 
 595         *sp1
++ = from_state
[i
]; 
 596         *sp2
++ = to_state
[i
]; 
 599   tally
[symno
] = count
; 
 600   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 604 default_goto (int symbol
) 
 607   int m 
= goto_map
[symbol
]; 
 608   int n 
= goto_map
[symbol 
+ 1]; 
 609   int default_state 
= -1; 
 615   for (i 
= 0; i 
< nstates
; i
++) 
 618   for (i 
= m
; i 
< n
; i
++) 
 619     state_count
[to_state
[i
]]++; 
 621   for (i 
= 0; i 
< nstates
; i
++) 
 622     if (state_count
[i
] > max
) 
 624         max 
= state_count
[i
]; 
 628   return default_state
; 
 632 /*-------------------------------------------------------------------. 
 633 | Figure out what to do after reducing with each rule, depending on  | 
 634 | the saved state from before the beginning of parsing the data that | 
 635 | matched this rule.                                                 | 
 637 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 638 | putting into YYTABLE later.                                        | 
 639 `-------------------------------------------------------------------*/ 
 645   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 647   state_count 
= XCALLOC (short, nstates
); 
 648   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 650       int default_state 
= default_goto (i
); 
 651       save_column (i
, default_state
); 
 652       yydefgoto
[i 
- ntokens
] = default_state
; 
 655   output_table_data (&format_obstack
, yydefgoto
, 
 656                      yydefgoto
[0], 1, nsyms 
- ntokens
); 
 657   muscle_insert ("defgoto", obstack_finish (&format_obstack
)); 
 664 /* The next few functions decide how to pack the actions and gotos 
 665    information into yytable. */ 
 672   order 
= XCALLOC (short, nvectors
); 
 675   for (i 
= 0; i 
< nvectors
; i
++) 
 681         int j 
= nentries 
- 1; 
 683         while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 686         while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 689         for (k 
= nentries 
- 1; k 
> j
; k
--) 
 690           order
[k 
+ 1] = order
[k
]; 
 699 matching_state (int vector
) 
 701   int i 
= order
[vector
]; 
 712   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 718       if (width
[j
] != w 
|| tally
[j
] != t
) 
 721       for (k 
= 0; match 
&& k 
< t
; k
++) 
 722         if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 734 pack_vector (int vector
) 
 736   int i 
= order
[vector
]; 
 740   short *from 
= froms
[i
]; 
 745   for (j 
= lowzero 
- from
[0]; j 
< MAXTABLE
; j
++) 
 750       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 754             fatal (_("maximum table size (%d) exceeded"), MAXTABLE
); 
 760       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 766           for (k 
= 0; k 
< t
; k
++) 
 770               check
[loc
] = from
[k
]; 
 773           while (table
[lowzero
] != 0) 
 782 #define pack_vector_succeeded 0 
 783   assert (pack_vector_succeeded
); 
 795   base 
= XCALLOC (short, nvectors
); 
 796   pos 
= XCALLOC (short, nentries
); 
 797   table 
= XCALLOC (short, MAXTABLE
); 
 798   check 
= XCALLOC (short, MAXTABLE
); 
 803   for (i 
= 0; i 
< nvectors
; i
++) 
 806   for (i 
= 0; i 
< MAXTABLE
; i
++) 
 809   for (i 
= 0; i 
< nentries
; i
++) 
 811       state 
= matching_state (i
); 
 814         place 
= pack_vector (i
); 
 819       base
[order
[i
]] = place
; 
 822   for (i 
= 0; i 
< nvectors
; i
++) 
 833 /* the following functions output yytable, yycheck 
 834    and the vectors whose elements index the portion starts */ 
 840   output_table_data (&format_obstack
, base
, 
 841                      base
[0], 1, nstates
); 
 842   muscle_insert ("pact", obstack_finish (&format_obstack
)); 
 845   output_table_data (&format_obstack
, base
, 
 846                      base
[nstates
], nstates 
+ 1, nvectors
); 
 847   muscle_insert ("pgoto", obstack_finish (&format_obstack
)); 
 856   output_table_data (&format_obstack
, table
, 
 857                      table
[0], 1, high 
+ 1); 
 858   muscle_insert ("table", obstack_finish (&format_obstack
)); 
 866   output_table_data (&format_obstack
, check
, 
 867                      check
[0], 1, high 
+ 1); 
 868   muscle_insert ("check", obstack_finish (&format_obstack
)); 
 872 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable 
 876 output_actions (void) 
 879   nvectors 
= nstates 
+ nvars
; 
 881   froms 
= XCALLOC (short *, nvectors
); 
 882   tos 
= XCALLOC (short *, nvectors
); 
 883   tally 
= XCALLOC (short, nvectors
); 
 884   width 
= XCALLOC (short, nvectors
); 
 891   XFREE (goto_map 
+ ntokens
); 
 903   for (i 
= 0; i 
< nstates
; ++i
) 
 905       free (state_table
[i
]->shifts
); 
 906       XFREE (state_table
[i
]->reductions
); 
 907       free (state_table
[i
]->errs
); 
 908       free (state_table
[i
]); 
 914 /*------------------------------------------------------------. 
 915 | Copy the parser code from SKEL_FILENAME into OOUT obstack.  | 
 916 | and do the muscle substitution.                             | 
 917 `------------------------------------------------------------*/ 
 920 output_parser (const char *skel_filename
, FILE *out
) 
 925   size_t skeleton_line
; 
 927   fskel 
= xfopen (skel_filename
, "r"); 
 929   /* New output code.  */ 
 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
); 
 958           if (!strcmp (muscle_key
, "actions")) 
 959             actions_output (out
, &output_line
); 
 960           else if (!strcmp (muscle_key
, "guards")) 
 961             guards_output (out
, &output_line
); 
 962           else if (!strcmp (muscle_key
, "line")) 
 963             fprintf (out
, "%d", output_line
); 
 964           else if (!strcmp (muscle_key
, "skeleton-line")) 
 965             fprintf (out
, "%d", skeleton_line
); 
 966           else if (muscle_value
) 
 968               fputs (muscle_value
, out
); 
 969               output_line 
+= get_lines_number (muscle_value
); 
 974               fputs (muscle_key
, out
); 
 985 /*----------------------------------------. 
 986 | Prepare the master parser to be output  | 
 987 `----------------------------------------*/ 
 990 output_master_parser (void) 
 992   FILE *parser 
= xfopen (parser_file_name
, "w"); 
 996         skeleton 
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
); 
 998         skeleton 
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
); 
1000   muscle_insert ("skeleton", skeleton
); 
1001   muscle_insert ("parser-file-name", parser_file_name
); 
1003   output_parser (skeleton
, parser
); 
1010 #define MUSCLE_INSERT_INT(Key, Value)                           \ 
1012   obstack_fgrow1 (&muscle_obstack, "%d", Value);                \ 
1013   obstack_1grow (&muscle_obstack, 0);                           \ 
1014   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1017 #define MUSCLE_INSERT_STRING(Key, Value)                        \ 
1019   obstack_sgrow (&muscle_obstack, Value);                       \ 
1020   obstack_1grow (&muscle_obstack, 0);                           \ 
1021   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1024 #define MUSCLE_INSERT_PREFIX(Key, Value)                                \ 
1026   obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value);    \ 
1027   obstack_1grow (&muscle_obstack, 0);                                   \ 
1028   muscle_insert (Key, obstack_finish (&muscle_obstack));                \ 
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
); 
1044   MUSCLE_INSERT_INT ("nnts", nvars
); 
1045   MUSCLE_INSERT_INT ("nrules", nrules
); 
1046   MUSCLE_INSERT_INT ("nstates", nstates
); 
1047   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1049   MUSCLE_INSERT_INT ("locations-flag", locations_flag
); 
1053 /*-------------------------. 
1054 | Output the header file.  | 
1055 `-------------------------*/ 
1058 header_output (void) 
1060   FILE *out 
= xfopen (spec_defines_file
, "w"); 
1061   char *macro_name 
= compute_header_macro (); 
1063   fprintf (out
, "#ifndef %s\n", macro_name
); 
1064   fprintf (out
, "# define %s\n\n", macro_name
); 
1066   fputs (muscle_find ("tokendef"), out
); 
1071 # define YYSTYPE yystype\n\ 
1073                     muscle_find ("stype")); 
1076     fprintf (out
, "\nextern YYSTYPE %slval;\n", 
1078   if (semantic_parser
) 
1082       for (i 
= ntokens
; i 
< nsyms
; i
++) 
1083         /* don't make these for dummy nonterminals made by gensym.  */ 
1084         if (*tags
[i
] != '@') 
1085           fprintf (out
, "# define NT%s\t%d\n", tags
[i
], i
); 
1088   fprintf (out
, "\n#endif /* not %s */\n", macro_name
); 
1094 /*----------------------------------------------------------. 
1095 | Output the parsing tables and the parser code to ftable.  | 
1096 `----------------------------------------------------------*/ 
1101   obstack_init (&format_obstack
); 
1103   output_token_translations (); 
1107   if (semantic_parser
) 
1109   output_rule_data (); 
1110   XFREE (user_toknums
); 
1114   /* Copy definitions in directive.  */ 
1115   obstack_1grow (&attrs_obstack
, 0); 
1116   muscle_insert ("prologue", obstack_finish (&attrs_obstack
)); 
1118   /* Output the parser. */ 
1119   output_master_parser (); 
1120   /* Output the header if needed. */ 
1124   free (rule_table 
+ 1); 
1125   obstack_free (&muscle_obstack
, NULL
); 
1126   obstack_free (&format_obstack
, NULL
); 
1127   obstack_free (&action_obstack
, NULL
); 
1128   obstack_free (&attrs_obstack
, NULL
);