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