]> git.saurik.com Git - bison.git/blame - src/symtab.h
Don't miss %merge result type warnings just because the LHS types are
[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
340ef489
AD
23#ifndef SYMTAB_H_
24# define SYMTAB_H_
f7d4d87a 25
a945ec39 26# include "assoc.h"
7486e51b
PE
27# include "location.h"
28# include "uniqstr.h"
8efe435c 29
2f1afb73
AD
30/*----------.
31| Symbols. |
32`----------*/
f7d4d87a 33
bba97eb2 34/* Symbol classes. */
d7020c20
AD
35typedef enum
36{
37 unknown_sym,
38 token_sym, /* terminal symbol */
39 nterm_sym /* non-terminal */
40} symbol_class;
340ef489 41
b87f8b21 42
007a50a4 43/* Internal token numbers. */
f6fbd3da
PE
44typedef int symbol_number;
45#define SYMBOL_NUMBER_MAXIMUM INT_MAX
5fbb0954 46
5fbb0954 47
7486e51b 48typedef struct symbol symbol;
df09ef2e
AD
49
50/* When extending this structure, be sure to complete
51 symbol_check_alias_consistency. */
7486e51b 52struct symbol
340ef489 53{
1e0bab92 54 /* The key, name of the symbol. */
7486e51b
PE
55 uniqstr tag;
56 /* The location of its first occurrence. */
57 location location;
1e0bab92 58
366eea36 59 /* Its %type and associated printer and destructor. */
7486e51b 60 uniqstr type_name;
df09ef2e
AD
61 location type_location;
62
c1432f65
AD
63 /* Does not own the memory. */
64 const char *destructor;
7486e51b 65 location destructor_location;
df09ef2e 66
31b2b07e 67 /* Printer. */
c1432f65 68 const char *printer;
7486e51b 69 location printer_location;
ee000ba4 70
7486e51b 71 symbol_number number;
df09ef2e 72 location prec_location;
f6fbd3da 73 int prec;
7486e51b 74 assoc assoc;
62a3e4f0 75 int user_token_number;
3f96f4dc 76
b87f8b21
AD
77 /* Points to the other in the identifier-symbol pair for an alias.
78 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 79 identifier-symbol pair for an alias. */
7486e51b 80 symbol *alias;
d7020c20 81 symbol_class class;
073f9288 82 bool declared;
db8837cb
AD
83};
84
b87f8b21
AD
85/* Undefined user number. */
86#define USER_NUMBER_UNDEFINED -1
87
88/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
89 *has* (not is) a string literal alias. For instance, `%token foo
90 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
91 USER_NUMBER_ALIAS. */
92#define USER_NUMBER_ALIAS -9991
93
94/* Undefined internal token number. */
2cc6b612 95#define NUMBER_UNDEFINED (-1)
b87f8b21 96
867a3e00 97/* Print a symbol (for debugging). */
22dda0f0 98void symbol_print (symbol *s, FILE *f);
f7d4d87a 99
2f1afb73 100/* Fetch (or create) the symbol associated to KEY. */
203b9274
AD
101symbol *symbol_from_uniqstr (const uniqstr key, location loc);
102
103/* Fetch (or create) the symbol associated to KEY. */
7486e51b 104symbol *symbol_get (const char *key, location loc);
39f41916
AD
105
106/* Generate a dummy nonterminal, whose name cannot conflict with the
107 user's names. */
7486e51b 108symbol *dummy_symbol_get (location loc);
2f1afb73 109
7486e51b
PE
110/* Declare the new symbol SYM. Make it an alias of SYMVAL. */
111void symbol_make_alias (symbol *sym, symbol *symval, location loc);
2f1afb73 112
7486e51b 113/* Set the TYPE_NAME associated with SYM. Do nothing if passed 0 as
e9955c83 114 TYPE_NAME. */
7486e51b 115void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 116
7486e51b 117/* Set the DESTRUCTOR associated with SYM. */
c1432f65 118void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
9280d3ef 119
7486e51b 120/* Set the PRINTER associated with SYM. */
c1432f65 121void symbol_printer_set (symbol *sym, const char *printer, location loc);
366eea36 122
7486e51b
PE
123/* Set the PRECEDENCE associated with SYM. Ensure that SYMBOL is a
124 terminal. Do nothing if invoked with UNDEF_ASSOC as ASSOC. */
125void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 126
7486e51b 127/* Set the CLASS associated with SYM. */
073f9288
PE
128void symbol_class_set (symbol *sym, symbol_class class, location loc,
129 bool declaring);
44536b35 130
7486e51b
PE
131/* Set the USER_TOKEN_NUMBER associated with SYM. */
132void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
133
134
2f1afb73
AD
135/* Distinguished symbols. AXIOM is the real start symbol, that used
136 by the automaton. STARTSYMBOL is the one specified by the user.
137 */
7486e51b
PE
138extern symbol *errtoken;
139extern symbol *undeftoken;
140extern symbol *endtoken;
141extern symbol *accept;
142extern symbol *startsymbol;
143extern location startsymbol_location;
f7d4d87a 144
340ef489 145
2f1afb73
AD
146/*---------------.
147| Symbol table. |
148`---------------*/
149
150
151/* Create the symbol table. */
d33cb3ae 152void symbols_new (void);
2f1afb73 153
2f1afb73 154/* Free all the memory allocated for symbols. */
d33cb3ae 155void symbols_free (void);
340ef489 156
e9955c83
AD
157/* Check that all the symbols are defined. Report any undefined
158 symbols and consider them nonterminals. */
d33cb3ae 159void symbols_check_defined (void);
2f1afb73
AD
160
161/* Perform various sanity checks, assign symbol numbers, and set up
162 TOKEN_TRANSLATIONS. */
d33cb3ae 163void symbols_pack (void);
2f1afb73 164
340ef489 165#endif /* !SYMTAB_H_ */