From: Nikita Popov Date: Sat, 31 May 2014 14:44:53 +0000 (+0200) Subject: Introduce dereferencable_scalar to simplify future additions X-Git-Tag: POST_AST_MERGE^2~216 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64f80b3835aba0d3ad2c17a78e2d6dcf1c0bfc5e;p=php Introduce dereferencable_scalar to simplify future additions --- diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 3257bfff86..014915f489 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -821,7 +821,6 @@ expr_without_variable: | T_EXIT exit_expr { zend_do_exit(&$$, &$2 TSRMLS_CC); } | '@' { zend_do_begin_silence(&$1 TSRMLS_CC); } expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; } | scalar { $$ = $1; } - | combined_scalar { $$ = $1; } | '`' backticks_expr '`' { zend_do_shell_exec(&$$, &$2 TSRMLS_CC); } | T_PRINT expr { zend_do_print(&$$, &$2 TSRMLS_CC); } | T_YIELD { zend_do_yield(&$$, NULL, NULL, 0 TSRMLS_CC); } @@ -840,11 +839,6 @@ yield_expr: | T_YIELD expr T_DOUBLE_ARROW variable { zend_do_yield(&$$, &$4, &$2, 1 TSRMLS_CC); } ; -combined_scalar: - T_ARRAY '(' array_pair_list ')' { $$ = $3; } - | '[' array_pair_list ']' { $$ = $2; } -; - function: T_FUNCTION { $$.u.op.opline_num = CG(zend_lineno); } ; @@ -924,10 +918,15 @@ ctor_arguments: ; +dereferencable_scalar: + T_ARRAY '(' array_pair_list ')' { $$ = $3; } + | '[' array_pair_list ']' { $$ = $2; } + | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } +; + common_scalar: T_LNUMBER { $$ = $1; } | T_DNUMBER { $$ = $1; } - | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } | T_LINE { $$ = $1; } | T_FILE { $$ = $1; } | T_DIR { $$ = $1; } @@ -955,6 +954,7 @@ static_scalar_value: | T_NS_SEPARATOR namespace_name { zval tmp; ZVAL_NEW_STR(&tmp, STR_ALLOC(Z_STRLEN($2.u.constant)+1, 0)); Z_STRVAL(tmp)[0] = '\\'; memcpy(Z_STRVAL(tmp) + 1, Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); if (Z_DELREF($2.u.constant) == 0) {efree(Z_STR($2.u.constant));} Z_STR($2.u.constant) = Z_STR(tmp); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; } | '[' static_array_pair_list ']' { $$ = $2; } + | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } | static_class_constant { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } | T_CLASS_C { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } | static_operation { $$ = $1; } @@ -1007,6 +1007,7 @@ scalar: | '"' encaps_list '"' { $$ = $2; } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; } | T_CLASS_C { if (Z_TYPE($1.u.constant) == IS_CONSTANT) {zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1 TSRMLS_CC);} else {$$ = $1;} } + | dereferencable_scalar { $$ = $1; } ; @@ -1058,10 +1059,9 @@ variable_class_name: ; dereferencable: - variable { $$ = $1; } - | '(' expr ')' { $$ = $2; zend_do_begin_variable_parse(TSRMLS_C); } - | combined_scalar { $$ = $1; zend_do_begin_variable_parse(TSRMLS_C); } - | T_CONSTANT_ENCAPSED_STRING { $$ = $1; zend_do_begin_variable_parse(TSRMLS_C); } + variable { $$ = $1; } + | '(' expr ')' { $$ = $2; zend_do_begin_variable_parse(TSRMLS_C); } + | dereferencable_scalar { $$ = $1; zend_do_begin_variable_parse(TSRMLS_C); } ; directly_callable_variable: