]> git.saurik.com Git - bison.git/blame - src/symtab.h
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / symtab.h
CommitLineData
2cc6b612
PE
1/* Definitions for symtab.c and callers, part of Bison.
2
34136e65 3 Copyright (C) 1984, 1989, 1992, 2000-2002, 2004-2012 Free Software
575619af 4 Foundation, Inc.
f7d4d87a 5
340ef489 6 This file is part of Bison, the GNU Compiler Compiler.
f7d4d87a 7
f16b0819 8 This program is free software: you can redistribute it and/or modify
340ef489 9 it under the terms of the GNU General Public License as published by
f16b0819
PE
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
f7d4d87a 12
f16b0819 13 This program is distributed in the hope that it will be useful,
340ef489
AD
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
340ef489 18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
f7d4d87a 20
2073e1b6
AD
21/**
22 * \file symtab.h
23 * \brief Manipulating ::symbol.
24 */
25
340ef489
AD
26#ifndef SYMTAB_H_
27# define SYMTAB_H_
f7d4d87a 28
a945ec39 29# include "assoc.h"
7486e51b 30# include "location.h"
95021767 31# include "scan-code.h"
7486e51b 32# include "uniqstr.h"
8efe435c 33
2f1afb73
AD
34/*----------.
35| Symbols. |
36`----------*/
f7d4d87a 37
2073e1b6 38/** Symbol classes. */
d7020c20
AD
39typedef enum
40{
2073e1b6 41 unknown_sym, /**< Undefined. */
e9690142
JD
42 token_sym, /**< Terminal. */
43 nterm_sym /**< Non-terminal. */
d7020c20 44} symbol_class;
340ef489 45
b87f8b21 46
2073e1b6 47/** Internal token numbers. */
f6fbd3da
PE
48typedef int symbol_number;
49#define SYMBOL_NUMBER_MAXIMUM INT_MAX
5fbb0954 50
5fbb0954 51
7486e51b 52typedef struct symbol symbol;
df09ef2e 53
3b0b682f
AD
54/* Declaration status of a symbol.
55
56 First, it is "undeclared". Then, if "undeclared" and used in a
57 %printer/%destructor, it is "used". If not "declared" by used in a
58 rule, it is "needed". Finally, if declared (via a rule for
59 nonterminals, or %oken), it is "declared".
60
61 When status are checked at the end, "declared" symbols are fine,
62 "used" symbols trigger warnings, otherwise it's an error.
63*/
64
b921d92f
VS
65typedef enum
66 {
3b0b682f
AD
67 /** Used in the input file for an unknown reason (error). */
68 undeclared,
69 /** Used by %destructor/%printer but not defined (warning). */
70 used,
71 /** Used in the gramar (rules) but not defined (error). */
72 needed,
73 /** Defined with %type or %token (good). */
74 declared,
b921d92f
VS
75 } status;
76
71da68b3
VS
77typedef enum code_props_type code_props_type;
78enum code_props_type
79 {
80 destructor = 0,
81 printer = 1,
82 };
83
84enum { CODE_PROPS_SIZE = 2 };
85
df09ef2e
AD
86/* When extending this structure, be sure to complete
87 symbol_check_alias_consistency. */
7486e51b 88struct symbol
340ef489 89{
2073e1b6 90 /** The key, name of the symbol. */
7486e51b 91 uniqstr tag;
2073e1b6 92 /** The location of its first occurrence. */
7486e51b 93 location location;
1e0bab92 94
ec5479ce 95 /** Its \c \%type. */
7486e51b 96 uniqstr type_name;
ec5479ce 97 /** Its \c \%type's location. */
df09ef2e
AD
98 location type_location;
99
71da68b3
VS
100 /** Any \c \%destructor (resp. \%printer) declared specificially for this
101 symbol.
ec5479ce 102
71da68b3
VS
103 Access this field only through <tt>symbol</tt>'s interface functions. For
104 Example, if <tt>symbol::destructor = NULL</tt> (resp. <tt>symbol::printer
105 = NULL</tt>), a default \c \%destructor (resp. \%printer) or a per-type
106 \c symbol_destructor_printer_get will compute the corect one. */
107 code_props props[CODE_PROPS_SIZE];
ee000ba4 108
7486e51b 109 symbol_number number;
df09ef2e 110 location prec_location;
f6fbd3da 111 int prec;
7486e51b 112 assoc assoc;
62a3e4f0 113 int user_token_number;
3f96f4dc 114
dfaa4860
JD
115 /* Points to the other in the symbol-string pair for an alias.
116 Special value USER_NUMBER_HAS_STRING_ALIAS in the symbol half of the
117 symbol-string pair for an alias. */
7486e51b 118 symbol *alias;
d7020c20 119 symbol_class class;
b921d92f 120 status status;
db8837cb
AD
121};
122
2073e1b6 123/** Undefined user number. */
b87f8b21
AD
124#define USER_NUMBER_UNDEFINED -1
125
dfaa4860
JD
126/* `symbol->user_token_number == USER_NUMBER_HAS_STRING_ALIAS' means
127 this symbol has a literal string alias. For instance, `%token foo
b87f8b21 128 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
dfaa4860
JD
129 USER_NUMBER_HAS_STRING_ALIAS. */
130#define USER_NUMBER_HAS_STRING_ALIAS -9991
b87f8b21
AD
131
132/* Undefined internal token number. */
2cc6b612 133#define NUMBER_UNDEFINED (-1)
b87f8b21 134
2073e1b6 135/** Fetch (or create) the symbol associated to KEY. */
203b9274
AD
136symbol *symbol_from_uniqstr (const uniqstr key, location loc);
137
2073e1b6 138/** Fetch (or create) the symbol associated to KEY. */
7486e51b 139symbol *symbol_get (const char *key, location loc);
39f41916 140
2073e1b6
AD
141/** Generate a dummy nonterminal.
142
143 Its name cannot conflict with the user's names. */
7486e51b 144symbol *dummy_symbol_get (location loc);
2f1afb73 145
aea10ef4
AD
146
147/*--------------------.
148| Methods on symbol. |
149`--------------------*/
150
151/** Print a symbol (for debugging). */
152void symbol_print (symbol *s, FILE *f);
153
4d7370cb
JD
154/** Is this a dummy nonterminal? */
155bool symbol_is_dummy (const symbol *sym);
156
6a0655d9
AD
157/** The name of the code_props type: "\%destructor" or "\%printer". */
158char const *code_props_type_string (code_props_type kind);
159
160/** The name of the symbol that can be used as an identifier.
aea10ef4
AD
161 ** Consider the alias if needed.
162 ** Return 0 if there is none (e.g., the symbol is only defined as
163 ** a string). */
164uniqstr symbol_id_get (symbol const *sym);
165
dfaa4860
JD
166/**
167 * Make \c str the literal string alias of \c sym. Copy token number,
168 * symbol number, and type from \c sym to \c str.
169 */
170void symbol_make_alias (symbol *sym, symbol *str, location loc);
2f1afb73 171
2073e1b6
AD
172/** Set the \c type_name associated with \c sym.
173
174 Do nothing if passed 0 as \c type_name. */
7486e51b 175void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 176
71da68b3
VS
177/** Set the \c \%destructor or \c \%printer associated with \c sym. */
178void symbol_code_props_set (symbol *sym, code_props_type kind,
179 code_props const *destructor);
db06f0ce 180
71da68b3
VS
181/** Get the computed \c \%destructor or \c %printer for \c sym, which was
182initialized with \c code_props_none_init if there's no \c \%destructor or
183\c %printer. */
184code_props const *symbol_code_props_get (symbol const *sym,
185 code_props_type kind);
ec5479ce 186
2073e1b6
AD
187/* Set the \c precedence associated with \c sym.
188
189 Ensure that \a symbol is a terminal.
190 Do nothing if invoked with \c undef_assoc as \c assoc. */
7486e51b 191void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 192
2073e1b6 193/** Set the \c class associated with \c sym. */
073f9288 194void symbol_class_set (symbol *sym, symbol_class class, location loc,
e9690142 195 bool declaring);
44536b35 196
2073e1b6 197/** Set the \c user_token_number associated with \c sym. */
7486e51b 198void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
199
200
aea10ef4
AD
201
202/*------------------.
203| Special symbols. |
204`------------------*/
205
2073e1b6 206/** The error token. */
7486e51b 207extern symbol *errtoken;
2073e1b6 208/** The token for unknown tokens. */
7486e51b 209extern symbol *undeftoken;
2073e1b6 210/** The end of input token. */
7486e51b 211extern symbol *endtoken;
2073e1b6
AD
212/** The genuine start symbol.
213
214 $accept: start-symbol $end */
7486e51b 215extern symbol *accept;
2073e1b6
AD
216
217/** The user start symbol. */
7486e51b 218extern symbol *startsymbol;
ec5479ce 219/** The location of the \c \%start declaration. */
7486e51b 220extern location startsymbol_location;
f7d4d87a 221
340ef489 222
b2a0b7ca
JD
223/*-----------------.
224| Semantic types. |
225`-----------------*/
226
227/** A semantic type and its associated \c \%destructor and \c \%printer.
db06f0ce 228
b2a0b7ca
JD
229 Access the fields of this struct only through the interface functions in
230 this file. \sa symbol::destructor */
db06f0ce 231typedef struct {
b2a0b7ca
JD
232 /** The key, name of the semantic type. */
233 uniqstr tag;
234
9641b918
VS
235 /** The location of its first occurence. */
236 location location;
237
238 /** Its status : "undeclared", "used" or "declared".
239 It cannot be "needed". */
240 status status;
241
71da68b3
VS
242 /** Any \c %destructor and %printer declared for this
243 semantic type. */
244 code_props props[CODE_PROPS_SIZE];
245
b2a0b7ca
JD
246} semantic_type;
247
248/** Fetch (or create) the semantic type associated to KEY. */
9641b918
VS
249semantic_type *semantic_type_from_uniqstr (const uniqstr key,
250 const location *loc);
b2a0b7ca
JD
251
252/** Fetch (or create) the semantic type associated to KEY. */
9641b918 253semantic_type *semantic_type_get (const char *key, const location *loc);
b2a0b7ca 254
71da68b3
VS
255/** Set the \c destructor or \c printer associated with \c type. */
256void semantic_type_code_props_set (semantic_type *type,
257 code_props_type kind,
258 code_props const *code);
2f1afb73 259
b2a0b7ca
JD
260/*----------------------------------.
261| Symbol and semantic type tables. |
262`----------------------------------*/
2f1afb73 263
b2a0b7ca 264/** Create the symbol and semantic type tables. */
d33cb3ae 265void symbols_new (void);
2f1afb73 266
b2a0b7ca 267/** Free all the memory allocated for symbols and semantic types. */
d33cb3ae 268void symbols_free (void);
340ef489 269
2073e1b6
AD
270/** Check that all the symbols are defined.
271
272 Report any undefined symbols and consider them nonterminals. */
d33cb3ae 273void symbols_check_defined (void);
2f1afb73 274
2073e1b6
AD
275/** Sanity checks and #token_translations construction.
276
277 Perform various sanity checks, assign symbol numbers, and set up
278 #token_translations. */
d33cb3ae 279void symbols_pack (void);
2f1afb73 280
ec5479ce 281
12e35840
JD
282/*---------------------------------------.
283| Default %destructor's and %printer's. |
284`---------------------------------------*/
ec5479ce 285
71da68b3
VS
286/** Set the default \c \%destructor or \c \%printer for tagged values. */
287void default_tagged_code_props_set (code_props_type kind,
288 code_props const *code);
289/** Set the default \c \%destructor or \c \%printer for tagless values. */
290void default_tagless_code_props_set (code_props_type kind,
291 code_props const *destructor);
ec5479ce 292
340ef489 293#endif /* !SYMTAB_H_ */