@@ -50,7 +50,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
50
50
%}
51
51
52
52
%pure_parser
53
- %expect 2
53
+ %expect 3
54
54
55
55
%token END 0 " end of file"
56
56
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
@@ -694,12 +694,37 @@ non_empty_for_expr:
694
694
| expr { $$ = $1 ; }
695
695
;
696
696
697
+ chaining_method_or_property :
698
+ chaining_method_or_property variable_property { $$ .EA = $2 .EA; }
699
+ | variable_property { $$ .EA = $1 .EA; }
700
+ ;
701
+
702
+ chaining_dereference :
703
+ chaining_dereference ' [' dim_offset ' ]' { fetch_array_dim(&$$ , &$1 , &$3 TSRMLS_CC); }
704
+ | ' [' dim_offset ' ]' { zend_do_pop_object(&$1 TSRMLS_CC); fetch_array_dim(&$$ , &$1 , &$2 TSRMLS_CC); }
705
+ ;
706
+
707
+ chaining_instance_call :
708
+ chaining_dereference { zend_do_push_object(&$1 TSRMLS_CC); } chaining_method_or_property { $$ = $3 ; }
709
+ | chaining_dereference { zend_do_push_object(&$1 TSRMLS_CC); $$ = $1 ; }
710
+ | chaining_method_or_property { $$ = $1 ; }
711
+ ;
712
+
713
+ instance_call :
714
+ /* empty */ { $$ = $0 ; }
715
+ | { zend_do_push_object(&$0 TSRMLS_CC); zend_do_begin_variable_parse(TSRMLS_C); }
716
+ chaining_instance_call { zend_do_pop_object(&$$ TSRMLS_CC); zend_do_end_variable_parse(&$2 , BP_VAR_R, 0 TSRMLS_CC); }
717
+ ;
718
+
719
+ new_expr :
720
+ 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);}
721
+ ;
722
+
697
723
expr_without_variable :
698
724
T_LIST ' (' { zend_do_list_init(TSRMLS_C); } assignment_list ' )' ' =' expr { zend_do_list_end(&$$ , &$7 TSRMLS_CC); }
699
725
| variable ' =' expr { zend_check_writable_variable(&$1 ); zend_do_assign(&$$ , &$1 , &$3 TSRMLS_CC); }
700
726
| 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); }
701
727
| 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 .EA = ZEND_PARSED_NEW; zend_do_assign_ref(&$$ , &$1 , &$3 TSRMLS_CC); }
702
- | 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);}
703
728
| T_CLONE expr { zend_do_clone(&$$ , &$2 TSRMLS_CC); }
704
729
| 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); }
705
730
| 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); }
@@ -746,6 +771,8 @@ expr_without_variable:
746
771
| expr T_IS_GREATER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$ , &$3 , &$1 TSRMLS_CC); }
747
772
| expr T_INSTANCEOF class_name_reference { zend_do_instanceof(&$$ , &$1 , &$3 , 0 TSRMLS_CC); }
748
773
| ' (' expr ' )' { $$ = $2 ; }
774
+ | new_expr { $$ = $1 ; }
775
+ | ' (' new_expr ' )' { $$ = $2 ; } instance_call { $$ = $5 ; }
749
776
| expr ' ?' { zend_do_begin_qm_op(&$1 , &$2 TSRMLS_CC); }
750
777
expr ' :' { zend_do_qm_true(&$4 , &$2 , &$5 TSRMLS_CC); }
751
778
expr { zend_do_qm_false(&$$ , &$7 , &$2 , &$5 TSRMLS_CC); }
0 commit comments