|
|
1.1.1.3 ! root 1: /* YACC parser for C syntax and for Objective C. -*-c-*- 1.1 root 2: Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc. 3: 4: This file is part of GNU CC. 5: 6: GNU CC is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU CC is distributed in the hope that it will be useful, 12: but WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14: GNU General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU CC; see the file COPYING. If not, write to 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ 19: 1.1.1.3 ! root 20: /* This file defines the grammar of C and that of Objective C. ! 21: ifobjc ... end ifobjc conditionals contain code for Objective C only. ! 22: ifc ... end ifc conditionals contain code for C only. ! 23: The awk script cond.awk is used to convert this file into ! 24: c-parse.y and into objc-parse.y. */ 1.1 root 25: 26: /* To whomever it may concern: I have heard that such a thing was once 27: written by AT&T, but I have never seen it. */ 28: 1.1.1.3 ! root 29: %expect 56 1.1 root 30: 31: %{ 32: #include <stdio.h> 33: #include <errno.h> 34: #include <setjmp.h> 35: 36: #include "config.h" 37: #include "tree.h" 38: #include "input.h" 39: #include "c-lex.h" 40: #include "c-tree.h" 41: #include "flags.h" 42: 1.1.1.3 ! root 43: #ifdef MULTIBYTE_CHARS ! 44: #include <stdlib.h> ! 45: #include <locale.h> ! 46: #endif ! 47: 1.1 root 48: #include "objc-actions.h" 49: 50: #ifndef errno 51: extern int errno; 52: #endif 53: 54: void yyerror (); 55: 56: /* Like YYERROR but do call yyerror. */ 57: #define YYERROR1 { yyerror ("syntax error"); YYERROR; } 58: 59: /* Cause the `yydebug' variable to be defined. */ 60: #define YYDEBUG 1 61: %} 62: 63: %start program 64: 65: %union {long itype; tree ttype; enum tree_code code; 66: char *filename; int lineno; } 67: 68: /* All identifiers that are not reserved words 69: and are not declared typedefs in the current block */ 70: %token IDENTIFIER 71: 72: /* All identifiers that are declared typedefs in the current block. 73: In some contexts, they are treated just like IDENTIFIER, 74: but they can also serve as typespecs in declarations. */ 75: %token TYPENAME 76: 77: /* Reserved words that specify storage class. 78: yylval contains an IDENTIFIER_NODE which indicates which one. */ 79: %token SCSPEC 80: 81: /* Reserved words that specify type. 82: yylval contains an IDENTIFIER_NODE which indicates which one. */ 83: %token TYPESPEC 84: 85: /* Reserved words that qualify type: "const" or "volatile". 86: yylval contains an IDENTIFIER_NODE which indicates which one. */ 87: %token TYPE_QUAL 88: 89: /* Character or numeric constants. 90: yylval is the node for the constant. */ 91: %token CONSTANT 92: 93: /* String constants in raw form. 94: yylval is a STRING_CST node. */ 95: %token STRING 96: 97: /* "...", used for functions with variable arglists. */ 98: %token ELLIPSIS 99: 100: /* the reserved words */ 1.1.1.2 root 101: /* SCO include files test "ASM", so use something else. */ 1.1 root 102: %token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT 1.1.1.2 root 103: %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF ALIGN 1.1 root 104: %token ATTRIBUTE EXTENSION LABEL 105: 106: /* Add precedence rules to solve dangling else s/r conflict */ 107: %nonassoc IF 108: %nonassoc ELSE 109: 110: /* Define the operator tokens and their precedences. 111: The value is an integer because, if used, it is the tree code 112: to use in the expression made from the operator. */ 113: 114: %right <code> ASSIGN '=' 115: %right <code> '?' ':' 116: %left <code> OROR 117: %left <code> ANDAND 118: %left <code> '|' 119: %left <code> '^' 120: %left <code> '&' 121: %left <code> EQCOMPARE 122: %left <code> ARITHCOMPARE 123: %left <code> LSHIFT RSHIFT 124: %left <code> '+' '-' 125: %left <code> '*' '/' '%' 126: %right <code> UNARY PLUSPLUS MINUSMINUS 127: %left HYPERUNARY 128: %left <code> POINTSAT '.' '(' '[' 129: 1.1.1.3 ! root 130: /* The Objective-C keywords. These are included in C and in ! 131: Objective C, so that the token codes are the same in both. */ 1.1 root 132: %token INTERFACE IMPLEMENTATION END SELECTOR DEFS ENCODE 133: %token CLASSNAME PUBLIC 134: 135: 136: %type <code> unop 137: 138: %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist 139: %type <ttype> expr_no_commas cast_expr unary_expr primary string STRING 140: %type <ttype> typed_declspecs reserved_declspecs 141: %type <ttype> typed_typespecs reserved_typespecquals 142: %type <ttype> declmods typespec typespecqual_reserved 143: %type <ttype> SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual 144: %type <ttype> initdecls notype_initdecls initdcl notype_initdcl 145: %type <ttype> init initlist maybeasm 146: %type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers 147: %type <ttype> maybe_attribute attribute_list attrib 148: 149: %type <ttype> compstmt 150: 151: %type <ttype> declarator 152: %type <ttype> notype_declarator after_type_declarator 153: %type <ttype> parm_declarator 154: 155: %type <ttype> structsp component_decl_list component_decl_list2 156: %type <ttype> component_decl components component_declarator 157: %type <ttype> enumlist enumerator 158: %type <ttype> typename absdcl absdcl1 type_quals 159: %type <ttype> xexpr parms parm identifiers 160: 161: %type <ttype> parmlist parmlist_1 parmlist_2 162: %type <ttype> parmlist_or_identifiers parmlist_or_identifiers_1 1.1.1.3 ! root 163: %type <ttype> identifiers_or_typenames 1.1 root 164: 165: %type <itype> setspecs 166: 167: %type <filename> save_filename 168: %type <lineno> save_lineno 169: 170: /* the Objective-C nonterminals */ 171: 172: %type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator 173: %type <ttype> methoddecl unaryselector keywordselector selector 174: %type <ttype> keyworddecl receiver objcmessageexpr messageargs 175: %type <ttype> keywordexpr keywordarglist keywordarg 176: %type <ttype> myparms myparm optparmlist reservedwords objcselectorexpr 177: %type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr 178: %type <ttype> CLASSNAME 179: 180: %{ 181: /* Number of statements (loosely speaking) seen so far. */ 182: static int stmt_count; 183: 184: /* Input file and line number of the end of the body of last simple_if; 185: used by the stmt-rule immediately after simple_if returns. */ 186: static char *if_stmt_file; 187: static int if_stmt_line; 188: 189: /* List of types and structure classes of the current declaration. */ 190: static tree current_declspecs; 191: 192: /* Stack of saved values of current_declspecs. */ 193: static tree declspec_stack; 194: 195: /* 1 if we explained undeclared var errors. */ 196: static int undeclared_variable_notice; 197: 198: /* Objective-C specific information */ 199: 200: tree objc_interface_context; 201: tree objc_implementation_context; 202: tree objc_method_context; 203: tree objc_ivar_chain; 204: tree objc_ivar_context; 205: enum tree_code objc_inherit_code; 206: int objc_receiver_context; 207: int objc_public_flag; 208: 1.1.1.3 ! root 209: 1.1 root 210: /* Tell yyparse how to print a token's value, if yydebug is set. */ 211: 212: #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) 213: extern void yyprint (); 214: %} 215: 216: %% 217: program: /* empty */ 218: { if (pedantic) 219: pedwarn ("ANSI C forbids an empty source file"); 1.1.1.3 ! root 220: objc_finish (); ! 221: } 1.1 root 222: | extdefs 1.1.1.3 ! root 223: { ! 224: objc_finish (); ! 225: } 1.1 root 226: ; 227: 228: /* the reason for the strange actions in this rule 229: is so that notype_initdecls when reached via datadef 230: can find a valid list of type and sc specs in $0. */ 231: 232: extdefs: 233: {$<ttype>$ = NULL_TREE; } extdef 234: | extdefs {$<ttype>$ = NULL_TREE; } extdef 235: ; 236: 237: extdef: 238: fndef 239: | datadef 240: | objcdef 1.1.1.3 ! root 241: | ASM_KEYWORD '(' expr ')' ';' ! 242: { STRIP_NOPS ($3); ! 243: if ((TREE_CODE ($3) == ADDR_EXPR ! 244: && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST) ! 245: || TREE_CODE ($3) == STRING_CST) ! 246: assemble_asm ($3); ! 247: else ! 248: error ("argument of `asm' is not a constant string"); } 1.1 root 249: ; 250: 251: datadef: 252: setspecs notype_initdecls ';' 253: { if (pedantic) 254: error ("ANSI C forbids data definition with no type or storage class"); 255: else if (!flag_traditional) 256: warning ("data definition has no type or storage class"); } 257: | declmods setspecs notype_initdecls ';' 258: {} 259: | typed_declspecs setspecs initdecls ';' 260: {} 261: | declmods ';' 1.1.1.3 ! root 262: { pedwarn ("empty declaration"); } 1.1 root 263: | typed_declspecs ';' 264: { shadow_tag ($1); } 265: | error ';' 266: | error '}' 267: | ';' 268: { if (pedantic) 269: pedwarn ("ANSI C does not allow extra `;' outside of a function"); } 270: ; 1.1.1.3 ! root 271: 1.1 root 272: fndef: 273: typed_declspecs setspecs declarator 274: { if (! start_function ($1, $3, 0)) 275: YYERROR1; 276: reinit_parse_for_function (); } 277: xdecls 278: { store_parm_decls (); } 279: compstmt_or_error 280: { finish_function (0); } 281: | typed_declspecs setspecs declarator error 282: { } 283: | declmods setspecs notype_declarator 284: { if (! start_function ($1, $3, 0)) 285: YYERROR1; 286: reinit_parse_for_function (); } 287: xdecls 288: { store_parm_decls (); } 289: compstmt_or_error 290: { finish_function (0); } 291: | declmods setspecs notype_declarator error 292: { } 293: | setspecs notype_declarator 1.1.1.3 ! root 294: { if (! start_function (NULL_TREE, $2, 0)) 1.1 root 295: YYERROR1; 296: reinit_parse_for_function (); } 297: xdecls 298: { store_parm_decls (); } 299: compstmt_or_error 300: { finish_function (0); } 301: | setspecs notype_declarator error 302: { } 303: ; 304: 305: identifier: 306: IDENTIFIER 307: | TYPENAME 308: | CLASSNAME 309: { $$ = CLASS_NAME ($1); } 310: ; 311: 312: unop: '&' 313: { $$ = ADDR_EXPR; } 314: | '-' 315: { $$ = NEGATE_EXPR; } 316: | '+' 317: { $$ = CONVERT_EXPR; } 318: | PLUSPLUS 319: { $$ = PREINCREMENT_EXPR; } 320: | MINUSMINUS 321: { $$ = PREDECREMENT_EXPR; } 322: | '~' 323: { $$ = BIT_NOT_EXPR; } 324: | '!' 325: { $$ = TRUTH_NOT_EXPR; } 326: ; 327: 328: expr: nonnull_exprlist 329: { $$ = build_compound_expr ($1); } 330: ; 331: 332: exprlist: 333: /* empty */ 334: { $$ = NULL_TREE; } 335: | nonnull_exprlist 336: ; 337: 338: nonnull_exprlist: 339: expr_no_commas 340: { $$ = build_tree_list (NULL_TREE, $1); } 341: | nonnull_exprlist ',' expr_no_commas 342: { chainon ($1, build_tree_list (NULL_TREE, $3)); } 343: ; 344: 345: unary_expr: 346: primary 347: | '*' cast_expr %prec UNARY 348: { $$ = build_indirect_ref ($2, "unary *"); } 349: /* __extension__ turns off -pedantic for following primary. */ 350: | EXTENSION 351: { $<itype>1 = pedantic; 352: pedantic = 0; } 353: cast_expr %prec UNARY 354: { $$ = $3; 355: pedantic = $<itype>1; } 356: | unop cast_expr %prec UNARY 357: { $$ = build_unary_op ($1, $2, 0); } 358: /* Refer to the address of a label as a pointer. */ 359: | ANDAND identifier 360: { tree label = lookup_label ($2); 361: TREE_USED (label) = 1; 362: $$ = build1 (ADDR_EXPR, ptr_type_node, label); 363: TREE_CONSTANT ($$) = 1; } 364: /* This seems to be impossible on some machines, so let's turn it off. 1.1.1.3 ! root 365: You can use __builtin_next_arg to find the anonymous stack args. 1.1 root 366: | '&' ELLIPSIS 367: { tree types = TYPE_ARG_TYPES (TREE_TYPE (current_function_decl)); 368: $$ = error_mark_node; 369: if (TREE_VALUE (tree_last (types)) == void_type_node) 370: error ("`&...' used in function with fixed number of arguments"); 371: else 372: { 373: if (pedantic) 374: pedwarn ("ANSI C forbids `&...'"); 375: $$ = tree_last (DECL_ARGUMENTS (current_function_decl)); 376: $$ = build_unary_op (ADDR_EXPR, $$, 0); 377: } } 378: */ 379: | SIZEOF unary_expr %prec UNARY 380: { if (TREE_CODE ($2) == COMPONENT_REF 381: && DECL_BIT_FIELD (TREE_OPERAND ($2, 1))) 382: error ("`sizeof' applied to a bit-field"); 383: $$ = c_sizeof (TREE_TYPE ($2)); } 384: | SIZEOF '(' typename ')' %prec HYPERUNARY 385: { $$ = c_sizeof (groktypename ($3)); } 386: | ALIGNOF unary_expr %prec UNARY 387: { $$ = c_alignof_expr ($2); } 388: | ALIGNOF '(' typename ')' %prec HYPERUNARY 389: { $$ = c_alignof (groktypename ($3)); } 390: ; 391: 392: cast_expr: 393: unary_expr 394: | '(' typename ')' cast_expr %prec UNARY 395: { tree type = groktypename ($2); 396: $$ = build_c_cast (type, $4); } 397: | '(' typename ')' '{' initlist maybecomma '}' %prec UNARY 398: { tree type = groktypename ($2); 1.1.1.3 ! root 399: char *name; 1.1 root 400: if (pedantic) 401: pedwarn ("ANSI C forbids constructor expressions"); 1.1.1.3 ! root 402: if (TYPE_NAME (type) != 0) ! 403: { ! 404: if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) ! 405: name = IDENTIFIER_POINTER (TYPE_NAME (type)); ! 406: else ! 407: name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); ! 408: } ! 409: else ! 410: name = ""; ! 411: $$ = digest_init (type, build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($5)), ! 412: NULL_PTR, 0, 0, name); 1.1 root 413: if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) 414: { 415: int failure = complete_array_type (type, $$, 1); 416: if (failure) 417: abort (); 418: } 419: } 420: ; 421: 422: expr_no_commas: 423: cast_expr 424: | expr_no_commas '+' expr_no_commas 425: { $$ = parser_build_binary_op ($2, $1, $3); } 426: | expr_no_commas '-' expr_no_commas 427: { $$ = parser_build_binary_op ($2, $1, $3); } 428: | expr_no_commas '*' expr_no_commas 429: { $$ = parser_build_binary_op ($2, $1, $3); } 430: | expr_no_commas '/' expr_no_commas 431: { $$ = parser_build_binary_op ($2, $1, $3); } 432: | expr_no_commas '%' expr_no_commas 433: { $$ = parser_build_binary_op ($2, $1, $3); } 434: | expr_no_commas LSHIFT expr_no_commas 435: { $$ = parser_build_binary_op ($2, $1, $3); } 436: | expr_no_commas RSHIFT expr_no_commas 437: { $$ = parser_build_binary_op ($2, $1, $3); } 438: | expr_no_commas ARITHCOMPARE expr_no_commas 439: { $$ = parser_build_binary_op ($2, $1, $3); } 440: | expr_no_commas EQCOMPARE expr_no_commas 441: { $$ = parser_build_binary_op ($2, $1, $3); } 442: | expr_no_commas '&' expr_no_commas 443: { $$ = parser_build_binary_op ($2, $1, $3); } 444: | expr_no_commas '|' expr_no_commas 445: { $$ = parser_build_binary_op ($2, $1, $3); } 446: | expr_no_commas '^' expr_no_commas 447: { $$ = parser_build_binary_op ($2, $1, $3); } 448: | expr_no_commas ANDAND expr_no_commas 449: { $$ = parser_build_binary_op (TRUTH_ANDIF_EXPR, $1, $3); } 450: | expr_no_commas OROR expr_no_commas 451: { $$ = parser_build_binary_op (TRUTH_ORIF_EXPR, $1, $3); } 452: | expr_no_commas '?' xexpr ':' expr_no_commas 453: { $$ = build_conditional_expr ($1, $3, $5); } 454: | expr_no_commas '=' expr_no_commas 1.1.1.3 ! root 455: { $$ = build_modify_expr ($1, NOP_EXPR, $3); ! 456: C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); } 1.1 root 457: | expr_no_commas ASSIGN expr_no_commas 1.1.1.3 ! root 458: { $$ = build_modify_expr ($1, $2, $3); ! 459: C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); } 1.1 root 460: ; 461: 462: primary: 463: IDENTIFIER 464: { 465: tree context; 466: 467: $$ = lastiddecl; 468: if (!$$ || $$ == error_mark_node) 469: { 470: if (yychar == YYEMPTY) 471: yychar = YYLEX; 472: if (yychar == '(') 473: { 474: if (objc_receiver_context 475: && ! (objc_receiver_context 476: && strcmp (IDENTIFIER_POINTER ($1), "super"))) 477: /* we have a message to super */ 478: $$ = get_super_receiver (); 479: else if (objc_method_context 480: && is_ivar (objc_ivar_chain, $1)) 481: $$ = build_ivar_reference ($1); 482: else 483: { 484: /* Ordinary implicit function declaration. */ 485: $$ = implicitly_declare ($1); 486: assemble_external ($$); 487: TREE_USED ($$) = 1; 488: } 489: } 490: else if (current_function_decl == 0) 491: { 492: error ("`%s' undeclared, outside of functions", 493: IDENTIFIER_POINTER ($1)); 494: $$ = error_mark_node; 495: } 496: else 497: { 498: if (objc_receiver_context 1.1.1.3 ! root 499: && ! strcmp (IDENTIFIER_POINTER ($1), "super")) 1.1 root 500: /* we have a message to super */ 501: $$ = get_super_receiver (); 502: else if (objc_method_context 503: && is_ivar (objc_ivar_chain, $1)) 504: $$ = build_ivar_reference ($1); 505: else 506: { 507: if (IDENTIFIER_GLOBAL_VALUE ($1) != error_mark_node 508: || IDENTIFIER_ERROR_LOCUS ($1) != current_function_decl) 509: { 510: error ("`%s' undeclared (first use this function)", 511: IDENTIFIER_POINTER ($1)); 512: 513: if (! undeclared_variable_notice) 514: { 515: error ("(Each undeclared identifier is reported only once"); 516: error ("for each function it appears in.)"); 517: undeclared_variable_notice = 1; 518: } 519: } 520: $$ = error_mark_node; 521: /* Prevent repeated error messages. */ 522: IDENTIFIER_GLOBAL_VALUE ($1) = error_mark_node; 523: IDENTIFIER_ERROR_LOCUS ($1) = current_function_decl; 1.1.1.3 ! root 524: } 1.1 root 525: } 526: } 1.1.1.3 ! root 527: else if (TREE_TYPE ($$) == error_mark_node) ! 528: $$ = error_mark_node; ! 529: else if (C_DECL_ANTICIPATED ($$)) 1.1 root 530: { 1.1.1.3 ! root 531: /* The first time we see a build-in function used, ! 532: if it has not been declared. */ ! 533: C_DECL_ANTICIPATED ($$) = 0; ! 534: if (yychar == YYEMPTY) ! 535: yychar = YYLEX; ! 536: if (yychar == '(') 1.1 root 537: { 1.1.1.3 ! root 538: /* Omit the implicit declaration we ! 539: would ordinarily do, so we don't lose ! 540: the actual built in type. ! 541: But print a diagnostic for the mismatch. */ ! 542: if (objc_method_context ! 543: && is_ivar (objc_ivar_chain, $1)) ! 544: error ("Instance variable `%s' implicitly declared as function", ! 545: IDENTIFIER_POINTER (DECL_NAME ($$))); ! 546: else ! 547: if (TREE_CODE ($$) != FUNCTION_DECL) ! 548: error ("`%s' implicitly declared as function", ! 549: IDENTIFIER_POINTER (DECL_NAME ($$))); ! 550: else if ((TYPE_MODE (TREE_TYPE (TREE_TYPE ($$))) ! 551: != TYPE_MODE (integer_type_node)) ! 552: && (TREE_TYPE (TREE_TYPE ($$)) ! 553: != void_type_node)) ! 554: pedwarn ("type mismatch in implicit declaration for built-in function `%s'", ! 555: IDENTIFIER_POINTER (DECL_NAME ($$))); ! 556: /* If it really returns void, change that to int. */ ! 557: if (TREE_TYPE (TREE_TYPE ($$)) == void_type_node) ! 558: TREE_TYPE ($$) ! 559: = build_function_type (integer_type_node, ! 560: TYPE_ARG_TYPES (TREE_TYPE ($$))); 1.1 root 561: } 1.1.1.3 ! root 562: else ! 563: pedwarn ("built-in function `%s' used without declaration", ! 564: IDENTIFIER_POINTER (DECL_NAME ($$))); ! 565: ! 566: /* Do what we would ordinarily do when a fn is used. */ ! 567: assemble_external ($$); ! 568: TREE_USED ($$) = 1; ! 569: } ! 570: else ! 571: { ! 572: assemble_external ($$); ! 573: TREE_USED ($$) = 1; 1.1 root 574: /* we have a definition - still check if iVariable */ 575: 576: if (!objc_receiver_context 577: || (objc_receiver_context 578: && strcmp (IDENTIFIER_POINTER ($1), "super"))) 579: { 580: if (objc_method_context 581: && is_ivar (objc_ivar_chain, $1)) 582: { 583: if (IDENTIFIER_LOCAL_VALUE ($1)) 584: warning ("local declaration of `%s' hides instance variable", 585: IDENTIFIER_POINTER ($1)); 586: else 587: $$ = build_ivar_reference ($1); 588: } 589: } 590: else /* we have a message to super */ 591: $$ = get_super_receiver (); 592: } 593: 594: if (TREE_CODE ($$) == CONST_DECL) 1.1.1.3 ! root 595: { ! 596: $$ = DECL_INITIAL ($$); ! 597: /* This is to prevent an enum whose value is 0 ! 598: from being considered a null pointer constant. */ ! 599: $$ = build1 (NOP_EXPR, TREE_TYPE ($$), $$); ! 600: TREE_CONSTANT ($$) = 1; ! 601: } 1.1 root 602: } 603: | CONSTANT 604: | string 605: { $$ = combine_strings ($1); } 606: | '(' expr ')' 607: { char class = TREE_CODE_CLASS (TREE_CODE ($2)); 608: if (class == 'e' || class == '1' 609: || class == '2' || class == '<') 610: C_SET_EXP_ORIGINAL_CODE ($2, ERROR_MARK); 611: $$ = $2; } 612: | '(' error ')' 613: { $$ = error_mark_node; } 614: | '(' 615: { if (current_function_decl == 0) 616: { 617: error ("braced-group within expression allowed only inside a function"); 618: YYERROR; 619: } 620: /* We must force a BLOCK for this level 621: so that, if it is not expanded later, 622: there is a way to turn off the entire subtree of blocks 623: that are contained in it. */ 624: keep_next_level (); 625: push_label_level (); 626: $<ttype>$ = expand_start_stmt_expr (); } 627: compstmt ')' 628: { tree rtl_exp; 629: if (pedantic) 630: pedwarn ("ANSI C forbids braced-groups within expressions"); 631: pop_label_level (); 632: rtl_exp = expand_end_stmt_expr ($<ttype>2); 633: /* The statements have side effects, so the group does. */ 634: TREE_SIDE_EFFECTS (rtl_exp) = 1; 635: 636: /* Make a BIND_EXPR for the BLOCK already made. */ 637: $$ = build (BIND_EXPR, TREE_TYPE (rtl_exp), 638: NULL_TREE, rtl_exp, $3); 1.1.1.3 ! root 639: /* Remove the block from the tree at this point. ! 640: It gets put back at the proper place ! 641: when the BIND_EXPR is expanded. */ ! 642: delete_block ($3); 1.1 root 643: } 644: | primary '(' exprlist ')' %prec '.' 645: { $$ = build_function_call ($1, $3); } 646: | primary '[' expr ']' %prec '.' 647: { $$ = build_array_ref ($1, $3); } 648: | primary '.' identifier 649: { 650: if (doing_objc_thang) 651: { 652: if (is_public ($1, $3)) 653: $$ = build_component_ref ($1, $3); 654: else 655: $$ = error_mark_node; 656: } 657: else 1.1.1.3 ! root 658: $$ = build_component_ref ($1, $3); 1.1 root 659: } 660: | primary POINTSAT identifier 661: { 1.1.1.3 ! root 662: tree expr = build_indirect_ref ($1, "->"); 1.1 root 663: 664: if (doing_objc_thang) 665: { 1.1.1.3 ! root 666: if (is_public (expr, $3)) ! 667: $$ = build_component_ref (expr, $3); 1.1 root 668: else 669: $$ = error_mark_node; 670: } 671: else 1.1.1.3 ! root 672: $$ = build_component_ref (expr, $3); 1.1 root 673: } 674: | primary PLUSPLUS 675: { $$ = build_unary_op (POSTINCREMENT_EXPR, $1, 0); } 676: | primary MINUSMINUS 677: { $$ = build_unary_op (POSTDECREMENT_EXPR, $1, 0); } 678: | objcmessageexpr 679: { $$ = build_message_expr ($1); } 680: | objcselectorexpr 681: { $$ = build_selector_expr ($1); } 682: | objcencodeexpr 683: { $$ = build_encode_expr ($1); } 684: ; 685: 686: /* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ 687: string: 688: STRING 689: | string STRING 690: { $$ = chainon ($1, $2); } 691: ; 692: 693: xdecls: 694: /* empty */ 1.1.1.3 ! root 695: | datadecls ! 696: | datadecls ELLIPSIS 1.1 root 697: /* ... is used here to indicate a varargs function. */ 698: { c_mark_varargs (); 699: if (pedantic) 700: pedwarn ("ANSI C does not permit use of `varargs.h'"); } 701: ; 702: 1.1.1.3 ! root 703: /* The following are analogous to lineno_decl, decls and decl ! 704: except that they do not allow nested functions. ! 705: They are used for old-style parm decls. */ ! 706: lineno_datadecl: ! 707: save_filename save_lineno datadecl ! 708: { } ! 709: ; ! 710: ! 711: datadecls: ! 712: lineno_datadecl ! 713: | errstmt ! 714: | datadecls lineno_datadecl ! 715: | lineno_datadecl errstmt ! 716: ; ! 717: ! 718: datadecl: ! 719: typed_declspecs setspecs initdecls ';' ! 720: { current_declspecs = TREE_VALUE (declspec_stack); ! 721: declspec_stack = TREE_CHAIN (declspec_stack); ! 722: resume_momentary ($2); } ! 723: | declmods setspecs notype_initdecls ';' ! 724: { current_declspecs = TREE_VALUE (declspec_stack); ! 725: declspec_stack = TREE_CHAIN (declspec_stack); ! 726: resume_momentary ($2); } ! 727: | typed_declspecs ';' ! 728: { shadow_tag_warned ($1, 1); ! 729: pedwarn ("empty declaration"); } ! 730: | declmods ';' ! 731: { pedwarn ("empty declaration"); } ! 732: ; ! 733: 1.1 root 734: /* This combination which saves a lineno before a decl 735: is the normal thing to use, rather than decl itself. 736: This is to avoid shift/reduce conflicts in contexts 737: where statement labels are allowed. */ 738: lineno_decl: 739: save_filename save_lineno decl 740: { } 741: ; 742: 743: decls: 744: lineno_decl 745: | errstmt 746: | decls lineno_decl 747: | lineno_decl errstmt 748: ; 749: 750: /* records the type and storage class specs to use for processing 751: the declarators that follow. 752: Maintains a stack of outer-level values of current_declspecs, 753: for the sake of parm declarations nested in function declarators. */ 754: setspecs: /* empty */ 755: { $$ = suspend_momentary (); 756: pending_xref_error (); 1.1.1.3 ! root 757: declspec_stack = tree_cons (NULL_TREE, current_declspecs, 1.1 root 758: declspec_stack); 759: current_declspecs = $<ttype>0; } 760: ; 761: 762: decl: 763: typed_declspecs setspecs initdecls ';' 764: { current_declspecs = TREE_VALUE (declspec_stack); 765: declspec_stack = TREE_CHAIN (declspec_stack); 766: resume_momentary ($2); } 767: | declmods setspecs notype_initdecls ';' 768: { current_declspecs = TREE_VALUE (declspec_stack); 769: declspec_stack = TREE_CHAIN (declspec_stack); 770: resume_momentary ($2); } 771: | typed_declspecs setspecs nested_function 772: { current_declspecs = TREE_VALUE (declspec_stack); 773: declspec_stack = TREE_CHAIN (declspec_stack); 774: resume_momentary ($2); } 775: | declmods setspecs notype_nested_function 776: { current_declspecs = TREE_VALUE (declspec_stack); 777: declspec_stack = TREE_CHAIN (declspec_stack); 778: resume_momentary ($2); } 779: | typed_declspecs ';' 780: { shadow_tag ($1); } 781: | declmods ';' 782: { pedwarn ("empty declaration"); } 783: ; 784: 785: /* Declspecs which contain at least one type specifier or typedef name. 786: (Just `const' or `volatile' is not enough.) 787: A typedef'd name following these is taken as a name to be declared. */ 788: 789: typed_declspecs: 790: typespec reserved_declspecs 791: { $$ = tree_cons (NULL_TREE, $1, $2); } 792: | declmods typespec reserved_declspecs 793: { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } 794: ; 795: 796: reserved_declspecs: /* empty */ 797: { $$ = NULL_TREE; } 798: | reserved_declspecs typespecqual_reserved 799: { $$ = tree_cons (NULL_TREE, $2, $1); } 800: | reserved_declspecs SCSPEC 1.1.1.3 ! root 801: { if (extra_warnings) ! 802: warning ("`%s' is not at beginning of declaration", ! 803: IDENTIFIER_POINTER ($2)); ! 804: $$ = tree_cons (NULL_TREE, $2, $1); } 1.1 root 805: ; 806: 807: /* List of just storage classes and type modifiers. 808: A declaration can start with just this, but then it cannot be used 809: to redeclare a typedef-name. */ 810: 811: declmods: 812: TYPE_QUAL 1.1.1.3 ! root 813: { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); ! 814: TREE_STATIC ($$) = 1; } 1.1 root 815: | SCSPEC 816: { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } 817: | declmods TYPE_QUAL 1.1.1.3 ! root 818: { $$ = tree_cons (NULL_TREE, $2, $1); ! 819: TREE_STATIC ($$) = 1; } 1.1 root 820: | declmods SCSPEC 1.1.1.3 ! root 821: { if (extra_warnings && TREE_STATIC ($1)) ! 822: warning ("`%s' is not at beginning of declaration", ! 823: IDENTIFIER_POINTER ($2)); ! 824: $$ = tree_cons (NULL_TREE, $2, $1); ! 825: TREE_STATIC ($$) = TREE_STATIC ($1); } 1.1 root 826: ; 827: 828: 829: /* Used instead of declspecs where storage classes are not allowed 830: (that is, for typenames and structure components). 831: Don't accept a typedef-name if anything but a modifier precedes it. */ 832: 833: typed_typespecs: 834: typespec reserved_typespecquals 835: { $$ = tree_cons (NULL_TREE, $1, $2); } 836: | nonempty_type_quals typespec reserved_typespecquals 837: { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } 838: ; 839: 840: reserved_typespecquals: /* empty */ 841: { $$ = NULL_TREE; } 842: | reserved_typespecquals typespecqual_reserved 843: { $$ = tree_cons (NULL_TREE, $2, $1); } 844: ; 845: 846: /* A typespec (but not a type qualifier). 847: Once we have seen one of these in a declaration, 848: if a typedef name appears then it is being redeclared. */ 849: 850: typespec: TYPESPEC 851: | structsp 852: | TYPENAME 1.1.1.3 ! root 853: { /* For a typedef name, record the meaning, not the name. ! 854: In case of `foo foo, bar;'. */ ! 855: $$ = lookup_name ($1); } 1.1 root 856: | CLASSNAME 857: { $$ = get_static_reference ($1); } 858: | TYPEOF '(' expr ')' 1.1.1.3 ! root 859: { $$ = TREE_TYPE ($3); } 1.1 root 860: | TYPEOF '(' typename ')' 1.1.1.3 ! root 861: { $$ = groktypename ($3); } 1.1 root 862: ; 863: 864: /* A typespec that is a reserved word, or a type qualifier. */ 865: 866: typespecqual_reserved: TYPESPEC 867: | TYPE_QUAL 868: | structsp 869: ; 870: 871: initdecls: 872: initdcl 873: | initdecls ',' initdcl 874: ; 875: 876: notype_initdecls: 877: notype_initdcl 878: | notype_initdecls ',' initdcl 879: ; 880: 881: maybeasm: 882: /* empty */ 883: { $$ = NULL_TREE; } 1.1.1.2 root 884: | ASM_KEYWORD '(' string ')' 1.1 root 885: { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); 886: $$ = $3; 887: } 888: ; 889: 890: initdcl: 891: declarator maybeasm maybe_attribute '=' 892: { $<ttype>$ = start_decl ($1, current_declspecs, 1); } 893: init 894: /* Note how the declaration of the variable is in effect while its init is parsed! */ 895: { decl_attributes ($<ttype>5, $3); 896: finish_decl ($<ttype>5, $6, $2); } 897: | declarator maybeasm maybe_attribute 898: { tree d = start_decl ($1, current_declspecs, 0); 899: decl_attributes (d, $3); 900: finish_decl (d, NULL_TREE, $2); } 901: ; 902: 903: notype_initdcl: 904: notype_declarator maybeasm maybe_attribute '=' 905: { $<ttype>$ = start_decl ($1, current_declspecs, 1); } 906: init 907: /* Note how the declaration of the variable is in effect while its init is parsed! */ 908: { decl_attributes ($<ttype>5, $3); 909: finish_decl ($<ttype>5, $6, $2); } 910: | notype_declarator maybeasm maybe_attribute 911: { tree d = start_decl ($1, current_declspecs, 0); 912: decl_attributes (d, $3); 913: finish_decl (d, NULL_TREE, $2); } 914: ; 915: /* the * rules are dummies to accept the Apollo extended syntax 916: so that the header files compile. */ 917: maybe_attribute: 918: /* empty */ 919: { $$ = NULL_TREE; } 920: | ATTRIBUTE '(' '(' attribute_list ')' ')' 921: { $$ = $4; } 922: ; 923: 924: attribute_list 925: : attrib 926: { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } 927: | attribute_list ',' attrib 928: { $$ = tree_cons (NULL_TREE, $3, $1); } 929: ; 930: 931: attrib 932: : IDENTIFIER 1.1.1.3 ! root 933: { if (strcmp (IDENTIFIER_POINTER ($1), "packed")) ! 934: warning ("`%s' attribute directive ignored", ! 935: IDENTIFIER_POINTER ($1)); 1.1 root 936: $$ = $1; } 1.1.1.3 ! root 937: | IDENTIFIER '(' IDENTIFIER ')' ! 938: { /* If not "mode (m)", then issue warning. */ ! 939: if (strcmp (IDENTIFIER_POINTER ($1), "mode") != 0) ! 940: { ! 941: warning ("`%s' attribute directive ignored", ! 942: IDENTIFIER_POINTER ($1)); ! 943: $$ = $1; ! 944: } ! 945: else ! 946: $$ = tree_cons ($1, $3, NULL_TREE); } 1.1 root 947: | IDENTIFIER '(' CONSTANT ')' 948: { /* if not "aligned(n)", then issue warning */ 949: if (strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0 950: || TREE_CODE ($3) != INTEGER_CST) 951: { 952: warning ("`%s' attribute directive ignored", 953: IDENTIFIER_POINTER ($1)); 954: $$ = $1; 955: } 956: else 1.1.1.3 ! root 957: $$ = tree_cons ($1, $3, NULL_TREE); } 1.1 root 958: | IDENTIFIER '(' IDENTIFIER ',' CONSTANT ',' CONSTANT ')' 959: { /* if not "format(...)", then issue warning */ 960: if (strcmp (IDENTIFIER_POINTER ($1), "format") != 0 961: || TREE_CODE ($5) != INTEGER_CST 962: || TREE_CODE ($7) != INTEGER_CST) 963: { 964: warning ("`%s' attribute directive ignored", 965: IDENTIFIER_POINTER ($1)); 966: $$ = $1; 967: } 968: else 1.1.1.3 ! root 969: $$ = tree_cons ($1, ! 970: tree_cons ($3, ! 971: tree_cons ($5, $7, NULL_TREE), ! 972: NULL_TREE), ! 973: NULL_TREE); } 1.1 root 974: ; 975: 976: init: 977: expr_no_commas 978: | '{' '}' 979: { $$ = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); 980: if (pedantic) 981: pedwarn ("ANSI C forbids empty initializer braces"); } 982: | '{' initlist '}' 983: { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); } 984: | '{' initlist ',' '}' 985: { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); } 986: | error 987: { $$ = NULL_TREE; } 988: ; 989: 990: /* This chain is built in reverse order, 991: and put in forward order where initlist is used. */ 992: initlist: 993: init 994: { $$ = build_tree_list (NULL_TREE, $1); } 995: | initlist ',' init 996: { $$ = tree_cons (NULL_TREE, $3, $1); } 997: /* These are for labeled elements. */ 1.1.1.3 ! root 998: | '[' expr_no_commas ELLIPSIS expr_no_commas ']' init ! 999: { $$ = build_tree_list (tree_cons ($2, NULL_TREE, ! 1000: build_tree_list ($4, NULL_TREE)), ! 1001: $6); } ! 1002: | initlist ',' '[' expr_no_commas ELLIPSIS expr_no_commas ']' init ! 1003: { $$ = tree_cons (tree_cons ($4, NULL_TREE, ! 1004: build_tree_list ($6, NULL_TREE)), ! 1005: $8, ! 1006: $1); } 1.1 root 1007: | '[' expr_no_commas ']' init 1008: { $$ = build_tree_list ($2, $4); } 1.1.1.3 ! root 1009: | initlist ',' '[' expr_no_commas ']' init 1.1 root 1010: { $$ = tree_cons ($4, $6, $1); } 1011: | identifier ':' init 1012: { $$ = build_tree_list ($1, $3); } 1013: | initlist ',' identifier ':' init 1014: { $$ = tree_cons ($3, $5, $1); } 1015: ; 1016: 1017: nested_function: 1018: declarator 1019: { push_c_function_context (); 1020: if (! start_function (current_declspecs, $1, 1)) 1021: { 1022: pop_c_function_context (); 1023: YYERROR1; 1024: } 1025: reinit_parse_for_function (); 1026: store_parm_decls (); } 1027: /* This used to use compstmt_or_error. 1028: That caused a bug with input `f(g) int g {}', 1029: where the use of YYERROR1 above caused an error 1030: which then was handled by compstmt_or_error. 1031: There followed a repeated execution of that same rule, 1032: which called YYERROR1 again, and so on. */ 1033: compstmt 1034: { finish_function (1); 1035: pop_c_function_context (); } 1036: ; 1037: 1038: notype_nested_function: 1039: notype_declarator 1040: { push_c_function_context (); 1041: if (! start_function (current_declspecs, $1, 1)) 1042: { 1043: pop_c_function_context (); 1044: YYERROR1; 1045: } 1046: reinit_parse_for_function (); 1047: store_parm_decls (); } 1048: /* This used to use compstmt_or_error. 1049: That caused a bug with input `f(g) int g {}', 1050: where the use of YYERROR1 above caused an error 1051: which then was handled by compstmt_or_error. 1052: There followed a repeated execution of that same rule, 1053: which called YYERROR1 again, and so on. */ 1054: compstmt 1055: { finish_function (1); 1056: pop_c_function_context (); } 1057: ; 1058: 1059: /* Any kind of declarator (thus, all declarators allowed 1060: after an explicit typespec). */ 1061: 1062: declarator: 1063: after_type_declarator 1064: | notype_declarator 1065: ; 1066: 1067: /* A declarator that is allowed only after an explicit typespec. */ 1068: 1069: after_type_declarator: 1070: '(' after_type_declarator ')' 1071: { $$ = $2; } 1072: | after_type_declarator '(' parmlist_or_identifiers %prec '.' 1073: { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } 1074: /* | after_type_declarator '(' error ')' %prec '.' 1075: { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); 1076: poplevel (0, 0, 0); } */ 1077: | after_type_declarator '[' expr ']' %prec '.' 1078: { $$ = build_nt (ARRAY_REF, $1, $3); } 1079: | after_type_declarator '[' ']' %prec '.' 1080: { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } 1081: | '*' type_quals after_type_declarator %prec UNARY 1082: { $$ = make_pointer_declarator ($2, $3); } 1083: | TYPENAME 1084: ; 1085: 1086: /* Kinds of declarator that can appear in a parameter list 1087: in addition to notype_declarator. This is like after_type_declarator 1088: but does not allow a typedef name in parentheses as an identifier 1089: (because it would conflict with a function with that typedef as arg). */ 1090: 1091: parm_declarator: 1092: parm_declarator '(' parmlist_or_identifiers %prec '.' 1093: { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } 1094: /* | parm_declarator '(' error ')' %prec '.' 1095: { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); 1096: poplevel (0, 0, 0); } */ 1097: | parm_declarator '[' expr ']' %prec '.' 1098: { $$ = build_nt (ARRAY_REF, $1, $3); } 1099: | parm_declarator '[' ']' %prec '.' 1100: { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } 1101: | '*' type_quals parm_declarator %prec UNARY 1102: { $$ = make_pointer_declarator ($2, $3); } 1103: | TYPENAME 1104: ; 1105: 1106: /* A declarator allowed whether or not there has been 1107: an explicit typespec. These cannot redeclare a typedef-name. */ 1108: 1109: notype_declarator: 1110: notype_declarator '(' parmlist_or_identifiers %prec '.' 1111: { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } 1112: /* | notype_declarator '(' error ')' %prec '.' 1113: { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); 1114: poplevel (0, 0, 0); } */ 1115: | '(' notype_declarator ')' 1116: { $$ = $2; } 1117: | '*' type_quals notype_declarator %prec UNARY 1118: { $$ = make_pointer_declarator ($2, $3); } 1119: | notype_declarator '[' expr ']' %prec '.' 1120: { $$ = build_nt (ARRAY_REF, $1, $3); } 1121: | notype_declarator '[' ']' %prec '.' 1122: { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } 1123: | IDENTIFIER 1124: ; 1125: 1126: structsp: 1127: STRUCT identifier '{' 1128: { $$ = start_struct (RECORD_TYPE, $2); 1129: /* Start scope of tag before parsing components. */ 1130: } 1131: component_decl_list '}' 1132: { $$ = finish_struct ($<ttype>4, $5); 1133: /* Really define the structure. */ 1134: } 1135: | STRUCT '{' component_decl_list '}' 1136: { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), 1137: $3); } 1138: | STRUCT identifier 1139: { $$ = xref_tag (RECORD_TYPE, $2); } 1140: | UNION identifier '{' 1141: { $$ = start_struct (UNION_TYPE, $2); } 1142: component_decl_list '}' 1143: { $$ = finish_struct ($<ttype>4, $5); } 1144: | UNION '{' component_decl_list '}' 1145: { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE), 1146: $3); } 1147: | UNION identifier 1148: { $$ = xref_tag (UNION_TYPE, $2); } 1149: | ENUM identifier '{' 1150: { $<itype>3 = suspend_momentary (); 1151: $$ = start_enum ($2); } 1152: enumlist maybecomma_warn '}' 1153: { $$ = finish_enum ($<ttype>4, nreverse ($5)); 1154: resume_momentary ($<itype>3); } 1155: | ENUM '{' 1156: { $<itype>2 = suspend_momentary (); 1157: $$ = start_enum (NULL_TREE); } 1158: enumlist maybecomma_warn '}' 1159: { $$ = finish_enum ($<ttype>3, nreverse ($4)); 1160: resume_momentary ($<itype>2); } 1161: | ENUM identifier 1162: { $$ = xref_tag (ENUMERAL_TYPE, $2); } 1163: ; 1164: 1165: maybecomma: 1166: /* empty */ 1167: | ',' 1168: ; 1169: 1170: maybecomma_warn: 1171: /* empty */ 1172: | ',' 1173: { if (pedantic) pedwarn ("comma at end of enumerator list"); } 1174: ; 1175: 1176: component_decl_list: 1177: component_decl_list2 1178: { $$ = $1; } 1179: | component_decl_list2 component_decl 1180: { $$ = chainon ($1, $2); 1.1.1.3 ! root 1181: pedwarn ("no semicolon at end of struct or union"); } 1.1 root 1182: ; 1183: 1184: component_decl_list2: /* empty */ 1185: { $$ = NULL_TREE; } 1186: | component_decl_list2 component_decl ';' 1187: { $$ = chainon ($1, $2); } 1188: | component_decl_list2 ';' 1189: { if (pedantic) 1.1.1.3 ! root 1190: pedwarn ("extra semicolon in struct or union specified"); } 1.1 root 1191: /* foo(sizeof(struct{ @defs(ClassName)})); */ 1192: | DEFS '(' CLASSNAME ')' 1193: { $$ = get_class_ivars ($3); } 1194: ; 1195: 1196: /* There is a shift-reduce conflict here, because `components' may 1197: start with a `typename'. It happens that shifting (the default resolution) 1198: does the right thing, because it treats the `typename' as part of 1199: a `typed_typespecs'. 1200: 1201: It is possible that this same technique would allow the distinction 1202: between `notype_initdecls' and `initdecls' to be eliminated. 1203: But I am being cautious and not trying it. */ 1204: 1205: component_decl: 1206: typed_typespecs setspecs components 1207: { $$ = $3; 1208: current_declspecs = TREE_VALUE (declspec_stack); 1209: declspec_stack = TREE_CHAIN (declspec_stack); 1210: resume_momentary ($2); } 1211: | typed_typespecs 1212: { if (pedantic) 1213: pedwarn ("ANSI C forbids member declarations with no members"); 1214: shadow_tag($1); 1215: $$ = NULL_TREE; } 1216: | nonempty_type_quals setspecs components 1217: { $$ = $3; 1218: current_declspecs = TREE_VALUE (declspec_stack); 1219: declspec_stack = TREE_CHAIN (declspec_stack); 1220: resume_momentary ($2); } 1221: | nonempty_type_quals 1222: { if (pedantic) 1223: pedwarn ("ANSI C forbids member declarations with no members"); 1224: shadow_tag($1); 1225: $$ = NULL_TREE; } 1226: | error 1227: { $$ = NULL_TREE; } 1228: ; 1229: 1230: components: 1231: component_declarator 1232: | components ',' component_declarator 1233: { $$ = chainon ($1, $3); } 1234: ; 1235: 1236: component_declarator: 1237: save_filename save_lineno declarator maybe_attribute 1238: { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); 1239: decl_attributes ($$, $4); } 1240: | save_filename save_lineno 1241: declarator ':' expr_no_commas maybe_attribute 1242: { $$ = grokfield ($1, $2, $3, current_declspecs, $5); 1243: decl_attributes ($$, $6); } 1244: | save_filename save_lineno ':' expr_no_commas 1245: { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); } 1246: ; 1247: 1248: /* We chain the enumerators in reverse order. 1249: They are put in forward order where enumlist is used. 1250: (The order used to be significant, but no longer is so. 1251: However, we still maintain the order, just to be clean.) */ 1252: 1253: enumlist: 1254: enumerator 1255: | enumlist ',' enumerator 1256: { $$ = chainon ($3, $1); } 1257: ; 1258: 1259: 1260: enumerator: 1261: identifier 1262: { $$ = build_enumerator ($1, NULL_TREE); } 1263: | identifier '=' expr_no_commas 1264: { $$ = build_enumerator ($1, $3); } 1265: ; 1266: 1267: typename: 1268: typed_typespecs absdcl 1269: { $$ = build_tree_list ($1, $2); } 1270: | nonempty_type_quals absdcl 1271: { $$ = build_tree_list ($1, $2); } 1272: ; 1273: 1274: absdcl: /* an absolute declarator */ 1275: /* empty */ 1276: { $$ = NULL_TREE; } 1277: | absdcl1 1278: ; 1279: 1280: nonempty_type_quals: 1281: TYPE_QUAL 1282: { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } 1283: | nonempty_type_quals TYPE_QUAL 1284: { $$ = tree_cons (NULL_TREE, $2, $1); } 1285: ; 1286: 1287: type_quals: 1288: /* empty */ 1289: { $$ = NULL_TREE; } 1290: | type_quals TYPE_QUAL 1291: { $$ = tree_cons (NULL_TREE, $2, $1); } 1292: ; 1293: 1294: absdcl1: /* a nonempty absolute declarator */ 1295: '(' absdcl1 ')' 1296: { $$ = $2; } 1297: /* `(typedef)1' is `int'. */ 1298: | '*' type_quals absdcl1 %prec UNARY 1299: { $$ = make_pointer_declarator ($2, $3); } 1300: | '*' type_quals %prec UNARY 1301: { $$ = make_pointer_declarator ($2, NULL_TREE); } 1302: | absdcl1 '(' parmlist %prec '.' 1303: { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } 1304: | absdcl1 '[' expr ']' %prec '.' 1305: { $$ = build_nt (ARRAY_REF, $1, $3); } 1306: | absdcl1 '[' ']' %prec '.' 1307: { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } 1308: | '(' parmlist %prec '.' 1309: { $$ = build_nt (CALL_EXPR, NULL_TREE, $2, NULL_TREE); } 1310: | '[' expr ']' %prec '.' 1311: { $$ = build_nt (ARRAY_REF, NULL_TREE, $2); } 1312: | '[' ']' %prec '.' 1313: { $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); } 1314: ; 1315: 1316: /* at least one statement, the first of which parses without error. */ 1317: /* stmts is used only after decls, so an invalid first statement 1318: is actually regarded as an invalid decl and part of the decls. */ 1319: 1320: stmts: 1.1.1.3 ! root 1321: lineno_stmt_or_label ! 1322: | stmts lineno_stmt_or_label 1.1 root 1323: | stmts errstmt 1324: ; 1325: 1326: xstmts: 1327: /* empty */ 1328: | stmts 1329: ; 1330: 1331: errstmt: error ';' 1332: ; 1333: 1334: pushlevel: /* empty */ 1335: { emit_line_note (input_filename, lineno); 1336: pushlevel (0); 1337: clear_last_expr (); 1338: push_momentary (); 1339: expand_start_bindings (0); 1340: if (objc_method_context) 1.1.1.3 ! root 1341: add_objc_decls (); ! 1342: } 1.1 root 1343: ; 1344: 1345: /* Read zero or more forward-declarations for labels 1346: that nested functions can jump to. */ 1347: maybe_label_decls: 1348: /* empty */ 1349: | label_decls 1350: { if (pedantic) 1351: pedwarn ("ANSI C forbids label declarations"); } 1352: ; 1353: 1354: label_decls: 1355: label_decl 1356: | label_decls label_decl 1357: ; 1358: 1359: label_decl: 1.1.1.3 ! root 1360: LABEL identifiers_or_typenames ';' 1.1 root 1361: { tree link; 1362: for (link = $2; link; link = TREE_CHAIN (link)) 1363: { 1364: tree label = shadow_label (TREE_VALUE (link)); 1365: C_DECLARED_LABEL_FLAG (label) = 1; 1366: declare_nonlocal_label (label); 1367: } 1368: } 1369: ; 1370: 1371: /* This is the body of a function definition. 1372: It causes syntax errors to ignore to the next openbrace. */ 1373: compstmt_or_error: 1374: compstmt 1375: {} 1376: | error compstmt 1377: ; 1378: 1379: compstmt: '{' '}' 1380: { $$ = convert (void_type_node, integer_zero_node); } 1381: | '{' pushlevel maybe_label_decls decls xstmts '}' 1382: { emit_line_note (input_filename, lineno); 1383: expand_end_bindings (getdecls (), 1, 0); 1384: $$ = poplevel (1, 1, 0); 1385: pop_momentary (); } 1386: | '{' pushlevel maybe_label_decls error '}' 1387: { emit_line_note (input_filename, lineno); 1388: expand_end_bindings (getdecls (), kept_level_p (), 0); 1389: $$ = poplevel (kept_level_p (), 0, 0); 1390: pop_momentary (); } 1391: | '{' pushlevel maybe_label_decls stmts '}' 1392: { emit_line_note (input_filename, lineno); 1393: expand_end_bindings (getdecls (), kept_level_p (), 0); 1394: $$ = poplevel (kept_level_p (), 0, 0); 1395: pop_momentary (); } 1396: ; 1397: 1398: /* Value is number of statements counted as of the closeparen. */ 1399: simple_if: 1.1.1.3 ! root 1400: if_prefix lineno_labeled_stmt ! 1401: /* Make sure expand_end_cond is run once ! 1402: for each call to expand_start_cond. ! 1403: Otherwise a crash is likely. */ ! 1404: | if_prefix error ! 1405: ; ! 1406: ! 1407: if_prefix: 1.1 root 1408: IF '(' expr ')' 1409: { emit_line_note ($<filename>-1, $<lineno>0); 1410: expand_start_cond (truthvalue_conversion ($3), 0); 1411: $<itype>1 = stmt_count; 1412: if_stmt_file = $<filename>-1; 1413: if_stmt_line = $<lineno>0; 1414: position_after_white_space (); } 1.1.1.3 ! root 1415: ; ! 1416: ! 1417: /* This is a subroutine of stmt. ! 1418: It is used twice, once for valid DO statements ! 1419: and once for catching errors in parsing the end test. */ ! 1420: do_stmt_start: ! 1421: DO ! 1422: { stmt_count++; ! 1423: emit_line_note ($<filename>-1, $<lineno>0); ! 1424: /* See comment in `while' alternative, above. */ ! 1425: emit_nop (); ! 1426: expand_start_loop_continue_elsewhere (1); ! 1427: position_after_white_space (); } ! 1428: lineno_labeled_stmt WHILE ! 1429: { expand_loop_continue_here (); } 1.1 root 1430: ; 1431: 1432: save_filename: 1433: { $$ = input_filename; } 1434: ; 1435: 1436: save_lineno: 1437: { $$ = lineno; } 1438: ; 1439: 1.1.1.3 ! root 1440: lineno_labeled_stmt: 1.1 root 1441: save_filename save_lineno stmt 1442: { } 1.1.1.3 ! root 1443: /* | save_filename save_lineno error ! 1444: { } ! 1445: */ ! 1446: | save_filename save_lineno label lineno_labeled_stmt ! 1447: { } ! 1448: ; ! 1449: ! 1450: lineno_stmt_or_label: ! 1451: save_filename save_lineno stmt_or_label ! 1452: { } 1.1 root 1453: ; 1454: 1.1.1.3 ! root 1455: stmt_or_label: ! 1456: stmt ! 1457: | label ! 1458: { int next; ! 1459: position_after_white_space (); ! 1460: next = getc (finput); ! 1461: ungetc (next, finput); ! 1462: if (pedantic && next == '}') ! 1463: pedwarn ("ANSI C forbids label at end of compound statement"); ! 1464: } ! 1465: ; ! 1466: ! 1467: /* Parse a single real statement, not including any labels. */ 1.1 root 1468: stmt: 1469: compstmt 1470: { stmt_count++; } 1471: | expr ';' 1472: { stmt_count++; 1473: emit_line_note ($<filename>-1, $<lineno>0); 1474: c_expand_expr_stmt ($1); 1475: clear_momentary (); } 1476: | simple_if ELSE 1477: { expand_start_else (); 1478: $<itype>1 = stmt_count; 1479: position_after_white_space (); } 1.1.1.3 ! root 1480: lineno_labeled_stmt 1.1 root 1481: { expand_end_cond (); 1482: if (extra_warnings && stmt_count == $<itype>1) 1483: warning ("empty body in an else-statement"); } 1484: | simple_if %prec IF 1485: { expand_end_cond (); 1486: if (extra_warnings && stmt_count == $<itype>1) 1487: warning_with_file_and_line (if_stmt_file, if_stmt_line, 1488: "empty body in an if-statement"); } 1.1.1.3 ! root 1489: /* Make sure expand_end_cond is run once ! 1490: for each call to expand_start_cond. ! 1491: Otherwise a crash is likely. */ ! 1492: | simple_if ELSE error ! 1493: { expand_end_cond (); } 1.1 root 1494: | WHILE 1.1.1.3 ! root 1495: { stmt_count++; 1.1 root 1496: emit_line_note ($<filename>-1, $<lineno>0); 1.1.1.3 ! root 1497: /* The emit_nop used to come before emit_line_note, ! 1498: but that made the nop seem like part of the preceding line. ! 1499: And that was confusing when the preceding line was ! 1500: inside of an if statement and was not really executed. ! 1501: I think it ought to work to put the nop after the line number. ! 1502: We will see. --rms, July 15, 1991. */ ! 1503: emit_nop (); } 1.1 root 1504: '(' expr ')' 1.1.1.3 ! root 1505: { /* Don't start the loop till we have succeeded ! 1506: in parsing the end test. This is to make sure ! 1507: that we end every loop we start. */ ! 1508: expand_start_loop (1); ! 1509: emit_line_note (input_filename, lineno); ! 1510: expand_exit_loop_if_false (NULL_PTR, ! 1511: truthvalue_conversion ($4)); 1.1 root 1512: position_after_white_space (); } 1.1.1.3 ! root 1513: lineno_labeled_stmt 1.1 root 1514: { expand_end_loop (); } 1.1.1.3 ! root 1515: | do_stmt_start 1.1 root 1516: '(' expr ')' ';' 1517: { emit_line_note (input_filename, lineno); 1.1.1.3 ! root 1518: expand_exit_loop_if_false (NULL_PTR, ! 1519: truthvalue_conversion ($3)); 1.1 root 1520: expand_end_loop (); 1521: clear_momentary (); } 1.1.1.3 ! root 1522: /* This rule is needed to make sure we end every loop we start. */ ! 1523: | do_stmt_start error ! 1524: { expand_end_loop (); ! 1525: clear_momentary (); } 1.1 root 1526: | FOR 1527: '(' xexpr ';' 1.1.1.3 ! root 1528: { stmt_count++; 1.1 root 1529: emit_line_note ($<filename>-1, $<lineno>0); 1.1.1.3 ! root 1530: /* See comment in `while' alternative, above. */ ! 1531: emit_nop (); 1.1 root 1532: if ($3) c_expand_expr_stmt ($3); 1.1.1.3 ! root 1533: /* Next step is to call expand_start_loop_continue_elsewhere, ! 1534: but wait till after we parse the entire for (...). ! 1535: Otherwise, invalid input might cause us to call that ! 1536: fn without calling expand_end_loop. */ ! 1537: } 1.1 root 1538: xexpr ';' 1.1.1.3 ! root 1539: /* Can't emit now; wait till after expand_start_loop... */ ! 1540: { $<lineno>7 = lineno; ! 1541: $<filename>$ = input_filename; } 1.1 root 1542: xexpr ')' 1.1.1.3 ! root 1543: { ! 1544: /* Start the loop. Doing this after parsing ! 1545: all the expressions ensures we will end the loop. */ ! 1546: expand_start_loop_continue_elsewhere (1); ! 1547: /* Emit the end-test, with a line number. */ ! 1548: emit_line_note ($<filename>8, $<lineno>7); ! 1549: if ($6) ! 1550: expand_exit_loop_if_false (NULL_PTR, ! 1551: truthvalue_conversion ($6)); ! 1552: /* Don't let the tree nodes for $9 be discarded by ! 1553: clear_momentary during the parsing of the next stmt. */ ! 1554: push_momentary (); ! 1555: $<lineno>7 = lineno; ! 1556: $<filename>8 = input_filename; } ! 1557: lineno_labeled_stmt ! 1558: { /* Emit the increment expression, with a line number. */ ! 1559: emit_line_note ($<filename>8, $<lineno>7); 1.1 root 1560: expand_loop_continue_here (); 1561: if ($9) 1562: c_expand_expr_stmt ($9); 1563: pop_momentary (); 1564: expand_end_loop (); } 1565: | SWITCH '(' expr ')' 1566: { stmt_count++; 1567: emit_line_note ($<filename>-1, $<lineno>0); 1568: c_expand_start_case ($3); 1569: /* Don't let the tree nodes for $3 be discarded by 1570: clear_momentary during the parsing of the next stmt. */ 1571: push_momentary (); 1572: position_after_white_space (); } 1.1.1.3 ! root 1573: lineno_labeled_stmt 1.1 root 1574: { expand_end_case ($3); 1575: pop_momentary (); } 1.1.1.3 ! root 1576: | BREAK ';' ! 1577: { stmt_count++; ! 1578: emit_line_note ($<filename>-1, $<lineno>0); ! 1579: if ( ! expand_exit_something ()) ! 1580: error ("break statement not within loop or switch"); } ! 1581: | CONTINUE ';' ! 1582: { stmt_count++; ! 1583: emit_line_note ($<filename>-1, $<lineno>0); ! 1584: if (! expand_continue_loop (NULL_PTR)) ! 1585: error ("continue statement not within a loop"); } ! 1586: | RETURN ';' ! 1587: { stmt_count++; ! 1588: emit_line_note ($<filename>-1, $<lineno>0); ! 1589: c_expand_return (NULL_TREE); } ! 1590: | RETURN expr ';' ! 1591: { stmt_count++; ! 1592: emit_line_note ($<filename>-1, $<lineno>0); ! 1593: c_expand_return ($2); } ! 1594: | ASM_KEYWORD maybe_type_qual '(' expr ')' ';' ! 1595: { stmt_count++; ! 1596: emit_line_note ($<filename>-1, $<lineno>0); ! 1597: STRIP_NOPS ($4); ! 1598: if ((TREE_CODE ($4) == ADDR_EXPR ! 1599: && TREE_CODE (TREE_OPERAND ($4, 0)) == STRING_CST) ! 1600: || TREE_CODE ($4) == STRING_CST) ! 1601: expand_asm ($4); ! 1602: else ! 1603: error ("argument of `asm' is not a constant string"); } ! 1604: /* This is the case with just output operands. */ ! 1605: | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' ! 1606: { stmt_count++; ! 1607: emit_line_note ($<filename>-1, $<lineno>0); ! 1608: c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE, ! 1609: $2 == ridpointers[(int)RID_VOLATILE], ! 1610: input_filename, lineno); } ! 1611: /* This is the case with input operands as well. */ ! 1612: | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' asm_operands ')' ';' ! 1613: { stmt_count++; ! 1614: emit_line_note ($<filename>-1, $<lineno>0); ! 1615: c_expand_asm_operands ($4, $6, $8, NULL_TREE, ! 1616: $2 == ridpointers[(int)RID_VOLATILE], ! 1617: input_filename, lineno); } ! 1618: /* This is the case with clobbered registers as well. */ ! 1619: | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' ! 1620: asm_operands ':' asm_clobbers ')' ';' ! 1621: { stmt_count++; ! 1622: emit_line_note ($<filename>-1, $<lineno>0); ! 1623: c_expand_asm_operands ($4, $6, $8, $10, ! 1624: $2 == ridpointers[(int)RID_VOLATILE], ! 1625: input_filename, lineno); } ! 1626: | GOTO identifier ';' ! 1627: { tree decl; ! 1628: stmt_count++; ! 1629: emit_line_note ($<filename>-1, $<lineno>0); ! 1630: decl = lookup_label ($2); ! 1631: if (decl != 0) ! 1632: { ! 1633: TREE_USED (decl) = 1; ! 1634: expand_goto (decl); ! 1635: } ! 1636: } ! 1637: | GOTO '*' expr ';' ! 1638: { stmt_count++; ! 1639: emit_line_note ($<filename>-1, $<lineno>0); ! 1640: expand_computed_goto (convert (ptr_type_node, $3)); } ! 1641: | ';' ! 1642: ; ! 1643: ! 1644: /* Any kind of label, including jump labels and case labels. ! 1645: ANSI C accepts labels only before statements, but we allow them ! 1646: also at the end of a compound statement. */ ! 1647: ! 1648: label: CASE expr ':' 1.1 root 1649: { register tree value = check_case_value ($2); 1650: register tree label 1651: = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); 1652: 1653: stmt_count++; 1654: 1655: if (value != error_mark_node) 1656: { 1657: tree duplicate; 1658: int success = pushcase (value, label, &duplicate); 1659: if (success == 1) 1660: error ("case label not within a switch statement"); 1661: else if (success == 2) 1662: { 1663: error ("duplicate case value"); 1664: error_with_decl (duplicate, "this is the first entry for that value"); 1665: } 1666: else if (success == 3) 1667: warning ("case value out of range"); 1668: else if (success == 5) 1669: error ("case label within scope of cleanup or variable array"); 1670: } 1671: position_after_white_space (); } 1672: | CASE expr ELLIPSIS expr ':' 1673: { register tree value1 = check_case_value ($2); 1674: register tree value2 = check_case_value ($4); 1675: register tree label 1676: = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); 1677: 1678: stmt_count++; 1679: 1680: if (value1 != error_mark_node && value2 != error_mark_node) 1681: { 1682: tree duplicate; 1683: int success = pushcase_range (value1, value2, label, 1684: &duplicate); 1685: if (success == 1) 1686: error ("case label not within a switch statement"); 1687: else if (success == 2) 1688: { 1689: error ("duplicate case value"); 1.1.1.3 ! root 1690: error_with_decl (duplicate, "this is the first entry for that value"); 1.1 root 1691: } 1692: else if (success == 3) 1693: warning ("case value out of range"); 1694: else if (success == 4) 1695: warning ("empty case range"); 1696: else if (success == 5) 1697: error ("case label within scope of cleanup or variable array"); 1698: } 1699: position_after_white_space (); } 1700: | DEFAULT ':' 1701: { 1702: tree duplicate; 1703: register tree label 1704: = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); 1705: int success = pushcase (NULL_TREE, label, &duplicate); 1706: stmt_count++; 1707: if (success == 1) 1708: error ("default label not within a switch statement"); 1709: else if (success == 2) 1710: { 1711: error ("multiple default labels in one switch"); 1.1.1.3 ! root 1712: error_with_decl (duplicate, "this is the first default label"); 1.1 root 1713: } 1714: position_after_white_space (); } 1715: | identifier ':' 1716: { tree label = define_label (input_filename, lineno, $1); 1717: stmt_count++; 1718: emit_nop (); 1719: if (label) 1720: expand_label (label); 1721: position_after_white_space (); } 1722: ; 1723: 1724: /* Either a type-qualifier or nothing. First thing in an `asm' statement. */ 1725: 1726: maybe_type_qual: 1727: /* empty */ 1.1.1.3 ! root 1728: { emit_line_note (input_filename, lineno); } 1.1 root 1729: | TYPE_QUAL 1.1.1.3 ! root 1730: { emit_line_note (input_filename, lineno); } 1.1 root 1731: ; 1732: 1733: xexpr: 1734: /* empty */ 1735: { $$ = NULL_TREE; } 1736: | expr 1737: ; 1738: 1739: /* These are the operands other than the first string and colon 1740: in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ 1741: asm_operands: /* empty */ 1742: { $$ = NULL_TREE; } 1743: | nonnull_asm_operands 1744: ; 1745: 1746: nonnull_asm_operands: 1747: asm_operand 1748: | nonnull_asm_operands ',' asm_operand 1749: { $$ = chainon ($1, $3); } 1750: ; 1751: 1752: asm_operand: 1753: STRING '(' expr ')' 1754: { $$ = build_tree_list ($1, $3); } 1755: ; 1756: 1757: asm_clobbers: 1758: string 1759: { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE); } 1760: | asm_clobbers ',' string 1761: { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); } 1762: ; 1.1.1.3 ! root 1763: 1.1 root 1764: /* This is what appears inside the parens in a function declarator. 1765: Its value is a list of ..._TYPE nodes. */ 1766: parmlist: 1767: { pushlevel (0); 1.1.1.3 ! root 1768: clear_parm_order (); 1.1 root 1769: declare_parm_level (0); } 1770: parmlist_1 1771: { $$ = $2; 1772: parmlist_tags_warning (); 1773: poplevel (0, 0, 0); } 1774: ; 1775: 1776: parmlist_1: 1777: parmlist_2 ')' 1.1.1.3 ! root 1778: | parms ';' ! 1779: { tree parm; ! 1780: if (pedantic) ! 1781: pedwarn ("ANSI C forbids forward parameter declarations"); ! 1782: /* Mark the forward decls as such. */ ! 1783: for (parm = getdecls (); parm; parm = TREE_CHAIN (parm)) ! 1784: TREE_ASM_WRITTEN (parm) = 1; ! 1785: clear_parm_order (); } ! 1786: parmlist_1 ! 1787: { $$ = $4; } 1.1 root 1788: | error ')' 1789: { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } 1790: ; 1791: 1792: /* This is what appears inside the parens in a function declarator. 1793: Is value is represented in the format that grokdeclarator expects. */ 1794: parmlist_2: /* empty */ 1795: { $$ = get_parm_info (0); } 1.1.1.3 ! root 1796: | ELLIPSIS ! 1797: { $$ = get_parm_info (0); ! 1798: if (pedantic) ! 1799: pedwarn ("ANSI C requires a named argument before `...'"); ! 1800: } 1.1 root 1801: | parms 1802: { $$ = get_parm_info (1); } 1803: | parms ',' ELLIPSIS 1804: { $$ = get_parm_info (0); } 1805: ; 1806: 1807: parms: 1808: parm 1809: { push_parm_decl ($1); } 1810: | parms ',' parm 1811: { push_parm_decl ($3); } 1812: ; 1813: 1814: /* A single parameter declaration or parameter type name, 1815: as found in a parmlist. */ 1816: parm: 1817: typed_declspecs parm_declarator 1818: { $$ = build_tree_list ($1, $2) ; } 1819: | typed_declspecs notype_declarator 1820: { $$ = build_tree_list ($1, $2) ; } 1821: | typed_declspecs absdcl 1822: { $$ = build_tree_list ($1, $2); } 1823: | declmods notype_declarator 1824: { $$ = build_tree_list ($1, $2) ; } 1825: | declmods absdcl 1826: { $$ = build_tree_list ($1, $2); } 1827: ; 1828: 1.1.1.3 ! root 1829: /* This is used in a function definition ! 1830: where either a parmlist or an identifier list is ok. ! 1831: Its value is a list of ..._TYPE nodes or a list of identifiers. */ ! 1832: parmlist_or_identifiers: ! 1833: { pushlevel (0); ! 1834: clear_parm_order (); ! 1835: declare_parm_level (1); } ! 1836: parmlist_or_identifiers_1 ! 1837: { $$ = $2; ! 1838: parmlist_tags_warning (); ! 1839: poplevel (0, 0, 0); } ! 1840: ; ! 1841: ! 1842: parmlist_or_identifiers_1: ! 1843: parmlist_1 ! 1844: | identifiers ')' ! 1845: { tree t; ! 1846: for (t = $1; t; t = TREE_CHAIN (t)) ! 1847: if (TREE_VALUE (t) == NULL_TREE) ! 1848: error ("`...' in old-style identifier list"); ! 1849: $$ = tree_cons (NULL_TREE, NULL_TREE, $1); } ! 1850: ; ! 1851: 1.1 root 1852: /* A nonempty list of identifiers. */ 1853: identifiers: 1854: IDENTIFIER 1855: { $$ = build_tree_list (NULL_TREE, $1); } 1856: | identifiers ',' IDENTIFIER 1857: { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } 1858: ; 1.1.1.3 ! root 1859: ! 1860: /* A nonempty list of identifiers, including typenames. */ ! 1861: identifiers_or_typenames: ! 1862: identifier ! 1863: { $$ = build_tree_list (NULL_TREE, $1); } ! 1864: | identifiers_or_typenames ',' identifier ! 1865: { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } ! 1866: ; 1.1 root 1867: 1.1.1.3 ! root 1868: /* Objective-C productions. */ ! 1869: 1.1 root 1870: objcdef: 1871: classdef 1872: | methoddef 1873: | END 1874: { 1875: if (objc_implementation_context) 1876: { 1877: finish_class (objc_implementation_context); 1878: objc_ivar_chain = NULL_TREE; 1879: objc_implementation_context = NULL_TREE; 1880: } 1881: else 1882: warning ("`@end' must appear in an implementation context"); 1883: } 1884: ; 1885: 1886: classdef: 1887: INTERFACE identifier '{' 1888: { 1889: objc_interface_context = objc_ivar_context 1890: = start_class (INTERFACE_TYPE, $2, NULL_TREE); 1891: objc_public_flag = 0; 1892: } 1893: ivar_decl_list '}' 1894: { 1895: continue_class (objc_interface_context); 1896: } 1897: methodprotolist 1898: END 1899: { 1900: finish_class (objc_interface_context); 1901: objc_interface_context = NULL_TREE; 1902: } 1903: 1904: | INTERFACE identifier 1905: { 1906: objc_interface_context 1907: = start_class (INTERFACE_TYPE, $2, NULL_TREE); 1908: continue_class (objc_interface_context); 1909: } 1910: methodprotolist 1911: END 1912: { 1913: finish_class (objc_interface_context); 1914: objc_interface_context = NULL_TREE; 1915: } 1916: 1917: | INTERFACE identifier ':' identifier '{' 1918: { 1919: objc_interface_context = objc_ivar_context 1920: = start_class (INTERFACE_TYPE, $2, $4); 1921: objc_public_flag = 0; 1922: } 1923: ivar_decl_list '}' 1924: { 1925: continue_class (objc_interface_context); 1926: } 1927: methodprotolist 1928: END 1929: { 1930: finish_class (objc_interface_context); 1931: objc_interface_context = NULL_TREE; 1932: } 1933: 1934: | INTERFACE identifier ':' identifier 1935: { 1936: objc_interface_context 1937: = start_class (INTERFACE_TYPE, $2, $4); 1938: continue_class (objc_interface_context); 1939: } 1940: methodprotolist 1941: END 1942: { 1943: finish_class (objc_interface_context); 1944: objc_interface_context = NULL_TREE; 1945: } 1946: 1947: | IMPLEMENTATION identifier '{' 1948: { 1949: objc_implementation_context = objc_ivar_context 1950: = start_class (IMPLEMENTATION_TYPE, $2, NULL_TREE); 1951: objc_public_flag = 0; 1952: } 1953: ivar_decl_list '}' 1954: { 1955: objc_ivar_chain 1956: = continue_class (objc_implementation_context); 1957: } 1958: 1959: | IMPLEMENTATION identifier 1960: { 1961: objc_implementation_context 1962: = start_class (IMPLEMENTATION_TYPE, $2, NULL_TREE); 1963: objc_ivar_chain 1964: = continue_class (objc_implementation_context); 1965: } 1966: 1967: | IMPLEMENTATION identifier ':' identifier '{' 1968: { 1969: objc_implementation_context = objc_ivar_context 1970: = start_class (IMPLEMENTATION_TYPE, $2, $4); 1971: objc_public_flag = 0; 1972: } 1973: ivar_decl_list '}' 1974: { 1975: objc_ivar_chain 1976: = continue_class (objc_implementation_context); 1977: } 1978: 1979: | IMPLEMENTATION identifier ':' identifier 1980: { 1981: objc_implementation_context 1982: = start_class (IMPLEMENTATION_TYPE, $2, $4); 1983: objc_ivar_chain 1984: = continue_class (objc_implementation_context); 1985: } 1986: 1987: | INTERFACE identifier '(' identifier ')' 1988: { 1989: objc_interface_context 1990: = start_class (PROTOCOL_TYPE, $2, $4); 1991: continue_class (objc_interface_context); 1992: } 1993: methodprotolist 1994: END 1995: { 1996: finish_class (objc_interface_context); 1997: objc_interface_context = NULL_TREE; 1998: } 1999: 2000: | IMPLEMENTATION identifier '(' identifier ')' 2001: { 2002: objc_implementation_context 2003: = start_class (CATEGORY_TYPE, $2, $4); 2004: objc_ivar_chain 2005: = continue_class (objc_implementation_context); 2006: } 2007: ; 2008: 2009: ivar_decl_list: 2010: ivar_decls PUBLIC { objc_public_flag = 1; } ivar_decls 2011: | ivar_decls 2012: ; 2013: 2014: ivar_decls: 2015: /* empty */ 2016: { 2017: $$ = NULL_TREE; 2018: } 2019: | ivar_decls ivar_decl ';' 2020: | ivar_decls ';' 2021: { 2022: if (pedantic) 2023: warning ("extra semicolon in struct or union specified"); 2024: } 2025: ; 2026: 2027: 2028: /* There is a shift-reduce conflict here, because `components' may 2029: start with a `typename'. It happens that shifting (the default resolution) 2030: does the right thing, because it treats the `typename' as part of 2031: a `typed_typespecs'. 2032: 2033: It is possible that this same technique would allow the distinction 2034: between `notype_initdecls' and `initdecls' to be eliminated. 2035: But I am being cautious and not trying it. */ 2036: 2037: ivar_decl: 2038: typed_typespecs setspecs ivars 2039: { 2040: $$ = $3; 2041: resume_momentary ($2); 2042: } 2043: | nonempty_type_quals setspecs ivars 2044: { 2045: $$ = $3; 2046: resume_momentary ($2); 2047: } 2048: | error 2049: { $$ = NULL_TREE; } 2050: ; 2051: 2052: ivars: 2053: /* empty */ 2054: { $$ = NULL_TREE; } 2055: | ivar_declarator 2056: | ivars ',' ivar_declarator 2057: ; 2058: 2059: ivar_declarator: 2060: declarator 2061: { 2062: $$ = add_instance_variable (objc_ivar_context, 2063: objc_public_flag, 2064: $1, current_declspecs, 2065: NULL_TREE); 2066: } 2067: | declarator ':' expr_no_commas 2068: { 2069: $$ = add_instance_variable (objc_ivar_context, 2070: objc_public_flag, 2071: $1, current_declspecs, $3); 2072: } 2073: | ':' expr_no_commas 2074: { 2075: $$ = add_instance_variable (objc_ivar_context, 2076: objc_public_flag, 2077: NULL_TREE, 2078: current_declspecs, $2); 2079: } 2080: ; 2081: 2082: methoddef: 2083: '+' 2084: { 2085: if (objc_implementation_context) 2086: objc_inherit_code = CLASS_METHOD_DECL; 2087: else 2088: fatal ("method definition not in class context"); 2089: } 2090: methoddecl 2091: { 2092: add_class_method (objc_implementation_context, $3); 2093: start_method_def ($3); 2094: objc_method_context = $3; 2095: } 2096: optarglist 2097: { 2098: continue_method_def (); 2099: } 2100: compstmt_or_error 2101: { 2102: finish_method_def (); 2103: objc_method_context = NULL_TREE; 2104: } 2105: 2106: | '-' 2107: { 2108: if (objc_implementation_context) 2109: objc_inherit_code = INSTANCE_METHOD_DECL; 2110: else 2111: fatal ("method definition not in class context"); 2112: } 2113: methoddecl 2114: { 2115: add_instance_method (objc_implementation_context, $3); 2116: start_method_def ($3); 2117: objc_method_context = $3; 2118: } 2119: optarglist 2120: { 2121: continue_method_def (); 2122: } 2123: compstmt_or_error 2124: { 2125: finish_method_def (); 2126: objc_method_context = NULL_TREE; 2127: } 2128: ; 2129: 2130: /* the reason for the strange actions in this rule 2131: is so that notype_initdecls when reached via datadef 2132: can find a valid list of type and sc specs in $0. */ 2133: 2134: methodprotolist: 2135: /* empty */ 2136: | {$<ttype>$ = NULL_TREE; } methodprotolist2 2137: ; 2138: 2139: methodprotolist2: /* eliminates a shift/reduce conflict */ 2140: methodproto 2141: | datadef 2142: | methodprotolist2 methodproto 2143: | methodprotolist2 {$<ttype>$ = NULL_TREE; } datadef 2144: ; 2145: 2146: semi_or_error: 2147: ';' 2148: | error 2149: ; 2150: 2151: methodproto: 2152: '+' 2153: { 2154: objc_inherit_code = CLASS_METHOD_DECL; 2155: } 2156: methoddecl 2157: { 2158: add_class_method (objc_interface_context, $3); 2159: } 2160: semi_or_error 2161: 2162: | '-' 2163: { 2164: objc_inherit_code = INSTANCE_METHOD_DECL; 2165: } 2166: methoddecl 2167: { 2168: add_instance_method (objc_interface_context, $3); 2169: } 2170: semi_or_error 2171: ; 2172: 2173: methoddecl: 2174: '(' typename ')' unaryselector 2175: { 2176: $$ = build_method_decl (objc_inherit_code, $2, $4, NULL_TREE); 2177: } 2178: 2179: | unaryselector 2180: { 2181: $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, NULL_TREE); 2182: } 2183: 2184: | '(' typename ')' keywordselector optparmlist 2185: { 2186: $$ = build_method_decl (objc_inherit_code, $2, $4, $5); 2187: } 2188: 2189: | keywordselector optparmlist 2190: { 2191: $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, $2); 2192: } 2193: ; 2194: 2195: /* "optarglist" assumes that start_method_def has already been called... 2196: if it is not, the "xdecls" will not be placed in the proper scope */ 2197: 2198: optarglist: 2199: /* empty */ 2200: | ';' myxdecls 2201: ; 2202: 2203: /* to get around the following situation: "int foo (int a) int b; {}" that 2204: is synthesized when parsing "- a:a b:b; id c; id d; { ... }" */ 2205: 2206: myxdecls: 2207: /* empty */ 2208: | mydecls 2209: ; 2210: 2211: mydecls: 2212: mydecl 2213: | errstmt 2214: | mydecls mydecl 2215: | mydecl errstmt 2216: ; 2217: 2218: mydecl: 2219: typed_declspecs setspecs myparms ';' 2220: { resume_momentary ($2); } 2221: | typed_declspecs ';' 2222: { shadow_tag ($1); } 2223: | declmods ';' 1.1.1.3 ! root 2224: { pedwarn ("empty declaration"); } 1.1 root 2225: ; 2226: 2227: myparms: 2228: myparm 2229: { push_parm_decl ($1); } 2230: | myparms ',' myparm 2231: { push_parm_decl ($3); } 2232: ; 2233: 2234: /* A single parameter declaration or parameter type name, 2235: as found in a parmlist. DOES NOT ALLOW AN INITIALIZER OR ASMSPEC */ 2236: 2237: myparm: 2238: parm_declarator 2239: { $$ = build_tree_list (current_declspecs, $1) ; } 2240: | notype_declarator 2241: { $$ = build_tree_list (current_declspecs, $1) ; } 2242: | absdcl 2243: { $$ = build_tree_list (current_declspecs, $1) ; } 2244: ; 2245: 2246: optparmlist: 2247: /* empty */ 2248: { 2249: $$ = NULL_TREE; 2250: } 2251: | ',' ELLIPSIS 2252: { 2253: /* oh what a kludge! */ 2254: $$ = (tree)1; 2255: } 2256: | ',' 2257: { 2258: pushlevel (0); 2259: } 2260: parmlist_2 2261: { 2262: /* returns a tree list node generated by get_parm_info */ 2263: $$ = $3; 2264: poplevel (0, 0, 0); 2265: } 2266: ; 2267: 2268: unaryselector: 2269: selector 2270: ; 2271: 2272: keywordselector: 2273: keyworddecl 2274: 2275: | keywordselector keyworddecl 2276: { 2277: $$ = chainon ($1, $2); 2278: } 2279: ; 2280: 2281: selector: 2282: IDENTIFIER 2283: | TYPENAME 2284: | reservedwords 2285: ; 2286: 2287: reservedwords: 2288: ENUM { $$ = get_identifier (token_buffer); } 2289: | STRUCT { $$ = get_identifier (token_buffer); } 2290: | UNION { $$ = get_identifier (token_buffer); } 2291: | IF { $$ = get_identifier (token_buffer); } 2292: | ELSE { $$ = get_identifier (token_buffer); } 2293: | WHILE { $$ = get_identifier (token_buffer); } 2294: | DO { $$ = get_identifier (token_buffer); } 2295: | FOR { $$ = get_identifier (token_buffer); } 2296: | SWITCH { $$ = get_identifier (token_buffer); } 2297: | CASE { $$ = get_identifier (token_buffer); } 2298: | DEFAULT { $$ = get_identifier (token_buffer); } 2299: | BREAK { $$ = get_identifier (token_buffer); } 2300: | CONTINUE { $$ = get_identifier (token_buffer); } 2301: | RETURN { $$ = get_identifier (token_buffer); } 2302: | GOTO { $$ = get_identifier (token_buffer); } 1.1.1.2 root 2303: | ASM_KEYWORD { $$ = get_identifier (token_buffer); } 1.1 root 2304: | SIZEOF { $$ = get_identifier (token_buffer); } 2305: | TYPEOF { $$ = get_identifier (token_buffer); } 2306: | ALIGNOF { $$ = get_identifier (token_buffer); } 2307: | TYPESPEC | TYPE_QUAL 2308: ; 2309: 2310: keyworddecl: 2311: selector ':' '(' typename ')' identifier 2312: { 2313: $$ = build_keyword_decl ($1, $4, $6); 2314: } 2315: 2316: | selector ':' identifier 2317: { 2318: $$ = build_keyword_decl ($1, NULL_TREE, $3); 2319: } 2320: 2321: | ':' '(' typename ')' identifier 2322: { 2323: $$ = build_keyword_decl (NULL_TREE, $3, $5); 2324: } 2325: 2326: | ':' identifier 2327: { 2328: $$ = build_keyword_decl (NULL_TREE, NULL_TREE, $2); 2329: } 2330: ; 2331: 2332: messageargs: 2333: selector 2334: | keywordarglist 2335: ; 2336: 2337: keywordarglist: 2338: keywordarg 2339: | keywordarglist keywordarg 2340: { 2341: $$ = chainon ($1, $2); 2342: } 2343: ; 2344: 2345: 2346: keywordexpr: 2347: nonnull_exprlist 2348: { 2349: if (TREE_CHAIN ($1) == NULL_TREE) 2350: /* just return the expr., remove a level of indirection */ 2351: $$ = TREE_VALUE ($1); 2352: else 2353: /* we have a comma expr., we will collapse later */ 2354: $$ = $1; 2355: } 2356: ; 2357: 2358: keywordarg: 2359: selector ':' keywordexpr 2360: { 2361: $$ = build_tree_list ($1, $3); 2362: } 2363: | ':' keywordexpr 2364: { 2365: $$ = build_tree_list (NULL_TREE, $2); 2366: } 2367: ; 2368: 2369: receiver: 2370: expr 2371: | CLASSNAME 2372: { 2373: $$ = get_class_reference ($1); 2374: } 2375: ; 2376: 2377: objcmessageexpr: 2378: '[' 2379: { objc_receiver_context = 1; } 2380: receiver 2381: { objc_receiver_context = 0; } 2382: messageargs ']' 2383: { 2384: $$ = build_tree_list ($3, $5); 2385: } 2386: ; 2387: 2388: selectorarg: 2389: selector 2390: | keywordnamelist 2391: ; 2392: 2393: keywordnamelist: 2394: keywordname 2395: | keywordnamelist keywordname 2396: { 2397: $$ = chainon ($1, $2); 2398: } 2399: ; 2400: 2401: keywordname: 2402: selector ':' 2403: { 2404: $$ = build_tree_list ($1, NULL_TREE); 2405: } 2406: | ':' 2407: { 2408: $$ = build_tree_list (NULL_TREE, NULL_TREE); 2409: } 2410: ; 2411: 2412: objcselectorexpr: 2413: SELECTOR '(' selectorarg ')' 2414: { 2415: $$ = $3; 2416: } 2417: ; 2418: 2419: /* extension to support C-structures in the archiver */ 2420: 2421: objcencodeexpr: 2422: ENCODE '(' typename ')' 2423: { 2424: $$ = groktypename ($3); 2425: } 2426: ; 1.1.1.3 ! root 2427: 1.1 root 2428: %% 1.1.1.3 ! root 2429: 1.1 root 2430: /* If STRING is the name of an Objective C @-keyword 2431: (not including the @), return the token type for that keyword. 2432: Otherwise return 0. */ 2433: 2434: int 2435: recognize_objc_keyword (string) 2436: char *string; 2437: { 2438: switch (string[0]) 2439: { 2440: case 'd': 2441: if (!strcmp (string, "defs")) 2442: return DEFS; 2443: break; 2444: case 'e': 2445: if (!strcmp (string, "end")) 2446: return END; 2447: if (!strcmp (string, "encode")) 2448: return ENCODE; 2449: break; 2450: case 'i': 2451: if (!strcmp (string, "interface")) 2452: return INTERFACE; 2453: if (!strcmp (string, "implementation")) 2454: return IMPLEMENTATION; 2455: break; 2456: case 'p': 2457: if (!strcmp (string, "public")) 2458: return PUBLIC; 2459: break; 2460: case 's': 2461: if (!strcmp (string, "selector")) 2462: return SELECTOR; 2463: break; 2464: } 2465: return 0; 2466: } 1.1.1.3 ! root 2467:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.