]> git.saurik.com Git - bison.git/blame - src/symlist.h
Named symbol references.
[bison.git] / src / symlist.h
CommitLineData
56c47203 1/* Lists of symbols for Bison
e3921448 2
28e52c0d 3 Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc.
56c47203
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
56c47203 8 it under the terms of the GNU General Public License as published by
f16b0819
PE
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
56c47203 11
f16b0819 12 This program is distributed in the hope that it will be useful,
56c47203
AD
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.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
56c47203
AD
19
20#ifndef SYMLIST_H_
21# define SYMLIST_H_
22
56c47203 23# include "location.h"
7c0c6181 24# include "scan-code.h"
e3921448 25# include "symtab.h"
7685e2f7 26# include "named-ref.h"
56c47203 27
affac613 28/* A list of symbols, used during the parsing to store the rules. */
e3921448 29typedef struct symbol_list
56c47203 30{
3be03b13 31 /**
12e35840 32 * Whether this node contains a symbol, a semantic type, a \c <*>, or a
3ebecc24 33 * \c <>.
3be03b13 34 */
12e35840
JD
35 enum {
36 SYMLIST_SYMBOL, SYMLIST_TYPE,
37 SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
38 } content_type;
3be03b13 39 union {
7c0c6181
JD
40 /**
41 * The symbol or \c NULL iff
42 * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
43 */
3be03b13 44 symbol *sym;
7c0c6181
JD
45 /**
46 * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
47 */
3be03b13
JD
48 uniqstr type_name;
49 } content;
e3921448 50 location location;
56c47203 51
7685e2f7
AR
52 /* Proper location of the symbol, not all the rule */
53 location sym_loc;
54
ffa4ba3a
JD
55 /* If this symbol is the generated lhs for a midrule but this is the rule in
56 whose rhs it appears, MIDRULE = a pointer to that midrule. */
6ec2c0f2 57 struct symbol_list *midrule;
84866159 58
ffa4ba3a
JD
59 /* If this symbol is the generated lhs for a midrule and this is that
60 midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
61 appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
62 parent rule. */
63 struct symbol_list *midrule_parent_rule;
64 int midrule_parent_rhs_index;
65
f6857bbf
JD
66 /* The action is attached to the LHS of a rule, but action properties for
67 * each RHS are also stored here. */
68 code_props action_props;
affac613
AD
69
70 /* Precedence/associativity. */
e3921448 71 symbol *ruleprec;
676385e2
PH
72 int dprec;
73 int merger;
8ee5b538 74 location merger_declaration_location;
affac613 75
7685e2f7
AR
76 /* Named reference. */
77 named_ref *named_ref;
78
affac613
AD
79 /* The list. */
80 struct symbol_list *next;
e3921448 81} symbol_list;
56c47203
AD
82
83
3be03b13
JD
84/** Create a list containing \c sym at \c loc. */
85symbol_list *symbol_list_sym_new (symbol *sym, location loc);
56c47203 86
3be03b13
JD
87/** Create a list containing \c type_name at \c loc. */
88symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
867a3e00 89
12e35840
JD
90/** Create a list containing a \c <*> at \c loc. */
91symbol_list *symbol_list_default_tagged_new (location loc);
3ebecc24 92/** Create a list containing a \c <> at \c loc. */
12e35840 93symbol_list *symbol_list_default_tagless_new (location loc);
56c47203 94
3be03b13 95/** Print this list.
56c47203 96
3be03b13
JD
97 \pre For every node \c n in the list, <tt>n->content_type =
98 SYMLIST_SYMBOL</tt>. */
99void symbol_list_syms_print (const symbol_list *l, FILE *f);
100
101/** Prepend \c node to \c list. */
102symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
103
104/** Free \c list, but not the items it contains. */
105void symbol_list_free (symbol_list *list);
106
107/** Return the length of \c l. */
b37acfe1 108int symbol_list_length (symbol_list const *l);
affac613 109
3be03b13 110/** Get item \c n in symbol list \c l. */
affac613 111symbol_list *symbol_list_n_get (symbol_list *l, int n);
56c47203
AD
112
113/* Get the data type (alternative in the union) of the value for
114 symbol N in rule RULE. */
affac613
AD
115uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
116
7c0c6181
JD
117/** Set the \c \%destructor for \c node as \c code at \c loc. */
118void symbol_list_destructor_set (symbol_list *node, char const *code,
3be03b13
JD
119 location loc);
120
7c0c6181
JD
121/** Set the \c \%printer for \c node as \c code at \c loc. */
122void symbol_list_printer_set (symbol_list *node, char const *code,
3be03b13
JD
123 location loc);
124
56c47203 125#endif /* !SYMLIST_H_ */