]> git.saurik.com Git - bison.git/blame - src/gram.h
* tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error
[bison.git] / src / gram.h
CommitLineData
e46cedb9
PE
1/* Data definitions for internal representation of Bison's input.
2
ba24760f 3 Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003
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
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
7478c462
PE
141/* Rule numbers. */
142typedef short rule_number;
143extern rule_number nrules;
e46cedb9
PE
144
145static inline item_number
146rule_number_as_item_number (rule_number r)
147{
148 return -1 - r;
149}
150
151static inline rule_number
152item_number_as_rule_number (item_number i)
153{
154 return -1 - i;
155}
9222837b
AD
156
157
158/*--------.
159| Rules. |
160`--------*/
62a3e4f0 161
7478c462 162typedef struct
652a871c 163{
c3b407f4
AD
164 /* The number of the rule in the source. It is usually the index in
165 RULES too, except if there are useless rules. */
7478c462 166 rule_number user_number;
d7e1f00c
AD
167
168 /* The index in RULES. Usually the rule number in the source,
169 except if some rules are useless. */
7478c462 170 rule_number number;
c3b407f4 171
7478c462
PE
172 symbol *lhs;
173 item_number *rhs;
03b31c0c
AD
174
175 /* This symbol provides both the associativity, and the precedence. */
7478c462 176 symbol *prec;
03b31c0c 177
676385e2
PH
178 short dprec;
179 short merger;
180
03b31c0c 181 /* This symbol was attached to the rule via %prec. */
7478c462 182 symbol *precsym;
03b31c0c 183
7478c462 184 location location;
68f1e3ed 185 bool useful;
f499b062 186
3f96f4dc 187 const char *action;
7478c462
PE
188 location action_location;
189} rule;
652a871c 190
7478c462 191extern rule *rules;
652a871c 192
c8f002c7 193/* A function that selects a rule. */
7478c462 194typedef bool (*rule_filter) (rule *);
c8f002c7
AD
195
196/* Return true IFF the rule has a `number' smaller than NRULES. */
7478c462 197bool rule_useful_p (rule *r);
c8f002c7
AD
198
199/* Return true IFF the rule has a `number' higher than NRULES. */
7478c462 200bool rule_useless_p (rule *r);
c8f002c7
AD
201
202/* Return true IFF the rule is not flagged as useful *and* is useful.
203 In other words, it was discarded because of conflicts. */
7478c462 204bool rule_never_reduced_p (rule *r);
c8f002c7 205
7478c462 206/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was
c8f002c7
AD
207 already displayed (by a previous call for another rule), avoid
208 useless repetitions. */
7478c462 209void rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out);
c8f002c7
AD
210
211/* Return the length of the RHS. */
7478c462 212int rule_rhs_length (rule *r);
c8f002c7 213
7478c462
PE
214/* Print this rule's RHS on OUT. */
215void rule_rhs_print (rule *r, FILE *out);
c8f002c7 216
7478c462
PE
217/* Print this rule on OUT. */
218void rule_print (rule *r, FILE *out);
c8f002c7
AD
219
220
221
222
0e78e603 223/* Table of the symbols, indexed by the symbol number. */
7478c462 224extern symbol **symbols;
0e78e603 225
680e8701
AD
226/* TOKEN_TRANSLATION -- a table indexed by a token number as returned
227 by the user's yylex routine, it yields the internal token number
228 used by the parser and throughout bison. */
7478c462 229extern symbol_number *token_translations;
f7d4d87a
DM
230extern int max_user_token_number;
231
f7d4d87a 232
c8f002c7 233
676385e2
PH
234/* GLR_PARSER is nonzero if the input file says to use the GLR
235 (Generalized LR) parser, and to output some additional
236 information used by the GLR algorithm. */
237
238extern int glr_parser;
239
b2ca4022
AD
240/* PURE_PARSER is nonzero if should generate a parser that is all pure
241 and reentrant. */
f7d4d87a
DM
242
243extern int pure_parser;
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_ */