use empty *expr.ArrayItem to represent missed a list and array items.

This commit is contained in:
z7zmey 2018-06-26 23:49:00 +03:00
parent b62cb4359b
commit 36d0cf4823
9 changed files with 83 additions and 80 deletions

View File

@ -202,7 +202,7 @@ func TestArrayItems(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},

View File

@ -420,7 +420,7 @@ func TestListEmptyItem(t *testing.T) {
EndPos: 13,
},
Items: []node.Node{
nil,
&expr.ArrayItem{},
&expr.ArrayItem{
Position: &position.Position{
StartLine: 1,
@ -514,8 +514,8 @@ func TestListEmptyItems(t *testing.T) {
EndPos: 17,
},
Items: []node.Node{
nil,
nil,
&expr.ArrayItem{},
&expr.ArrayItem{},
&expr.ArrayItem{
Position: &position.Position{
StartLine: 1,
@ -541,7 +541,7 @@ func TestListEmptyItems(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
Expression: &expr.Variable{

View File

@ -202,7 +202,7 @@ func TestShortArrayItems(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},

View File

@ -347,6 +347,7 @@ const yyErrCode = 2
const yyInitialStackSize = 16
//line php5/php5.y:6795
type simpleIndirectReference struct {
all []*expr.Variable
last *expr.Variable
@ -8741,15 +8742,15 @@ yydefault:
//line php5/php5.y:6190
{
if len(yyDollar[1].list) == 0 {
yyDollar[1].list = []node.Node{nil}
yyDollar[1].list = []node.Node{expr.NewArrayItem(nil, nil)}
}
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
// save comments
if lastNode(yyDollar[1].list) != nil {
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
}
// if lastNode($1) != nil {
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
// }
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
@ -8757,7 +8758,7 @@ yydefault:
yyDollar = yyS[yypt-1 : yypt+1]
//line php5/php5.y:6205
{
if yyDollar[1].node == nil {
if yyDollar[1].node.(*expr.ArrayItem).Key == nil && yyDollar[1].node.(*expr.ArrayItem).Val == nil {
yyVAL.list = []node.Node{}
} else {
yyVAL.list = []node.Node{yyDollar[1].node}
@ -8798,7 +8799,7 @@ yydefault:
yyDollar = yyS[yypt-0 : yypt+1]
//line php5/php5.y:6244
{
yyVAL.node = nil
yyVAL.node = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
@ -8817,7 +8818,7 @@ yydefault:
yyVAL.list = yyDollar[1].list
if yyDollar[2].token != nil {
yyVAL.list = append(yyDollar[1].list, nil)
yyVAL.list = append(yyDollar[1].list, expr.NewArrayItem(nil, nil))
}
// save comments

View File

@ -6189,21 +6189,19 @@ assignment_list:
assignment_list ',' assignment_list_element
{
if len($1) == 0 {
$1 = []node.Node{nil}
$1 = []node.Node{expr.NewArrayItem(nil, nil)}
}
$$ = append($1, $3)
// save comments
if lastNode($1) != nil {
lastNode($1).AddComments($2.Comments, comment.CommaToken)
}
lastNode($1).AddComments($2.Comments, comment.CommaToken)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
| assignment_list_element
{
if $1 == nil {
if $1.(*expr.ArrayItem).Key == nil && $1.(*expr.ArrayItem).Val == nil {
$$ = []node.Node{}
} else {
$$ = []node.Node{$1}
@ -6242,7 +6240,7 @@ assignment_list_element:
}
| /* empty */
{
$$ = nil
$$ = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
@ -6261,7 +6259,7 @@ array_pair_list:
$$ = $1
if $2 != nil {
$$ = append($1, nil)
$$ = append($1, expr.NewArrayItem(nil, nil))
}
// save comments

View File

@ -8216,7 +8216,7 @@ func TestPhp5(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},
@ -11019,7 +11019,7 @@ func TestPhp5(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},

View File

@ -346,7 +346,7 @@ const yyEofCode = 1
const yyErrCode = 2
const yyInitialStackSize = 16
//line php7/php7.y:5348
//line php7/php7.y:5350
//line yacctab:1
var yyExca = [...]int{
@ -7517,25 +7517,21 @@ yydefault:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4861
{
if len(yyDollar[1].list) == 1 && yyDollar[1].list[0] == nil {
yyVAL.list = yyDollar[1].list[:0]
} else {
yyVAL.list = yyDollar[1].list
}
yyVAL.list = yyDollar[1].list
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
case 455:
yyDollar = yyS[yypt-0 : yypt+1]
//line php7/php7.y:4874
//line php7/php7.y:4870
{
yyVAL.node = nil
yyVAL.node = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
case 456:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4880
//line php7/php7.y:4876
{
yyVAL.node = yyDollar[1].node
@ -7543,28 +7539,34 @@ yydefault:
}
case 457:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:4889
//line php7/php7.y:4885
{
if len(yyDollar[1].list) == 0 {
yyDollar[1].list = []node.Node{expr.NewArrayItem(nil, nil)}
}
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
// save comments
if lastNode(yyDollar[1].list) != nil {
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
}
lastNode(yyDollar[1].list).AddComments(yyDollar[2].token.Comments, comment.CommaToken)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
case 458:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4900
//line php7/php7.y:4898
{
yyVAL.list = []node.Node{yyDollar[1].node}
if yyDollar[1].node.(*expr.ArrayItem).Key == nil && yyDollar[1].node.(*expr.ArrayItem).Val == nil {
yyVAL.list = []node.Node{}
} else {
yyVAL.list = []node.Node{yyDollar[1].node}
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
case 459:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:4909
//line php7/php7.y:4911
{
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, yyDollar[3].node)
@ -7578,7 +7580,7 @@ yydefault:
}
case 460:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4921
//line php7/php7.y:4923
{
yyVAL.node = expr.NewArrayItem(nil, yyDollar[1].node)
@ -7589,7 +7591,7 @@ yydefault:
}
case 461:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4930
//line php7/php7.y:4932
{
reference := expr.NewReference(yyDollar[4].node)
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, reference)
@ -7606,7 +7608,7 @@ yydefault:
}
case 462:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4945
//line php7/php7.y:4947
{
reference := expr.NewReference(yyDollar[2].node)
yyVAL.node = expr.NewArrayItem(nil, reference)
@ -7622,7 +7624,7 @@ yydefault:
}
case 463:
yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:4959
//line php7/php7.y:4961
{
// TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[5].list)
@ -7642,7 +7644,7 @@ yydefault:
}
case 464:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4977
//line php7/php7.y:4979
{
// TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[3].list)
@ -7661,7 +7663,7 @@ yydefault:
}
case 465:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4997
//line php7/php7.y:4999
{
yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
@ -7669,7 +7671,7 @@ yydefault:
}
case 466:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5003
//line php7/php7.y:5005
{
encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value)
yyVAL.list = append(yyDollar[1].list, encapsed)
@ -7684,7 +7686,7 @@ yydefault:
}
case 467:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5016
//line php7/php7.y:5018
{
yyVAL.list = []node.Node{yyDollar[1].node}
@ -7692,7 +7694,7 @@ yydefault:
}
case 468:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5022
//line php7/php7.y:5024
{
encapsed := scalar.NewEncapsedStringPart(yyDollar[1].token.Value)
yyVAL.list = []node.Node{encapsed, yyDollar[2].node}
@ -7707,7 +7709,7 @@ yydefault:
}
case 469:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5038
//line php7/php7.y:5040
{
name := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(name)
@ -7723,7 +7725,7 @@ yydefault:
}
case 470:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5052
//line php7/php7.y:5054
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier)
@ -7743,7 +7745,7 @@ yydefault:
}
case 471:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5070
//line php7/php7.y:5072
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier)
@ -7765,7 +7767,7 @@ yydefault:
}
case 472:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5090
//line php7/php7.y:5092
{
yyVAL.node = expr.NewVariable(yyDollar[2].node)
@ -7780,7 +7782,7 @@ yydefault:
}
case 473:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5103
//line php7/php7.y:5105
{
name := node.NewIdentifier(yyDollar[2].token.Value)
yyVAL.node = expr.NewVariable(name)
@ -7798,7 +7800,7 @@ yydefault:
}
case 474:
yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:5119
//line php7/php7.y:5121
{
identifier := node.NewIdentifier(yyDollar[2].token.Value)
variable := expr.NewVariable(identifier)
@ -7820,7 +7822,7 @@ yydefault:
}
case 475:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5139
//line php7/php7.y:5141
{
yyVAL.node = yyDollar[2].node
@ -7828,7 +7830,7 @@ yydefault:
}
case 476:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5148
//line php7/php7.y:5150
{
yyVAL.node = scalar.NewString(yyDollar[1].token.Value)
@ -7842,7 +7844,7 @@ yydefault:
}
case 477:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5160
//line php7/php7.y:5162
{
// TODO: add option to handle 64 bit integer
if _, err := strconv.Atoi(yyDollar[1].token.Value); err == nil {
@ -7861,7 +7863,7 @@ yydefault:
}
case 478:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5177
//line php7/php7.y:5179
{
var lnumber *scalar.Lnumber
// TODO: add option to handle 64 bit integer
@ -7894,7 +7896,7 @@ yydefault:
}
case 479:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5208
//line php7/php7.y:5210
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(identifier)
@ -7910,7 +7912,7 @@ yydefault:
}
case 480:
yyDollar = yyS[yypt-5 : yypt+1]
//line php7/php7.y:5225
//line php7/php7.y:5227
{
yyVAL.node = expr.NewIsset(yyDollar[3].list)
@ -7929,7 +7931,7 @@ yydefault:
}
case 481:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5242
//line php7/php7.y:5244
{
yyVAL.node = expr.NewEmpty(yyDollar[3].node)
@ -7945,7 +7947,7 @@ yydefault:
}
case 482:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5256
//line php7/php7.y:5258
{
yyVAL.node = expr.NewInclude(yyDollar[2].node)
@ -7959,7 +7961,7 @@ yydefault:
}
case 483:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5268
//line php7/php7.y:5270
{
yyVAL.node = expr.NewIncludeOnce(yyDollar[2].node)
@ -7973,7 +7975,7 @@ yydefault:
}
case 484:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5280
//line php7/php7.y:5282
{
yyVAL.node = expr.NewEval(yyDollar[3].node)
@ -7989,7 +7991,7 @@ yydefault:
}
case 485:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5294
//line php7/php7.y:5296
{
yyVAL.node = expr.NewRequire(yyDollar[2].node)
@ -8003,7 +8005,7 @@ yydefault:
}
case 486:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5306
//line php7/php7.y:5308
{
yyVAL.node = expr.NewRequireOnce(yyDollar[2].node)
@ -8017,7 +8019,7 @@ yydefault:
}
case 487:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5321
//line php7/php7.y:5323
{
yyVAL.list = []node.Node{yyDollar[1].node}
@ -8025,7 +8027,7 @@ yydefault:
}
case 488:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5327
//line php7/php7.y:5329
{
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
@ -8036,7 +8038,7 @@ yydefault:
}
case 489:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5339
//line php7/php7.y:5341
{
yyVAL.node = yyDollar[1].node

View File

@ -4859,11 +4859,7 @@ property_name:
array_pair_list:
non_empty_array_pair_list
{
if (len($1) == 1 && $1[0] == nil) {
$$ = $1[:0]
} else {
$$ = $1
}
$$ = $1
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
@ -4872,7 +4868,7 @@ array_pair_list:
possible_array_pair:
/* empty */
{
$$ = nil
$$ = expr.NewArrayItem(nil, nil)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
@ -4887,18 +4883,24 @@ possible_array_pair:
non_empty_array_pair_list:
non_empty_array_pair_list ',' possible_array_pair
{
if len($1) == 0 {
$1 = []node.Node{expr.NewArrayItem(nil, nil)}
}
$$ = append($1, $3)
// save comments
if lastNode($1) != nil {
lastNode($1).AddComments($2.Comments, comment.CommaToken)
}
lastNode($1).AddComments($2.Comments, comment.CommaToken)
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
| possible_array_pair
{
$$ = []node.Node{$1}
if $1.(*expr.ArrayItem).Key == nil && $1.(*expr.ArrayItem).Val == nil {
$$ = []node.Node{}
} else {
$$ = []node.Node{$1}
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}

View File

@ -9034,7 +9034,7 @@ func TestPhp7(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},
@ -11169,7 +11169,7 @@ func TestPhp7(t *testing.T) {
},
},
},
nil,
&expr.ArrayItem{},
},
},
},