|
|
1.1 ! root 1: /* Type definitions for nondeterministic finite state machine for bison, ! 2: Copyright (C) 1984, 1989 Free Software Foundation, Inc. ! 3: ! 4: This file is part of Bison, the GNU Compiler Compiler. ! 5: ! 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) ! 9: any later version. ! 10: ! 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. ! 15: ! 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: /* These type definitions are used to represent a nondeterministic ! 22: finite state machine that parses the specified grammar. ! 23: This information is generated by the function generate_states ! 24: in the file LR0. ! 25: ! 26: Each state of the machine is described by a set of items -- ! 27: particular positions in particular rules -- that are the possible ! 28: places where parsing could continue when the machine is in this state. ! 29: These symbols at these items are the allowable inputs that can follow now. ! 30: ! 31: A core represents one state. States are numbered in the number field. ! 32: When generate_states is finished, the starting state is state 0 ! 33: and nstates is the number of states. (A transition to a state ! 34: whose state number is nstates indicates termination.) All the cores ! 35: are chained together and first_state points to the first one (state 0). ! 36: ! 37: For each state there is a particular symbol which must have been the ! 38: last thing accepted to reach that state. It is the accessing_symbol ! 39: of the core. ! 40: ! 41: Each core contains a vector of nitems items which are the indices ! 42: in the ritems vector of the items that are selected in this state. ! 43: ! 44: The link field is used for chaining buckets that hash states by ! 45: their itemsets. This is for recognizing equivalent states and ! 46: combining them when the states are generated. ! 47: ! 48: The two types of transitions are shifts (push the lookahead token ! 49: and read another) and reductions (combine the last n things on the ! 50: stack via a rule, replace them with the symbol that the rule derives, ! 51: and leave the lookahead token alone). When the states are generated, ! 52: these transitions are represented in two other lists. ! 53: ! 54: Each shifts structure describes the possible shift transitions out ! 55: of one state, the state whose number is in the number field. ! 56: The shifts structures are linked through next and first_shift points to them. ! 57: Each contains a vector of numbers of the states that shift transitions ! 58: can go to. The accessing_symbol fields of those states' cores say what kind ! 59: of input leads to them. ! 60: ! 61: A shift to state zero should be ignored. Conflict resolution ! 62: deletes shifts by changing them to zero. ! 63: ! 64: Each reductions structure describes the possible reductions at the state ! 65: whose number is in the number field. The data is a list of nreds rules, ! 66: represented by their rule numbers. first_reduction points to the list ! 67: of these structures. ! 68: ! 69: Conflict resolution can decide that certain tokens in certain ! 70: states should explicitly be errors (for implementing %nonassoc). ! 71: For each state, the tokens that are errors for this reason ! 72: are recorded in an errs structure, which has the state number ! 73: in its number field. The rest of the errs structure is full ! 74: of token numbers. ! 75: ! 76: There is at least one shift transition present in state zero. ! 77: It leads to a next-to-final state whose accessing_symbol is ! 78: the grammar's start symbol. The next-to-final state has one shift ! 79: to the final state, whose accessing_symbol is zero (end of input). ! 80: The final state has one shift, which goes to the termination state ! 81: (whose number is nstates-1). ! 82: The reason for the extra state at the end is to placate the parser's ! 83: strategy of making all decisions one token ahead of its actions. */ ! 84: ! 85: ! 86: typedef ! 87: struct core ! 88: { ! 89: struct core *next; ! 90: struct core *link; ! 91: short number; ! 92: short accessing_symbol; ! 93: short nitems; ! 94: short items[1]; ! 95: } ! 96: core; ! 97: ! 98: ! 99: ! 100: typedef ! 101: struct shifts ! 102: { ! 103: struct shifts *next; ! 104: short number; ! 105: short nshifts; ! 106: short shifts[1]; ! 107: } ! 108: shifts; ! 109: ! 110: ! 111: ! 112: typedef ! 113: struct errs ! 114: { ! 115: short nerrs; ! 116: short errs[1]; ! 117: } ! 118: errs; ! 119: ! 120: ! 121: ! 122: typedef ! 123: struct reductions ! 124: { ! 125: struct reductions *next; ! 126: short number; ! 127: short nreds; ! 128: short rules[1]; ! 129: } ! 130: reductions; ! 131: ! 132: ! 133: ! 134: extern int nstates; ! 135: extern core *first_state; ! 136: extern shifts *first_shift; ! 137: extern reductions *first_reduction;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.