gengtype-yacc.y revision 132718
1/* -*- indented-text -*- */ 2/* Process source files and output type information. 3 Copyright (C) 2002 Free Software Foundation, Inc. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to the Free 19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, 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 <s>PARAM_IS 48%token NUM 49%token PERCENTPERCENT "%%" 50%token <t>SCALAR 51%token <s>ID 52%token <s>STRING 53%token <s>ARRAY 54%token <s>PERCENT_ID 55%token <s>CHAR 56 57%type <p> struct_fields yacc_ids yacc_typematch 58%type <t> type lasttype 59%type <o> optionsopt options option optionseq optionseqopt 60%type <s> type_option 61 62%% 63 64start: /* empty */ 65 | typedef_struct start 66 | externstatic start 67 | yacc_union start 68 ; 69 70typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID 71 { 72 new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line, 73 $4, $2); 74 do_typedef ($6, $1, &lexer_line); 75 lexer_toplevel_done = 1; 76 } 77 ';' 78 {} 79 | ENT_STRUCT options '{' struct_fields '}' 80 { 81 new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line, 82 $4, $2); 83 lexer_toplevel_done = 1; 84 } 85 ';' 86 {} 87 ; 88 89externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal 90 { 91 note_variable ($4, adjust_field_type ($3, $2), $2, 92 &lexer_line); 93 } 94 | ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal 95 { 96 note_variable ($4, create_array ($3, $5), 97 $2, &lexer_line); 98 } 99 | ENT_EXTERNSTATIC options lasttype ID ARRAY ARRAY semiequal 100 { 101 note_variable ($4, create_array (create_array ($3, $6), 102 $5), 103 $2, &lexer_line); 104 } 105 ; 106 107lasttype: type 108 { 109 lexer_toplevel_done = 1; 110 $$ = $1; 111 } 112 ; 113 114semiequal: ';' 115 | '=' 116 ; 117 118yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch 119 PERCENTPERCENT 120 { 121 note_yacc_type ($2, $3, $5, &lexer_line); 122 } 123 ; 124 125yacc_typematch: /* empty */ 126 { $$ = NULL; } 127 | yacc_typematch PERCENT_ID yacc_ids 128 { 129 pair_p p; 130 for (p = $3; p->next != NULL; p = p->next) 131 { 132 p->name = NULL; 133 p->type = NULL; 134 } 135 p->name = NULL; 136 p->type = NULL; 137 p->next = $1; 138 $$ = $3; 139 } 140 | yacc_typematch PERCENT_ID '<' ID '>' yacc_ids 141 { 142 pair_p p; 143 type_p newtype = NULL; 144 if (strcmp ($2, "type") == 0) 145 newtype = (type_p) 1; 146 for (p = $6; p->next != NULL; p = p->next) 147 { 148 p->name = $4; 149 p->type = newtype; 150 } 151 p->name = $4; 152 p->next = $1; 153 p->type = newtype; 154 $$ = $6; 155 } 156 ; 157 158yacc_ids: /* empty */ 159 { $$ = NULL; } 160 | yacc_ids ID 161 { 162 pair_p p = xcalloc (1, sizeof (*p)); 163 p->next = $1; 164 p->line = lexer_line; 165 p->opt = xmalloc (sizeof (*(p->opt))); 166 p->opt->name = "tag"; 167 p->opt->next = NULL; 168 p->opt->info = (char *)$2; 169 $$ = p; 170 } 171 | yacc_ids CHAR 172 { 173 pair_p p = xcalloc (1, sizeof (*p)); 174 p->next = $1; 175 p->line = lexer_line; 176 p->opt = xmalloc (sizeof (*(p->opt))); 177 p->opt->name = "tag"; 178 p->opt->next = NULL; 179 p->opt->info = xasprintf ("'%s'", $2); 180 $$ = p; 181 } 182 ; 183 184struct_fields: { $$ = NULL; } 185 | type optionsopt ID bitfieldopt ';' struct_fields 186 { 187 pair_p p = xmalloc (sizeof (*p)); 188 p->type = adjust_field_type ($1, $2); 189 p->opt = $2; 190 p->name = $3; 191 p->next = $6; 192 p->line = lexer_line; 193 $$ = p; 194 } 195 | type optionsopt ID ARRAY ';' struct_fields 196 { 197 pair_p p = xmalloc (sizeof (*p)); 198 p->type = adjust_field_type (create_array ($1, $4), $2); 199 p->opt = $2; 200 p->name = $3; 201 p->next = $6; 202 p->line = lexer_line; 203 $$ = p; 204 } 205 | type optionsopt ID ARRAY ARRAY ';' struct_fields 206 { 207 pair_p p = xmalloc (sizeof (*p)); 208 p->type = create_array (create_array ($1, $5), $4); 209 p->opt = $2; 210 p->name = $3; 211 p->next = $7; 212 p->line = lexer_line; 213 $$ = p; 214 } 215 ; 216 217bitfieldopt: /* empty */ 218 | ':' NUM 219 | ':' ID 220 ; 221 222type: SCALAR 223 { $$ = $1; } 224 | ID 225 { $$ = resolve_typedef ($1, &lexer_line); } 226 | type '*' 227 { $$ = create_pointer ($1); } 228 | STRUCT ID '{' struct_fields '}' 229 { 230 new_structure ($2, 0, &lexer_line, $4, NULL); 231 $$ = find_structure ($2, 0); 232 } 233 | STRUCT ID 234 { $$ = find_structure ($2, 0); } 235 | UNION ID '{' struct_fields '}' 236 { 237 new_structure ($2, 1, &lexer_line, $4, NULL); 238 $$ = find_structure ($2, 1); 239 } 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 248enum_items: /* empty */ 249 | ID '=' NUM ',' enum_items 250 { } 251 | ID ',' enum_items 252 { } 253 | ID enum_items 254 { } 255 ; 256 257optionsopt: { $$ = NULL; } 258 | options { $$ = $1; } 259 ; 260 261options: GTY_TOKEN '(' '(' optionseqopt ')' ')' 262 { $$ = $4; } 263 ; 264 265type_option : ALIAS 266 { $$ = "ptr_alias"; } 267 | PARAM_IS 268 { $$ = $1; } 269 ; 270 271option: type_option '(' type ')' 272 { 273 options_p o = xmalloc (sizeof (*o)); 274 o->name = $1; 275 o->info = adjust_field_type ($3, NULL); 276 $$ = o; 277 } 278 | ID '(' STRING ')' 279 { 280 options_p o = xmalloc (sizeof (*o)); 281 o->name = $1; 282 o->info = (void *)$3; 283 $$ = o; 284 } 285 ; 286 287optionseq: option 288 { 289 $1->next = NULL; 290 $$ = $1; 291 } 292 | optionseq ',' option 293 { 294 $3->next = $1; 295 $$ = $3; 296 } 297 ; 298 299optionseqopt: { $$ = NULL; } 300 | optionseq { $$ = $1; } 301 ; 302%% 303