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