]> git.saurik.com Git - bison.git/blame - src/symtab.h
Undo XFREE change; we assume C89 compiler, not C89 library.
[bison.git] / src / symtab.h
CommitLineData
f7d4d87a 1/* Definitions for symtab.c and callers, part of bison,
03b31c0c
AD
2 Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
f7d4d87a 4
340ef489 5 This file is part of Bison, the GNU Compiler Compiler.
f7d4d87a 6
340ef489
AD
7 Bison is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
f7d4d87a 11
340ef489
AD
12 Bison is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
f7d4d87a 16
340ef489
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
f7d4d87a 21
340ef489
AD
22#ifndef SYMTAB_H_
23# define SYMTAB_H_
f7d4d87a 24
a945ec39 25# include "assoc.h"
7486e51b
PE
26# include "location.h"
27# include "uniqstr.h"
8efe435c 28
2f1afb73
AD
29/*----------.
30| Symbols. |
31`----------*/
f7d4d87a 32
bba97eb2 33/* Symbol classes. */
d7020c20
AD
34typedef enum
35{
36 unknown_sym,
37 token_sym, /* terminal symbol */
38 nterm_sym /* non-terminal */
39} symbol_class;
340ef489 40
b87f8b21 41
007a50a4 42/* Internal token numbers. */
7486e51b
PE
43typedef short symbol_number;
44#define SYMBOL_NUMBER_MAXIMUM SHRT_MAX
5fbb0954 45
5fbb0954 46
7486e51b
PE
47typedef struct symbol symbol;
48struct symbol
340ef489 49{
1e0bab92 50 /* The key, name of the symbol. */
7486e51b
PE
51 uniqstr tag;
52 /* The location of its first occurrence. */
53 location location;
1e0bab92 54
366eea36 55 /* Its %type and associated printer and destructor. */
7486e51b 56 uniqstr type_name;
9280d3ef 57 char *destructor;
7486e51b 58 location destructor_location;
366eea36 59 char *printer;
7486e51b 60 location printer_location;
ee000ba4 61
7486e51b 62 symbol_number number;
340ef489 63 short prec;
7486e51b 64 assoc assoc;
62a3e4f0 65 int user_token_number;
3f96f4dc 66
b87f8b21
AD
67 /* Points to the other in the identifier-symbol pair for an alias.
68 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 69 identifier-symbol pair for an alias. */
7486e51b 70 symbol *alias;
d7020c20 71 symbol_class class;
db8837cb
AD
72};
73
b87f8b21
AD
74/* Undefined user number. */
75#define USER_NUMBER_UNDEFINED -1
76
77/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
78 *has* (not is) a string literal alias. For instance, `%token foo
79 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
80 USER_NUMBER_ALIAS. */
81#define USER_NUMBER_ALIAS -9991
82
83/* Undefined internal token number. */
7486e51b 84#define NUMBER_UNDEFINED ((symbol_number) -1)
b87f8b21 85
f7d4d87a 86
2f1afb73 87/* Fetch (or create) the symbol associated to KEY. */
7486e51b 88symbol *symbol_get (const char *key, location loc);
39f41916
AD
89
90/* Generate a dummy nonterminal, whose name cannot conflict with the
91 user's names. */
7486e51b 92symbol *dummy_symbol_get (location loc);
2f1afb73 93
7486e51b
PE
94/* Declare the new symbol SYM. Make it an alias of SYMVAL. */
95void symbol_make_alias (symbol *sym, symbol *symval, location loc);
2f1afb73 96
7486e51b 97/* Set the TYPE_NAME associated with SYM. Do nothing if passed 0 as
e9955c83 98 TYPE_NAME. */
7486e51b 99void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 100
7486e51b
PE
101/* Set the DESTRUCTOR associated with SYM. */
102void symbol_destructor_set (symbol *sym, char *destructor, location loc);
9280d3ef 103
7486e51b
PE
104/* Set the PRINTER associated with SYM. */
105void symbol_printer_set (symbol *sym, char *printer, location loc);
366eea36 106
7486e51b
PE
107/* Set the PRECEDENCE associated with SYM. Ensure that SYMBOL is a
108 terminal. Do nothing if invoked with UNDEF_ASSOC as ASSOC. */
109void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 110
7486e51b
PE
111/* Set the CLASS associated with SYM. */
112void symbol_class_set (symbol *sym, symbol_class class, location loc);
44536b35 113
7486e51b
PE
114/* Set the USER_TOKEN_NUMBER associated with SYM. */
115void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
116
117
2f1afb73
AD
118/* Distinguished symbols. AXIOM is the real start symbol, that used
119 by the automaton. STARTSYMBOL is the one specified by the user.
120 */
7486e51b
PE
121extern symbol *errtoken;
122extern symbol *undeftoken;
123extern symbol *endtoken;
124extern symbol *accept;
125extern symbol *startsymbol;
126extern location startsymbol_location;
f7d4d87a 127
340ef489 128
2f1afb73
AD
129/*---------------.
130| Symbol table. |
131`---------------*/
132
133
134/* Create the symbol table. */
d33cb3ae 135void symbols_new (void);
2f1afb73
AD
136
137/* A function to apply to each symbol. */
7486e51b 138typedef bool (*symbol_processor) (symbol *);
2f1afb73 139
738c69de
PE
140/* Apply PROCESSOR to all the symbols. PROCESSOR must return true: on
141 false, the processing stops. */
d33cb3ae 142void symbols_do (symbol_processor processor, void *processor_data);
2f1afb73
AD
143
144/* Free all the memory allocated for symbols. */
d33cb3ae 145void symbols_free (void);
340ef489 146
e9955c83
AD
147/* Check that all the symbols are defined. Report any undefined
148 symbols and consider them nonterminals. */
d33cb3ae 149void symbols_check_defined (void);
2f1afb73
AD
150
151/* Perform various sanity checks, assign symbol numbers, and set up
152 TOKEN_TRANSLATIONS. */
d33cb3ae 153void symbols_pack (void);
2f1afb73 154
340ef489 155#endif /* !SYMTAB_H_ */