@@ -52,7 +52,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
52
52
%}
53
53
54
54
%pure_parser
55
- %expect 8 /* 6 because traits */
55
+ %expect 0
56
56
57
57
%code requires {
58
58
}
@@ -88,6 +88,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
88
88
%right T_POW
89
89
%right ' ['
90
90
%nonassoc T_NEW T_CLONE
91
+ %left " if_without_else"
91
92
%left T_ELSEIF
92
93
%left T_ELSE
93
94
%left T_ENDIF
@@ -260,7 +261,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
260
261
%type <ast> identifier
261
262
262
263
%type <num> returns_ref function is_reference is_variadic variable_modifiers
263
- %type <num> method_modifiers trait_modifiers non_empty_member_modifiers member_modifier
264
+ %type <num> method_modifiers non_empty_member_modifiers member_modifier
264
265
%type <num> class_modifiers class_modifier use_type
265
266
266
267
%type <str> backup_doc_comment
@@ -271,17 +272,21 @@ start:
271
272
top_statement_list { CG(ast) = $1 ; }
272
273
;
273
274
274
- semi_reserved :
275
+ reserved_non_modifiers :
275
276
T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND
276
277
| T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE
277
278
| T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY
278
279
| T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
279
280
| T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK
280
281
| T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE
281
- | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC
282
282
// | T_CLASS
283
283
;
284
284
285
+ semi_reserved :
286
+ reserved_non_modifiers
287
+ | T_STATIC | T_ABSTRACT | T_FINAL | T_PRIVATE | T_PROTECTED | T_PUBLIC
288
+ ;
289
+
285
290
identifier :
286
291
T_STRING { $$ = $1 ; }
287
292
| semi_reserved {
@@ -583,7 +588,7 @@ if_stmt_without_else:
583
588
;
584
589
585
590
if_stmt :
586
- if_stmt_without_else { $$ = $1 ; }
591
+ if_stmt_without_else % prec " if_without_else " { $$ = $1 ; }
587
592
| if_stmt_without_else T_ELSE statement
588
593
{ $$ = zend_ast_list_add($1 , zend_ast_create(ZEND_AST_IF_ELEM, NULL , $3 )); }
589
594
;
@@ -730,9 +735,13 @@ trait_precedence:
730
735
;
731
736
732
737
trait_alias :
733
- trait_method_reference T_AS trait_modifiers identifier
738
+ trait_method_reference T_AS T_STRING
739
+ { $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, 0 , $1 , $3 ); }
740
+ | trait_method_reference T_AS reserved_non_modifiers
741
+ { zval zv; zend_lex_tstring(&zv); $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, 0 , $1 , zend_ast_create_zval(&zv)); }
742
+ | trait_method_reference T_AS member_modifier identifier
734
743
{ $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, $3 , $1 , $4 ); }
735
- | trait_method_reference T_AS member_modifier
744
+ | trait_method_reference T_AS member_modifier % prec ' + '
736
745
{ $$ = zend_ast_create_ex(ZEND_AST_TRAIT_ALIAS, $3 , $1 , NULL ); }
737
746
;
738
747
@@ -747,11 +756,6 @@ absolute_trait_method_reference:
747
756
{ $$ = zend_ast_create(ZEND_AST_METHOD_REFERENCE, $1 , $3 ); }
748
757
;
749
758
750
- trait_modifiers :
751
- /* empty */ { $$ = 0 ; }
752
- | member_modifier { $$ = $1 ; }
753
- ;
754
-
755
759
method_body :
756
760
' ;' /* abstract method */ { $$ = NULL ; }
757
761
| ' {' inner_statement_list ' }' { $$ = $2 ; }
0 commit comments