mirror of
https://github.com/phabelio/PHP-Parser.git
synced 2024-11-27 04:24:43 +01:00
Allow expressions in list()
Similar to the previous commit: list() syntactically accepts any expression and non-variables are compile-time errors. The special case of ($a) ends up being legal by accident.
This commit is contained in:
parent
9dda080a9d
commit
568236a305
@ -954,22 +954,7 @@ property_name:
|
|||||||
;
|
;
|
||||||
|
|
||||||
list_expr:
|
list_expr:
|
||||||
T_LIST '(' list_expr_elements ')' { $$ = Expr\List_[$3]; }
|
T_LIST '(' inner_array_pair_list ')' { $$ = Expr\List_[$3]; }
|
||||||
;
|
|
||||||
|
|
||||||
list_expr_elements:
|
|
||||||
list_expr_elements ',' list_expr_element { push($1, $3); }
|
|
||||||
| list_expr_element { init($1); }
|
|
||||||
;
|
|
||||||
|
|
||||||
list_expr_element:
|
|
||||||
variable { $$ = Expr\ArrayItem[$1, null, false]; }
|
|
||||||
| '&' variable { $$ = Expr\ArrayItem[$2, null, true]; }
|
|
||||||
| list_expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
|
||||||
| expr T_DOUBLE_ARROW variable { $$ = Expr\ArrayItem[$3, $1, false]; }
|
|
||||||
| expr T_DOUBLE_ARROW '&' variable { $$ = Expr\ArrayItem[$4, $1, true]; }
|
|
||||||
| expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; }
|
|
||||||
| /* empty */ { $$ = null; }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
array_pair_list:
|
array_pair_list:
|
||||||
@ -989,10 +974,12 @@ inner_array_pair_list:
|
|||||||
;
|
;
|
||||||
|
|
||||||
array_pair:
|
array_pair:
|
||||||
expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; }
|
expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
||||||
| expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
|
||||||
| expr T_DOUBLE_ARROW '&' variable { $$ = Expr\ArrayItem[$4, $1, true]; }
|
|
||||||
| '&' variable { $$ = Expr\ArrayItem[$2, null, true]; }
|
| '&' variable { $$ = Expr\ArrayItem[$2, null, true]; }
|
||||||
|
| list_expr { $$ = Expr\ArrayItem[$1, null, false]; }
|
||||||
|
| expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; }
|
||||||
|
| expr T_DOUBLE_ARROW '&' variable { $$ = Expr\ArrayItem[$4, $1, true]; }
|
||||||
|
| expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; }
|
||||||
| T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; }
|
| T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; }
|
||||||
| /* empty */ { $$ = null; }
|
| /* empty */ { $$ = null; }
|
||||||
;
|
;
|
||||||
|
File diff suppressed because it is too large
Load Diff
81
test/code/parser/expr/exprInList.test
Normal file
81
test/code/parser/expr/exprInList.test
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
Expressions in list()
|
||||||
|
-----
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// This is legal.
|
||||||
|
list(($a), ((($b)))) = $x;
|
||||||
|
// This is illegal, but not a syntax error.
|
||||||
|
list(1 + 1) = $x;
|
||||||
|
-----
|
||||||
|
!!php7
|
||||||
|
array(
|
||||||
|
0: Stmt_Expression(
|
||||||
|
expr: Expr_Assign(
|
||||||
|
var: Expr_List(
|
||||||
|
items: array(
|
||||||
|
0: Expr_ArrayItem(
|
||||||
|
key: null
|
||||||
|
value: Expr_Variable(
|
||||||
|
name: a
|
||||||
|
)
|
||||||
|
byRef: false
|
||||||
|
unpack: false
|
||||||
|
)
|
||||||
|
1: Expr_ArrayItem(
|
||||||
|
key: null
|
||||||
|
value: Expr_Variable(
|
||||||
|
name: b
|
||||||
|
)
|
||||||
|
byRef: false
|
||||||
|
unpack: false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is legal.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
expr: Expr_Variable(
|
||||||
|
name: x
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is legal.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is legal.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
1: Stmt_Expression(
|
||||||
|
expr: Expr_Assign(
|
||||||
|
var: Expr_List(
|
||||||
|
items: array(
|
||||||
|
0: Expr_ArrayItem(
|
||||||
|
key: null
|
||||||
|
value: Expr_BinaryOp_Plus(
|
||||||
|
left: Scalar_LNumber(
|
||||||
|
value: 1
|
||||||
|
)
|
||||||
|
right: Scalar_LNumber(
|
||||||
|
value: 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
byRef: false
|
||||||
|
unpack: false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is illegal, but not a syntax error.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
expr: Expr_Variable(
|
||||||
|
name: x
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is illegal, but not a syntax error.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
comments: array(
|
||||||
|
0: // This is illegal, but not a syntax error.
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user