diff --git a/parser.go b/parser.go index c35e3e7..5a0493b 100644 --- a/parser.go +++ b/parser.go @@ -366,12 +366,17 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:813 +//line parser.y:864 const src = ` class_const_list %type class_const_decl %type method_modifiers +%type name_list +%type trait_adaptations +%type trait_adaptation_list +%type trait_adaptation +%type trait_precedence +%type trait_alias +%type trait_method_reference +%type absolute_trait_method_reference %% @@ -264,8 +272,8 @@ semi_reserved: ; identifier: - T_STRING { $$ = Node("identifier") } - | semi_reserved { $$ = Node("reserved") } + T_STRING { $$ = Node("identifier").attribute("value", $1) } + | semi_reserved { $$ = Node("identifier").attribute("value", "reserved") } ; namespace_name_parts: @@ -590,8 +598,51 @@ class_statement_list: class_statement: variable_modifiers property_list ';' { $$ = $2.append($1) } | method_modifiers T_CONST class_const_list ';' { $$ = $3.append($1); } + | T_USE name_list trait_adaptations { $$ = Node("Use").append($2).append($3); } ; +name_list: + name { $$ = Node("NameList").append($1) } + | name_list ',' name { $$ = $1.append($3) } +; + +trait_adaptations: + ';' { $$ = Node(""); } + | '{' '}' { $$ = Node(""); } + | '{' trait_adaptation_list '}' { $$ = $2; } +; + +trait_adaptation_list: + trait_adaptation { $$ = Node("TraitAdaptionList").append($1) } + | trait_adaptation_list trait_adaptation { $$ = $1.append($2) } +; + +trait_adaptation: + trait_precedence ';' { $$ = $1; } + | trait_alias ';' { $$ = $1; } +; + +trait_precedence: + absolute_trait_method_reference T_INSTEADOF name_list + { $$ = Node("TraitPrecedence").append($1).append($3) } +; + +trait_alias: + trait_method_reference T_AS T_STRING { $$ = $1.append(Node("as").attribute("value", $3)); } + | trait_method_reference T_AS reserved_non_modifiers + { $$ = $1.append(Node("as").append(Node("reservedNonModifiers"))); } + | trait_method_reference T_AS member_modifier identifier + { $$ = $1.append($3).append($4); } + | trait_method_reference T_AS member_modifier { $$ = $1.append($3); } +; +trait_method_reference: + identifier { $$ = Node("TraitMethodRef").append($1); } + | absolute_trait_method_reference { $$ = $1; } +; + +absolute_trait_method_reference: + name T_PAAMAYIM_NEKUDOTAYIM identifier { $$ = Node("TraitMethodRef").append($1).append($3) } + variable_modifiers: non_empty_member_modifiers { $$ = $1; } | T_VAR { $$ = Node("VarMemberModifier") } @@ -815,8 +866,13 @@ simple_variable: const src = `