]> git.saurik.com Git - bison.git/blame - src/symtab.h
* src/symlist.c (symbol_list_length): Return int, not unsigned
[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
2073e1b6 64 /** Its %type and associated printer and destructor. */
7486e51b 65 uniqstr type_name;
df09ef2e
AD
66 location type_location;
67
2073e1b6 68 /** Does not own the memory. */
c1432f65 69 const char *destructor;
7486e51b 70 location destructor_location;
df09ef2e 71
2073e1b6 72 /** Printer. */
c1432f65 73 const char *printer;
7486e51b 74 location printer_location;
ee000ba4 75
7486e51b 76 symbol_number number;
df09ef2e 77 location prec_location;
f6fbd3da 78 int prec;
7486e51b 79 assoc assoc;
62a3e4f0 80 int user_token_number;
3f96f4dc 81
b87f8b21
AD
82 /* Points to the other in the identifier-symbol pair for an alias.
83 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 84 identifier-symbol pair for an alias. */
7486e51b 85 symbol *alias;
d7020c20 86 symbol_class class;
073f9288 87 bool declared;
db8837cb
AD
88};
89
2073e1b6
AD
90
91/** Undefined user number. */
b87f8b21
AD
92#define USER_NUMBER_UNDEFINED -1
93
94/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
95 *has* (not is) a string literal alias. For instance, `%token foo
96 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
97 USER_NUMBER_ALIAS. */
98#define USER_NUMBER_ALIAS -9991
99
100/* Undefined internal token number. */
2cc6b612 101#define NUMBER_UNDEFINED (-1)
b87f8b21 102
2073e1b6 103/** Print a symbol (for debugging). */
22dda0f0 104void symbol_print (symbol *s, FILE *f);
f7d4d87a 105
2073e1b6 106/** Fetch (or create) the symbol associated to KEY. */
203b9274
AD
107symbol *symbol_from_uniqstr (const uniqstr key, location loc);
108
2073e1b6 109/** Fetch (or create) the symbol associated to KEY. */
7486e51b 110symbol *symbol_get (const char *key, location loc);
39f41916 111
2073e1b6
AD
112/** Generate a dummy nonterminal.
113
114 Its name cannot conflict with the user's names. */
7486e51b 115symbol *dummy_symbol_get (location loc);
2f1afb73 116
2073e1b6 117/** Declare the new symbol \c sym. Make it an alias of \c symval. */
7486e51b 118void symbol_make_alias (symbol *sym, symbol *symval, location loc);
2f1afb73 119
2073e1b6
AD
120/** Set the \c type_name associated with \c sym.
121
122 Do nothing if passed 0 as \c type_name. */
7486e51b 123void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 124
2073e1b6 125/** Set the \c destructor associated with \c sym. */
c1432f65 126void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
9280d3ef 127
2073e1b6 128/** Set the \c printer associated with \c sym. */
c1432f65 129void symbol_printer_set (symbol *sym, const char *printer, location loc);
366eea36 130
2073e1b6
AD
131/* Set the \c precedence associated with \c sym.
132
133 Ensure that \a symbol is a terminal.
134 Do nothing if invoked with \c undef_assoc as \c assoc. */
7486e51b 135void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 136
2073e1b6 137/** Set the \c class associated with \c sym. */
073f9288
PE
138void symbol_class_set (symbol *sym, symbol_class class, location loc,
139 bool declaring);
44536b35 140
2073e1b6 141/** Set the \c user_token_number associated with \c sym. */
7486e51b 142void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
143
144
2073e1b6 145/** The error token. */
7486e51b 146extern symbol *errtoken;
2073e1b6 147/** The token for unknown tokens. */
7486e51b 148extern symbol *undeftoken;
2073e1b6 149/** The end of input token. */
7486e51b 150extern symbol *endtoken;
2073e1b6
AD
151/** The genuine start symbol.
152
153 $accept: start-symbol $end */
7486e51b 154extern symbol *accept;
2073e1b6
AD
155
156/** The user start symbol. */
7486e51b 157extern symbol *startsymbol;
2073e1b6 158/** The location of the \c %start declaration. */
7486e51b 159extern location startsymbol_location;
f7d4d87a 160
340ef489 161
2f1afb73
AD
162/*---------------.
163| Symbol table. |
164`---------------*/
165
166
2073e1b6 167/** Create the symbol table. */
d33cb3ae 168void symbols_new (void);
2f1afb73 169
2073e1b6 170/** Free all the memory allocated for symbols. */
d33cb3ae 171void symbols_free (void);
340ef489 172
2073e1b6
AD
173/** Check that all the symbols are defined.
174
175 Report any undefined symbols and consider them nonterminals. */
d33cb3ae 176void symbols_check_defined (void);
2f1afb73 177
2073e1b6
AD
178/** Sanity checks and #token_translations construction.
179
180 Perform various sanity checks, assign symbol numbers, and set up
181 #token_translations. */
d33cb3ae 182void symbols_pack (void);
2f1afb73 183
340ef489 184#endif /* !SYMTAB_H_ */