parse class properties

This commit is contained in:
vadim 2017-11-29 16:21:44 +02:00
parent a14253c7b2
commit f15e67119d
2 changed files with 933 additions and 764 deletions

1641
parser.go

File diff suppressed because it is too large Load Diff

View File

@ -229,6 +229,13 @@ func (n node) attribute(key string, value string) node {
%type <node> catch_list %type <node> catch_list
%type <node> catch_name_list %type <node> catch_name_list
%type <node> finally_statement %type <node> finally_statement
%type <node> class_statement_list
%type <node> class_statement
%type <node> variable_modifiers
%type <node> non_empty_member_modifiers
%type <node> member_modifier
%type <node> property_list
%type <node> property
%% %%
@ -557,9 +564,11 @@ possible_comma:
; ;
class_declaration_statement: class_declaration_statement:
class_modifiers T_CLASS T_STRING '{' '}' { $$ = $1.attribute("name", $3) } class_modifiers T_CLASS T_STRING '{' class_statement_list '}'
| T_CLASS T_STRING '{' '}' { $$ = Node("Class").attribute("name", $2) } { $$ = $1.attribute("name", $3).append($5) }
| T_CLASS T_STRING '{' class_statement_list '}' { $$ = Node("Class").attribute("name", $2).append($4) }
; ;
class_modifiers: class_modifiers:
class_modifier { $$ = Node("Class").attribute($1, "true") } class_modifier { $$ = Node("Class").attribute($1, "true") }
| class_modifiers class_modifier { $$ = $1.attribute($2, "true") } | class_modifiers class_modifier { $$ = $1.attribute($2, "true") }
@ -570,6 +579,42 @@ class_modifier:
| T_FINAL { $$ = "final" } | T_FINAL { $$ = "final" }
; ;
class_statement_list:
class_statement_list class_statement { $$ = $1.append($2) }
| /* empty */ { $$ = Node("Stmt") }
;
class_statement:
variable_modifiers property_list ';' { $$ = $2.append($1) }
;
variable_modifiers:
non_empty_member_modifiers { $$ = $1; }
| T_VAR { $$ = Node("VarMemberModifier") }
;
non_empty_member_modifiers:
member_modifier { $$ = $1; }
| non_empty_member_modifiers member_modifier { $$ = $1.append($2) }
;
member_modifier:
T_PUBLIC { $$ = Node("PublicMemberModifier"); }
| T_PROTECTED { $$ = Node("ProtectedMemberModifier"); }
| T_PRIVATE { $$ = Node("PrivateMemberModifier"); }
| T_STATIC { $$ = Node("StaticMemberModifier"); }
| T_ABSTRACT { $$ = Node("AbstractMemberModifier"); }
| T_FINAL { $$ = Node("FinalMemberModifier"); }
;
property_list:
property_list ',' property { $$ = $1.append($3) }
| property { $$ = Node("PropertyList").append($1) }
;
property:
T_VARIABLE { $$ = Node("Property").attribute("name", $1) }
| T_VARIABLE '=' expr { $$ = Node("Property").attribute("name", $1).append(Node("Default").append($3)) }
;
function_declaration_statement: function_declaration_statement:
T_FUNCTION returns_ref T_STRING '(' parameter_list ')' return_type '{' inner_statement_list '}' T_FUNCTION returns_ref T_STRING '(' parameter_list ')' return_type '{' inner_statement_list '}'
{ {
@ -752,9 +797,10 @@ simple_variable:
const src = `<?php const src = `<?php
throw $exception; abstract class test {
goto test; public static $a ,$b = $c;
test: }
` `
func main() { func main() {