From 94187758745c381838fb188d544acb78511f7864 Mon Sep 17 00:00:00 2001 From: vadim Date: Thu, 30 Nov 2017 20:36:10 +0200 Subject: [PATCH] parse new --- parser.go | 4544 +++++++++++++++++++++++++++-------------------------- parser.y | 49 +- 2 files changed, 2386 insertions(+), 2207 deletions(-) diff --git a/parser.go b/parser.go index 5fa7b46..79305f9 100644 --- a/parser.go +++ b/parser.go @@ -367,9 +367,10 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:1159 +//line parser.y:1203 const src = ` callable_expr %type function_call %type member_name +%type anonymous_class +%type new_expr +%type ctor_arguments +%type class_name_reference +%type new_variable %% @@ -566,6 +571,28 @@ non_empty_for_exprs: | expr { $$ = Node("ExpressionList").append($1) } ; +anonymous_class: + T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' + { + $$ = Node("AnonymousClass"). + attribute("name", $1). + append($2). + append($3). + append($4). + append($6); + } +; + +new_expr: + T_NEW class_name_reference ctor_arguments { $$ = Node("New").append($2).append($3) } + | T_NEW anonymous_class { $$ = Node("New").append($2) } +; + +ctor_arguments: + /* empty */ { $$ = Node("ArgumentList") } + | argument_list { $$ = $1; } +; + switch_case_list: '{' case_list '}' { $$ = $2; } | '{' ';' case_list '}' { $$ = $3; } @@ -972,12 +999,14 @@ expr_without_variable: | expr T_IS_NOT_IDENTICAL expr { $$ = Node("NotIdentical").append($1).append($3) } | expr T_IS_EQUAL expr { $$ = Node("Equal").append($1).append($3) } | expr T_IS_NOT_EQUAL expr { $$ = Node("NotEqual").append($1).append($3) } - | expr T_SPACESHIP expr { $$ = Node("Spaceship").append($1).append($3) } + | expr T_SPACESHIP expr { $$ = Node("Spaceship").append($1).append($3); } | expr '<' expr { $$ = Node("Smaller").append($1).append($3) } | expr T_IS_SMALLER_OR_EQUAL expr { $$ = Node("SmallerOrEqual").append($1).append($3) } | expr '>' expr { $$ = Node("Greater").append($1).append($3) } | expr T_IS_GREATER_OR_EQUAL expr { $$ = Node("GreaterOrEqual").append($1).append($3) } + | expr T_INSTANCEOF class_name_reference { $$ = Node("InstanceOf").append($1).append($3) } | '(' expr ')' { $$ = $2; } + | new_expr { $$ = $1; } | expr '?' expr ':' expr { $$ = Node("Ternary").append($1).append($3).append($5); } | expr '?' ':' expr { $$ = Node("Ternary").append($1).append($4); } | expr T_COALESCE expr { $$ = Node("Coalesce").append($1).append($3); } @@ -1059,6 +1088,11 @@ class_name: | name { $$ = $1; } ; +class_name_reference: + class_name { $$ = $1; } + | new_variable { $$ = $1; } +; + variable_class_name: dereferencable { $$ = $1; } ; @@ -1153,13 +1187,24 @@ static_member: | variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable { $$ = Node("StaticProp").append($1).append($3) } ; +new_variable: + simple_variable { $$ = $1 } + | new_variable '[' optional_expr ']' { $$ = Node("Dim").append($1).append($3) } + | new_variable '{' expr '}' { $$ = Node("Dim").append($1).append($3) } + | new_variable T_OBJECT_OPERATOR property_name { $$ = Node("Property").append($1).append($3) } + | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable + { $$ = Node("StaticProperty").append($1).append($3) } + | new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable + { $$ = Node("StaticProperty").append($1).append($3) } +; ///////////////////////////////////////////////////////////////////////// %% const src = `