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