]> git.saurik.com Git - bison.git/blame - src/symtab.h
* tests/actions.at (AT_CHECK_PRINTER_AND_DESTRUCTOR): New.
[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
3e6656f9 25# include "struniq.h"
8efe435c 26# include "location.h"
a945ec39 27# include "assoc.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. */
a49aecd5 43typedef short symbol_number_t;
01eb033c 44#define SYMBOL_NUMBER_MAX ((symbol_number_t) SHRT_MAX)
5fbb0954 45
5fbb0954 46
b87f8b21 47typedef struct symbol_s symbol_t;
db8837cb 48struct symbol_s
340ef489 49{
1e0bab92 50 /* The key, name of the symbol. */
95612cfa 51 struniq_t tag;
24c0aad7
AD
52 /* The location of its first occurence. */
53 location_t location;
1e0bab92 54
366eea36 55 /* Its %type and associated printer and destructor. */
3e6656f9 56 struniq_t type_name;
9280d3ef 57 char *destructor;
24c0aad7 58 location_t destructor_location;
366eea36
AD
59 char *printer;
60 location_t printer_location;
ee000ba4 61
a49aecd5 62 symbol_number_t number;
340ef489 63 short prec;
a945ec39 64 assoc_t 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. */
b87f8b21 70 symbol_t *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. */
a49aecd5 84#define NUMBER_UNDEFINED ((symbol_number_t) -1)
b87f8b21 85
f7d4d87a 86
2f1afb73 87/* Fetch (or create) the symbol associated to KEY. */
d33cb3ae 88symbol_t *symbol_get (const char *key, location_t location);
39f41916
AD
89
90/* Generate a dummy nonterminal, whose name cannot conflict with the
91 user's names. */
d33cb3ae 92symbol_t *dummy_symbol_get (location_t location);
2f1afb73 93
e9955c83 94/* Declare the new SYMBOL. Make it an alias of SYMVAL. */
d33cb3ae
PE
95void symbol_make_alias (symbol_t *symbol, symbol_t *symval,
96 location_t location);
2f1afb73 97
e9955c83
AD
98/* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as
99 TYPE_NAME. */
d33cb3ae 100void symbol_type_set (symbol_t *symbol,
95612cfa 101 struniq_t type_name, location_t location);
3ae2b51f 102
9280d3ef 103/* Set the DESTRUCTOR associated to SYMBOL. */
d33cb3ae
PE
104void symbol_destructor_set (symbol_t *symbol,
105 char *destructor, location_t location);
9280d3ef 106
366eea36 107/* Set the PRINTER associated to SYMBOL. */
d33cb3ae
PE
108void symbol_printer_set (symbol_t *symbol,
109 char *printer, location_t location);
366eea36 110
e9955c83
AD
111/* Set the PRECEDENCE associated to SYMBOL. Ensures that SYMBOL is a
112 terminal. Does nothing if invoked with UNDEF_ASSOC as ASSOC. */
d33cb3ae
PE
113void symbol_precedence_set (symbol_t *symbol,
114 int prec, assoc_t assoc, location_t location);
3ae2b51f 115
44536b35 116/* Set the CLASS associated to SYMBOL. */
d33cb3ae
PE
117void symbol_class_set (symbol_t *symbol,
118 symbol_class class, location_t location);
44536b35
AD
119
120/* Set the USER_TOKEN_NUMBER associated to SYMBOL. */
d33cb3ae
PE
121void symbol_user_token_number_set (symbol_t *symbol,
122 int user_number, location_t location);
44536b35
AD
123
124
2f1afb73
AD
125/* Distinguished symbols. AXIOM is the real start symbol, that used
126 by the automaton. STARTSYMBOL is the one specified by the user.
127 */
128extern symbol_t *errtoken;
129extern symbol_t *undeftoken;
88bce5a2
AD
130extern symbol_t *endtoken;
131extern symbol_t *accept;
2f1afb73 132extern symbol_t *startsymbol;
8efe435c 133extern location_t startsymbol_location;
f7d4d87a 134
340ef489 135
2f1afb73
AD
136/*---------------.
137| Symbol table. |
138`---------------*/
139
140
141/* Create the symbol table. */
d33cb3ae 142void symbols_new (void);
2f1afb73
AD
143
144/* A function to apply to each symbol. */
d33cb3ae 145typedef bool (*symbol_processor) (symbol_t *);
2f1afb73 146
738c69de
PE
147/* Apply PROCESSOR to all the symbols. PROCESSOR must return true: on
148 false, the processing stops. */
d33cb3ae 149void symbols_do (symbol_processor processor, void *processor_data);
2f1afb73
AD
150
151/* Free all the memory allocated for symbols. */
d33cb3ae 152void symbols_free (void);
340ef489 153
e9955c83
AD
154/* Check that all the symbols are defined. Report any undefined
155 symbols and consider them nonterminals. */
d33cb3ae 156void symbols_check_defined (void);
2f1afb73
AD
157
158/* Perform various sanity checks, assign symbol numbers, and set up
159 TOKEN_TRANSLATIONS. */
d33cb3ae 160void symbols_pack (void);
2f1afb73 161
340ef489 162#endif /* !SYMTAB_H_ */