Don't distinguish between ast/list in parser

This removes the need to use $<ast>{n} or $<list>$ 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.
This commit is contained in:
Nikita Popov 2014-08-29 20:52:26 +02:00
parent 25d57aace3
commit 545fd5168e
5 changed files with 96 additions and 115 deletions

View file

@ -130,9 +130,11 @@ ZEND_API zend_ast *zend_ast_create(zend_ast_kind kind, ...) {
return ast; 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(); 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->kind = kind;
list->attr = 0; list->attr = 0;
list->lineno = CG(zend_lineno); 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; uint32_t i;
va_start(va, kind); va_start(va, kind);
for (i = 0; i < init_children; ++i) { 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); va_end(va);
} }
return list; return ast;
} }
static inline zend_bool is_power_of_two(uint32_t n) { static inline zend_bool is_power_of_two(uint32_t n) {
return n == (n & -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)) { if (list->children >= 4 && is_power_of_two(list->children)) {
TSRMLS_FETCH(); TSRMLS_FETCH();
list = zend_ast_realloc(list, list = zend_ast_realloc(list,
zend_ast_list_size(list->children), zend_ast_list_size(list->children * 2) TSRMLS_CC); zend_ast_list_size(list->children), zend_ast_list_size(list->children * 2) TSRMLS_CC);
} }
list->child[list->children++] = op; 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) static void zend_ast_add_array_element(zval *result, zval *offset, zval *expr TSRMLS_DC)

View file

@ -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_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 *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_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); ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope TSRMLS_DC);

View file

@ -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 */ /* 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)) { if (CG(doc_comment)) {
list = zend_ast_list_add(list, zend_ast_create_zval_from_str(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 */ /* 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; uint32_t i;
for (i = 0; i < declares->children; ++i) { for (i = 0; i < declares->children; ++i) {
zend_ast *declare_ast = declares->child[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"); ZVAL_STRING(&fn_name, "shell_exec");
name_ast = zend_ast_create_zval(&fn_name); 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); call_ast = zend_ast_create(ZEND_AST_CALL, name_ast, args_ast);
zend_compile_expr(result, call_ast TSRMLS_CC); zend_compile_expr(result, call_ast TSRMLS_CC);

View file

@ -89,7 +89,6 @@ static inline znode *zend_ast_get_znode(zend_ast *ast) {
typedef union _zend_parser_stack_elem { typedef union _zend_parser_stack_elem {
zend_ast *ast; zend_ast *ast;
zend_ast_list *list;
zend_string *str; zend_string *str;
zend_ulong num; zend_ulong num;
} zend_parser_stack_elem; } zend_parser_stack_elem;
@ -447,8 +446,8 @@ void zend_stop_lexing(TSRMLS_D);
void zend_emit_final_return(zval *zv TSRMLS_DC); void zend_emit_final_return(zval *zv TSRMLS_DC);
zend_ast *zend_ast_append_str(zend_ast *left, zend_ast *right); 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); 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); zend_ast *zend_ast_append_doc_comment(zend_ast *list TSRMLS_DC);
void zend_handle_encoding_declaration(zend_ast_list *declares TSRMLS_DC); void zend_handle_encoding_declaration(zend_ast *ast TSRMLS_DC);
/* parser-driven code generators */ /* parser-driven code generators */
void zend_do_free(znode *op1 TSRMLS_DC); void zend_do_free(znode *op1 TSRMLS_DC);

View file

@ -56,7 +56,6 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
} }
%destructor { zend_ast_destroy($$); } <ast> %destructor { zend_ast_destroy($$); } <ast>
%destructor { zend_ast_destroy((zend_ast *) $$); } <list>
%destructor { if ($$) zend_string_release($$); } <str> %destructor { if ($$) zend_string_release($$); } <str>
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE %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 <ast> callable_expr callable_variable static_member new_variable %type <ast> callable_expr callable_variable static_member new_variable
%type <ast> assignment_list_element array_pair encaps_var encaps_var_offset isset_variables %type <ast> assignment_list_element array_pair encaps_var encaps_var_offset isset_variables
%type <ast> isset_variable %type <ast> isset_variable
%type <ast> top_statement_list use_declarations const_list inner_statement_list if_stmt
%type <list> top_statement_list use_declarations const_list inner_statement_list if_stmt %type <ast> alt_if_stmt for_exprs switch_case_list global_var_list static_var_list
%type <list> alt_if_stmt for_exprs switch_case_list global_var_list static_var_list %type <ast> echo_expr_list unset_variables catch_list parameter_list class_statement_list
%type <list> echo_expr_list unset_variables catch_list parameter_list class_statement_list %type <ast> implements_list interface_extends_list case_list if_stmt_without_else
%type <list> implements_list interface_extends_list case_list if_stmt_without_else %type <ast> non_empty_parameter_list argument_list non_empty_argument_list property_list
%type <list> non_empty_parameter_list argument_list non_empty_argument_list property_list %type <ast> class_const_list name_list trait_adaptations method_body non_empty_for_exprs
%type <list> class_const_list name_list trait_adaptations method_body non_empty_for_exprs %type <ast> ctor_arguments alt_if_stmt_without_else trait_adaptation_list lexical_vars
%type <list> ctor_arguments alt_if_stmt_without_else trait_adaptation_list lexical_vars %type <ast> lexical_var_list encaps_list array_pair_list non_empty_array_pair_list
%type <list> lexical_var_list encaps_list array_pair_list non_empty_array_pair_list %type <ast> assignment_list
%type <list> assignment_list
%type <num> returns_ref function is_reference is_variadic class_type variable_modifiers %type <num> returns_ref function is_reference is_variadic class_type variable_modifiers
%type <num> method_modifiers trait_modifiers non_empty_member_modifiers member_modifier %type <num> method_modifiers trait_modifiers non_empty_member_modifiers member_modifier
@ -257,7 +255,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%% /* Rules */ %% /* Rules */
start: start:
top_statement_list { CG(ast) = $<ast>1; } top_statement_list { CG(ast) = $1; }
; ;
top_statement_list: top_statement_list:
@ -266,18 +264,14 @@ top_statement_list:
; ;
namespace_name: namespace_name:
T_STRING { $$ = $1; } T_STRING { $$ = $1; }
| namespace_name T_NS_SEPARATOR T_STRING | namespace_name T_NS_SEPARATOR T_STRING { $$ = zend_ast_append_str($1, $3); }
{ $$ = zend_ast_append_str($1, $3); }
; ;
name: name:
namespace_name namespace_name { $$ = $1; $$->attr = ZEND_NAME_NOT_FQ; }
{ $$ = $1; $$->attr = ZEND_NAME_NOT_FQ; } | T_NAMESPACE T_NS_SEPARATOR namespace_name { $$ = $3; $$->attr = ZEND_NAME_RELATIVE; }
| T_NAMESPACE T_NS_SEPARATOR namespace_name | T_NS_SEPARATOR namespace_name { $$ = $2; $$->attr = ZEND_NAME_FQ; }
{ $$ = $3; $$->attr = ZEND_NAME_RELATIVE; }
| T_NS_SEPARATOR namespace_name
{ $$ = $2; $$->attr = ZEND_NAME_FQ; }
; ;
top_statement: top_statement:
@ -293,17 +287,14 @@ top_statement:
RESET_DOC_COMMENT(); } RESET_DOC_COMMENT(); }
| T_NAMESPACE namespace_name { RESET_DOC_COMMENT(); } | T_NAMESPACE namespace_name { RESET_DOC_COMMENT(); }
'{' top_statement_list '}' '{' top_statement_list '}'
{ $$ = zend_ast_create(ZEND_AST_NAMESPACE, $2, $<ast>5); } { $$ = zend_ast_create(ZEND_AST_NAMESPACE, $2, $5); }
| T_NAMESPACE { RESET_DOC_COMMENT(); } | T_NAMESPACE { RESET_DOC_COMMENT(); }
'{' top_statement_list '}' '{' top_statement_list '}'
{ $$ = zend_ast_create(ZEND_AST_NAMESPACE, NULL, $<ast>4); } { $$ = zend_ast_create(ZEND_AST_NAMESPACE, NULL, $4); }
| T_USE use_declarations ';' | T_USE use_declarations ';' { $$ = $2; $$->attr = T_CLASS; }
{ $$ = $<ast>2; $$->attr = T_CLASS; } | T_USE T_FUNCTION use_declarations ';' { $$ = $3; $$->attr = T_FUNCTION; }
| T_USE T_FUNCTION use_declarations ';' | T_USE T_CONST use_declarations ';' { $$ = $3; $$->attr = T_CONST; }
{ $$ = $<ast>3; $$->attr = T_FUNCTION; } | T_CONST const_list ';' { $$ = $2; }
| T_USE T_CONST use_declarations ';'
{ $$ = $<ast>3; $$->attr = T_CONST; }
| T_CONST const_list ';' { $$ = $<ast>2; }
; ;
use_declarations: use_declarations:
@ -348,26 +339,26 @@ inner_statement:
statement: statement:
'{' inner_statement_list '}' { $$ = $<ast>2; } '{' inner_statement_list '}' { $$ = $2; }
| if_stmt { $$ = $<ast>1; } | if_stmt { $$ = $1; }
| alt_if_stmt { $$ = $<ast>1; } | alt_if_stmt { $$ = $1; }
| T_WHILE '(' expr ')' while_statement | T_WHILE '(' expr ')' while_statement
{ $$ = zend_ast_create(ZEND_AST_WHILE, $3, $5); } { $$ = zend_ast_create(ZEND_AST_WHILE, $3, $5); }
| T_DO statement T_WHILE '(' expr ')' ';' | T_DO statement T_WHILE '(' expr ')' ';'
{ $$ = zend_ast_create(ZEND_AST_DO_WHILE, $2, $5); } { $$ = zend_ast_create(ZEND_AST_DO_WHILE, $2, $5); }
| T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement
{ $$ = zend_ast_create(ZEND_AST_FOR, $<ast>3, $<ast>5, $<ast>7, $9); } { $$ = zend_ast_create(ZEND_AST_FOR, $3, $5, $7, $9); }
| T_SWITCH '(' expr ')' switch_case_list | T_SWITCH '(' expr ')' switch_case_list
{ $$ = zend_ast_create(ZEND_AST_SWITCH, $3, $<ast>5); } { $$ = zend_ast_create(ZEND_AST_SWITCH, $3, $5); }
| T_BREAK optional_expr ';' { $$ = zend_ast_create(ZEND_AST_BREAK, $2); } | T_BREAK optional_expr ';' { $$ = zend_ast_create(ZEND_AST_BREAK, $2); }
| T_CONTINUE optional_expr ';' { $$ = zend_ast_create(ZEND_AST_CONTINUE, $2); } | T_CONTINUE optional_expr ';' { $$ = zend_ast_create(ZEND_AST_CONTINUE, $2); }
| T_RETURN optional_expr ';' { $$ = zend_ast_create(ZEND_AST_RETURN, $2); } | T_RETURN optional_expr ';' { $$ = zend_ast_create(ZEND_AST_RETURN, $2); }
| T_GLOBAL global_var_list ';' { $$ = $<ast>2; } | T_GLOBAL global_var_list ';' { $$ = $2; }
| T_STATIC static_var_list ';' { $$ = $<ast>2; } | T_STATIC static_var_list ';' { $$ = $2; }
| T_ECHO echo_expr_list ';' { $$ = $<ast>2; } | T_ECHO echo_expr_list ';' { $$ = $2; }
| T_INLINE_HTML { $$ = zend_ast_create(ZEND_AST_ECHO, $1); } | T_INLINE_HTML { $$ = zend_ast_create(ZEND_AST_ECHO, $1); }
| expr ';' { $$ = $1; } | expr ';' { $$ = $1; }
| T_UNSET '(' unset_variables ')' ';' { $$ = $<ast>3; } | T_UNSET '(' unset_variables ')' ';' { $$ = $3; }
| T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement
{ $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); } { $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); }
| T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')' | T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')'
@ -376,10 +367,10 @@ statement:
| T_DECLARE '(' const_list ')' | T_DECLARE '(' const_list ')'
{ zend_handle_encoding_declaration($3 TSRMLS_CC); } { zend_handle_encoding_declaration($3 TSRMLS_CC); }
declare_statement declare_statement
{ $$ = zend_ast_create(ZEND_AST_DECLARE, $<ast>3, $6); } { $$ = zend_ast_create(ZEND_AST_DECLARE, $3, $6); }
| ';' /* empty statement */ { $$ = NULL; } | ';' /* empty statement */ { $$ = NULL; }
| T_TRY '{' inner_statement_list '}' catch_list finally_statement | T_TRY '{' inner_statement_list '}' catch_list finally_statement
{ $$ = zend_ast_create(ZEND_AST_TRY, $<ast>3, $<ast>5, $6); } { $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); }
| T_THROW expr ';' { $$ = zend_ast_create(ZEND_AST_THROW, $2); } | T_THROW expr ';' { $$ = zend_ast_create(ZEND_AST_THROW, $2); }
| T_GOTO T_STRING ';' { $$ = zend_ast_create(ZEND_AST_GOTO, $2); } | T_GOTO T_STRING ';' { $$ = zend_ast_create(ZEND_AST_GOTO, $2); }
| T_STRING ':' { $$ = zend_ast_create(ZEND_AST_LABEL, $1); } | T_STRING ':' { $$ = zend_ast_create(ZEND_AST_LABEL, $1); }
@ -389,12 +380,12 @@ catch_list:
/* empty */ /* empty */
{ $$ = zend_ast_create_list(0, ZEND_AST_CATCH_LIST); } { $$ = zend_ast_create_list(0, ZEND_AST_CATCH_LIST); }
| catch_list T_CATCH '(' name T_VARIABLE ')' '{' inner_statement_list '}' | catch_list T_CATCH '(' name T_VARIABLE ')' '{' inner_statement_list '}'
{ $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_CATCH, $4, $5, $<ast>8)); } { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_CATCH, $4, $5, $8)); }
; ;
finally_statement: finally_statement:
/* empty */ { $$ = NULL; } /* empty */ { $$ = NULL; }
| T_FINALLY '{' inner_statement_list '}' { $$ = $<ast>3; } | T_FINALLY '{' inner_statement_list '}' { $$ = $3; }
; ;
unset_variables: unset_variables:
@ -410,7 +401,7 @@ function_declaration_statement:
function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment
'{' inner_statement_list '}' '{' inner_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2, $1, $7, { $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2, $1, $7,
zend_ast_get_str($3), $<ast>5, NULL, $<ast>9); } zend_ast_get_str($3), $5, NULL, $9); }
; ;
is_reference: is_reference:
@ -427,11 +418,11 @@ class_declaration_statement:
class_type { $<num>$ = CG(zend_lineno); } class_type { $<num>$ = CG(zend_lineno); }
T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}' T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, $1, $<num>2, $6, { $$ = zend_ast_create_decl(ZEND_AST_CLASS, $1, $<num>2, $6,
zend_ast_get_str($3), $4, $<ast>5, $<ast>8); } zend_ast_get_str($3), $4, $5, $8); }
| T_INTERFACE { $<num>$ = CG(zend_lineno); } | T_INTERFACE { $<num>$ = CG(zend_lineno); }
T_STRING interface_extends_list backup_doc_comment '{' class_statement_list '}' T_STRING interface_extends_list backup_doc_comment '{' class_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_INTERFACE, $<num>2, $5, { $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_INTERFACE, $<num>2, $5,
zend_ast_get_str($3), NULL, $<ast>4, $<ast>7); } zend_ast_get_str($3), NULL, $4, $7); }
; ;
class_type: class_type:
@ -459,22 +450,22 @@ implements_list:
foreach_variable: foreach_variable:
variable { $$ = $1; } variable { $$ = $1; }
| '&' variable { $$ = zend_ast_create(ZEND_AST_REF, $2); } | '&' variable { $$ = zend_ast_create(ZEND_AST_REF, $2); }
| T_LIST '(' assignment_list ')' { $$ = $<ast>3; } | T_LIST '(' assignment_list ')' { $$ = $3; }
; ;
for_statement: for_statement:
statement { $$ = $1; } statement { $$ = $1; }
| ':' inner_statement_list T_ENDFOR ';' { $$ = $<ast>2; } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; }
; ;
foreach_statement: foreach_statement:
statement { $$ = $1; } statement { $$ = $1; }
| ':' inner_statement_list T_ENDFOREACH ';' { $$ = $<ast>2; } | ':' inner_statement_list T_ENDFOREACH ';' { $$ = $2; }
; ;
declare_statement: declare_statement:
statement { $$ = $1; } statement { $$ = $1; }
| ':' inner_statement_list T_ENDDECLARE ';' { $$ = $<ast>2; } | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; }
; ;
switch_case_list: switch_case_list:
@ -487,9 +478,9 @@ switch_case_list:
case_list: case_list:
/* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); } /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); }
| case_list T_CASE expr case_separator inner_statement_list | case_list T_CASE expr case_separator inner_statement_list
{ $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $<ast>5)); } { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); }
| case_list T_DEFAULT case_separator inner_statement_list | case_list T_DEFAULT case_separator inner_statement_list
{ $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $<ast>4)); } { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); }
; ;
case_separator: case_separator:
@ -500,7 +491,7 @@ case_separator:
while_statement: while_statement:
statement { $$ = $1; } statement { $$ = $1; }
| ':' inner_statement_list T_ENDWHILE ';' { $$ = $<ast>2; } | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; }
; ;
@ -522,17 +513,17 @@ if_stmt:
alt_if_stmt_without_else: alt_if_stmt_without_else:
T_IF '(' expr ')' ':' inner_statement_list T_IF '(' expr ')' ':' inner_statement_list
{ $$ = zend_ast_create_list(1, ZEND_AST_IF, { $$ = zend_ast_create_list(1, ZEND_AST_IF,
zend_ast_create(ZEND_AST_IF_ELEM, $3, $<ast>6)); } zend_ast_create(ZEND_AST_IF_ELEM, $3, $6)); }
| alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list | alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list
{ $$ = zend_ast_list_add($1, { $$ = zend_ast_list_add($1,
zend_ast_create(ZEND_AST_IF_ELEM, $4, $<ast>7)); } zend_ast_create(ZEND_AST_IF_ELEM, $4, $7)); }
; ;
alt_if_stmt: alt_if_stmt:
alt_if_stmt_without_else T_ENDIF ';' { $$ = $1; } alt_if_stmt_without_else T_ENDIF ';' { $$ = $1; }
| alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' | alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';'
{ $$ = zend_ast_list_add($1, { $$ = zend_ast_list_add($1,
zend_ast_create(ZEND_AST_IF_ELEM, NULL, $<ast>4)); } zend_ast_create(ZEND_AST_IF_ELEM, NULL, $4)); }
; ;
parameter_list: parameter_list:
@ -612,15 +603,15 @@ class_statement_list:
class_statement: class_statement:
variable_modifiers property_list ';' variable_modifiers property_list ';'
{ $<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 ';' | T_CONST class_const_list ';'
{ $$ = $<ast>2; RESET_DOC_COMMENT(); } { $$ = $2; RESET_DOC_COMMENT(); }
| T_USE name_list trait_adaptations | T_USE name_list trait_adaptations
{ $$ = zend_ast_create(ZEND_AST_USE_TRAIT, $2, $3); } { $$ = zend_ast_create(ZEND_AST_USE_TRAIT, $2, $3); }
| method_modifiers function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment | method_modifiers function returns_ref T_STRING '(' parameter_list ')' backup_doc_comment
method_body method_body
{ $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1, $2, $8, { $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1, $2, $8,
zend_ast_get_str($4), $<ast>6, NULL, $<ast>9); } zend_ast_get_str($4), $6, NULL, $9); }
; ;
name_list: name_list:
@ -648,7 +639,7 @@ trait_adaptation:
trait_precedence: trait_precedence:
absolute_trait_method_reference T_INSTEADOF name_list absolute_trait_method_reference T_INSTEADOF name_list
{ $$ = zend_ast_create(ZEND_AST_TRAIT_PRECEDENCE, $1, $<ast>3); } { $$ = zend_ast_create(ZEND_AST_TRAIT_PRECEDENCE, $1, $3); }
; ;
trait_alias: trait_alias:
@ -745,12 +736,12 @@ non_empty_for_exprs:
new_expr: new_expr:
T_NEW class_name_reference ctor_arguments T_NEW class_name_reference ctor_arguments
{ $$ = zend_ast_create(ZEND_AST_NEW, $2, $<ast>3); } { $$ = zend_ast_create(ZEND_AST_NEW, $2, $3); }
; ;
expr_without_variable: expr_without_variable:
T_LIST '(' assignment_list ')' '=' expr T_LIST '(' assignment_list ')' '=' expr
{ $$ = zend_ast_create(ZEND_AST_ASSIGN, $<ast>3, $6); } { $$ = zend_ast_create(ZEND_AST_ASSIGN, $3, $6); }
| variable '=' expr | variable '=' expr
{ $$ = zend_ast_create(ZEND_AST_ASSIGN, $1, $3); } { $$ = zend_ast_create(ZEND_AST_ASSIGN, $1, $3); }
| variable '=' '&' variable | variable '=' '&' variable
@ -837,39 +828,31 @@ expr_without_variable:
| expr '?' ':' expr | expr '?' ':' expr
{ $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); } { $$ = zend_ast_create(ZEND_AST_CONDITIONAL, $1, NULL, $4); }
| internal_functions_in_yacc { $$ = $1; } | internal_functions_in_yacc { $$ = $1; }
| T_INT_CAST expr | T_INT_CAST expr { $$ = zend_ast_create_cast(IS_LONG, $2); }
{ $$ = zend_ast_create_cast(IS_LONG, $2); } | T_DOUBLE_CAST expr { $$ = zend_ast_create_cast(IS_DOUBLE, $2); }
| T_DOUBLE_CAST expr | T_STRING_CAST expr { $$ = zend_ast_create_cast(IS_STRING, $2); }
{ $$ = zend_ast_create_cast(IS_DOUBLE, $2); } | T_ARRAY_CAST expr { $$ = zend_ast_create_cast(IS_ARRAY, $2); }
| T_STRING_CAST expr | T_OBJECT_CAST expr { $$ = zend_ast_create_cast(IS_OBJECT, $2); }
{ $$ = zend_ast_create_cast(IS_STRING, $2); } | T_BOOL_CAST expr { $$ = zend_ast_create_cast(_IS_BOOL, $2); }
| T_ARRAY_CAST expr | T_UNSET_CAST expr { $$ = zend_ast_create_cast(IS_NULL, $2); }
{ $$ = zend_ast_create_cast(IS_ARRAY, $2); } | T_EXIT exit_expr { $$ = zend_ast_create(ZEND_AST_EXIT, $2); }
| T_OBJECT_CAST expr | '@' expr { $$ = zend_ast_create(ZEND_AST_SILENCE, $2); }
{ $$ = 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; } | scalar { $$ = $1; }
| '`' backticks_expr '`' { $$ = zend_ast_create(ZEND_AST_SHELL_EXEC, $2); } | '`' backticks_expr '`' { $$ = zend_ast_create(ZEND_AST_SHELL_EXEC, $2); }
| T_PRINT expr { $$ = zend_ast_create(ZEND_AST_PRINT, $2); } | T_PRINT expr { $$ = zend_ast_create(ZEND_AST_PRINT, $2); }
| T_YIELD { $$ = zend_ast_create(ZEND_AST_YIELD, NULL, NULL); } | T_YIELD { $$ = zend_ast_create(ZEND_AST_YIELD, NULL, NULL); }
| T_YIELD expr { $$ = zend_ast_create(ZEND_AST_YIELD, $2, NULL); } | T_YIELD expr { $$ = zend_ast_create(ZEND_AST_YIELD, $2, NULL); }
| T_YIELD expr T_DOUBLE_ARROW expr | T_YIELD expr T_DOUBLE_ARROW expr { $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); }
{ $$ = zend_ast_create(ZEND_AST_YIELD, $4, $2); }
| function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment | function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment
'{' inner_statement_list '}' '{' inner_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2, $1, $7, { $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2, $1, $7,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
$<ast>4, $<ast>6, $<ast>9); } $4, $6, $9); }
| T_STATIC function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment | T_STATIC function returns_ref '(' parameter_list ')' lexical_vars backup_doc_comment
'{' inner_statement_list '}' '{' inner_statement_list '}'
{ $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | ZEND_ACC_STATIC, $2, $8, { $$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $3 | ZEND_ACC_STATIC, $2, $8,
zend_string_init("{closure}", sizeof("{closure}") - 1, 0), zend_string_init("{closure}", sizeof("{closure}") - 1, 0),
$<ast>5, $<ast>7, $<ast>10); } $5, $7, $10); }
; ;
function: function:
@ -902,15 +885,13 @@ lexical_var:
function_call: function_call:
name argument_list name argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, $1, $<ast>2); } { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }
| class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
$1, $3, $<ast>4); }
| variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
$1, $3, $<ast>4); }
| callable_expr argument_list | callable_expr argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, $1, $<ast>2); } { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }
; ;
class_name: class_name:
@ -934,7 +915,7 @@ backticks_expr:
/* empty */ /* empty */
{ $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); } { $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); }
| T_ENCAPSED_AND_WHITESPACE { $$ = $1; } | T_ENCAPSED_AND_WHITESPACE { $$ = $1; }
| encaps_list { $$ = $<ast>1; } | encaps_list { $$ = $1; }
; ;
@ -945,8 +926,8 @@ ctor_arguments:
dereferencable_scalar: dereferencable_scalar:
T_ARRAY '(' array_pair_list ')' { $$ = $<ast>3; } T_ARRAY '(' array_pair_list ')' { $$ = $3; }
| '[' array_pair_list ']' { $$ = $<ast>2; } | '[' array_pair_list ']' { $$ = $2; }
| T_CONSTANT_ENCAPSED_STRING { $$ = $1; } | 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_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$ = $2; }
| T_START_HEREDOC T_END_HEREDOC | T_START_HEREDOC T_END_HEREDOC
{ $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); } { $$ = zend_ast_create_zval_from_str(STR_EMPTY_ALLOC()); }
| '"' encaps_list '"' { $$ = $<ast>2; } | '"' encaps_list '"' { $$ = $2; }
| T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $<ast>2; } | T_START_HEREDOC encaps_list T_END_HEREDOC { $$ = $2; }
| dereferencable_scalar { $$ = $1; } | dereferencable_scalar { $$ = $1; }
| class_name_scalar { $$ = $1; } | class_name_scalar { $$ = $1; }
| constant { $$ = $1; } | constant { $$ = $1; }
@ -1020,7 +1001,7 @@ callable_variable:
| dereferencable '{' expr '}' | dereferencable '{' expr '}'
{ $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); } { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
| dereferencable T_OBJECT_OPERATOR member_name argument_list | dereferencable T_OBJECT_OPERATOR member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $<ast>4); } { $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); }
| function_call { $$ = $1; } | function_call { $$ = $1; }
; ;
@ -1034,12 +1015,9 @@ variable:
; ;
simple_variable: simple_variable:
T_VARIABLE T_VARIABLE { $$ = $1; }
{ $$ = $1; } | '$' '{' expr '}' { $$ = $3; }
| '$' '{' expr '}' | '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
{ $$ = $3; }
| '$' simple_variable
{ $$ = zend_ast_create(ZEND_AST_VAR, $2); }
; ;
static_member: static_member:
@ -1079,7 +1057,7 @@ assignment_list:
assignment_list_element: assignment_list_element:
variable { $$ = $1; } variable { $$ = $1; }
| T_LIST '(' assignment_list ')' { $$ = $<ast>3; } | T_LIST '(' assignment_list ')' { $$ = $3; }
| /* empty */ { $$ = NULL; } | /* empty */ { $$ = NULL; }
; ;