1 /* Symbol table manager for Bison. 
   3    Copyright (C) 1984, 1989, 2000-2002, 2004-2012 Free Software 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    This program is free software: you can redistribute it and/or modify 
   9    it under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation, either version 3 of the License, or 
  11    (at your option) any later version. 
  13    This program is distributed in the hope that it will be useful, 
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  16    GNU General Public License for more details. 
  18    You should have received a copy of the GNU General Public License 
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  30 /*-------------------------------------------------------------------. 
  31 | Symbols sorted by tag.  Allocated by the first invocation of       | 
  32 | symbols_do, after which no more symbols should be created.         | 
  33 `-------------------------------------------------------------------*/ 
  35 static symbol 
**symbols_sorted 
= NULL
; 
  36 static symbol 
**semantic_types_sorted 
= NULL
; 
  38 /*------------------------. 
  39 | Distinguished symbols.  | 
  40 `------------------------*/ 
  42 symbol 
*errtoken 
= NULL
; 
  43 symbol 
*undeftoken 
= NULL
; 
  44 symbol 
*endtoken 
= NULL
; 
  45 symbol 
*accept 
= NULL
; 
  46 symbol 
*startsymbol 
= NULL
; 
  47 location startsymbol_location
; 
  50 /*---------------------------------. 
  51 | Create a new symbol, named TAG.  | 
  52 `---------------------------------*/ 
  55 symbol_new (uniqstr tag
, location loc
) 
  57   symbol 
*res 
= xmalloc (sizeof *res
); 
  60   /* If the tag is not a string (starts with a double quote), check 
  61      that it is valid for Yacc. */ 
  62   if (tag
[0] != '\"' && tag
[0] != '\'' && strchr (tag
, '-')) 
  63     complain (&loc
, Wyacc
, 
  64               _("POSIX Yacc forbids dashes in symbol names: %s"), tag
); 
  69   res
->type_name 
= NULL
; 
  72     for (i 
= 0; i 
< CODE_PROPS_SIZE
; ++i
) 
  73       code_props_none_init (&res
->props
[i
]); 
  76   res
->number 
= NUMBER_UNDEFINED
; 
  78   res
->assoc 
= undef_assoc
; 
  79   res
->user_token_number 
= USER_NUMBER_UNDEFINED
; 
  82   res
->class = unknown_sym
; 
  83   res
->status 
= undeclared
; 
  85   if (nsyms 
== SYMBOL_NUMBER_MAXIMUM
) 
  86     complain (NULL
, fatal
, _("too many symbols in input grammar (limit is %d)"), 
  87               SYMBOL_NUMBER_MAXIMUM
); 
  93 code_props_type_string (code_props_type kind
) 
 105 /*----------------------------------------. 
 106 | Create a new semantic type, named TAG.  | 
 107 `----------------------------------------*/ 
 109 static semantic_type 
* 
 110 semantic_type_new (uniqstr tag
, const location 
*loc
) 
 112   semantic_type 
*res 
= xmalloc (sizeof *res
); 
 114   uniqstr_assert (tag
); 
 116   res
->location 
= loc 
? *loc 
: empty_location
; 
 117   res
->status 
= undeclared
; 
 120     for (i 
= 0; i 
< CODE_PROPS_SIZE
; ++i
) 
 121       code_props_none_init (&res
->props
[i
]); 
 132 #define SYMBOL_ATTR_PRINT(Attr)                         \ 
 134     fprintf (f, " %s { %s }", #Attr, s->Attr) 
 136 #define SYMBOL_CODE_PRINT(Attr)                                         \ 
 137   if (s->props[Attr].code)                                              \ 
 138     fprintf (f, " %s { %s }", #Attr, s->props[Attr].code) 
 141 symbol_print (symbol 
const *s
, FILE *f
) 
 145       fprintf (f
, "\"%s\"", s
->tag
); 
 146       SYMBOL_ATTR_PRINT (type_name
); 
 147       SYMBOL_CODE_PRINT (destructor
); 
 148       SYMBOL_CODE_PRINT (printer
); 
 151     fprintf (f
, "<NULL>"); 
 154 #undef SYMBOL_ATTR_PRINT 
 155 #undef SYMBOL_CODE_PRINT 
 158 /*----------------------------------. 
 159 | Whether S is a valid identifier.  | 
 160 `----------------------------------*/ 
 163 is_identifier (uniqstr s
) 
 165   static char const alphanum
[26 + 26 + 1 + 10] = 
 166     "abcdefghijklmnopqrstuvwxyz" 
 167     "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
 170   if (!s 
|| ! memchr (alphanum
, *s
, sizeof alphanum 
- 10)) 
 173     if (! memchr (alphanum
, *s
, sizeof alphanum
)) 
 179 /*-----------------------------------------------. 
 180 | Get the identifier associated to this symbol.  | 
 181 `-----------------------------------------------*/ 
 183 symbol_id_get (symbol 
const *sym
) 
 185   aver (sym
->user_token_number 
!= USER_NUMBER_HAS_STRING_ALIAS
); 
 188   return is_identifier (sym
->tag
) ? sym
->tag 
: 0; 
 192 /*------------------------------------------------------------------. 
 193 | Complain that S's WHAT is redeclared at SECOND, and was first set | 
 195 `------------------------------------------------------------------*/ 
 198 symbol_redeclaration (symbol 
*s
, const char *what
, location first
, 
 202   complain_indent (&second
, complaint
, &i
, 
 203                    _("%s redeclaration for %s"), what
, s
->tag
); 
 205   complain_indent (&first
, complaint
, &i
, 
 206                    _("previous declaration")); 
 210 semantic_type_redeclaration (semantic_type 
*s
, const char *what
, location first
, 
 214   complain_indent (&second
, complaint
, &i
, 
 215                    _("%s redeclaration for <%s>"), what
, s
->tag
); 
 217   complain_indent (&first
, complaint
, &i
, 
 218                    _("previous declaration")); 
 223 /*-----------------------------------------------------------------. 
 224 | Set the TYPE_NAME associated with SYM.  Does nothing if passed 0 | 
 226 `-----------------------------------------------------------------*/ 
 229 symbol_type_set (symbol 
*sym
, uniqstr type_name
, location loc
) 
 234         symbol_redeclaration (sym
, "%type", sym
->type_location
, loc
); 
 235       uniqstr_assert (type_name
); 
 236       sym
->type_name 
= type_name
; 
 237       sym
->type_location 
= loc
; 
 241 /*--------------------------------------------------------. 
 242 | Set the DESTRUCTOR or PRINTER associated with the SYM.  | 
 243 `--------------------------------------------------------*/ 
 246 symbol_code_props_set (symbol 
*sym
, code_props_type kind
, 
 247                        code_props 
const *code
) 
 249   if (sym
->props
[kind
].code
) 
 250     symbol_redeclaration (sym
, code_props_type_string (kind
), 
 251                           sym
->props
[kind
].location
, 
 253   sym
->props
[kind
] = *code
; 
 256 /*-----------------------------------------------------. 
 257 | Set the DESTRUCTOR or PRINTER associated with TYPE.  | 
 258 `-----------------------------------------------------*/ 
 261 semantic_type_code_props_set (semantic_type 
*type
, 
 262                               code_props_type kind
, 
 263                               code_props 
const *code
) 
 265   if (type
->props
[kind
].code
) 
 266     semantic_type_redeclaration (type
, code_props_type_string (kind
), 
 267                                  type
->props
[kind
].location
, 
 269   type
->props
[kind
] = *code
; 
 272 /*---------------------------------------------------. 
 273 | Get the computed %destructor or %printer for SYM.  | 
 274 `---------------------------------------------------*/ 
 277 symbol_code_props_get (symbol 
*sym
, code_props_type kind
) 
 279   /* Per-symbol code props.  */ 
 280   if (sym
->props
[kind
].code
) 
 281     return &sym
->props
[kind
]; 
 283   /* Per-type code props.  */ 
 287         &semantic_type_get (sym
->type_name
, NULL
)->props
[kind
]; 
 292   /* Apply default code props's only to user-defined symbols.  */ 
 293   if (sym
->tag
[0] != '$' && sym 
!= errtoken
) 
 296         &semantic_type_get (sym
->type_name 
? "*" : "", NULL
)->props
[kind
]; 
 300   return &code_props_none
; 
 303 /*-----------------------------------------------------------------. 
 304 | Set the PRECEDENCE associated with SYM.  Does nothing if invoked | 
 305 | with UNDEF_ASSOC as ASSOC.                                       | 
 306 `-----------------------------------------------------------------*/ 
 309 symbol_precedence_set (symbol 
*sym
, int prec
, assoc a
, location loc
) 
 311   if (a 
!= undef_assoc
) 
 314         symbol_redeclaration (sym
, assoc_to_string (a
), sym
->prec_location
, 
 318       sym
->prec_location 
= loc
; 
 321   /* Only terminals have a precedence. */ 
 322   symbol_class_set (sym
, token_sym
, loc
, false); 
 326 /*------------------------------------. 
 327 | Set the CLASS associated with SYM.  | 
 328 `------------------------------------*/ 
 331 symbol_class_set (symbol 
*sym
, symbol_class 
class, location loc
, bool declaring
) 
 334   if (sym
->class != unknown_sym 
&& sym
->class != class) 
 336       complain (&loc
, complaint
, _("symbol %s redefined"), sym
->tag
); 
 337       /* Don't report both "redefined" and "redeclared".  */ 
 341   if (class == nterm_sym 
&& sym
->class != nterm_sym
) 
 342     sym
->number 
= nvars
++; 
 343   else if (class == token_sym 
&& sym
->number 
== NUMBER_UNDEFINED
) 
 344     sym
->number 
= ntokens
++; 
 350       if (sym
->status 
== declared 
&& !warned
) 
 351         complain (&loc
, Wother
, _("symbol %s redeclared"), sym
->tag
); 
 352       sym
->status 
= declared
; 
 357 /*------------------------------------------------. 
 358 | Set the USER_TOKEN_NUMBER associated with SYM.  | 
 359 `------------------------------------------------*/ 
 362 symbol_user_token_number_set (symbol 
*sym
, int user_token_number
, location loc
) 
 364   int *user_token_numberp
; 
 366   if (sym
->user_token_number 
!= USER_NUMBER_HAS_STRING_ALIAS
) 
 367     user_token_numberp 
= &sym
->user_token_number
; 
 369     user_token_numberp 
= &sym
->alias
->user_token_number
; 
 370   if (*user_token_numberp 
!= USER_NUMBER_UNDEFINED
 
 371       && *user_token_numberp 
!= user_token_number
) 
 372     complain (&loc
, complaint
, _("redefining user token number of %s"), 
 375   *user_token_numberp 
= user_token_number
; 
 376   /* User defined $end token? */ 
 377   if (user_token_number 
== 0) 
 380       /* It is always mapped to 0, so it was already counted in 
 382       if (endtoken
->number 
!= NUMBER_UNDEFINED
) 
 384       endtoken
->number 
= 0; 
 389 /*----------------------------------------------------------. 
 390 | If SYM is not defined, report an error, and consider it a | 
 392 `----------------------------------------------------------*/ 
 395 symbol_check_defined (symbol 
*sym
) 
 397   if (sym
->class == unknown_sym
) 
 399       assert (sym
->status 
!= declared
); 
 400       complain (&sym
->location
, 
 401                 sym
->status 
== needed 
? complaint 
: Wother
, 
 402                 _("symbol %s is used, but is not defined as a token" 
 403                   " and has no rules"), 
 405       sym
->class = nterm_sym
; 
 406       sym
->number 
= nvars
++; 
 411     for (i 
= 0; i 
< 2; ++i
) 
 412       symbol_code_props_get (sym
, i
)->is_used 
= true; 
 415   /* Set the semantic type status associated to the current symbol to 
 416      'declared' so that we could check semantic types unnecessary uses. */ 
 419       semantic_type 
*sem_type 
= semantic_type_get (sym
->type_name
, NULL
); 
 421         sem_type
->status 
= declared
; 
 428 semantic_type_check_defined (semantic_type 
*sem_type
) 
 430   /* <*> and <> do not have to be "declared".  */ 
 431   if (sem_type
->status 
== declared
 
 433       || STREQ(sem_type
->tag
, "*")) 
 436       for (i 
= 0; i 
< 2; ++i
) 
 437         if (sem_type
->props
[i
].kind 
!= CODE_PROPS_NONE
 
 438             && ! sem_type
->props
[i
].is_used
) 
 439           complain (&sem_type
->location
, Wother
, 
 440                     _("useless %s for type <%s>"), 
 441                     code_props_type_string (i
), sem_type
->tag
); 
 444     complain (&sem_type
->location
, Wother
, 
 445               _("type <%s> is used, but is not associated to any symbol"), 
 452 symbol_check_defined_processor (void *sym
, void *null ATTRIBUTE_UNUSED
) 
 454   return symbol_check_defined (sym
); 
 458 semantic_type_check_defined_processor (void *sem_type
, 
 459                                        void *null ATTRIBUTE_UNUSED
) 
 461   return semantic_type_check_defined (sem_type
); 
 466 symbol_make_alias (symbol 
*sym
, symbol 
*str
, location loc
) 
 469     complain (&loc
, Wother
, 
 470               _("symbol %s used more than once as a literal string"), str
->tag
); 
 472     complain (&loc
, Wother
, 
 473               _("symbol %s given more than one literal string"), sym
->tag
); 
 476       str
->class = token_sym
; 
 477       str
->user_token_number 
= sym
->user_token_number
; 
 478       sym
->user_token_number 
= USER_NUMBER_HAS_STRING_ALIAS
; 
 481       str
->number 
= sym
->number
; 
 482       symbol_type_set (str
, sym
->type_name
, loc
); 
 487 /*---------------------------------------------------------. 
 488 | Check that THIS, and its alias, have same precedence and | 
 490 `---------------------------------------------------------*/ 
 493 symbol_check_alias_consistency (symbol 
*this) 
 496   symbol 
*str 
= this->alias
; 
 498   /* Check only the symbol in the symbol-string pair.  */ 
 500         && this->user_token_number 
== USER_NUMBER_HAS_STRING_ALIAS
)) 
 503   if (str
->type_name 
!= sym
->type_name
) 
 506         symbol_type_set (sym
, str
->type_name
, str
->type_location
); 
 508         symbol_type_set (str
, sym
->type_name
, sym
->type_location
); 
 514     for (i 
= 0; i 
< CODE_PROPS_SIZE
; ++i
) 
 515       if (str
->props
[i
].code
) 
 516         symbol_code_props_set (sym
, i
, &str
->props
[i
]); 
 517       else if (sym
->props
[i
].code
) 
 518         symbol_code_props_set (str
, i
, &sym
->props
[i
]); 
 521   if (sym
->prec 
|| str
->prec
) 
 524         symbol_precedence_set (sym
, str
->prec
, str
->assoc
, 
 527         symbol_precedence_set (str
, sym
->prec
, sym
->assoc
, 
 533 symbol_check_alias_consistency_processor (void *this, 
 534                                           void *null ATTRIBUTE_UNUSED
) 
 536   symbol_check_alias_consistency (this); 
 541 /*-------------------------------------------------------------------. 
 542 | Assign a symbol number, and write the definition of the token name | 
 543 | into FDEFINES.  Put in SYMBOLS.                                    | 
 544 `-------------------------------------------------------------------*/ 
 547 symbol_pack (symbol 
*this) 
 549   aver (this->number 
!= NUMBER_UNDEFINED
); 
 550   if (this->class == nterm_sym
) 
 551     this->number 
+= ntokens
; 
 552   else if (this->user_token_number 
== USER_NUMBER_HAS_STRING_ALIAS
) 
 555   symbols
[this->number
] = this; 
 560 symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED
) 
 562   return symbol_pack (this); 
 567 user_token_number_redeclaration (int num
, symbol 
*first
, symbol 
*second
) 
 570   /* User token numbers are not assigned during the parsing, but in a 
 571      second step, via a traversal of the symbol table sorted on tag. 
 573      However, error messages make more sense if we keep the first 
 574      declaration first.  */ 
 575   if (location_cmp (first
->location
, second
->location
) > 0) 
 581   complain_indent (&second
->location
, complaint
, &i
, 
 582                    _("user token number %d redeclaration for %s"), 
 585   complain_indent (&first
->location
, complaint
, &i
, 
 586                    _("previous declaration for %s"), 
 590 /*--------------------------------------------------. 
 591 | Put THIS in TOKEN_TRANSLATIONS if it is a token.  | 
 592 `--------------------------------------------------*/ 
 595 symbol_translation (symbol 
*this) 
 598   if (this->class == token_sym
 
 599       && this->user_token_number 
!= USER_NUMBER_HAS_STRING_ALIAS
) 
 601       /* A token which translation has already been set? */ 
 602       if (token_translations
[this->user_token_number
] != undeftoken
->number
) 
 603         user_token_number_redeclaration
 
 604           (this->user_token_number
, 
 605            symbols
[token_translations
[this->user_token_number
]], 
 608       token_translations
[this->user_token_number
] = this->number
; 
 615 symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED
) 
 617   return symbol_translation (this); 
 621 /*---------------------------------------. 
 622 | Symbol and semantic type hash tables.  | 
 623 `---------------------------------------*/ 
 625 /* Initial capacity of symbol and semantic type hash table.  */ 
 626 #define HT_INITIAL_CAPACITY 257 
 628 static struct hash_table 
*symbol_table 
= NULL
; 
 629 static struct hash_table 
*semantic_type_table 
= NULL
; 
 632 hash_compare_symbol (const symbol 
*m1
, const symbol 
*m2
) 
 634   /* Since tags are unique, we can compare the pointers themselves.  */ 
 635   return UNIQSTR_EQ (m1
->tag
, m2
->tag
); 
 639 hash_compare_semantic_type (const semantic_type 
*m1
, const semantic_type 
*m2
) 
 641   /* Since names are unique, we can compare the pointers themselves.  */ 
 642   return UNIQSTR_EQ (m1
->tag
, m2
->tag
); 
 646 hash_symbol_comparator (void const *m1
, void const *m2
) 
 648   return hash_compare_symbol (m1
, m2
); 
 652 hash_semantic_type_comparator (void const *m1
, void const *m2
) 
 654   return hash_compare_semantic_type (m1
, m2
); 
 658 hash_symbol (const symbol 
*m
, size_t tablesize
) 
 660   /* Since tags are unique, we can hash the pointer itself.  */ 
 661   return ((uintptr_t) m
->tag
) % tablesize
; 
 665 hash_semantic_type (const semantic_type 
*m
, size_t tablesize
) 
 667   /* Since names are unique, we can hash the pointer itself.  */ 
 668   return ((uintptr_t) m
->tag
) % tablesize
; 
 672 hash_symbol_hasher (void const *m
, size_t tablesize
) 
 674   return hash_symbol (m
, tablesize
); 
 678 hash_semantic_type_hasher (void const *m
, size_t tablesize
) 
 680   return hash_semantic_type (m
, tablesize
); 
 683 /*-------------------------------. 
 684 | Create the symbol hash table.  | 
 685 `-------------------------------*/ 
 690   symbol_table 
= hash_initialize (HT_INITIAL_CAPACITY
, 
 693                                   hash_symbol_comparator
, 
 695   semantic_type_table 
= hash_initialize (HT_INITIAL_CAPACITY
, 
 697                                          hash_semantic_type_hasher
, 
 698                                          hash_semantic_type_comparator
, 
 703 /*----------------------------------------------------------------. 
 704 | Find the symbol named KEY, and return it.  If it does not exist | 
 706 `----------------------------------------------------------------*/ 
 709 symbol_from_uniqstr (const uniqstr key
, location loc
) 
 715   entry 
= hash_lookup (symbol_table
, &probe
); 
 719       /* First insertion in the hash. */ 
 720       aver (!symbols_sorted
); 
 721       entry 
= symbol_new (key
, loc
); 
 722       if (!hash_insert (symbol_table
, entry
)) 
 729 /*-----------------------------------------------------------------------. 
 730 | Find the semantic type named KEY, and return it.  If it does not exist | 
 732 `-----------------------------------------------------------------------*/ 
 735 semantic_type_from_uniqstr (const uniqstr key
, const location 
*loc
) 
 738   semantic_type 
*entry
; 
 741   entry 
= hash_lookup (semantic_type_table
, &probe
); 
 745       /* First insertion in the hash. */ 
 746       entry 
= semantic_type_new (key
, loc
); 
 747       if (!hash_insert (semantic_type_table
, entry
)) 
 754 /*----------------------------------------------------------------. 
 755 | Find the symbol named KEY, and return it.  If it does not exist | 
 757 `----------------------------------------------------------------*/ 
 760 symbol_get (const char *key
, location loc
) 
 762   return symbol_from_uniqstr (uniqstr_new (key
), loc
); 
 766 /*-----------------------------------------------------------------------. 
 767 | Find the semantic type named KEY, and return it.  If it does not exist | 
 769 `-----------------------------------------------------------------------*/ 
 772 semantic_type_get (const char *key
, const location 
*loc
) 
 774   return semantic_type_from_uniqstr (uniqstr_new (key
), loc
); 
 778 /*------------------------------------------------------------------. 
 779 | Generate a dummy nonterminal, whose name cannot conflict with the | 
 781 `------------------------------------------------------------------*/ 
 784 dummy_symbol_get (location loc
) 
 786   /* Incremented for each generated symbol.  */ 
 787   static int dummy_count 
= 0; 
 788   static char buf
[256]; 
 792   sprintf (buf
, "$@%d", ++dummy_count
); 
 793   sym 
= symbol_get (buf
, loc
); 
 794   sym
->class = nterm_sym
; 
 795   sym
->number 
= nvars
++; 
 800 symbol_is_dummy (const symbol 
*sym
) 
 802   return sym
->tag
[0] == '@' || (sym
->tag
[0] == '$' && sym
->tag
[1] == '@'); 
 805 /*-------------------. 
 806 | Free the symbols.  | 
 807 `-------------------*/ 
 812   hash_free (symbol_table
); 
 813   hash_free (semantic_type_table
); 
 815   free (symbols_sorted
); 
 816   free (semantic_types_sorted
); 
 820 /*---------------------------------------------------------------. 
 821 | Look for undefined symbols, report an error, and consider them | 
 823 `---------------------------------------------------------------*/ 
 826 symbols_cmp (symbol 
const *a
, symbol 
const *b
) 
 828   return strcmp (a
->tag
, b
->tag
); 
 832 symbols_cmp_qsort (void const *a
, void const *b
) 
 834   return symbols_cmp (*(symbol 
* const *)a
, *(symbol 
* const *)b
); 
 838 symbols_do (Hash_processor processor
, void *processor_data
, 
 839             struct hash_table 
*table
, symbol 
***sorted
) 
 841   size_t count 
= hash_get_n_entries (table
); 
 844       *sorted 
= xnmalloc (count
, sizeof **sorted
); 
 845       hash_get_entries (table
, (void**)*sorted
, count
); 
 846       qsort (*sorted
, count
, sizeof **sorted
, symbols_cmp_qsort
); 
 850     for (i 
= 0; i 
< count
; ++i
) 
 851       processor ((*sorted
)[i
], processor_data
); 
 855 /*--------------------------------------------------------------. 
 856 | Check that all the symbols are defined.  Report any undefined | 
 857 | symbols and consider them nonterminals.                       | 
 858 `--------------------------------------------------------------*/ 
 861 symbols_check_defined (void) 
 863   symbols_do (symbol_check_defined_processor
, NULL
, 
 864               symbol_table
, &symbols_sorted
); 
 865   symbols_do (semantic_type_check_defined_processor
, NULL
, 
 866               semantic_type_table
, &semantic_types_sorted
); 
 869 /*------------------------------------------------------------------. 
 870 | Set TOKEN_TRANSLATIONS.  Check that no two symbols share the same | 
 872 `------------------------------------------------------------------*/ 
 875 symbols_token_translations_init (void) 
 877   bool num_256_available_p 
= true; 
 880   /* Find the highest user token number, and whether 256, the POSIX 
 881      preferred user token number for the error token, is used.  */ 
 882   max_user_token_number 
= 0; 
 883   for (i 
= 0; i 
< ntokens
; ++i
) 
 885       symbol 
*this = symbols
[i
]; 
 886       if (this->user_token_number 
!= USER_NUMBER_UNDEFINED
) 
 888           if (this->user_token_number 
> max_user_token_number
) 
 889             max_user_token_number 
= this->user_token_number
; 
 890           if (this->user_token_number 
== 256) 
 891             num_256_available_p 
= false; 
 895   /* If 256 is not used, assign it to error, to follow POSIX.  */ 
 896   if (num_256_available_p
 
 897       && errtoken
->user_token_number 
== USER_NUMBER_UNDEFINED
) 
 898     errtoken
->user_token_number 
= 256; 
 900   /* Set the missing user numbers. */ 
 901   if (max_user_token_number 
< 256) 
 902     max_user_token_number 
= 256; 
 904   for (i 
= 0; i 
< ntokens
; ++i
) 
 906       symbol 
*this = symbols
[i
]; 
 907       if (this->user_token_number 
== USER_NUMBER_UNDEFINED
) 
 908         this->user_token_number 
= ++max_user_token_number
; 
 909       if (this->user_token_number 
> max_user_token_number
) 
 910         max_user_token_number 
= this->user_token_number
; 
 913   token_translations 
= xnmalloc (max_user_token_number 
+ 1, 
 914                                  sizeof *token_translations
); 
 916   /* Initialize all entries for literal tokens to the internal token 
 917      number for $undefined, which represents all invalid inputs.  */ 
 918   for (i 
= 0; i 
< max_user_token_number 
+ 1; i
++) 
 919     token_translations
[i
] = undeftoken
->number
; 
 920   symbols_do (symbol_translation_processor
, NULL
, 
 921               symbol_table
, &symbols_sorted
); 
 925 /*----------------------------------------------------------------. 
 926 | Assign symbol numbers, and write definition of token names into | 
 927 | FDEFINES.  Set up vectors SYMBOL_TABLE, TAGS of symbols.        | 
 928 `----------------------------------------------------------------*/ 
 933   symbols_do (symbol_check_alias_consistency_processor
, NULL
, 
 934               symbol_table
, &symbols_sorted
); 
 936   symbols 
= xcalloc (nsyms
, sizeof *symbols
); 
 937   symbols_do (symbol_pack_processor
, NULL
, symbol_table
, &symbols_sorted
); 
 939   /* Aliases leave empty slots in symbols, so remove them.  */ 
 943     int nsyms_old 
= nsyms
; 
 944     for (writei 
= 0, readi 
= 0; readi 
< nsyms_old
; readi 
+= 1) 
 946         if (symbols
[readi
] == NULL
) 
 953             symbols
[writei
] = symbols
[readi
]; 
 954             symbols
[writei
]->number 
= writei
; 
 955             if (symbols
[writei
]->alias
) 
 956               symbols
[writei
]->alias
->number 
= writei
; 
 961   symbols 
= xnrealloc (symbols
, nsyms
, sizeof *symbols
); 
 963   symbols_token_translations_init (); 
 965   if (startsymbol
->class == unknown_sym
) 
 966     complain (&startsymbol_location
, fatal
, 
 967               _("the start symbol %s is undefined"), 
 969   else if (startsymbol
->class == token_sym
) 
 970     complain (&startsymbol_location
, fatal
, 
 971               _("the start symbol %s is a token"),