1 /* Type definitions for nondeterministic finite state machine for Bison. 
   3    Copyright (C) 2001, 2002, 2003, 2004 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 
   8    it 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, 
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15    GNU 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 
  19    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
  20    Boston, MA 02110-1301, USA.  */ 
  32                         /*-------------------. 
  34                         `-------------------*/ 
  37 /*-----------------------------------------. 
  38 | Create a new array of NUM shifts/gotos.  | 
  39 `-----------------------------------------*/ 
  42 transitions_new (int num
, state 
**the_states
) 
  44   size_t states_size 
= num 
* sizeof *the_states
; 
  45   transitions 
*res 
= xmalloc (offsetof (transitions
, states
) + states_size
); 
  47   memcpy (res
->states
, the_states
, states_size
); 
  52 /*-------------------------------------------------------. 
  53 | Return the state such that SHIFTS contain a shift/goto | 
  54 | to it on SYM.  Abort if none found.                    | 
  55 `-------------------------------------------------------*/ 
  58 transitions_to (transitions 
*shifts
, symbol_number sym
) 
  61   for (j 
= 0; j 
< shifts
->num
; j
++) 
  62     if (TRANSITION_SYMBOL (shifts
, j
) == sym
) 
  63       return shifts
->states
[j
]; 
  68                         /*--------------------. 
  69                         | Error transitions.  | 
  70                         `--------------------*/ 
  73 /*---------------------------------. 
  74 | Create a new array of NUM errs.  | 
  75 `---------------------------------*/ 
  78 errs_new (int num
, symbol 
**tokens
) 
  80   size_t symbols_size 
= num 
* sizeof *tokens
; 
  81   errs 
*res 
= xmalloc (offsetof (errs
, symbols
) + symbols_size
); 
  83   memcpy (res
->symbols
, tokens
, symbols_size
); 
  95 /*---------------------------------------. 
  96 | Create a new array of NUM reductions.  | 
  97 `---------------------------------------*/ 
 100 reductions_new (int num
, rule 
**reds
) 
 102   size_t rules_size 
= num 
* sizeof *reds
; 
 103   reductions 
*res 
= xmalloc (offsetof (reductions
, rules
) + rules_size
); 
 105   res
->look_ahead_tokens 
= NULL
; 
 106   memcpy (res
->rules
, reds
, rules_size
); 
 117 state_number nstates 
= 0; 
 118 /* FINAL_STATE is properly set by new_state when it recognizes its 
 119    accessing symbol: $end.  */ 
 120 state 
*final_state 
= NULL
; 
 123 /*------------------------------------------------------------------. 
 124 | Create a new state with ACCESSING_SYMBOL, for those items.  Store | 
 125 | it in the state hash table.                                       | 
 126 `------------------------------------------------------------------*/ 
 129 state_new (symbol_number accessing_symbol
, 
 130            size_t nitems
, item_number 
*core
) 
 133   size_t items_size 
= nitems 
* sizeof *core
; 
 135   if (STATE_NUMBER_MAXIMUM 
<= nstates
) 
 138   res 
= xmalloc (offsetof (state
, items
) + items_size
); 
 139   res
->number 
= nstates
++; 
 140   res
->accessing_symbol 
= accessing_symbol
; 
 141   res
->transitions 
= NULL
; 
 142   res
->reductions 
= NULL
; 
 145   res
->solved_conflicts 
= NULL
; 
 147   res
->nitems 
= nitems
; 
 148   memcpy (res
->items
, core
, items_size
); 
 150   state_hash_insert (res
); 
 161 state_free (state 
*s
) 
 163   free (s
->transitions
); 
 164   free (s
->reductions
); 
 170 /*---------------------------. 
 171 | Set the transitions of S.  | 
 172 `---------------------------*/ 
 175 state_transitions_set (state 
*s
, int num
, state 
**trans
) 
 179   s
->transitions 
= transitions_new (num
, trans
); 
 183 /*--------------------------. 
 184 | Set the reductions of S.  | 
 185 `--------------------------*/ 
 188 state_reductions_set (state 
*s
, int num
, rule 
**reds
) 
 192   s
->reductions 
= reductions_new (num
, reds
); 
 197 state_reduction_find (state 
*s
, rule 
*r
) 
 200   reductions 
*reds 
= s
->reductions
; 
 201   for (i 
= 0; i 
< reds
->num
; ++i
) 
 202     if (reds
->rules
[i
] == r
) 
 208 /*--------------------. 
 209 | Set the errs of S.  | 
 210 `--------------------*/ 
 213 state_errs_set (state 
*s
, int num
, symbol 
**tokens
) 
 217   s
->errs 
= errs_new (num
, tokens
); 
 222 /*---------------------------------------------------. 
 223 | Print on OUT all the look-ahead tokens such that S | 
 224 | wants to reduce R.                                 | 
 225 `---------------------------------------------------*/ 
 228 state_rule_look_ahead_tokens_print (state 
*s
, rule 
*r
, FILE *out
) 
 230   /* Find the reduction we are handling.  */ 
 231   reductions 
*reds 
= s
->reductions
; 
 232   int red 
= state_reduction_find (s
, r
); 
 234   /* Print them if there are.  */ 
 235   if (reds
->look_ahead_tokens 
&& red 
!= -1) 
 237       bitset_iterator biter
; 
 239       char const *sep 
= ""; 
 241       BITSET_FOR_EACH (biter
, reds
->look_ahead_tokens
[red
], k
, 0) 
 243           fprintf (out
, "%s%s", sep
, symbols
[k
]->tag
); 
 251 /*----------------------. 
 252 | A state hash table.  | 
 253 `----------------------*/ 
 255 /* Initial capacity of states hash table.  */ 
 256 #define HT_INITIAL_CAPACITY 257 
 258 static struct hash_table 
*state_table 
= NULL
; 
 260 /* Two states are equal if they have the same core items.  */ 
 262 state_compare (state 
const *s1
, state 
const *s2
) 
 266   if (s1
->nitems 
!= s2
->nitems
) 
 269   for (i 
= 0; i 
< s1
->nitems
; ++i
) 
 270     if (s1
->items
[i
] != s2
->items
[i
]) 
 277 state_comparator (void const *s1
, void const *s2
) 
 279   return state_compare (s1
, s2
); 
 283 state_hash (state 
const *s
, size_t tablesize
) 
 285   /* Add up the state's item numbers to get a hash key.  */ 
 288   for (i 
= 0; i 
< s
->nitems
; ++i
) 
 290   return key 
% tablesize
; 
 294 state_hasher (void const *s
, size_t tablesize
) 
 296   return state_hash (s
, tablesize
); 
 300 /*-------------------------------. 
 301 | Create the states hash table.  | 
 302 `-------------------------------*/ 
 305 state_hash_new (void) 
 307   state_table 
= hash_initialize (HT_INITIAL_CAPACITY
, 
 315 /*---------------------------------------------. 
 316 | Free the states hash table, not the states.  | 
 317 `---------------------------------------------*/ 
 320 state_hash_free (void) 
 322   hash_free (state_table
); 
 326 /*-----------------------------------. 
 327 | Insert S in the state hash table.  | 
 328 `-----------------------------------*/ 
 331 state_hash_insert (state 
*s
) 
 333   hash_insert (state_table
, s
); 
 337 /*------------------------------------------------------------------. 
 338 | Find the state associated to the CORE, and return it.  If it does | 
 339 | not exist yet, return NULL.                                       | 
 340 `------------------------------------------------------------------*/ 
 343 state_hash_lookup (size_t nitems
, item_number 
*core
) 
 345   size_t items_size 
= nitems 
* sizeof *core
; 
 346   state 
*probe 
= xmalloc (offsetof (state
, items
) + items_size
); 
 349   probe
->nitems 
= nitems
; 
 350   memcpy (probe
->items
, core
, items_size
); 
 351   entry 
= hash_lookup (state_table
, probe
); 
 356 /* All the decorated states, indexed by the state number.  */ 
 357 state 
**states 
= NULL
; 
 360 /*----------------------. 
 361 | Free all the states.  | 
 362 `----------------------*/ 
 368   for (i 
= 0; i 
< nstates
; ++i
) 
 369     state_free (states
[i
]);