From f15e67119d737e05646f92c25db707ecf730c3f0 Mon Sep 17 00:00:00 2001 From: vadim Date: Wed, 29 Nov 2017 16:21:44 +0200 Subject: [PATCH] parse class properties --- parser.go | 1641 ++++++++++++++++++++++++++++------------------------- parser.y | 56 +- 2 files changed, 933 insertions(+), 764 deletions(-) diff --git a/parser.go b/parser.go index a01add7..f922764 100644 --- a/parser.go +++ b/parser.go @@ -366,12 +366,13 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:751 +//line parser.y:796 const src = ` catch_list %type catch_name_list %type finally_statement +%type class_statement_list +%type class_statement +%type variable_modifiers +%type non_empty_member_modifiers +%type member_modifier +%type property_list +%type property %% @@ -557,9 +564,11 @@ possible_comma: ; class_declaration_statement: - class_modifiers T_CLASS T_STRING '{' '}' { $$ = $1.attribute("name", $3) } - | T_CLASS T_STRING '{' '}' { $$ = Node("Class").attribute("name", $2) } + class_modifiers T_CLASS T_STRING '{' class_statement_list '}' + { $$ = $1.attribute("name", $3).append($5) } + | T_CLASS T_STRING '{' class_statement_list '}' { $$ = Node("Class").attribute("name", $2).append($4) } ; + class_modifiers: class_modifier { $$ = Node("Class").attribute($1, "true") } | class_modifiers class_modifier { $$ = $1.attribute($2, "true") } @@ -570,6 +579,42 @@ class_modifier: | 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: T_FUNCTION returns_ref T_STRING '(' parameter_list ')' return_type '{' inner_statement_list '}' { @@ -752,9 +797,10 @@ simple_variable: const src = `