From b6a04d75aae7065d145e08cc915e48c20db5358c Mon Sep 17 00:00:00 2001 From: vadim Date: Thu, 30 Nov 2017 21:14:26 +0200 Subject: [PATCH] parse closure --- parser.go | 3775 ++++++++++++++++++++++++++++------------------------- parser.y | 55 +- 2 files changed, 2025 insertions(+), 1805 deletions(-) diff --git a/parser.go b/parser.go index be2c2f2..18d8d20 100644 --- a/parser.go +++ b/parser.go @@ -358,6 +358,7 @@ var yyToknames = [...]string{ "'{'", "'}'", "']'", + "'`'", "'\"'", "'$'", } @@ -367,9 +368,11 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:1220 +//line parser.y:1271 const src = ` internal_functions_in_yacc %type isset_variables %type isset_variable +%type exit_expr +%type backticks_expr +%type lexical_vars +%type lexical_var_list +%type lexical_var %% @@ -1021,13 +1026,48 @@ expr_without_variable: | T_OBJECT_CAST expr { $$ = Node("CastObject").append($2); } | T_BOOL_CAST expr { $$ = Node("CastBool").append($2); } | T_UNSET_CAST expr { $$ = Node("CastUnset").append($2); } + | T_EXIT exit_expr { $$ = Node("Exit").append($2); } | '@' expr { $$ = Node("Silence").append($2); } | scalar { $$ = $1; } + | '`' backticks_expr '`' { $$ = Node("ShellExec").append($2) } | T_PRINT expr { $$ = Node("Print").append($2); } | T_YIELD { $$ = Node("Yield"); } | T_YIELD expr { $$ = Node("Yield").append($2); } | T_YIELD expr T_DOUBLE_ARROW expr { $$ = Node("Yield").append($2).append($4); } | T_YIELD_FROM expr { $$ = Node("YieldFrom").append($2); } + | T_FUNCTION returns_ref '(' parameter_list ')' lexical_vars return_type '{' inner_statement_list '}' + { + $$ = Node("Closure"). + attribute("returns_ref", $2). + append($4). + append($6). + append($7). + append($9); + } + | T_STATIC T_FUNCTION returns_ref '(' parameter_list ')' lexical_vars return_type '{' inner_statement_list '}' + { + $$ = Node("StaticClosure"). + attribute("returns_ref", $3). + append($5). + append($7). + append($8). + append($10); + } +; + +lexical_vars: + /* empty */ { $$ = Node("") } + | T_USE '(' lexical_var_list ')' { $$ = $3; } +; + +lexical_var_list: + lexical_var_list ',' lexical_var { $$ = $1.append($3) } + | lexical_var { $$ = Node("ClosureUses").append($1) } +; + +lexical_var: + T_VARIABLE { $$ = Node("Variable").attribute("value", $1) } + | '&' T_VARIABLE { $$ = Node("Variable").attribute("value", $2).attribute("ref", "true") } ; scalar: @@ -1110,6 +1150,17 @@ class_name_reference: | new_variable { $$ = $1; } ; +exit_expr: + /* empty */ { $$ = Node("") } + | '(' optional_expr ')' { $$ = $2; } +; + +backticks_expr: + /* empty */ { $$ = Node("EmptyBackticks") } + | T_ENCAPSED_AND_WHITESPACE { $$ = Node("String").attribute("value", $1) } + | encaps_list { $$ = $1; } +; + variable_class_name: dereferencable { $$ = $1; } ; @@ -1220,7 +1271,9 @@ new_variable: %% const src = `