]> git.saurik.com Git - bison.git/blame - src/symtab.h
Version 1.75a.
[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
8efe435c 25# include "location.h"
a945ec39 26# include "assoc.h"
8efe435c 27
2f1afb73
AD
28/*----------.
29| Symbols. |
30`----------*/
f7d4d87a 31
bba97eb2 32/* Symbol classes. */
d7020c20
AD
33typedef enum
34{
35 unknown_sym,
36 token_sym, /* terminal symbol */
37 nterm_sym /* non-terminal */
38} symbol_class;
340ef489 39
b87f8b21 40
007a50a4 41/* Internal token numbers. */
a49aecd5 42typedef short symbol_number_t;
01eb033c 43#define SYMBOL_NUMBER_MAX ((symbol_number_t) SHRT_MAX)
5fbb0954 44
5fbb0954 45
b87f8b21 46typedef struct symbol_s symbol_t;
db8837cb 47struct symbol_s
340ef489 48{
1e0bab92 49 /* The key, name of the symbol. */
340ef489 50 char *tag;
24c0aad7
AD
51 /* The location of its first occurence. */
52 location_t location;
1e0bab92 53
366eea36 54 /* Its %type and associated printer and destructor. */
340ef489 55 char *type_name;
9280d3ef 56 char *destructor;
24c0aad7 57 location_t destructor_location;
366eea36
AD
58 char *printer;
59 location_t printer_location;
ee000ba4 60
a49aecd5 61 symbol_number_t number;
340ef489 62 short prec;
a945ec39 63 assoc_t assoc;
62a3e4f0 64 int user_token_number;
3f96f4dc 65
b87f8b21
AD
66 /* Points to the other in the identifier-symbol pair for an alias.
67 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 68 identifier-symbol pair for an alias. */
b87f8b21 69 symbol_t *alias;
d7020c20 70 symbol_class class;
db8837cb
AD
71};
72
b87f8b21
AD
73/* Undefined user number. */
74#define USER_NUMBER_UNDEFINED -1
75
76/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
77 *has* (not is) a string literal alias. For instance, `%token foo
78 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
79 USER_NUMBER_ALIAS. */
80#define USER_NUMBER_ALIAS -9991
81
82/* Undefined internal token number. */
a49aecd5 83#define NUMBER_UNDEFINED ((symbol_number_t) -1)
b87f8b21 84
f7d4d87a 85
2f1afb73 86/* Fetch (or create) the symbol associated to KEY. */
d33cb3ae 87symbol_t *symbol_get (const char *key, location_t location);
39f41916
AD
88
89/* Generate a dummy nonterminal, whose name cannot conflict with the
90 user's names. */
d33cb3ae 91symbol_t *dummy_symbol_get (location_t location);
2f1afb73 92
e9955c83 93/* Declare the new SYMBOL. Make it an alias of SYMVAL. */
d33cb3ae
PE
94void symbol_make_alias (symbol_t *symbol, symbol_t *symval,
95 location_t location);
2f1afb73 96
e9955c83
AD
97/* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as
98 TYPE_NAME. */
d33cb3ae
PE
99void symbol_type_set (symbol_t *symbol,
100 char *type_name, location_t location);
3ae2b51f 101
9280d3ef 102/* Set the DESTRUCTOR associated to SYMBOL. */
d33cb3ae
PE
103void symbol_destructor_set (symbol_t *symbol,
104 char *destructor, location_t location);
9280d3ef 105
366eea36 106/* Set the PRINTER associated to SYMBOL. */
d33cb3ae
PE
107void symbol_printer_set (symbol_t *symbol,
108 char *printer, location_t location);
366eea36 109
e9955c83
AD
110/* Set the PRECEDENCE associated to SYMBOL. Ensures that SYMBOL is a
111 terminal. Does nothing if invoked with UNDEF_ASSOC as ASSOC. */
d33cb3ae
PE
112void symbol_precedence_set (symbol_t *symbol,
113 int prec, assoc_t assoc, location_t location);
3ae2b51f 114
44536b35 115/* Set the CLASS associated to SYMBOL. */
d33cb3ae
PE
116void symbol_class_set (symbol_t *symbol,
117 symbol_class class, location_t location);
44536b35
AD
118
119/* Set the USER_TOKEN_NUMBER associated to SYMBOL. */
d33cb3ae
PE
120void symbol_user_token_number_set (symbol_t *symbol,
121 int user_number, location_t location);
44536b35
AD
122
123
2f1afb73
AD
124/* Distinguished symbols. AXIOM is the real start symbol, that used
125 by the automaton. STARTSYMBOL is the one specified by the user.
126 */
127extern symbol_t *errtoken;
128extern symbol_t *undeftoken;
88bce5a2
AD
129extern symbol_t *endtoken;
130extern symbol_t *accept;
2f1afb73 131extern symbol_t *startsymbol;
8efe435c 132extern location_t startsymbol_location;
f7d4d87a 133
340ef489 134
2f1afb73
AD
135/*---------------.
136| Symbol table. |
137`---------------*/
138
139
140/* Create the symbol table. */
d33cb3ae 141void symbols_new (void);
2f1afb73
AD
142
143/* A function to apply to each symbol. */
d33cb3ae 144typedef bool (*symbol_processor) (symbol_t *);
2f1afb73 145
738c69de
PE
146/* Apply PROCESSOR to all the symbols. PROCESSOR must return true: on
147 false, the processing stops. */
d33cb3ae 148void symbols_do (symbol_processor processor, void *processor_data);
2f1afb73
AD
149
150/* Free all the memory allocated for symbols. */
d33cb3ae 151void symbols_free (void);
340ef489 152
e9955c83
AD
153/* Check that all the symbols are defined. Report any undefined
154 symbols and consider them nonterminals. */
d33cb3ae 155void symbols_check_defined (void);
2f1afb73
AD
156
157/* Perform various sanity checks, assign symbol numbers, and set up
158 TOKEN_TRANSLATIONS. */
d33cb3ae 159void symbols_pack (void);
2f1afb73 160
340ef489 161#endif /* !SYMTAB_H_ */