]>
git.saurik.com Git - bison.git/blob - src/state.h
   1 /* Type definitions for nondeterministic finite state machine for bison, 
   2    Copyright 1984, 1989, 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 
   7    it 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, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU 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 
  18    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  22 /* These type definitions are used to represent a nondeterministic 
  23    finite state machine that parses the specified grammar.  This 
  24    information is generated by the function generate_states in the 
  27    Each state of the machine is described by a set of items -- 
  28    particular positions in particular rules -- that are the possible 
  29    places where parsing could continue when the machine is in this 
  30    state.  These symbols at these items are the allowable inputs that 
  33    A core represents one state.  States are numbered in the number 
  34    field.  When generate_states is finished, the starting state is 
  35    state 0 and nstates is the number of states.  (A transition to a 
  36    state whose state number is nstates indicates termination.)  All 
  37    the cores are chained together and first_state points to the first 
  40    For each state there is a particular symbol which must have been 
  41    the last thing accepted to reach that state.  It is the 
  42    accessing_symbol of the core. 
  44    Each core contains a vector of nitems items which are the indices 
  45    in the ritems vector of the items that are selected in this state. 
  47    The link field is used for chaining buckets that hash states by 
  48    their itemsets.  This is for recognizing equivalent states and 
  49    combining them when the states are generated. 
  51    The two types of transitions are shifts (push the lookahead token 
  52    and read another) and reductions (combine the last n things on the 
  53    stack via a rule, replace them with the symbol that the rule 
  54    derives, and leave the lookahead token alone).  When the states are 
  55    generated, these transitions are represented in two other lists. 
  57    Each shifts structure describes the possible shift transitions out 
  58    of one state, the state whose number is in the number field.  The 
  59    shifts structures are linked through next and first_shift points to 
  60    them.  Each contains a vector of numbers of the states that shift 
  61    transitions can go to.  The accessing_symbol fields of those 
  62    states' cores say what kind of input leads to them. 
  64    A shift to state zero should be ignored.  Conflict resolution 
  65    deletes shifts by changing them to zero. 
  67    Each reductions structure describes the possible reductions at the 
  68    state whose number is in the number field.  The data is a list of 
  69    nreds rules, represented by their rule numbers.  first_reduction 
  70    points to the list of these structures. 
  72    Conflict resolution can decide that certain tokens in certain 
  73    states should explicitly be errors (for implementing %nonassoc). 
  74    For each state, the tokens that are errors for this reason are 
  75    recorded in an errs structure, which has the state number in its 
  76    number field.  The rest of the errs structure is full of token 
  79    There is at least one shift transition present in state zero.  It 
  80    leads to a next-to-final state whose accessing_symbol is the 
  81    grammar's start symbol.  The next-to-final state has one shift to 
  82    the final state, whose accessing_symbol is zero (end of input). 
  83    The final state has one shift, which goes to the termination state 
  84    (whose number is nstates-1).  The reason for the extra state at the 
  85    end is to placate the parser's strategy of making all decisions one 
  86    token ahead of its actions.  */ 
  96   short accessing_symbol
; 
 104 typedef struct shifts
 
 124 typedef struct reductions
 
 126   struct reductions 
*next
; 
 133 #endif /* !STATE_H_ */