]> git.saurik.com Git - bison.git/blame - src/gram.h
(state_number_as_int): Now inline functions rather than macros, to avoid casts.
[bison.git] / src / gram.h
CommitLineData
e46cedb9
PE
1/* Data definitions for internal representation of Bison's input.
2
d7e1f00c 3 Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002
99013900 4 Free Software Foundation, Inc.
f7d4d87a 5
b2ca4022 6 This file is part of Bison, the GNU Compiler Compiler.
f7d4d87a 7
b2ca4022
AD
8 Bison 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 2, or (at your option)
11 any later version.
f7d4d87a 12
b2ca4022
AD
13 Bison 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.
f7d4d87a 17
b2ca4022
AD
18 You should have received a copy of the GNU General Public License
19 along with Bison; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
f7d4d87a 22
b2ca4022
AD
23#ifndef GRAM_H_
24# define GRAM_H_
f7d4d87a 25
aea13e97 26/* Representation of the grammar rules:
f7d4d87a 27
aea13e97
AD
28 NTOKENS is the number of tokens, and NVARS is the number of
29 variables (nonterminals). NSYMS is the total number, ntokens +
b2ca4022 30 nvars.
f7d4d87a 31
b2ca4022 32 Each symbol (either token or variable) receives a symbol number.
aea13e97
AD
33 Numbers 0 to NTOKENS - 1 are for tokens, and NTOKENS to NSYMS - 1
34 are for variables. Symbol number zero is the end-of-input token.
35 This token is counted in ntokens. The true number of token values
36 assigned is NTOKENS reduced by one for each alias declaration.
37
38 The rules receive rule numbers 1 to NRULES in the order they are
39 written. More precisely Bison augments the grammar with the
88bce5a2
AD
40 initial rule, `$accept: START-SYMBOL $end', which is numbered 1,
41 all the user rules are 2, 3 etc. Each time a rule number is
42 presented to the user, we subtract 1, so *displayed* rule numbers
43 are 0, 1, 2...
aea13e97
AD
44
45 Internally, we cannot use the number 0 for a rule because for
46 instance RITEM stores both symbol (the RHS) and rule numbers: the
47 symbols are shorts >= 0, and rule number are stored negative.
48 Therefore 0 cannot be used, since it would be both the rule number
88bce5a2 49 0, and the token $end).
aea13e97 50
fdbcd8e2 51 Actions are accessed via the rule number.
f7d4d87a 52
b2ed6e58 53 The rules themselves are described by several arrays: amongst which
1a2b5d37 54 RITEM, and RULES.
b2ed6e58 55
7478c462 56 RULES is an array of rules, whose members are:
b2ed6e58 57
03b31c0c 58 RULES[R].lhs -- the symbol of the left hand side of rule R.
b2ed6e58 59
aea13e97
AD
60 RULES[R].rhs -- the index in RITEM of the beginning of the portion
61 for rule R.
f7d4d87a 62
03b31c0c 63 RULES[R].prec -- the symbol providing the precedence level of R.
652a871c 64
03b31c0c
AD
65 RULES[R].precsym -- the symbol attached (via %prec) to give its
66 precedence to R. Of course, if set, it is equal to `prec', but we
67 need to distinguish one from the other when reducing: a symbol used
68 in a %prec is not useless.
652a871c 69
1a2b5d37 70 RULES[R].assoc -- the associativity of R.
e41dc700 71
88bce5a2
AD
72 RULES[R].dprec -- the dynamic precedence level of R (for GLR
73 parsing).
676385e2 74
88bce5a2
AD
75 RULES[R].merger -- index of merging function for R (for GLR
76 parsing).
676385e2 77
1a2b5d37 78 RULES[R].line -- the line where R was defined.
652a871c 79
738c69de 80 RULES[R].useful -- true iff the rule is used (i.e., false if thrown
03b31c0c 81 away by reduce).
68f1e3ed 82
b2ed6e58
AD
83 The right hand side is stored as symbol numbers in a portion of
84 RITEM.
f7d4d87a 85
b2ca4022
AD
86 The length of the portion is one greater than the number of symbols
87 in the rule's right hand side. The last element in the portion
88 contains minus R, which identifies it as the end of a portion and
89 says which rule it is for.
f7d4d87a 90
a900a624
AD
91 The portions of RITEM come in order of increasing rule number.
92 NRITEMS is the total length of RITEM. Each element of RITEM is
93 called an "item" and its index in RITEM is an item number.
f7d4d87a 94
b2ca4022
AD
95 Item numbers are used in the finite state machine to represent
96 places that parsing can get to.
f7d4d87a 97
aea13e97 98 SYMBOLS[I]->prec records the precedence level of each symbol.
f7d4d87a 99
b2ca4022
AD
100 Precedence levels are assigned in increasing order starting with 1
101 so that numerically higher precedence values mean tighter binding
102 as they ought to. Zero as a symbol or rule's precedence means none
103 is assigned.
f7d4d87a 104
aea13e97 105 Associativities are recorded similarly in SYMBOLS[I]->assoc. */
f7d4d87a 106
8efe435c
AD
107# include "location.h"
108# include "symtab.h"
f7d4d87a 109
8efe435c
AD
110# define ISTOKEN(s) ((s) < ntokens)
111# define ISVAR(s) ((s) >= ntokens)
f7d4d87a 112
f7d4d87a
DM
113extern int nsyms;
114extern int ntokens;
115extern int nvars;
116
7478c462
PE
117typedef int item_number;
118extern item_number *ritem;
0c2d3f4c 119extern unsigned int nritems;
b2ed6e58 120
7478c462
PE
121/* There is weird relationship between OT1H item_number and OTOH
122 symbol_number and rule_number: we store the latter in
123 item_number. symbol_number values are stored as-is, while
124 the negation of (rule_number + 1) is stored.
5fbb0954 125
7478c462 126 Therefore, a symbol_number must be a valid item_number, and we
5fbb0954 127 sometimes have to perform the converse transformation. */
e46cedb9
PE
128
129static inline item_number
130symbol_number_as_item_number (symbol_number s)
131{
132 return s;
133}
134
135static inline symbol_number
136item_number_as_symbol_number (item_number i)
137{
138 return i;
139}
5fbb0954 140
7478c462 141extern symbol_number start_symbol;
f7d4d87a 142
7478c462
PE
143/* Rule numbers. */
144typedef short rule_number;
145extern rule_number nrules;
e46cedb9
PE
146
147static inline item_number
148rule_number_as_item_number (rule_number r)
149{
150 return -1 - r;
151}
152
153static inline rule_number
154item_number_as_rule_number (item_number i)
155{
156 return -1 - i;
157}
9222837b
AD
158
159
160/*--------.
161| Rules. |
162`--------*/
62a3e4f0 163
7478c462 164typedef struct
652a871c 165{
c3b407f4
AD
166 /* The number of the rule in the source. It is usually the index in
167 RULES too, except if there are useless rules. */
7478c462 168 rule_number user_number;
d7e1f00c
AD
169
170 /* The index in RULES. Usually the rule number in the source,
171 except if some rules are useless. */
7478c462 172 rule_number number;
c3b407f4 173
7478c462
PE
174 symbol *lhs;
175 item_number *rhs;
03b31c0c
AD
176
177 /* This symbol provides both the associativity, and the precedence. */
7478c462 178 symbol *prec;
03b31c0c 179
676385e2
PH
180 short dprec;
181 short merger;
182
03b31c0c 183 /* This symbol was attached to the rule via %prec. */
7478c462 184 symbol *precsym;
03b31c0c 185
7478c462 186 location location;
68f1e3ed 187 bool useful;
f499b062 188
3f96f4dc 189 const char *action;
7478c462
PE
190 location action_location;
191} rule;
652a871c 192
7478c462 193extern rule *rules;
652a871c 194
c8f002c7 195/* A function that selects a rule. */
7478c462 196typedef bool (*rule_filter) (rule *);
c8f002c7
AD
197
198/* Return true IFF the rule has a `number' smaller than NRULES. */
7478c462 199bool rule_useful_p (rule *r);
c8f002c7
AD
200
201/* Return true IFF the rule has a `number' higher than NRULES. */
7478c462 202bool rule_useless_p (rule *r);
c8f002c7
AD
203
204/* Return true IFF the rule is not flagged as useful *and* is useful.
205 In other words, it was discarded because of conflicts. */
7478c462 206bool rule_never_reduced_p (rule *r);
c8f002c7 207
7478c462 208/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was
c8f002c7
AD
209 already displayed (by a previous call for another rule), avoid
210 useless repetitions. */
7478c462 211void rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out);
c8f002c7
AD
212
213/* Return the length of the RHS. */
7478c462 214int rule_rhs_length (rule *r);
c8f002c7 215
7478c462
PE
216/* Print this rule's RHS on OUT. */
217void rule_rhs_print (rule *r, FILE *out);
c8f002c7 218
7478c462
PE
219/* Print this rule on OUT. */
220void rule_print (rule *r, FILE *out);
c8f002c7
AD
221
222
223
224
0e78e603 225/* Table of the symbols, indexed by the symbol number. */
7478c462 226extern symbol **symbols;
0e78e603 227
680e8701
AD
228/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
229 by the user's yylex routine, it yields the internal token number
230 used by the parser and throughout bison. */
7478c462 231extern symbol_number *token_translations;
f7d4d87a
DM
232extern int max_user_token_number;
233
f7d4d87a 234
c8f002c7 235
676385e2
PH
236/* GLR_PARSER is nonzero if the input file says to use the GLR
237 (Generalized LR) parser, and to output some additional
238 information used by the GLR algorithm. */
239
240extern int glr_parser;
241
b2ca4022
AD
242/* PURE_PARSER is nonzero if should generate a parser that is all pure
243 and reentrant. */
f7d4d87a
DM
244
245extern int pure_parser;
246
3067fbef 247/* Dump RITEM for traces. */
d33cb3ae 248void ritem_print (FILE *out);
c2713865
AD
249
250/* Return the size of the longest rule RHS. */
d33cb3ae 251size_t ritem_longest_rhs (void);
c2713865 252
9757c359
AD
253/* Print the grammar's rules numbers from BEGIN (inclusive) to END
254 (exclusive) on OUT under TITLE. */
d33cb3ae 255void grammar_rules_partial_print (FILE *out, const char *title,
7478c462 256 rule_filter filter);
9757c359 257
6b98e4b5 258/* Print the grammar's rules on OUT. */
d33cb3ae 259void grammar_rules_print (FILE *out);
6b98e4b5 260
78ab8f67 261/* Dump the grammar. */
d33cb3ae 262void grammar_dump (FILE *out, const char *title);
78ab8f67 263
c8f002c7
AD
264/* Report on STDERR the rules that are not flagged USEFUL, using the
265 MESSAGE (which can be `useless rule' when invoked after grammar
266 reduction, or `never reduced' after conflicts were taken into
267 account). */
d33cb3ae 268void grammar_rules_never_reduced_report (const char *message);
c8f002c7 269
5372019f 270/* Free the packed grammar. */
d33cb3ae 271void grammar_free (void);
5372019f 272
b2ca4022 273#endif /* !GRAM_H_ */