]> git.saurik.com Git - bison.git/blame - src/symtab.h
* data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to
[bison.git] / src / symtab.h
CommitLineData
2cc6b612
PE
1/* Definitions for symtab.c and callers, part of Bison.
2
03b31c0c
AD
3 Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002
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
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, 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. */
7486e51b
PE
44typedef short symbol_number;
45#define SYMBOL_NUMBER_MAXIMUM SHRT_MAX
5fbb0954 46
5fbb0954 47
7486e51b
PE
48typedef struct symbol symbol;
49struct symbol
340ef489 50{
1e0bab92 51 /* The key, name of the symbol. */
7486e51b
PE
52 uniqstr tag;
53 /* The location of its first occurrence. */
54 location location;
1e0bab92 55
366eea36 56 /* Its %type and associated printer and destructor. */
7486e51b 57 uniqstr type_name;
9280d3ef 58 char *destructor;
7486e51b 59 location destructor_location;
366eea36 60 char *printer;
7486e51b 61 location printer_location;
ee000ba4 62
7486e51b 63 symbol_number number;
340ef489 64 short prec;
7486e51b 65 assoc assoc;
62a3e4f0 66 int user_token_number;
3f96f4dc 67
b87f8b21
AD
68 /* Points to the other in the identifier-symbol pair for an alias.
69 Special value USER_NUMBER_ALIAS in the identifier half of the
1e9798d5 70 identifier-symbol pair for an alias. */
7486e51b 71 symbol *alias;
d7020c20 72 symbol_class class;
db8837cb
AD
73};
74
b87f8b21
AD
75/* Undefined user number. */
76#define USER_NUMBER_UNDEFINED -1
77
78/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
79 *has* (not is) a string literal alias. For instance, `%token foo
80 "foo"' has `"foo"' numbered regularly, and `foo' numbered as
81 USER_NUMBER_ALIAS. */
82#define USER_NUMBER_ALIAS -9991
83
84/* Undefined internal token number. */
2cc6b612 85#define NUMBER_UNDEFINED (-1)
b87f8b21 86
f7d4d87a 87
2f1afb73 88/* Fetch (or create) the symbol associated to KEY. */
7486e51b 89symbol *symbol_get (const char *key, location loc);
39f41916
AD
90
91/* Generate a dummy nonterminal, whose name cannot conflict with the
92 user's names. */
7486e51b 93symbol *dummy_symbol_get (location loc);
2f1afb73 94
7486e51b
PE
95/* Declare the new symbol SYM. Make it an alias of SYMVAL. */
96void symbol_make_alias (symbol *sym, symbol *symval, location loc);
2f1afb73 97
7486e51b 98/* Set the TYPE_NAME associated with SYM. Do nothing if passed 0 as
e9955c83 99 TYPE_NAME. */
7486e51b 100void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
3ae2b51f 101
7486e51b
PE
102/* Set the DESTRUCTOR associated with SYM. */
103void symbol_destructor_set (symbol *sym, char *destructor, location loc);
9280d3ef 104
7486e51b
PE
105/* Set the PRINTER associated with SYM. */
106void symbol_printer_set (symbol *sym, char *printer, location loc);
366eea36 107
7486e51b
PE
108/* Set the PRECEDENCE associated with SYM. Ensure that SYMBOL is a
109 terminal. Do nothing if invoked with UNDEF_ASSOC as ASSOC. */
110void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
3ae2b51f 111
7486e51b
PE
112/* Set the CLASS associated with SYM. */
113void symbol_class_set (symbol *sym, symbol_class class, location loc);
44536b35 114
7486e51b
PE
115/* Set the USER_TOKEN_NUMBER associated with SYM. */
116void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
44536b35
AD
117
118
2f1afb73
AD
119/* Distinguished symbols. AXIOM is the real start symbol, that used
120 by the automaton. STARTSYMBOL is the one specified by the user.
121 */
7486e51b
PE
122extern symbol *errtoken;
123extern symbol *undeftoken;
124extern symbol *endtoken;
125extern symbol *accept;
126extern symbol *startsymbol;
127extern location startsymbol_location;
f7d4d87a 128
340ef489 129
2f1afb73
AD
130/*---------------.
131| Symbol table. |
132`---------------*/
133
134
135/* Create the symbol table. */
d33cb3ae 136void symbols_new (void);
2f1afb73 137
2f1afb73 138/* Free all the memory allocated for symbols. */
d33cb3ae 139void symbols_free (void);
340ef489 140
e9955c83
AD
141/* Check that all the symbols are defined. Report any undefined
142 symbols and consider them nonterminals. */
d33cb3ae 143void symbols_check_defined (void);
2f1afb73
AD
144
145/* Perform various sanity checks, assign symbol numbers, and set up
146 TOKEN_TRANSLATIONS. */
d33cb3ae 147void symbols_pack (void);
2f1afb73 148
340ef489 149#endif /* !SYMTAB_H_ */