]> git.saurik.com Git - bison.git/blame - src/symtab.h
maint: address syntax-check issues.
[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
df09ef2e
AD
77/* When extending this structure, be sure to complete
78 symbol_check_alias_consistency. */
7486e51b 79struct symbol
340ef489 80{
2073e1b6 81 /** The key, name of the symbol. */
7486e51b 82 uniqstr tag;
2073e1b6 83 /** The location of its first occurrence. */
7486e51b 84 location location;
1e0bab92 85
ec5479ce 86 /** Its \c \%type. */
7486e51b 87 uniqstr type_name;
ec5479ce 88 /** Its \c \%type's location. */
df09ef2e
AD
89 location type_location;
90
ec5479ce
JD
91 /** Any \c \%destructor declared specifically for this symbol.
92
93 Access this field only through <tt>symbol</tt>'s interface functions. For
12e35840
JD
94 example, if <tt>symbol::destructor = NULL</tt>, a default \c \%destructor
95 or a per-type \c \%destructor might be appropriate, and
ec5479ce 96 \c symbol_destructor_get will compute the correct one. */
95021767 97 code_props destructor;
df09ef2e 98
ec5479ce
JD
99 /** Any \c \%printer declared specifically for this symbol.
100
101 Access this field only through <tt>symbol</tt>'s interface functions.
102 \sa symbol::destructor */
95021767 103 code_props printer;
ee000ba4 104
7486e51b 105 symbol_number number;
df09ef2e 106 location prec_location;
f6fbd3da 107 int prec;
7486e51b 108 assoc assoc;
62a3e4f0 109 int user_token_number;
3f96f4dc 110
dfaa4860
JD
111 /* Points to the other in the symbol-string pair for an alias.
112 Special value USER_NUMBER_HAS_STRING_ALIAS in the symbol half of the
113 symbol-string pair for an alias. */
7486e51b 114 symbol *alias;
d7020c20 115 symbol_class class;
b921d92f 116 status status;
db8837cb
AD
117};
118
2073e1b6 119/** Undefined user number. */
b87f8b21
AD
120#define USER_NUMBER_UNDEFINED -1
121
dfaa4860
JD
122/* `symbol->user_token_number == USER_NUMBER_HAS_STRING_ALIAS' means
123 this symbol has a literal string alias. For instance, `%token foo
b87f8b21 124 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
dfaa4860
JD
125 USER_NUMBER_HAS_STRING_ALIAS. */
126#define USER_NUMBER_HAS_STRING_ALIAS -9991
b87f8b21
AD
127
128/* Undefined internal token number. */
2cc6b612 129#define NUMBER_UNDEFINED (-1)
b87f8b21 130
2073e1b6 131/** Fetch (or create) the symbol associated to KEY. */
203b9274
AD
132symbol *symbol_from_uniqstr (const uniqstr key, location loc);
133
2073e1b6 134/** Fetch (or create) the symbol associated to KEY. */
7486e51b 135symbol *symbol_get (const char *key, location loc);
39f41916 136
2073e1b6
AD
137/** Generate a dummy nonterminal.
138
139 Its name cannot conflict with the user's names. */
7486e51b 140symbol *dummy_symbol_get (location loc);
2f1afb73 141
aea10ef4
AD
142
143/*--------------------.
144| Methods on symbol. |
145`--------------------*/
146
147/** Print a symbol (for debugging). */
148void symbol_print (symbol *s, FILE *f);
149
4d7370cb
JD
150/** Is this a dummy nonterminal? */
151bool symbol_is_dummy (const symbol *sym);
152
aea10ef4
AD
153/** Return the name of the symbol that can be used as an identifier.
154 ** Consider the alias if needed.
155 ** Return 0 if there is none (e.g., the symbol is only defined as
156 ** a string). */
157uniqstr symbol_id_get (symbol const *sym);
158
dfaa4860
JD
159/**
160 * Make \c str the literal string alias of \c sym. Copy token number,
161 * symbol number, and type from \c sym to \c str.
162 */
163void symbol_make_alias (symbol *sym, symbol *str, location loc);
2f1afb73 164
2073e1b6
AD
165/** Set the \c type_name associated with \c sym.
166
167 Do nothing if passed 0 as \c type_name. */
7486e51b 168void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 169
2073e1b6 170/** Set the \c destructor associated with \c sym. */
95021767 171void symbol_destructor_set (symbol *sym, code_props const *destructor);
db06f0ce 172
95021767
JD
173/** Get the computed \c \%destructor for \c sym, which was initialized with
174 \c code_props_none_init if there's no \c \%destructor. */
175code_props const *symbol_destructor_get (symbol const *sym);
ec5479ce 176
2073e1b6 177/** Set the \c printer associated with \c sym. */
95021767 178void symbol_printer_set (symbol *sym, code_props const *printer);
366eea36 179
95021767
JD
180/** Get the computed \c \%printer for \c sym, which was initialized with
181 \c code_props_none_init if there's no \c \%printer. */
182code_props const *symbol_printer_get (symbol const *sym);
ec5479ce 183
2073e1b6
AD
184/* Set the \c precedence associated with \c sym.
185
186 Ensure that \a symbol is a terminal.
187 Do nothing if invoked with \c undef_assoc as \c assoc. */
7486e51b 188void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 189
2073e1b6 190/** Set the \c class associated with \c sym. */
073f9288 191void symbol_class_set (symbol *sym, symbol_class class, location loc,
e9690142 192 bool declaring);
44536b35 193
2073e1b6 194/** Set the \c user_token_number associated with \c sym. */
7486e51b 195void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
196
197
aea10ef4
AD
198
199/*------------------.
200| Special symbols. |
201`------------------*/
202
2073e1b6 203/** The error token. */
7486e51b 204extern symbol *errtoken;
2073e1b6 205/** The token for unknown tokens. */
7486e51b 206extern symbol *undeftoken;
2073e1b6 207/** The end of input token. */
7486e51b 208extern symbol *endtoken;
2073e1b6
AD
209/** The genuine start symbol.
210
211 $accept: start-symbol $end */
7486e51b 212extern symbol *accept;
2073e1b6
AD
213
214/** The user start symbol. */
7486e51b 215extern symbol *startsymbol;
ec5479ce 216/** The location of the \c \%start declaration. */
7486e51b 217extern location startsymbol_location;
f7d4d87a 218
340ef489 219
b2a0b7ca
JD
220/*-----------------.
221| Semantic types. |
222`-----------------*/
223
224/** A semantic type and its associated \c \%destructor and \c \%printer.
db06f0ce 225
b2a0b7ca
JD
226 Access the fields of this struct only through the interface functions in
227 this file. \sa symbol::destructor */
db06f0ce 228typedef struct {
b2a0b7ca
JD
229 /** The key, name of the semantic type. */
230 uniqstr tag;
231
232 /** Any \c %destructor declared for this semantic type. */
95021767 233 code_props destructor;
b2a0b7ca 234 /** Any \c %printer declared for this semantic type. */
95021767 235 code_props printer;
b2a0b7ca
JD
236} semantic_type;
237
238/** Fetch (or create) the semantic type associated to KEY. */
239semantic_type *semantic_type_from_uniqstr (const uniqstr key);
240
241/** Fetch (or create) the semantic type associated to KEY. */
242semantic_type *semantic_type_get (const char *key);
243
244/** Set the \c destructor associated with \c type. */
95021767
JD
245void semantic_type_destructor_set (semantic_type *type,
246 code_props const *destructor);
b2a0b7ca
JD
247
248/** Set the \c printer associated with \c type. */
95021767
JD
249void semantic_type_printer_set (semantic_type *type,
250 code_props const *printer);
2f1afb73 251
b2a0b7ca
JD
252/*----------------------------------.
253| Symbol and semantic type tables. |
254`----------------------------------*/
2f1afb73 255
b2a0b7ca 256/** Create the symbol and semantic type tables. */
d33cb3ae 257void symbols_new (void);
2f1afb73 258
b2a0b7ca 259/** Free all the memory allocated for symbols and semantic types. */
d33cb3ae 260void symbols_free (void);
340ef489 261
2073e1b6
AD
262/** Check that all the symbols are defined.
263
264 Report any undefined symbols and consider them nonterminals. */
d33cb3ae 265void symbols_check_defined (void);
2f1afb73 266
2073e1b6
AD
267/** Sanity checks and #token_translations construction.
268
269 Perform various sanity checks, assign symbol numbers, and set up
270 #token_translations. */
d33cb3ae 271void symbols_pack (void);
2f1afb73 272
ec5479ce 273
12e35840
JD
274/*---------------------------------------.
275| Default %destructor's and %printer's. |
276`---------------------------------------*/
ec5479ce 277
12e35840 278/** Set the default \c \%destructor for tagged values. */
95021767 279void default_tagged_destructor_set (code_props const *destructor);
12e35840 280/** Set the default \c \%destructor for tagless values. */
95021767 281void default_tagless_destructor_set (code_props const *destructor);
ec5479ce 282
12e35840 283/** Set the default \c \%printer for tagged values. */
95021767 284void default_tagged_printer_set (code_props const *printer);
12e35840 285/** Set the default \c \%printer for tagless values. */
95021767 286void default_tagless_printer_set (code_props const *printer);
ec5479ce 287
340ef489 288#endif /* !SYMTAB_H_ */