1 /* Output the generated parsing program for bison, 
   2    Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002 
   3    Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify it 
   8    under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, but 
  13    WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
  15    General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to the Free 
  19    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  23 /* The parser tables consist of these tables.  Marked ones needed only 
  24    for the semantic parser.  Double marked are output only if switches 
  27    YYTRANSLATE = vector mapping yylex's token numbers into bison's 
  30    ++ YYTNAME = vector of string-names indexed by bison token number. 
  32    ++ YYTOKNUM = vector of yylex token numbers corresponding to 
  35    YYRLINE = vector of line-numbers of all rules.  For yydebug 
  38    YYRHS = vector of items of all rules.  This is exactly what RITEMS 
  39    contains.  For yydebug and for semantic parser. 
  41    YYPRHS[R] = index in YYRHS of first item for rule R. 
  43    YYR1[R] = symbol number of symbol that rule R derives. 
  45    YYR2[R] = number of symbols composing right hand side of rule R. 
  47    + YYSTOS[S] = the symbol number of the symbol that leads to state 
  50    YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE 
  51    doesn't specify something else to do.  Zero means the default is an 
  54    YYDEFGOTO[I] = default state to go to after a reduction of a rule 
  55    that generates variable NTOKENS + I, except when YYTABLE specifies 
  58    YYPACT[S] = index in YYTABLE of the portion describing state S. 
  59    The lookahead token's type is used to index that portion to find 
  62    If the value in YYTABLE is positive, we shift the token and go to 
  65    If the value is negative, it is minus a rule number to reduce by. 
  67    If the value is zero, the default action from YYDEFACT[S] is used. 
  69    YYPGOTO[I] = the index in YYTABLE of the portion describing what to 
  70    do after reducing a rule that derives variable I + NTOKENS.  This 
  71    portion is indexed by the parser state number, S, as of before the 
  72    text for this nonterminal was read.  The value from YYTABLE is the 
  73    state to go to if the corresponding value in YYCHECK is S. 
  75    YYTABLE = a vector filled with portions for different uses, found 
  76    via YYPACT and YYPGOTO. 
  78    YYCHECK = a vector indexed in parallel with YYTABLE.  It indicates, 
  79    in a roundabout way, the bounds of the portion you are trying to 
  82    Suppose that the portion of yytable starts at index P and the index 
  83    to be examined within the portion is I.  Then if YYCHECK[P+I] != I, 
  84    I is outside the bounds of what is actually allocated, and the 
  85    default (from YYDEFACT or YYDEFGOTO) should be used.  Otherwise, 
  86    YYTABLE[P+I] should be used. 
  88    YYFINAL = the state number of the termination state.  YYFLAG = most 
  89    negative short int.  Used to flag ??  */ 
 104 #include "conflicts.h" 
 105 #include "muscle_tab.h" 
 107 /* From lib/readpipe.h.  */ 
 108 FILE *readpipe 
PARAMS ((const char *, ...)); 
 110 /* From src/scan-skel.l. */ 
 111 int skel_lex 
PARAMS ((void)); 
 112 extern FILE *skel_in
; 
 116 static short **froms 
= NULL
; 
 117 static short **tos 
= NULL
; 
 118 static unsigned int **conflict_tos 
= NULL
; 
 119 static short *tally 
= NULL
; 
 120 static short *width 
= NULL
; 
 121 static short *actrow 
= NULL
; 
 122 static short *conflrow 
= NULL
; 
 123 static short *state_count 
= NULL
; 
 124 static short *order 
= NULL
; 
 125 static short *base 
= NULL
; 
 126 static short *pos 
= NULL
; 
 128 static unsigned int *conflict_table 
= NULL
; 
 129 static unsigned int *conflict_list 
= NULL
; 
 130 static int conflict_list_cnt
; 
 131 static int conflict_list_free
; 
 133 /* TABLE_SIZE is the allocated size of both TABLE and CHECK. 
 134    We start with the original hard-coded value: SHRT_MAX 
 135    (yes, not USHRT_MAX). */ 
 136 static size_t table_size 
= SHRT_MAX
; 
 137 static short *table 
= NULL
; 
 138 static short *check 
= NULL
; 
 142 static struct obstack format_obstack
; 
 144 int error_verbose 
= 0; 
 147 /*----------------------------------------------------------------. 
 148 | If TABLE (and CHECK) appear to be small to be addressed at      | 
 149 | DESIRED, grow them.  Note that TABLE[DESIRED] is to be used, so | 
 150 | the desired size is at least DESIRED + 1.                       | 
 151 `----------------------------------------------------------------*/ 
 154 table_grow (size_t desired
) 
 156   size_t old_size 
= table_size
; 
 158   while (table_size 
<= desired
) 
 162     fprintf (stderr
, "growing table and check from: %d to %d\n", 
 163              old_size
, table_size
); 
 165   table 
= XREALLOC (table
, short, table_size
); 
 166   check 
= XREALLOC (check
, short, table_size
); 
 168     conflict_table 
= XREALLOC (conflict_table
, unsigned int, table_size
); 
 170   for (/* Nothing. */; old_size 
< table_size
; ++old_size
) 
 173       check
[old_size
] = -1; 
 178 /*-------------------------------------------------------------------. 
 179 | Create a function NAME which associates to the muscle NAME the     | 
 180 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of | 
 181 | TYPE), and to the muscle NAME_max, the max value of the            | 
 183 `-------------------------------------------------------------------*/ 
 186 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type)                        \ 
 189 Name (const char *name,                                                 \ 
 199   obstack_fgrow1 (&format_obstack, "%6d", first);                       \ 
 200   for (i = begin; i < end; ++i)                                         \ 
 202       obstack_1grow (&format_obstack, ',');                             \ 
 205           obstack_sgrow (&format_obstack, "\n  ");                      \ 
 210       obstack_fgrow1 (&format_obstack, "%6d", table_data[i]);           \ 
 211       if (table_data[i] > max)                                          \ 
 212         max = table_data[i];                                            \ 
 214   obstack_1grow (&format_obstack, 0);                                   \ 
 215   muscle_insert (name, obstack_finish (&format_obstack));               \ 
 217   /* Build `NAME_max' in the obstack. */                                \ 
 218   obstack_fgrow1 (&format_obstack, "%s_max", name);                     \ 
 219   obstack_1grow (&format_obstack, 0);                                   \ 
 220   MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack),             \ 
 224 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int) 
 225 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table
, short) 
 226 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number_t
) 
 227 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number_t
) 
 228 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table
, state_number_t
) 
 231 /*-----------------------------------------------------------------. 
 232 | Prepare the muscles related to the tokens: translate, tname, and | 
 234 `-----------------------------------------------------------------*/ 
 237 prepare_tokens (void) 
 239   muscle_insert_symbol_number_table ("translate", 
 241                                     0, 1, max_user_token_number 
+ 1); 
 246     for (i 
= 0; i 
< nsyms
; i
++) 
 248         /* Be sure not to use twice the same QUOTEARG slot: 
 249            SYMBOL_TAG_GET uses slot 0.  */ 
 251           quotearg_n_style (1, c_quoting_style
, 
 252                             symbol_tag_get (symbols
[i
])); 
 253         /* Width of the next token, including the two quotes, the coma 
 255         int strsize 
= strlen (cp
) + 2; 
 257         if (j 
+ strsize 
> 75) 
 259             obstack_sgrow (&format_obstack
, "\n  "); 
 263         obstack_sgrow (&format_obstack
, cp
); 
 264         obstack_sgrow (&format_obstack
, ", "); 
 267     /* Add a NULL entry to list of tokens (well, 0, as NULL might not be 
 269     obstack_sgrow (&format_obstack
, "0"); 
 271     /* Finish table and store. */ 
 272     obstack_1grow (&format_obstack
, 0); 
 273     muscle_insert ("tname", obstack_finish (&format_obstack
)); 
 276     /* Output YYTOKNUM. */ 
 279     short *values 
= XCALLOC (short, ntokens 
+ 1); 
 280     for (i 
= 0; i 
< ntokens 
+ 1; ++i
) 
 281       values
[i
] = symbols
[i
]->user_token_number
; 
 282     muscle_insert_short_table ("toknum", values
, 
 289 /*-------------------------------------------------------------. 
 290 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, | 
 291 | rline, dprec, merger                                         | 
 292 `-------------------------------------------------------------*/ 
 299   item_number_t 
*rhs 
= XMALLOC (item_number_t
, nritems
); 
 300   unsigned int *prhs 
= XMALLOC (unsigned int, nrules 
+ 1); 
 301   unsigned int *rline 
= XMALLOC (unsigned int, nrules 
+ 1); 
 302   symbol_number_t 
*r1 
= XMALLOC (symbol_number_t
, nrules 
+ 1); 
 303   unsigned int *r2 
= XMALLOC (unsigned int, nrules 
+ 1); 
 304   short *dprec 
= XMALLOC (short, nrules 
+ 1); 
 305   short *merger 
= XMALLOC (short, nrules 
+ 1); 
 307   for (r 
= 1; r 
< nrules 
+ 1; ++r
) 
 309       item_number_t 
*rhsp 
= NULL
; 
 310       /* Index of rule R in RHS. */ 
 312       /* RHS of the rule R. */ 
 313       for (rhsp 
= rules
[r
].rhs
; *rhsp 
>= 0; ++rhsp
) 
 315       /* LHS of the rule R. */ 
 316       r1
[r
] = rules
[r
].lhs
->number
; 
 317       /* Length of rule R's RHS. */ 
 319       /* Separator in RHS. */ 
 321       /* Line where rule was defined. */ 
 322       rline
[r
] = rules
[r
].location
.first_line
; 
 323       /* Dynamic precedence (GLR) */ 
 324       dprec
[r
] = rules
[r
].dprec
; 
 325       /* Merger-function index (GLR) */ 
 326       merger
[r
] = rules
[r
].merger
; 
 328   assert (i 
== nritems
); 
 330   muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
); 
 331   muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 1, nrules 
+ 1); 
 332   muscle_insert_unsigned_int_table ("rline", rline
, 0, 1, nrules 
+ 1); 
 333   muscle_insert_symbol_number_table ("r1", r1
, 0, 1, nrules 
+ 1); 
 334   muscle_insert_unsigned_int_table ("r2", r2
, 0, 1, nrules 
+ 1); 
 335   muscle_insert_short_table ("dprec", dprec
, 0, 1, nrules 
+ 1); 
 336   muscle_insert_short_table ("merger", merger
, 0, 1, nrules 
+ 1); 
 347 /*--------------------------------------------. 
 348 | Prepare the muscles related to the states.  | 
 349 `--------------------------------------------*/ 
 352 prepare_states (void) 
 355   symbol_number_t 
*values 
= 
 356     (symbol_number_t 
*) alloca (sizeof (symbol_number_t
) * nstates
); 
 357   for (i 
= 0; i 
< nstates
; ++i
) 
 358     values
[i
] = states
[i
]->accessing_symbol
; 
 359   muscle_insert_symbol_number_table ("stos", values
, 
 364 /*-------------------------------------------------------------------. 
 365 | For GLR parsers, for each conflicted token in STATE, as indicated  | 
 366 | by non-zero entries in conflrow, create a list of possible         | 
 367 | reductions that are alternatives to the shift or reduction         | 
 368 | currently recorded for that token in STATE.  Store the alternative | 
 369 | reductions followed by a 0 in conflict_list, updating              | 
 370 | conflict_list_cnt, and storing an index to the start of the list   | 
 371 | back into conflrow.                                                | 
 372 `-------------------------------------------------------------------*/ 
 375 conflict_row (state_t 
*state
) 
 382   for (j 
= 0; j 
< ntokens
; j 
+= 1) 
 385         conflrow
[j
] = conflict_list_cnt
; 
 387         /* find all reductions for token j, and record all that do 
 388          * not match actrow[j] */ 
 389         for (i 
= 0; i 
< state
->nlookaheads
; i 
+= 1) 
 390           if (bitset_test (state
->lookaheads
[i
], j
) 
 391               && actrow
[j
] != -state
->lookaheads_rule
[i
]->number
) 
 393               assert (conflict_list_free 
> 0); 
 394               conflict_list
[conflict_list_cnt
] 
 395                 = state
->lookaheads_rule
[i
]->number
; 
 396               conflict_list_cnt 
+= 1; 
 397               conflict_list_free 
-= 1; 
 400         /* Leave a 0 at the end */ 
 401         assert (conflict_list_free 
> 0); 
 402         conflict_list_cnt 
+= 1; 
 403         conflict_list_free 
-= 1; 
 408 /*------------------------------------------------------------------. 
 409 | Decide what to do for each type of token if seen as the lookahead | 
 410 | token in specified state.  The value returned is used as the      | 
 411 | default action (yydefact) for the state.  In addition, actrow is  | 
 412 | filled with what to do for each kind of token, index by symbol    | 
 413 | number, with zero meaning do the default action.  The value       | 
 414 | SHRT_MIN, a very negative number, means this situation is an      | 
 415 | error.  The parser recognizes this value specially.               | 
 417 | This is where conflicts are resolved.  The loop over lookahead    | 
 418 | rules considered lower-numbered rules last, and the last rule     | 
 419 | considered that likes a token gets to handle it.                  | 
 421 | For GLR parsers, also sets conflrow[SYM] to an index into         | 
 422 | conflict_list iff there is an unresolved conflict (s/r or r/r)    | 
 423 | with symbol SYM. The default reduction is not used for a symbol   | 
 424 | that has any such conflicts.                                      | 
 425 `------------------------------------------------------------------*/ 
 428 action_row (state_t 
*state
) 
 431   rule_number_t default_rule 
= 0; 
 432   reductions_t 
*redp 
= state
->reductions
; 
 433   transitions_t 
*transitions 
= state
->shifts
; 
 434   errs_t 
*errp 
= state
->errs
; 
 435   /* set nonzero to inhibit having any default reduction */ 
 439   for (i 
= 0; i 
< ntokens
; i
++) 
 440     actrow
[i
] = conflrow
[i
] = 0; 
 445       /* loop over all the rules available here which require 
 447       for (i 
= state
->nlookaheads 
- 1; i 
>= 0; --i
) 
 448         /* and find each token which the rule finds acceptable 
 450         BITSET_EXECUTE (state
->lookaheads
[i
], 0, j
, 
 452           /* and record this rule as the rule to use if that 
 455             conflicted 
= conflrow
[j
] = 1; 
 456           actrow
[j
] = -state
->lookaheads_rule
[i
]->number
; 
 460   /* Now see which tokens are allowed for shifts in this state.  For 
 461      them, record the shift as the thing to do.  So shift is preferred 
 463   for (i 
= 0; i 
< transitions
->num 
&& TRANSITION_IS_SHIFT (transitions
, i
); i
++) 
 464     if (!TRANSITION_IS_DISABLED (transitions
, i
)) 
 466         symbol_number_t symbol 
= TRANSITION_SYMBOL (transitions
, i
); 
 467         state_number_t shift_state 
= transitions
->states
[i
]; 
 469         if (actrow
[symbol
] != 0) 
 470           conflicted 
= conflrow
[symbol
] = 1; 
 471         actrow
[symbol
] = state_number_as_int (shift_state
); 
 473         /* Do not use any default reduction if there is a shift for 
 475         if (symbol 
== errtoken
->number
) 
 479   /* See which tokens are an explicit error in this state (due to 
 480      %nonassoc).  For them, record SHRT_MIN as the action.  */ 
 481   for (i 
= 0; i 
< errp
->num
; i
++) 
 483       symbol_number_t symbol 
= errp
->symbols
[i
]; 
 484       actrow
[symbol
] = SHRT_MIN
; 
 487   /* Now find the most common reduction and make it the default action 
 490   if (redp
->num 
>= 1 && !nodefault
) 
 492       if (state
->consistent
) 
 493         default_rule 
= redp
->rules
[0]; 
 497           for (i 
= 0; i 
< state
->nlookaheads
; i
++) 
 500               rule_number_t rule 
= state
->lookaheads_rule
[i
]->number
; 
 503               for (j 
= 0; j 
< ntokens
; j
++) 
 504                 if (actrow
[j
] == -rule
) 
 514           /* GLR parsers need space for conflict lists, so we can't 
 515              default conflicted entries.  For non-conflicted entries 
 516              or as long as we are not building a GLR parser, 
 517              actions that match the default are replaced with zero, 
 518              which means "use the default". */ 
 523               for (j 
= 0; j 
< ntokens
; j
++) 
 524                 if (actrow
[j
] == -default_rule
 
 525                     && ! (glr_parser 
&& conflrow
[j
])) 
 531   /* If have no default rule, the default is an error. 
 532      So replace any action which says "error" with "use default".  */ 
 534   if (default_rule 
== 0) 
 535     for (i 
= 0; i 
< ntokens
; i
++) 
 536       if (actrow
[i
] == SHRT_MIN
) 
 540     conflict_row (state
); 
 547 save_row (state_number_t state
) 
 554   unsigned int *sp3 
= NULL
; 
 557   for (i 
= 0; i 
< ntokens
; i
++) 
 564   froms
[state
] = sp1 
= sp 
= XCALLOC (short, count
); 
 565   tos
[state
] = sp2 
= XCALLOC (short, count
); 
 567     conflict_tos
[state
] = sp3 
= XCALLOC (unsigned int, count
); 
 569     conflict_tos
[state
] = NULL
; 
 571   for (i 
= 0; i 
< ntokens
; i
++) 
 577           *sp3
++ = conflrow
[i
]; 
 580   tally
[state
] = count
; 
 581   width
[state
] = sp1
[-1] - sp
[0] + 1; 
 585 /*------------------------------------------------------------------. 
 586 | Figure out the actions for the specified state, indexed by        | 
 587 | lookahead token type.                                             | 
 589 | The YYDEFACT table is output now.  The detailed info is saved for | 
 590 | putting into YYTABLE later.                                       | 
 591 `------------------------------------------------------------------*/ 
 597   int nconflict 
= conflicts_total_count (); 
 599   short *yydefact 
= XCALLOC (short, nstates
); 
 601   actrow 
= XCALLOC (short, ntokens
); 
 603   conflrow 
= XCALLOC (short, ntokens
); 
 606       conflict_list 
= XCALLOC (unsigned int, 1 + 2 * nconflict
); 
 607       conflict_list_free 
= 2 * nconflict
; 
 608       conflict_list_cnt 
= 1; 
 611     conflict_list_free 
= conflict_list_cnt 
= 0; 
 613   for (i 
= 0; i 
< nstates
; ++i
) 
 615       yydefact
[i
] = action_row (states
[i
]); 
 619   muscle_insert_short_table ("defact", yydefact
, 
 620                              yydefact
[0], 1, nstates
); 
 627 /*-----------------------------. 
 628 | Output the actions to OOUT.  | 
 629 `-----------------------------*/ 
 632 actions_output (FILE *out
) 
 636   fputs ("m4_define([b4_actions], \n[[", out
); 
 637   for (r 
= 1; r 
< nrules 
+ 1; ++r
) 
 640         fprintf (out
, "  case %d:\n", r
); 
 643           fprintf (out
, muscle_find ("linef"), 
 644                    rules
[r
].action_location
.first_line
, 
 645                    quotearg_style (c_quoting_style
, 
 646                                    muscle_find ("filename"))); 
 647         fprintf (out
, "    %s\n    break;\n\n", 
 650   fputs ("]])\n\n", out
); 
 653 /*--------------------------------------. 
 654 | Output the merge functions to OUT.   | 
 655 `--------------------------------------*/ 
 658 merger_output (FILE *out
) 
 663   fputs ("m4_define([b4_mergers], \n[[", out
); 
 664   for (n 
= 1, p 
= merge_functions
; p 
!= NULL
; n 
+= 1, p 
= p
->next
) 
 666       if (p
->type
[0] == '\0') 
 667         fprintf (out
, "  case %d: yyval = %s (*yy0, *yy1); break;\n", 
 670         fprintf (out
, "  case %d: yyval.%s = %s (*yy0, *yy1); break;\n", 
 671                  n
, p
->type
, p
->name
); 
 673   fputs ("]])\n\n", out
); 
 676 /*---------------------------------------. 
 677 | Output the tokens definition to OOUT.  | 
 678 `---------------------------------------*/ 
 681 token_definitions_output (FILE *out
) 
 686   fputs ("m4_define([b4_tokens], \n[", out
); 
 687   for (i 
= 0; i 
< ntokens
; ++i
) 
 689       symbol_t 
*symbol 
= symbols
[i
]; 
 690       int number 
= symbol
->user_token_number
; 
 692       /* At this stage, if there are literal aliases, they are part of 
 693          SYMBOLS, so we should not find symbols which are the aliases 
 695       assert (number 
!= USER_NUMBER_ALIAS
); 
 697       /* Skip error token.  */ 
 698       if (symbol 
== errtoken
) 
 701       /* If this string has an alias, then it is necessarily the alias 
 702          which is to be output.  */ 
 704         symbol 
= symbol
->alias
; 
 706       /* Don't output literal chars or strings (when defined only as a 
 707          string).  Note that must be done after the alias resolution: 
 708          think about `%token 'f' "f"'.  */ 
 709       if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"') 
 712       /* Don't #define nonliteral tokens whose names contain periods 
 713          or '$' (as does the default value of the EOF token).  */ 
 714       if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$')) 
 717       fprintf (out
, "%s[[[%s]], [%d]]", 
 718                first 
? "" : ",\n", symbol
->tag
, number
); 
 722   fputs ("])\n\n", out
); 
 726 /*----------------------------------------. 
 727 | Output the symbol destructors to OOUT.  | 
 728 `----------------------------------------*/ 
 731 symbol_destructors_output (FILE *out
) 
 736   fputs ("m4_define([b4_symbol_destructors], \n[", out
); 
 737   for (i 
= 0; i 
< nsyms
; ++i
) 
 738     if (symbols
[i
]->destructor
) 
 740         symbol_t 
*symbol 
= symbols
[i
]; 
 743            Symbol-name, Symbol-number, 
 744            destructor, typename. */ 
 745         fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]", 
 747                  infile
, symbol
->destructor_location
.first_line
, 
 748                  symbol_tag_get (symbol
), 
 755   fputs ("])\n\n", out
); 
 759 /*-------------------------------------. 
 760 | Output the symbol printers to OOUT.  | 
 761 `-------------------------------------*/ 
 764 symbol_printers_output (FILE *out
) 
 769   fputs ("m4_define([b4_symbol_printers], \n[", out
); 
 770   for (i 
= 0; i 
< nsyms
; ++i
) 
 771     if (symbols
[i
]->destructor
) 
 773         symbol_t 
*symbol 
= symbols
[i
]; 
 776            Symbol-name, Symbol-number, 
 777            destructor, typename. */ 
 778         fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]", 
 780                  infile
, symbol
->printer_location
.first_line
, 
 781                  symbol_tag_get (symbol
), 
 788   fputs ("])\n\n", out
); 
 793 save_column (symbol_number_t symbol
, state_number_t default_state
) 
 800   int symno 
= symbol 
- ntokens 
+ state_number_as_int (nstates
); 
 802   int begin 
= goto_map
[symbol
]; 
 803   int end 
= goto_map
[symbol 
+ 1]; 
 806   for (i 
= begin
; i 
< end
; i
++) 
 807     if (to_state
[i
] != default_state
) 
 813   froms
[symno
] = sp1 
= sp 
= XCALLOC (short, count
); 
 814   tos
[symno
] = sp2 
= XCALLOC (short, count
); 
 816   for (i 
= begin
; i 
< end
; i
++) 
 817     if (to_state
[i
] != default_state
) 
 819         *sp1
++ = from_state
[i
]; 
 820         *sp2
++ = to_state
[i
]; 
 823   tally
[symno
] = count
; 
 824   width
[symno
] = sp1
[-1] - sp
[0] + 1; 
 828 static state_number_t
 
 829 default_goto (symbol_number_t symbol
) 
 833   int m 
= goto_map
[symbol
]; 
 834   int n 
= goto_map
[symbol 
+ 1]; 
 835   state_number_t default_state 
= (state_number_t
) -1; 
 839     return (state_number_t
) -1; 
 841   for (s 
= 0; s 
< nstates
; s
++) 
 844   for (i 
= m
; i 
< n
; i
++) 
 845     state_count
[to_state
[i
]]++; 
 847   for (s 
= 0; s 
< nstates
; s
++) 
 848     if (state_count
[s
] > max
) 
 850         max 
= state_count
[s
]; 
 854   return default_state
; 
 858 /*-------------------------------------------------------------------. 
 859 | Figure out what to do after reducing with each rule, depending on  | 
 860 | the saved state from before the beginning of parsing the data that | 
 861 | matched this rule.                                                 | 
 863 | The YYDEFGOTO table is output now.  The detailed info is saved for | 
 864 | putting into YYTABLE later.                                        | 
 865 `-------------------------------------------------------------------*/ 
 871   state_number_t 
*yydefgoto 
= XMALLOC (state_number_t
, nsyms 
- ntokens
); 
 873   state_count 
= XCALLOC (short, nstates
); 
 874   for (i 
= ntokens
; i 
< nsyms
; ++i
) 
 876       state_number_t default_state 
= default_goto (i
); 
 877       save_column (i
, default_state
); 
 878       yydefgoto
[i 
- ntokens
] = default_state
; 
 881   muscle_insert_state_number_table ("defgoto", yydefgoto
, 
 882                                     yydefgoto
[0], 1, nsyms 
- ntokens
); 
 888 /* The next few functions decide how to pack the actions and gotos 
 889    information into yytable. */ 
 896   order 
= XCALLOC (short, nvectors
); 
 899   for (i 
= 0; i 
< nvectors
; i
++) 
 905         int j 
= nentries 
- 1; 
 907         while (j 
>= 0 && (width
[order
[j
]] < w
)) 
 910         while (j 
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
)) 
 913         for (k 
= nentries 
- 1; k 
> j
; k
--) 
 914           order
[k 
+ 1] = order
[k
]; 
 923 matching_state (int vector
) 
 925   int i 
= order
[vector
]; 
 930   if (i 
>= (int) nstates
) 
 936   for (prev 
= vector 
- 1; prev 
>= 0; prev
--) 
 942       if (width
[j
] != w 
|| tally
[j
] != t
) 
 945       for (k 
= 0; match 
&& k 
< t
; k
++) 
 946         if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
]) 
 958 pack_vector (int vector
) 
 960   int i 
= order
[vector
]; 
 964   short *from 
= froms
[i
]; 
 966   unsigned int *conflict_to 
= conflict_tos
[i
]; 
 970   for (j 
= lowzero 
- from
[0]; j 
< (int) table_size
; j
++) 
 975       for (k 
= 0; ok 
&& k 
< t
; k
++) 
 977           loc 
= j 
+ state_number_as_int (from
[k
]); 
 978           if (loc 
> (int) table_size
) 
 985       for (k 
= 0; ok 
&& k 
< vector
; k
++) 
 991           for (k 
= 0; k 
< t
; k
++) 
 993               loc 
= j 
+ state_number_as_int (from
[k
]); 
 994               table
[loc
] = state_number_as_int (to
[k
]); 
 995               if (glr_parser 
&& conflict_to 
!= NULL
) 
 996                 conflict_table
[loc
] = conflict_to
[k
]; 
 997               check
[loc
] = state_number_as_int (from
[k
]); 
1000           while (table
[lowzero
] != 0) 
1009 #define pack_vector_succeeded 0 
1010   assert (pack_vector_succeeded
); 
1022   base 
= XCALLOC (short, nvectors
); 
1023   pos 
= XCALLOC (short, nentries
); 
1024   table 
= XCALLOC (short, table_size
); 
1026     conflict_table 
= XCALLOC (unsigned int, table_size
); 
1027   check 
= XCALLOC (short, table_size
); 
1032   for (i 
= 0; i 
< nvectors
; i
++) 
1035   for (i 
= 0; i 
< (int) table_size
; i
++) 
1038   for (i 
= 0; i 
< nentries
; i
++) 
1040       state 
= matching_state (i
); 
1043         place 
= pack_vector (i
); 
1045         place 
= base
[state
]; 
1048       base
[order
[i
]] = place
; 
1051   for (i 
= 0; i 
< nvectors
; i
++) 
1055       XFREE (conflict_tos
[i
]); 
1060   XFREE (conflict_tos
); 
1064 /* the following functions output yytable, yycheck, yyconflp, yyconfl, 
1065    and the vectors whose elements index the portion starts */ 
1071   muscle_insert_short_table ("pact", base
, 
1072                              base
[0], 1, nstates
); 
1075   muscle_insert_short_table ("pgoto", base
, 
1076                              base
[nstates
], nstates 
+ 1, nvectors
); 
1084   muscle_insert_short_table ("table", table
, 
1085                              table
[0], 1, high 
+ 1); 
1091 output_conflicts (void) 
1093   /* GLR parsing slightly modifies yytable and yycheck 
1094      (and thus yypact) so that in states with unresolved conflicts, 
1095      the default reduction is not used in the conflicted entries, so 
1096      that there is a place to put a conflict pointer.  This means that 
1097      yyconflp and yyconfl are nonsense for a non-GLR parser, so we 
1098      avoid accidents by not writing them out in that case. */ 
1102   muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
, 
1103                                     conflict_table
[0], 1, high
+1); 
1104   muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
, 
1105                              conflict_list
[0], 1, conflict_list_cnt
); 
1107   XFREE (conflict_table
); 
1108   XFREE (conflict_list
); 
1115   muscle_insert_short_table ("check", check
, 
1116                              check
[0], 1, high 
+ 1); 
1120 /*-----------------------------------------------------------------. 
1121 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable | 
1123 `-----------------------------------------------------------------*/ 
1126 output_actions (void) 
1128   /* That's a poor way to make sure the sizes are properly corelated, 
1129      in particular the signedness is not taking into account, but it's 
1131   assert (sizeof (nvectors
) >= sizeof (nstates
)); 
1132   assert (sizeof (nvectors
) >= sizeof (nvars
)); 
1134   nvectors 
= state_number_as_int (nstates
) + nvars
; 
1136   froms 
= XCALLOC (short *, nvectors
); 
1137   tos 
= XCALLOC (short *, nvectors
); 
1138   conflict_tos 
= XCALLOC (unsigned int *, nvectors
); 
1139   tally 
= XCALLOC (short, nvectors
); 
1140   width 
= XCALLOC (short, nvectors
); 
1147   XFREE (goto_map 
+ ntokens
); 
1156   output_conflicts (); 
1162 /*----------------------. 
1163 | Run our backend, M4.  | 
1164 `----------------------*/ 
1167 m4_invoke (const char *definitions
) 
1169   /* Invoke m4 on the definition of the muscles, and the skeleton. */ 
1170   const char *bison_pkgdatadir 
= getenv ("BISON_PKGDATADIR"); 
1171   const char *m4 
= getenv ("M4"); 
1173   char *full_skeleton
; 
1177   if (!bison_pkgdatadir
) 
1178     bison_pkgdatadir 
= PKGDATADIR
; 
1179   pkg_data_len 
= strlen (bison_pkgdatadir
); 
1180   full_skeleton 
= XMALLOC (char, pkg_data_len 
+ strlen (skeleton
) + 2); 
1181   if (bison_pkgdatadir
[pkg_data_len
-1] == '/') 
1182     sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
); 
1184     sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
); 
1187              "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n", 
1188              m4
, bison_pkgdatadir
, definitions
, full_skeleton
); 
1189   skel_in 
= readpipe (m4
, 
1190                       "-I", bison_pkgdatadir
, 
1191                       "m4sugar/m4sugar.m4", 
1195   XFREE (full_skeleton
); 
1197     error (EXIT_FAILURE
, errno
, "cannot run m4"); 
1202 /*---------------------------. 
1203 | Call the skeleton parser.  | 
1204 `---------------------------*/ 
1207 output_skeleton (void) 
1209   /* Store the definition of all the muscles. */ 
1210   const char *tempdir 
= getenv ("TMPDIR"); 
1211   char *tempfile 
= NULL
; 
1215   if (tempdir 
== NULL
) 
1216     tempdir 
= DEFAULT_TMPDIR
; 
1217   tempfile 
= xmalloc (strlen (tempdir
) + 11); 
1218   sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
); 
1219   fd 
= mkstemp (tempfile
); 
1221     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
1223   out 
= fdopen (fd
, "w"); 
1225     error (EXIT_FAILURE
, errno
, "%s", tempfile
); 
1227   /* There are no comments, especially not `#': we do want M4 expansion 
1228      after `#': think of CPP macros!  */ 
1229   fputs ("m4_changecom()\n", out
); 
1230   fputs ("m4_init()\n", out
); 
1232   actions_output (out
); 
1233   merger_output (out
); 
1234   token_definitions_output (out
); 
1235   symbol_destructors_output (out
); 
1236   symbol_printers_output (out
); 
1238   muscles_m4_output (out
); 
1240   fputs ("m4_wrap([m4_divert_pop(0)])\n", out
); 
1241   fputs ("m4_divert_push(0)dnl\n", out
); 
1244   m4_invoke (tempfile
); 
1246   /* If `debugging', keep this file alive. */ 
1256   MUSCLE_INSERT_INT ("last", high
); 
1257   MUSCLE_INSERT_INT ("flag", SHRT_MIN
); 
1258   MUSCLE_INSERT_INT ("pure", pure_parser
); 
1259   MUSCLE_INSERT_INT ("nsym", nsyms
); 
1260   MUSCLE_INSERT_INT ("debug", debug_flag
); 
1261   MUSCLE_INSERT_INT ("final", final_state
->number
); 
1262   MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
); 
1263   MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
); 
1264   MUSCLE_INSERT_INT ("error_verbose", error_verbose
); 
1265   MUSCLE_INSERT_STRING ("prefix", spec_name_prefix 
? spec_name_prefix 
: "yy"); 
1267   /* FIXME: This is wrong: the muscles should decide whether they hold 
1268      a copy or not, but the situation is too obscure currently.  */ 
1269   MUSCLE_INSERT_STRING ("output_infix", output_infix 
? output_infix 
: ""); 
1270   MUSCLE_INSERT_STRING ("output_prefix", short_base_name
); 
1271   MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
); 
1272   MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
); 
1274   MUSCLE_INSERT_INT ("nnts", nvars
); 
1275   MUSCLE_INSERT_INT ("nrules", nrules
); 
1276   MUSCLE_INSERT_INT ("nstates", nstates
); 
1277   MUSCLE_INSERT_INT ("ntokens", ntokens
); 
1279   MUSCLE_INSERT_INT ("locations_flag", locations_flag
); 
1280   MUSCLE_INSERT_INT ("defines_flag", defines_flag
); 
1282   /* Copy definitions in directive.  */ 
1283   obstack_1grow (&pre_prologue_obstack
, 0); 
1284   obstack_1grow (&post_prologue_obstack
, 0); 
1285   muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
)); 
1286   muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
)); 
1288   /* Find the right skeleton file.  */ 
1294         skeleton 
= "yacc.c"; 
1297   /* Parse the skeleton file and output the needed parsers.  */ 
1298   muscle_insert ("skeleton", skeleton
); 
1302 /*----------------------------------------------------------. 
1303 | Output the parsing tables and the parser code to ftable.  | 
1304 `----------------------------------------------------------*/ 
1309   obstack_init (&format_obstack
); 
1318   /* Process the selected skeleton file.  */ 
1321   obstack_free (&format_obstack
, NULL
); 
1322   obstack_free (&pre_prologue_obstack
, NULL
); 
1323   obstack_free (&post_prologue_obstack
, NULL
);