]>
git.saurik.com Git - bison.git/blob - src/output.c
adef04336fdf8812b71d4772c74b9e5c474f8d93
   1 /* Output the generated parsing program for bison, 
   2    Copyright 1984, 1986, 1989, 1992, 2000 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 ?? 
 101 #include "complain.h" 
 105 #include "conflicts.h" 
 107 extern void berror 
PARAMS((const char *)); 
 113 static short **froms
; 
 117 static short *actrow
; 
 118 static short *state_count
; 
 130 output_short_or_char_table (struct obstack 
*oout
, 
 133                             const char *table_name
, 
 136                             short begin
, short end
) 
 141     obstack_fgrow1 (oout
, "/* %s. */\n", comment
); 
 143   obstack_fgrow3 (oout
, "static const %s %s[] =\n{\n  %6d", 
 144                   type
, table_name
, first_value
); 
 147   for (i 
= begin
; i 
< end
; i
++) 
 149       obstack_1grow (oout
, ','); 
 153           obstack_grow_literal_string (oout
, "\n  "); 
 161       obstack_fgrow1 (oout
, "%6d", short_table
[i
]); 
 164   obstack_grow_literal_string (oout
, "\n};\n"); 
 169 output_short_table (struct obstack 
*oout
, 
 171                     const char *table_name
, 
 174                     short begin
, short end
) 
 176   output_short_or_char_table (oout
, comment
, "short", table_name
, short_table
, 
 177                               first_value
, begin
, end
); 
 181 /*--------------------------------------------------------------. 
 182 | output_headers -- Output constant strings to the beginning of | 
 184 `--------------------------------------------------------------*/ 
 186 /* Don't put the `%s' insides quotes, since it quotearg puts them. */ 
 191 extern int yyerror;\n\ 
 192 extern int yycost;\n\ 
 193 extern char * yymsg;\n\ 
 194 extern YYSTYPE yyval;\n\ 
 196 yyguard(n, yyvsp, yylsp)\n\ 
 198 register YYSTYPE *yyvsp;\n\ 
 199 register YYLTYPE *yylsp;\n\ 
 210 extern YYSTYPE yyval;\n\ 
 211 extern int yychar;\n\ 
 213 yyaction(n, yyvsp, yylsp)\n\ 
 215 register YYSTYPE *yyvsp;\n\ 
 216 register YYLTYPE *yylsp;\n\ 
 221 #define ACTSTR_SIMPLE   "\n  switch (yyn) {\n" 
 224 output_headers (void) 
 226   char *attrsfile_quoted 
= quotearg_style (c_quoting_style
, attrsfile
); 
 229     fprintf (fguard
, GUARDSTR
, attrsfile_quoted
); 
 235     obstack_fgrow1 (&action_obstack
, ACTSTR
, attrsfile_quoted
); 
 237     obstack_grow_literal_string (&action_obstack
, ACTSTR_SIMPLE
); 
 239 /*  if (semantic_parser)        JF moved this below 
 240     fprintf(ftable, "#include \"%s\"\n", attrsfile); 
 241   fprintf(ftable, "#include <stdio.h>\n\n"); 
 244   /* Rename certain symbols if -p was specified.  */ 
 245   if (spec_name_prefix
) 
 247       obstack_fgrow1 (&table_obstack
, 
 248                       "#define yyparse %sparse\n", spec_name_prefix
); 
 249       obstack_fgrow1 (&table_obstack
, 
 250                       "#define yylex %slex\n", spec_name_prefix
); 
 251       obstack_fgrow1 (&table_obstack
, 
 252                       "#define yyerror %serror\n", spec_name_prefix
); 
 253       obstack_fgrow1 (&table_obstack
, 
 254                       "#define yylval %slval\n", spec_name_prefix
); 
 255       obstack_fgrow1 (&table_obstack
, 
 256                       "#define yychar %schar\n", spec_name_prefix
); 
 257       obstack_fgrow1 (&table_obstack
, 
 258                       "#define yydebug %sdebug\n", spec_name_prefix
); 
 259       obstack_fgrow1 (&table_obstack
, 
 260                       "#define yynerrs %snerrs\n", spec_name_prefix
); 
 265 /*-------------------------------------------------------. 
 266 | Output constant strings to the ends of certain files.  | 
 267 `-------------------------------------------------------*/ 
 270 output_trailers (void) 
 273     fprintf (fguard
, "\n    }\n}\n"); 
 275   obstack_1grow (&action_obstack
, '\n'); 
 281     obstack_grow_literal_string (&action_obstack
, "    }\n"); 
 283   obstack_grow_literal_string (&action_obstack
, "}\n"); 
 289 output_token_translations (void) 
 291   obstack_grow_literal_string (&table_obstack
, "\ 
 293 /* YYRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n"); 
 297       obstack_fgrow2 (&table_obstack
, 
 298       "#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\ 
 301                max_user_token_number
, nsyms
); 
 303       output_short_or_char_table (&table_obstack
, 
 304              "YYRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX", 
 305                     ntokens 
< 127 ? "char" : "short", 
 306                     "yytranslate", token_translations
, 
 307                     0, 1, max_user_token_number 
+ 1); 
 311       obstack_grow_literal_string (&table_obstack
, 
 312                                    "\n#define YYTRANSLATE(x) (x)\n"); 
 320   /* With the ordinary parser, 
 321      yyprhs and yyrhs are needed only for yydebug. */ 
 322   /* With the no_parser option, all tables are generated */ 
 323   if (!semantic_parser 
&& !no_parser_flag
) 
 324     obstack_grow_literal_string (&table_obstack
, "\n#if YYDEBUG != 0\n"); 
 326   output_short_table (&table_obstack
, NULL
, "yyprhs", rrhs
, 
 330     size_t yyrhs_size 
= 1; 
 334     for (sp 
= ritem 
+ 1; *sp
; sp
++) 
 336     yyrhs 
= XMALLOC (short, yyrhs_size
); 
 338     for (sp 
= ritem 
+ 1, i 
= 1; *sp
; ++sp
, ++i
) 
 339       yyrhs
[i
] = *sp 
> 0 ? *sp 
: 0; 
 341     output_short_table (&table_obstack
, NULL
, "yyrhs", yyrhs
, 
 342                         ritem
[0], 1, yyrhs_size
); 
 346   if (!semantic_parser 
&& !no_parser_flag
) 
 347     obstack_grow_literal_string (&table_obstack
, "\n#endif\n"); 
 354   output_short_table (&table_obstack
, NULL
, "yystos", accessing_symbol
, 
 360 output_rule_data (void) 
 364   short *short_tab 
= NULL
; 
 366   obstack_grow_literal_string (&table_obstack
, "\n\ 
 367 #if YYDEBUG != 0\n"); 
 369   output_short_table (&table_obstack
, 
 370            "YYRLINE[YYN] -- source line where rule number YYN was defined", 
 374   obstack_grow_literal_string (&table_obstack
, "#endif\n\n"); 
 376   if (token_table_flag 
|| no_parser_flag
) 
 378       obstack_fgrow1 (&table_obstack
, "#define YYNTOKENS %d\n", ntokens
); 
 379       obstack_fgrow1 (&table_obstack
, "#define YYNNTS %d\n", nvars
); 
 380       obstack_fgrow1 (&table_obstack
, "#define YYNRULES %d\n", nrules
); 
 381       obstack_fgrow1 (&table_obstack
, "#define YYNSTATES %d\n", nstates
); 
 382       obstack_fgrow1 (&table_obstack
, "#define YYMAXUTOK %d\n\n", 
 383                       max_user_token_number
); 
 386   /* Output the table of symbol names.  */ 
 387   if (!token_table_flag 
&& !no_parser_flag
) 
 388     obstack_grow_literal_string (&table_obstack
, 
 389                           "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n"); 
 390   obstack_grow_literal_string (&table_obstack
, "\ 
 391 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n"); 
 392   obstack_grow_literal_string (&table_obstack
, 
 393            "static const char *const yytname[] =\n{\n  "); 
 396   for (i 
= 0; i 
< nsyms
; i
++) 
 397     /* this used to be i<=nsyms, but that output a final "" symbol 
 398        almost by accident */ 
 400       /* Width of the next token, including the two quotes, the coma 
 405       for (p 
= tags
[i
]; p 
&& *p
; p
++) 
 406         if (*p 
== '"' || *p 
== '\\' || *p 
== '\n' || *p 
== '\t' 
 409         else if (*p 
< 040 || *p 
>= 0177) 
 414       if (j 
+ strsize 
> 75) 
 416           obstack_grow_literal_string (&table_obstack
, "\n  "); 
 420       obstack_1grow (&table_obstack
, '\"'); 
 421       for (p 
= tags
[i
]; p 
&& *p
; p
++) 
 423           if (*p 
== '"' || *p 
== '\\') 
 425               obstack_fgrow1 (&table_obstack
, "\\%c", *p
); 
 429               obstack_grow_literal_string (&table_obstack
, "\\n"); 
 433               obstack_grow_literal_string (&table_obstack
, "\\t"); 
 437               obstack_grow_literal_string (&table_obstack
, "\\b"); 
 439           else if (*p 
< 040 || *p 
>= 0177) 
 441               obstack_fgrow1 (&table_obstack
, "\\%03o", *p
); 
 445               obstack_1grow (&table_obstack
, *p
); 
 449       obstack_grow_literal_string (&table_obstack
, "\", "); 
 452   /* add a NULL entry to list of tokens */ 
 453   obstack_grow_literal_string (&table_obstack
, "NULL\n};\n"); 
 455   if (!token_table_flag 
&& !no_parser_flag
) 
 456     obstack_grow_literal_string (&table_obstack
, "#endif\n\n"); 
 458   /* Output YYTOKNUM. */ 
 459   if (token_table_flag
) 
 461       output_short_table (&table_obstack
, 
 462                   "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX", 
 463                           "yytoknum", user_toknums
, 
 468   output_short_table (&table_obstack
, 
 469               "YYR1[YYN] -- Symbol number of symbol that rule YYN derives", 
 474   obstack_1grow (&table_obstack
, '\n'); 
 477   short_tab 
= XMALLOC (short, nrules 
+ 1); 
 478   for (i 
= 1; i 
< nrules
; i
++) 
 479     short_tab
[i
] = rrhs
[i 
+ 1] - rrhs
[i
] - 1; 
 480   short_tab
[nrules
] = nitems 
- rrhs
[nrules
] - 1; 
 481   output_short_table (&table_obstack
, 
 482         "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN", 
 485   obstack_1grow (&table_obstack
, '\n'); 
 494 output_defines (void) 
 496   obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
); 
 497   obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
); 
 498   obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
); 
 502 /*------------------------------------------------------------------. 
 503 | Decide what to do for each type of token if seen as the lookahead | 
 504 | token in specified state.  The value returned is used as the      | 
 505 | default action (yydefact) for the state.  In addition, actrow is  | 
 506 | filled with what to do for each kind of token, index by symbol    | 
 507 | number, with zero meaning do the default action.  The value       | 
 508 | MINSHORT, a very negative number, means this situation is an      | 
 509 | error.  The parser recognizes this value specially.               | 
 511 | This is where conflicts are resolved.  The loop over lookahead    | 
 512 | rules considered lower-numbered rules last, and the last rule     | 
 513 | considered that likes a token gets to handle it.                  | 
 514 `------------------------------------------------------------------*/ 
 517 action_row (int state
) 
 536   int nodefault 
= 0;            /* set nonzero to inhibit having any default reduction */ 
 538   for (i 
= 0; i 
< ntokens
; i
++) 
 543   redp 
= reduction_table
[state
]; 
 551           /* loop over all the rules available here which require 
 553           m 
= lookaheads
[state
]; 
 554           n 
= lookaheads
[state 
+ 1]; 
 556           for (i 
= n 
- 1; i 
>= m
; i
--) 
 559               wordp 
= LA 
+ i 
* tokensetsize
; 
 562               /* and find each token which the rule finds acceptable 
 564               for (j 
= 0; j 
< ntokens
; j
++) 
 566                   /* and record this rule as the rule to use if that 
 582   shiftp 
= shift_table
[state
]; 
 584   /* Now see which tokens are allowed for shifts in this state.  For 
 585      them, record the shift as the thing to do.  So shift is preferred 
 592       for (i 
= 0; i 
< k
; i
++) 
 594           shift_state 
= shiftp
->shifts
[i
]; 
 598           symbol 
= accessing_symbol
[shift_state
]; 
 603           actrow
[symbol
] = shift_state
; 
 605           /* Do not use any default reduction if there is a shift for 
 607           if (symbol 
== error_token_number
) 
 612   errp 
= err_table
[state
]; 
 614   /* See which tokens are an explicit error in this state (due to 
 615      %nonassoc).  For them, record MINSHORT as the action.  */ 
 621       for (i 
= 0; i 
< k
; i
++) 
 623           symbol 
= errp
->errs
[i
]; 
 624           actrow
[symbol
] = MINSHORT
; 
 628   /* Now find the most common reduction and make it the default action 
 631   if (nreds 
>= 1 && !nodefault
) 
 633       if (consistent
[state
]) 
 634         default_rule 
= redp
->rules
[0]; 
 638           for (i 
= m
; i 
< n
; i
++) 
 643               for (j 
= 0; j 
< ntokens
; j
++) 
 645                   if (actrow
[j
] == rule
) 
 656           /* actions which match the default are replaced with zero, 
 657              which means "use the default" */ 
 661               for (j 
= 0; j 
< ntokens
; j
++) 
 663                   if (actrow
[j
] == default_rule
) 
 667               default_rule 
= -default_rule
; 
 672   /* If have no default rule, the default is an error. 
 673      So replace any action which says "error" with "use default".  */ 
 675   if (default_rule 
== 0) 
 676     for (j 
= 0; j 
< ntokens
; j
++) 
 678         if (actrow
[j
] == MINSHORT
) 
 696   for (i 
= 0; i 
< ntokens
; i
++) 
 705   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 706   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 708   for (i 
= 0; i 
< ntokens
; i
++) 
 717   tally
[state
] = count
; 
 718   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 722 /*------------------------------------------------------------------. 
 723 | Figure out the actions for the specified state, indexed by        | 
 724 | lookahead token type.                                             | 
 726 | The YYDEFACT table is output now.  The detailed info is saved for | 
 727 | putting into YYTABLE later.                                       | 
 728 `------------------------------------------------------------------*/ 
 734   short *yydefact 
= XCALLOC (short, nstates
); 
 736   actrow 
= XCALLOC (short, ntokens
); 
 737   for (i 
= 0; i 
< nstates
; ++i
) 
 739       yydefact
[i
] = action_row (i
); 
 744   output_short_table (&table_obstack
, 
 745   "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\ 
 746    doesn't specify something else to do.  Zero means the default is an\n\ 
 748                       "yydefact", yydefact
, 
 749                       yydefact
[0], 1, nstates
); 
 750   obstack_1grow (&table_obstack
, '\n'); 
 758   shifts 
*sp
, *sptmp
;   /* JF derefrenced freed ptr */ 
 762   for (sp 
= first_shift
; sp
; sp 
= sptmp
) 
 771 free_reductions (void) 
 773   reductions 
*rp
, *rptmp
;       /* JF fixed freed ptr */ 
 775   XFREE (reduction_table
); 
 777   for (rp 
= first_reduction
; rp
; rp 
= rptmp
) 
 787 save_column (int symbol
, int default_state
) 
 796   short begin 
= goto_map
[symbol
]; 
 797   short end 
= goto_map
[symbol 
+ 1]; 
 800   for (i 
= begin
; i 
< end
; i
++) 
 802       if (to_state
[i
] != default_state
) 
 809   symno 
= symbol 
- ntokens 
+ nstates
; 
 811   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 812   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 814   for (i 
= begin
; i 
< end
; i
++) 
 816       if (to_state
[i
] != default_state
) 
 818           *sp1
++ = from_state
[i
]; 
 819           *sp2
++ = to_state
[i
]; 
 823   tally
[symno
] = count
; 
 824   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 828 default_goto (int symbol
) 
 836   m 
= goto_map
[symbol
]; 
 837   n 
= goto_map
[symbol 
+ 1]; 
 842   for (i 
= 0; i 
< nstates
; i
++) 
 845   for (i 
= m
; i 
< n
; i
++) 
 846     state_count
[to_state
[i
]]++; 
 851   for (i 
= 0; i 
< nstates
; i
++) 
 853       if (state_count
[i
] > max
) 
 855           max 
= state_count
[i
]; 
 860   return default_state
; 
 864 /*-------------------------------------------------------------------. 
 865 | Figure out what to do after reducing with each rule, depending on  | 
 866 | the saved state from before the beginning of parsing the data that | 
 867 | matched this rule.                                                 | 
 869 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 870 | putting into YYTABLE later.                                        | 
 871 `-------------------------------------------------------------------*/ 
 878   short *yydefgoto 
= XMALLOC (short, nsyms 
- ntokens
); 
 879   state_count 
= XCALLOC (short, nstates
); 
 881   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 883       int default_state 
= default_goto (i
); 
 884       save_column (i
, default_state
); 
 885       yydefgoto
[i 
- ntokens
] = default_state
; 
 888   output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
, 
 889                       yydefgoto
[0], 1, nsyms 
- ntokens
); 
 896 /* The next few functions decide how to pack the actions and gotos 
 897    information into yytable. */ 
 908   order 
= XCALLOC (short, nvectors
); 
 911   for (i 
= 0; i 
< nvectors
; i
++) 
 919           while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 922           while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 925           for (k 
= nentries 
- 1; k 
> j
; k
--) 
 926             order
[k 
+ 1] = order
[k
]; 
 936 matching_state (int vector
) 
 953   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 956       if (width
[j
] != w 
|| tally
[j
] != t
) 
 960       for (k 
= 0; match 
&& k 
< t
; k
++) 
 962           if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 975 pack_vector (int vector
) 
 994   for (j 
= lowzero 
- from
[0]; j 
< MAXTABLE
; j
++) 
 998       for (k 
= 0; ok 
&& k 
< t
; k
++) 
1002             fatal (_("maximum table size (%d) exceeded"), MAXTABLE
); 
1004           if (table
[loc
] != 0) 
1008       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
1016           for (k 
= 0; k 
< t
; k
++) 
1020               check
[loc
] = from
[k
]; 
1023           while (table
[lowzero
] != 0) 
1033   berror ("pack_vector"); 
1034   return 0;                     /* JF keep lint happy */ 
1045   base 
= XCALLOC (short, nvectors
); 
1046   pos 
= XCALLOC (short, nentries
); 
1047   table 
= XCALLOC (short, MAXTABLE
); 
1048   check 
= XCALLOC (short, MAXTABLE
); 
1053   for (i 
= 0; i 
< nvectors
; i
++) 
1056   for (i 
= 0; i 
< MAXTABLE
; i
++) 
1059   for (i 
= 0; i 
< nentries
; i
++) 
1061       state 
= matching_state (i
); 
1064         place 
= pack_vector (i
); 
1066         place 
= base
[state
]; 
1069       base
[order
[i
]] = place
; 
1072   for (i 
= 0; i 
< nvectors
; i
++) 
1085 /* the following functions output yytable, yycheck 
1086    and the vectors whose elements index the portion starts */ 
1091   output_short_table (&table_obstack
, NULL
, "yypact", base
, 
1092                       base
[0], 1, nstates
); 
1094   obstack_1grow (&table_obstack
, '\n'); 
1096   output_short_table (&table_obstack
, NULL
, "yypgoto", base
, 
1097                       base
[nstates
], nstates 
+ 1, nvectors
); 
1106   obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
); 
1107   output_short_table (&table_obstack
, NULL
, "yytable", table
, 
1108                       table
[0], 1, high 
+ 1); 
1116   output_short_table (&table_obstack
, NULL
, "yycheck", check
, 
1117                       check
[0], 1, high 
+ 1); 
1121 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable 
1125 output_actions (void) 
1127   nvectors 
= nstates 
+ nvars
; 
1129   froms 
= XCALLOC (short *, nvectors
); 
1130   tos 
= XCALLOC (short *, nvectors
); 
1131   tally 
= XCALLOC (short, nvectors
); 
1132   width 
= XCALLOC (short, nvectors
); 
1140   XFREE (accessing_symbol
); 
1143   XFREE (goto_map 
+ ntokens
); 
1149   obstack_1grow (&table_obstack
, '\n'); 
1152   obstack_1grow (&table_obstack
, '\n'); 
1156 /*------------------------------------------. 
1157 | Copy the parser code into TABLE_OBSTACK.  | 
1158 `------------------------------------------*/ 
1161 output_parser (void) 
1166   const char *skeleton 
= NULL
; 
1167   int number_of_dollar_signs 
= 0; 
1170     obstack_grow_literal_string (&table_obstack
, "#define YYPURE 1\n\n"); 
1172   /* Loop over lines in the standard parser file.  */ 
1173   if (semantic_parser
) 
1174     skeleton 
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
); 
1176     skeleton 
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
); 
1177   fskel 
= xfopen (skeleton
, "r"); 
1179   /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a 
1180      decimal integer constant.  This specifies that the line number of 
1181      the *following* line of input, in its original source file, was 
1187       int is_sync_line 
= 0; 
1192       /* See if the line starts with `#line'. */ 
1194         if ((c 
= getc (fskel
)) == 'l') 
1195           if ((c 
= getc (fskel
)) == 'i') 
1196             if ((c 
= getc (fskel
)) == 'n') 
1197               if ((c 
= getc (fskel
)) == 'e') 
1200                 obstack_grow_literal_string (&table_obstack
, "#lin"); 
1202               obstack_grow_literal_string (&table_obstack
, "#li"); 
1204             obstack_grow_literal_string (&table_obstack
, "#l"); 
1206           obstack_grow_literal_string (&table_obstack
, "#"); 
1208       /* If was a `#line' line, either compute it, or drop it. */ 
1209       if (is_sync_line 
&& !no_lines_flag
) 
1210         obstack_fgrow2 (&table_obstack
, "#line %d %s\n", 
1211                         line
, quotearg_style (c_quoting_style
, skeleton
)); 
1216       /* now write out the line... */ 
1217       for (; c 
!= '\n' && c 
!= EOF
; c 
= getc (fskel
)) 
1220             /* `$' in the parser file indicates where to put the 
1221                actions.  Copy them in at this point.  */ 
1224                 size_t size 
= obstack_object_size (&action_obstack
); 
1226                 number_of_dollar_signs
++; 
1227                 assert (number_of_dollar_signs 
== 1); 
1228                 obstack_grow (&table_obstack
, 
1229                               obstack_finish (&action_obstack
), 
1232                 /* Skip the end of the line containing `$'. */ 
1236               obstack_1grow (&table_obstack
, c
); 
1240       obstack_1grow (&table_obstack
, c
); 
1243   assert (number_of_dollar_signs 
== 1); 
1248 output_program (void) 
1253     obstack_fgrow2 (&table_obstack
, "#line %d %s\n", 
1254                     lineno
, quotearg_style (c_quoting_style
, infile
)); 
1256   while ((c 
= getc (finput
)) != EOF
) 
1257     obstack_1grow (&table_obstack
, c
); 
1262 free_itemsets (void) 
1266   XFREE (state_table
); 
1268   for (cp 
= first_state
; cp
; cp 
= cptmp
) 
1276 /*----------------------------------------------------------. 
1277 | Output the parsing tables and the parser code to ftable.  | 
1278 `----------------------------------------------------------*/ 
1283   /* output_token_defines(ftable);      / * JF put out token defines FIRST */ 
1285   /* If using a simple parser the definition of YYSTYPE are put into 
1287   if (!semantic_parser
) 
1289       size_t size 
= obstack_object_size (&attrs_obstack
); 
1290       obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
); 
1292   reader_output_yylsp (&table_obstack
); 
1294     obstack_grow_literal_string (&table_obstack
, "\ 
1296 # define YYDEBUG 1\n\ 
1300   if (semantic_parser
) 
1301     obstack_fgrow1 (&table_obstack
, "#include %s\n", 
1302                     quotearg_style (c_quoting_style
, attrsfile
)); 
1304   if (!no_parser_flag
) 
1305     obstack_grow_literal_string (&table_obstack
, "#include <stdio.h>\n\n"); 
1307   /* Make "const" do nothing if not in ANSI C.  */ 
1308   obstack_grow_literal_string (&table_obstack
, "\ 
1309 #ifndef __cplusplus\n\ 
1310 # ifndef __STDC__\n\ 
1318   output_token_translations (); 
1319 /*   if (semantic_parser) */ 
1320   /* This is now unconditional because debugging printouts can use it.  */ 
1323   if (semantic_parser
) 
1325   output_rule_data (); 
1327   if (!no_parser_flag
)