1 | /* Lists of symbols for Bison |
2 | |
3 | Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2019 Free Software |
4 | Foundation, 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 for many different |
30 | purposes: rules, symbol declarations or properties (such as |
31 | %destructor, etc.)... */ |
32 | typedef struct symbol_list |
33 | { |
34 | /** |
35 | * Whether this node contains a symbol, a semantic type, a \c <*>, or a |
36 | * \c <>. |
37 | */ |
38 | enum { |
39 | SYMLIST_SYMBOL, |
40 | SYMLIST_TYPE |
41 | } content_type; |
42 | union { |
43 | /** |
44 | * The symbol or \c NULL iff |
45 | * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>. |
46 | */ |
47 | symbol *sym; |
48 | /** |
49 | * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>. |
50 | */ |
51 | semantic_type *sem_type; |
52 | } content; |
53 | |
54 | /* Named reference. */ |
55 | named_ref *named_ref; |
56 | |
57 | /* Proper location of the symbol, not all the rule */ |
58 | location sym_loc; |
59 | |
60 | /* If this symbol is the generated lhs for a midrule but this is the rule in |
61 | whose rhs it appears, MIDRULE = a pointer to that midrule. */ |
62 | struct symbol_list *midrule; |
63 | |
64 | /* If this symbol is the generated lhs for a midrule and this is that |
65 | midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it |
66 | appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the |
67 | parent rule. */ |
68 | struct symbol_list *midrule_parent_rule; |
69 | int midrule_parent_rhs_index; |
70 | |
71 | /*--------------------------------------------------------------. |
72 | | Used for rules only (attached to the "LHS", one per rule even | |
73 | | when several RHSs are bound to a single lhs via "|"). | |
74 | `--------------------------------------------------------------*/ |
75 | |
76 | /* Location of the RHS. */ |
77 | location rhs_loc; |
78 | |
79 | /* Precedence/associativity. */ |
80 | symbol *ruleprec; |
81 | |
82 | /* The action is attached to the LHS of a rule, but action properties for |
83 | * each RHS are also stored here. */ |
84 | code_props action_props; |
85 | |
86 | /* The location of the first %empty for this rule, or \a |
87 | empty_loc. */ |
88 | location percent_empty_loc; |
89 | |
90 | int dprec; |
91 | location dprec_loc; |
92 | int merger; |
93 | location merger_declaration_loc; |
94 | |
95 | /* Counts of the number of expected conflicts for this rule, or -1 if none |
96 | given. */ |
97 | int expected_sr_conflicts; |
98 | int expected_rr_conflicts; |
99 | |
100 | /* The list. */ |
101 | struct symbol_list *next; |
102 | } symbol_list; |
103 | |
104 | |
105 | /** Create a list containing \c sym at \c loc. */ |
106 | symbol_list *symbol_list_sym_new (symbol *sym, location loc); |
107 | |
108 | /** Create a list containing \c type_name at \c loc. */ |
109 | symbol_list *symbol_list_type_new (uniqstr type_name, location loc); |
110 | |
111 | /** Assign the type \c type_name to all the members of \c syms. |
112 | ** \returns \c syms */ |
113 | symbol_list *symbol_list_type_set (symbol_list *syms, |
114 | uniqstr type_name, location loc); |
115 | |
116 | /** Print this list. |
117 | |
118 | \pre For every node \c n in the list, <tt>n->content_type = |
119 | SYMLIST_SYMBOL</tt>. */ |
120 | void symbol_list_syms_print (const symbol_list *l, FILE *f); |
121 | |
122 | /** Prepend \c node to \c list. */ |
123 | symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node); |
124 | |
125 | /** Append \c node to \c list. */ |
126 | symbol_list *symbol_list_append (symbol_list *list, symbol_list *node); |
127 | |
128 | /** Free \c list, but not the items it contains. */ |
129 | void symbol_list_free (symbol_list *list); |
130 | |
131 | /** Return the length of \c l. */ |
132 | int symbol_list_length (symbol_list const *l); |
133 | |
134 | /** Get item \c n in symbol list \c l. |
135 | ** \pre 0 <= n |
136 | ** \post res != NULL |
137 | **/ |
138 | symbol_list *symbol_list_n_get (symbol_list *l, int n); |
139 | |
140 | /* Get the data type (alternative in the union) of the value for |
141 | symbol N in rule RULE. */ |
142 | uniqstr symbol_list_n_type_name_get (symbol_list *l, int n); |
143 | |
144 | /* Check whether the node is a border element of a rule. */ |
145 | bool symbol_list_null (symbol_list *node); |
146 | |
147 | /** Set the \c \%destructor or \c \%printer for \c node as \c cprops. */ |
148 | void symbol_list_code_props_set (symbol_list *node, code_props_type kind, |
149 | code_props const *cprops); |
150 | |
151 | #endif /* !SYMLIST_H_ */ |
152 | |