]> git.saurik.com Git - bison.git/blame - src/symlist.c
grammar: warn about unused precedence for symbols
[bison.git] / src / symlist.c
CommitLineData
56c47203 1/* Lists of symbols for Bison
17ee7397 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 20
2cec9080 21#include <config.h>
56c47203 22#include "system.h"
17ee7397 23
9280d3ef 24#include "complain.h"
56c47203
AD
25#include "symlist.h"
26
17ee7397
PE
27/*--------------------------------------.
28| Create a list containing SYM at LOC. |
29`--------------------------------------*/
56c47203 30
17ee7397 31symbol_list *
3be03b13 32symbol_list_sym_new (symbol *sym, location loc)
56c47203 33{
da2a7671 34 symbol_list *res = xmalloc (sizeof *res);
affac613 35
3be03b13
JD
36 res->content_type = SYMLIST_SYMBOL;
37 res->content.sym = sym;
b9f1d9a4 38 res->location = res->sym_loc = loc;
affac613 39
6ec2c0f2 40 res->midrule = NULL;
ffa4ba3a
JD
41 res->midrule_parent_rule = NULL;
42 res->midrule_parent_rhs_index = 0;
84866159 43
f6857bbf 44 code_props_none_init (&res->action_props);
affac613 45
56c47203 46 res->ruleprec = NULL;
676385e2
PH
47 res->dprec = 0;
48 res->merger = 0;
affac613 49
b9f1d9a4
AR
50 res->named_ref = NULL;
51
affac613
AD
52 res->next = NULL;
53
56c47203
AD
54 return res;
55}
56
57
3be03b13
JD
58/*--------------------------------------------.
59| Create a list containing TYPE_NAME at LOC. |
60`--------------------------------------------*/
61
62symbol_list *
63symbol_list_type_new (uniqstr type_name, location loc)
64{
65 symbol_list *res = xmalloc (sizeof *res);
66
67 res->content_type = SYMLIST_TYPE;
9641b918
VS
68 res->content.sem_type = xmalloc (sizeof (semantic_type));
69 res->content.sem_type->tag = type_name;
70 res->content.sem_type->location = loc;
71 res->content.sem_type->status = undeclared;
72
b9f1d9a4
AR
73 res->location = res->sym_loc = loc;
74 res->named_ref = NULL;
3be03b13
JD
75 res->next = NULL;
76
77 return res;
78}
79
80
3be03b13
JD
81/*-----------------------------------------------------------------------.
82| Print this list, for which every content_type must be SYMLIST_SYMBOL. |
83`-----------------------------------------------------------------------*/
867a3e00
AD
84
85void
3be03b13 86symbol_list_syms_print (const symbol_list *l, FILE *f)
867a3e00 87{
3be03b13 88 for (/* Nothing. */; l && l->content.sym; l = l->next)
22dda0f0 89 {
3be03b13 90 symbol_print (l->content.sym, f);
f6857bbf 91 fprintf (stderr, l->action_props.is_value_used ? " used" : " unused");
3be03b13 92 if (l && l->content.sym)
e9690142 93 fprintf (f, ", ");
22dda0f0 94 }
867a3e00
AD
95}
96
97
3be03b13
JD
98/*---------------------------.
99| Prepend NODE to the LIST. |
100`---------------------------*/
56c47203 101
17ee7397 102symbol_list *
3be03b13 103symbol_list_prepend (symbol_list *list, symbol_list *node)
56c47203 104{
3be03b13
JD
105 node->next = list;
106 return node;
56c47203
AD
107}
108
109
93561c21
VT
110/*-------------------------.
111| Append NODE to the LIST. |
112`-------------------------*/
113
114symbol_list *
115symbol_list_append (symbol_list *list, symbol_list *node)
116{
117 if (!list)
118 return node;
119 symbol_list *next = list;
120 while (next->next)
121 next = next->next;
122 next->next = node;
123 return list;
124}
125
126
3be03b13
JD
127/*-----------------------------------------------.
128| Free the LIST, but not the items it contains. |
129`-----------------------------------------------*/
56c47203
AD
130
131void
17ee7397 132symbol_list_free (symbol_list *list)
56c47203 133{
13cdf208
AR
134 symbol_list *node, *next;
135 for (node = list; node; node = next)
136 {
137 next = node->next;
a4d1bf6a 138 named_ref_free (node->named_ref);
ae9c90ba
TR
139 if (node->content_type == SYMLIST_TYPE)
140 free (node->content.sem_type);
13cdf208
AR
141 free (node);
142 }
56c47203
AD
143}
144
145
dafdc66f
AD
146/*--------------------.
147| Return its length. |
148`--------------------*/
149
b37acfe1
PE
150int
151symbol_list_length (symbol_list const *l)
dafdc66f
AD
152{
153 int res = 0;
3be03b13
JD
154 for (/* Nothing. */;
155 l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL);
156 l = l->next)
dafdc66f
AD
157 ++res;
158 return res;
159}
160
161
3be03b13
JD
162/*------------------------------.
163| Get item N in symbol list L. |
164`------------------------------*/
affac613
AD
165
166symbol_list *
167symbol_list_n_get (symbol_list *l, int n)
168{
169 int i;
170
171 if (n < 0)
172 return NULL;
173
174 for (i = 0; i < n; ++i)
175 {
176 l = l->next;
3be03b13
JD
177 if (l == NULL
178 || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL))
e9690142 179 return NULL;
affac613
AD
180 }
181
182 return l;
183}
184
185
56c47203
AD
186/*--------------------------------------------------------------.
187| Get the data type (alternative in the union) of the value for |
affac613 188| symbol N in symbol list L. |
56c47203
AD
189`--------------------------------------------------------------*/
190
17ee7397 191uniqstr
affac613 192symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
56c47203 193{
affac613
AD
194 l = symbol_list_n_get (l, n);
195 if (!l)
56c47203 196 {
bb8e56ff 197 complain (&loc, complaint, _("invalid $ value: $%d"), n);
56c47203
AD
198 return NULL;
199 }
4f82b42a 200 aver (l->content_type == SYMLIST_SYMBOL);
3be03b13 201 return l->content.sym->type_name;
affac613 202}
56c47203 203
872b52bc 204bool
676997e5 205symbol_list_null (symbol_list *node)
872b52bc
AR
206{
207 return !node ||
208 (node->content_type == SYMLIST_SYMBOL && !(node->content.sym));
209}
56c47203 210
3be03b13 211void
71da68b3 212symbol_list_code_props_set (symbol_list *node, code_props_type kind,
4323e0da 213 code_props const *cprops)
3be03b13
JD
214{
215 switch (node->content_type)
216 {
3edfae04
AD
217 case SYMLIST_SYMBOL:
218 symbol_code_props_set (node->content.sym, kind, cprops);
219 if (node->content.sym->status == undeclared)
220 node->content.sym->status = used;
221 break;
222 case SYMLIST_TYPE:
223 semantic_type_code_props_set
224 (semantic_type_get (node->content.sem_type->tag,
225 &node->content.sem_type->location),
226 kind, cprops);
227 if (node->content.sem_type->status == undeclared)
228 node->content.sem_type->status = used;
229 break;
3be03b13
JD
230 }
231}