• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Lists of symbols for Bison
2 
3    Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
4 
5    This file is part of Bison, the GNU Compiler Compiler.
6 
7    Bison is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11 
12    Bison is distributed in the hope that it will be useful,
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
18    along with Bison; see the file COPYING.  If not, write to
19    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20    Boston, MA 02110-1301, USA.  */
21 
22 #include <config.h>
23 #include "system.h"
24 
25 #include "complain.h"
26 #include "symlist.h"
27 
28 
29 /*--------------------------------------.
30 | Create a list containing SYM at LOC.  |
31 `--------------------------------------*/
32 
33 symbol_list *
symbol_list_new(symbol * sym,location loc)34 symbol_list_new (symbol *sym, location loc)
35 {
36   symbol_list *res = xmalloc (sizeof *res);
37 
38   res->sym = sym;
39   res->location = loc;
40 
41   res->midrule = NULL;
42 
43   res->action = NULL;
44   res->used = false;
45 
46   res->ruleprec = NULL;
47   res->dprec = 0;
48   res->merger = 0;
49 
50   res->next = NULL;
51 
52   return res;
53 }
54 
55 
56 /*------------------.
57 | Print this list.  |
58 `------------------*/
59 
60 void
symbol_list_print(const symbol_list * l,FILE * f)61 symbol_list_print (const symbol_list *l, FILE *f)
62 {
63   for (/* Nothing. */; l && l->sym; l = l->next)
64     {
65       symbol_print (l->sym, f);
66       fprintf (stderr, l->used ? " used" : " unused");
67       if (l && l->sym)
68 	fprintf (f, ", ");
69     }
70 }
71 
72 
73 /*---------------------------------.
74 | Prepend SYM at LOC to the LIST.  |
75 `---------------------------------*/
76 
77 symbol_list *
symbol_list_prepend(symbol_list * list,symbol * sym,location loc)78 symbol_list_prepend (symbol_list *list, symbol *sym, location loc)
79 {
80   symbol_list *res = symbol_list_new (sym, loc);
81   res->next = list;
82   return res;
83 }
84 
85 
86 /*-------------------------------------------------.
87 | Free the LIST, but not the symbols it contains.  |
88 `-------------------------------------------------*/
89 
90 void
symbol_list_free(symbol_list * list)91 symbol_list_free (symbol_list *list)
92 {
93   LIST_FREE (symbol_list, list);
94 }
95 
96 
97 /*--------------------.
98 | Return its length.  |
99 `--------------------*/
100 
101 unsigned int
symbol_list_length(const symbol_list * l)102 symbol_list_length (const symbol_list *l)
103 {
104   int res = 0;
105   for (/* Nothing. */; l; l = l->next)
106     ++res;
107   return res;
108 }
109 
110 
111 /*--------------------------------.
112 | Get symbol N in symbol list L.  |
113 `--------------------------------*/
114 
115 symbol_list *
symbol_list_n_get(symbol_list * l,int n)116 symbol_list_n_get (symbol_list *l, int n)
117 {
118   int i;
119 
120   if (n < 0)
121     return NULL;
122 
123   for (i = 0; i < n; ++i)
124     {
125       l = l->next;
126       if (l == NULL || l->sym == NULL)
127 	return NULL;
128     }
129 
130   return l;
131 }
132 
133 
134 /*--------------------------------------------------------------.
135 | Get the data type (alternative in the union) of the value for |
136 | symbol N in symbol list L.                                    |
137 `--------------------------------------------------------------*/
138 
139 uniqstr
symbol_list_n_type_name_get(symbol_list * l,location loc,int n)140 symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
141 {
142   l = symbol_list_n_get (l, n);
143   if (!l)
144     {
145       complain_at (loc, _("invalid $ value: $%d"), n);
146       return NULL;
147     }
148   return l->sym->type_name;
149 }
150 
151 
152 /*----------------------------------------.
153 | The symbol N in symbol list L is USED.  |
154 `----------------------------------------*/
155 
156 void
symbol_list_n_used_set(symbol_list * l,int n,bool used)157 symbol_list_n_used_set (symbol_list *l, int n, bool used)
158 {
159   l = symbol_list_n_get (l, n);
160   if (l)
161     l->used = used;
162 }
163