]>
git.saurik.com Git - bison.git/blob - src/symlist.c
b97c2ecb59ef82ec41037555c4f70c62a32cf1d2
   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 %symbol-default at LOC.  | 
  79 `----------------------------------------------------*/ 
  82 symbol_list_default_new (location loc
) 
  84   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  86   res
->content_type 
= SYMLIST_DEFAULT
; 
  94 /*-----------------------------------------------------------------------. 
  95 | Print this list, for which every content_type must be SYMLIST_SYMBOL.  | 
  96 `-----------------------------------------------------------------------*/ 
  99 symbol_list_syms_print (const symbol_list 
*l
, FILE *f
) 
 101   for (/* Nothing. */; l 
&& l
->content
.sym
; l 
= l
->next
) 
 103       symbol_print (l
->content
.sym
, f
); 
 104       fprintf (stderr
, l
->used 
? " used" : " unused"); 
 105       if (l 
&& l
->content
.sym
) 
 111 /*---------------------------. 
 112 | Prepend NODE to the LIST.  | 
 113 `---------------------------*/ 
 116 symbol_list_prepend (symbol_list 
*list
, symbol_list 
*node
) 
 123 /*-----------------------------------------------. 
 124 | Free the LIST, but not the items it contains.  | 
 125 `-----------------------------------------------*/ 
 128 symbol_list_free (symbol_list 
*list
) 
 130   LIST_FREE (symbol_list
, list
); 
 134 /*--------------------. 
 135 | Return its length.  | 
 136 `--------------------*/ 
 139 symbol_list_length (symbol_list 
const *l
) 
 143        l 
&& !(l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
); 
 150 /*------------------------------. 
 151 | Get item N in symbol list L.  | 
 152 `------------------------------*/ 
 155 symbol_list_n_get (symbol_list 
*l
, int n
) 
 162   for (i 
= 0; i 
< n
; ++i
) 
 166           || (l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
)) 
 174 /*--------------------------------------------------------------. 
 175 | Get the data type (alternative in the union) of the value for | 
 176 | symbol N in symbol list L.                                    | 
 177 `--------------------------------------------------------------*/ 
 180 symbol_list_n_type_name_get (symbol_list 
*l
, location loc
, int n
) 
 182   l 
= symbol_list_n_get (l
, n
); 
 185       complain_at (loc
, _("invalid $ value: $%d"), n
); 
 188   aver (l
->content_type 
== SYMLIST_SYMBOL
); 
 189   return l
->content
.sym
->type_name
; 
 193 /*--------------------------------------. 
 194 | The item N in symbol list L is USED.  | 
 195 `--------------------------------------*/ 
 198 symbol_list_n_used_set (symbol_list 
*l
, int n
, bool used
) 
 200   l 
= symbol_list_n_get (l
, n
); 
 206 symbol_list_destructor_set (symbol_list 
*node
, const char *destructor
, 
 209   switch (node
->content_type
) 
 212         symbol_destructor_set (node
->content
.sym
, destructor
, loc
); 
 215         semantic_type_destructor_set ( 
 216           semantic_type_get (node
->content
.type_name
), destructor
, loc
); 
 218       case SYMLIST_DEFAULT
: 
 219         default_destructor_set (destructor
, loc
); 
 225 symbol_list_printer_set (symbol_list 
*node
, const char *printer
, location loc
) 
 227   switch (node
->content_type
) 
 230         symbol_printer_set (node
->content
.sym
, printer
, loc
); 
 233         semantic_type_printer_set ( 
 234           semantic_type_get (node
->content
.type_name
), printer
, loc
); 
 236       case SYMLIST_DEFAULT
: 
 237         default_printer_set (printer
, loc
);