]> git.saurik.com Git - bison.git/blame - src/symtab.h
Use some of gnulib's new modules, taken from coreutils.
[bison.git] / src / symtab.h
CommitLineData
2cc6b612
PE
1/* Definitions for symtab.c and callers, part of Bison.
2
073f9288 3 Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006
03b31c0c 4 Free Software Foundation, Inc.
f7d4d87a 5
340ef489 6 This file is part of Bison, the GNU Compiler Compiler.
f7d4d87a 7
340ef489
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
340ef489
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
340ef489
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
2073e1b6
AD
23/**
24 * \file symtab.h
25 * \brief Manipulating ::symbol.
26 */
27
340ef489
AD
28#ifndef SYMTAB_H_
29# define SYMTAB_H_
f7d4d87a 30
a945ec39 31# include "assoc.h"
7486e51b
PE
32# include "location.h"
33# include "uniqstr.h"
8efe435c 34
2f1afb73
AD
35/*----------.
36| Symbols. |
37`----------*/
f7d4d87a 38
2073e1b6 39/** Symbol classes. */
d7020c20
AD
40typedef enum
41{
2073e1b6
AD
42 unknown_sym, /**< Undefined. */
43 token_sym, /**< Terminal. */
44 nterm_sym /**< Non-terminal. */
d7020c20 45} symbol_class;
340ef489 46
b87f8b21 47
2073e1b6 48/** Internal token numbers. */
f6fbd3da
PE
49typedef int symbol_number;
50#define SYMBOL_NUMBER_MAXIMUM INT_MAX
5fbb0954 51
5fbb0954 52
7486e51b 53typedef struct symbol symbol;
df09ef2e
AD
54
55/* When extending this structure, be sure to complete
56 symbol_check_alias_consistency. */
7486e51b 57struct symbol
340ef489 58{
2073e1b6 59 /** The key, name of the symbol. */
7486e51b 60 uniqstr tag;
2073e1b6 61 /** The location of its first occurrence. */
7486e51b 62 location location;
1e0bab92 63
ec5479ce 64 /** Its \c \%type. */
7486e51b 65 uniqstr type_name;
ec5479ce 66 /** Its \c \%type's location. */
df09ef2e
AD
67 location type_location;
68
ec5479ce
JD
69 /** Any \c \%destructor declared specifically for this symbol.
70
71 Access this field only through <tt>symbol</tt>'s interface functions. For
72 example, if <tt>symbol::destructor = NULL</tt>, the default
73 \c \%destructor or a per-type \c \%destructor might be appropriate, and
74 \c symbol_destructor_get will compute the correct one. */
c1432f65 75 const char *destructor;
ec5479ce
JD
76
77 /** The location of \c symbol::destructor.
78
79 Access this field only through <tt>symbol</tt>'s interface functions.
80 \sa symbol::destructor */
7486e51b 81 location destructor_location;
df09ef2e 82
ec5479ce
JD
83 /** Any \c \%printer declared specifically for this symbol.
84
85 Access this field only through <tt>symbol</tt>'s interface functions.
86 \sa symbol::destructor */
c1432f65 87 const char *printer;
ec5479ce
JD
88
89 /** The location of \c symbol::printer.
90
91 Access this field only through <tt>symbol</tt>'s interface functions.
92 \sa symbol::destructor */
7486e51b 93 location printer_location;
ee000ba4 94
7486e51b 95 symbol_number number;
df09ef2e 96 location prec_location;
f6fbd3da 97 int prec;
7486e51b 98 assoc assoc;
62a3e4f0 99 int user_token_number;
3f96f4dc 100
b87f8b21
AD
101 /* Points to the other in the identifier-symbol pair for an alias.
102 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 103 identifier-symbol pair for an alias. */
7486e51b 104 symbol *alias;
d7020c20 105 symbol_class class;
073f9288 106 bool declared;
db8837cb
AD
107};
108
2073e1b6 109/** Undefined user number. */
b87f8b21
AD
110#define USER_NUMBER_UNDEFINED -1
111
112/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
113 *has* (not is) a string literal alias. For instance, `%token foo
114 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
115 USER_NUMBER_ALIAS. */
116#define USER_NUMBER_ALIAS -9991
117
118/* Undefined internal token number. */
2cc6b612 119#define NUMBER_UNDEFINED (-1)
b87f8b21 120
2073e1b6 121/** Print a symbol (for debugging). */
22dda0f0 122void symbol_print (symbol *s, FILE *f);
f7d4d87a 123
2073e1b6 124/** Fetch (or create) the symbol associated to KEY. */
203b9274
AD
125symbol *symbol_from_uniqstr (const uniqstr key, location loc);
126
2073e1b6 127/** Fetch (or create) the symbol associated to KEY. */
7486e51b 128symbol *symbol_get (const char *key, location loc);
39f41916 129
2073e1b6
AD
130/** Generate a dummy nonterminal.
131
132 Its name cannot conflict with the user's names. */
7486e51b 133symbol *dummy_symbol_get (location loc);
2f1afb73 134
4d7370cb
JD
135/** Is this a dummy nonterminal? */
136bool symbol_is_dummy (const symbol *sym);
137
2073e1b6 138/** Declare the new symbol \c sym. Make it an alias of \c symval. */
7486e51b 139void symbol_make_alias (symbol *sym, symbol *symval, location loc);
2f1afb73 140
2073e1b6
AD
141/** Set the \c type_name associated with \c sym.
142
143 Do nothing if passed 0 as \c type_name. */
7486e51b 144void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 145
2073e1b6 146/** Set the \c destructor associated with \c sym. */
c1432f65 147void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
9280d3ef 148
ec5479ce
JD
149/** Get the computed \c \%destructor for \c sym, or \c NULL if none. */
150const char *symbol_destructor_get (symbol *sym);
151
152/** Get the grammar location of the computed \c \%destructor for \c sym.
153
154 \pre <tt>symbol_destructor_get (sym) != NULL</tt> */
155location symbol_destructor_location_get (symbol *sym);
156
2073e1b6 157/** Set the \c printer associated with \c sym. */
c1432f65 158void symbol_printer_set (symbol *sym, const char *printer, location loc);
366eea36 159
ec5479ce
JD
160/** Get the computed \c \%printer for \c sym, or \c NULL if none. */
161const char *symbol_printer_get (symbol *sym);
162
163/** Get the grammar location of the computed \c \%printer for \c sym.
164
165 \pre <tt>symbol_printer_get (sym) != NULL</tt> */
166location symbol_printer_location_get (symbol *sym);
167
2073e1b6
AD
168/* Set the \c precedence associated with \c sym.
169
170 Ensure that \a symbol is a terminal.
171 Do nothing if invoked with \c undef_assoc as \c assoc. */
7486e51b 172void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 173
2073e1b6 174/** Set the \c class associated with \c sym. */
073f9288
PE
175void symbol_class_set (symbol *sym, symbol_class class, location loc,
176 bool declaring);
44536b35 177
2073e1b6 178/** Set the \c user_token_number associated with \c sym. */
7486e51b 179void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
180
181
2073e1b6 182/** The error token. */
7486e51b 183extern symbol *errtoken;
2073e1b6 184/** The token for unknown tokens. */
7486e51b 185extern symbol *undeftoken;
2073e1b6 186/** The end of input token. */
7486e51b 187extern symbol *endtoken;
2073e1b6
AD
188/** The genuine start symbol.
189
190 $accept: start-symbol $end */
7486e51b 191extern symbol *accept;
2073e1b6
AD
192
193/** The user start symbol. */
7486e51b 194extern symbol *startsymbol;
ec5479ce 195/** The location of the \c \%start declaration. */
7486e51b 196extern location startsymbol_location;
f7d4d87a 197
340ef489 198
b2a0b7ca
JD
199/*-----------------.
200| Semantic types. |
201`-----------------*/
202
203/** A semantic type and its associated \c \%destructor and \c \%printer.
204
205 Access the fields of this struct only through the interface functions in
206 this file. \sa symbol::destructor */
207typedef struct semantic_type {
208 /** The key, name of the semantic type. */
209 uniqstr tag;
210
211 /** Any \c %destructor declared for this semantic type. */
212 const char *destructor;
213 /** The location of \c semantic_type::destructor. */
214 location destructor_location;
215
216 /** Any \c %printer declared for this semantic type. */
217 const char *printer;
218 /** The location of \c semantic_type::printer. */
219 location printer_location;
220} semantic_type;
221
222/** Fetch (or create) the semantic type associated to KEY. */
223semantic_type *semantic_type_from_uniqstr (const uniqstr key);
224
225/** Fetch (or create) the semantic type associated to KEY. */
226semantic_type *semantic_type_get (const char *key);
227
228/** Set the \c destructor associated with \c type. */
229void semantic_type_destructor_set (semantic_type *type, const char *destructor,
230 location loc);
231
232/** Set the \c printer associated with \c type. */
233void semantic_type_printer_set (semantic_type *type, const char *printer,
234 location loc);
2f1afb73 235
b2a0b7ca
JD
236/*----------------------------------.
237| Symbol and semantic type tables. |
238`----------------------------------*/
2f1afb73 239
b2a0b7ca 240/** Create the symbol and semantic type tables. */
d33cb3ae 241void symbols_new (void);
2f1afb73 242
b2a0b7ca 243/** Free all the memory allocated for symbols and semantic types. */
d33cb3ae 244void symbols_free (void);
340ef489 245
2073e1b6
AD
246/** Check that all the symbols are defined.
247
248 Report any undefined symbols and consider them nonterminals. */
d33cb3ae 249void symbols_check_defined (void);
2f1afb73 250
2073e1b6
AD
251/** Sanity checks and #token_translations construction.
252
253 Perform various sanity checks, assign symbol numbers, and set up
254 #token_translations. */
d33cb3ae 255void symbols_pack (void);
2f1afb73 256
ec5479ce
JD
257
258/*-----------------------------------.
259| Default %destructor and %printer. |
260`-----------------------------------*/
261
262/** Set the default \c \%destructor. */
263void default_destructor_set (const char *destructor, location loc);
264
265/** Set the default \c \%printer. */
266void default_printer_set (const char *printer, location loc);
267
340ef489 268#endif /* !SYMTAB_H_ */