%type <ast> new_expr anonymous_class class_name class_name_reference simple_variable
%type <ast> internal_functions_in_yacc
%type <ast> exit_expr scalar backticks_expr lexical_var function_call member_name property_name
-%type <ast> variable_class_name dereferencable_scalar constant class_constant dereferencable
+%type <ast> variable_class_name dereferencable_scalar constant class_constant
+%type <ast> fully_dereferencable array_dereferencable
%type <ast> callable_expr callable_variable static_member new_variable
%type <ast> encaps_var encaps_var_offset isset_variables
%type <ast> top_statement_list use_declarations const_list inner_statement_list if_stmt
;
variable_class_name:
- dereferencable { $$ = $1; }
+ fully_dereferencable { $$ = $1; }
;
-dereferencable:
+fully_dereferencable:
variable { $$ = $1; }
| '(' expr ')' { $$ = $2; }
| dereferencable_scalar { $$ = $1; }
;
+array_dereferencable:
+ fully_dereferencable { $$ = $1; }
+ | constant { $$ = $1; }
+ | class_constant { $$ = $1; }
+;
+
callable_expr:
callable_variable { $$ = $1; }
| '(' expr ')' { $$ = $2; }
callable_variable:
simple_variable
{ $$ = zend_ast_create(ZEND_AST_VAR, $1); }
- | dereferencable '[' optional_expr ']'
- { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
- | constant '[' optional_expr ']'
- { $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
- | class_constant '[' optional_expr ']'
+ | array_dereferencable '[' optional_expr ']'
{ $$ = zend_ast_create(ZEND_AST_DIM, $1, $3); }
- | dereferencable '{' expr '}'
+ | array_dereferencable '{' expr '}'
{ $$ = zend_ast_create_ex(ZEND_AST_DIM, ZEND_DIM_ALTERNATIVE_SYNTAX, $1, $3); }
- | dereferencable T_OBJECT_OPERATOR property_name argument_list
+ | fully_dereferencable T_OBJECT_OPERATOR property_name argument_list
{ $$ = zend_ast_create(ZEND_AST_METHOD_CALL, $1, $3, $4); }
| function_call { $$ = $1; }
;
{ $$ = $1; }
| static_member
{ $$ = $1; }
- | dereferencable T_OBJECT_OPERATOR property_name
+ | fully_dereferencable T_OBJECT_OPERATOR property_name
{ $$ = zend_ast_create(ZEND_AST_PROP, $1, $3); }
;