From 545fd5168ed0eaaf23e12f11c48e8dc358de3ee3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 29 Aug 2014 20:52:26 +0200 Subject: [PATCH] Don't distinguish between ast/list in parser This removes the need to use ${n} or $$ casts in the reduction actions. Keeping the distinction in the parser doesn't really give us any benefit and only makes changing the grammar harder. --- Zend/zend_ast.c | 15 +-- Zend/zend_ast.h | 4 +- Zend/zend_compile.c | 7 +- Zend/zend_compile.h | 5 +- Zend/zend_language_parser.y | 180 ++++++++++++++++-------------------- 5 files changed, 96 insertions(+), 115 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 2532018274..1a8be00395 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -130,9 +130,11 @@ ZEND_API zend_ast *zend_ast_create(zend_ast_kind kind, ...) { return ast; } -ZEND_API zend_ast_list *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...) { +ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...) { TSRMLS_FETCH(); - zend_ast_list *list = zend_ast_alloc(zend_ast_list_size(4) TSRMLS_CC); + zend_ast *ast = zend_ast_alloc(zend_ast_list_size(4) TSRMLS_CC); + + zend_ast_list *list = (zend_ast_list *) ast; list->kind = kind; list->attr = 0; list->lineno = CG(zend_lineno); @@ -143,26 +145,27 @@ ZEND_API zend_ast_list *zend_ast_create_list(uint32_t init_children, zend_ast_ki uint32_t i; va_start(va, kind); for (i = 0; i < init_children; ++i) { - list = zend_ast_list_add(list, va_arg(va, zend_ast *)); + ast = zend_ast_list_add(ast, va_arg(va, zend_ast *)); } va_end(va); } - return list; + return ast; } static inline zend_bool is_power_of_two(uint32_t n) { return n == (n & -n); } -ZEND_API zend_ast_list *zend_ast_list_add(zend_ast_list *list, zend_ast *op) { +ZEND_API zend_ast *zend_ast_list_add(zend_ast *ast, zend_ast *op) { + zend_ast_list *list = zend_ast_get_list(ast); if (list->children >= 4 && is_power_of_two(list->children)) { TSRMLS_FETCH(); list = zend_ast_realloc(list, zend_ast_list_size(list->children), zend_ast_list_size(list->children * 2) TSRMLS_CC); } list->child[list->children++] = op; - return list; + return (zend_ast *) list; } static void zend_ast_add_array_element(zval *result, zval *offset, zval *expr TSRMLS_DC) diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 24d2aa6308..2a1582ca24 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -195,8 +195,8 @@ ZEND_API zend_ast *zend_ast_create_decl( zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2 ); -ZEND_API zend_ast_list *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...); -ZEND_API zend_ast_list *zend_ast_list_add(zend_ast_list *list, zend_ast *op); +ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind kind, ...); +ZEND_API zend_ast *zend_ast_list_add(zend_ast *list, zend_ast *op); ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope TSRMLS_DC); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 92b26b2001..244c154338 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3091,7 +3091,7 @@ zend_ast *zend_ast_append_str(zend_ast *left_ast, zend_ast *right_ast) /* {{{ */ /* }}} */ /* A hacky way that is used to store the doc comment for properties */ -zend_ast_list *zend_ast_append_doc_comment(zend_ast_list *list TSRMLS_DC) /* {{{ */ +zend_ast *zend_ast_append_doc_comment(zend_ast *list TSRMLS_DC) /* {{{ */ { if (CG(doc_comment)) { list = zend_ast_list_add(list, zend_ast_create_zval_from_str(CG(doc_comment))); @@ -5267,8 +5267,9 @@ void zend_compile_try(zend_ast *ast TSRMLS_DC) /* {{{ */ /* }}} */ /* Encoding declarations must already be handled during parsing */ -void zend_handle_encoding_declaration(zend_ast_list *declares TSRMLS_DC) /* {{{ */ +void zend_handle_encoding_declaration(zend_ast *ast TSRMLS_DC) /* {{{ */ { + zend_ast_list *declares = zend_ast_get_list(ast); uint32_t i; for (i = 0; i < declares->children; ++i) { zend_ast *declare_ast = declares->child[i]; @@ -7166,7 +7167,7 @@ void zend_compile_shell_exec(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ ZVAL_STRING(&fn_name, "shell_exec"); name_ast = zend_ast_create_zval(&fn_name); - args_ast = (zend_ast *) zend_ast_create_list(1, ZEND_AST_ARG_LIST, expr_ast); + args_ast = zend_ast_create_list(1, ZEND_AST_ARG_LIST, expr_ast); call_ast = zend_ast_create(ZEND_AST_CALL, name_ast, args_ast); zend_compile_expr(result, call_ast TSRMLS_CC); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 4fe18b9166..b8e8ae1083 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -89,7 +89,6 @@ static inline znode *zend_ast_get_znode(zend_ast *ast) { typedef union _zend_parser_stack_elem { zend_ast *ast; - zend_ast_list *list; zend_string *str; zend_ulong num; } zend_parser_stack_elem; @@ -447,8 +446,8 @@ void zend_stop_lexing(TSRMLS_D); void zend_emit_final_return(zval *zv TSRMLS_DC); zend_ast *zend_ast_append_str(zend_ast *left, zend_ast *right); uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag); -zend_ast_list *zend_ast_append_doc_comment(zend_ast_list *list TSRMLS_DC); -void zend_handle_encoding_declaration(zend_ast_list *declares TSRMLS_DC); +zend_ast *zend_ast_append_doc_comment(zend_ast *list TSRMLS_DC); +void zend_handle_encoding_declaration(zend_ast *ast TSRMLS_DC); /* parser-driven code generators */ void zend_do_free(znode *op1 TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index d841e5e44f..6bfef2219e 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -56,7 +56,6 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); } %destructor { zend_ast_destroy($$); } -%destructor { zend_ast_destroy((zend_ast *) $$); } %destructor { if ($$) zend_string_release($$); } %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE @@ -238,16 +237,15 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %type callable_expr callable_variable static_member new_variable %type assignment_list_element array_pair encaps_var encaps_var_offset isset_variables %type isset_variable - -%type top_statement_list use_declarations const_list inner_statement_list if_stmt -%type alt_if_stmt for_exprs switch_case_list global_var_list static_var_list -%type echo_expr_list unset_variables catch_list parameter_list class_statement_list -%type implements_list interface_extends_list case_list if_stmt_without_else -%type non_empty_parameter_list argument_list non_empty_argument_list property_list -%type class_const_list name_list trait_adaptations method_body non_empty_for_exprs -%type ctor_arguments alt_if_stmt_without_else trait_adaptation_list lexical_vars -%type lexical_var_list encaps_list array_pair_list non_empty_array_pair_list -%type assignment_list +%type top_statement_list use_declarations const_list inner_statement_list if_stmt +%type alt_if_stmt for_exprs switch_case_list global_var_list static_var_list +%type echo_expr_list unset_variables catch_list parameter_list class_statement_list +%type implements_list interface_extends_list case_list if_stmt_without_else +%type non_empty_parameter_list argument_list non_empty_argument_list property_list +%type class_const_list name_list trait_adaptations method_body non_empty_for_exprs +%type ctor_arguments alt_if_stmt_without_else trait_adaptation_list lexical_vars +%type lexical_var_list encaps_list array_pair_list non_empty_array_pair_list +%type assignment_list %type returns_ref function is_reference is_variadic class_type variable_modifiers %type method_modifiers trait_modifiers non_empty_member_modifiers member_modifier @@ -257,7 +255,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %% /* Rules */ start: - top_statement_list { CG(ast) = $1; } + top_statement_list { CG(ast) = $1; } ; top_statement_list: @@ -266,18 +264,14 @@ top_statement_list: ; namespace_name: - T_STRING { $$ = $1; } - | namespace_name T_NS_SEPARATOR T_STRING - { $$ = zend_ast_append_str($1, $3); } + T_STRING { $$ = $1; } + | namespace_name T_NS_SEPARATOR T_STRING { $$ = zend_ast_append_str($1, $3); } ; name: - namespace_name - { $$ = $1; $$->attr = ZEND_NAME_NOT_FQ; } - | T_NAMESPACE T_NS_SEPARATOR namespace_name - { $$ = $3; $$->attr = ZEND_NAME_RELATIVE; } - | T_NS_SEPARATOR namespace_name - { $$ = $2; $$->attr = ZEND_NAME_FQ; } + namespace_name { $$ = $1; $$->attr = ZEND_NAME_NOT_FQ; } + | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$ = $3; $$->attr = ZEND_NAME_RELATIVE; } + | T_NS_SEPARATOR namespace_name { $$ = $2; $$->attr = ZEND_NAME_FQ; } ; top_statement: @@ -293,17 +287,14 @@ top_statement: RESET_DOC_COMMENT(); } | T_NAMESPACE namespace_name { RESET_DOC_COMMENT(); } '{' top_statement_list '}' - { $$ = zend_ast_create(ZEND_AST_NAMESPACE, $2, $5); } + { $$ = zend_ast_create(ZEND_AST_NAMESPACE, $2, $5); } | T_NAMESPACE { RESET_DOC_COMMENT(); } '{' top_statement_list '}' - { $$ = zend_ast_create(ZEND_AST_NAMESPACE, NULL, $4); } - | T_USE use_declarations ';' - { $$ = $2; $$->attr = T_CLASS; } - | T_USE T_FUNCTION use_declarations ';' - { $$ = $3; $$->attr = T_FUNCTION; } - | T_USE T_CONST use_declarations ';' - { $$ = $3; $$->attr = T_CONST; } - | T_CONST const_list ';' { $$ = $2; } + { $$ = zend_ast_create(ZEND_AST_NAMESPACE, NULL, $4); } + | T_USE use_declarations ';' { $$ = $2; $$->attr = T_CLASS; } + | T_USE T_FUNCTION use_declarations ';' { $$ = $3; $$->attr = T_FUNCTION; } + | T_USE T_CONST use_declarations ';' { $$ = $3; $$->attr = T_CONST; } + | T_CONST const_list ';' { $$ = $2; } ; use_declarations: @@ -348,26 +339,26 @@ inner_statement: statement: - '{' inner_statement_list '}' { $$ = $2; } - | if_stmt { $$ = $1; } - | alt_if_stmt { $$ = $1; } + '{' inner_statement_list '}' { $$ = $2; } + | if_stmt { $$ = $1; } + | alt_if_stmt { $$ = $1; } | T_WHILE '(' expr ')' while_statement { $$ = zend_ast_create(ZEND_AST_WHILE, $3, $5); } | T_DO statement T_WHILE '(' expr ')' ';' { $$ = zend_ast_create(ZEND_AST_DO_WHILE, $2, $5); } | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement - { $$ = zend_ast_create(ZEND_AST_FOR, $3, $5, $7, $9); } + { $$ = zend_ast_create(ZEND_AST_FOR, $3, $5, $7, $9); } | T_SWITCH '(' expr ')' switch_case_list - { $$ = zend_ast_create(ZEND_AST_SWITCH, $3, $5); } + { $$ = zend_ast_create(ZEND_AST_SWITCH, $3, $5); } | T_BREAK optional_expr ';' { $$ = zend_ast_create(ZEND_AST_BREAK, $2); } | T_CONTINUE optional_expr ';' { $$ = zend_ast_create(ZEND_AST_CONTINUE, $2); } | T_RETURN optional_expr ';' { $$ = zend_ast_create(ZEND_AST_RETURN, $2); } - | T_GLOBAL global_var_list ';' { $$ = $2; } - | T_STATIC static_var_list ';' { $$ = $2; } - | T_ECHO echo_expr_list ';' { $$ = $2; } + | T_GLOBAL global_var_list ';' { $$ = $2; } + | T_STATIC static_var_list ';' { $$ = $2; } + | T_ECHO echo_expr_list ';' { $$ = $2; } | T_INLINE_HTML { $$ = zend_ast_create(ZEND_AST_ECHO, $1); } | expr ';' { $$ = $1; } - | T_UNSET '(' unset_variables ')' ';' { $$ = $3; } + | T_UNSET '(' unset_variables ')' ';' { $$ = $3; } | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement { $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); } | T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')' @@ -376,10 +367,10 @@ statement: | T_DECLARE '(' const_list ')' { zend_handle_encoding_declaration($3 TSRMLS_CC); } declare_statement - { $$ = zend_ast_create(ZEND_AST_DECLARE, $3, $6); } + { $$ = zend_ast_create(ZEND_AST_DECLARE, $3, $6); } | ';' /* empty statement */ { $$ = NULL; } | T_TRY '{' inner_statement_list '}' catch_list finally_statement - { $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); } + { $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); } | T_THROW expr ';' { $$ = zend_ast_create(ZEND_AST_THROW, $2); } | T_GOTO T_STRING ';' { $$ = zend_ast_create(ZEND_AST_GOTO, $2); } | T_STRING ':' { $$ = zend_ast_create(ZEND_AST_LABEL, $1); } @@ -389,12 +380,12 @@ catch_list: /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_CATCH_LIST); } | catch_list T_CATCH '(' name T_VARIABLE ')' '{' inner_statement_list '}' - { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_CATCH, $4, $5, $8)); } + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_CATCH, $4, $5, $8)); } ; finally_statement: /* empty */ { $$ = NULL; } - | T_FINALLY '{' inner_statement_list '}' { $$ = $3; } + | T_FINALLY '{' inner_statement_list '}' { $$ = $3; } ; unset_variables: @@ -410,7 +401,7 @@ function_declaration_statement: function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment '{' inner_statement_list '}' { $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2, $1, $7, - zend_ast_get_str($3), $5, NULL, $9); } + zend_ast_get_str($3), $5, NULL, $9); } ; is_reference: @@ -427,11 +418,11 @@ class_declaration_statement: class_type { $$ = CG(zend_lineno); } T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}' { $$ = zend_ast_create_decl(ZEND_AST_CLASS, $1, $2, $6, - zend_ast_get_str($3), $4, $5, $8); } + zend_ast_get_str($3), $4, $5, $8); } | T_INTERFACE { $$ = CG(zend_lineno); } T_STRING interface_extends_list backup_doc_comment '{' class_statement_list '}' { $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_INTERFACE, $2, $5, - zend_ast_get_str($3), NULL, $4, $7); } + zend_ast_get_str($3), NULL, $4, $7); } ; class_type: @@ -459,22 +450,22 @@ implements_list: foreach_variable: variable { $$ = $1; } | '&' variable { $$ = zend_ast_create(ZEND_AST_REF, $2); } - | T_LIST '(' assignment_list ')' { $$ = $3; } + | T_LIST '(' assignment_list ')' { $$ = $3; } ; for_statement: statement { $$ = $1; } - | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } + | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } ; foreach_statement: statement { $$ = $1; } - | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } + | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; } ; declare_statement: statement { $$ = $1; } - | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } + | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; } ; switch_case_list: @@ -487,9 +478,9 @@ switch_case_list: case_list: /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); } | case_list T_CASE expr case_separator inner_statement_list - { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); } + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); } | case_list T_DEFAULT case_separator inner_statement_list - { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); } + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); } ; case_separator: @@ -500,7 +491,7 @@ case_separator: while_statement: statement { $$ = $1; } - | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } + | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } ; @@ -522,17 +513,17 @@ if_stmt: alt_if_stmt_without_else: T_IF '(' expr ')' ':' inner_statement_list { $$ = zend_ast_create_list(1, ZEND_AST_IF, - zend_ast_create(ZEND_AST_IF_ELEM, $3, $6)); } + zend_ast_create(ZEND_AST_IF_ELEM, $3, $6)); } | alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list { $$ = zend_ast_list_add($1, - zend_ast_create(ZEND_AST_IF_ELEM, $4, $7)); } + zend_ast_create(ZEND_AST_IF_ELEM, $4, $7)); } ; alt_if_stmt: alt_if_stmt_without_else T_ENDIF ';' { $$ = $1; } | alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' { $$ = zend_ast_list_add($1, - zend_ast_create(ZEND_AST_IF_ELEM, NULL, $4)); } + zend_ast_create(ZEND_AST_IF_ELEM, NULL, $4)); } ; parameter_list: @@ -612,15 +603,15 @@ class_statement_list: class_statement: variable_modifiers property_list ';' - { $$ = zend_ast_append_doc_comment($2 TSRMLS_CC); $$->attr = $1; } + { $$ = zend_ast_append_doc_comment($2 TSRMLS_CC); $$->attr = $1; } | T_CONST class_const_list ';' - { $$ = $2; RESET_DOC_COMMENT(); } + { $$ = $2; RESET_DOC_COMMENT(); } | T_USE name_list trait_adaptations { $$ = zend_ast_create(ZEND_AST_USE_TRAIT, $2, $3); } | method_modifiers function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment method_body { $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1, $2, $8, - zend_ast_get_str($4), $6, NULL, $9); } + zend_ast_get_str($4), $6, NULL, $9); } ; name_list: @@ -648,7 +639,7 @@ trait_adaptation: trait_precedence: absolute_trait_method_reference T_INSTEADOF name_list - { $$ = zend_ast_create(ZEND_AST_TRAIT_PRECEDENCE, $1, $3); } + { $$ = zend_ast_create(ZEND_AST_TRAIT_PRECEDENCE, $1, $3); } ; trait_alias: @@ -745,12 +736,12 @@ non_empty_for_exprs: new_expr: T_NEW class_name_reference ctor_arguments - { $$ = zend_ast_create(ZEND_AST_NEW, $2, $3); } + { $$ = zend_ast_create(ZEND_AST_NEW, $2, $3); } ; expr_without_variable: T_LIST '(' assignment_list ')' '=' expr - { $$ = zend_ast_create(ZEND_AST_ASSIGN, $3, $6); } + { $$ = zend_ast_create(ZEND_AST_ASSIGN, $3, $6); } | variable '=' expr { $$ = zend_ast_create(ZEND_AST_ASSIGN, $1, $3); } | variable '=' '&' variable @@ -837,39 +828,31 @@ expr_without_variable: | expr '?' ':' expr { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); } | internal_functions_in_yacc { $$ = $1; } - | T_INT_CAST expr - { $$ = zend_ast_create_cast(IS_LONG, $2); } - | T_DOUBLE_CAST expr - { $$ = zend_ast_create_cast(IS_DOUBLE, $2); } - | T_STRING_CAST expr - { $$ = zend_ast_create_cast(IS_STRING, $2); } - | T_ARRAY_CAST expr - { $$ = zend_ast_create_cast(IS_ARRAY, $2); } - | T_OBJECT_CAST expr - { $$ = zend_ast_create_cast(IS_OBJECT, $2); } - | T_BOOL_CAST expr - { $$ = zend_ast_create_cast(_IS_BOOL, $2); } - | T_UNSET_CAST expr - { $$ = zend_ast_create_cast(IS_NULL, $2); } - | T_EXIT exit_expr { $$ = zend_ast_create(ZEND_AST_EXIT, $2); } - | '@' expr { $$ = zend_ast_create(ZEND_AST_SILENCE, $2); } + | T_INT_CAST expr { $$ = zend_ast_create_cast(IS_LONG, $2); } + | T_DOUBLE_CAST expr { $$ = zend_ast_create_cast(IS_DOUBLE, $2); } + | T_STRING_CAST expr { $$ = zend_ast_create_cast(IS_STRING, $2); } + | T_ARRAY_CAST expr { $$ = zend_ast_create_cast(IS_ARRAY, $2); } + | T_OBJECT_CAST expr { $$ = zend_ast_create_cast(IS_OBJECT, $2); } + | T_BOOL_CAST expr { $$ = zend_ast_create_cast(_IS_BOOL, $2); } + | T_UNSET_CAST expr { $$ = zend_ast_create_cast(IS_NULL, $2); } + | T_EXIT exit_expr { $$ = zend_ast_create(ZEND_AST_EXIT, $2); } + | '@' expr { $$ = zend_ast_create(ZEND_AST_SILENCE, $2); } | scalar { $$ = $1; } | '`' backticks_expr '`' { $$ = zend_ast_create(ZEND_AST_SHELL_EXEC, $2); } | T_PRINT expr { $$ = zend_ast_create(ZEND_AST_PRINT, $2); } | T_YIELD { $$ = zend_ast_create(ZEND_AST_YIELD, NULL, NULL); } | T_YIELD expr { $$ = zend_ast_create(ZEND_AST_YIELD, $2, NULL); } - | T_YIELD expr T_DOUBLE_ARROW expr - { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); } + | T_YIELD expr T_DOUBLE_ARROW expr { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); } | function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment '{' inner_statement_list '}' { $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2, $1, $7, zend_string_init("{closure}", sizeof("{closure}") - 1, 0), - $4, $6, $9); } + $4, $6, $9); } | T_STATIC function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment '{' inner_statement_list '}' { $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | ZEND_ACC_STATIC, $2, $8, zend_string_init("{closure}", sizeof("{closure}") - 1, 0), - $5, $7, $10); } + $5, $7, $10); } ; function: @@ -902,15 +885,13 @@ lexical_var: function_call: name argument_list - { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); } + { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); } | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list - { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, - $1, $3, $4); } + { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list - { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, - $1, $3, $4); } + { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); } | callable_expr argument_list - { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); } + { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); } ; class_name: @@ -934,7 +915,7 @@ backticks_expr: /* empty */ { $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); } | T_ENCAPSED_AND_WHITESPACE { $$ = $1; } - | encaps_list { $$ = $1; } + | encaps_list { $$ = $1; } ; @@ -945,8 +926,8 @@ ctor_arguments: dereferencable_scalar: - T_ARRAY '(' array_pair_list ')' { $$ = $3; } - | '[' array_pair_list ']' { $$ = $2; } + T_ARRAY '(' array_pair_list ')' { $$ = $3; } + | '[' array_pair_list ']' { $$ = $2; } | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } ; @@ -964,8 +945,8 @@ scalar: | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $2; } | T_START_HEREDOC T_END_HEREDOC { $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); } - | '"' encaps_list '"' { $$ = $2; } - | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; } + | '"' encaps_list '"' { $$ = $2; } + | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; } | dereferencable_scalar { $$ = $1; } | class_name_scalar { $$ = $1; } | constant { $$ = $1; } @@ -1020,7 +1001,7 @@ callable_variable: | dereferencable '{' expr '}' { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); } | dereferencable T_OBJECT_OPERATOR member_name argument_list - { $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); } + { $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); } | function_call { $$ = $1; } ; @@ -1034,12 +1015,9 @@ variable: ; simple_variable: - T_VARIABLE - { $$ = $1; } - | '$' '{' expr '}' - { $$ = $3; } - | '$' simple_variable - { $$ = zend_ast_create(ZEND_AST_VAR, $2); } + T_VARIABLE { $$ = $1; } + | '$' '{' expr '}' { $$ = $3; } + | '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); } ; static_member: @@ -1079,7 +1057,7 @@ assignment_list: assignment_list_element: variable { $$ = $1; } - | T_LIST '(' assignment_list ')' { $$ = $3; } + | T_LIST '(' assignment_list ')' { $$ = $3; } | /* empty */ { $$ = NULL; } ; -- 2.40.0