parse closure
This commit is contained in:
parent
9edffc663e
commit
b6a04d75aa
55
parser.y
55
parser.y
@ -308,6 +308,11 @@ func (n node) attribute(key string, value string) node {
|
||||
%type <node> internal_functions_in_yacc
|
||||
%type <node> isset_variables
|
||||
%type <node> isset_variable
|
||||
%type <node> exit_expr
|
||||
%type <node> backticks_expr
|
||||
%type <node> lexical_vars
|
||||
%type <node> lexical_var_list
|
||||
%type <node> 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 = `<?php
|
||||
isset($a, $b);
|
||||
$a = static function($a) use ($b) {
|
||||
|
||||
};
|
||||
`
|
||||
|
||||
func main() {
|
||||
|
Loading…
Reference in New Issue
Block a user