@@ -785,6 +785,22 @@ argument_list:
785785 | ' (' variadic_placeholder ' )' { init ($2 ); }
786786;
787787
788+ clone_argument_list:
789+ ' (' ' )' { $$ = array (); }
790+ | ' (' non_empty_clone_argument_list optional_comma ' )' { $$ = $2 ; }
791+ | ' (' expr ' ,' ' )' { init (Node\Arg[$2 , false , false ]); }
792+ | ' (' variadic_placeholder ' )' { init ($2 ); }
793+ ;
794+
795+ non_empty_clone_argument_list:
796+ expr ' ,' argument
797+ { init (new Node\Arg ($1 , false , false , stackAttributes (#1 )), $3 ); }
798+ | argument_no_expr
799+ { init ($1 ); }
800+ | non_empty_clone_argument_list ' ,' argument
801+ { push ($1 , $3 ); }
802+ ;
803+
788804variadic_placeholder:
789805 T_ELLIPSIS { $$ = Node\VariadicPlaceholder[]; }
790806;
@@ -794,14 +810,18 @@ non_empty_argument_list:
794810 | non_empty_argument_list ' ,' argument { push ($1 , $3 ); }
795811;
796812
797- argument:
798- expr { $$ = Node\Arg[$1 , false , false ]; }
799- | ampersand variable { $$ = Node\Arg[$2 , true , false ]; }
813+ argument_no_expr:
814+ ampersand variable { $$ = Node\Arg[$2 , true , false ]; }
800815 | T_ELLIPSIS expr { $$ = Node\Arg[$2 , false , true ]; }
801816 | identifier_maybe_reserved ' :' expr
802817 { $$ = new Node\Arg ($3 , false , false , attributes (), $1 ); }
803818;
804819
820+ argument:
821+ expr { $$ = Node\Arg[$1 , false , false ]; }
822+ | argument_no_expr { $$ = $1 ; }
823+ ;
824+
805825global_var_list:
806826 non_empty_global_var_list no_comma
807827;
@@ -1015,6 +1035,7 @@ expr:
10151035 }
10161036 | new_expr
10171037 | match
1038+ | T_CLONE clone_argument_list { $$ = Expr\FuncCall[new Node\Name ($1 , stackAttributes (#1 )), $2 ]; }
10181039 | T_CLONE expr { $$ = Expr\Clone_[$2 ]; }
10191040 | variable T_PLUS_EQUAL expr { $$ = Expr\AssignOp\Plus [$1 , $3 ]; }
10201041 | variable T_MINUS_EQUAL expr { $$ = Expr\AssignOp\Minus [$1 , $3 ]; }
0 commit comments