]>
git.saurik.com Git - bison.git/blob - src/symlist.c
   1 /* Lists of symbols for Bison 
   3    Copyright (C) 2002, 2005-2007, 2009-2012 Free Software Foundation, 
   6    This file is part of Bison, the GNU Compiler Compiler. 
   8    This program is free software: you can redistribute it and/or modify 
   9    it under the terms of the GNU General Public License as published by 
  10    the Free Software Foundation, either version 3 of the License, or 
  11    (at your option) any later version. 
  13    This program is distributed in the hope that it will be useful, 
  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. 
  18    You should have received a copy of the GNU General Public License 
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ 
  28 /*--------------------------------------. 
  29 | Create a list containing SYM at LOC.  | 
  30 `--------------------------------------*/ 
  33 symbol_list_sym_new (symbol 
*sym
, location loc
) 
  35   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  37   res
->content_type 
= SYMLIST_SYMBOL
; 
  38   res
->content
.sym 
= sym
; 
  39   res
->location 
= res
->sym_loc 
= loc
; 
  42   res
->midrule_parent_rule 
= NULL
; 
  43   res
->midrule_parent_rhs_index 
= 0; 
  45   code_props_none_init (&res
->action_props
); 
  51   res
->named_ref 
= NULL
; 
  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
; 
  70   res
->location 
= res
->sym_loc 
= loc
; 
  71   res
->named_ref 
= NULL
; 
  78 /*----------------------------------------. 
  79 | Create a list containing a <*> at LOC.  | 
  80 `----------------------------------------*/ 
  83 symbol_list_default_tagged_new (location loc
) 
  85   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  87   res
->content_type 
= SYMLIST_DEFAULT_TAGGED
; 
  88   res
->location 
= res
->sym_loc 
= loc
; 
  89   res
->named_ref 
= NULL
; 
  96 /*---------------------------------------. 
  97 | Create a list containing a <> at LOC.  | 
  98 `---------------------------------------*/ 
 101 symbol_list_default_tagless_new (location loc
) 
 103   symbol_list 
*res 
= xmalloc (sizeof *res
); 
 105   res
->content_type 
= SYMLIST_DEFAULT_TAGLESS
; 
 106   res
->location 
= res
->sym_loc 
= loc
; 
 107   res
->named_ref 
= NULL
; 
 114 /*-----------------------------------------------------------------------. 
 115 | Print this list, for which every content_type must be SYMLIST_SYMBOL.  | 
 116 `-----------------------------------------------------------------------*/ 
 119 symbol_list_syms_print (const symbol_list 
*l
, FILE *f
) 
 121   for (/* Nothing. */; l 
&& l
->content
.sym
; l 
= l
->next
) 
 123       symbol_print (l
->content
.sym
, f
); 
 124       fprintf (stderr
, l
->action_props
.is_value_used 
? " used" : " unused"); 
 125       if (l 
&& l
->content
.sym
) 
 131 /*---------------------------. 
 132 | Prepend NODE to the LIST.  | 
 133 `---------------------------*/ 
 136 symbol_list_prepend (symbol_list 
*list
, symbol_list 
*node
) 
 143 /*-----------------------------------------------. 
 144 | Free the LIST, but not the items it contains.  | 
 145 `-----------------------------------------------*/ 
 148 symbol_list_free (symbol_list 
*list
) 
 150   symbol_list 
*node
, *next
; 
 151   for (node 
= list
; node
; node 
= next
) 
 154       named_ref_free (node
->named_ref
); 
 160 /*--------------------. 
 161 | Return its length.  | 
 162 `--------------------*/ 
 165 symbol_list_length (symbol_list 
const *l
) 
 169        l 
&& !(l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
); 
 176 /*------------------------------. 
 177 | Get item N in symbol list L.  | 
 178 `------------------------------*/ 
 181 symbol_list_n_get (symbol_list 
*l
, int n
) 
 188   for (i 
= 0; i 
< n
; ++i
) 
 192           || (l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
)) 
 200 /*--------------------------------------------------------------. 
 201 | Get the data type (alternative in the union) of the value for | 
 202 | symbol N in symbol list L.                                    | 
 203 `--------------------------------------------------------------*/ 
 206 symbol_list_n_type_name_get (symbol_list 
*l
, location loc
, int n
) 
 208   l 
= symbol_list_n_get (l
, n
); 
 211       complain_at (loc
, _("invalid $ value: $%d"), n
); 
 214   aver (l
->content_type 
== SYMLIST_SYMBOL
); 
 215   return l
->content
.sym
->type_name
; 
 219 symbol_list_null (symbol_list 
*node
) 
 222     (node
->content_type 
== SYMLIST_SYMBOL 
&& !(node
->content
.sym
)); 
 226 symbol_list_destructor_set (symbol_list 
*node
, char const *code
, location loc
) 
 228   code_props destructor
; 
 229   code_props_symbol_action_init (&destructor
, code
, loc
); 
 230   code_props_translate_code (&destructor
); 
 231   switch (node
->content_type
) 
 234         symbol_destructor_set (node
->content
.sym
, &destructor
); 
 237         semantic_type_destructor_set ( 
 238           semantic_type_get (node
->content
.type_name
), &destructor
); 
 240       case SYMLIST_DEFAULT_TAGGED
: 
 241         default_tagged_destructor_set (&destructor
); 
 243       case SYMLIST_DEFAULT_TAGLESS
: 
 244         default_tagless_destructor_set (&destructor
); 
 250 symbol_list_printer_set (symbol_list 
*node
, char const *code
, location loc
) 
 253   code_props_symbol_action_init (&printer
, code
, loc
); 
 254   code_props_translate_code (&printer
); 
 255   switch (node
->content_type
) 
 258         symbol_printer_set (node
->content
.sym
, &printer
); 
 261         semantic_type_printer_set ( 
 262           semantic_type_get (node
->content
.type_name
), &printer
); 
 264       case SYMLIST_DEFAULT_TAGGED
: 
 265         default_tagged_printer_set (&printer
); 
 267       case SYMLIST_DEFAULT_TAGLESS
: 
 268         default_tagless_printer_set (&printer
);