Import upstream sources.
[cparse] / c-parse.y
1 %{
2
3 /* enable chatty error messages */
4 #define YYERROR_VERBOSE 1
5
6 /* figure out the location of a non-terminal. We discard extent information
7 * but this isn't necessarily disastrous for our purpose. */
8 #define YYLLOC_DEFAULT(Current, Rhs, N) do { \
9 Current = Rhs[1]; \
10 } while(0)
11
12 #include "cparse.h"
13 #include <stddef.h>
14 #include <assert.h>
15
16 /* various bits of parsing infrastructure. increasingly i'm thinking some of
17 * this belongs in its own file. still... */
18
19 /* hang on to both ends of a declarator while it is being parsed. This idiom
20 * is used a lot with anonymous structures below, but we need an actual name
21 * for the type for this particular case. */
22 struct parsing_declarator {
23 struct declarator_type *first, **end;
24 char *name; /* pick up name */
25 };
26
27 /* we need to know what declaration specifiers apply to the current
28 * declarator. This means we need a stack of them to cope with nested
29 * declarations. */
30 struct declaration_specifiers_stack {
31 struct declaration_specifiers_stack *next;
32 struct declaration_specifiers *ds;
33 };
34
35 static struct declaration_specifiers_stack *declaration_specifiers_stack;
36
37 static void push_declaration_specifiers(struct declaration_specifiers *ds) {
38 struct declaration_specifiers_stack *n;
39
40 NEW(n);
41 n->next = declaration_specifiers_stack;
42 n->ds = ds;
43 declaration_specifiers_stack = n;
44 }
45
46 static void pop_declaration_specifiers(void) {
47 /* can we have ->= and .= operators? */
48 declaration_specifiers_stack = declaration_specifiers_stack->next;
49 }
50
51 static struct declaration_specifiers *top_declaration_specifiers(void) {
52 return declaration_specifiers_stack->ds;
53 }
54
55 static void check_top_declaration_specifier(struct declaration_specifiers *ds) {
56 assert(declaration_specifiers_stack->ds == ds);
57 }
58
59 /* make up an actual declarator from a completed parse */
60 static struct declarator *get_declarator(struct parsing_declarator *pd,
61 const struct location *where) {
62 struct declarator *d;
63
64 NEW(d);
65 d->declarator_type = pd->first;
66 d->declaration_specifiers = top_declaration_specifiers();
67 d->name = pd->name;
68 d->where = *where;
69 return d;
70 }
71
72 static struct expression expr_star; /* kludge */
73
74 static void warn_old_style_function(const struct location *where) {
75 inputwarning(where, warn_obsolete,
76 "old-style function declarator");
77 }
78
79 void parser_init(FILE *fp) {
80 yyin = fp;
81 translation_unit = 0;
82 scope_init();
83 gcc_extensions();
84 }
85
86 %}
87
88 %debug
89 %verbose
90 %expect 11
91 %defines
92
93 %union {
94 long i;
95 unsigned long u;
96 char *s;
97 struct {
98 char *name;
99 struct declarator *declarator;
100 } name;
101 struct declaration_specifiers *declaration_specifiers;
102 struct declarator *declarator;
103 struct parsing_declarator *declarator_parse;
104 struct declaration *declaration;
105 struct identifier_list *identifier_list;
106 struct expression *expression;
107 struct expression_list *expression_list;
108 struct initializer *initializer;
109 struct designator *designator;
110 struct external_declaration *external_declaration;
111 struct function_definition *function_definition;
112 struct enumerator *enumerator;
113 struct statement *statement;
114 /* transients for parsing lists */
115 struct { struct declarator *first, **end; } *declarator_list;
116 struct { struct declaration *first, **end; } *declaration_list;
117 struct { struct identifier_list *first, **end; } *identifier_list_parse;
118 struct { struct expression_list *first, **end; } *parsing_expression_list;
119 struct { struct initializer *first, **end; } *initializer_list;
120 struct { struct designator *first, **end; } *designator_list;
121 struct { struct external_declaration *first, **end; } *external_declaration_list;
122 struct { struct enumerator *first, **end; } *enumerator_list;
123 struct { struct statement *first, **end; } *statement_list;
124 }
125
126 %token <i> MEMBER "->"
127 %token <i> INCR "++"
128 %token <i> DECR "--"
129 %token <i> SL "<<"
130 %token <i> SR ">>"
131 %token <i> LE "<="
132 %token <i> GE ">="
133 %token <i> EQ "=="
134 %token <i> NE "!="
135 %token <i> AND "&&"
136 %token <i> OR "||"
137 %token <i> MULEQ "*="
138 %token <i> DIVEQ "/="
139 %token <i> MODEQ "%="
140 %token <i> ADDEQ "+="
141 %token <i> SUBEQ "-="
142 %token <i> SLEQ "<<="
143 %token <i> SREQ ">>="
144 %token <i> ANDEQ "&="
145 %token <i> XOREQ "^="
146 %token <i> OREQ "|="
147
148 %token <i> VARARG "..."
149
150 %token <i> '&'
151 %token <i> '*'
152 %token <i> '+'
153 %token <i> '-'
154 %token <i> '~'
155 %token <i> '!'
156 %token <i> '/'
157 %token <i> '%'
158 %token <i> '<'
159 %token <i> '>'
160 %token <i> '^'
161 %token <i> '|'
162 %token <i> ','
163 %token <i> '='
164 %token <i> '.'
165
166 %token <u> AUTO "auto"
167 %token BREAK "break"
168 %token CASE "case"
169 %token <u> CHAR "char"
170 %token <u> CONST "const"
171 %token CONTINUE "continue"
172 %token DEFAULT "default"
173 %token DO "do"
174 %token <u> DOUBLE "double"
175 %token ELSE "else"
176 %token ENUM "enum"
177 %token <u> EXTERN "extern"
178 %token <u> FLOAT "float"
179 %token FOR "for"
180 %token GOTO "goto"
181 %token IF "if"
182 %token <u> INLINE "inline"
183 %token <u> INT "int"
184 %token <u> LONG "long"
185 %token <u> REGISTER "register"
186 %token <u> RESTRICT "restrict"
187 %token RETURN "return"
188 %token <u> SHORT "short"
189 %token <u> SIGNED "signed"
190 %token SIZEOF "sizeof"
191 %token <u> STATIC "static"
192 %token <u> STRUCT "struct"
193 %token SWITCH "switch"
194 %token <u> TYPEDEF "typedef"
195 %token <u> UNION "union"
196 %token <u> UNSIGNED "unsigned"
197 %token <u> VOID "void"
198 %token <u> VOLATILE "volatile"
199 %token WHILE "while"
200 %token <u> BOOL "_Bool"
201 %token <u> COMPLEX "_Complex"
202 %token <u> IMAGINARY "_Imaginary"
203 %token ATTRIBUTE "__attribute__"
204 %token <u> GCC_VA_LIST "__builtin_va_list"
205 %token GCC_VA_ARG "__builtin_va_arg"
206 %token GCC_EXPECT "__builtin_expect"
207
208 %token <name> TYPEDEF_NAME
209 %token <name> ID
210 %token <s> NUMBER
211 %token <s> STRINGLIT
212 %token <s> CHARLIT
213 %token <s> WSTRINGLIT
214 %token <s> WCHARLIT
215
216 %type <u> storage_class_specifier
217 %type <u> type_qualifier
218 %type <u> struct_or_union
219 %type <u> type_qualifier_list
220 %type <u> type_qualifier_list_opt
221 %type <u> function_specifier
222 %type <u> basic_type_specifier
223
224 %type <name> identifier
225 %type <name> identifier_opt
226
227 %type <declaration_specifiers> type_specifier
228 %type <declaration_specifiers> struct_or_union_specifier
229 %type <declaration_specifiers> enum_specifier
230
231 %type <declaration_specifiers> declaration_specifiers
232 %type <declaration_specifiers> declaration_specifiers_definition
233 %type <declaration_specifiers> declaration_specifiers_opt
234 %type <declaration_specifiers> parameter_declaration_specifiers
235 %type <declaration_specifiers> specifier_qualifier_list
236 %type <declaration_specifiers> specifier_qualifier_list_definition
237 %type <declaration_specifiers> specifier_qualifier_list_opt
238 %type <declaration_specifiers> array_specifiers
239 %type <declarator> declarator_opt
240 %type <declarator> init_declarator_list_opt
241 %type <declarator> attributed_declarator
242 %type <declarator> attributed_init_declarator
243 %type <declarator> struct_declarator
244 %type <declarator_list> init_declarator_list
245 %type <declarator_list> struct_declarator_list
246
247 %type <declarator_parse> declarator pointer
248 %type <declarator_parse> direct_declarator
249 %type <declarator_parse> abstract_declarator
250 %type <declarator_parse> pointer_opt
251 %type <declarator_parse> direct_abstract_declarator
252 %type <declarator_parse> direct_abstract_declarator_opt
253 %type <declarator_parse> abstract_declarator_opt
254
255 %type <declaration> declaration
256 %type <declaration> struct_declaration
257 %type <declaration> parameter_declaration
258 %type <declaration> type_name
259 %type <declaration> main
260 %type <external_declaration_list> translation_unit
261 %type <external_declaration> external_declaration
262 %type <declaration_list> struct_declaration_list
263 %type <declaration_list> parameter_list
264 %type <declaration_list> declaration_list_opt
265
266 %type <identifier_list_parse> ID_list
267 %type <identifier_list> ID_list_opt
268
269 %type <expression> expression
270 %type <expression> expression_opt
271 %type <expression> primary_expression
272 %type <expression> postfix_expression
273 %type <expression> unary_expression
274 %type <expression> cast_expression
275 %type <expression> multiplicative_expression
276 %type <expression> additive_expression
277 %type <expression> shift_expression
278 %type <expression> relational_expression
279 %type <expression> equality_expression
280 %type <expression> AND_expression
281 %type <expression> exclusive_OR_expression
282 %type <expression> inclusive_OR_expression
283 %type <expression> logical_AND_expression
284 %type <expression> logical_OR_expression
285 %type <expression> conditional_expression
286 %type <expression> assignment_expression
287 %type <expression> constant_expression
288
289 %type <expression> array_size
290
291 %type <expression_list> argument_expression_list_opt
292 %type <parsing_expression_list> argument_expression_list
293
294 %type <initializer> initializer
295 %type <initializer> designated_initializer
296 %type <initializer_list> initializer_list
297 %type <designator_list> designator_list
298 %type <designator> designator
299
300 %type <i> variadic
301 %type <i> incrdecr
302 %type <i> member_operator
303 %type <i> unary_operator
304 %type <i> multiplicative_operator
305 %type <i> additive_operator
306 %type <i> shift_operator
307 %type <i> relational_operator
308 %type <i> equality_operator
309 %type <i> assignment_operator
310
311 %type <i> comma_opt
312
313 %type <function_definition> function_definition
314 %type <enumerator> enumerator
315 %type <enumerator> registered_enumerator
316 %type <enumerator_list> enumerator_list
317
318 %type <statement> statement
319 %type <statement> function_body
320 %type <statement> block_item
321 %type <statement> else_part_opt
322 %type <statement_list> block_item_list_opt
323
324 %%
325
326 main:
327 translation_unit {
328 translation_unit = $1->first;
329 }
330 ;
331
332 /* kludge */
333 identifier:
334 ID
335 | TYPEDEF_NAME
336 ;
337
338 identifier_opt:
339 identifier
340 | {
341 $$.name = 0;
342 $$.declarator = 0;
343 }
344 ;
345
346 /* C99 6.5 expressions */
347
348 primary_expression:
349 ID {
350 struct declarator *d;
351 $$ = expr(ex_id, &@1);
352 $$->u.name = $1.name;
353 d = $1.declarator;
354 if(!d) {
355 inputerror(&@1, "undeclared identifier '%s'", $1.name);
356 } else if(d->declaration_specifiers
357 && (d->declaration_specifiers->storage_class_specifiers
358 & SCS_TYPEDEF))
359 inputerror(&@1, "typedef-name '%s' used in expression", $1);
360 else
361 $$->valuetype = resolve_typedefs(d);
362 }
363 | NUMBER {
364 $$ = expr(ex_number, &@1);
365 $$->u.constant = $1;
366 $$->valuetype = numbertype($$);
367 }
368 | CHARLIT {
369 $$ = stringexpr(ex_char, $1, &@1);
370 }
371 | STRINGLIT {
372 $$ = stringexpr(ex_string, $1, &@1);
373 }
374 | WCHARLIT {
375 $$ = stringexpr(ex_wchar, $1, &@1);
376 }
377 | WSTRINGLIT {
378 $$ = stringexpr(ex_wstring, $1, &@1);
379 }
380 | '(' expression ')' {
381 $$ = paren($2, &@1);
382 }
383 ;
384
385 postfix_expression:
386 primary_expression
387 | postfix_expression '[' expression ']' {
388 $$ = binary('[', $1, $3, &@2);
389 }
390 | postfix_expression '(' argument_expression_list_opt ')' {
391 $$ = fncallexpr($1, $3, &@2);
392 }
393 | GCC_VA_ARG '(' assignment_expression ',' type_name ')' {
394 $$ = expr(ex_gcc_va_arg, &@2);
395 $$->u.gcc_va_arg.arg = $3;
396 $$->u.gcc_va_arg.type = $5;
397 $$->valuetype = resolve_typedefs($5->declarator_list);
398 }
399 | GCC_EXPECT '(' assignment_expression ',' assignment_expression ')' {
400 /* we can't hack this in as a function as the return type is that of
401 * the LH argument */
402 $$ = expr(ex_gcc_expect, &@1);
403 /* XXX does the LH arg undergo any implicit conversions? */
404 $$->u.binary.l = $3;
405 $$->u.binary.r = $5;
406 $$->valuetype = $3->valuetype;
407 }
408 | postfix_expression member_operator identifier {
409 struct expression *e = expr(ex_id, &@2);
410 e->u.name = $3.name;
411 $$ = binary($2, $1, e, &@2);
412 }
413 | postfix_expression incrdecr {
414 $$ = postfix($2, $1, &@2);
415 }
416 | '(' type_name ')' '{' initializer_list comma_opt '}' {
417 $$ = expr(ex_compound_literal, &@1);
418 $$->u.compound_literal.type = $2;
419 $$->u.compound_literal.value = $5->first;
420 declaration_constraints($2, dc_compound_literal);
421 $$->valuetype = resolve_typedefs($2->declarator_list);
422 }
423 ;
424
425 member_operator: '.' | "->" ;
426
427 incrdecr: "++" | "--" ;
428
429 argument_expression_list:
430 assignment_expression {
431 NEW($$);
432 NEW($$->first);
433 $$->first->e = $1;
434 $$->end = &$$->first->next;
435 }
436 | argument_expression_list ',' assignment_expression {
437 struct expression_list *e;
438 NEW(e);
439 e->e = $3;
440 *($$ = $1)->end = e;
441 $$->end = &e->next;
442 }
443 ;
444
445 argument_expression_list_opt:
446 argument_expression_list { $$ = $1->first; }
447 | { $$ = 0; }
448 ;
449
450 unary_expression:
451 postfix_expression
452 | unary_operator cast_expression {
453 $$ = prefix($1, $2, &@1);
454 }
455 | "sizeof" unary_expression {
456 $$ = prefix(SIZEOF, $2, &@1);
457 }
458 | "sizeof" '(' type_name ')' {
459 $$ = expr(ex_sizeof_type, &@1);
460 $$->u.type = $3;
461 declaration_constraints($3, dc_sizeof);
462 }
463 ;
464
465 /* putting sizeof in here would conflict with sizeof(type) */
466 unary_operator:
467 '&'
468 | '*'
469 | '+'
470 | '-'
471 | '~'
472 | '!'
473 | incrdecr
474 ;
475
476 cast_expression:
477 unary_expression
478 | '(' type_name ')' cast_expression {
479 $$ = expr(ex_cast, &@1);
480 $$->valuetype = $2->declarator_list;
481 $$->u.cast = $4;
482 declaration_constraints($2, dc_cast);
483 }
484 ;
485
486 multiplicative_expression:
487 cast_expression
488 | multiplicative_expression multiplicative_operator cast_expression {
489 $$ = binary($2, $1, $3, &@2);
490 }
491 ;
492
493 multiplicative_operator:
494 '*'
495 | '/'
496 | '%'
497 ;
498
499 additive_expression:
500 multiplicative_expression
501 | additive_expression additive_operator multiplicative_expression {
502 $$ = binary($2, $1, $3, &@2);
503 }
504 ;
505
506 additive_operator:
507 '+'
508 | '-'
509 ;
510
511 shift_expression:
512 additive_expression
513 | shift_expression shift_operator additive_expression {
514 $$ = binary($2, $1, $3, &@2);
515 }
516 ;
517
518 shift_operator:
519 "<<"
520 | ">>"
521 ;
522
523 relational_expression:
524 shift_expression
525 | relational_expression relational_operator shift_expression {
526 $$ = binary($2, $1, $3, &@2);
527 }
528 ;
529
530 relational_operator:
531 '<'
532 | '>'
533 | "<="
534 | ">="
535 ;
536
537 equality_expression:
538 relational_expression
539 | equality_expression equality_operator relational_expression {
540 $$ = binary($2, $1, $3, &@2);
541 }
542 ;
543
544 equality_operator:
545 "=="
546 | "!="
547 ;
548
549 AND_expression:
550 equality_expression
551 | AND_expression '&' equality_expression {
552 $$ = binary($2, $1, $3, &@2);
553 }
554 ;
555
556 exclusive_OR_expression:
557 AND_expression
558 | exclusive_OR_expression '^' AND_expression {
559 $$ = binary($2, $1, $3, &@2);
560 }
561 ;
562
563 inclusive_OR_expression:
564 exclusive_OR_expression
565 | inclusive_OR_expression '|' exclusive_OR_expression {
566 $$ = binary($2, $1, $3, &@2);
567 }
568 ;
569
570 logical_AND_expression:
571 inclusive_OR_expression
572 | logical_AND_expression "&&" inclusive_OR_expression {
573 $$ = binary($2, $1, $3, &@2);
574 }
575 ;
576
577 logical_OR_expression:
578 logical_AND_expression
579 | logical_OR_expression "||" logical_AND_expression {
580 $$ = binary($2, $1, $3, &@2);
581 }
582 ;
583
584 conditional_expression:
585 logical_OR_expression
586 | logical_OR_expression '?' expression ':' conditional_expression {
587 $$ = binary('?', $1, binary(':', $3, $5, &@4), &@2);
588 }
589 ;
590
591 assignment_expression:
592 conditional_expression
593 | unary_expression assignment_operator assignment_expression {
594 $$ = binary($2, $1, $3, &@2);
595 }
596 ;
597
598 assignment_operator:
599 '='
600 | "*="
601 | "/="
602 | "%="
603 | "+="
604 | "-="
605 | "<<="
606 | ">>="
607 | "&="
608 | "^="
609 | "|="
610 ;
611
612 expression:
613 assignment_expression
614 | expression ',' assignment_expression {
615 $$ = binary($2, $1, $3, &@2);
616 }
617 ;
618
619 expression_opt:
620 expression
621 | { $$ = 0; }
622 ;
623
624 constant_expression:
625 conditional_expression
626 ;
627
628 /* C99 6.7 declarations */
629
630 declaration:
631 declaration_specifiers init_declarator_list_opt ';' {
632 struct declaration_specifiers *ds = $1;
633 struct declarator *decl = $2;
634
635 check_top_declaration_specifier(ds);
636 pop_declaration_specifiers();
637 /* will have already done add_declarator() */
638 NEW($$);
639 $$->declaration_specifiers = ds;
640 $$->declarator_list = decl;
641 $$->where = @1;
642 /* constraints checked by calling production */
643 }
644 ;
645
646 declaration_specifiers:
647 declaration_specifiers_definition {
648 push_declaration_specifiers($1);
649 $$ = $1;
650 }
651 ;
652
653 declaration_specifiers_definition:
654 storage_class_specifier declaration_specifiers_opt {
655 struct declaration_specifiers ds = {
656 .type_specifiers = 0,
657 .storage_class_specifiers = $1,
658 .type_qualifiers = 0,
659 .function_specifiers = 0,
660 .name = 0,
661 .structure = 0,
662 .enumerators = 0,
663 .type = 0,
664 .enum_compat_type = 0
665 };
666 $$ = merge_declaration_specifiers($2, &ds);
667 }
668 | type_specifier declaration_specifiers_opt {
669 $$ = merge_declaration_specifiers($2, $1);
670 }
671 | type_qualifier declaration_specifiers_opt {
672 struct declaration_specifiers ds = {
673 .type_specifiers = 0,
674 .storage_class_specifiers = 0,
675 .type_qualifiers = $1,
676 .function_specifiers = 0,
677 .name = 0,
678 .structure = 0,
679 .enumerators = 0,
680 .type = 0,
681 .enum_compat_type = 0
682 };
683 $$ = merge_declaration_specifiers($2, &ds);
684 }
685 | function_specifier declaration_specifiers_opt {
686 struct declaration_specifiers ds = {
687 .type_specifiers = 0,
688 .storage_class_specifiers = 0,
689 .type_qualifiers = 0,
690 .function_specifiers = $1,
691 .name = 0,
692 .structure = 0,
693 .enumerators = 0,
694 .type = 0,
695 .enum_compat_type = 0
696 };
697 $$ = merge_declaration_specifiers($2, &ds);
698 }
699 | attribute_specifier declaration_specifiers_opt {
700 $$ = $2;
701 }
702 ;
703
704 declaration_specifiers_opt:
705 declaration_specifiers_definition
706 | {
707 NEW($$);
708 }
709 ;
710
711 init_declarator_list_opt:
712 init_declarator_list { $$ = $1->first; }
713 | { $$ = 0; }
714 ;
715
716 init_declarator_list:
717 attributed_init_declarator {
718 NEW($$);
719 $$->first = $1;
720 $$->end = &$1->next;
721 }
722 | init_declarator_list ',' attribute_specifier_list attributed_init_declarator {
723 $$ = $1;
724 *$$->end = $4;
725 $$->end = &$4->next;
726 }
727 ;
728
729 attributed_declarator:
730 declarator attribute_specifier_list { $$ = get_declarator($1, &@1); }
731 ;
732
733 attributed_init_declarator:
734 attributed_declarator {
735 add_declaration($$ = $1);
736 }
737 | attributed_declarator '=' {
738 /* need to do this before we parse the initializer */
739 add_declaration($1);
740 } initializer {
741 $$ = $1;
742 $$->initializer = $4;
743 }
744 ;
745
746 /* C99 6.7.1 storage-class specifiers */
747
748 storage_class_specifier:
749 "typedef"
750 | "extern"
751 | "static"
752 | "auto"
753 | "register"
754 ;
755
756 /* C99 6.7.2 type specifiers */
757
758 type_specifier:
759 basic_type_specifier {
760 NEW($$);
761 $$->type_specifiers = $1;
762 }
763 | struct_or_union_specifier { $$ = $1; }
764 | enum_specifier
765 | TYPEDEF_NAME {
766 NEW($$);
767 $$->type_specifiers = TS_TYPEDEF;
768 $$->name = $1.name;
769 $$->type = $1.declarator;
770 }
771 ;
772
773 basic_type_specifier:
774 "void"
775 | "char"
776 | "short"
777 | "int"
778 | "long"
779 | "float"
780 | "double"
781 | "signed"
782 | "unsigned"
783 | "_Bool"
784 | "_Complex"
785 | "_Imaginary"
786 | GCC_VA_LIST
787 ;
788
789 /* C99 6.2.7.1 structure and union specifiers */
790
791 /* shift/reduce conflict between
792 ID
793 and
794 ID '{'
795 resolved by shifting (which is right)
796 */
797 struct_or_union_specifier:
798 struct_or_union identifier_opt '{' struct_declaration_list '}' attribute_specifier_list {
799 NEW($$);
800 $$->type_specifiers = $1 | TS_DEFINITION;
801 $$->name = $2.name;
802 $$->structure = $4->first;
803 }
804 | struct_or_union identifier {
805 NEW($$);
806 $$->type_specifiers = $1;
807 $$->name = $2.name;
808 }
809 | struct_or_union { /* shift/reduce conflict */
810 inputerror(&@1, "structure must have a tag or a definition");
811 NEW($$);
812 $$->type_specifiers = $1;
813 }
814 ;
815
816 struct_or_union:
817 "struct" attribute_specifier_list { $$ = $1; }
818 | "union" attribute_specifier_list { $$ = $1; }
819 ;
820
821 struct_declaration_list:
822 struct_declaration {
823 NEW($$);
824 $$->first = $1;
825 $$->end = &$1->next;
826 }
827 | struct_declaration_list struct_declaration {
828 $$ = $1;
829 *$$->end = $2;
830 $$->end = &$2->next;
831 }
832 ;
833
834 struct_declaration:
835 specifier_qualifier_list struct_declarator_list ';' {
836 check_top_declaration_specifier($1);
837 pop_declaration_specifiers();
838 NEW($$);
839 $$->declaration_specifiers = $1;
840 $$->declarator_list = $2->first;
841 declaration_constraints($$, dc_struct_member);
842 /* XXX perhaps add to a dictionary of struct/union declarations? */
843 $$->where = @1;
844 }
845 ;
846
847 specifier_qualifier_list:
848 specifier_qualifier_list_definition {
849 push_declaration_specifiers($1);
850 $$ = $1;
851 }
852 ;
853
854 specifier_qualifier_list_definition:
855 type_specifier specifier_qualifier_list_opt {
856 $$ = merge_declaration_specifiers($2, $1);
857 }
858 | type_qualifier specifier_qualifier_list_opt {
859 struct declaration_specifiers ds = {
860 .type_specifiers = 0,
861 .storage_class_specifiers = 0,
862 .type_qualifiers = $1,
863 .function_specifiers = 0,
864 .name = 0,
865 .structure = 0,
866 .enumerators = 0,
867 .type = 0,
868 .enum_compat_type = 0
869 };
870 $$ = merge_declaration_specifiers($2, &ds);
871 }
872 | storage_class_specifier specifier_qualifier_list_opt {
873 inputerror(&@1, "storage class specifiers not allowed here");
874 $$ = $2;
875 }
876 | function_specifier specifier_qualifier_list_opt {
877 inputerror(&@1, "function specifiers not allowed here");
878 $$ = $2;
879 }
880 | attribute_specifier specifier_qualifier_list_opt {
881 $$ = $2;
882 }
883 ;
884
885 specifier_qualifier_list_opt:
886 specifier_qualifier_list_definition
887 | {
888 NEW($$);
889 }
890 ;
891
892 struct_declarator_list:
893 struct_declarator attribute_specifier_list {
894 NEW($$);
895 $$->first = $1;
896 $$->end = &$1->next;
897 }
898 | struct_declarator_list ',' attribute_specifier_list struct_declarator attribute_specifier_list {
899 $$ = $1;
900 *$$->end = $4;
901 $$->end = &$4->next;
902 }
903 ;
904
905 struct_declarator:
906 attributed_declarator
907 | declarator_opt ':' constant_expression {
908 if(!($$ = $1)) {
909 NEW($$);
910 $$->declaration_specifiers = top_declaration_specifiers();
911 }
912 $$->bits = $3;
913 $$->where = @2;
914 }
915 ;
916
917 /* C99 6.7.2.2 enumeration specifiers */
918
919 enum_specifier:
920 enum identifier_opt '{' enumerator_list comma_opt '}' attribute_specifier_list {
921 NEW($$);
922 $$->type_specifiers = TS_ENUM | TS_DEFINITION;
923 $$->name = $2.name;
924 $$->enumerators = $4->first;
925 $$->enum_compat_type = TS_INT; /* XXX */
926 if($5)
927 inputwarning(&@5, warn_compat,
928 "enumerator-list trailing comma not supported in C89 or C++");
929 /* XXX pick type and fix up the declarators of all the enumerators */
930 }
931 | enum identifier {
932 NEW($$);
933 $$->type_specifiers = TS_ENUM;
934 $$->name = $2.name;
935 }
936 ;
937
938 enum:
939 "enum" attribute_specifier_list
940 ;
941
942 enumerator_list:
943 registered_enumerator {
944 NEW($$);
945 $$->first = $1;
946 $$->end = &$1->next;
947 }
948 | enumerator_list ',' registered_enumerator {
949 *($$ = $1)->end = $3;
950 $$->end = &$3->next;
951 }
952 ;
953
954 registered_enumerator:
955 enumerator {
956 struct declarator *d;
957 NEW(d);
958 d->name = $1->name;
959 d->where = $$->where;
960 NEW(d->declaration_specifiers);
961 d->declaration_specifiers->type_specifiers = TS_INT;
962 add_declaration(d);
963 $$ = $1;
964 $$->declarator = d;
965 }
966 ;
967
968 enumerator:
969 identifier {
970 NEW($$);
971 $$->name = $1.name;
972 $$->where = @1;
973 }
974 | identifier '=' constant_expression {
975 NEW($$);
976 $$->name = $1.name;
977 $$->value = $3;
978 $$->where = @1;
979 }
980 ;
981
982 /* C99 6.7.3 type qualifiers */
983
984 type_qualifier:
985 "const"
986 | "restrict"
987 | "volatile"
988 ;
989
990 /* C99 6.7.4 function specifiers */
991
992 function_specifier:
993 "inline"
994 ;
995
996 /* C99 6.7.5 declarators */
997
998 declarator_opt:
999 declarator { $$ = get_declarator($1, &@1); }
1000 | { $$ = 0; }
1001 ;
1002
1003 declarator:
1004 pointer direct_declarator {
1005 $$ = $2;
1006 *$$->end = $1->first;
1007 $$->end = $1->end;
1008 }
1009 | direct_declarator
1010 ;
1011
1012 direct_declarator:
1013 ID {
1014 NEW($$);
1015 $$->end = &$$->first;
1016 $$->name = $1.name;
1017 /* XXX warn about redeclaration */
1018 }
1019 | '(' attribute_specifier_list declarator ')' {
1020 $$ = $3;
1021 }
1022 | direct_declarator '[' array_specifiers array_size ']' {
1023 struct declarator_type *t;
1024
1025 NEW(t);
1026 $$ = $1;
1027 t->type = dt_array;
1028 t->type_qualifiers = $3->type_qualifiers;
1029 t->storage_class_specifiers = $3->storage_class_specifiers;
1030 if($4 == &expr_star) {
1031 t->u.array.size = 0;
1032 t->u.array.flags = AF_STAR;
1033 } else
1034 t->u.array.size = $4;
1035 t->where = @2;
1036 *$$->end = t;
1037 $$->end = &t->next;
1038 }
1039 | direct_declarator '(' ID_list_opt ')' {
1040 struct declarator_type *t;
1041
1042 NEW(t);
1043 $$ = $1;
1044 t->type = dt_old_function;
1045 t->u.old_function.args = $3;
1046 t->where = @2;
1047 *$$->end = t;
1048 $$->end = &t->next;
1049 warn_old_style_function(&@2);
1050 }
1051 | direct_declarator '(' parameter_list variadic ')' {
1052 struct declarator_type *t;
1053
1054 NEW(t);
1055 $$ = $1;
1056 t->type = dt_function;
1057 t->u.function.args = $3->first;
1058 t->u.function.variadic = $4;
1059 t->where = @2;
1060 *$$->end = t;
1061 $$->end = &t->next;
1062 }
1063 ;
1064
1065 array_size:
1066 assignment_expression
1067 | '*' { $$ = &expr_star; }
1068 | { $$ = 0; }
1069 ;
1070
1071 array_specifiers:
1072 type_qualifier_list_opt {
1073 NEW($$);
1074 }
1075 | "static" type_qualifier_list_opt {
1076 NEW($$);
1077 $$->type_qualifiers = $2;
1078 $$->storage_class_specifiers = SCS_STATIC;
1079 }
1080 | type_qualifier_list "static" {
1081 NEW($$);
1082 $$->type_qualifiers = $1;
1083 $$->storage_class_specifiers = SCS_STATIC;
1084 }
1085 ;
1086
1087 variadic:
1088 ',' "..." { $$ = 1; }
1089 | { $$ = 0; }
1090 ;
1091
1092
1093 pointer_opt:
1094 pointer
1095 | {
1096 NEW($$);
1097 $$->end = &$$->first;
1098 }
1099 ;
1100
1101 pointer:
1102 '*' type_qualifier_list_opt {
1103 struct declarator_type *t;
1104
1105 NEW(t);
1106 t->type = dt_pointer;
1107 t->type_qualifiers = $2;
1108 t->where = @1;
1109 NEW($$);
1110 $$->first = t;
1111 $$->end = &t->next;
1112 }
1113 | '*' type_qualifier_list_opt pointer {
1114 struct declarator_type *t;
1115
1116 NEW(t);
1117 t->type = dt_pointer;
1118 t->type_qualifiers = $2;
1119 t->where = @1;
1120 $$ = $3;
1121 *$$->end = t;
1122 $$->end = &t->next;
1123 }
1124 ;
1125
1126 type_qualifier_list:
1127 type_qualifier
1128 | type_qualifier_list type_qualifier { $$ = $1 | $2; }
1129 | type_qualifier_list attribute_specifier
1130 ;
1131
1132 type_qualifier_list_opt:
1133 type_qualifier_list
1134 | { $$ = 0; }
1135 ;
1136
1137 parameter_list:
1138 parameter_declaration {
1139 NEW($$);
1140 $$->first = $1;
1141 $$->end = &$1->next;
1142 }
1143 | parameter_list ',' parameter_declaration {
1144 *$$->end = $3;
1145 $$->end = &$3->next;
1146 }
1147 ;
1148
1149 parameter_declaration_specifiers:
1150 declaration_specifiers {
1151 $$ = $1;
1152 }
1153 ;
1154
1155 /* declaration_constraints will be checked recursively once we know what
1156 * context we're really in (i.e. function-definition or not) */
1157 parameter_declaration:
1158 parameter_declaration_specifiers declarator {
1159 struct declarator *d = get_declarator($2, &@2);
1160 check_top_declaration_specifier($1);
1161 pop_declaration_specifiers();
1162 NEW($$);
1163 $$->declaration_specifiers = $1;
1164 $$->declarator_list = d;
1165 $$->where = @1;
1166 }
1167 | parameter_declaration_specifiers abstract_declarator_opt {
1168 struct declarator *d = get_declarator($2, $2->first ? &@2 : &@1);
1169 check_top_declaration_specifier($1);
1170 pop_declaration_specifiers();
1171 NEW($$);
1172 $$->declaration_specifiers = $1;
1173 $$->declarator_list = d;
1174 $$->where = @1;
1175 }
1176 ;
1177
1178 /* an old-style function declaration where all the parameter names match
1179 * typedef names is ambiguous - it could be a parameter list where all the
1180 * declarators are abstract. We resolve the ambiguity by assumiong that it is
1181 * the latter, modern form. */
1182 ID_list_opt:
1183 ID_list { $$ = $1->first; }
1184 | { $$ = 0; }
1185 ;
1186
1187 ID_list:
1188 ID {
1189 struct identifier_list *i;
1190
1191 NEW(i);
1192 i->id = $1.name;
1193 /* XXX warn about redeclaration */
1194 NEW($$);
1195 $$->first = i;
1196 $$->end = &i->next;
1197 }
1198 | ID_list ',' ID {
1199 struct identifier_list *i;
1200
1201 NEW(i);
1202 i->id = $3.name;
1203 /* XXX warn about redeclaration */
1204 *($$ = $1)->end = i;
1205 $$->end = &i->next;
1206 }
1207 ;
1208
1209 /* C99 6.7.6 type names */
1210
1211 type_name:
1212 specifier_qualifier_list abstract_declarator_opt {
1213 struct declarator *d = get_declarator($2, $2->first ? &@2 : &@1);
1214 check_top_declaration_specifier($1);
1215 pop_declaration_specifiers();
1216 NEW($$);
1217 $$->declaration_specifiers = $1;
1218 $$->declarator_list = d;
1219 $$->where = @1;
1220 /* declaration_constraints checked by calling production */
1221 }
1222 ;
1223
1224 direct_abstract_declarator:
1225 '(' attribute_specifier_list abstract_declarator ')' {
1226 $$ = $3;
1227 }
1228 | direct_abstract_declarator_opt '[' array_specifiers array_size ']' {
1229 struct declarator_type *t;
1230
1231 NEW(t);
1232 $$ = $1;
1233 t->type = dt_array;
1234 t->type_qualifiers = $3->type_qualifiers;
1235 t->storage_class_specifiers = $3->storage_class_specifiers;
1236 if($4 == &expr_star) {
1237 t->u.array.size = 0;
1238 t->u.array.flags = AF_STAR;
1239 } else
1240 t->u.array.size = $4;
1241 t->where = @2;
1242 *$$->end = t;
1243 $$->end = &t->next;
1244 }
1245 | direct_abstract_declarator_opt '(' ')' {
1246 struct declarator_type *t;
1247
1248 NEW(t);
1249 $$ = $1;
1250 t->type = dt_old_function;
1251 t->u.old_function.args = 0;
1252 t->where = @2;
1253 *$$->end = t;
1254 $$->end = &t->next;
1255 warn_old_style_function(&@2);
1256 }
1257 | direct_abstract_declarator_opt '(' parameter_list variadic ')' {
1258 struct declarator_type *t;
1259
1260 NEW(t);
1261 $$ = $1;
1262 t->type = dt_function;
1263 t->u.function.args = $3->first;
1264 t->u.function.variadic = $4;
1265 t->where = @2;
1266 *$$->end = t;
1267 $$->end = &t->next;
1268 }
1269 ;
1270
1271 direct_abstract_declarator_opt:
1272 direct_abstract_declarator
1273 | {
1274 NEW($$);
1275 $$->end = &$$->first;
1276 @$ = (struct location){path, line};
1277 }
1278 ;
1279
1280 abstract_declarator_opt:
1281 abstract_declarator
1282 | {
1283 NEW($$);
1284 $$->end = &$$->first;
1285 @$ = (struct location){path, line};
1286 }
1287 ;
1288
1289 abstract_declarator:
1290 pointer
1291 | pointer_opt direct_abstract_declarator {
1292 $$ = $2;
1293 *$$->end = $1->first;
1294 $$->end = $1->end;
1295 }
1296 ;
1297
1298 /* C99 6.7.8 initializers */
1299
1300 initializer:
1301 assignment_expression {
1302 NEW($$);
1303 $$->type = in_expr;
1304 $$->u.expr = $1;
1305 }
1306 | '{' initializer_list comma_opt '}' {
1307 NEW($$);
1308 $$->type = in_list;
1309 $$->u.list = $2->first;
1310 }
1311 ;
1312
1313 comma_opt:
1314 ',' { $$ = 1; }
1315 | { $$ = 0; }
1316 ;
1317
1318 initializer_list:
1319 designated_initializer {
1320 NEW($$);
1321 $$->first = $1;
1322 $$->end = &$1->next;
1323 }
1324 | initializer_list ',' designated_initializer {
1325 *($$ = $1)->end = $3;
1326 $$->end = &$3->next;
1327 }
1328 ;
1329
1330 designated_initializer:
1331 designator_list '=' initializer {
1332 ($$ = $3)->designator = $1->first;
1333 $$->syntax = des_c99;
1334 }
1335 | designator initializer {
1336 ($$ = $2)->designator = $1;
1337 $$->syntax = des_gcc_raw;
1338 inputwarning(&@1, warn_compat,
1339 "non-portable GNU C initializer designator");
1340 }
1341 | ID ':' initializer {
1342 struct designator *d;
1343
1344 NEW(d);
1345 d->type = des_field;
1346 d->u.name = $1.name;
1347 d->where = @1;
1348 ($$ = $3)->designator = d;
1349 $$->syntax = des_gcc_colon;
1350 inputwarning(&@1, warn_compat,
1351 "non-portable GNU C initializer designator");
1352 }
1353 | initializer
1354 ;
1355
1356 designator_list:
1357 designator {
1358 NEW($$);
1359 $$->first = $1;
1360 $$->end = &$1->next;
1361 }
1362 | designator_list designator {
1363 *($$ = $1)->end = $2;
1364 $$->end = &$2->next;
1365 }
1366 ;
1367
1368 designator:
1369 '[' constant_expression ']' {
1370 NEW($$);
1371 $$->type = des_expr;
1372 $$->u.expr = $2;
1373 $$->where = @1;
1374 }
1375 | '.' identifier {
1376 NEW($$);
1377 $$->type = des_field;
1378 $$->u.name = $2.name;
1379 $$->where = @1;
1380 }
1381 ;
1382
1383 /* C99 6.8 statements and blocks */
1384
1385 statement:
1386 identifier ':' attribute_specifier_list statement {
1387 NEW($$);
1388 $$->type = st_label;
1389 $$->u.label.label = $1.name;
1390 /* XXX warn about redeclaration */
1391 $$->u.label.body = $4;
1392 $$->where = @1;
1393 }
1394 | "case" constant_expression ':' statement {
1395 NEW($$);
1396 $$->type = st_case;
1397 $$->u.case_.value = $2;
1398 $$->u.case_.body = $4;
1399 $$->where = @1;
1400 }
1401 | "default" ':' statement {
1402 NEW($$);
1403 $$->type = st_default;
1404 $$->u.default_ = $3;
1405 $$->where = @1;
1406 }
1407 | "if" '(' expression ')' statement else_part_opt {
1408 NEW($$);
1409 $$->type = st_if;
1410 $$->u.if_.cond = $3;
1411 $$->u.if_.true = $5;
1412 $$->u.if_.false = $6;
1413 $$->where = @1;
1414 }
1415 | "switch" '(' expression ')' statement {
1416 NEW($$);
1417 $$->type = st_switch;
1418 $$->u.switch_.cond = $3;
1419 $$->u.switch_.body = $5;
1420 $$->where = @1;
1421 }
1422 | expression_opt ';' {
1423 NEW($$);
1424 $$->type = st_expression;
1425 $$->u.expression = $1;
1426 $$->where = $1 ? @1 : @2;
1427 }
1428 | "while" '(' expression ')' statement {
1429 NEW($$);
1430 $$->type = st_while;
1431 $$->u.while_.cond = $3;
1432 $$->u.while_.body = $5;
1433 $$->where = @1;
1434 }
1435 | "do" statement "while" '(' expression ')' ';' {
1436 NEW($$);
1437 $$->type = st_do;
1438 $$->u.while_.cond = $5;
1439 $$->u.while_.body = $2;
1440 $$->where = @1;
1441 }
1442 | "for" '(' expression_opt ';'
1443 expression_opt ';'
1444 expression_opt ')' statement {
1445 NEW($$);
1446 $$->type = st_for;
1447 $$->u.for_.init = $3;
1448 $$->u.for_.cond = $5;
1449 $$->u.for_.iter = $7;
1450 $$->u.for_.body = $9;
1451 $$->where = @1;
1452 }
1453 | "for" '('
1454 { enter_scope(); }
1455 declaration
1456 expression_opt ';'
1457 expression_opt ')' statement {
1458 NEW($$);
1459 $$->type = st_for_declaration;
1460 $$->u.for_declaration.init = $4;
1461 $$->u.for_declaration.cond = $5;
1462 $$->u.for_declaration.iter = $7;
1463 $$->u.for_declaration.body = $9;
1464 $$->where = @1;
1465 exit_scope();
1466 }
1467 | "goto" identifier ';' {
1468 NEW($$);
1469 $$->type = st_goto;
1470 $$->u.goto_ = $2.name;
1471 $$->where = @1;
1472 }
1473 | "continue" ';' {
1474 NEW($$);
1475 $$->type = st_continue;
1476 $$->where = @1;
1477 }
1478 | "break" ';' {
1479 NEW($$);
1480 $$->type = st_break;
1481 $$->where = @1;
1482 }
1483 | "return" expression_opt ';' {
1484 NEW($$);
1485 $$->type = st_return;
1486 $$->u.expression = $2;
1487 $$->where = @1;
1488 }
1489 | '{' { enter_scope(); } block_item_list_opt '}' {
1490 NEW($$);
1491 $$->type = st_compound;
1492 $$->u.compound.body = $3->first;
1493 $$->where = @1;
1494 $$->u.compound.endwhere = @4;
1495 /*$$->u.compound.scope = scope;*/
1496 exit_scope();
1497 }
1498 ;
1499
1500 /* scope handling for function bodies is done by function_definition */
1501 function_body:
1502 '{' block_item_list_opt '}' {
1503 NEW($$);
1504 $$->type = st_compound;
1505 $$->u.compound.body = $2->first;
1506 $$->where = @1;
1507 $$->u.compound.endwhere = @3;
1508 /*$$->u.compound.scope = scope;*/
1509 }
1510 ;
1511
1512 block_item_list_opt:
1513 block_item_list_opt block_item {
1514 *($$ = $1)->end = $2;
1515 $$->end = &$2->next;
1516 }
1517 | {
1518 NEW($$);
1519 $$->end = &$$->first;
1520 }
1521 ;
1522
1523 block_item:
1524 declaration {
1525 NEW($$);
1526 $$->type = st_declaration;
1527 $$->u.declaration = $1;
1528 $$->where = @1;
1529 declaration_constraints($1, dc_block_scope);
1530 }
1531 | statement
1532 ;
1533
1534 /* shift/reduce conflict here */
1535 else_part_opt:
1536 "else" statement { $$ = $2; }
1537 | { $$ = 0; }
1538 ;
1539
1540 /* C99 6.9 external definitions */
1541
1542 translation_unit:
1543 external_declaration {
1544 NEW($$);
1545 translation_unit = $$->first = $1;
1546 $$->end = &$1->next;
1547 }
1548 | translation_unit external_declaration {
1549 $$ = $1;
1550 *$$->end = $2;
1551 $$->end = &$2->next;
1552 }
1553 | translation_unit ';' {
1554 inputerror(&@2, "redundant semicolon at top level");
1555 }
1556 ;
1557
1558 external_declaration:
1559 declaration {
1560 NEW($$);
1561 $$->type = ed_declaration;
1562 $$->u.declaration = $1;
1563 declaration_constraints($1, dc_file_scope);
1564 }
1565 | function_definition {
1566 NEW($$);
1567 $$->type = ed_function_definition;
1568 $$->u.function_definition = $1;
1569 /* constraints checked in function_definition (i.e. before errors
1570 * from the function body) */
1571 }
1572 ;
1573
1574 /* C99 6.9.1 function definitions */
1575
1576 function_definition:
1577 declaration_specifiers attributed_declarator {
1578 check_top_declaration_specifier($1);
1579 pop_declaration_specifiers();
1580 declarator_constraints($1, $2, dc_function_definition, 0);
1581 NEW($<declaration>$);
1582 $<declaration>$->declaration_specifiers = $1;
1583 $<declaration>$->declarator_list = $2;
1584 $<declaration>$->where = @1;
1585 add_declaration($2);
1586 enter_scope();
1587 {
1588 struct declarator *d;
1589 NEW(d);
1590 NEW(d->declaration_specifiers);
1591 NEW(d->declarator_type);
1592 d->name = xstrdup("__PRETTY_FUNCTION__");
1593 d->declaration_specifiers->type_qualifiers = TQ_CONST;
1594 d->declaration_specifiers->type_specifiers = TS_CHAR;
1595 d->declarator_type->type = dt_pointer;
1596 add_declaration(d);
1597 }
1598 /* we had better be in the right scope before parsing the declaration
1599 * list for old style functions */
1600 } declaration_list_opt {
1601 struct declaration *decl;
1602 struct declarator *d = 0; /* quieten compiler */
1603
1604 /* inject function args into scope */
1605 if($2->declarator_type) switch($2->declarator_type->type) {
1606 case dt_function:
1607 if(!is_void_args($2->declarator_type)) {
1608 for(decl = $2->declarator_type->u.function.args;
1609 decl;
1610 decl = decl->next) {
1611 decl->declarator_list->flags |= DF_PARAM;
1612 add_declaration(decl->declarator_list);
1613 }
1614 }
1615 if($4->first)
1616 inputerror(&@4, "declaration-list not required for new-style function definitions");
1617 break;
1618 case dt_old_function:
1619 if($2->declarator_type->u.old_function.args) {
1620 struct identifier_list *i;
1621
1622 for(i = $2->declarator_type->u.old_function.args;
1623 i;
1624 i = i->next) {
1625 for(decl = $4->first;
1626 decl;
1627 decl = decl->next)
1628 for(d = decl->declarator_list;
1629 d;
1630 d = d->next)
1631 if(!strcmp(d->name, i->id))
1632 break;
1633 if(d) {
1634 d->flags |= DF_PARAM;
1635 add_declaration(d);
1636 } else {
1637 /* default to int */
1638 NEW(d);
1639 d->name = i->id;
1640 NEW(d->declaration_specifiers);
1641 d->declaration_specifiers->type_specifiers = TS_INT;
1642 d->flags = DF_PARAM;
1643 add_declaration(d);
1644 }
1645 }
1646 }
1647 /* check that all the identifiers in the list are actually
1648 * parameters */
1649 for(decl = $4->first; decl; decl = decl->next)
1650 for(d = decl->declarator_list;
1651 d;
1652 d = d->next) {
1653 struct identifier_list *i;
1654
1655 for(i = $2->declarator_type->u.old_function.args; i; i = i->next)
1656 if(!strcmp(d->name, i->id))
1657 break;
1658 if(!i)
1659 inputerror(&d->where, "'%s' is not a parameter", d->name);
1660 }
1661 break;
1662
1663 default: /* quieten compiler */
1664 break;
1665 }
1666 } function_body {
1667 NEW($$);
1668 $$->declaration = $<declaration>3;
1669 $$->args = $4->first;
1670 $$->body = $6;
1671 exit_scope();
1672 }
1673 ;
1674
1675 declaration_list_opt:
1676 declaration_list_opt declaration {
1677 *($$ = $1)->end = $2;
1678 $$->end = &$2->next;
1679 }
1680 | {
1681 NEW($$);
1682 $$->end = &$$->first;
1683 }
1684 ;
1685
1686 /* gcc.info attribute syntax */
1687
1688 attribute_specifier_list:
1689 attribute_specifier_list attribute_specifier
1690 |
1691 ;
1692
1693 attribute_specifier:
1694 ATTRIBUTE '(' '(' attribute_list ')' ')' {
1695 static int attr_warning;
1696 if(!attr_warning++)
1697 inputwarning(&@1, warn_compat, "GNU C attributes are ignored");
1698 }
1699 ;
1700
1701 attribute_list:
1702 attribute_list attribute
1703 |
1704 ;
1705
1706 attribute:
1707 CONST { }
1708 | identifier { }
1709 | identifier '('
1710 { suppress_errors(); }
1711 argument_expression_list_opt
1712 { restore_errors(); }
1713 ')' { }
1714 ;
1715
1716 %%
1717
1718 /*
1719 Local Variables:
1720 c-basic-offset:2
1721 comment-column:40
1722 fill-column:79
1723 End:
1724 */