]>
git.saurik.com Git - bison.git/blob - src/symlist.c
   1 /* Lists of symbols for Bison 
   3    Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   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) 
  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. 
  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.  */ 
  29 /*--------------------------------------. 
  30 | Create a list containing SYM at LOC.  | 
  31 `--------------------------------------*/ 
  34 symbol_list_sym_new (symbol 
*sym
, location loc
) 
  36   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  38   res
->content_type 
= SYMLIST_SYMBOL
; 
  39   res
->content
.sym 
= sym
; 
  43   res
->midrule_parent_rule 
= NULL
; 
  44   res
->midrule_parent_rhs_index 
= 0; 
  59 /*--------------------------------------------. 
  60 | Create a list containing TYPE_NAME at LOC.  | 
  61 `--------------------------------------------*/ 
  64 symbol_list_type_new (uniqstr type_name
, location loc
) 
  66   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  68   res
->content_type 
= SYMLIST_TYPE
; 
  69   res
->content
.type_name 
= type_name
; 
  77 /*----------------------------------------. 
  78 | Create a list containing a <*> at LOC.  | 
  79 `----------------------------------------*/ 
  82 symbol_list_default_tagged_new (location loc
) 
  84   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  86   res
->content_type 
= SYMLIST_DEFAULT_TAGGED
; 
  94 /*---------------------------------------. 
  95 | Create a list containing a <> at LOC.  | 
  96 `---------------------------------------*/ 
  99 symbol_list_default_tagless_new (location loc
) 
 101   symbol_list 
*res 
= xmalloc (sizeof *res
); 
 103   res
->content_type 
= SYMLIST_DEFAULT_TAGLESS
; 
 111 /*-----------------------------------------------------------------------. 
 112 | Print this list, for which every content_type must be SYMLIST_SYMBOL.  | 
 113 `-----------------------------------------------------------------------*/ 
 116 symbol_list_syms_print (const symbol_list 
*l
, FILE *f
) 
 118   for (/* Nothing. */; l 
&& l
->content
.sym
; l 
= l
->next
) 
 120       symbol_print (l
->content
.sym
, f
); 
 121       fprintf (stderr
, l
->used 
? " used" : " unused"); 
 122       if (l 
&& l
->content
.sym
) 
 128 /*---------------------------. 
 129 | Prepend NODE to the LIST.  | 
 130 `---------------------------*/ 
 133 symbol_list_prepend (symbol_list 
*list
, symbol_list 
*node
) 
 140 /*-----------------------------------------------. 
 141 | Free the LIST, but not the items it contains.  | 
 142 `-----------------------------------------------*/ 
 145 symbol_list_free (symbol_list 
*list
) 
 147   LIST_FREE (symbol_list
, list
); 
 151 /*--------------------. 
 152 | Return its length.  | 
 153 `--------------------*/ 
 156 symbol_list_length (symbol_list 
const *l
) 
 160        l 
&& !(l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
); 
 167 /*------------------------------. 
 168 | Get item N in symbol list L.  | 
 169 `------------------------------*/ 
 172 symbol_list_n_get (symbol_list 
*l
, int n
) 
 179   for (i 
= 0; i 
< n
; ++i
) 
 183           || (l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
)) 
 191 /*--------------------------------------------------------------. 
 192 | Get the data type (alternative in the union) of the value for | 
 193 | symbol N in symbol list L.                                    | 
 194 `--------------------------------------------------------------*/ 
 197 symbol_list_n_type_name_get (symbol_list 
*l
, location loc
, int n
) 
 199   l 
= symbol_list_n_get (l
, n
); 
 202       complain_at (loc
, _("invalid $ value: $%d"), n
); 
 205   aver (l
->content_type 
== SYMLIST_SYMBOL
); 
 206   return l
->content
.sym
->type_name
; 
 210 /*--------------------------------------. 
 211 | The item N in symbol list L is USED.  | 
 212 `--------------------------------------*/ 
 215 symbol_list_n_used_set (symbol_list 
*l
, int n
, bool used
) 
 217   l 
= symbol_list_n_get (l
, n
); 
 223 symbol_list_destructor_set (symbol_list 
*node
, const char *destructor
, 
 226   switch (node
->content_type
) 
 229         symbol_destructor_set (node
->content
.sym
, destructor
, loc
); 
 232         semantic_type_destructor_set ( 
 233           semantic_type_get (node
->content
.type_name
), destructor
, loc
); 
 235       case SYMLIST_DEFAULT_TAGGED
: 
 236         default_tagged_destructor_set (destructor
, loc
); 
 238       case SYMLIST_DEFAULT_TAGLESS
: 
 239         default_tagless_destructor_set (destructor
, loc
); 
 245 symbol_list_printer_set (symbol_list 
*node
, const char *printer
, location loc
) 
 247   switch (node
->content_type
) 
 250         symbol_printer_set (node
->content
.sym
, printer
, loc
); 
 253         semantic_type_printer_set ( 
 254           semantic_type_get (node
->content
.type_name
), printer
, loc
); 
 256       case SYMLIST_DEFAULT_TAGGED
: 
 257         default_tagged_printer_set (printer
, loc
); 
 259       case SYMLIST_DEFAULT_TAGLESS
: 
 260         default_tagless_printer_set (printer
, loc
);