/* Ausschnitt aus GNU-C Compiler Parser */ structsp: STRUCT identifier '{' { $$ = start_struct (RECORD_TYPE, $2); /* Start scope of tag before parsing components. */ } component_decl_list '}' { $$ = finish_struct ($4, $5); /* Really define the structure. */ } | STRUCT '{' component_decl_list '}' { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),$3); } | STRUCT identifier { $$ = xref_tag (RECORD_TYPE, $2); } | UNION identifier '{' { $$ = start_struct (UNION_TYPE, $2); } component_decl_list '}' { $$ = finish_struct ($4, $5); } | UNION '{' component_decl_list '}' { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE),$3); } | UNION identifier { $$ = xref_tag (UNION_TYPE, $2); } | ENUM identifier '{' { $3 = suspend_momentary (); $$ = start_enum ($2); } enumlist maybecomma_warn '}' { $$ = finish_enum ($4, nreverse ($5)); resume_momentary ($3); } | ENUM '{' { $2 = suspend_momentary (); $$ = start_enum (NULL_TREE); } enumlist maybecomma_warn '}' { $$ = finish_enum ($3, nreverse ($4)); resume_momentary ($2); } | ENUM identifier { $$ = xref_tag (ENUMERAL_TYPE, $2); } ; maybecomma: /* empty */ | ',' ; maybecomma_warn: /* empty */ | ',' { if (pedantic) warning ("comma at end of enumerator list"); } ;