OLD | NEW |
(Empty) | |
| 1 /* Lists of symbols for Bison |
| 2 |
| 3 Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc. |
| 4 |
| 5 This file is part of Bison, the GNU Compiler Compiler. |
| 6 |
| 7 This program 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 3 of the License, or |
| 10 (at your option) any later version. |
| 11 |
| 12 This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 19 |
| 20 #include <config.h> |
| 21 #include "system.h" |
| 22 |
| 23 #include "complain.h" |
| 24 #include "symlist.h" |
| 25 |
| 26 |
| 27 /*--------------------------------------. |
| 28 | Create a list containing SYM at LOC. | |
| 29 `--------------------------------------*/ |
| 30 |
| 31 symbol_list * |
| 32 symbol_list_sym_new (symbol *sym, location loc) |
| 33 { |
| 34 symbol_list *res = xmalloc (sizeof *res); |
| 35 |
| 36 res->content_type = SYMLIST_SYMBOL; |
| 37 res->content.sym = sym; |
| 38 res->location = loc; |
| 39 |
| 40 res->midrule = NULL; |
| 41 res->midrule_parent_rule = NULL; |
| 42 res->midrule_parent_rhs_index = 0; |
| 43 |
| 44 code_props_none_init (&res->action_props); |
| 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 | Create a list containing TYPE_NAME at LOC. | |
| 58 `--------------------------------------------*/ |
| 59 |
| 60 symbol_list * |
| 61 symbol_list_type_new (uniqstr type_name, location loc) |
| 62 { |
| 63 symbol_list *res = xmalloc (sizeof *res); |
| 64 |
| 65 res->content_type = SYMLIST_TYPE; |
| 66 res->content.type_name = type_name; |
| 67 res->location = loc; |
| 68 res->next = NULL; |
| 69 |
| 70 return res; |
| 71 } |
| 72 |
| 73 |
| 74 /*----------------------------------------. |
| 75 | Create a list containing a <*> at LOC. | |
| 76 `----------------------------------------*/ |
| 77 |
| 78 symbol_list * |
| 79 symbol_list_default_tagged_new (location loc) |
| 80 { |
| 81 symbol_list *res = xmalloc (sizeof *res); |
| 82 |
| 83 res->content_type = SYMLIST_DEFAULT_TAGGED; |
| 84 res->location = loc; |
| 85 res->next = NULL; |
| 86 |
| 87 return res; |
| 88 } |
| 89 |
| 90 |
| 91 /*---------------------------------------. |
| 92 | Create a list containing a <> at LOC. | |
| 93 `---------------------------------------*/ |
| 94 |
| 95 symbol_list * |
| 96 symbol_list_default_tagless_new (location loc) |
| 97 { |
| 98 symbol_list *res = xmalloc (sizeof *res); |
| 99 |
| 100 res->content_type = SYMLIST_DEFAULT_TAGLESS; |
| 101 res->location = loc; |
| 102 res->next = NULL; |
| 103 |
| 104 return res; |
| 105 } |
| 106 |
| 107 |
| 108 /*-----------------------------------------------------------------------. |
| 109 | Print this list, for which every content_type must be SYMLIST_SYMBOL. | |
| 110 `-----------------------------------------------------------------------*/ |
| 111 |
| 112 void |
| 113 symbol_list_syms_print (const symbol_list *l, FILE *f) |
| 114 { |
| 115 for (/* Nothing. */; l && l->content.sym; l = l->next) |
| 116 { |
| 117 symbol_print (l->content.sym, f); |
| 118 fprintf (stderr, l->action_props.is_value_used ? " used" : " unused"); |
| 119 if (l && l->content.sym) |
| 120 fprintf (f, ", "); |
| 121 } |
| 122 } |
| 123 |
| 124 |
| 125 /*---------------------------. |
| 126 | Prepend NODE to the LIST. | |
| 127 `---------------------------*/ |
| 128 |
| 129 symbol_list * |
| 130 symbol_list_prepend (symbol_list *list, symbol_list *node) |
| 131 { |
| 132 node->next = list; |
| 133 return node; |
| 134 } |
| 135 |
| 136 |
| 137 /*-----------------------------------------------. |
| 138 | Free the LIST, but not the items it contains. | |
| 139 `-----------------------------------------------*/ |
| 140 |
| 141 void |
| 142 symbol_list_free (symbol_list *list) |
| 143 { |
| 144 LIST_FREE (symbol_list, list); |
| 145 } |
| 146 |
| 147 |
| 148 /*--------------------. |
| 149 | Return its length. | |
| 150 `--------------------*/ |
| 151 |
| 152 int |
| 153 symbol_list_length (symbol_list const *l) |
| 154 { |
| 155 int res = 0; |
| 156 for (/* Nothing. */; |
| 157 l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL); |
| 158 l = l->next) |
| 159 ++res; |
| 160 return res; |
| 161 } |
| 162 |
| 163 |
| 164 /*------------------------------. |
| 165 | Get item N in symbol list L. | |
| 166 `------------------------------*/ |
| 167 |
| 168 symbol_list * |
| 169 symbol_list_n_get (symbol_list *l, int n) |
| 170 { |
| 171 int i; |
| 172 |
| 173 if (n < 0) |
| 174 return NULL; |
| 175 |
| 176 for (i = 0; i < n; ++i) |
| 177 { |
| 178 l = l->next; |
| 179 if (l == NULL |
| 180 || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL)) |
| 181 return NULL; |
| 182 } |
| 183 |
| 184 return l; |
| 185 } |
| 186 |
| 187 |
| 188 /*--------------------------------------------------------------. |
| 189 | Get the data type (alternative in the union) of the value for | |
| 190 | symbol N in symbol list L. | |
| 191 `--------------------------------------------------------------*/ |
| 192 |
| 193 uniqstr |
| 194 symbol_list_n_type_name_get (symbol_list *l, location loc, int n) |
| 195 { |
| 196 l = symbol_list_n_get (l, n); |
| 197 if (!l) |
| 198 { |
| 199 complain_at (loc, _("invalid $ value: $%d"), n); |
| 200 return NULL; |
| 201 } |
| 202 aver (l->content_type == SYMLIST_SYMBOL); |
| 203 return l->content.sym->type_name; |
| 204 } |
| 205 |
| 206 |
| 207 void |
| 208 symbol_list_destructor_set (symbol_list *node, char const *code, location loc) |
| 209 { |
| 210 code_props destructor; |
| 211 code_props_symbol_action_init (&destructor, code, loc); |
| 212 code_props_translate_code (&destructor); |
| 213 switch (node->content_type) |
| 214 { |
| 215 case SYMLIST_SYMBOL: |
| 216 symbol_destructor_set (node->content.sym, &destructor); |
| 217 break; |
| 218 case SYMLIST_TYPE: |
| 219 semantic_type_destructor_set ( |
| 220 semantic_type_get (node->content.type_name), &destructor); |
| 221 break; |
| 222 case SYMLIST_DEFAULT_TAGGED: |
| 223 default_tagged_destructor_set (&destructor); |
| 224 break; |
| 225 case SYMLIST_DEFAULT_TAGLESS: |
| 226 default_tagless_destructor_set (&destructor); |
| 227 break; |
| 228 } |
| 229 } |
| 230 |
| 231 void |
| 232 symbol_list_printer_set (symbol_list *node, char const *code, location loc) |
| 233 { |
| 234 code_props printer; |
| 235 code_props_symbol_action_init (&printer, code, loc); |
| 236 code_props_translate_code (&printer); |
| 237 switch (node->content_type) |
| 238 { |
| 239 case SYMLIST_SYMBOL: |
| 240 symbol_printer_set (node->content.sym, &printer); |
| 241 break; |
| 242 case SYMLIST_TYPE: |
| 243 semantic_type_printer_set ( |
| 244 semantic_type_get (node->content.type_name), &printer); |
| 245 break; |
| 246 case SYMLIST_DEFAULT_TAGGED: |
| 247 default_tagged_printer_set (&printer); |
| 248 break; |
| 249 case SYMLIST_DEFAULT_TAGLESS: |
| 250 default_tagless_printer_set (&printer); |
| 251 break; |
| 252 } |
| 253 } |
OLD | NEW |