target.h (globalize_decl_name): New.
[gcc.git] / gcc / gengtype-yacc.y
1 /* -*- indented-text -*- */
2 /* Process source files and output type information.
3 Copyright (C) 2002, 2004 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
21
22 %{
23 #include "bconfig.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "gengtype.h"
28 #define YYERROR_VERBOSE
29 %}
30
31 %union {
32 type_p t;
33 pair_p p;
34 options_p o;
35 const char *s;
36 }
37
38 %token <t>ENT_TYPEDEF_STRUCT
39 %token <t>ENT_STRUCT
40 %token ENT_EXTERNSTATIC
41 %token ENT_YACCUNION
42 %token GTY_TOKEN
43 %token UNION
44 %token STRUCT
45 %token ENUM
46 %token ALIAS
47 %token NESTED_PTR
48 %token <s>PARAM_IS
49 %token NUM
50 %token PERCENTPERCENT "%%"
51 %token <t>SCALAR
52 %token <s>ID
53 %token <s>STRING
54 %token <s>ARRAY
55 %token <s>PERCENT_ID
56 %token <s>CHAR
57
58 %type <p> struct_fields yacc_ids yacc_typematch
59 %type <t> type lasttype
60 %type <o> optionsopt options option optionseq optionseqopt
61 %type <s> type_option stringseq
62
63 %%
64
65 start: /* empty */
66 | typedef_struct start
67 | externstatic start
68 | yacc_union start
69 ;
70
71 typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
72 {
73 new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
74 $4, $2);
75 do_typedef ($6, $1, &lexer_line);
76 lexer_toplevel_done = 1;
77 }
78 ';'
79 {}
80 | ENT_STRUCT options '{' struct_fields '}'
81 {
82 new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
83 $4, $2);
84 lexer_toplevel_done = 1;
85 }
86 ';'
87 {}
88 ;
89
90 externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
91 {
92 note_variable ($4, adjust_field_type ($3, $2), $2,
93 &lexer_line);
94 }
95 | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
96 {
97 note_variable ($4, create_array ($3, $5),
98 $2, &lexer_line);
99 }
100 | ENT_EXTERNSTATIC options lasttype ID ARRAY ARRAY semiequal
101 {
102 note_variable ($4, create_array (create_array ($3, $6),
103 $5),
104 $2, &lexer_line);
105 }
106 ;
107
108 lasttype: type
109 {
110 lexer_toplevel_done = 1;
111 $$ = $1;
112 }
113 ;
114
115 semiequal: ';'
116 | '='
117 ;
118
119 yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch
120 PERCENTPERCENT
121 {
122 note_yacc_type ($2, $3, $5, &lexer_line);
123 }
124 ;
125
126 yacc_typematch: /* empty */
127 { $$ = NULL; }
128 | yacc_typematch PERCENT_ID yacc_ids
129 {
130 pair_p p;
131 for (p = $3; p->next != NULL; p = p->next)
132 {
133 p->name = NULL;
134 p->type = NULL;
135 }
136 p->name = NULL;
137 p->type = NULL;
138 p->next = $1;
139 $$ = $3;
140 }
141 | yacc_typematch PERCENT_ID '<' ID '>' yacc_ids
142 {
143 pair_p p;
144 type_p newtype = NULL;
145 if (strcmp ($2, "type") == 0)
146 newtype = (type_p) 1;
147 for (p = $6; p->next != NULL; p = p->next)
148 {
149 p->name = $4;
150 p->type = newtype;
151 }
152 p->name = $4;
153 p->next = $1;
154 p->type = newtype;
155 $$ = $6;
156 }
157 ;
158
159 yacc_ids: /* empty */
160 { $$ = NULL; }
161 | yacc_ids ID
162 {
163 pair_p p = XCNEW (struct pair);
164 p->next = $1;
165 p->line = lexer_line;
166 p->opt = XNEW (struct options);
167 p->opt->name = "tag";
168 p->opt->next = NULL;
169 p->opt->info = (char *)$2;
170 $$ = p;
171 }
172 | yacc_ids CHAR
173 {
174 pair_p p = XCNEW (struct pair);
175 p->next = $1;
176 p->line = lexer_line;
177 p->opt = XNEW (struct options);
178 p->opt->name = "tag";
179 p->opt->next = NULL;
180 p->opt->info = xasprintf ("'%s'", $2);
181 $$ = p;
182 }
183 ;
184
185 struct_fields: { $$ = NULL; }
186 | type optionsopt ID bitfieldopt ';' struct_fields
187 {
188 pair_p p = XNEW (struct pair);
189 p->type = adjust_field_type ($1, $2);
190 p->opt = $2;
191 p->name = $3;
192 p->next = $6;
193 p->line = lexer_line;
194 $$ = p;
195 }
196 | type optionsopt ID ARRAY ';' struct_fields
197 {
198 pair_p p = XNEW (struct pair);
199 p->type = adjust_field_type (create_array ($1, $4), $2);
200 p->opt = $2;
201 p->name = $3;
202 p->next = $6;
203 p->line = lexer_line;
204 $$ = p;
205 }
206 | type optionsopt ID ARRAY ARRAY ';' struct_fields
207 {
208 pair_p p = XNEW (struct pair);
209 p->type = create_array (create_array ($1, $5), $4);
210 p->opt = $2;
211 p->name = $3;
212 p->next = $7;
213 p->line = lexer_line;
214 $$ = p;
215 }
216 | type ':' bitfieldlen ';' struct_fields
217 { $$ = $5; }
218 ;
219
220 bitfieldopt: /* empty */
221 | ':' bitfieldlen
222 ;
223
224 bitfieldlen: NUM | ID
225 { }
226 ;
227
228 type: SCALAR
229 { $$ = $1; }
230 | ID
231 { $$ = resolve_typedef ($1, &lexer_line); }
232 | type '*'
233 { $$ = create_pointer ($1); }
234 | STRUCT ID '{' struct_fields '}'
235 { $$ = new_structure ($2, 0, &lexer_line, $4, NULL); }
236 | STRUCT ID
237 { $$ = find_structure ($2, 0); }
238 | UNION ID '{' struct_fields '}'
239 { $$ = new_structure ($2, 1, &lexer_line, $4, NULL); }
240 | UNION ID
241 { $$ = find_structure ($2, 1); }
242 | ENUM ID
243 { $$ = create_scalar_type ($2, strlen ($2)); }
244 | ENUM ID '{' enum_items '}'
245 { $$ = create_scalar_type ($2, strlen ($2)); }
246 ;
247
248 enum_items: /* empty */
249 | ID '=' NUM ',' enum_items
250 { }
251 | ID ',' enum_items
252 { }
253 | ID enum_items
254 { }
255 ;
256
257 optionsopt: { $$ = NULL; }
258 | options { $$ = $1; }
259 ;
260
261 options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
262 { $$ = $4; }
263 ;
264
265 type_option : ALIAS
266 { $$ = "ptr_alias"; }
267 | PARAM_IS
268 { $$ = $1; }
269 ;
270
271 option: ID
272 { $$ = create_option (NULL, $1, (void *)""); }
273 | ID '(' stringseq ')'
274 { $$ = create_option (NULL, $1, (void *)$3); }
275 | type_option '(' type ')'
276 { $$ = create_option (NULL, $1, adjust_field_type ($3, NULL)); }
277 | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
278 {
279 struct nested_ptr_data d;
280
281 d.type = adjust_field_type ($3, NULL);
282 d.convert_to = $5;
283 d.convert_from = $7;
284 $$ = create_option (NULL, "nested_ptr",
285 xmemdup (&d, sizeof (d), sizeof (d)));
286 }
287 ;
288
289 optionseq: option
290 {
291 $1->next = NULL;
292 $$ = $1;
293 }
294 | optionseq ',' option
295 {
296 $3->next = $1;
297 $$ = $3;
298 }
299 ;
300
301 optionseqopt: { $$ = NULL; }
302 | optionseq { $$ = $1; }
303 ;
304
305 stringseq: STRING
306 { $$ = $1; }
307 | stringseq STRING
308 {
309 size_t l1 = strlen ($1);
310 size_t l2 = strlen ($2);
311 char *s = XRESIZEVEC (char, $1, l1 + l2 + 1);
312 memcpy (s + l1, $2, l2 + 1);
313 XDELETE ($2);
314 $$ = s;
315 }
316 ;
317 %%