From 36d0cf482352dffb573fad4c178417135139fcea Mon Sep 17 00:00:00 2001 From: z7zmey Date: Tue, 26 Jun 2018 23:49:00 +0300 Subject: [PATCH] use empty *expr.ArrayItem to represent missed a list and array items. --- node/expr/t_array_test.go | 2 +- node/expr/t_list_test.go | 8 +-- node/expr/t_short_array_test.go | 2 +- php5/php5.go | 15 +++--- php5/php5.y | 12 ++--- php5/php5_test.go | 4 +- php7/php7.go | 94 +++++++++++++++++---------------- php7/php7.y | 22 ++++---- php7/php7_test.go | 4 +- 9 files changed, 83 insertions(+), 80 deletions(-) diff --git a/node/expr/t_array_test.go b/node/expr/t_array_test.go index 1c9bcf2..5b482c2 100644 --- a/node/expr/t_array_test.go +++ b/node/expr/t_array_test.go @@ -202,7 +202,7 @@ func TestArrayItems(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, }, diff --git a/node/expr/t_list_test.go b/node/expr/t_list_test.go index f03ac79..365912d 100644 --- a/node/expr/t_list_test.go +++ b/node/expr/t_list_test.go @@ -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{ diff --git a/node/expr/t_short_array_test.go b/node/expr/t_short_array_test.go index 85c7663..f4617ac 100644 --- a/node/expr/t_short_array_test.go +++ b/node/expr/t_short_array_test.go @@ -202,7 +202,7 @@ func TestShortArrayItems(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, }, diff --git a/php5/php5.go b/php5/php5.go index c405b0c..d733f91 100644 --- a/php5/php5.go +++ b/php5/php5.go @@ -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 diff --git a/php5/php5.y b/php5/php5.y index 7b86c9d..ac1ef60 100644 --- a/php5/php5.y +++ b/php5/php5.y @@ -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 diff --git a/php5/php5_test.go b/php5/php5_test.go index 125003c..9320288 100644 --- a/php5/php5_test.go +++ b/php5/php5_test.go @@ -8216,7 +8216,7 @@ func TestPhp5(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, }, @@ -11019,7 +11019,7 @@ func TestPhp5(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, }, diff --git a/php7/php7.go b/php7/php7.go index 4ffbf20..149e7de 100644 --- a/php7/php7.go +++ b/php7/php7.go @@ -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 diff --git a/php7/php7.y b/php7/php7.y index f6aa803..3d50c00 100644 --- a/php7/php7.y +++ b/php7/php7.y @@ -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) } diff --git a/php7/php7_test.go b/php7/php7_test.go index 7a2380e..8028ec9 100644 --- a/php7/php7_test.go +++ b/php7/php7_test.go @@ -9034,7 +9034,7 @@ func TestPhp7(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, }, @@ -11169,7 +11169,7 @@ func TestPhp7(t *testing.T) { }, }, }, - nil, + &expr.ArrayItem{}, }, }, },