]> git.saurik.com Git - bison.git/blame - src/gram.h
Between Bison releases, manually append `+' to the previous Bison
[bison.git] / src / gram.h
CommitLineData
e46cedb9
PE
1/* Data definitions for internal representation of Bison's input.
2
36b5e963 3 Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003, 2004, 2005
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
0fb669f9
PE
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, 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
ba24760f
PE
110# define ISTOKEN(i) ((i) < ntokens)
111# define ISVAR(i) ((i) >= 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
ba24760f 130symbol_number_as_item_number (symbol_number sym)
e46cedb9 131{
ba24760f 132 return sym;
e46cedb9
PE
133}
134
135static inline symbol_number
136item_number_as_symbol_number (item_number i)
137{
138 return i;
139}
5fbb0954 140
36b5e963
AD
141static inline bool
142item_number_is_symbol_number (item_number i)
143{
144 return i >= 0;
145}
146
7478c462 147/* Rule numbers. */
f6fbd3da 148typedef int rule_number;
7478c462 149extern rule_number nrules;
e46cedb9
PE
150
151static inline item_number
152rule_number_as_item_number (rule_number r)
153{
154 return -1 - r;
155}
156
157static inline rule_number
158item_number_as_rule_number (item_number i)
159{
160 return -1 - i;
161}
9222837b 162
36b5e963
AD
163static inline bool
164item_number_is_rule_number (item_number i)
165{
166 return i < 0;
167}
9222837b
AD
168
169/*--------.
170| Rules. |
171`--------*/
62a3e4f0 172
7478c462 173typedef struct
652a871c 174{
c3b407f4
AD
175 /* The number of the rule in the source. It is usually the index in
176 RULES too, except if there are useless rules. */
7478c462 177 rule_number user_number;
d7e1f00c
AD
178
179 /* The index in RULES. Usually the rule number in the source,
180 except if some rules are useless. */
7478c462 181 rule_number number;
c3b407f4 182
7478c462
PE
183 symbol *lhs;
184 item_number *rhs;
03b31c0c
AD
185
186 /* This symbol provides both the associativity, and the precedence. */
7478c462 187 symbol *prec;
03b31c0c 188
f6fbd3da
PE
189 int dprec;
190 int merger;
676385e2 191
03b31c0c 192 /* This symbol was attached to the rule via %prec. */
7478c462 193 symbol *precsym;
03b31c0c 194
7478c462 195 location location;
68f1e3ed 196 bool useful;
f499b062 197
3f96f4dc 198 const char *action;
7478c462
PE
199 location action_location;
200} rule;
652a871c 201
7478c462 202extern rule *rules;
652a871c 203
c8f002c7 204/* A function that selects a rule. */
7478c462 205typedef bool (*rule_filter) (rule *);
c8f002c7
AD
206
207/* Return true IFF the rule has a `number' smaller than NRULES. */
7478c462 208bool rule_useful_p (rule *r);
c8f002c7
AD
209
210/* Return true IFF the rule has a `number' higher than NRULES. */
7478c462 211bool rule_useless_p (rule *r);
c8f002c7
AD
212
213/* Return true IFF the rule is not flagged as useful *and* is useful.
214 In other words, it was discarded because of conflicts. */
7478c462 215bool rule_never_reduced_p (rule *r);
c8f002c7 216
7478c462 217/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was
c8f002c7
AD
218 already displayed (by a previous call for another rule), avoid
219 useless repetitions. */
7478c462 220void rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out);
c8f002c7
AD
221
222/* Return the length of the RHS. */
7478c462 223int rule_rhs_length (rule *r);
c8f002c7 224
7478c462
PE
225/* Print this rule's RHS on OUT. */
226void rule_rhs_print (rule *r, FILE *out);
c8f002c7 227
7478c462
PE
228/* Print this rule on OUT. */
229void rule_print (rule *r, FILE *out);
c8f002c7
AD
230
231
232
233
0e78e603 234/* Table of the symbols, indexed by the symbol number. */
7478c462 235extern symbol **symbols;
0e78e603 236
680e8701
AD
237/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
238 by the user's yylex routine, it yields the internal token number
239 used by the parser and throughout bison. */
7478c462 240extern symbol_number *token_translations;
f7d4d87a
DM
241extern int max_user_token_number;
242
f7d4d87a 243
c8f002c7 244
3067fbef 245/* Dump RITEM for traces. */
d33cb3ae 246void ritem_print (FILE *out);
c2713865
AD
247
248/* Return the size of the longest rule RHS. */
d33cb3ae 249size_t ritem_longest_rhs (void);
c2713865 250
9757c359
AD
251/* Print the grammar's rules numbers from BEGIN (inclusive) to END
252 (exclusive) on OUT under TITLE. */
d33cb3ae 253void grammar_rules_partial_print (FILE *out, const char *title,
7478c462 254 rule_filter filter);
9757c359 255
6b98e4b5 256/* Print the grammar's rules on OUT. */
d33cb3ae 257void grammar_rules_print (FILE *out);
6b98e4b5 258
78ab8f67 259/* Dump the grammar. */
d33cb3ae 260void grammar_dump (FILE *out, const char *title);
78ab8f67 261
c8f002c7
AD
262/* Report on STDERR the rules that are not flagged USEFUL, using the
263 MESSAGE (which can be `useless rule' when invoked after grammar
264 reduction, or `never reduced' after conflicts were taken into
265 account). */
d33cb3ae 266void grammar_rules_never_reduced_report (const char *message);
c8f002c7 267
5372019f 268/* Free the packed grammar. */
d33cb3ae 269void grammar_free (void);
5372019f 270
b2ca4022 271#endif /* !GRAM_H_ */