]>
git.saurik.com Git - bison.git/blob - src/output.c
841ebe4f3780ec728f52920f437e27ad88a93f45
   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 struct obstack output_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
) 
 148 output_table_data (struct obstack 
*oout
, 
 157   obstack_fgrow1 (oout
, "%6d", first
); 
 158   for (i 
= begin
; i 
< end
; ++i
) 
 160       obstack_1grow (oout
, ','); 
 163           obstack_sgrow (oout
, "\n  "); 
 168       obstack_fgrow1 (oout
, "%6d", table_data
[i
]); 
 170   obstack_1grow (oout
, 0); 
 175 output_token_translations (void) 
 177   output_table_data (&output_obstack
, token_translations
, 
 178                      0, 1, max_user_token_number 
+ 1); 
 179   muscle_insert ("translate", obstack_finish (&output_obstack
)); 
 180   XFREE (token_translations
); 
 189     short *values 
= XCALLOC (short, nrules 
+ 1); 
 190     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 191       values
[i
] = rule_table
[i
].rhs
; 
 192     output_table_data (&output_obstack
, values
, 
 197   muscle_insert ("prhs", obstack_finish (&output_obstack
)); 
 200     size_t yyrhs_size 
= 1; 
 204     for (sp 
= ritem 
+ 1; *sp
; sp
++) 
 206     yyrhs 
= XMALLOC (short, yyrhs_size
); 
 208     for (sp 
= ritem 
+ 1, i 
= 1; *sp
; ++sp
, ++i
) 
 209       yyrhs
[i
] = *sp 
> 0 ? *sp 
: 0; 
 211     output_table_data (&output_obstack
, yyrhs
, 
 212                        ritem
[0], 1, yyrhs_size
); 
 213     muscle_insert ("rhs", obstack_finish (&output_obstack
)); 
 219   if (!semantic_parser
) 
 220     obstack_sgrow (&table_obstack
, "\n#endif\n"); 
 229   short *values 
= (short *) alloca (sizeof (short) * nstates
); 
 230   for (i 
= 0; i 
< nstates
; ++i
) 
 231     values
[i
] = state_table
[i
]->accessing_symbol
; 
 232   output_table_data (&output_obstack
, values
, 
 234   muscle_insert ("stos", obstack_finish (&output_obstack
)); 
 239 output_rule_data (void) 
 243   short *short_tab 
= NULL
; 
 246     short *values 
= XCALLOC (short, nrules 
+ 1); 
 247     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 248       values
[i
] = rule_table
[i
].line
; 
 249     output_table_data (&output_obstack
, values
, 
 251     muscle_insert ("rline", obstack_finish (&output_obstack
)); 
 257   for (i 
= 0; i 
< nsyms
; i
++) 
 259       /* Be sure not to use twice the same quotearg slot. */ 
 261         quotearg_n_style (1, c_quoting_style
, 
 262                           quotearg_style (escape_quoting_style
, tags
[i
])); 
 263       /* Width of the next token, including the two quotes, the coma 
 265       int strsize 
= strlen (cp
) + 2; 
 267       if (j 
+ strsize 
> 75) 
 269           obstack_sgrow (&output_obstack
, "\n  "); 
 273       obstack_sgrow (&output_obstack
, cp
); 
 274       obstack_sgrow (&output_obstack
, ", "); 
 277   /* add a NULL entry to list of tokens */ 
 278   obstack_sgrow (&output_obstack
, "NULL"); 
 280   /* Finish table and store. */ 
 281   obstack_1grow (&output_obstack
, 0); 
 282   muscle_insert ("tname", obstack_finish (&output_obstack
)); 
 284   /* Output YYTOKNUM. */ 
 285   output_table_data (&output_obstack
, user_toknums
, 
 287   muscle_insert ("toknum", obstack_finish (&output_obstack
)); 
 291     short *values 
= XCALLOC (short, nrules 
+ 1); 
 292     for (i 
= 0; i 
< nrules 
+ 1; ++i
) 
 293       values
[i
] = rule_table
[i
].lhs
; 
 294     output_table_data (&output_obstack
, values
, 
 296     muscle_insert ("r1", obstack_finish (&output_obstack
)); 
 301   short_tab 
= XMALLOC (short, nrules 
+ 1); 
 302   for (i 
= 1; i 
< nrules
; i
++) 
 303     short_tab
[i
] = rule_table
[i 
+ 1].rhs 
- rule_table
[i
].rhs 
- 1; 
 304   short_tab
[nrules
] =  nitems 
- rule_table
[nrules
].rhs 
- 1; 
 305   output_table_data (&output_obstack
, short_tab
, 
 307   muscle_insert ("r2", obstack_finish (&output_obstack
)); 
 311 /*------------------------------------------------------------------. 
 312 | Decide what to do for each type of token if seen as the lookahead | 
 313 | token in specified state.  The value returned is used as the      | 
 314 | default action (yydefact) for the state.  In addition, actrow is  | 
 315 | filled with what to do for each kind of token, index by symbol    | 
 316 | number, with zero meaning do the default action.  The value       | 
 317 | MINSHORT, a very negative number, means this situation is an      | 
 318 | error.  The parser recognizes this value specially.               | 
 320 | This is where conflicts are resolved.  The loop over lookahead    | 
 321 | rules considered lower-numbered rules last, and the last rule     | 
 322 | considered that likes a token gets to handle it.                  | 
 323 `------------------------------------------------------------------*/ 
 326 action_row (int state
) 
 341   int nodefault 
= 0;            /* set nonzero to inhibit having any default reduction */ 
 343   for (i 
= 0; i 
< ntokens
; i
++) 
 348   redp 
= state_table
[state
]->reductions
; 
 356           /* loop over all the rules available here which require 
 358           m 
= state_table
[state
]->lookaheads
; 
 359           n 
= state_table
[state 
+ 1]->lookaheads
; 
 361           for (i 
= n 
- 1; i 
>= m
; i
--) 
 362             /* and find each token which the rule finds acceptable 
 364             for (j 
= 0; j 
< ntokens
; j
++) 
 365               /* and record this rule as the rule to use if that 
 367               if (BITISSET (LA (i
), j
)) 
 368                 actrow
[j
] = -LAruleno
[i
]; 
 372   /* Now see which tokens are allowed for shifts in this state.  For 
 373      them, record the shift as the thing to do.  So shift is preferred 
 375   shiftp 
= state_table
[state
]->shifts
; 
 376   for (i 
= 0; i 
< shiftp
->nshifts
; i
++) 
 378       shift_state 
= shiftp
->shifts
[i
]; 
 382       symbol 
= state_table
[shift_state
]->accessing_symbol
; 
 387       actrow
[symbol
] = shift_state
; 
 389       /* Do not use any default reduction if there is a shift for 
 391       if (symbol 
== error_token_number
) 
 395   /* See which tokens are an explicit error in this state (due to 
 396      %nonassoc).  For them, record MINSHORT as the action.  */ 
 397   errp 
= state_table
[state
]->errs
; 
 403       for (i 
= 0; i 
< k
; i
++) 
 405           symbol 
= errp
->errs
[i
]; 
 406           actrow
[symbol
] = MINSHORT
; 
 410   /* Now find the most common reduction and make it the default action 
 413   if (nreds 
>= 1 && !nodefault
) 
 415       if (state_table
[state
]->consistent
) 
 416         default_rule 
= redp
->rules
[0]; 
 420           for (i 
= m
; i 
< n
; i
++) 
 425               for (j 
= 0; j 
< ntokens
; j
++) 
 427                   if (actrow
[j
] == rule
) 
 438           /* actions which match the default are replaced with zero, 
 439              which means "use the default" */ 
 443               for (j 
= 0; j 
< ntokens
; j
++) 
 445                   if (actrow
[j
] == default_rule
) 
 449               default_rule 
= -default_rule
; 
 454   /* If have no default rule, the default is an error. 
 455      So replace any action which says "error" with "use default".  */ 
 457   if (default_rule 
== 0) 
 458     for (j 
= 0; j 
< ntokens
; j
++) 
 460         if (actrow
[j
] == MINSHORT
) 
 478   for (i 
= 0; i 
< ntokens
; i
++) 
 487   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 488   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 490   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 (i
); 
 525   output_table_data (&output_obstack
, yydefact
, 
 526                      yydefact
[0], 1, nstates
); 
 527   muscle_insert ("defact", obstack_finish (&output_obstack
)); 
 534 /*-----------------------------. 
 535 | Output the actions to OOUT.  | 
 536 `-----------------------------*/ 
 539 actions_output (FILE *out
, size_t *line
) 
 542   for (rule 
= 1; rule 
< nrules 
+ 1; ++rule
) 
 543     if (rule_table
[rule
].action
) 
 545         fprintf (out
, "  case %d:\n", rule
); 
 548           fprintf (out
, muscle_find ("linef"), 
 549                    rule_table
[rule
].action_line
, 
 550                    quotearg_style (c_quoting_style
, 
 551                                    muscle_find ("filename"))); 
 552         /* As a Bison extension, add the ending semicolon.  Since some 
 553            Yacc don't do that, help people using bison as a Yacc 
 554            finding their missing semicolons.  */ 
 555         fprintf (out
, "{ %s%s }\n    break;\n\n", 
 556                  rule_table
[rule
].action
, 
 557                  yacc_flag 
? ";" : ""); 
 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 (rule_table
[rule
].action
); 
 571 save_column (int symbol
, int default_state
) 
 580   short begin 
= goto_map
[symbol
]; 
 581   short end 
= goto_map
[symbol 
+ 1]; 
 584   for (i 
= begin
; i 
< end
; i
++) 
 586       if (to_state
[i
] != default_state
) 
 593   symno 
= symbol 
- ntokens 
+ nstates
; 
 595   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 596   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 598   for (i 
= begin
; i 
< end
; i
++) 
 600       if (to_state
[i
] != default_state
) 
 602           *sp1
++ = from_state
[i
]; 
 603           *sp2
++ = to_state
[i
]; 
 607   tally
[symno
] = count
; 
 608   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 612 default_goto (int symbol
) 
 620   m 
= goto_map
[symbol
]; 
 621   n 
= goto_map
[symbol 
+ 1]; 
 626   for (i 
= 0; i 
< nstates
; i
++) 
 629   for (i 
= m
; i 
< n
; i
++) 
 630     state_count
[to_state
[i
]]++; 
 635   for (i 
= 0; i 
< nstates
; i
++) 
 637       if (state_count
[i
] > max
) 
 639           max 
= state_count
[i
]; 
 644   return default_state
; 
 648 /*-------------------------------------------------------------------. 
 649 | Figure out what to do after reducing with each rule, depending on  | 
 650 | the saved state from before the beginning of parsing the data that | 
 651 | matched this rule.                                                 | 
 653 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 654 | putting into YYTABLE later.                                        | 
 655 `-------------------------------------------------------------------*/ 
 661   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 663   state_count 
= XCALLOC (short, nstates
); 
 664   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 666       int default_state 
= default_goto (i
); 
 667       save_column (i
, default_state
); 
 668       yydefgoto
[i 
- ntokens
] = default_state
; 
 671   output_table_data (&output_obstack
, yydefgoto
, 
 672                      yydefgoto
[0], 1, nsyms 
- ntokens
); 
 673   muscle_insert ("defgoto", obstack_finish (&output_obstack
)); 
 680 /* The next few functions decide how to pack the actions and gotos 
 681    information into yytable. */ 
 692   order 
= XCALLOC (short, nvectors
); 
 695   for (i 
= 0; i 
< nvectors
; i
++) 
 703           while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 706           while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 709           for (k 
= nentries 
- 1; k 
> j
; k
--) 
 710             order
[k 
+ 1] = order
[k
]; 
 720 matching_state (int vector
) 
 737   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 740       if (width
[j
] != w 
|| tally
[j
] != t
) 
 744       for (k 
= 0; match 
&& k 
< t
; k
++) 
 746           if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 759 pack_vector (int vector
) 
 778   for (j 
= lowzero 
- from
[0]; j 
< MAXTABLE
; j
++) 
 782       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 786             fatal (_("maximum table size (%d) exceeded"), MAXTABLE
); 
 792       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 800           for (k 
= 0; k 
< t
; k
++) 
 804               check
[loc
] = from
[k
]; 
 807           while (table
[lowzero
] != 0) 
 817   assert (!"pack_vector"); 
 829   base 
= XCALLOC (short, nvectors
); 
 830   pos 
= XCALLOC (short, nentries
); 
 831   table 
= XCALLOC (short, MAXTABLE
); 
 832   check 
= XCALLOC (short, MAXTABLE
); 
 837   for (i 
= 0; i 
< nvectors
; i
++) 
 840   for (i 
= 0; i 
< MAXTABLE
; i
++) 
 843   for (i 
= 0; i 
< nentries
; i
++) 
 845       state 
= matching_state (i
); 
 848         place 
= pack_vector (i
); 
 853       base
[order
[i
]] = place
; 
 856   for (i 
= 0; i 
< nvectors
; i
++) 
 869 /* the following functions output yytable, yycheck 
 870    and the vectors whose elements index the portion starts */ 
 876   output_table_data (&output_obstack
, base
, 
 877                      base
[0], 1, nstates
); 
 878   muscle_insert ("pact", obstack_finish (&output_obstack
)); 
 881   output_table_data (&output_obstack
, base
, 
 882                      base
[nstates
], nstates 
+ 1, nvectors
); 
 883   muscle_insert ("pgoto", obstack_finish (&output_obstack
)); 
 892   output_table_data (&output_obstack
, table
, 
 893                      table
[0], 1, high 
+ 1); 
 894   muscle_insert ("table", obstack_finish (&output_obstack
)); 
 902   output_table_data (&output_obstack
, check
, 
 903                      check
[0], 1, high 
+ 1); 
 904   muscle_insert ("check", obstack_finish (&output_obstack
)); 
 908 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable 
 912 output_actions (void) 
 915   nvectors 
= nstates 
+ nvars
; 
 917   froms 
= XCALLOC (short *, nvectors
); 
 918   tos 
= XCALLOC (short *, nvectors
); 
 919   tally 
= XCALLOC (short, nvectors
); 
 920   width 
= XCALLOC (short, nvectors
); 
 927   XFREE (goto_map 
+ ntokens
); 
 939   for (i 
= 0; i 
< nstates
; ++i
) 
 941       XFREE (state_table
[i
]->shifts
); 
 942       XFREE (state_table
[i
]->reductions
); 
 943       XFREE (state_table
[i
]->errs
); 
 944       free (state_table
[i
]); 
 950 /*------------------------------------------------------------. 
 951 | Copy the parser code from SKEL_FILENAME into OOUT obstack.  | 
 952 | and do the muscle substitution.                             | 
 953 `------------------------------------------------------------*/ 
 956 output_parser (const char *skel_filename
, FILE *out
) 
 962   fskel 
= xfopen (skel_filename
, "r"); 
 964   /* New output code.  */ 
 976       else if ((c 
= getc (fskel
)) == '%') 
 978           /* Read the muscle.  */ 
 979           const char *muscle_key 
= 0; 
 980           const char *muscle_value 
= 0; 
 982           while (isalnum (c 
= getc (fskel
)) || c 
== '-') 
 983             obstack_1grow (&muscle_obstack
, c
); 
 984           obstack_1grow (&muscle_obstack
, 0); 
 986           /* Output the right value, or see if it's something special.  */ 
 987           muscle_key 
= obstack_finish (&muscle_obstack
); 
 988           muscle_value 
= muscle_find (muscle_key
); 
 989           if (!strcmp (muscle_key
, "actions")) 
 990             actions_output (out
, &line
); 
 991           else if (!strcmp (muscle_key
, "line")) 
 992             fprintf (out
, "%d", line
); 
 993           else if (muscle_value
) 
 995               fputs (muscle_value
, out
); 
 996               line 
+= get_lines_number (muscle_value
); 
1001               fputs (muscle_key
, out
); 
1012 /*----------------------------------------. 
1013 | Prepare the master parser to be output  | 
1014 `----------------------------------------*/ 
1017 output_master_parser (void) 
1019   FILE *parser 
= xfopen (parser_file_name
, "w"); 
1022       if (semantic_parser
) 
1023         skeleton 
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
); 
1025         skeleton 
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
); 
1027   muscle_insert ("skeleton", skeleton
); 
1028   muscle_insert ("parser-file-name", parser_file_name
); 
1030   output_parser (skeleton
, parser
); 
1037 #define MUSCLE_INSERT_INT(Key, Value)                           \ 
1039   obstack_fgrow1 (&muscle_obstack, "%d", Value);                \ 
1040   obstack_1grow (&muscle_obstack, 0);                           \ 
1041   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1044 #define MUSCLE_INSERT_STRING(Key, Value)                        \ 
1046   obstack_sgrow (&muscle_obstack, Value);                       \ 
1047   obstack_1grow (&muscle_obstack, 0);                           \ 
1048   muscle_insert (Key, obstack_finish (&muscle_obstack));        \ 
1051 #define MUSCLE_INSERT_PREFIX(Key, Value)                                \ 
1053   obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value);    \ 
1054   obstack_1grow (&muscle_obstack, 0);                                   \ 
1055   muscle_insert (Key, obstack_finish (&muscle_obstack));                \ 
1061   MUSCLE_INSERT_INT ("last", high
); 
1062   MUSCLE_INSERT_INT ("flag", MINSHORT
); 
1063   MUSCLE_INSERT_INT ("pure", pure_parser
); 
1064   MUSCLE_INSERT_INT ("nsym", nsyms
); 
1065   MUSCLE_INSERT_INT ("debug", debug_flag
); 
1066   MUSCLE_INSERT_INT ("final", final_state
); 
1067   MUSCLE_INSERT_INT ("maxtok", max_user_token_number
); 
1068   MUSCLE_INSERT_INT ("ntbase", ntokens
); 
1069   MUSCLE_INSERT_INT ("error-verbose", error_verbose
); 
1070   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
); 
1072   MUSCLE_INSERT_INT ("nnts", nvars
); 
1073   MUSCLE_INSERT_INT ("nrules", nrules
); 
1074   MUSCLE_INSERT_INT ("nstates", nstates
); 
1075   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1077   MUSCLE_INSERT_INT ("locations-flag", locations_flag
); 
1081 /*-------------------------. 
1082 | Output the header file.  | 
1083 `-------------------------*/ 
1086 header_output (void) 
1088   FILE *out 
= xfopen (spec_defines_file
, "w"); 
1089   char *macro_name 
= compute_header_macro (); 
1091   fprintf (out
, "#ifndef %s\n", macro_name
); 
1092   fprintf (out
, "# define %s\n\n", macro_name
); 
1094   fputs (muscle_find ("tokendef"), out
); 
1099 # define YYSTYPE yystype\n\ 
1101                     muscle_find ("stype")); 
1104     fprintf (out
, "\nextern YYSTYPE %slval;\n", 
1106   if (semantic_parser
) 
1110       for (i 
= ntokens
; i 
< nsyms
; i
++) 
1111         /* don't make these for dummy nonterminals made by gensym.  */ 
1112         if (*tags
[i
] != '@') 
1113           fprintf (out
, "# define\tNT%s\t%d\n", tags
[i
], i
); 
1116   fprintf (out
, "\n#endif /* not %s */\n", macro_name
); 
1122 /*----------------------------------------------------------. 
1123 | Output the parsing tables and the parser code to ftable.  | 
1124 `----------------------------------------------------------*/ 
1129   obstack_init (&output_obstack
); 
1131   output_token_translations (); 
1135   if (semantic_parser
) 
1137   output_rule_data (); 
1138   XFREE (user_toknums
); 
1142   /* Copy definitions in directive.  */ 
1143   obstack_1grow (&attrs_obstack
, 0); 
1144   muscle_insert ("prologue", obstack_finish (&attrs_obstack
)); 
1146   /* Output the parser. */ 
1147   output_master_parser (); 
1148   /* Output the header if needed. */ 
1152   free (rule_table 
+ 1); 
1153   obstack_free (&muscle_obstack
, 0); 
1154   obstack_free (&output_obstack
, 0); 
1155   obstack_free (&action_obstack
, 0);