1 /* Lists of symbols for Bison
2 
3    Copyright (C) 2002, 2005-2007, 2009-2012 Free Software Foundation,
4    Inc.
5 
6    This file is part of Bison, the GNU Compiler Compiler.
7 
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.
12 
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.
17 
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/>.  */
20 
21 #ifndef SYMLIST_H_
22 # define SYMLIST_H_
23 
24 # include "location.h"
25 # include "scan-code.h"
26 # include "symtab.h"
27 # include "named-ref.h"
28 
29 /* A list of symbols, used during the parsing to store the rules.  */
30 typedef struct symbol_list
31 {
32   /**
33    * Whether this node contains a symbol, a semantic type, a \c <*>, or a
34    * \c <>.
35    */
36   enum {
37     SYMLIST_SYMBOL, SYMLIST_TYPE,
38     SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
39   } content_type;
40   union {
41     /**
42      * The symbol or \c NULL iff
43      * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
44      */
45     symbol *sym;
46     /**
47      * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
48      */
49     uniqstr type_name;
50   } content;
51   location location;
52 
53   /* Proper location of the symbol, not all the rule */
54   location sym_loc;
55 
56   /* If this symbol is the generated lhs for a midrule but this is the rule in
57      whose rhs it appears, MIDRULE = a pointer to that midrule.  */
58   struct symbol_list *midrule;
59 
60   /* If this symbol is the generated lhs for a midrule and this is that
61      midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
62      appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
63      parent rule.  */
64   struct symbol_list *midrule_parent_rule;
65   int midrule_parent_rhs_index;
66 
67   /* The action is attached to the LHS of a rule, but action properties for
68    * each RHS are also stored here.  */
69   code_props action_props;
70 
71   /* Precedence/associativity.  */
72   symbol *ruleprec;
73   int dprec;
74   int merger;
75   location merger_declaration_location;
76 
77   /* Named reference. */
78   named_ref *named_ref;
79 
80   /* The list.  */
81   struct symbol_list *next;
82 } symbol_list;
83 
84 
85 /** Create a list containing \c sym at \c loc.  */
86 symbol_list *symbol_list_sym_new (symbol *sym, location loc);
87 
88 /** Create a list containing \c type_name at \c loc.  */
89 symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
90 
91 /** Create a list containing a \c <*> at \c loc.  */
92 symbol_list *symbol_list_default_tagged_new (location loc);
93 /** Create a list containing a \c <> at \c loc.  */
94 symbol_list *symbol_list_default_tagless_new (location loc);
95 
96 /** Print this list.
97 
98   \pre For every node \c n in the list, <tt>n->content_type =
99   SYMLIST_SYMBOL</tt>.  */
100 void symbol_list_syms_print (const symbol_list *l, FILE *f);
101 
102 /** Prepend \c node to \c list.  */
103 symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
104 
105 /** Free \c list, but not the items it contains.  */
106 void symbol_list_free (symbol_list *list);
107 
108 /** Return the length of \c l. */
109 int symbol_list_length (symbol_list const *l);
110 
111 /** Get item \c n in symbol list \c l.  */
112 symbol_list *symbol_list_n_get (symbol_list *l, int n);
113 
114 /* Get the data type (alternative in the union) of the value for
115    symbol N in rule RULE.  */
116 uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
117 
118 /* Check whether the node is a border element of a rule. */
119 bool symbol_list_null (symbol_list *node);
120 
121 /** Set the \c \%destructor for \c node as \c code at \c loc.  */
122 void symbol_list_destructor_set (symbol_list *node,
123                                  code_props const *destructor);
124 
125 /** Set the \c \%printer for \c node as \c code at \c loc.  */
126 void symbol_list_printer_set (symbol_list *node,
127                               code_props const *printer);
128 
129 #endif /* !SYMLIST_H_ */
130