1 /* Lists of symbols for Bison 
   3    Copyright (C) 2002, 2005-2007, 2009-2015 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/>.  */ 
  27 /*--------------------------------------. 
  28 | Create a list containing SYM at LOC.  | 
  29 `--------------------------------------*/ 
  32 symbol_list_sym_new (symbol 
*sym
, location loc
) 
  34   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  36   res
->content_type 
= SYMLIST_SYMBOL
; 
  37   res
->content
.sym 
= sym
; 
  38   res
->location 
= res
->sym_loc 
= loc
; 
  39   res
->named_ref 
= NULL
; 
  42   res
->midrule_parent_rule 
= NULL
; 
  43   res
->midrule_parent_rhs_index 
= 0; 
  45   /* Members used for LHS only.  */ 
  47   res
->percent_empty_loc 
= empty_location
; 
  48   code_props_none_init (&res
->action_props
); 
  50   res
->dprec_location 
= empty_location
; 
  52   res
->merger_declaration_location 
= empty_location
; 
  60 /*--------------------------------------------. 
  61 | Create a list containing TYPE_NAME at LOC.  | 
  62 `--------------------------------------------*/ 
  65 symbol_list_type_new (uniqstr type_name
, location loc
) 
  67   symbol_list 
*res 
= xmalloc (sizeof *res
); 
  69   res
->content_type 
= SYMLIST_TYPE
; 
  70   res
->content
.sem_type 
= xmalloc (sizeof (semantic_type
)); 
  71   res
->content
.sem_type
->tag 
= type_name
; 
  72   res
->content
.sem_type
->location 
= loc
; 
  73   res
->content
.sem_type
->status 
= undeclared
; 
  75   res
->location 
= res
->sym_loc 
= loc
; 
  76   res
->named_ref 
= NULL
; 
  83 /*-----------------------------------------------------------------------. 
  84 | Print this list, for which every content_type must be SYMLIST_SYMBOL.  | 
  85 `-----------------------------------------------------------------------*/ 
  88 symbol_list_syms_print (const symbol_list 
*l
, FILE *f
) 
  91   for (/* Nothing. */; l 
&& l
->content
.sym
; l 
= l
->next
) 
  94       fputs (l
->content_type 
== SYMLIST_SYMBOL 
? "symbol: " 
  95              : l
->content_type 
== SYMLIST_TYPE 
? "type: " 
  96              : "invalid content_type: ", 
  98       symbol_print (l
->content
.sym
, f
); 
  99       fputs (l
->action_props
.is_value_used 
? " used" : " unused", f
); 
 105 /*---------------------------. 
 106 | Prepend NODE to the LIST.  | 
 107 `---------------------------*/ 
 110 symbol_list_prepend (symbol_list 
*list
, symbol_list 
*node
) 
 117 /*-------------------------. 
 118 | Append NODE to the LIST. | 
 119 `-------------------------*/ 
 122 symbol_list_append (symbol_list 
*list
, symbol_list 
*node
) 
 126   symbol_list 
*next 
= list
; 
 134 /*-----------------------------------------------. 
 135 | Free the LIST, but not the items it contains.  | 
 136 `-----------------------------------------------*/ 
 139 symbol_list_free (symbol_list 
*list
) 
 141   symbol_list 
*node
, *next
; 
 142   for (node 
= list
; node
; node 
= next
) 
 145       named_ref_free (node
->named_ref
); 
 146       if (node
->content_type 
== SYMLIST_TYPE
) 
 147         free (node
->content
.sem_type
); 
 153 /*--------------------. 
 154 | Return its length.  | 
 155 `--------------------*/ 
 158 symbol_list_length (symbol_list 
const *l
) 
 162        l 
&& !(l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
); 
 169 /*------------------------------. 
 170 | Get item N in symbol list L.  | 
 171 `------------------------------*/ 
 174 symbol_list_n_get (symbol_list 
*l
, int n
) 
 181   for (i 
= 0; i 
< n
; ++i
) 
 185           || (l
->content_type 
== SYMLIST_SYMBOL 
&& l
->content
.sym 
== NULL
)) 
 193 /*--------------------------------------------------------------. 
 194 | Get the data type (alternative in the union) of the value for | 
 195 | symbol N in symbol list L.                                    | 
 196 `--------------------------------------------------------------*/ 
 199 symbol_list_n_type_name_get (symbol_list 
*l
, location loc
, int n
) 
 201   l 
= symbol_list_n_get (l
, n
); 
 204       complain (&loc
, complaint
, _("invalid $ value: $%d"), n
); 
 207   aver (l
->content_type 
== SYMLIST_SYMBOL
); 
 208   return l
->content
.sym
->type_name
; 
 212 symbol_list_null (symbol_list 
*node
) 
 215     (node
->content_type 
== SYMLIST_SYMBOL 
&& !(node
->content
.sym
)); 
 219 symbol_list_code_props_set (symbol_list 
*node
, code_props_type kind
, 
 220                             code_props 
const *cprops
) 
 222   switch (node
->content_type
) 
 225       symbol_code_props_set (node
->content
.sym
, kind
, cprops
); 
 226       if (node
->content
.sym
->status 
== undeclared
) 
 227         node
->content
.sym
->status 
= used
; 
 230       semantic_type_code_props_set
 
 231         (semantic_type_get (node
->content
.sem_type
->tag
, 
 232                             &node
->content
.sem_type
->location
), 
 234       if (node
->content
.sem_type
->status 
== undeclared
) 
 235         node
->content
.sem_type
->status 
= used
;