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