Annotation of embedaddon/php/Zend/zend_language_parser.y, revision 1.1
1.1 ! misho 1: %{
! 2: /*
! 3: +----------------------------------------------------------------------+
! 4: | Zend Engine |
! 5: +----------------------------------------------------------------------+
! 6: | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
! 7: +----------------------------------------------------------------------+
! 8: | This source file is subject to version 2.00 of the Zend license, |
! 9: | that is bundled with this package in the file LICENSE, and is |
! 10: | available through the world-wide-web at the following url: |
! 11: | http://www.zend.com/license/2_00.txt. |
! 12: | If you did not receive a copy of the Zend license and are unable to |
! 13: | obtain it through the world-wide-web, please send a note to |
! 14: | license@zend.com so we can mail you a copy immediately. |
! 15: +----------------------------------------------------------------------+
! 16: | Authors: Andi Gutmans <andi@zend.com> |
! 17: | Zeev Suraski <zeev@zend.com> |
! 18: +----------------------------------------------------------------------+
! 19: */
! 20:
! 21: /* $Id: zend_language_parser.y 321634 2012-01-01 13:15:04Z felipe $ */
! 22:
! 23: /*
! 24: * LALR shift/reduce conflicts and how they are resolved:
! 25: *
! 26: * - 2 shift/reduce conflicts due to the dangling elseif/else ambiguity. Solved by shift.
! 27: *
! 28: */
! 29:
! 30:
! 31: #include "zend_compile.h"
! 32: #include "zend.h"
! 33: #include "zend_list.h"
! 34: #include "zend_globals.h"
! 35: #include "zend_API.h"
! 36: #include "zend_constants.h"
! 37:
! 38:
! 39: #define YYERROR_VERBOSE
! 40: #define YYSTYPE znode
! 41: #ifdef ZTS
! 42: # define YYPARSE_PARAM tsrm_ls
! 43: # define YYLEX_PARAM tsrm_ls
! 44: #endif
! 45:
! 46:
! 47: %}
! 48:
! 49: %pure_parser
! 50: %expect 2
! 51:
! 52: %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
! 53: %left ','
! 54: %left T_LOGICAL_OR
! 55: %left T_LOGICAL_XOR
! 56: %left T_LOGICAL_AND
! 57: %right T_PRINT
! 58: %left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL
! 59: %left '?' ':'
! 60: %left T_BOOLEAN_OR
! 61: %left T_BOOLEAN_AND
! 62: %left '|'
! 63: %left '^'
! 64: %left '&'
! 65: %nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL
! 66: %nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
! 67: %left T_SL T_SR
! 68: %left '+' '-' '.'
! 69: %left '*' '/' '%'
! 70: %right '!'
! 71: %nonassoc T_INSTANCEOF
! 72: %right '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
! 73: %right '['
! 74: %nonassoc T_NEW T_CLONE
! 75: %token T_EXIT
! 76: %token T_IF
! 77: %left T_ELSEIF
! 78: %left T_ELSE
! 79: %left T_ENDIF
! 80: %token T_LNUMBER
! 81: %token T_DNUMBER
! 82: %token T_STRING
! 83: %token T_STRING_VARNAME
! 84: %token T_VARIABLE
! 85: %token T_NUM_STRING
! 86: %token T_INLINE_HTML
! 87: %token T_CHARACTER
! 88: %token T_BAD_CHARACTER
! 89: %token T_ENCAPSED_AND_WHITESPACE
! 90: %token T_CONSTANT_ENCAPSED_STRING
! 91: %token T_ECHO
! 92: %token T_DO
! 93: %token T_WHILE
! 94: %token T_ENDWHILE
! 95: %token T_FOR
! 96: %token T_ENDFOR
! 97: %token T_FOREACH
! 98: %token T_ENDFOREACH
! 99: %token T_DECLARE
! 100: %token T_ENDDECLARE
! 101: %token T_AS
! 102: %token T_SWITCH
! 103: %token T_ENDSWITCH
! 104: %token T_CASE
! 105: %token T_DEFAULT
! 106: %token T_BREAK
! 107: %token T_CONTINUE
! 108: %token T_GOTO
! 109: %token T_FUNCTION
! 110: %token T_CONST
! 111: %token T_RETURN
! 112: %token T_TRY
! 113: %token T_CATCH
! 114: %token T_THROW
! 115: %token T_USE
! 116: %token T_GLOBAL
! 117: %right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC
! 118: %token T_VAR
! 119: %token T_UNSET
! 120: %token T_ISSET
! 121: %token T_EMPTY
! 122: %token T_HALT_COMPILER
! 123: %token T_CLASS
! 124: %token T_INTERFACE
! 125: %token T_EXTENDS
! 126: %token T_IMPLEMENTS
! 127: %token T_OBJECT_OPERATOR
! 128: %token T_DOUBLE_ARROW
! 129: %token T_LIST
! 130: %token T_ARRAY
! 131: %token T_CLASS_C
! 132: %token T_METHOD_C
! 133: %token T_FUNC_C
! 134: %token T_LINE
! 135: %token T_FILE
! 136: %token T_COMMENT
! 137: %token T_DOC_COMMENT
! 138: %token T_OPEN_TAG
! 139: %token T_OPEN_TAG_WITH_ECHO
! 140: %token T_CLOSE_TAG
! 141: %token T_WHITESPACE
! 142: %token T_START_HEREDOC
! 143: %token T_END_HEREDOC
! 144: %token T_DOLLAR_OPEN_CURLY_BRACES
! 145: %token T_CURLY_OPEN
! 146: %token T_PAAMAYIM_NEKUDOTAYIM
! 147: %token T_NAMESPACE
! 148: %token T_NS_C
! 149: %token T_DIR
! 150: %token T_NS_SEPARATOR
! 151:
! 152: %% /* Rules */
! 153:
! 154: start:
! 155: top_statement_list { zend_do_end_compilation(TSRMLS_C); }
! 156: ;
! 157:
! 158: top_statement_list:
! 159: top_statement_list { zend_do_extended_info(TSRMLS_C); } top_statement { HANDLE_INTERACTIVE(); }
! 160: | /* empty */
! 161: ;
! 162:
! 163: namespace_name:
! 164: T_STRING { $$ = $1; }
! 165: | namespace_name T_NS_SEPARATOR T_STRING { zend_do_build_namespace_name(&$$, &$1, &$3 TSRMLS_CC); }
! 166: ;
! 167:
! 168: top_statement:
! 169: statement { zend_verify_namespace(TSRMLS_C); }
! 170: | function_declaration_statement { zend_verify_namespace(TSRMLS_C); zend_do_early_binding(TSRMLS_C); }
! 171: | class_declaration_statement { zend_verify_namespace(TSRMLS_C); zend_do_early_binding(TSRMLS_C); }
! 172: | T_HALT_COMPILER '(' ')' ';' { zend_do_halt_compiler_register(TSRMLS_C); YYACCEPT; }
! 173: | T_NAMESPACE namespace_name ';' { zend_do_begin_namespace(&$2, 0 TSRMLS_CC); }
! 174: | T_NAMESPACE namespace_name '{' { zend_do_begin_namespace(&$2, 1 TSRMLS_CC); }
! 175: top_statement_list '}' { zend_do_end_namespace(TSRMLS_C); }
! 176: | T_NAMESPACE '{' { zend_do_begin_namespace(NULL, 1 TSRMLS_CC); }
! 177: top_statement_list '}' { zend_do_end_namespace(TSRMLS_C); }
! 178: | T_USE use_declarations ';' { zend_verify_namespace(TSRMLS_C); }
! 179: | constant_declaration ';' { zend_verify_namespace(TSRMLS_C); }
! 180: ;
! 181:
! 182: use_declarations:
! 183: use_declarations ',' use_declaration
! 184: | use_declaration
! 185: ;
! 186:
! 187: use_declaration:
! 188: namespace_name { zend_do_use(&$1, NULL, 0 TSRMLS_CC); }
! 189: | namespace_name T_AS T_STRING { zend_do_use(&$1, &$3, 0 TSRMLS_CC); }
! 190: | T_NS_SEPARATOR namespace_name { zend_do_use(&$2, NULL, 1 TSRMLS_CC); }
! 191: | T_NS_SEPARATOR namespace_name T_AS T_STRING { zend_do_use(&$2, &$4, 1 TSRMLS_CC); }
! 192: ;
! 193:
! 194: constant_declaration:
! 195: constant_declaration ',' T_STRING '=' static_scalar { zend_do_declare_constant(&$3, &$5 TSRMLS_CC); }
! 196: | T_CONST T_STRING '=' static_scalar { zend_do_declare_constant(&$2, &$4 TSRMLS_CC); }
! 197: ;
! 198:
! 199: inner_statement_list:
! 200: inner_statement_list { zend_do_extended_info(TSRMLS_C); } inner_statement { HANDLE_INTERACTIVE(); }
! 201: | /* empty */
! 202: ;
! 203:
! 204:
! 205: inner_statement:
! 206: statement
! 207: | function_declaration_statement
! 208: | class_declaration_statement
! 209: | T_HALT_COMPILER '(' ')' ';' { zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); }
! 210: ;
! 211:
! 212:
! 213: statement:
! 214: unticked_statement { DO_TICKS(); }
! 215: | T_STRING ':' { zend_do_label(&$1 TSRMLS_CC); }
! 216: ;
! 217:
! 218: unticked_statement:
! 219: '{' inner_statement_list '}'
! 220: | T_IF '(' expr ')' { zend_do_if_cond(&$3, &$4 TSRMLS_CC); } statement { zend_do_if_after_statement(&$4, 1 TSRMLS_CC); } elseif_list else_single { zend_do_if_end(TSRMLS_C); }
! 221: | T_IF '(' expr ')' ':' { zend_do_if_cond(&$3, &$4 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$4, 1 TSRMLS_CC); } new_elseif_list new_else_single T_ENDIF ';' { zend_do_if_end(TSRMLS_C); }
! 222: | T_WHILE '(' { $1.u.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' { zend_do_while_cond(&$4, &$5 TSRMLS_CC); } while_statement { zend_do_while_end(&$1, &$5 TSRMLS_CC); }
! 223: | T_DO { $1.u.opline_num = get_next_op_number(CG(active_op_array)); zend_do_do_while_begin(TSRMLS_C); } statement T_WHILE '(' { $5.u.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' ';' { zend_do_do_while_end(&$1, &$5, &$7 TSRMLS_CC); }
! 224: | T_FOR
! 225: '('
! 226: for_expr
! 227: ';' { zend_do_free(&$3 TSRMLS_CC); $4.u.opline_num = get_next_op_number(CG(active_op_array)); }
! 228: for_expr
! 229: ';' { zend_do_extended_info(TSRMLS_C); zend_do_for_cond(&$6, &$7 TSRMLS_CC); }
! 230: for_expr
! 231: ')' { zend_do_free(&$9 TSRMLS_CC); zend_do_for_before_statement(&$4, &$7 TSRMLS_CC); }
! 232: for_statement { zend_do_for_end(&$7 TSRMLS_CC); }
! 233: | T_SWITCH '(' expr ')' { zend_do_switch_cond(&$3 TSRMLS_CC); } switch_case_list { zend_do_switch_end(&$6 TSRMLS_CC); }
! 234: | T_BREAK ';' { zend_do_brk_cont(ZEND_BRK, NULL TSRMLS_CC); }
! 235: | T_BREAK expr ';' { zend_do_brk_cont(ZEND_BRK, &$2 TSRMLS_CC); }
! 236: | T_CONTINUE ';' { zend_do_brk_cont(ZEND_CONT, NULL TSRMLS_CC); }
! 237: | T_CONTINUE expr ';' { zend_do_brk_cont(ZEND_CONT, &$2 TSRMLS_CC); }
! 238: | T_RETURN ';' { zend_do_return(NULL, 0 TSRMLS_CC); }
! 239: | T_RETURN expr_without_variable ';' { zend_do_return(&$2, 0 TSRMLS_CC); }
! 240: | T_RETURN variable ';' { zend_do_return(&$2, 1 TSRMLS_CC); }
! 241: | T_GLOBAL global_var_list ';'
! 242: | T_STATIC static_var_list ';'
! 243: | T_ECHO echo_expr_list ';'
! 244: | T_INLINE_HTML { zend_do_echo(&$1 TSRMLS_CC); }
! 245: | expr ';' { zend_do_free(&$1 TSRMLS_CC); }
! 246: | T_UNSET '(' unset_variables ')' ';'
! 247: | T_FOREACH '(' variable T_AS
! 248: { zend_do_foreach_begin(&$1, &$2, &$3, &$4, 1 TSRMLS_CC); }
! 249: foreach_variable foreach_optional_arg ')' { zend_do_foreach_cont(&$1, &$2, &$4, &$6, &$7 TSRMLS_CC); }
! 250: foreach_statement { zend_do_foreach_end(&$1, &$4 TSRMLS_CC); }
! 251: | T_FOREACH '(' expr_without_variable T_AS
! 252: { zend_do_foreach_begin(&$1, &$2, &$3, &$4, 0 TSRMLS_CC); }
! 253: variable foreach_optional_arg ')' { zend_check_writable_variable(&$6); zend_do_foreach_cont(&$1, &$2, &$4, &$6, &$7 TSRMLS_CC); }
! 254: foreach_statement { zend_do_foreach_end(&$1, &$4 TSRMLS_CC); }
! 255: | T_DECLARE { $1.u.opline_num = get_next_op_number(CG(active_op_array)); zend_do_declare_begin(TSRMLS_C); } '(' declare_list ')' declare_statement { zend_do_declare_end(&$1 TSRMLS_CC); }
! 256: | ';' /* empty statement */
! 257: | T_TRY { zend_do_try(&$1 TSRMLS_CC); } '{' inner_statement_list '}'
! 258: T_CATCH '(' { zend_initialize_try_catch_element(&$1 TSRMLS_CC); }
! 259: fully_qualified_class_name { zend_do_first_catch(&$7 TSRMLS_CC); }
! 260: T_VARIABLE ')' { zend_do_begin_catch(&$1, &$9, &$11, &$7 TSRMLS_CC); }
! 261: '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
! 262: additional_catches { zend_do_mark_last_catch(&$7, &$18 TSRMLS_CC); }
! 263: | T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }
! 264: | T_GOTO T_STRING ';' { zend_do_goto(&$2 TSRMLS_CC); }
! 265: ;
! 266:
! 267:
! 268: additional_catches:
! 269: non_empty_additional_catches { $$ = $1; }
! 270: | /* empty */ { $$.u.opline_num = -1; }
! 271: ;
! 272:
! 273: non_empty_additional_catches:
! 274: additional_catch { $$ = $1; }
! 275: | non_empty_additional_catches additional_catch { $$ = $2; }
! 276: ;
! 277:
! 278:
! 279: additional_catch:
! 280: T_CATCH '(' fully_qualified_class_name { $$.u.opline_num = get_next_op_number(CG(active_op_array)); } T_VARIABLE ')' { zend_do_begin_catch(&$1, &$3, &$5, NULL TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
! 281: ;
! 282:
! 283:
! 284: unset_variables:
! 285: unset_variable
! 286: | unset_variables ',' unset_variable
! 287: ;
! 288:
! 289: unset_variable:
! 290: variable { zend_do_end_variable_parse(&$1, BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1 TSRMLS_CC); }
! 291: ;
! 292:
! 293: function_declaration_statement:
! 294: unticked_function_declaration_statement { DO_TICKS(); }
! 295: ;
! 296:
! 297: class_declaration_statement:
! 298: unticked_class_declaration_statement { DO_TICKS(); }
! 299: ;
! 300:
! 301:
! 302: is_reference:
! 303: /* empty */ { $$.op_type = ZEND_RETURN_VAL; }
! 304: | '&' { $$.op_type = ZEND_RETURN_REF; }
! 305: ;
! 306:
! 307:
! 308: unticked_function_declaration_statement:
! 309: function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); }
! 310: '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); }
! 311: ;
! 312:
! 313: unticked_class_declaration_statement:
! 314: class_entry_type T_STRING extends_from
! 315: { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); }
! 316: implements_list
! 317: '{'
! 318: class_statement_list
! 319: '}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
! 320: | interface_entry T_STRING
! 321: { zend_do_begin_class_declaration(&$1, &$2, NULL TSRMLS_CC); }
! 322: interface_extends_list
! 323: '{'
! 324: class_statement_list
! 325: '}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
! 326: ;
! 327:
! 328:
! 329: class_entry_type:
! 330: T_CLASS { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = 0; }
! 331: | T_ABSTRACT T_CLASS { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; }
! 332: | T_FINAL T_CLASS { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_FINAL_CLASS; }
! 333: ;
! 334:
! 335: extends_from:
! 336: /* empty */ { $$.op_type = IS_UNUSED; }
! 337: | T_EXTENDS fully_qualified_class_name { zend_do_fetch_class(&$$, &$2 TSRMLS_CC); }
! 338: ;
! 339:
! 340: interface_entry:
! 341: T_INTERFACE { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_INTERFACE; }
! 342: ;
! 343:
! 344: interface_extends_list:
! 345: /* empty */
! 346: | T_EXTENDS interface_list
! 347: ;
! 348:
! 349: implements_list:
! 350: /* empty */
! 351: | T_IMPLEMENTS interface_list
! 352: ;
! 353:
! 354: interface_list:
! 355: fully_qualified_class_name { zend_do_implements_interface(&$1 TSRMLS_CC); }
! 356: | interface_list ',' fully_qualified_class_name { zend_do_implements_interface(&$3 TSRMLS_CC); }
! 357: ;
! 358:
! 359: foreach_optional_arg:
! 360: /* empty */ { $$.op_type = IS_UNUSED; }
! 361: | T_DOUBLE_ARROW foreach_variable { $$ = $2; }
! 362: ;
! 363:
! 364:
! 365: foreach_variable:
! 366: variable { zend_check_writable_variable(&$1); $$ = $1; }
! 367: | '&' variable { zend_check_writable_variable(&$2); $$ = $2; $$.u.EA.type |= ZEND_PARSED_REFERENCE_VARIABLE; }
! 368: ;
! 369:
! 370: for_statement:
! 371: statement
! 372: | ':' inner_statement_list T_ENDFOR ';'
! 373: ;
! 374:
! 375:
! 376: foreach_statement:
! 377: statement
! 378: | ':' inner_statement_list T_ENDFOREACH ';'
! 379: ;
! 380:
! 381:
! 382: declare_statement:
! 383: statement
! 384: | ':' inner_statement_list T_ENDDECLARE ';'
! 385: ;
! 386:
! 387:
! 388: declare_list:
! 389: T_STRING '=' static_scalar { zend_do_declare_stmt(&$1, &$3 TSRMLS_CC); }
! 390: | declare_list ',' T_STRING '=' static_scalar { zend_do_declare_stmt(&$3, &$5 TSRMLS_CC); }
! 391: ;
! 392:
! 393:
! 394: switch_case_list:
! 395: '{' case_list '}' { $$ = $2; }
! 396: | '{' ';' case_list '}' { $$ = $3; }
! 397: | ':' case_list T_ENDSWITCH ';' { $$ = $2; }
! 398: | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; }
! 399: ;
! 400:
! 401:
! 402: case_list:
! 403: /* empty */ { $$.op_type = IS_UNUSED; }
! 404: | case_list T_CASE expr case_separator { zend_do_extended_info(TSRMLS_C); zend_do_case_before_statement(&$1, &$2, &$3 TSRMLS_CC); } inner_statement_list { zend_do_case_after_statement(&$$, &$2 TSRMLS_CC); $$.op_type = IS_CONST; }
! 405: | case_list T_DEFAULT case_separator { zend_do_extended_info(TSRMLS_C); zend_do_default_before_statement(&$1, &$2 TSRMLS_CC); } inner_statement_list { zend_do_case_after_statement(&$$, &$2 TSRMLS_CC); $$.op_type = IS_CONST; }
! 406: ;
! 407:
! 408:
! 409: case_separator:
! 410: ':'
! 411: | ';'
! 412: ;
! 413:
! 414:
! 415: while_statement:
! 416: statement
! 417: | ':' inner_statement_list T_ENDWHILE ';'
! 418: ;
! 419:
! 420:
! 421:
! 422: elseif_list:
! 423: /* empty */
! 424: | elseif_list T_ELSEIF '(' expr ')' { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } statement { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); }
! 425: ;
! 426:
! 427:
! 428: new_elseif_list:
! 429: /* empty */
! 430: | new_elseif_list T_ELSEIF '(' expr ')' ':' { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); }
! 431: ;
! 432:
! 433:
! 434: else_single:
! 435: /* empty */
! 436: | T_ELSE statement
! 437: ;
! 438:
! 439:
! 440: new_else_single:
! 441: /* empty */
! 442: | T_ELSE ':' inner_statement_list
! 443: ;
! 444:
! 445:
! 446: parameter_list:
! 447: non_empty_parameter_list
! 448: | /* empty */
! 449: ;
! 450:
! 451:
! 452: non_empty_parameter_list:
! 453: optional_class_type T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 TSRMLS_CC); $$.op_type = IS_CONST; Z_LVAL($$.u.constant)=1; Z_TYPE($$.u.constant)=IS_LONG; INIT_PZVAL(&$$.u.constant); zend_do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, &$1, &$2, 0 TSRMLS_CC); }
! 454: | optional_class_type '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$3, 0 TSRMLS_CC); $$.op_type = IS_CONST; Z_LVAL($$.u.constant)=1; Z_TYPE($$.u.constant)=IS_LONG; INIT_PZVAL(&$$.u.constant); zend_do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, &$1, &$3, 1 TSRMLS_CC); }
! 455: | optional_class_type '&' T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$3, 0 TSRMLS_CC); $$.op_type = IS_CONST; Z_LVAL($$.u.constant)=1; Z_TYPE($$.u.constant)=IS_LONG; INIT_PZVAL(&$$.u.constant); zend_do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$5, &$1, &$3, 1 TSRMLS_CC); }
! 456: | optional_class_type T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$2, 0 TSRMLS_CC); $$.op_type = IS_CONST; Z_LVAL($$.u.constant)=1; Z_TYPE($$.u.constant)=IS_LONG; INIT_PZVAL(&$$.u.constant); zend_do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$4, &$1, &$2, 0 TSRMLS_CC); }
! 457: | non_empty_parameter_list ',' optional_class_type T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 TSRMLS_CC); $$=$1; Z_LVAL($$.u.constant)++; zend_do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, &$3, &$4, 0 TSRMLS_CC); }
! 458: | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$5, 0 TSRMLS_CC); $$=$1; Z_LVAL($$.u.constant)++; zend_do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, &$3, &$5, 1 TSRMLS_CC); }
! 459: | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$5, 0 TSRMLS_CC); $$=$1; Z_LVAL($$.u.constant)++; zend_do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$7, &$3, &$5, 1 TSRMLS_CC); }
! 460: | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$4, 0 TSRMLS_CC); $$=$1; Z_LVAL($$.u.constant)++; zend_do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$6, &$3, &$4, 0 TSRMLS_CC); }
! 461: ;
! 462:
! 463:
! 464: optional_class_type:
! 465: /* empty */ { $$.op_type = IS_UNUSED; }
! 466: | fully_qualified_class_name { $$ = $1; }
! 467: | T_ARRAY { $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_NULL;}
! 468: ;
! 469:
! 470:
! 471: function_call_parameter_list:
! 472: non_empty_function_call_parameter_list { $$ = $1; }
! 473: | /* empty */ { Z_LVAL($$.u.constant) = 0; }
! 474: ;
! 475:
! 476:
! 477: non_empty_function_call_parameter_list:
! 478: expr_without_variable { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$1, ZEND_SEND_VAL, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 479: | variable { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$1, ZEND_SEND_VAR, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 480: | '&' w_variable { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$2, ZEND_SEND_REF, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 481: | non_empty_function_call_parameter_list ',' expr_without_variable { Z_LVAL($$.u.constant)=Z_LVAL($1.u.constant)+1; zend_do_pass_param(&$3, ZEND_SEND_VAL, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 482: | non_empty_function_call_parameter_list ',' variable { Z_LVAL($$.u.constant)=Z_LVAL($1.u.constant)+1; zend_do_pass_param(&$3, ZEND_SEND_VAR, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 483: | non_empty_function_call_parameter_list ',' '&' w_variable { Z_LVAL($$.u.constant)=Z_LVAL($1.u.constant)+1; zend_do_pass_param(&$4, ZEND_SEND_REF, Z_LVAL($$.u.constant) TSRMLS_CC); }
! 484: ;
! 485:
! 486: global_var_list:
! 487: global_var_list ',' global_var { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); }
! 488: | global_var { zend_do_fetch_global_variable(&$1, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); }
! 489: ;
! 490:
! 491:
! 492: global_var:
! 493: T_VARIABLE { $$ = $1; }
! 494: | '$' r_variable { $$ = $2; }
! 495: | '$' '{' expr '}' { $$ = $3; }
! 496: ;
! 497:
! 498:
! 499: static_var_list:
! 500: static_var_list ',' T_VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); }
! 501: | static_var_list ',' T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC); }
! 502: | T_VARIABLE { zend_do_fetch_static_variable(&$1, NULL, ZEND_FETCH_STATIC TSRMLS_CC); }
! 503: | T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$1, &$3, ZEND_FETCH_STATIC TSRMLS_CC); }
! 504:
! 505: ;
! 506:
! 507:
! 508: class_statement_list:
! 509: class_statement_list class_statement
! 510: | /* empty */
! 511: ;
! 512:
! 513:
! 514: class_statement:
! 515: variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } class_variable_declaration ';'
! 516: | class_constant_declaration ';'
! 517: | method_modifiers function is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); } '('
! 518: parameter_list ')' method_body { zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); }
! 519: ;
! 520:
! 521:
! 522: method_body:
! 523: ';' /* abstract method */ { Z_LVAL($$.u.constant) = ZEND_ACC_ABSTRACT; }
! 524: | '{' inner_statement_list '}' { Z_LVAL($$.u.constant) = 0; }
! 525: ;
! 526:
! 527: variable_modifiers:
! 528: non_empty_member_modifiers { $$ = $1; }
! 529: | T_VAR { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; }
! 530: ;
! 531:
! 532: method_modifiers:
! 533: /* empty */ { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; }
! 534: | non_empty_member_modifiers { $$ = $1; if (!(Z_LVAL($$.u.constant) & ZEND_ACC_PPP_MASK)) { Z_LVAL($$.u.constant) |= ZEND_ACC_PUBLIC; } }
! 535: ;
! 536:
! 537: non_empty_member_modifiers:
! 538: member_modifier { $$ = $1; }
! 539: | non_empty_member_modifiers member_modifier { Z_LVAL($$.u.constant) = zend_do_verify_access_types(&$1, &$2); }
! 540: ;
! 541:
! 542: member_modifier:
! 543: T_PUBLIC { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; }
! 544: | T_PROTECTED { Z_LVAL($$.u.constant) = ZEND_ACC_PROTECTED; }
! 545: | T_PRIVATE { Z_LVAL($$.u.constant) = ZEND_ACC_PRIVATE; }
! 546: | T_STATIC { Z_LVAL($$.u.constant) = ZEND_ACC_STATIC; }
! 547: | T_ABSTRACT { Z_LVAL($$.u.constant) = ZEND_ACC_ABSTRACT; }
! 548: | T_FINAL { Z_LVAL($$.u.constant) = ZEND_ACC_FINAL; }
! 549: ;
! 550:
! 551: class_variable_declaration:
! 552: class_variable_declaration ',' T_VARIABLE { zend_do_declare_property(&$3, NULL, CG(access_type) TSRMLS_CC); }
! 553: | class_variable_declaration ',' T_VARIABLE '=' static_scalar { zend_do_declare_property(&$3, &$5, CG(access_type) TSRMLS_CC); }
! 554: | T_VARIABLE { zend_do_declare_property(&$1, NULL, CG(access_type) TSRMLS_CC); }
! 555: | T_VARIABLE '=' static_scalar { zend_do_declare_property(&$1, &$3, CG(access_type) TSRMLS_CC); }
! 556: ;
! 557:
! 558: class_constant_declaration:
! 559: class_constant_declaration ',' T_STRING '=' static_scalar { zend_do_declare_class_constant(&$3, &$5 TSRMLS_CC); }
! 560: | T_CONST T_STRING '=' static_scalar { zend_do_declare_class_constant(&$2, &$4 TSRMLS_CC); }
! 561: ;
! 562:
! 563: echo_expr_list:
! 564: echo_expr_list ',' expr { zend_do_echo(&$3 TSRMLS_CC); }
! 565: | expr { zend_do_echo(&$1 TSRMLS_CC); }
! 566: ;
! 567:
! 568:
! 569: for_expr:
! 570: /* empty */ { $$.op_type = IS_CONST; Z_TYPE($$.u.constant) = IS_BOOL; Z_LVAL($$.u.constant) = 1; }
! 571: | non_empty_for_expr { $$ = $1; }
! 572: ;
! 573:
! 574: non_empty_for_expr:
! 575: non_empty_for_expr ',' { zend_do_free(&$1 TSRMLS_CC); } expr { $$ = $4; }
! 576: | expr { $$ = $1; }
! 577: ;
! 578:
! 579: expr_without_variable:
! 580: T_LIST '(' { zend_do_list_init(TSRMLS_C); } assignment_list ')' '=' expr { zend_do_list_end(&$$, &$7 TSRMLS_CC); }
! 581: | variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign(&$$, &$1, &$3 TSRMLS_CC); }
! 582: | variable '=' '&' variable { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$4, BP_VAR_W, 1 TSRMLS_CC); zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); zend_do_assign_ref(&$$, &$1, &$4 TSRMLS_CC); }
! 583: | variable '=' '&' T_NEW class_name_reference { zend_error(E_DEPRECATED, "Assigning the return value of new by reference is deprecated"); zend_check_writable_variable(&$1); zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$4, &$5 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$3, &$4, &$7 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); $3.u.EA.type = ZEND_PARSED_NEW; zend_do_assign_ref(&$$, &$1, &$3 TSRMLS_CC); }
! 584: | T_NEW class_name_reference { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_new_object(&$1, &$2 TSRMLS_CC); } ctor_arguments { zend_do_end_new_object(&$$, &$1, &$4 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 585: | T_CLONE expr { zend_do_clone(&$$, &$2 TSRMLS_CC); }
! 586: | variable T_PLUS_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 TSRMLS_CC); }
! 587: | variable T_MINUS_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 TSRMLS_CC); }
! 588: | variable T_MUL_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 TSRMLS_CC); }
! 589: | variable T_DIV_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_DIV, &$$, &$1, &$3 TSRMLS_CC); }
! 590: | variable T_CONCAT_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_CONCAT, &$$, &$1, &$3 TSRMLS_CC); }
! 591: | variable T_MOD_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_MOD, &$$, &$1, &$3 TSRMLS_CC); }
! 592: | variable T_AND_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_AND, &$$, &$1, &$3 TSRMLS_CC); }
! 593: | variable T_OR_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_OR, &$$, &$1, &$3 TSRMLS_CC); }
! 594: | variable T_XOR_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &$$, &$1, &$3 TSRMLS_CC); }
! 595: | variable T_SL_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 TSRMLS_CC); }
! 596: | variable T_SR_EQUAL expr { zend_check_writable_variable(&$1); zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 TSRMLS_CC); }
! 597: | rw_variable T_INC { zend_do_post_incdec(&$$, &$1, ZEND_POST_INC TSRMLS_CC); }
! 598: | T_INC rw_variable { zend_do_pre_incdec(&$$, &$2, ZEND_PRE_INC TSRMLS_CC); }
! 599: | rw_variable T_DEC { zend_do_post_incdec(&$$, &$1, ZEND_POST_DEC TSRMLS_CC); }
! 600: | T_DEC rw_variable { zend_do_pre_incdec(&$$, &$2, ZEND_PRE_DEC TSRMLS_CC); }
! 601: | expr T_BOOLEAN_OR { zend_do_boolean_or_begin(&$1, &$2 TSRMLS_CC); } expr { zend_do_boolean_or_end(&$$, &$1, &$4, &$2 TSRMLS_CC); }
! 602: | expr T_BOOLEAN_AND { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr { zend_do_boolean_and_end(&$$, &$1, &$4, &$2 TSRMLS_CC); }
! 603: | expr T_LOGICAL_OR { zend_do_boolean_or_begin(&$1, &$2 TSRMLS_CC); } expr { zend_do_boolean_or_end(&$$, &$1, &$4, &$2 TSRMLS_CC); }
! 604: | expr T_LOGICAL_AND { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr { zend_do_boolean_and_end(&$$, &$1, &$4, &$2 TSRMLS_CC); }
! 605: | expr T_LOGICAL_XOR expr { zend_do_binary_op(ZEND_BOOL_XOR, &$$, &$1, &$3 TSRMLS_CC); }
! 606: | expr '|' expr { zend_do_binary_op(ZEND_BW_OR, &$$, &$1, &$3 TSRMLS_CC); }
! 607: | expr '&' expr { zend_do_binary_op(ZEND_BW_AND, &$$, &$1, &$3 TSRMLS_CC); }
! 608: | expr '^' expr { zend_do_binary_op(ZEND_BW_XOR, &$$, &$1, &$3 TSRMLS_CC); }
! 609: | expr '.' expr { zend_do_binary_op(ZEND_CONCAT, &$$, &$1, &$3 TSRMLS_CC); }
! 610: | expr '+' expr { zend_do_binary_op(ZEND_ADD, &$$, &$1, &$3 TSRMLS_CC); }
! 611: | expr '-' expr { zend_do_binary_op(ZEND_SUB, &$$, &$1, &$3 TSRMLS_CC); }
! 612: | expr '*' expr { zend_do_binary_op(ZEND_MUL, &$$, &$1, &$3 TSRMLS_CC); }
! 613: | expr '/' expr { zend_do_binary_op(ZEND_DIV, &$$, &$1, &$3 TSRMLS_CC); }
! 614: | expr '%' expr { zend_do_binary_op(ZEND_MOD, &$$, &$1, &$3 TSRMLS_CC); }
! 615: | expr T_SL expr { zend_do_binary_op(ZEND_SL, &$$, &$1, &$3 TSRMLS_CC); }
! 616: | expr T_SR expr { zend_do_binary_op(ZEND_SR, &$$, &$1, &$3 TSRMLS_CC); }
! 617: | '+' expr %prec T_INC { ZVAL_LONG(&$1.u.constant, 0); if ($2.op_type == IS_CONST) { add_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; } else { $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); zend_do_binary_op(ZEND_ADD, &$$, &$1, &$2 TSRMLS_CC); } }
! 618: | '-' expr %prec T_INC { ZVAL_LONG(&$1.u.constant, 0); if ($2.op_type == IS_CONST) { sub_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; } else { $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); zend_do_binary_op(ZEND_SUB, &$$, &$1, &$2 TSRMLS_CC); } }
! 619: | '!' expr { zend_do_unary_op(ZEND_BOOL_NOT, &$$, &$2 TSRMLS_CC); }
! 620: | '~' expr { zend_do_unary_op(ZEND_BW_NOT, &$$, &$2 TSRMLS_CC); }
! 621: | expr T_IS_IDENTICAL expr { zend_do_binary_op(ZEND_IS_IDENTICAL, &$$, &$1, &$3 TSRMLS_CC); }
! 622: | expr T_IS_NOT_IDENTICAL expr { zend_do_binary_op(ZEND_IS_NOT_IDENTICAL, &$$, &$1, &$3 TSRMLS_CC); }
! 623: | expr T_IS_EQUAL expr { zend_do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
! 624: | expr T_IS_NOT_EQUAL expr { zend_do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
! 625: | expr '<' expr { zend_do_binary_op(ZEND_IS_SMALLER, &$$, &$1, &$3 TSRMLS_CC); }
! 626: | expr T_IS_SMALLER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
! 627: | expr '>' expr { zend_do_binary_op(ZEND_IS_SMALLER, &$$, &$3, &$1 TSRMLS_CC); }
! 628: | expr T_IS_GREATER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 TSRMLS_CC); }
! 629: | expr T_INSTANCEOF class_name_reference { zend_do_instanceof(&$$, &$1, &$3, 0 TSRMLS_CC); }
! 630: | '(' expr ')' { $$ = $2; }
! 631: | expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
! 632: expr ':' { zend_do_qm_true(&$4, &$2, &$5 TSRMLS_CC); }
! 633: expr { zend_do_qm_false(&$$, &$7, &$2, &$5 TSRMLS_CC); }
! 634: | expr '?' ':' { zend_do_jmp_set(&$1, &$2, &$3 TSRMLS_CC); }
! 635: expr { zend_do_jmp_set_else(&$$, &$5, &$2, &$3 TSRMLS_CC); }
! 636: | internal_functions_in_yacc { $$ = $1; }
! 637: | T_INT_CAST expr { zend_do_cast(&$$, &$2, IS_LONG TSRMLS_CC); }
! 638: | T_DOUBLE_CAST expr { zend_do_cast(&$$, &$2, IS_DOUBLE TSRMLS_CC); }
! 639: | T_STRING_CAST expr { zend_do_cast(&$$, &$2, IS_STRING TSRMLS_CC); }
! 640: | T_ARRAY_CAST expr { zend_do_cast(&$$, &$2, IS_ARRAY TSRMLS_CC); }
! 641: | T_OBJECT_CAST expr { zend_do_cast(&$$, &$2, IS_OBJECT TSRMLS_CC); }
! 642: | T_BOOL_CAST expr { zend_do_cast(&$$, &$2, IS_BOOL TSRMLS_CC); }
! 643: | T_UNSET_CAST expr { zend_do_cast(&$$, &$2, IS_NULL TSRMLS_CC); }
! 644: | T_EXIT exit_expr { zend_do_exit(&$$, &$2 TSRMLS_CC); }
! 645: | '@' { zend_do_begin_silence(&$1 TSRMLS_CC); } expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; }
! 646: | scalar { $$ = $1; }
! 647: | T_ARRAY '(' array_pair_list ')' { $$ = $3; }
! 648: | '`' backticks_expr '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); }
! 649: | T_PRINT expr { zend_do_print(&$$, &$2 TSRMLS_CC); }
! 650: | function is_reference '(' { zend_do_begin_lambda_function_declaration(&$$, &$1, $2.op_type TSRMLS_CC); }
! 651: parameter_list ')' lexical_vars '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); $$ = $4; }
! 652: ;
! 653:
! 654: function:
! 655: T_FUNCTION { $$.u.opline_num = CG(zend_lineno); }
! 656: ;
! 657:
! 658: lexical_vars:
! 659: /* empty */
! 660: | T_USE '(' lexical_var_list ')'
! 661: ;
! 662:
! 663: lexical_var_list:
! 664: lexical_var_list ',' T_VARIABLE { zend_do_fetch_lexical_variable(&$3, 0 TSRMLS_CC); }
! 665: | lexical_var_list ',' '&' T_VARIABLE { zend_do_fetch_lexical_variable(&$4, 1 TSRMLS_CC); }
! 666: | T_VARIABLE { zend_do_fetch_lexical_variable(&$1, 0 TSRMLS_CC); }
! 667: | '&' T_VARIABLE { zend_do_fetch_lexical_variable(&$2, 1 TSRMLS_CC); }
! 668: ;
! 669:
! 670: function_call:
! 671: namespace_name '(' { $2.u.opline_num = zend_do_begin_function_call(&$1, 1 TSRMLS_CC); }
! 672: function_call_parameter_list
! 673: ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, $2.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
! 674: | T_NAMESPACE T_NS_SEPARATOR namespace_name '(' { $1.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$1.u.constant); zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC); $4.u.opline_num = zend_do_begin_function_call(&$1, 0 TSRMLS_CC); }
! 675: function_call_parameter_list
! 676: ')' { zend_do_end_function_call(&$1, &$$, &$6, 0, $4.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
! 677: | T_NS_SEPARATOR namespace_name '(' { $3.u.opline_num = zend_do_begin_function_call(&$2, 0 TSRMLS_CC); }
! 678: function_call_parameter_list
! 679: ')' { zend_do_end_function_call(&$2, &$$, &$5, 0, $3.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
! 680: | class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { $4.u.opline_num = zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
! 681: function_call_parameter_list
! 682: ')' { zend_do_end_function_call($4.u.opline_num?NULL:&$3, &$$, &$6, $4.u.opline_num, $4.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 683: | class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
! 684: function_call_parameter_list
! 685: ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 686: | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
! 687: function_call_parameter_list
! 688: ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 689: | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects '(' { zend_do_end_variable_parse(&$3, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_class_member_function_call(&$1, &$3 TSRMLS_CC); }
! 690: function_call_parameter_list
! 691: ')' { zend_do_end_function_call(NULL, &$$, &$6, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 692: | variable_without_objects '(' { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&$1, 0 TSRMLS_CC); }
! 693: function_call_parameter_list ')'
! 694: { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
! 695: ;
! 696:
! 697: class_name:
! 698: T_STATIC { $$.op_type = IS_CONST; ZVAL_STRINGL(&$$.u.constant, "static", sizeof("static")-1, 1);}
! 699: | namespace_name { $$ = $1; }
! 700: | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); }
! 701: | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); $$ = $2; }
! 702: ;
! 703:
! 704: fully_qualified_class_name:
! 705: namespace_name { $$ = $1; }
! 706: | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); }
! 707: | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); $$ = $2; }
! 708: ;
! 709:
! 710:
! 711:
! 712: class_name_reference:
! 713: class_name { zend_do_fetch_class(&$$, &$1 TSRMLS_CC); }
! 714: | dynamic_class_name_reference { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_fetch_class(&$$, &$1 TSRMLS_CC); }
! 715: ;
! 716:
! 717:
! 718: dynamic_class_name_reference:
! 719: base_variable T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); }
! 720: object_property { zend_do_push_object(&$4 TSRMLS_CC); zend_do_declare_implicit_property(TSRMLS_C); } dynamic_class_name_variable_properties
! 721: { zend_do_pop_object(&$$ TSRMLS_CC); $$.u.EA.type = ZEND_PARSED_MEMBER; }
! 722: | base_variable { $$ = $1; }
! 723: ;
! 724:
! 725:
! 726: dynamic_class_name_variable_properties:
! 727: dynamic_class_name_variable_properties dynamic_class_name_variable_property
! 728: | /* empty */
! 729: ;
! 730:
! 731:
! 732: dynamic_class_name_variable_property:
! 733: T_OBJECT_OPERATOR object_property { zend_do_push_object(&$2 TSRMLS_CC); zend_do_declare_implicit_property(TSRMLS_C); }
! 734: ;
! 735:
! 736: exit_expr:
! 737: /* empty */ { memset(&$$, 0, sizeof(znode)); $$.op_type = IS_UNUSED; }
! 738: | '(' ')' { memset(&$$, 0, sizeof(znode)); $$.op_type = IS_UNUSED; }
! 739: | '(' expr ')' { $$ = $2; }
! 740: ;
! 741:
! 742: backticks_expr:
! 743: /* empty */ { ZVAL_EMPTY_STRING(&$$.u.constant); INIT_PZVAL(&$$.u.constant); $$.op_type = IS_CONST; }
! 744: | T_ENCAPSED_AND_WHITESPACE { $$ = $1; }
! 745: | encaps_list { $$ = $1; }
! 746: ;
! 747:
! 748:
! 749: ctor_arguments:
! 750: /* empty */ { Z_LVAL($$.u.constant)=0; }
! 751: | '(' function_call_parameter_list ')' { $$ = $2; }
! 752: ;
! 753:
! 754:
! 755: common_scalar:
! 756: T_LNUMBER { $$ = $1; }
! 757: | T_DNUMBER { $$ = $1; }
! 758: | T_CONSTANT_ENCAPSED_STRING { $$ = $1; }
! 759: | T_LINE { $$ = $1; }
! 760: | T_FILE { $$ = $1; }
! 761: | T_DIR { $$ = $1; }
! 762: | T_CLASS_C { $$ = $1; }
! 763: | T_METHOD_C { $$ = $1; }
! 764: | T_FUNC_C { $$ = $1; }
! 765: | T_NS_C { $$ = $1; }
! 766: | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $2; CG(heredoc) = Z_STRVAL($1.u.constant); CG(heredoc_len) = Z_STRLEN($1.u.constant); }
! 767: | T_START_HEREDOC T_END_HEREDOC { ZVAL_EMPTY_STRING(&$$.u.constant); INIT_PZVAL(&$$.u.constant); $$.op_type = IS_CONST; CG(heredoc) = Z_STRVAL($1.u.constant); CG(heredoc_len) = Z_STRLEN($1.u.constant); }
! 768: ;
! 769:
! 770:
! 771: static_scalar: /* compile-time evaluated scalars */
! 772: common_scalar { $$ = $1; }
! 773: | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); }
! 774: | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); }
! 775: | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); }
! 776: | '+' static_scalar { ZVAL_LONG(&$1.u.constant, 0); add_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; }
! 777: | '-' static_scalar { ZVAL_LONG(&$1.u.constant, 0); sub_function(&$2.u.constant, &$1.u.constant, &$2.u.constant TSRMLS_CC); $$ = $2; }
! 778: | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; Z_TYPE($$.u.constant) = IS_CONSTANT_ARRAY; }
! 779: | static_class_constant { $$ = $1; }
! 780: ;
! 781:
! 782: static_class_constant:
! 783: class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_CT, 0 TSRMLS_CC); }
! 784: ;
! 785:
! 786: scalar:
! 787: T_STRING_VARNAME { $$ = $1; }
! 788: | class_constant { $$ = $1; }
! 789: | namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1 TSRMLS_CC); }
! 790: | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_RT, 0 TSRMLS_CC); }
! 791: | T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_RT, 0 TSRMLS_CC); }
! 792: | common_scalar { $$ = $1; }
! 793: | '"' encaps_list '"' { $$ = $2; }
! 794: | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; CG(heredoc) = Z_STRVAL($1.u.constant); CG(heredoc_len) = Z_STRLEN($1.u.constant); }
! 795: ;
! 796:
! 797:
! 798: static_array_pair_list:
! 799: /* empty */ { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); }
! 800: | non_empty_static_array_pair_list possible_comma { $$ = $1; }
! 801: ;
! 802:
! 803: possible_comma:
! 804: /* empty */
! 805: | ','
! 806: ;
! 807:
! 808: non_empty_static_array_pair_list:
! 809: non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW static_scalar { zend_do_add_static_array_element(&$$, &$3, &$5); }
! 810: | non_empty_static_array_pair_list ',' static_scalar { zend_do_add_static_array_element(&$$, NULL, &$3); }
! 811: | static_scalar T_DOUBLE_ARROW static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); zend_do_add_static_array_element(&$$, &$1, &$3); }
! 812: | static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); zend_do_add_static_array_element(&$$, NULL, &$1); }
! 813: ;
! 814:
! 815: expr:
! 816: r_variable { $$ = $1; }
! 817: | expr_without_variable { $$ = $1; }
! 818: ;
! 819:
! 820:
! 821: r_variable:
! 822: variable { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); $$ = $1; }
! 823: ;
! 824:
! 825:
! 826: w_variable:
! 827: variable { zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); $$ = $1;
! 828: zend_check_writable_variable(&$1); }
! 829: ;
! 830:
! 831: rw_variable:
! 832: variable { zend_do_end_variable_parse(&$1, BP_VAR_RW, 0 TSRMLS_CC); $$ = $1;
! 833: zend_check_writable_variable(&$1); }
! 834: ;
! 835:
! 836: variable:
! 837: base_variable_with_function_calls T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); }
! 838: object_property { zend_do_push_object(&$4 TSRMLS_CC); } method_or_not variable_properties
! 839: { zend_do_pop_object(&$$ TSRMLS_CC); $$.u.EA.type = $1.u.EA.type | ($7.u.EA.type ? $7.u.EA.type : $6.u.EA.type); }
! 840: | base_variable_with_function_calls { $$ = $1; }
! 841: ;
! 842:
! 843: variable_properties:
! 844: variable_properties variable_property { $$.u.EA.type = $2.u.EA.type; }
! 845: | /* empty */ { $$.u.EA.type = 0; }
! 846: ;
! 847:
! 848:
! 849: variable_property:
! 850: T_OBJECT_OPERATOR object_property { zend_do_push_object(&$2 TSRMLS_CC); } method_or_not { $$.u.EA.type = $4.u.EA.type; }
! 851: ;
! 852:
! 853: method_or_not:
! 854: '(' { zend_do_pop_object(&$1 TSRMLS_CC); zend_do_begin_method_call(&$1 TSRMLS_CC); }
! 855: function_call_parameter_list ')'
! 856: { zend_do_end_function_call(&$1, &$$, &$3, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);
! 857: zend_do_push_object(&$$ TSRMLS_CC); $$.u.EA.type = ZEND_PARSED_METHOD_CALL; }
! 858: | /* empty */ { zend_do_declare_implicit_property(TSRMLS_C); $$.u.EA.type = ZEND_PARSED_MEMBER; }
! 859: ;
! 860:
! 861: variable_without_objects:
! 862: reference_variable { $$ = $1; }
! 863: | simple_indirect_reference reference_variable { zend_do_indirect_references(&$$, &$1, &$2 TSRMLS_CC); }
! 864: ;
! 865:
! 866: static_member:
! 867: class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); }
! 868: | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_static_member(&$$, &$1 TSRMLS_CC); }
! 869:
! 870: ;
! 871:
! 872: variable_class_name:
! 873: reference_variable { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); $$=$1;; }
! 874: ;
! 875:
! 876: base_variable_with_function_calls:
! 877: base_variable { $$ = $1; }
! 878: | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.u.EA.type = ZEND_PARSED_FUNCTION_CALL; }
! 879: ;
! 880:
! 881:
! 882: base_variable:
! 883: reference_variable { $$ = $1; $$.u.EA.type = ZEND_PARSED_VARIABLE; }
! 884: | simple_indirect_reference reference_variable { zend_do_indirect_references(&$$, &$1, &$2 TSRMLS_CC); $$.u.EA.type = ZEND_PARSED_VARIABLE; }
! 885: | static_member { $$ = $1; $$.u.EA.type = ZEND_PARSED_STATIC_MEMBER; }
! 886: ;
! 887:
! 888: reference_variable:
! 889: reference_variable '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
! 890: | reference_variable '{' expr '}' { fetch_string_offset(&$$, &$1, &$3 TSRMLS_CC); }
! 891: | compound_variable { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&$$, &$1, 1 TSRMLS_CC); }
! 892: ;
! 893:
! 894:
! 895: compound_variable:
! 896: T_VARIABLE { $$ = $1; }
! 897: | '$' '{' expr '}' { $$ = $3; }
! 898: ;
! 899:
! 900: dim_offset:
! 901: /* empty */ { $$.op_type = IS_UNUSED; }
! 902: | expr { $$ = $1; }
! 903: ;
! 904:
! 905:
! 906: object_property:
! 907: object_dim_list { $$ = $1; }
! 908: | variable_without_objects { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); } { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_fetch_property(&$$, &tmp_znode, &$1 TSRMLS_CC);}
! 909: ;
! 910:
! 911: object_dim_list:
! 912: object_dim_list '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); }
! 913: | object_dim_list '{' expr '}' { fetch_string_offset(&$$, &$1, &$3 TSRMLS_CC); }
! 914: | variable_name { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_fetch_property(&$$, &tmp_znode, &$1 TSRMLS_CC);}
! 915: ;
! 916:
! 917: variable_name:
! 918: T_STRING { $$ = $1; }
! 919: | '{' expr '}' { $$ = $2; }
! 920: ;
! 921:
! 922: simple_indirect_reference:
! 923: '$' { Z_LVAL($$.u.constant) = 1; }
! 924: | simple_indirect_reference '$' { Z_LVAL($$.u.constant)++; }
! 925: ;
! 926:
! 927: assignment_list:
! 928: assignment_list ',' assignment_list_element
! 929: | assignment_list_element
! 930: ;
! 931:
! 932:
! 933: assignment_list_element:
! 934: variable { zend_do_add_list_element(&$1 TSRMLS_CC); }
! 935: | T_LIST '(' { zend_do_new_list_begin(TSRMLS_C); } assignment_list ')' { zend_do_new_list_end(TSRMLS_C); }
! 936: | /* empty */ { zend_do_add_list_element(NULL TSRMLS_CC); }
! 937: ;
! 938:
! 939:
! 940: array_pair_list:
! 941: /* empty */ { zend_do_init_array(&$$, NULL, NULL, 0 TSRMLS_CC); }
! 942: | non_empty_array_pair_list possible_comma { $$ = $1; }
! 943: ;
! 944:
! 945: non_empty_array_pair_list:
! 946: non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr { zend_do_add_array_element(&$$, &$5, &$3, 0 TSRMLS_CC); }
! 947: | non_empty_array_pair_list ',' expr { zend_do_add_array_element(&$$, &$3, NULL, 0 TSRMLS_CC); }
! 948: | expr T_DOUBLE_ARROW expr { zend_do_init_array(&$$, &$3, &$1, 0 TSRMLS_CC); }
! 949: | expr { zend_do_init_array(&$$, &$1, NULL, 0 TSRMLS_CC); }
! 950: | non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable { zend_do_add_array_element(&$$, &$6, &$3, 1 TSRMLS_CC); }
! 951: | non_empty_array_pair_list ',' '&' w_variable { zend_do_add_array_element(&$$, &$4, NULL, 1 TSRMLS_CC); }
! 952: | expr T_DOUBLE_ARROW '&' w_variable { zend_do_init_array(&$$, &$4, &$1, 1 TSRMLS_CC); }
! 953: | '&' w_variable { zend_do_init_array(&$$, &$2, NULL, 1 TSRMLS_CC); }
! 954: ;
! 955:
! 956: encaps_list:
! 957: encaps_list encaps_var { zend_do_end_variable_parse(&$2, BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&$$, &$1, &$2 TSRMLS_CC); }
! 958: | encaps_list T_ENCAPSED_AND_WHITESPACE { zend_do_add_string(&$$, &$1, &$2 TSRMLS_CC); }
! 959: | encaps_var { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&$$, NULL, &$1 TSRMLS_CC); }
! 960: | T_ENCAPSED_AND_WHITESPACE encaps_var { zend_do_add_string(&$$, NULL, &$1 TSRMLS_CC); zend_do_end_variable_parse(&$2, BP_VAR_R, 0 TSRMLS_CC); zend_do_add_variable(&$$, &$$, &$2 TSRMLS_CC); }
! 961: ;
! 962:
! 963:
! 964:
! 965: encaps_var:
! 966: T_VARIABLE { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&$$, &$1, 1 TSRMLS_CC); }
! 967: | T_VARIABLE '[' { zend_do_begin_variable_parse(TSRMLS_C); } encaps_var_offset ']' { fetch_array_begin(&$$, &$1, &$4 TSRMLS_CC); }
! 968: | T_VARIABLE T_OBJECT_OPERATOR T_STRING { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&$2, &$1, 1 TSRMLS_CC); zend_do_fetch_property(&$$, &$2, &$3 TSRMLS_CC); }
! 969: | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { zend_do_begin_variable_parse(TSRMLS_C); fetch_simple_variable(&$$, &$2, 1 TSRMLS_CC); }
! 970: | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' { zend_do_begin_variable_parse(TSRMLS_C); fetch_array_begin(&$$, &$2, &$4 TSRMLS_CC); }
! 971: | T_CURLY_OPEN variable '}' { $$ = $2; }
! 972: ;
! 973:
! 974:
! 975: encaps_var_offset:
! 976: T_STRING { $$ = $1; }
! 977: | T_NUM_STRING { $$ = $1; }
! 978: | T_VARIABLE { fetch_simple_variable(&$$, &$1, 1 TSRMLS_CC); }
! 979: ;
! 980:
! 981:
! 982: internal_functions_in_yacc:
! 983: T_ISSET '(' isset_variables ')' { $$ = $3; }
! 984: | T_EMPTY '(' variable ')' { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
! 985: | T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
! 986: | T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
! 987: | T_EVAL '(' expr ')' { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
! 988: | T_REQUIRE expr { zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
! 989: | T_REQUIRE_ONCE expr { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
! 990: ;
! 991:
! 992: isset_variables:
! 993: variable { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); }
! 994: | isset_variables ',' { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } variable { znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &$4 TSRMLS_CC); zend_do_boolean_and_end(&$$, &$1, &tmp, &$2 TSRMLS_CC); }
! 995: ;
! 996:
! 997: class_constant:
! 998: class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); }
! 999: | variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); }
! 1000: ;
! 1001:
! 1002: %%
! 1003:
! 1004: /*
! 1005: * Local variables:
! 1006: * tab-width: 4
! 1007: * c-basic-offset: 4
! 1008: * indent-tabs-mode: t
! 1009: * End:
! 1010: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>