xref: /openbsd/gnu/gcc/gcc/gengtype-yacc.y (revision 73471bf0)
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 %%
318