Repository: VKCOM/noverify
Pull request #634 (2020-08-05 20:13:44)

linter: added assign null coalesce processing in parser


Patch:
diff --git a/src/php/parser/node/expr/assign/n_coalesce.go b/src/php/parser/node/expr/assign/n_coalesce.go
new file mode 100644
index 0000000..e7a75d0
--- /dev/null
+++ b/src/php/parser/node/expr/assign/n_coalesce.go
@@ -0,0 +1,57 @@
+package assign
+
+import (
+	"github.com/VKCOM/noverify/src/php/parser/freefloating"
+	"github.com/VKCOM/noverify/src/php/parser/node"
+	"github.com/VKCOM/noverify/src/php/parser/position"
+	"github.com/VKCOM/noverify/src/php/parser/walker"
+)
+
+// Coalesce node
+type Coalesce struct {
+	FreeFloating freefloating.Collection
+	Position     *position.Position
+	Variable     node.Node
+	Expression   node.Node
+}
+
+// NewCoalesce node constructor
+func NewCoalesce(Variable node.Node, Expression node.Node) *Coalesce {
+	return &Coalesce{
+		FreeFloating: nil,
+		Variable:     Variable,
+		Expression:   Expression,
+	}
+}
+
+// SetPosition sets node position
+func (n *Coalesce) SetPosition(p *position.Position) {
+	n.Position = p
+}
+
+// GetPosition returns node positions
+func (n *Coalesce) GetPosition() *position.Position {
+	return n.Position
+}
+
+func (n *Coalesce) GetFreeFloating() *freefloating.Collection {
+	return &n.FreeFloating
+}
+
+// Walk traverses nodes
+// Walk is invoked recursively until v.EnterNode returns true
+func (n *Coalesce) Walk(v walker.Visitor) {
+	if v.EnterNode(n) == false {
+		return
+	}
+
+	if n.Variable != nil {
+		n.Variable.Walk(v)
+	}
+
+	if n.Expression != nil {
+		n.Expression.Walk(v)
+	}
+
+	v.LeaveNode(n)
+}
diff --git a/src/php/parser/php7/php7.go b/src/php/parser/php7/php7.go
index 01aba5a..5a9e605 100644
--- a/src/php/parser/php7/php7.go
+++ b/src/php/parser/php7/php7.go
@@ -357,7 +357,7 @@ const yyEofCode = 1
 const yyErrCode = 2
 const yyInitialStackSize = 16
 
-//line php7.y:5661
+//line php7.y:5674
 
 //line yacctab:1
 var yyExca = [...]int{
@@ -368,46 +368,39 @@ var yyExca = [...]int{
 	1, 1,
 	-2, 0,
 	-1, 44,
-	58, 425,
-	79, 425,
-	144, 425,
-	150, 425,
-	-2, 420,
+	58, 426,
+	79, 426,
+	144, 426,
+	150, 426,
+	-2, 421,
 	-1, 48,
-	148, 428,
-	-2, 437,
+	148, 429,
+	-2, 438,
 	-1, 85,
-	58, 427,
-	79, 427,
-	144, 427,
-	148, 430,
-	150, 427,
-	-2, 415,
+	58, 428,
+	79, 428,
+	144, 428,
+	148, 431,
+	150, 428,
+	-2, 416,
 	-1, 109,
-	79, 388,
-	-2, 417,
-	-1, 231,
-	58, 425,
-	79, 425,
-	144, 425,
-	150, 425,
-	-2, 314,
-	-1, 234,
-	148, 430,
-	-2, 427,
-	-1, 237,
-	58, 425,
-	79, 425,
-	144, 425,
-	150, 425,
-	-2, 316,
-	-1, 356,
-	116, 0,
-	136, 0,
-	137, 0,
-	138, 0,
-	139, 0,
-	-2, 338,
+	79, 389,
+	-2, 418,
+	-1, 232,
+	58, 426,
+	79, 426,
+	144, 426,
+	150, 426,
+	-2, 315,
+	-1, 235,
+	148, 431,
+	-2, 428,
+	-1, 238,
+	58, 426,
+	79, 426,
+	144, 426,
+	150, 426,
+	-2, 317,
 	-1, 357,
 	116, 0,
 	136, 0,
@@ -430,10 +423,11 @@ var yyExca = [...]int{
 	139, 0,
 	-2, 341,
 	-1, 360,
-	140, 0,
-	141, 0,
-	167, 0,
-	168, 0,
+	116, 0,
+	136, 0,
+	137, 0,
+	138, 0,
+	139, 0,
 	-2, 342,
 	-1, 361,
 	140, 0,
@@ -454,270 +448,292 @@ var yyExca = [...]int{
 	168, 0,
 	-2, 345,
 	-1, 364,
+	140, 0,
+	141, 0,
+	167, 0,
+	168, 0,
+	-2, 346,
+	-1, 365,
 	116, 0,
 	136, 0,
 	137, 0,
 	138, 0,
 	139, 0,
-	-2, 346,
-	-1, 371,
+	-2, 347,
+	-1, 372,
 	149, 164,
 	160, 164,
-	-2, 425,
-	-1, 415,
-	149, 465,
-	151, 465,
-	160, 465,
-	-2, 425,
-	-1, 419,
-	58, 426,
-	79, 426,
-	144, 426,
-	148, 429,
-	150, 426,
-	-2, 348,
-	-1, 433,
-	148, 451,
-	-2, 418,
-	-1, 434,
-	148, 453,
-	-2, 443,
-	-1, 514,
-	148, 451,
+	-2, 426,
+	-1, 417,
+	149, 466,
+	151, 466,
+	160, 466,
+	-2, 426,
+	-1, 421,
+	58, 427,
+	79, 427,
+	144, 427,
+	148, 430,
+	150, 427,
+	-2, 349,
+	-1, 435,
+	148, 452,
 	-2, 419,
-	-1, 515,
-	148, 453,
+	-1, 436,
+	148, 454,
 	-2, 444,
-	-1, 532,
+	-1, 516,
+	148, 452,
+	-2, 420,
+	-1, 517,
+	148, 454,
+	-2, 445,
+	-1, 534,
 	149, 214,
 	-2, 219,
-	-1, 574,
+	-1, 576,
 	149, 214,
 	-2, 219,
-	-1, 599,
-	148, 429,
-	-2, 426,
-	-1, 665,
+	-1, 601,
+	148, 430,
+	-2, 427,
+	-1, 667,
 	149, 184,
-	-2, 425,
-	-1, 673,
+	-2, 426,
+	-1, 675,
 	149, 214,
 	-2, 219,
-	-1, 689,
-	149, 464,
-	151, 464,
-	160, 464,
-	-2, 425,
-	-1, 726,
+	-1, 691,
+	149, 465,
+	151, 465,
+	160, 465,
+	-2, 426,
+	-1, 728,
 	149, 185,
-	-2, 425,
-	-1, 742,
+	-2, 426,
+	-1, 744,
 	37, 269,
 	39, 269,
 	-2, 266,
-	-1, 756,
+	-1, 758,
 	94, 209,
 	95, 209,
 	96, 209,
 	-2, 0,
-	-1, 785,
-	149, 184,
-	-2, 425,
 	-1, 787,
+	149, 184,
+	-2, 426,
+	-1, 789,
 	149, 187,
-	-2, 399,
-	-1, 802,
+	-2, 400,
+	-1, 804,
 	94, 210,
 	95, 210,
 	96, 210,
 	-2, 0,
-	-1, 852,
+	-1, 854,
 	31, 200,
 	32, 200,
 	33, 200,
 	145, 200,
 	-2, 0,
-	-1, 884,
+	-1, 886,
 	29, 77,
 	-2, 81,
-	-1, 889,
+	-1, 891,
 	31, 199,
 	32, 199,
 	33, 199,
 	145, 199,
 	-2, 0,
-	-1, 917,
+	-1, 919,
 	149, 214,
 	-2, 219,
 }
 
 const yyPrivate = 57344
 
-const yyLast = 7722
+const yyLast = 7764
 
 var yyAct = [...]int{
-	28, 132, 761, 627, 839, 876, 862, 581, 438, 744,
-	838, 109, 781, 816, 191, 835, 631, 678, 113, 630,
-	223, 128, 140, 140, 140, 708, 646, 153, 378, 568,
-	117, 123, 664, 645, 719, 188, 536, 629, 632, 525,
-	370, 407, 380, 325, 316, 320, 225, 5, 9, 319,
-	81, 152, 8, 227, 230, 576, 85, 238, 239, 240,
-	241, 242, 139, 134, 243, 244, 245, 246, 247, 248,
-	249, 318, 252, 149, 7, 260, 261, 262, 127, 317,
-	256, 517, 6, 130, 145, 142, 143, 516, 432, 129,
-	275, 276, 872, 278, 279, 83, 869, 846, 271, 2,
-	856, 266, 687, 593, 336, 232, 232, 843, 312, 842,
-	680, 234, 234, 895, 408, 870, 107, 866, 545, 571,
-	767, 285, 337, 680, 896, 712, 107, 334, 332, 871,
-	311, 867, 305, 293, 322, 295, 338, 310, 327, 328,
-	302, 335, 333, 308, 702, 639, 309, 624, 107, 569,
-	324, 311, 560, 181, 413, 863, 339, 340, 341, 342,
-	343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
-	353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
-	363, 364, 268, 366, 368, 192, 372, 181, 304, 374,
-	44, 288, 290, 271, 603, 167, 606, 604, 704, 80,
-	787, 696, 305, 692, 390, 392, 393, 394, 395, 396,
-	397, 398, 399, 400, 401, 402, 403, 613, 298, 404,
-	140, 406, 600, 227, 146, 382, 166, 168, 169, 167,
-	170, 171, 588, 412, 417, 232, 263, 227, 928, 891,
-	824, 234, 609, 411, 386, 231, 237, 610, 409, 857,
-	165, 164, 140, 426, 221, 181, 823, 418, 286, 427,
-	166, 168, 169, 108, 140, 163, 814, 521, 803, 433,
-	514, 791, 734, 108, 526, 527, 373, 268, 528, 232,
-	180, 724, 405, 365, 706, 234, 272, 533, 522, 701,
-	537, 699, 227, 691, 662, 108, 864, 167, 170, 171,
-	172, 173, 174, 175, 177, 179, 651, 641, 287, 119,
-	232, 107, 539, 555, 420, 601, 234, 161, 165, 164,
-	592, 294, 547, 917, 550, 309, 431, 162, 166, 168,
-	169, 176, 178, 163, 831, 422, 423, 564, 605, 153,
-	220, 789, 727, 5, 9, 425, 219, 690, 8, 818,
-	817, 762, 270, 520, 513, 673, 289, 754, 523, 519,
-	181, 422, 574, 423, 423, 422, 659, 558, 567, 660,
-	7, 556, 532, 416, 119, 371, 107, 387, 6, 136,
-	385, 272, 114, 291, 548, 292, 583, 277, 584, 274,
-	565, 585, 586, 578, 273, 554, 582, 542, 235, 251,
-	222, 218, 167, 186, 185, 184, 573, 138, 137, 563,
-	591, 133, 580, 115, 227, 595, 923, 227, 562, 415,
-	389, 410, 575, 165, 164, 190, 157, 159, 158, 181,
-	932, 612, 931, 166, 168, 169, 615, 598, 163, 776,
-	777, 906, 776, 777, 136, 119, 297, 114, 296, 905,
-	429, 890, 853, 183, 180, 825, 820, 813, 108, 119,
-	594, 107, 773, 235, 434, 515, 755, 112, 723, 155,
-	156, 167, 170, 171, 172, 173, 174, 175, 177, 179,
-	722, 720, 718, 715, 818, 817, 559, 544, 541, 590,
-	182, 161, 165, 164, 388, 376, 331, 330, 329, 160,
-	299, 162, 166, 168, 169, 176, 178, 163, 847, 911,
-	111, 257, 812, 809, 614, 804, 424, 769, 116, 611,
-	140, 619, 860, 108, 540, 540, 540, 540, 859, 136,
-	805, 794, 114, 146, 790, 736, 679, 579, 187, 640,
-	421, 167, 119, 255, 636, 200, 202, 201, 235, 181,
-	198, 199, 819, 193, 623, 775, 765, 77, 116, 655,
-	327, 657, 122, 620, 307, 638, 622, 661, 550, 119,
-	550, 309, 292, 647, 909, 307, 258, 259, 674, 118,
-	518, 119, 618, 148, 650, 677, 636, 5, 9, 582,
-	307, 167, 8, 119, 688, 616, 125, 233, 126, 236,
-	78, 79, 653, 656, 265, 676, 264, 845, 108, 307,
-	663, 694, 136, 725, 7, 114, 670, 577, 292, 381,
-	232, 232, 6, 384, 907, 526, 234, 234, 119, 644,
-	119, 675, 684, 748, 749, 750, 747, 746, 745, 307,
-	537, 531, 124, 793, 553, 636, 908, 232, 282, 283,
-	257, 731, 732, 234, 549, 424, 716, 323, 710, 649,
-	643, 551, 550, 546, 700, 709, 303, 550, 550, 227,
-	713, 647, 705, 729, 46, 711, 707, 733, 698, 634,
-	635, 634, 635, 714, 301, 636, 693, 756, 757, 728,
-	836, 227, 752, 306, 798, 721, 797, 751, 136, 148,
-	136, 114, 897, 114, 735, 808, 257, 135, 106, 741,
-	150, 758, 743, 194, 636, 258, 259, 232, 617, 327,
-	648, 410, 621, 234, 119, 607, 753, 760, 227, 550,
-	131, 550, 709, 121, 647, 1, 768, 257, 766, 770,
-	763, 257, 284, 552, 771, 540, 424, 379, 786, 799,
-	257, 636, 800, 582, 795, 778, 802, 780, 784, 796,
-	371, 665, 774, 748, 749, 750, 747, 746, 745, 782,
-	633, 258, 259, 257, 636, 257, 232, 815, 280, 807,
-	254, 119, 234, 377, 197, 822, 550, 689, 196, 810,
-	806, 195, 828, 189, 829, 830, 150, 628, 811, 535,
-	524, 827, 258, 259, 861, 530, 258, 259, 125, 885,
-	126, 369, 832, 840, 529, 258, 259, 875, 852, 147,
-	834, 135, 106, 844, 821, 776, 777, 144, 326, 851,
-	779, 776, 777, 151, 837, 672, 855, 281, 258, 259,
-	258, 259, 826, 253, 38, 873, 886, 887, 882, 739,
-	742, 740, 888, 889, 224, 881, 792, 726, 383, 849,
-	652, 893, 894, 848, 930, 868, 658, 841, 782, 892,
-	899, 226, 43, 901, 42, 216, 217, 16, 15, 602,
-	882, 904, 900, 898, 269, 49, 48, 881, 204, 205,
-	206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
-	110, 50, 902, 914, 84, 82, 72, 250, 62, 267,
-	61, 880, 879, 924, 922, 918, 785, 920, 921, 582,
-	878, 925, 877, 738, 45, 730, 926, 669, 915, 636,
-	916, 929, 203, 4, 933, 89, 90, 70, 47, 94,
-	95, 36, 313, 107, 120, 27, 300, 3, 437, 112,
-	26, 18, 17, 764, 19, 703, 30, 0, 31, 0,
+	28, 132, 763, 629, 841, 878, 864, 583, 440, 746,
+	840, 109, 783, 818, 191, 837, 633, 680, 113, 632,
+	666, 128, 140, 140, 140, 710, 648, 153, 379, 570,
+	117, 123, 631, 647, 224, 188, 326, 578, 634, 538,
+	371, 527, 381, 226, 317, 721, 152, 5, 321, 320,
+	409, 9, 8, 228, 231, 145, 81, 239, 240, 241,
+	242, 243, 149, 134, 244, 245, 246, 247, 248, 249,
+	250, 319, 253, 2, 7, 261, 262, 263, 139, 318,
+	257, 85, 6, 130, 127, 519, 518, 434, 874, 871,
+	276, 277, 267, 279, 280, 129, 848, 689, 272, 858,
+	595, 142, 143, 845, 337, 844, 410, 83, 107, 313,
+	107, 233, 233, 897, 872, 868, 573, 547, 338, 682,
+	682, 286, 769, 714, 898, 704, 641, 312, 873, 869,
+	335, 306, 339, 294, 323, 296, 235, 235, 328, 329,
+	303, 626, 571, 309, 336, 107, 310, 562, 415, 865,
+	325, 192, 706, 789, 698, 181, 340, 341, 342, 343,
+	344, 345, 346, 347, 348, 349, 350, 351, 352, 353,
+	354, 355, 356, 357, 358, 359, 360, 361, 362, 363,
+	364, 365, 694, 367, 369, 333, 373, 311, 305, 375,
+	44, 615, 299, 272, 269, 289, 291, 167, 80, 334,
+	602, 312, 306, 590, 391, 393, 394, 395, 396, 397,
+	398, 399, 400, 401, 402, 403, 404, 405, 165, 164,
+	406, 140, 408, 146, 228, 383, 523, 181, 166, 168,
+	169, 414, 428, 163, 605, 419, 608, 606, 228, 264,
+	411, 233, 287, 119, 387, 232, 238, 524, 859, 611,
+	930, 893, 826, 140, 612, 108, 825, 108, 413, 816,
+	429, 222, 119, 805, 107, 140, 235, 793, 736, 167,
+	435, 516, 420, 726, 366, 528, 529, 708, 703, 530,
+	701, 693, 374, 664, 653, 273, 233, 643, 535, 269,
+	866, 539, 108, 228, 636, 637, 603, 594, 295, 407,
+	166, 168, 169, 919, 833, 271, 791, 288, 820, 819,
+	764, 235, 522, 136, 557, 729, 114, 233, 521, 692,
+	675, 290, 756, 549, 427, 552, 310, 541, 576, 560,
+	661, 422, 136, 662, 390, 114, 424, 425, 566, 558,
+	153, 534, 235, 433, 5, 418, 388, 221, 9, 8,
+	386, 236, 292, 220, 515, 278, 275, 274, 525, 252,
+	223, 181, 424, 219, 425, 425, 424, 186, 185, 569,
+	184, 7, 544, 138, 137, 372, 133, 115, 607, 6,
+	273, 293, 934, 190, 933, 635, 567, 585, 925, 586,
+	564, 550, 587, 588, 580, 908, 556, 584, 849, 565,
+	778, 779, 907, 167, 170, 171, 892, 575, 778, 779,
+	855, 108, 593, 582, 827, 822, 228, 597, 815, 228,
+	417, 412, 775, 577, 165, 164, 757, 157, 159, 158,
+	181, 725, 724, 614, 166, 168, 169, 722, 617, 163,
+	720, 119, 298, 107, 297, 717, 561, 546, 543, 389,
+	377, 431, 258, 600, 183, 180, 332, 426, 331, 596,
+	330, 300, 814, 811, 436, 517, 806, 771, 542, 119,
+	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
+	179, 743, 613, 542, 745, 820, 819, 542, 542, 913,
+	862, 182, 161, 165, 164, 592, 861, 807, 796, 792,
+	160, 738, 162, 166, 168, 169, 176, 178, 163, 681,
+	581, 136, 423, 821, 114, 187, 181, 259, 260, 77,
+	616, 777, 140, 621, 167, 256, 122, 198, 199, 193,
+	236, 767, 119, 146, 116, 750, 751, 752, 749, 748,
+	747, 642, 116, 308, 293, 148, 638, 750, 751, 752,
+	749, 748, 747, 119, 911, 308, 625, 308, 167, 119,
+	308, 657, 328, 659, 200, 202, 201, 640, 624, 663,
+	552, 308, 552, 310, 622, 649, 78, 79, 520, 119,
+	676, 887, 533, 266, 265, 258, 652, 679, 638, 5,
+	108, 584, 847, 9, 8, 727, 690, 293, 658, 795,
+	620, 618, 712, 118, 655, 551, 125, 678, 126, 646,
+	579, 555, 665, 696, 548, 677, 7, 651, 672, 382,
+	385, 645, 553, 136, 6, 307, 114, 528, 233, 233,
+	283, 284, 304, 909, 686, 910, 258, 119, 258, 107,
+	150, 426, 539, 426, 119, 112, 324, 638, 302, 531,
+	259, 260, 124, 235, 235, 233, 733, 734, 718, 135,
+	106, 148, 700, 695, 552, 135, 106, 711, 702, 552,
+	552, 228, 715, 649, 707, 731, 46, 713, 258, 735,
+	235, 709, 119, 281, 800, 716, 799, 638, 111, 758,
+	759, 838, 899, 228, 754, 636, 637, 810, 150, 753,
+	532, 259, 260, 259, 260, 730, 737, 136, 723, 125,
+	114, 126, 119, 609, 136, 194, 638, 114, 131, 619,
+	554, 328, 412, 623, 542, 233, 236, 760, 755, 762,
+	228, 552, 650, 552, 711, 380, 649, 765, 770, 258,
+	768, 772, 282, 259, 260, 121, 773, 258, 786, 378,
+	235, 801, 285, 638, 802, 584, 797, 776, 804, 197,
+	196, 798, 372, 667, 788, 1, 195, 258, 780, 189,
+	782, 784, 255, 630, 537, 234, 638, 237, 526, 817,
+	863, 809, 370, 877, 233, 147, 108, 824, 552, 691,
+	836, 812, 808, 144, 830, 327, 831, 832, 151, 839,
+	813, 674, 828, 829, 259, 260, 823, 778, 779, 235,
+	254, 38, 259, 260, 834, 842, 781, 778, 779, 741,
+	854, 744, 742, 225, 794, 846, 384, 654, 850, 932,
+	660, 853, 259, 260, 843, 227, 43, 42, 857, 16,
+	15, 604, 270, 49, 48, 110, 50, 875, 888, 889,
+	884, 84, 82, 72, 890, 891, 251, 883, 62, 728,
+	268, 851, 61, 895, 896, 882, 881, 870, 880, 879,
+	784, 894, 901, 740, 45, 903, 732, 217, 218, 671,
+	314, 120, 884, 906, 902, 900, 301, 3, 439, 883,
+	204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
+	214, 215, 216, 766, 904, 916, 705, 0, 0, 0,
+	0, 0, 0, 0, 0, 926, 924, 920, 787, 922,
+	923, 584, 0, 927, 0, 0, 0, 0, 928, 0,
+	917, 638, 918, 931, 203, 4, 935, 89, 90, 70,
+	47, 94, 95, 36, 0, 107, 0, 27, 0, 0,
+	0, 112, 26, 18, 17, 0, 19, 0, 30, 0,
+	31, 0, 0, 20, 0, 0, 0, 21, 22, 35,
+	37, 106, 13, 23, 33, 0, 0, 34, 12, 0,
+	24, 0, 29, 87, 88, 10, 39, 40, 41, 0,
+	0, 0, 0, 51, 111, 0, 103, 99, 100, 101,
+	96, 97, 743, 0, 0, 745, 0, 0, 104, 0,
+	0, 0, 0, 11, 102, 98, 114, 0, 91, 92,
+	93, 0, 0, 0, 0, 86, 53, 0, 0, 0,
+	74, 75, 25, 78, 79, 0, 0, 0, 54, 55,
+	76, 63, 64, 65, 66, 67, 68, 69, 0, 0,
+	0, 0, 0, 0, 0, 0, 750, 751, 752, 749,
+	748, 747, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 105, 73, 14, 644, 32,
+	0, 60, 0, 52, 0, 0, 0, 57, 56, 58,
+	59, 71, 108, 4, 0, 89, 90, 70, 47, 94,
+	95, 36, 867, 107, 0, 27, 0, 0, 0, 112,
+	26, 18, 17, 0, 19, 0, 30, 0, 31, 0,
 	0, 20, 0, 0, 0, 21, 22, 35, 37, 106,
 	13, 23, 33, 0, 0, 34, 12, 0, 24, 0,
 	29, 87, 88, 10, 39, 40, 41, 0, 0, 0,
 	0, 51, 111, 0, 103, 99, 100, 101, 96, 97,
-	741, 0, 0, 743, 0, 0, 104, 0, 0, 0,
+	743, 0, 0, 745, 0, 0, 104, 0, 0, 0,
 	0, 11, 102, 98, 114, 0, 91, 92, 93, 0,
 	0, 0, 0, 86, 53, 0, 0, 0, 74, 75,
 	25, 78, 79, 0, 0, 0, 54, 55, 76, 63,
 	64, 65, 66, 67, 68, 69, 0, 0, 0, 0,
-	0, 0, 0, 0, 748, 749, 750, 747, 746, 745,
+	0, 0, 0, 0, 750, 751, 752, 749, 748, 747,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 105, 73, 14, 642, 32, 0, 60,
+	0, 0, 0, 105, 73, 14, 545, 32, 0, 60,
 	0, 52, 0, 0, 0, 57, 56, 58, 59, 71,
 	108, 4, 0, 89, 90, 70, 47, 94, 95, 36,
-	865, 107, 0, 27, 0, 0, 0, 112, 26, 18,
+	835, 107, 0, 27, 0, 0, 0, 112, 26, 18,
 	17, 0, 19, 0, 30, 0, 31, 0, 0, 20,
 	0, 0, 0, 21, 22, 35, 37, 106, 13, 23,
 	33, 0, 0, 34, 12, 0, 24, 0, 29, 87,
 	88, 10, 39, 40, 41, 0, 0, 0, 0, 51,
-	111, 0, 103, 99, 100, 101, 96, 97, 741, 0,
-	0, 743, 0, 0, 104, 0, 0, 0, 0, 11,
+	111, 0, 103, 99, 100, 101, 96, 97, 743, 0,
+	0, 745, 0, 0, 104, 0, 0, 0, 0, 11,
 	102, 98, 114, 0, 91, 92, 93, 0, 0, 0,
 	0, 86, 53, 0, 0, 0, 74, 75, 25, 78,
 	79, 0, 0, 0, 54, 55, 76, 63, 64, 65,
 	66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
-	0, 0, 748, 749, 750, 747, 746, 745, 0, 0,
+	0, 0, 750, 751, 752, 749, 748, 747, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 105, 73, 14, 543, 32, 0, 60, 0, 52,
-	0, 0, 0, 57, 56, 58, 59, 71, 108, 4,
-	0, 89, 90, 70, 47, 94, 95, 36, 833, 107,
+	0, 105, 73, 14, 0, 32, 0, 60, 0, 52,
+	0, 0, 0, 57, 56, 58, 59, 71, 108, 316,
+	0, 89, 90, 70, 47, 94, 95, 36, 803, 107,
 	0, 27, 0, 0, 0, 112, 26, 18, 17, 0,
 	19, 0, 30, 0, 31, 0, 0, 20, 0, 0,
-	0, 21, 22, 35, 37, 106, 13, 23, 33, 0,
-	0, 34, 12, 0, 24, 0, 29, 87, 88, 10,
+	0, 21, 22, 35, 37, 106, 0, 23, 33, 0,
+	0, 34, 0, 0, 24, 0, 29, 87, 88, 322,
 	39, 40, 41, 0, 0, 0, 0, 51, 111, 0,
-	103, 99, 100, 101, 96, 97, 741, 0, 0, 743,
-	0, 0, 104, 0, 0, 0, 0, 11, 102, 98,
+	103, 99, 100, 101, 96, 97, 743, 0, 0, 745,
+	0, 0, 104, 0, 0, 0, 0, 136, 102, 98,
 	114, 0, 91, 92, 93, 0, 0, 0, 0, 86,
 	53, 0, 0, 0, 74, 75, 25, 78, 79, 0,
 	0, 0, 54, 55, 76, 63, 64, 65, 66, 67,
 	68, 69, 0, 0, 0, 0, 0, 0, 0, 0,
-	748, 749, 750, 747, 746, 745, 0, 0, 0, 0,
+	750, 751, 752, 749, 748, 747, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 105,
-	73, 14, 0, 32, 0, 60, 0, 52, 0, 0,
-	0, 57, 56, 58, 59, 71, 108, 315, 0, 89,
-	90, 70, 47, 94, 95, 36, 801, 107, 0, 27,
+	73, 14, 936, 32, 0, 60, 0, 52, 0, 0,
+	0, 57, 56, 58, 59, 71, 108, 316, 0, 89,
+	90, 70, 47, 94, 95, 36, 739, 107, 0, 27,
 	0, 0, 0, 112, 26, 18, 17, 0, 19, 0,
 	30, 0, 31, 0, 0, 20, 0, 0, 0, 21,
 	22, 35, 37, 106, 0, 23, 33, 0, 0, 34,
-	0, 0, 24, 0, 29, 87, 88, 321, 39, 40,
+	0, 0, 24, 0, 29, 87, 88, 322, 39, 40,
 	41, 0, 0, 0, 0, 51, 111, 0, 103, 99,
-	100, 101, 96, 97, 741, 0, 0, 743, 0, 0,
+	100, 101, 96, 97, 0, 0, 0, 0, 0, 0,
 	104, 0, 0, 0, 0, 136, 102, 98, 114, 0,
 	91, 92, 93, 0, 0, 0, 0, 86, 53, 0,
 	0, 0, 74, 75, 25, 78, 79, 0, 0, 0,
 	54, 55, 76, 63, 64, 65, 66, 67, 68, 69,
-	0, 0, 0, 0, 0, 0, 0, 0, 748, 749,
-	750, 747, 746, 745, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 105, 73, 14,
-	934, 32, 0, 60, 0, 52, 0, 0, 0, 57,
-	56, 58, 59, 71, 108, 315, 0, 89, 90, 70,
-	47, 94, 95, 36, 737, 107, 0, 27, 0, 0,
+	929, 32, 0, 60, 0, 52, 0, 0, 0, 57,
+	56, 58, 59, 71, 108, 316, 0, 89, 90, 70,
+	47, 94, 95, 36, 0, 107, 0, 27, 0, 0,
 	0, 112, 26, 18, 17, 0, 19, 0, 30, 0,
 	31, 0, 0, 20, 0, 0, 0, 21, 22, 35,
 	37, 106, 0, 23, 33, 0, 0, 34, 0, 0,
-	24, 0, 29, 87, 88, 321, 39, 40, 41, 0,
+	24, 0, 29, 87, 88, 322, 39, 40, 41, 0,
 	0, 0, 0, 51, 111, 0, 103, 99, 100, 101,
 	96, 97, 0, 0, 0, 0, 0, 0, 104, 0,
 	0, 0, 0, 136, 102, 98, 114, 0, 91, 92,
@@ -726,14 +742,14 @@ var yyAct = [...]int{
 	76, 63, 64, 65, 66, 67, 68, 69, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 105, 73, 14, 927, 32,
+	0, 0, 0, 0, 0, 105, 73, 14, 915, 32,
 	0, 60, 0, 52, 0, 0, 0, 57, 56, 58,
-	59, 71, 108, 315, 0, 89, 90, 70, 47, 94,
+	59, 71, 108, 316, 0, 89, 90, 70, 47, 94,
 	95, 36, 0, 107, 0, 27, 0, 0, 0, 112,
 	26, 18, 17, 0, 19, 0, 30, 0, 31, 0,
 	0, 20, 0, 0, 0, 21, 22, 35, 37, 106,
 	0, 23, 33, 0, 0, 34, 0, 0, 24, 0,
-	29, 87, 88, 321, 39, 40, 41, 0, 0, 0,
+	29, 87, 88, 322, 39, 40, 41, 0, 0, 0,
 	0, 51, 111, 0, 103, 99, 100, 101, 96, 97,
 	0, 0, 0, 0, 0, 0, 104, 0, 0, 0,
 	0, 136, 102, 98, 114, 0, 91, 92, 93, 0,
@@ -742,14 +758,14 @@ var yyAct = [...]int{
 	64, 65, 66, 67, 68, 69, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 105, 73, 14, 913, 32, 0, 60,
+	0, 0, 0, 105, 73, 14, 914, 32, 0, 60,
 	0, 52, 0, 0, 0, 57, 56, 58, 59, 71,
-	108, 315, 0, 89, 90, 70, 47, 94, 95, 36,
+	108, 316, 0, 89, 90, 70, 47, 94, 95, 36,
 	0, 107, 0, 27, 0, 0, 0, 112, 26, 18,
-	17, 0, 19, 0, 30, 0, 31, 0, 0, 20,
+	17, 0, 19, 912, 30, 0, 31, 0, 0, 20,
 	0, 0, 0, 21, 22, 35, 37, 106, 0, 23,
 	33, 0, 0, 34, 0, 0, 24, 0, 29, 87,
-	88, 321, 39, 40, 41, 0, 0, 0, 0, 51,
+	88, 322, 39, 40, 41, 0, 0, 0, 0, 51,
 	111, 0, 103, 99, 100, 101, 96, 97, 0, 0,
 	0, 0, 0, 0, 104, 0, 0, 0, 0, 136,
 	102, 98, 114, 0, 91, 92, 93, 0, 0, 0,
@@ -758,13 +774,13 @@ var yyAct = [...]int{
 	66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 105, 73, 14, 912, 32, 0, 60, 0, 52,
-	0, 0, 0, 57, 56, 58, 59, 71, 108, 315,
+	0, 105, 73, 14, 0, 32, 0, 60, 0, 52,
+	0, 0, 0, 57, 56, 58, 59, 71, 108, 316,
 	0, 89, 90, 70, 47, 94, 95, 36, 0, 107,
 	0, 27, 0, 0, 0, 112, 26, 18, 17, 0,
-	19, 910, 30, 0, 31, 0, 0, 20, 0, 0,
+	19, 0, 30, 0, 31, 0, 0, 20, 0, 0,
 	0, 21, 22, 35, 37, 106, 0, 23, 33, 0,
-	0, 34, 0, 0, 24, 0, 29, 87, 88, 321,
+	0, 34, 0, 0, 24, 0, 29, 87, 88, 322,
 	39, 40, 41, 0, 0, 0, 0, 51, 111, 0,
 	103, 99, 100, 101, 96, 97, 0, 0, 0, 0,
 	0, 0, 104, 0, 0, 0, 0, 136, 102, 98,
@@ -774,13 +790,13 @@ var yyAct = [...]int{
 	68, 69, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 105,
-	73, 14, 0, 32, 0, 60, 0, 52, 0, 0,
-	0, 57, 56, 58, 59, 71, 108, 315, 0, 89,
+	73, 14, 860, 32, 0, 60, 0, 52, 0, 0,
+	0, 57, 56, 58, 59, 71, 108, 316, 0, 89,
 	90, 70, 47, 94, 95, 36, 0, 107, 0, 27,
 	0, 0, 0, 112, 26, 18, 17, 0, 19, 0,
-	30, 0, 31, 0, 0, 20, 0, 0, 0, 21,
+	30, 856, 31, 0, 0, 20, 0, 0, 0, 21,
 	22, 35, 37, 106, 0, 23, 33, 0, 0, 34,
-	0, 0, 24, 0, 29, 87, 88, 321, 39, 40,
+	0, 0, 24, 0, 29, 87, 88, 322, 39, 40,
 	41, 0, 0, 0, 0, 51, 111, 0, 103, 99,
 	100, 101, 96, 97, 0, 0, 0, 0, 0, 0,
 	104, 0, 0, 0, 0, 136, 102, 98, 114, 0,
@@ -790,13 +806,13 @@ var yyAct = [...]int{
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 105, 73, 14,
-	858, 32, 0, 60, 0, 52, 0, 0, 0, 57,
-	56, 58, 59, 71, 108, 315, 0, 89, 90, 70,
+	0, 32, 0, 60, 0, 52, 0, 0, 0, 57,
+	56, 58, 59, 71, 108, 316, 0, 89, 90, 70,
 	47, 94, 95, 36, 0, 107, 0, 27, 0, 0,
-	0, 112, 26, 18, 17, 0, 19, 0, 30, 854,
-	31, 0, 0, 20, 0, 0, 0, 21, 22, 35,
+	0, 112, 26, 18, 17, 0, 19, 0, 30, 0,
+	31, 790, 0, 20, 0, 0, 0, 21, 22, 35,
 	37, 106, 0, 23, 33, 0, 0, 34, 0, 0,
-	24, 0, 29, 87, 88, 321, 39, 40, 41, 0,
+	24, 0, 29, 87, 88, 322, 39, 40, 41, 0,
 	0, 0, 0, 51, 111, 0, 103, 99, 100, 101,
 	96, 97, 0, 0, 0, 0, 0, 0, 104, 0,
 	0, 0, 0, 136, 102, 98, 114, 0, 91, 92,
@@ -807,12 +823,12 @@ var yyAct = [...]int{
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 105, 73, 14, 0, 32,
 	0, 60, 0, 52, 0, 0, 0, 57, 56, 58,
-	59, 71, 108, 315, 0, 89, 90, 70, 47, 94,
+	59, 71, 108, 316, 0, 89, 90, 70, 47, 94,
 	95, 36, 0, 107, 0, 27, 0, 0, 0, 112,
-	26, 18, 17, 0, 19, 0, 30, 0, 31, 788,
+	26, 18, 17, 774, 19, 0, 30, 0, 31, 0,
 	0, 20, 0, 0, 0, 21, 22, 35, 37, 106,
 	0, 23, 33, 0, 0, 34, 0, 0, 24, 0,
-	29, 87, 88, 321, 39, 40, 41, 0, 0, 0,
+	29, 87, 88, 322, 39, 40, 41, 0, 0, 0,
 	0, 51, 111, 0, 103, 99, 100, 101, 96, 97,
 	0, 0, 0, 0, 0, 0, 104, 0, 0, 0,
 	0, 136, 102, 98, 114, 0, 91, 92, 93, 0,
@@ -823,43 +839,43 @@ var yyAct = [...]int{
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 105, 73, 14, 0, 32, 0, 60,
 	0, 52, 0, 0, 0, 57, 56, 58, 59, 71,
-	108, 315, 0, 89, 90, 70, 47, 94, 95, 36,
+	108, 316, 0, 89, 90, 70, 47, 94, 95, 36,
 	0, 107, 0, 27, 0, 0, 0, 112, 26, 18,
-	17, 772, 19, 0, 30, 0, 31, 0, 0, 20,
+	17, 0, 19, 0, 30, 0, 31, 0, 0, 20,
 	0, 0, 0, 21, 22, 35, 37, 106, 0, 23,
 	33, 0, 0, 34, 0, 0, 24, 0, 29, 87,
-	88, 321, 39, 40, 41, 0, 0, 0, 0, 51,
+	88, 322, 39, 40, 41, 0, 0, 0, 0, 51,
 	111, 0, 103, 99, 100, 101, 96, 97, 0, 0,
 	0, 0, 0, 0, 104, 0, 0, 0, 0, 136,
 	102, 98, 114, 0, 91, 92, 93, 0, 0, 0,
-	0, 86, 53, 0, 0, 0, 74, 75, 25, 78,
+	0, 86, 53, 0, 0, 685, 74, 75, 25, 78,
 	79, 0, 0, 0, 54, 55, 76, 63, 64, 65,
 	66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 105, 73, 14, 0, 32, 0, 60, 0, 52,
-	0, 0, 0, 57, 56, 58, 59, 71, 108, 315,
+	0, 0, 0, 57, 56, 58, 59, 71, 108, 316,
 	0, 89, 90, 70, 47, 94, 95, 36, 0, 107,
 	0, 27, 0, 0, 0, 112, 26, 18, 17, 0,
 	19, 0, 30, 0, 31, 0, 0, 20, 0, 0,
 	0, 21, 22, 35, 37, 106, 0, 23, 33, 0,
-	0, 34, 0, 0, 24, 0, 29, 87, 88, 321,
+	0, 34, 0, 0, 24, 0, 29, 87, 88, 322,
 	39, 40, 41, 0, 0, 0, 0, 51, 111, 0,
 	103, 99, 100, 101, 96, 97, 0, 0, 0, 0,
 	0, 0, 104, 0, 0, 0, 0, 136, 102, 98,
 	114, 0, 91, 92, 93, 0, 0, 0, 0, 86,
-	53, 0, 0, 683, 74, 75, 25, 78, 79, 0,
+	53, 0, 0, 0, 74, 75, 25, 78, 79, 0,
 	0, 0, 54, 55, 76, 63, 64, 65, 66, 67,
 	68, 69, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 105,
-	73, 14, 0, 32, 0, 60, 0, 52, 0, 0,
-	0, 57, 56, 58, 59, 71, 108, 315, 0, 89,
+	73, 14, 574, 32, 0, 60, 0, 52, 0, 0,
+	0, 57, 56, 58, 59, 71, 108, 316, 0, 89,
 	90, 70, 47, 94, 95, 36, 0, 107, 0, 27,
 	0, 0, 0, 112, 26, 18, 17, 0, 19, 0,
 	30, 0, 31, 0, 0, 20, 0, 0, 0, 21,
 	22, 35, 37, 106, 0, 23, 33, 0, 0, 34,
-	0, 0, 24, 0, 29, 87, 88, 321, 39, 40,
+	0, 0, 24, 0, 29, 87, 88, 322, 39, 40,
 	41, 0, 0, 0, 0, 51, 111, 0, 103, 99,
 	100, 101, 96, 97, 0, 0, 0, 0, 0, 0,
 	104, 0, 0, 0, 0, 136, 102, 98, 114, 0,
@@ -869,13 +885,13 @@ var yyAct = [...]int{
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 105, 73, 14,
-	572, 32, 0, 60, 0, 52, 0, 0, 0, 57,
-	56, 58, 59, 71, 108, 315, 0, 89, 90, 70,
+	315, 32, 0, 60, 0, 52, 0, 0, 0, 57,
+	56, 58, 59, 71, 108, 316, 0, 89, 90, 70,
 	47, 94, 95, 36, 0, 107, 0, 27, 0, 0,
 	0, 112, 26, 18, 17, 0, 19, 0, 30, 0,
 	31, 0, 0, 20, 0, 0, 0, 21, 22, 35,
 	37, 106, 0, 23, 33, 0, 0, 34, 0, 0,
-	24, 0, 29, 87, 88, 321, 39, 40, 41, 0,
+	24, 0, 29, 87, 88, 322, 39, 40, 41, 0,
 	0, 0, 0, 51, 111, 0, 103, 99, 100, 101,
 	96, 97, 0, 0, 0, 0, 0, 0, 104, 0,
 	0, 0, 0, 136, 102, 98, 114, 0, 91, 92,
@@ -884,80 +900,33 @@ var yyAct = [...]int{
 	76, 63, 64, 65, 66, 67, 68, 69, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 105, 73, 14, 314, 32,
+	0, 0, 0, 0, 0, 105, 73, 14, 0, 32,
 	0, 60, 0, 52, 0, 0, 0, 57, 56, 58,
-	59, 71, 108, 315, 0, 89, 90, 70, 47, 94,
-	95, 36, 0, 107, 0, 27, 0, 0, 0, 112,
-	26, 18, 17, 0, 19, 0, 30, 0, 31, 0,
-	0, 20, 0, 0, 0, 21, 22, 35, 37, 106,
-	0, 23, 33, 0, 0, 34, 0, 0, 24, 0,
-	29, 87, 88, 321, 39, 40, 41, 0, 0, 0,
-	0, 51, 111, 0, 103, 99, 100, 101, 96, 97,
-	0, 0, 0, 0, 0, 0, 104, 0, 0, 0,
-	0, 136, 102, 98, 114, 0, 91, 92, 93, 0,
-	0, 0, 0, 86, 53, 0, 0, 0, 74, 75,
-	25, 78, 79, 0, 0, 0, 54, 55, 76, 63,
-	64, 65, 66, 67, 68, 69, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 105, 73, 14, 0, 32, 0, 60,
-	0, 52, 0, 0, 0, 57, 56, 58, 59, 71,
-	108, 445, 446, 456, 457, 0, 0, 436, 0, 107,
-	0, 0, 0, 0, 0, 0, 461, 462, 463, 464,
-	465, 466, 467, 468, 469, 470, 471, 491, 492, 493,
-	494, 495, 483, 484, 485, 512, 486, 487, 472, 473,
-	474, 475, 476, 477, 478, 479, 480, 481, 482, 0,
-	503, 501, 502, 498, 499, 0, 0, 490, 496, 497,
-	504, 505, 507, 506, 508, 509, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 500, 511, 510,
-	0, 0, 447, 448, 449, 450, 451, 452, 453, 454,
-	455, 458, 459, 460, 488, 489, 439, 440, 441, 442,
-	443, 444, 89, 90, 70, 47, 94, 95, 36, 0,
-	107, 0, 27, 0, 0, 0, 112, 26, 18, 17,
-	0, 19, 0, 30, 0, 31, 0, 0, 20, 0,
-	0, 0, 21, 22, 35, 135, 106, 0, 23, 33,
-	0, 435, 34, 0, 0, 24, 0, 29, 87, 88,
-	181, 0, 0, 0, 0, 0, 108, 0, 51, 111,
-	0, 103, 99, 100, 101, 96, 97, 0, 0, 0,
-	0, 0, 0, 104, 0, 0, 0, 0, 136, 102,
-	98, 114, 0, 91, 92, 93, 0, 0, 0, 0,
-	86, 53, 167, 170, 171, 74, 75, 25, 0, 177,
-	179, 0, 0, 54, 55, 76, 63, 64, 65, 66,
-	67, 68, 69, 165, 164, 0, 0, 0, 0, 0,
-	0, 0, 0, 166, 168, 169, 176, 178, 163, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	105, 73, 14, 0, 32, 783, 60, 0, 52, 0,
-	0, 0, 57, 56, 58, 59, 71, 108, 89, 90,
-	70, 47, 94, 95, 36, 0, 107, 0, 27, 0,
-	0, 0, 112, 26, 18, 17, 0, 19, 0, 30,
-	0, 31, 0, 0, 20, 0, 0, 0, 21, 22,
-	35, 135, 106, 0, 23, 33, 0, 0, 34, 0,
-	0, 24, 0, 29, 87, 88, 0, 0, 0, 0,
-	0, 0, 0, 0, 51, 111, 0, 103, 99, 100,
-	101, 96, 97, 0, 0, 0, 0, 0, 0, 104,
-	0, 0, 0, 0, 136, 102, 98, 114, 0, 91,
-	92, 93, 0, 0, 0, 0, 86, 53, 0, 0,
-	0, 74, 75, 25, 0, 0, 0, 0, 0, 54,
-	55, 76, 63, 64, 65, 66, 67, 68, 69, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 105, 73, 14, 0,
-	32, 850, 60, 0, 52, 0, 0, 0, 57, 56,
-	58, 59, 71, 108, 89, 90, 70, 47, 94, 95,
+	59, 71, 108, 447, 448, 458, 459, 0, 0, 438,
+	0, 107, 0, 0, 0, 0, 0, 0, 463, 464,
+	465, 466, 467, 468, 469, 470, 471, 472, 473, 493,
+	494, 495, 496, 497, 485, 486, 487, 514, 488, 489,
+	474, 475, 476, 477, 478, 479, 480, 481, 482, 483,
+	484, 0, 505, 503, 504, 500, 501, 0, 0, 492,
+	498, 499, 506, 507, 509, 508, 510, 511, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 502,
+	513, 512, 0, 0, 449, 450, 451, 452, 453, 454,
+	455, 456, 457, 460, 461, 462, 490, 491, 441, 442,
+	443, 444, 445, 446, 89, 90, 70, 47, 94, 95,
 	36, 0, 107, 0, 27, 0, 0, 0, 112, 26,
 	18, 17, 0, 19, 0, 30, 0, 31, 0, 0,
 	20, 0, 0, 0, 21, 22, 35, 135, 106, 0,
-	23, 33, 0, 0, 34, 0, 0, 24, 0, 29,
-	87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
+	23, 33, 0, 437, 34, 0, 0, 24, 0, 29,
+	87, 88, 181, 0, 0, 0, 0, 0, 108, 0,
 	51, 111, 0, 103, 99, 100, 101, 96, 97, 0,
 	0, 0, 0, 0, 0, 104, 0, 0, 0, 0,
 	136, 102, 98, 114, 0, 91, 92, 93, 0, 0,
-	0, 0, 86, 53, 0, 0, 0, 74, 75, 25,
-	0, 0, 0, 0, 0, 54, 55, 76, 63, 64,
-	65, 66, 67, 68, 69, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 105, 73, 14, 0, 32, 685, 60, 0,
+	0, 0, 86, 53, 167, 170, 171, 74, 75, 25,
+	0, 177, 179, 0, 0, 54, 55, 76, 63, 64,
+	65, 66, 67, 68, 69, 165, 164, 0, 0, 0,
+	0, 0, 0, 0, 0, 166, 168, 169, 176, 178,
+	163, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 105, 73, 14, 0, 32, 785, 60, 0,
 	52, 0, 0, 0, 57, 56, 58, 59, 71, 108,
 	89, 90, 70, 47, 94, 95, 36, 0, 107, 0,
 	27, 0, 0, 0, 112, 26, 18, 17, 0, 19,
@@ -973,7 +942,7 @@ var yyAct = [...]int{
 	69, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 105, 73,
-	14, 0, 32, 671, 60, 0, 52, 0, 0, 0,
+	14, 0, 32, 852, 60, 0, 52, 0, 0, 0,
 	57, 56, 58, 59, 71, 108, 89, 90, 70, 47,
 	94, 95, 36, 0, 107, 0, 27, 0, 0, 0,
 	112, 26, 18, 17, 0, 19, 0, 30, 0, 31,
@@ -988,7 +957,7 @@ var yyAct = [...]int{
 	63, 64, 65, 66, 67, 68, 69, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 105, 73, 14, 0, 32, 654,
+	0, 0, 0, 0, 105, 73, 14, 0, 32, 687,
 	60, 0, 52, 0, 0, 0, 57, 56, 58, 59,
 	71, 108, 89, 90, 70, 47, 94, 95, 36, 0,
 	107, 0, 27, 0, 0, 0, 112, 26, 18, 17,
@@ -1004,62 +973,116 @@ var yyAct = [...]int{
 	67, 68, 69, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	105, 73, 14, 0, 32, 0, 60, 0, 52, 0,
-	0, 0, 57, 56, 58, 59, 71, 108, 445, 446,
-	456, 457, 0, 0, 884, 0, 0, 0, 0, 0,
-	0, 0, 0, 461, 462, 463, 464, 465, 466, 467,
-	468, 469, 470, 471, 491, 492, 493, 494, 495, 483,
-	484, 485, 512, 486, 487, 472, 473, 474, 475, 476,
-	477, 478, 479, 480, 481, 482, 0, 503, 501, 502,
-	498, 499, 0, 0, 490, 496, 497, 504, 505, 507,
-	506, 508, 509, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 883, 511, 510, 114, 0, 447,
-	448, 449, 450, 451, 452, 453, 454, 455, 458, 459,
-	460, 488, 489, 439, 440, 441, 442, 443, 444, 0,
+	105, 73, 14, 0, 32, 673, 60, 0, 52, 0,
+	0, 0, 57, 56, 58, 59, 71, 108, 89, 90,
+	70, 47, 94, 95, 36, 0, 107, 0, 27, 0,
+	0, 0, 112, 26, 18, 17, 0, 19, 0, 30,
+	0, 31, 0, 0, 20, 0, 0, 0, 21, 22,
+	35, 135, 106, 0, 23, 33, 0, 0, 34, 0,
+	0, 24, 0, 29, 87, 88, 0, 0, 0, 0,
+	0, 0, 0, 0, 51, 111, 0, 103, 99, 100,
+	101, 96, 97, 0, 0, 0, 0, 0, 0, 104,
+	0, 0, 0, 0, 136, 102, 98, 114, 0, 91,
+	92, 93, 0, 0, 0, 0, 86, 53, 0, 0,
+	0, 74, 75, 25, 0, 0, 0, 0, 0, 54,
+	55, 76, 63, 64, 65, 66, 67, 68, 69, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 445, 446, 456, 457, 0,
-	0, 884, 0, 0, 0, 0, 0, 0, 0, 903,
-	461, 462, 463, 464, 465, 466, 467, 468, 469, 470,
-	471, 491, 492, 493, 494, 495, 483, 484, 485, 512,
-	486, 487, 472, 473, 474, 475, 476, 477, 478, 479,
-	480, 481, 482, 0, 503, 501, 502, 498, 499, 0,
-	0, 490, 496, 497, 504, 505, 507, 506, 508, 509,
+	0, 0, 0, 0, 0, 0, 105, 73, 14, 0,
+	32, 656, 60, 0, 52, 0, 0, 0, 57, 56,
+	58, 59, 71, 108, 89, 90, 70, 47, 94, 95,
+	36, 0, 107, 0, 27, 0, 0, 0, 112, 26,
+	18, 17, 0, 19, 0, 30, 0, 31, 0, 0,
+	20, 0, 0, 0, 21, 22, 35, 135, 106, 0,
+	23, 33, 0, 0, 34, 0, 0, 24, 0, 29,
+	87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
+	51, 111, 0, 103, 99, 100, 101, 96, 97, 0,
+	0, 0, 0, 0, 0, 104, 0, 0, 0, 0,
+	136, 102, 98, 114, 0, 91, 92, 93, 0, 0,
+	0, 0, 86, 53, 0, 0, 0, 74, 75, 25,
+	0, 0, 0, 0, 0, 54, 55, 76, 63, 64,
+	65, 66, 67, 68, 69, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 105, 73, 14, 0, 32, 0, 60, 0,
+	52, 0, 0, 0, 57, 56, 58, 59, 71, 108,
+	447, 448, 458, 459, 0, 0, 886, 0, 0, 0,
+	0, 0, 0, 0, 0, 463, 464, 465, 466, 467,
+	468, 469, 470, 471, 472, 473, 493, 494, 495, 496,
+	497, 485, 486, 487, 514, 488, 489, 474, 475, 476,
+	477, 478, 479, 480, 481, 482, 483, 484, 0, 505,
+	503, 504, 500, 501, 0, 0, 492, 498, 499, 506,
+	507, 509, 508, 510, 511, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 885, 513, 512, 114,
+	0, 449, 450, 451, 452, 453, 454, 455, 456, 457,
+	460, 461, 462, 490, 491, 441, 442, 443, 444, 445,
+	446, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 883, 511, 510, 114, 0, 447, 448, 449, 450,
-	451, 452, 453, 454, 455, 458, 459, 460, 488, 489,
-	439, 440, 441, 442, 443, 444, 89, 90, 70, 0,
+	0, 0, 0, 0, 0, 0, 0, 447, 448, 458,
+	459, 0, 0, 886, 0, 0, 0, 0, 0, 0,
+	0, 905, 463, 464, 465, 466, 467, 468, 469, 470,
+	471, 472, 473, 493, 494, 495, 496, 497, 485, 486,
+	487, 514, 488, 489, 474, 475, 476, 477, 478, 479,
+	480, 481, 482, 483, 484, 0, 505, 503, 504, 500,
+	501, 0, 0, 492, 498, 499, 506, 507, 509, 508,
+	510, 511, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 885, 513, 512, 114, 0, 449, 450,
+	451, 452, 453, 454, 455, 456, 457, 460, 461, 462,
+	490, 491, 441, 442, 443, 444, 445, 446, 89, 90,
+	70, 0, 94, 95, 119, 0, 107, 0, 0, 0,
+	0, 0, 112, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 135, 106, 0, 0, 0, 0, 0, 876, 0,
+	0, 0, 0, 0, 87, 88, 0, 0, 0, 0,
+	0, 0, 0, 0, 51, 111, 0, 103, 99, 100,
+	101, 96, 97, 0, 0, 0, 0, 0, 0, 104,
+	0, 0, 0, 0, 136, 102, 98, 114, 540, 91,
+	92, 93, 0, 0, 0, 0, 86, 53, 0, 0,
+	0, 74, 75, 141, 0, 0, 0, 0, 0, 54,
+	55, 76, 63, 64, 65, 66, 67, 68, 69, 0,
+	0, 0, 89, 90, 70, 0, 94, 95, 119, 0,
+	107, 0, 0, 0, 0, 0, 112, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 105, 73, 0, 0,
+	0, 0, 60, 536, 52, 135, 106, 0, 57, 56,
+	58, 59, 71, 108, 0, 0, 0, 0, 87, 88,
+	0, 0, 0, 0, 0, 0, 0, 0, 230, 111,
+	0, 103, 99, 100, 101, 96, 97, 0, 0, 0,
+	0, 0, 0, 104, 0, 0, 0, 0, 136, 102,
+	98, 114, 0, 91, 92, 93, 0, 0, 0, 0,
+	86, 53, 0, 0, 0, 74, 75, 141, 0, 0,
+	0, 0, 0, 54, 55, 76, 63, 64, 65, 66,
+	67, 68, 69, 0, 0, 0, 89, 90, 70, 0,
 	94, 95, 119, 0, 107, 0, 0, 0, 0, 0,
 	112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 135,
-	106, 0, 0, 0, 0, 0, 874, 0, 0, 0,
+	105, 73, 0, 0, 0, 0, 60, 0, 52, 135,
+	106, 229, 57, 56, 58, 59, 71, 108, 0, 0,
 	0, 0, 87, 88, 0, 0, 0, 0, 0, 0,
 	0, 0, 51, 111, 0, 103, 99, 100, 101, 96,
 	97, 0, 0, 0, 0, 0, 0, 104, 0, 0,
-	0, 0, 136, 102, 98, 114, 538, 91, 92, 93,
+	0, 0, 136, 102, 98, 114, 540, 91, 92, 93,
 	0, 0, 0, 0, 86, 53, 0, 0, 0, 74,
 	75, 141, 0, 0, 0, 0, 0, 54, 55, 76,
 	63, 64, 65, 66, 67, 68, 69, 0, 0, 0,
 	89, 90, 70, 0, 94, 95, 119, 0, 107, 0,
 	0, 0, 0, 0, 112, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 105, 73, 0, 0, 0, 0,
-	60, 534, 52, 135, 106, 0, 57, 56, 58, 59,
+	60, 0, 52, 135, 106, 0, 57, 56, 58, 59,
 	71, 108, 0, 0, 0, 0, 87, 88, 0, 0,
-	0, 0, 0, 0, 0, 0, 229, 111, 0, 103,
+	0, 0, 0, 0, 0, 0, 599, 111, 0, 103,
 	99, 100, 101, 96, 97, 0, 0, 0, 0, 0,
 	0, 104, 0, 0, 0, 0, 136, 102, 98, 114,
 	0, 91, 92, 93, 0, 0, 0, 0, 86, 53,
 	0, 0, 0, 74, 75, 141, 0, 0, 0, 0,
 	0, 54, 55, 76, 63, 64, 65, 66, 67, 68,
 	69, 0, 0, 0, 89, 90, 70, 0, 94, 95,
-	119, 0, 107, 0, 0, 0, 0, 0, 112, 0,
+	119, 430, 107, 0, 0, 0, 0, 0, 112, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 105, 73,
-	0, 0, 0, 0, 60, 0, 52, 135, 106, 228,
+	0, 0, 0, 0, 60, 0, 52, 135, 106, 598,
 	57, 56, 58, 59, 71, 108, 0, 0, 0, 0,
 	87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
 	51, 111, 0, 103, 99, 100, 101, 96, 97, 0,
 	0, 0, 0, 0, 0, 104, 0, 0, 0, 0,
-	136, 102, 98, 114, 538, 91, 92, 93, 0, 0,
+	136, 102, 98, 114, 0, 91, 92, 93, 0, 0,
 	0, 0, 86, 53, 0, 0, 0, 74, 75, 141,
 	0, 0, 0, 0, 0, 54, 55, 76, 63, 64,
 	65, 66, 67, 68, 69, 0, 0, 0, 89, 90,
@@ -1068,16 +1091,16 @@ var yyAct = [...]int{
 	0, 0, 105, 73, 0, 0, 0, 0, 60, 0,
 	52, 135, 106, 0, 57, 56, 58, 59, 71, 108,
 	0, 0, 0, 0, 87, 88, 0, 0, 0, 0,
-	0, 0, 0, 0, 597, 111, 0, 103, 99, 100,
+	0, 0, 0, 0, 51, 111, 0, 103, 99, 100,
 	101, 96, 97, 0, 0, 0, 0, 0, 0, 104,
 	0, 0, 0, 0, 136, 102, 98, 114, 0, 91,
 	92, 93, 0, 0, 0, 0, 86, 53, 0, 0,
 	0, 74, 75, 141, 0, 0, 0, 0, 0, 54,
 	55, 76, 63, 64, 65, 66, 67, 68, 69, 0,
-	0, 0, 89, 90, 70, 0, 94, 95, 119, 428,
+	0, 0, 89, 90, 70, 0, 94, 95, 119, 0,
 	107, 0, 0, 0, 0, 0, 112, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 105, 73, 0, 0,
-	0, 0, 60, 0, 52, 135, 106, 596, 57, 56,
+	0, 0, 60, 0, 52, 135, 106, 392, 57, 56,
 	58, 59, 71, 108, 0, 0, 0, 0, 87, 88,
 	0, 0, 0, 0, 0, 0, 0, 0, 51, 111,
 	0, 103, 99, 100, 101, 96, 97, 0, 0, 0,
@@ -1088,7 +1111,7 @@ var yyAct = [...]int{
 	67, 68, 69, 0, 0, 0, 89, 90, 70, 0,
 	94, 95, 119, 0, 107, 0, 0, 0, 0, 0,
 	112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	105, 73, 0, 0, 0, 0, 60, 0, 52, 135,
+	105, 73, 0, 0, 0, 368, 60, 0, 52, 135,
 	106, 0, 57, 56, 58, 59, 71, 108, 0, 0,
 	0, 0, 87, 88, 0, 0, 0, 0, 0, 0,
 	0, 0, 51, 111, 0, 103, 99, 100, 101, 96,
@@ -1096,44 +1119,27 @@ var yyAct = [...]int{
 	0, 0, 136, 102, 98, 114, 0, 91, 92, 93,
 	0, 0, 0, 0, 86, 53, 0, 0, 0, 74,
 	75, 141, 0, 0, 0, 0, 0, 54, 55, 76,
-	63, 64, 65, 66, 67, 68, 69, 0, 0, 0,
-	89, 90, 70, 0, 94, 95, 119, 0, 107, 0,
-	0, 0, 0, 0, 112, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 105, 73, 0, 0, 0, 0,
-	60, 0, 52, 135, 106, 391, 57, 56, 58, 59,
-	71, 108, 0, 0, 0, 0, 87, 88, 0, 0,
-	0, 0, 0, 0, 0, 0, 51, 111, 0, 103,
-	99, 100, 101, 96, 97, 0, 0, 0, 0, 0,
-	0, 104, 0, 0, 0, 0, 136, 102, 98, 114,
-	0, 91, 92, 93, 0, 0, 0, 0, 86, 53,
-	0, 0, 0, 74, 75, 141, 0, 0, 0, 0,
-	0, 54, 55, 76, 63, 64, 65, 66, 67, 68,
-	69, 0, 0, 0, 89, 90, 70, 0, 94, 95,
-	119, 0, 107, 0, 0, 0, 0, 0, 112, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 105, 73,
-	0, 0, 0, 367, 60, 0, 52, 135, 106, 0,
-	57, 56, 58, 59, 71, 108, 0, 0, 0, 0,
-	87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
-	51, 111, 0, 103, 99, 100, 101, 96, 97, 0,
-	0, 0, 0, 0, 0, 104, 0, 0, 0, 0,
-	136, 102, 98, 114, 0, 91, 92, 93, 0, 0,
-	0, 0, 86, 53, 0, 0, 0, 74, 75, 141,
-	0, 0, 0, 0, 0, 54, 55, 76, 63, 64,
-	65, 66, 67, 68, 69, 0, 0, 157, 159, 158,
-	181, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	63, 64, 65, 66, 67, 68, 69, 0, 0, 157,
+	159, 158, 181, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 105, 73, 183, 180, 0, 0, 60, 0,
-	52, 0, 0, 0, 57, 56, 58, 59, 71, 108,
-	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
-	179, 0, 157, 159, 158, 181, 0, 0, 0, 0,
-	759, 182, 161, 165, 164, 0, 0, 0, 0, 0,
-	160, 0, 162, 166, 168, 169, 176, 178, 163, 183,
-	180, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 155, 156, 167, 170, 171,
-	172, 173, 174, 175, 177, 179, 0, 157, 159, 158,
-	181, 0, 0, 717, 0, 0, 182, 161, 165, 164,
-	0, 0, 0, 0, 0, 160, 0, 162, 166, 168,
-	169, 176, 178, 163, 183, 180, 0, 0, 0, 0,
+	0, 0, 0, 0, 105, 73, 183, 180, 0, 0,
+	60, 0, 52, 0, 0, 0, 57, 56, 58, 59,
+	71, 108, 155, 156, 167, 170, 171, 172, 173, 174,
+	175, 177, 179, 0, 157, 159, 158, 181, 0, 0,
+	0, 0, 761, 182, 161, 165, 164, 0, 0, 0,
+	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
+	163, 183, 180, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 155, 156, 167,
+	170, 171, 172, 173, 174, 175, 177, 179, 0, 157,
+	159, 158, 181, 0, 0, 719, 0, 0, 182, 161,
+	165, 164, 0, 0, 0, 0, 0, 160, 0, 162,
+	166, 168, 169, 176, 178, 163, 183, 180, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 155, 156, 167, 170, 171, 172, 173, 174,
+	175, 177, 179, 0, 0, 0, 699, 157, 159, 158,
+	181, 0, 0, 182, 161, 165, 164, 0, 0, 0,
+	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
+	163, 0, 0, 0, 183, 180, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
 	179, 0, 0, 0, 697, 157, 159, 158, 181, 0,
@@ -1142,66 +1148,89 @@ var yyAct = [...]int{
 	0, 0, 183, 180, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 155, 156,
 	167, 170, 171, 172, 173, 174, 175, 177, 179, 0,
-	0, 0, 695, 157, 159, 158, 181, 0, 0, 182,
+	0, 0, 688, 157, 159, 158, 181, 0, 0, 182,
 	161, 165, 164, 0, 0, 0, 0, 0, 160, 0,
 	162, 166, 168, 169, 176, 178, 163, 0, 0, 0,
 	183, 180, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 155, 156, 167, 170,
+	171, 172, 173, 174, 175, 177, 179, 0, 157, 159,
+	158, 181, 0, 0, 684, 0, 0, 182, 161, 165,
+	164, 0, 0, 0, 0, 0, 160, 0, 162, 166,
+	168, 169, 176, 178, 163, 183, 180, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 155, 156, 167, 170, 171, 172, 173, 174, 175,
+	177, 179, 0, 157, 159, 158, 181, 0, 0, 683,
+	0, 0, 182, 161, 165, 164, 0, 0, 0, 0,
+	0, 160, 0, 162, 166, 168, 169, 176, 178, 163,
+	183, 180, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 155, 156, 167, 170,
 	171, 172, 173, 174, 175, 177, 179, 0, 0, 0,
-	686, 157, 159, 158, 181, 0, 0, 182, 161, 165,
+	639, 157, 159, 158, 181, 0, 0, 182, 161, 165,
 	164, 0, 0, 0, 0, 0, 160, 0, 162, 166,
 	168, 169, 176, 178, 163, 0, 0, 0, 183, 180,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 155, 156, 167, 170, 171, 172,
 	173, 174, 175, 177, 179, 0, 157, 159, 158, 181,
-	0, 0, 682, 0, 0, 182, 161, 165, 164, 0,
+	0, 0, 628, 0, 0, 182, 161, 165, 164, 0,
 	0, 0, 0, 0, 160, 0, 162, 166, 168, 169,
 	176, 178, 163, 183, 180, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 155,
 	156, 167, 170, 171, 172, 173, 174, 175, 177, 179,
-	0, 157, 159, 158, 181, 0, 0, 681, 0, 0,
+	0, 157, 159, 158, 181, 0, 0, 627, 0, 0,
 	182, 161, 165, 164, 0, 0, 0, 0, 0, 160,
 	0, 162, 166, 168, 169, 176, 178, 163, 183, 180,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 155, 156, 167, 170, 171, 172,
-	173, 174, 175, 177, 179, 0, 0, 0, 637, 157,
+	173, 174, 175, 177, 179, 0, 0, 0, 610, 157,
 	159, 158, 181, 0, 0, 182, 161, 165, 164, 0,
 	0, 0, 0, 0, 160, 0, 162, 166, 168, 169,
 	176, 178, 163, 0, 0, 0, 183, 180, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 155, 156, 167, 170, 171, 172, 173, 174,
 	175, 177, 179, 0, 157, 159, 158, 181, 0, 0,
-	626, 0, 0, 182, 161, 165, 164, 0, 0, 0,
+	601, 0, 0, 182, 161, 165, 164, 0, 0, 0,
 	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
 	163, 183, 180, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 155, 156, 167,
-	170, 171, 172, 173, 174, 175, 177, 179, 0, 157,
-	159, 158, 181, 0, 0, 625, 0, 0, 182, 161,
+	170, 171, 172, 173, 174, 175, 177, 179, 572, 0,
+	0, 591, 157, 159, 158, 181, 0, 0, 182, 161,
 	165, 164, 0, 0, 0, 0, 0, 160, 0, 162,
-	166, 168, 169, 176, 178, 163, 183, 180, 0, 0,
+	166, 168, 169, 176, 178, 163, 0, 0, 0, 183,
+	180, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 155, 156, 167, 170, 171,
+	172, 173, 174, 175, 177, 179, 0, 157, 159, 158,
+	181, 0, 0, 589, 0, 0, 182, 161, 165, 164,
+	0, 0, 0, 0, 0, 160, 0, 162, 166, 168,
+	169, 176, 178, 163, 183, 180, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 155, 156, 167, 170, 171, 172, 173, 174,
-	175, 177, 179, 0, 0, 0, 608, 157, 159, 158,
-	181, 0, 0, 182, 161, 165, 164, 0, 0, 0,
-	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
-	163, 0, 0, 0, 183, 180, 0, 0, 0, 0,
+	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
+	179, 0, 157, 159, 158, 181, 0, 0, 0, 0,
+	0, 182, 161, 165, 164, 0, 0, 0, 0, 0,
+	160, 0, 162, 166, 168, 169, 176, 178, 163, 183,
+	180, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 155, 156, 167, 170, 171,
+	172, 173, 174, 175, 177, 179, 0, 157, 159, 158,
+	181, 568, 0, 0, 0, 0, 182, 161, 165, 164,
+	0, 0, 0, 0, 0, 160, 0, 162, 166, 168,
+	169, 176, 178, 163, 183, 180, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
-	179, 0, 157, 159, 158, 181, 0, 0, 599, 0,
+	179, 0, 157, 159, 158, 181, 0, 0, 563, 0,
 	0, 182, 161, 165, 164, 0, 0, 0, 0, 0,
 	160, 0, 162, 166, 168, 169, 176, 178, 163, 183,
 	180, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 155, 156, 167, 170, 171,
-	172, 173, 174, 175, 177, 179, 570, 0, 0, 589,
-	157, 159, 158, 181, 0, 0, 182, 161, 165, 164,
+	172, 173, 174, 175, 177, 179, 0, 157, 159, 158,
+	181, 0, 0, 559, 0, 0, 182, 161, 165, 164,
 	0, 0, 0, 0, 0, 160, 0, 162, 166, 168,
-	169, 176, 178, 163, 0, 0, 0, 183, 180, 0,
+	169, 176, 178, 163, 183, 180, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 416, 0, 0, 0,
+	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
+	179, 0, 0, 0, 0, 0, 0, 0, 421, 0,
+	0, 182, 161, 165, 164, 157, 159, 158, 181, 0,
+	160, 0, 162, 166, 168, 169, 176, 178, 163, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 155, 156, 167, 170, 171, 172, 173,
-	174, 175, 177, 179, 0, 157, 159, 158, 181, 0,
-	0, 587, 0, 0, 182, 161, 165, 164, 0, 0,
-	0, 0, 0, 160, 0, 162, 166, 168, 169, 176,
-	178, 163, 183, 180, 0, 0, 0, 0, 0, 0,
+	0, 0, 183, 180, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 155, 156,
 	167, 170, 171, 172, 173, 174, 175, 177, 179, 0,
 	157, 159, 158, 181, 0, 0, 0, 0, 0, 182,
@@ -1209,173 +1238,148 @@ var yyAct = [...]int{
 	162, 166, 168, 169, 176, 178, 163, 183, 180, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 155, 156, 167, 170, 171, 172, 173,
-	174, 175, 177, 179, 0, 157, 159, 158, 181, 566,
-	0, 0, 0, 0, 182, 161, 165, 164, 0, 0,
+	174, 175, 177, 179, 0, 0, 0, 0, 376, 157,
+	159, 158, 181, 0, 182, 161, 165, 164, 0, 0,
 	0, 0, 0, 160, 0, 162, 166, 168, 169, 176,
-	178, 163, 183, 180, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 155, 156,
-	167, 170, 171, 172, 173, 174, 175, 177, 179, 0,
-	157, 159, 158, 181, 0, 0, 561, 0, 0, 182,
-	161, 165, 164, 0, 0, 0, 0, 0, 160, 0,
-	162, 166, 168, 169, 176, 178, 163, 183, 180, 0,
+	178, 163, 0, 0, 0, 0, 183, 180, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 155, 156, 167, 170, 171, 172, 173,
-	174, 175, 177, 179, 0, 157, 159, 158, 181, 0,
-	0, 557, 0, 0, 182, 161, 165, 164, 0, 0,
-	0, 0, 0, 160, 0, 162, 166, 168, 169, 176,
-	178, 163, 183, 180, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 414, 0, 0, 0, 155, 156,
-	167, 170, 171, 172, 173, 174, 175, 177, 179, 0,
-	0, 0, 0, 0, 0, 0, 419, 0, 0, 182,
-	161, 165, 164, 157, 159, 158, 181, 0, 160, 0,
-	162, 166, 168, 169, 176, 178, 163, 0, 0, 0,
+	0, 0, 155, 156, 167, 170, 171, 172, 173, 174,
+	175, 177, 179, 0, 0, 0, 0, 154, 157, 159,
+	158, 181, 0, 182, 161, 165, 164, 0, 0, 0,
+	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
+	163, 0, 0, 0, 0, 183, 180, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 155, 156, 167, 170, 171, 172, 173, 174, 175,
+	177, 179, 0, 0, 159, 158, 181, 0, 0, 0,
+	0, 0, 182, 161, 165, 164, 0, 0, 0, 0,
+	0, 160, 0, 162, 166, 168, 169, 176, 178, 163,
 	183, 180, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 155, 156, 167, 170,
-	171, 172, 173, 174, 175, 177, 179, 0, 157, 159,
+	171, 172, 173, 174, 175, 177, 179, 0, 0, 0,
 	158, 181, 0, 0, 0, 0, 0, 182, 161, 165,
 	164, 0, 0, 0, 0, 0, 160, 0, 162, 166,
-	168, 169, 176, 178, 163, 183, 180, 0, 0, 0,
+	168, 169, 176, 178, 163, 183, 180, 432, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 155, 156, 167, 170, 171, 172, 173, 174, 175,
-	177, 179, 0, 0, 0, 0, 375, 157, 159, 158,
-	181, 0, 182, 161, 165, 164, 0, 0, 0, 0,
+	177, 179, 0, 0, 0, 0, 0, 0, 0, 181,
+	0, 0, 182, 161, 165, 164, 0, 0, 0, 0,
 	0, 160, 0, 162, 166, 168, 169, 176, 178, 163,
-	0, 0, 0, 0, 183, 180, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	155, 156, 167, 170, 171, 172, 173, 174, 175, 177,
-	179, 0, 0, 0, 0, 154, 157, 159, 158, 181,
-	0, 182, 161, 165, 164, 0, 0, 0, 0, 0,
-	160, 0, 162, 166, 168, 169, 176, 178, 163, 0,
 	0, 0, 0, 183, 180, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 155,
 	156, 167, 170, 171, 172, 173, 174, 175, 177, 179,
-	0, 0, 159, 158, 181, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 181, 0, 0, 0, 0, 0,
 	182, 161, 165, 164, 0, 0, 0, 0, 0, 160,
 	0, 162, 166, 168, 169, 176, 178, 163, 183, 180,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 155, 156, 167, 170, 171, 172,
-	173, 174, 175, 177, 179, 0, 0, 0, 158, 181,
+	173, 174, 175, 177, 179, 0, 0, 0, 0, 181,
 	0, 0, 0, 0, 0, 182, 161, 165, 164, 0,
 	0, 0, 0, 0, 160, 0, 162, 166, 168, 169,
-	176, 178, 163, 183, 180, 430, 0, 0, 0, 0,
+	176, 178, 163, 183, 180, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 155,
 	156, 167, 170, 171, 172, 173, 174, 175, 177, 179,
-	0, 0, 0, 0, 0, 0, 0, 181, 0, 0,
-	182, 161, 165, 164, 0, 0, 0, 0, 0, 160,
-	0, 162, 166, 168, 169, 176, 178, 163, 0, 0,
-	0, 183, 180, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 155, 156, 167,
-	170, 171, 172, 173, 174, 175, 177, 179, 0, 0,
-	0, 0, 181, 0, 0, 0, 0, 0, 182, 161,
-	165, 164, 0, 0, 0, 0, 0, 160, 0, 162,
-	166, 168, 169, 176, 178, 163, 183, 180, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 155, 156, 167, 170, 171, 172, 173, 174,
-	175, 177, 179, 0, 0, 0, 0, 181, 0, 0,
-	0, 0, 0, 182, 161, 165, 164, 0, 0, 0,
-	0, 0, 160, 0, 162, 166, 168, 169, 176, 178,
-	163, 183, 180, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 155, 156, 167,
-	170, 171, 172, 173, 174, 175, 177, 179, 0, 0,
-	0, 181, 0, 0, 0, 0, 0, 0, 0, 161,
-	165, 164, 0, 0, 0, 0, 0, 160, 0, 162,
-	166, 168, 169, 176, 178, 163, 180, 0, 0, 0,
+	0, 0, 0, 181, 0, 0, 0, 0, 0, 0,
+	0, 161, 165, 164, 0, 0, 0, 0, 0, 160,
+	0, 162, 166, 168, 169, 176, 178, 163, 180, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 181, 156, 167, 170, 171, 172, 173, 174, 175,
-	177, 179, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 161, 165, 164, 180, 0, 0, 0,
-	0, 160, 0, 162, 166, 168, 169, 176, 178, 163,
-	0, 181, 0, 167, 170, 171, 172, 173, 174, 175,
-	177, 179, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 161, 165, 164, 180, 0, 0, 0,
-	0, 160, 0, 162, 166, 168, 169, 176, 178, 163,
-	0, 181, 0, 167, 170, 171, 172, 173, 174, 175,
-	177, 179, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 161, 165, 164, 180, 0, 0, 0,
-	0, 0, 0, 0, 166, 168, 169, 176, 178, 163,
-	0, 0, 0, 167, 170, 171, 172, 173, 174, 175,
-	177, 179, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 165, 164, 445, 446, 456, 457,
-	0, 0, 436, 0, 166, 168, 169, 176, 178, 163,
-	0, 461, 462, 463, 464, 465, 466, 467, 468, 469,
-	470, 471, 491, 492, 493, 494, 495, 483, 484, 485,
-	512, 486, 487, 472, 473, 474, 475, 476, 477, 478,
-	479, 480, 481, 482, 0, 503, 501, 502, 498, 499,
-	0, 0, 490, 496, 497, 504, 505, 507, 506, 508,
-	509, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 500, 511, 510, 0, 0, 447, 448, 449,
-	450, 451, 452, 453, 454, 455, 458, 459, 460, 488,
-	489, 439, 440, 441, 442, 443, 444, 445, 446, 456,
-	457, 0, 0, 919, 0, 0, 0, 0, 0, 0,
-	0, 0, 461, 462, 463, 464, 465, 466, 467, 468,
-	469, 470, 471, 491, 492, 493, 494, 495, 483, 484,
-	485, 512, 486, 487, 472, 473, 474, 475, 476, 477,
-	478, 479, 480, 481, 482, 0, 503, 501, 502, 498,
-	499, 0, 0, 490, 496, 497, 504, 505, 507, 506,
-	508, 509, 119, 0, 107, 0, 0, 0, 0, 0,
-	112, 0, 0, 500, 511, 510, 0, 0, 447, 448,
-	449, 450, 451, 452, 453, 454, 455, 458, 459, 460,
-	488, 489, 748, 749, 750, 747, 746, 745, 0, 0,
+	0, 0, 0, 181, 156, 167, 170, 171, 172, 173,
+	174, 175, 177, 179, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 161, 165, 164, 180, 0,
+	0, 0, 0, 160, 0, 162, 166, 168, 169, 176,
+	178, 163, 0, 181, 0, 167, 170, 171, 172, 173,
+	174, 175, 177, 179, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 161, 165, 164, 180, 0,
+	0, 0, 0, 160, 0, 162, 166, 168, 169, 176,
+	178, 163, 0, 181, 0, 167, 170, 171, 172, 173,
+	174, 175, 177, 179, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 161, 165, 164, 180, 0,
+	0, 0, 0, 0, 0, 162, 166, 168, 169, 176,
+	178, 163, 0, 181, 0, 167, 170, 171, 172, 173,
+	174, 175, 177, 179, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 161, 165, 164, 180, 0,
+	0, 0, 0, 0, 0, 0, 166, 168, 169, 176,
+	178, 163, 0, 0, 0, 167, 170, 171, 172, 173,
+	174, 175, 177, 179, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 165, 164, 447, 448,
+	458, 459, 0, 0, 438, 0, 166, 168, 169, 176,
+	178, 163, 0, 463, 464, 465, 466, 467, 468, 469,
+	470, 471, 472, 473, 493, 494, 495, 496, 497, 485,
+	486, 487, 514, 488, 489, 474, 475, 476, 477, 478,
+	479, 480, 481, 482, 483, 484, 0, 505, 503, 504,
+	500, 501, 0, 0, 492, 498, 499, 506, 507, 509,
+	508, 510, 511, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 502, 513, 512, 0, 0, 449,
+	450, 451, 452, 453, 454, 455, 456, 457, 460, 461,
+	462, 490, 491, 441, 442, 443, 444, 445, 446, 447,
+	448, 458, 459, 0, 0, 921, 0, 0, 0, 0,
+	0, 0, 0, 0, 463, 464, 465, 466, 467, 468,
+	469, 470, 471, 472, 473, 493, 494, 495, 496, 497,
+	485, 486, 487, 514, 488, 489, 474, 475, 476, 477,
+	478, 479, 480, 481, 482, 483, 484, 0, 505, 503,
+	504, 500, 501, 0, 0, 492, 498, 499, 506, 507,
+	509, 508, 510, 511, 119, 0, 107, 0, 0, 0,
+	0, 0, 112, 0, 0, 502, 513, 512, 0, 0,
+	449, 450, 451, 452, 453, 454, 455, 456, 457, 460,
+	461, 462, 490, 491, 750, 751, 752, 749, 748, 747,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 667, 111, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 669, 111, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 136, 0, 0, 114, 0, 0, 0, 0,
+	0, 0, 0, 0, 136, 0, 0, 114, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 235, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 236, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	233, 0, 668, 0, 0, 666, 0, 0, 0, 0,
-	0, 108,
+	0, 0, 234, 0, 670, 0, 0, 668, 0, 0,
+	0, 0, 0, 108,
 }
 
 var yyPact = [...]int{
-	-1000, -1000, 1247, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-	265, 435, 559, 720, -1000, -1000, -1000, 263, 4338, 260,
-	259, 5520, 5520, 5520, 136, 784, 5520, -1000, 6739, 257,
-	256, 255, -1000, 394, 5520, 783, 278, 32, 500, 781,
-	778, 774, 456, 451, 770, -1000, -1000, 253, -1000, -1000,
-	196, 252, 4836, 5520, 449, 449, 5520, 5520, 5520, 5520,
-	5520, -1000, -1000, 5520, 5520, 5520, 5520, 5520, 5520, 5520,
-	251, 5520, -1000, 763, 5520, 5520, 5520, -1000, -1000, -1000,
-	-1000, 86, -1000, 527, 525, -1000, 299, 246, 241, 5520,
-	5520, 239, 5520, 5520, -1000, -1000, -1000, -1000, -1000, -1000,
-	-1000, -1000, -1000, -1000, 761, 725, 32, -1000, 114, 208,
-	208, 235, -1000, 489, 714, 172, 714, 302, -1000, -1000,
-	354, 583, 42, 610, 714, -1000, -1000, -1000, -1000, -9,
-	-1000, -54, 3143, 5520, 636, 32, 475, 5520, 5520, 352,
-	6798, 670, 351, 350, -18, -1000, -1000, -19, -1000, -1000,
-	-58, -24, -1000, 6798, -1000, 5520, 5520, 5520, 5520, 5520,
-	5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520,
-	5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520, 5520,
-	5520, 364, 5406, 5520, 449, 5520, 720, -1000, 6680, 349,
-	-1000, 773, -1000, 737, -1000, 563, -1000, 567, 232, 4338,
-	229, 348, 273, 5292, 5520, 5520, 5520, 5520, 5520, 5520,
-	5520, 5520, 5520, 5520, 5520, 5520, -1000, -1000, 5520, 5520,
-	5520, 104, 4836, 82, -6, -1000, -1000, 6625, 449, 225,
-	-1000, -1000, 86, 5520, -1000, -1000, 4836, -1000, 408, 408,
-	458, 408, 6557, 408, 408, 408, 408, 408, 408, 408,
-	-1000, 5520, 408, 397, 694, 638, -1000, 195, 5178, 449,
-	7021, 6966, 7021, 5520, 3457, 3457, 208, -1000, 501, 209,
-	208, -1000, -1000, 5520, 5520, 6798, 6798, 5520, 6798, 6798,
-	738, -1000, 729, 499, 694, 224, 5520, -1000, -1000, 4722,
-	-1000, 4836, 735, 489, 342, 489, -1000, -1000, 1089, -1000,
-	341, -28, 580, 714, -1000, 571, 517, 733, 561, -1000,
-	-1000, 720, 5520, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-	-1000, 223, 6502, 219, -1000, 340, -8, 6798, 6447, -1000,
-	-1000, -1000, -1000, 136, -1000, 698, 5520, -1000, 5520, 7130,
-	7170, 6853, 7021, 6908, 164, 7250, 7210, 62, 62, 62,
-	458, 408, 458, 458, 269, 269, 3519, 3519, 3519, 3519,
-	96, 96, 96, 96, 3519, -1000, 6392, 5520, 7076, -11,
-	-1000, -1000, 6337, -30, 2985, -1000, -1000, -1000, 214, 563,
-	560, 532, 393, -1000, 532, 5520, -1000, 5520, -1000, -1000,
-	7021, 5520, 7021, 7021, 7021, 7021, 7021, 7021, 7021, 7021,
-	7021, 7021, 7021, 7021, 6282, 81, 6224, 208, -1000, 5520,
-	-1000, 171, -59, 4836, 5064, -1000, 4836, 6169, 71, -1000,
-	166, -1000, -1000, -1000, -1000, 184, 715, 6111, 97, 374,
-	5520, 66, 208, -1000, -1000, 5520, -1000, -1000, -1000, -1000,
+	-1000, -1000, 1249, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+	229, 459, 569, 708, -1000, -1000, -1000, 228, 4340, 226,
+	225, 5522, 5522, 5522, 133, 628, 5522, -1000, 6741, 222,
+	220, 219, -1000, 371, 5522, 759, 236, -2, 476, 756,
+	750, 749, 433, 470, 772, -1000, -1000, 215, -1000, -1000,
+	203, 212, 4838, 5522, 627, 627, 5522, 5522, 5522, 5522,
+	5522, -1000, -1000, 5522, 5522, 5522, 5522, 5522, 5522, 5522,
+	211, 5522, -1000, 755, 5522, 5522, 5522, -1000, -1000, -1000,
+	-1000, 89, -1000, 505, 504, -1000, 252, 209, 208, 5522,
+	5522, 207, 5522, 5522, -1000, -1000, -1000, -1000, -1000, -1000,
+	-1000, -1000, -1000, -1000, 666, 735, -2, -1000, 98, 173,
+	173, 204, -1000, 461, 702, 149, 702, 298, -1000, -1000,
+	315, 549, 42, 542, 702, -1000, -1000, -1000, -1000, 41,
+	-1000, -53, 3145, 5522, 625, -2, 451, 5522, 5522, 314,
+	6800, 622, 312, 310, 39, -1000, -1000, -16, -1000, -1000,
+	-58, -28, -1000, 6800, -1000, 5522, 5522, 5522, 5522, 5522,
+	5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522,
+	5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522, 5522,
+	5522, 431, 5408, 5522, 627, 5522, 708, -1000, 6682, 304,
+	-1000, 739, -1000, 725, -1000, 563, -1000, 564, 202, 4340,
+	198, 303, 187, 5294, 5522, 5522, 5522, 5522, 5522, 5522,
+	5522, 5522, 5522, 5522, 5522, 5522, 5522, -1000, -1000, 5522,
+	5522, 5522, 96, 4838, 80, -12, -1000, -1000, 6627, 627,
+	197, -1000, -1000, 89, 5522, -1000, -1000, 4838, -1000, 391,
+	391, 425, 391, 6559, 391, 391, 391, 391, 391, 391,
+	391, -1000, 5522, 391, 369, 727, 626, -1000, 174, 5180,
+	627, 7023, 6968, 7023, 5522, 3459, 3459, 173, -1000, 499,
+	168, 173, -1000, -1000, 5522, 5522, 6800, 6800, 5522, 6800,
+	6800, 573, -1000, 624, 440, 727, 193, 5522, -1000, -1000,
+	4724, -1000, 4838, 714, 461, 302, 461, -1000, -1000, 1091,
+	-1000, 301, -29, 531, 702, -1000, 522, 478, 710, 528,
+	-1000, -1000, 708, 5522, -1000, -1000, -1000, -1000, -1000, -1000,
+	-1000, -1000, 191, 6504, 181, -1000, 300, -13, 6800, 6449,
+	-1000, -1000, -1000, -1000, 133, -1000, 686, 5522, -1000, 5522,
+	7132, 7172, 6855, 7023, 6910, 7212, 7292, 7252, 136, 136,
+	136, 425, 391, 425, 425, 64, 64, 3521, 3521, 3521,
+	3521, 270, 270, 270, 270, 3521, -1000, 6394, 5522, 7078,
+	-18, -1000, -1000, 6339, -33, 2987, -1000, -1000, -1000, 180,
+	563, 553, 543, 366, -1000, 543, 5522, -1000, 5522, -1000,
+	-1000, 7023, 5522, 7023, 7023, 7023, 7023, 7023, 7023, 7023,
+	7023, 7023, 7023, 7023, 7023, 7023, 6284, 52, 6226, 173,
+	-1000, 5522, -1000, 148, -62, 4838, 5066, -1000, 4838, 6171,
+	49, -1000, 147, -1000, -1000, -1000, -1000, 224, 703, 6113,
+	104, 337, 5522, 40, 173, -1000, -1000, 5522, -1000, -1000,
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
@@ -1383,65 +1387,65 @@ var yyPact = [...]int{
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
 	-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-	-1000, -1000, -1000, 208, -1000, -1000, -1000, -1000, 136, 5520,
-	5520, 104, 136, 563, -13, -1000, 6798, 6056, 6001, -1000,
-	-1000, -1000, 618, 5943, -1000, -15, -1000, 6798, 5520, 158,
-	-1000, -1000, 931, -1000, -1000, -1000, 516, 546, -1000, 714,
-	535, 771, -1000, 515, -1000, 6798, 157, 4182, 5520, 5520,
-	5520, 222, -1000, -1000, 6798, -1000, 5520, 7076, 145, 449,
-	7562, 4026, -1000, 207, 618, 560, -1000, 532, -1000, -1000,
-	392, -50, -1000, 5888, 5833, 2827, 7250, 3870, -1000, -1000,
-	-1000, 5775, -60, 5520, -1000, 6798, 449, 199, 144, -1000,
-	-1000, -1000, 52, -1000, -1000, 673, -1000, -1000, -1000, -1000,
-	5520, -1000, 7021, -1000, -1000, 5717, -1000, -1000, 50, 5659,
-	-1000, -1000, 560, 142, 5520, -1000, -1000, 140, -16, -1000,
-	45, -1000, -1000, 620, -1000, -1000, -1000, -1000, 135, 4950,
-	6798, -1000, -1000, 714, 514, -35, -1000, -1000, 714, 771,
-	-1000, 337, -1000, -1000, -1000, 5604, 336, 6798, -1000, 335,
-	334, 7076, 322, -1000, 132, 554, 449, 194, 4836, -1000,
-	-1000, -1000, 609, 618, 123, -1000, 391, -50, 1429, -1000,
-	532, 4338, 210, 320, -1000, -1000, -1000, 5520, 7021, -1000,
-	4836, -60, -1000, -1000, 5549, -1000, -1000, -1000, -1000, -1000,
-	-1000, 204, 618, 472, -1000, -1000, -1000, -1000, -40, -1000,
-	714, 372, 771, -1000, -35, -1000, 2669, 316, 5520, 410,
-	-1000, 799, -1000, -1000, 3558, 7562, -1000, 4836, 49, 2511,
-	-1000, 193, 390, 122, 598, 387, -1000, -1000, -1000, 618,
-	657, 532, 534, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-	-1000, 1271, -1000, -1000, -1000, -1000, 3301, 7021, 119, 370,
-	386, -1000, 618, -1000, 693, -1000, 368, 714, -40, -1000,
-	-1000, 367, 311, -1000, 117, -1000, 5520, 203, 407, 310,
-	793, -1000, -1000, -1000, 107, -1000, 91, -1000, 309, 532,
-	-1000, 204, 204, 186, -1000, 1113, 678, 7402, 32, -37,
-	-1000, -1000, 3301, -60, -1000, -1000, 548, -1000, -65, -1000,
-	-1000, 363, -1000, -1000, 3714, 338, -1000, -1000, -1000, -1000,
-	-1000, 306, 2353, 3558, -1000, -1000, 88, -1000, 2195, 384,
-	378, 143, 955, -1000, -29, -1000, -66, -31, -1000, -70,
-	7402, -1000, -1000, 4621, 664, 5520, 5520, -1000, -1000, -1000,
-	-1000, -1000, 3301, -1000, 305, -1000, 90, 532, -1000, -1000,
-	-1000, -36, -1000, -1000, 690, -1000, -1000, 678, -1000, 5520,
-	-1000, 7402, 5520, -1000, -1000, 4494, -1000, 303, 295, 578,
-	617, 495, -1000, 475, -1000, -1000, 7021, 6798, 2037, 3301,
-	-1000, 365, -1000, 1879, 1721, -1000, 143, -1000, -1000, 6798,
-	-1000, 6798, 175, -1000, -1000, -1000, -1000, 532, 7503, 7402,
-	270, -1000, -1000, -1000, -1000, -1000, -1000, 618, -50, -1000,
-	-1000, 7402, -1000, -1000, 1563, 89, -1000, -1000, 204, 286,
-	-1000, -1000, -1000, 1405, -1000,
+	-1000, -1000, -1000, -1000, -1000, 173, -1000, -1000, -1000, -1000,
+	133, 5522, 5522, 96, 133, 563, -19, -1000, 6800, 6058,
+	6003, -1000, -1000, -1000, 233, 5945, -1000, -34, -1000, 6800,
+	5522, 138, -1000, -1000, 933, -1000, -1000, -1000, 477, 526,
+	-1000, 702, 514, 672, -1000, 473, -1000, 6800, 135, 4184,
+	5522, 5522, 5522, 186, -1000, -1000, 6800, -1000, 5522, 7078,
+	134, 627, 7604, 4028, -1000, 172, 233, 553, -1000, 543,
+	-1000, -1000, 365, -40, -1000, 5890, 5835, 2829, 7292, 3872,
+	-1000, -1000, -1000, 5777, -65, 5522, -1000, 6800, 627, 171,
+	132, -1000, -1000, -1000, 31, -1000, -1000, 650, -1000, -1000,
+	-1000, -1000, 5522, -1000, 7023, -1000, -1000, 5719, -1000, -1000,
+	3, 5661, -1000, -1000, 553, 131, 5522, -1000, -1000, 129,
+	-35, -1000, -1, -1000, -1000, 634, -1000, -1000, -1000, -1000,
+	128, 4952, 6800, -1000, -1000, 702, 458, -37, -1000, -1000,
+	702, 672, -1000, 299, -1000, -1000, -1000, 5606, 294, 6800,
+	-1000, 291, 286, 7078, 285, -1000, 124, 536, 627, 167,
+	4838, -1000, -1000, -1000, 614, 233, 119, -1000, 357, -40,
+	1431, -1000, 543, 4340, 175, 280, -1000, -1000, -1000, 5522,
+	7023, -1000, 4838, -65, -1000, -1000, 5551, -1000, -1000, -1000,
+	-1000, -1000, -1000, 163, 233, 447, -1000, -1000, -1000, -1000,
+	-38, -1000, 702, 322, 672, -1000, -37, -1000, 2671, 276,
+	5522, 376, -1000, 785, -1000, -1000, 3560, 7604, -1000, 4838,
+	2, 2513, -1000, 158, 355, 118, 554, 354, -1000, -1000,
+	-1000, 233, 647, 543, 448, -1000, -1000, -1000, -1000, -1000,
+	-1000, -1000, -1000, 1273, -1000, -1000, -1000, -1000, 3303, 7023,
+	114, 321, 353, -1000, 233, -1000, 685, -1000, 318, 702,
+	-38, -1000, -1000, 317, 272, -1000, 110, -1000, 5522, 162,
+	368, 269, 775, -1000, -1000, -1000, 107, -1000, 103, -1000,
+	268, 543, -1000, 163, 163, 156, -1000, 1115, 679, 7444,
+	-2, -41, -1000, -1000, 3303, -65, -1000, -1000, 533, -1000,
+	-66, -1000, -1000, 253, -1000, -1000, 3716, 339, -1000, -1000,
+	-1000, -1000, -1000, 264, 2355, 3560, -1000, -1000, 87, -1000,
+	2197, 352, 346, 137, 957, -1000, -31, -1000, -73, -32,
+	-1000, -74, 7444, -1000, -1000, 4623, 436, 5522, 5522, -1000,
+	-1000, -1000, -1000, -1000, 3303, -1000, 260, -1000, 102, 543,
+	-1000, -1000, -1000, -36, -1000, -1000, 680, -1000, -1000, 679,
+	-1000, 5522, -1000, 7444, 5522, -1000, -1000, 4496, -1000, 256,
+	249, 587, 606, 475, -1000, 451, -1000, -1000, 7023, 6800,
+	2039, 3303, -1000, 345, -1000, 1881, 1723, -1000, 137, -1000,
+	-1000, 6800, -1000, 6800, 155, -1000, -1000, -1000, -1000, 543,
+	7545, 7444, 242, -1000, -1000, -1000, -1000, -1000, -1000, 233,
+	-40, -1000, -1000, 7444, -1000, -1000, 1565, 101, -1000, -1000,
+	163, 238, -1000, -1000, -1000, 1407, -1000,
 }
 
 var yyPgo = [...]int{
-	0, 955, 953, 14, 8, 948, 4, 29, 13, 947,
-	11, 44, 79, 71, 49, 45, 946, 26, 944, 78,
-	21, 83, 942, 0, 62, 927, 925, 40, 190, 37,
-	19, 36, 924, 84, 73, 923, 5, 922, 920, 912,
-	911, 15, 51, 910, 909, 95, 101, 199, 908, 907,
-	906, 6, 905, 88, 41, 904, 56, 50, 901, 900,
-	886, 885, 884, 80, 879, 878, 877, 874, 10, 872,
-	871, 46, 39, 38, 2, 16, 674, 81, 87, 867,
-	866, 864, 12, 863, 860, 557, 42, 55, 858, 856,
-	9, 720, 32, 20, 854, 851, 850, 849, 844, 543,
-	843, 18, 842, 835, 834, 89, 833, 43, 828, 827,
-	25, 33, 820, 819, 34, 817, 811, 562, 804, 800,
-	799, 99, 1, 3, 797, 17, 7, 28, 735,
+	0, 906, 903, 14, 8, 888, 4, 29, 13, 887,
+	11, 44, 79, 71, 49, 48, 886, 26, 881, 84,
+	21, 83, 880, 0, 78, 879, 876, 40, 190, 32,
+	19, 39, 874, 55, 62, 873, 5, 869, 868, 866,
+	865, 15, 46, 862, 860, 107, 92, 198, 858, 856,
+	853, 6, 852, 87, 50, 851, 81, 56, 846, 845,
+	844, 843, 842, 80, 841, 840, 839, 837, 10, 836,
+	835, 43, 41, 38, 2, 16, 676, 85, 86, 834,
+	830, 829, 12, 828, 827, 519, 42, 37, 826, 824,
+	9, 732, 20, 34, 823, 822, 821, 819, 811, 525,
+	810, 18, 802, 801, 799, 95, 798, 36, 795, 793,
+	25, 33, 790, 785, 45, 783, 782, 526, 780, 778,
+	774, 73, 1, 3, 773, 17, 7, 28, 765,
 }
 
 var yyR1 = [...]int{
@@ -1482,19 +1486,19 @@ var yyR1 = [...]int{
 	32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
 	32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
 	32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-	32, 32, 85, 85, 127, 3, 3, 89, 89, 118,
-	118, 51, 51, 52, 52, 52, 52, 45, 45, 46,
-	46, 49, 49, 100, 100, 100, 78, 78, 56, 56,
-	56, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-	50, 50, 50, 50, 50, 50, 50, 57, 57, 57,
-	23, 23, 24, 24, 55, 58, 58, 58, 59, 59,
-	59, 60, 60, 60, 60, 60, 60, 28, 28, 28,
-	47, 47, 47, 61, 61, 62, 62, 62, 62, 62,
-	62, 53, 53, 53, 54, 54, 54, 93, 71, 71,
-	94, 94, 70, 70, 70, 70, 70, 70, 99, 99,
-	99, 99, 63, 63, 63, 63, 63, 63, 63, 64,
-	64, 64, 64, 48, 48, 48, 48, 48, 48, 48,
-	119, 119, 72,
+	32, 32, 32, 85, 85, 127, 3, 3, 89, 89,
+	118, 118, 51, 51, 52, 52, 52, 52, 45, 45,
+	46, 46, 49, 49, 100, 100, 100, 78, 78, 56,
+	56, 56, 50, 50, 50, 50, 50, 50, 50, 50,
+	50, 50, 50, 50, 50, 50, 50, 50, 57, 57,
+	57, 23, 23, 24, 24, 55, 58, 58, 58, 59,
+	59, 59, 60, 60, 60, 60, 60, 60, 28, 28,
+	28, 47, 47, 47, 61, 61, 62, 62, 62, 62,
+	62, 62, 53, 53, 53, 54, 54, 54, 93, 71,
+	71, 94, 94, 70, 70, 70, 70, 70, 70, 99,
+	99, 99, 99, 63, 63, 63, 63, 63, 63, 63,
+	64, 64, 64, 64, 48, 48, 48, 48, 48, 48,
+	48, 119, 119, 72,
 }
 
 var yyR2 = [...]int{
@@ -1529,25 +1533,25 @@ var yyR2 = [...]int{
 	2, 4, 3, 1, 4, 4, 3, 1, 1, 0,
 	1, 3, 1, 8, 3, 2, 6, 5, 3, 4,
 	2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-	3, 3, 3, 2, 2, 2, 2, 3, 3, 3,
-	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
 	3, 3, 3, 3, 2, 2, 2, 2, 3, 3,
-	3, 3, 3, 3, 3, 3, 3, 3, 3, 1,
-	5, 4, 3, 1, 2, 2, 2, 2, 2, 2,
-	2, 2, 2, 1, 3, 2, 1, 2, 4, 2,
-	1, 2, 11, 9, 0, 0, 1, 0, 4, 3,
-	1, 1, 2, 2, 4, 4, 2, 1, 1, 1,
-	1, 0, 3, 0, 1, 1, 0, 1, 4, 3,
-	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-	1, 3, 2, 3, 3, 1, 1, 1, 3, 3,
-	1, 1, 0, 1, 1, 1, 3, 1, 1, 3,
-	1, 1, 4, 4, 4, 4, 1, 1, 1, 3,
-	1, 4, 2, 3, 3, 1, 4, 4, 3, 3,
-	3, 1, 3, 1, 1, 3, 1, 1, 0, 1,
-	3, 1, 3, 1, 4, 2, 6, 4, 2, 2,
-	1, 2, 1, 4, 3, 3, 3, 6, 3, 1,
-	1, 2, 1, 5, 4, 2, 2, 4, 2, 2,
-	1, 3, 1,
+	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 3, 3, 3, 2, 2, 2, 2, 3,
+	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	1, 5, 4, 3, 1, 2, 2, 2, 2, 2,
+	2, 2, 2, 2, 1, 3, 2, 1, 2, 4,
+	2, 1, 2, 11, 9, 0, 0, 1, 0, 4,
+	3, 1, 1, 2, 2, 4, 4, 2, 1, 1,
+	1, 1, 0, 3, 0, 1, 1, 0, 1, 4,
+	3, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 3, 2, 3, 3, 1, 1, 1, 3,
+	3, 1, 1, 0, 1, 1, 1, 3, 1, 1,
+	3, 1, 1, 4, 4, 4, 4, 1, 1, 1,
+	3, 1, 4, 2, 3, 3, 1, 4, 4, 3,
+	3, 3, 1, 3, 1, 1, 3, 1, 1, 0,
+	1, 3, 1, 3, 1, 4, 2, 6, 4, 2,
+	2, 1, 2, 1, 4, 3, 3, 3, 6, 3,
+	1, 1, 2, 1, 5, 4, 2, 2, 4, 2,
+	2, 1, 3, 1,
 }
 
 var yyChk = [...]int{
@@ -1572,176 +1576,176 @@ var yyChk = [...]int{
 	116, 91, 152, 115, 148, 148, 148, 144, -23, 10,
 	147, -3, 153, 53, -76, 10, 10, 10, 94, 95,
 	94, 96, 95, 162, 118, 119, 120, 121, 122, 123,
-	124, 125, 126, 127, 128, 129, 105, 106, 148, 150,
-	144, 58, 148, -93, -94, -71, -70, -23, 153, 60,
-	-23, -28, -57, 148, -56, 99, 150, -28, -23, -23,
+	124, 125, 126, 127, 128, 129, 130, 105, 106, 148,
+	150, 144, 58, 148, -93, -94, -71, -70, -23, 153,
+	60, -23, -28, -57, 148, -56, 99, 150, -28, -23,
 	-23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
-	-49, 148, -23, -100, 17, -99, -63, 12, 77, 78,
-	-23, -23, -23, 150, 79, 79, -46, -44, -45, -62,
-	53, -10, -47, 148, 148, -23, -23, 148, -23, -23,
-	17, 76, -99, -99, 17, -3, 144, -47, -77, 148,
-	-77, 148, 83, -101, 149, -101, 146, 144, -121, 146,
-	-16, -117, -101, 83, 146, 160, 83, 29, -101, -20,
-	146, 160, 162, -22, 145, 2, -11, -12, -13, -14,
-	-15, 52, -23, 21, -3, -107, -108, -23, -23, 146,
-	146, 146, 146, 160, 146, 160, 162, 146, 160, -23,
+	-23, -49, 148, -23, -100, 17, -99, -63, 12, 77,
+	78, -23, -23, -23, 150, 79, 79, -46, -44, -45,
+	-62, 53, -10, -47, 148, 148, -23, -23, 148, -23,
+	-23, 17, 76, -99, -99, 17, -3, 144, -47, -77,
+	148, -77, 148, 83, -101, 149, -101, 146, 144, -121,
+	146, -16, -117, -101, 83, 146, 160, 83, 29, -101,
+	-20, 146, 160, 162, -22, 145, 2, -11, -12, -13,
+	-14, -15, 52, -23, 21, -3, -107, -108, -23, -23,
+	146, 146, 146, 146, 160, 146, 160, 162, 146, 160,
 	-23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
 	-23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
-	-23, -23, -23, -23, -23, -46, -23, 147, -23, -116,
-	-27, -28, -23, -105, -122, 146, 146, 10, -127, 10,
-	-86, 56, -127, -88, 56, 148, -11, 148, 146, 147,
-	-23, 153, -23, -23, -23, -23, -23, -23, -23, -23,
-	-23, -23, -23, -23, -23, -24, -23, -54, 10, 144,
-	-47, -93, 151, 160, 59, -28, 148, -23, -93, 149,
-	-24, 143, -63, -63, 17, 150, 58, -23, 11, -28,
-	59, -24, -53, -6, -47, 144, 10, -5, -4, 99,
-	100, 101, 102, 103, 104, 4, 5, 85, 86, 87,
-	88, 89, 90, 91, 92, 93, 6, 7, 94, 95,
-	96, 19, 20, 21, 22, 23, 24, 25, 26, 27,
-	28, 29, 41, 42, 43, 44, 45, 46, 47, 48,
-	49, 50, 51, 35, 36, 37, 39, 40, 97, 98,
-	60, 30, 31, 32, 33, 34, 61, 62, 56, 57,
-	80, 54, 55, 53, 63, 64, 66, 65, 67, 68,
-	82, 81, 38, -53, -6, -47, -78, -77, 79, 150,
-	144, 58, 79, -78, -119, -72, -23, -23, -23, 76,
-	76, 142, 148, -23, 149, -120, -31, -23, 84, -93,
-	10, 146, -121, 145, 146, 146, 83, -101, -19, 83,
-	-101, 144, 10, 83, -21, -23, 148, 149, 148, 146,
-	160, 149, -33, -34, -23, -42, 147, -23, -7, 160,
-	29, 149, 145, -127, 148, -86, -87, 57, -10, 144,
-	-127, -126, -10, -23, -23, -122, -23, 149, 151, 145,
-	-77, -23, 149, 162, -71, -23, 153, 60, -93, 149,
-	151, 149, -64, 10, 13, 154, 12, 10, 145, 145,
-	150, 145, -23, 151, -77, -23, -77, -47, -24, -23,
-	-54, -47, -86, -7, 160, 149, 149, -123, -124, -29,
-	-30, -75, -73, 152, 61, 62, -10, 145, -7, 160,
-	-23, 149, 145, 144, 83, -111, -17, -20, -91, 144,
-	-127, 149, -84, -11, 147, -23, -107, -23, -80, 144,
-	147, -23, 149, -27, -92, -28, 153, 60, 150, -25,
-	-11, 147, -103, 148, -123, -87, -127, -126, -125, 144,
-	160, 149, 149, 96, -11, 147, 145, 162, -23, -28,
-	148, 149, 151, 13, -23, 145, 151, 145, -87, 149,
-	-72, 149, 160, -1, 153, -73, 149, -31, -110, -20,
-	144, -7, 160, -20, -111, 146, -122, 149, 146, -114,
-	146, -114, 146, 146, 149, 59, -28, 148, -93, -122,
-	-26, 42, 43, -123, 149, -127, 144, 145, -35, -97,
-	-95, 45, -96, 48, -90, 104, 103, 102, 99, 100,
-	101, -125, -10, -11, 147, 146, -122, -23, -93, 151,
-	-127, -74, 147, -29, -2, 84, -7, 160, -110, 145,
-	-17, -7, 22, 146, -107, 145, 32, 33, -114, 31,
-	-114, -82, -11, 147, -92, -28, -93, 151, 28, 148,
-	144, 149, -89, 45, 144, -125, -30, 39, 37, -126,
-	-90, 145, -122, 149, 145, 144, -127, -75, 12, 145,
-	-20, -7, 145, 146, 149, -23, -8, 147, 146, 145,
-	146, 31, -122, 149, 149, 146, -102, -10, -122, -74,
-	-74, 148, -125, 145, -112, -41, 12, -104, -68, -6,
-	-3, -79, 146, 144, -125, 59, 162, 145, -83, -11,
-	147, -8, -122, 146, 26, -82, 12, 161, 145, 144,
-	144, -118, -51, 12, 153, 145, 146, 160, -127, 162,
-	146, 160, 162, -6, 145, -115, -36, -37, -38, -39,
-	-40, -10, -6, 80, 10, 145, -23, -23, -122, -122,
-	146, 149, -10, -122, -122, 149, 160, 12, -41, -23,
-	-68, -23, -127, 145, -36, 146, 146, 46, 29, 79,
-	24, 144, 145, 145, -51, -127, -127, 148, -126, 10,
-	-4, -90, -6, 146, -122, -123, -6, 145, 149, -74,
-	-81, 146, 144, -122, 145,
+	-23, -23, -23, -23, -23, -23, -46, -23, 147, -23,
+	-116, -27, -28, -23, -105, -122, 146, 146, 10, -127,
+	10, -86, 56, -127, -88, 56, 148, -11, 148, 146,
+	147, -23, 153, -23, -23, -23, -23, -23, -23, -23,
+	-23, -23, -23, -23, -23, -23, -23, -24, -23, -54,
+	10, 144, -47, -93, 151, 160, 59, -28, 148, -23,
+	-93, 149, -24, 143, -63, -63, 17, 150, 58, -23,
+	11, -28, 59, -24, -53, -6, -47, 144, 10, -5,
+	-4, 99, 100, 101, 102, 103, 104, 4, 5, 85,
+	86, 87, 88, 89, 90, 91, 92, 93, 6, 7,
+	94, 95, 96, 19, 20, 21, 22, 23, 24, 25,
+	26, 27, 28, 29, 41, 42, 43, 44, 45, 46,
+	47, 48, 49, 50, 51, 35, 36, 37, 39, 40,
+	97, 98, 60, 30, 31, 32, 33, 34, 61, 62,
+	56, 57, 80, 54, 55, 53, 63, 64, 66, 65,
+	67, 68, 82, 81, 38, -53, -6, -47, -78, -77,
+	79, 150, 144, 58, 79, -78, -119, -72, -23, -23,
+	-23, 76, 76, 142, 148, -23, 149, -120, -31, -23,
+	84, -93, 10, 146, -121, 145, 146, 146, 83, -101,
+	-19, 83, -101, 144, 10, 83, -21, -23, 148, 149,
+	148, 146, 160, 149, -33, -34, -23, -42, 147, -23,
+	-7, 160, 29, 149, 145, -127, 148, -86, -87, 57,
+	-10, 144, -127, -126, -10, -23, -23, -122, -23, 149,
+	151, 145, -77, -23, 149, 162, -71, -23, 153, 60,
+	-93, 149, 151, 149, -64, 10, 13, 154, 12, 10,
+	145, 145, 150, 145, -23, 151, -77, -23, -77, -47,
+	-24, -23, -54, -47, -86, -7, 160, 149, 149, -123,
+	-124, -29, -30, -75, -73, 152, 61, 62, -10, 145,
+	-7, 160, -23, 149, 145, 144, 83, -111, -17, -20,
+	-91, 144, -127, 149, -84, -11, 147, -23, -107, -23,
+	-80, 144, 147, -23, 149, -27, -92, -28, 153, 60,
+	150, -25, -11, 147, -103, 148, -123, -87, -127, -126,
+	-125, 144, 160, 149, 149, 96, -11, 147, 145, 162,
+	-23, -28, 148, 149, 151, 13, -23, 145, 151, 145,
+	-87, 149, -72, 149, 160, -1, 153, -73, 149, -31,
+	-110, -20, 144, -7, 160, -20, -111, 146, -122, 149,
+	146, -114, 146, -114, 146, 146, 149, 59, -28, 148,
+	-93, -122, -26, 42, 43, -123, 149, -127, 144, 145,
+	-35, -97, -95, 45, -96, 48, -90, 104, 103, 102,
+	99, 100, 101, -125, -10, -11, 147, 146, -122, -23,
+	-93, 151, -127, -74, 147, -29, -2, 84, -7, 160,
+	-110, 145, -17, -7, 22, 146, -107, 145, 32, 33,
+	-114, 31, -114, -82, -11, 147, -92, -28, -93, 151,
+	28, 148, 144, 149, -89, 45, 144, -125, -30, 39,
+	37, -126, -90, 145, -122, 149, 145, 144, -127, -75,
+	12, 145, -20, -7, 145, 146, 149, -23, -8, 147,
+	146, 145, 146, 31, -122, 149, 149, 146, -102, -10,
+	-122, -74, -74, 148, -125, 145, -112, -41, 12, -104,
+	-68, -6, -3, -79, 146, 144, -125, 59, 162, 145,
+	-83, -11, 147, -8, -122, 146, 26, -82, 12, 161,
+	145, 144, 144, -118, -51, 12, 153, 145, 146, 160,
+	-127, 162, 146, 160, 162, -6, 145, -115, -36, -37,
+	-38, -39, -40, -10, -6, 80, 10, 145, -23, -23,
+	-122, -122, 146, 149, -10, -122, -122, 149, 160, 12,
+	-41, -23, -68, -23, -127, 145, -36, 146, 146, 46,
+	29, 79, 24, 144, 145, 145, -51, -127, -127, 148,
+	-126, 10, -4, -90, -6, 146, -122, -123, -6, 145,
+	149, -74, -81, 146, 144, -122, 145,
 }
 
 var yyDef = [...]int{
 	80, -2, -2, 79, 86, 87, 88, 89, 90, 91,
 	0, 0, 0, 0, 124, 133, 134, 0, 0, 0,
-	0, 422, 422, 422, 0, 387, 0, 145, 0, 0,
-	0, 0, 151, 0, 0, 0, 81, 375, 0, 0,
-	0, 0, 207, 0, -2, 421, 172, 0, -2, 438,
-	424, 0, 458, 0, 0, 0, 0, 0, 0, 0,
-	0, 349, 353, 0, 0, 0, 0, 0, 0, 0,
-	391, 0, 363, 393, 0, 366, 0, 370, 174, 175,
-	431, 416, 436, 0, 0, -2, 0, 0, 0, 0,
-	0, 0, 0, 0, 401, 402, 403, 404, 405, 406,
-	407, 408, 409, 410, 0, 0, 375, 440, 0, -2,
-	0, 0, 400, 83, 0, 0, 0, 0, 80, 81,
+	0, 423, 423, 423, 0, 388, 0, 145, 0, 0,
+	0, 0, 151, 0, 0, 0, 81, 376, 0, 0,
+	0, 0, 207, 0, -2, 422, 172, 0, -2, 439,
+	425, 0, 459, 0, 0, 0, 0, 0, 0, 0,
+	0, 350, 354, 0, 0, 0, 0, 0, 0, 0,
+	392, 0, 364, 394, 0, 367, 0, 371, 174, 175,
+	432, 417, 437, 0, 0, -2, 0, 0, 0, 0,
+	0, 0, 0, 0, 402, 403, 404, 405, 406, 407,
+	408, 409, 410, 411, 0, 0, 376, 441, 0, -2,
+	0, 0, 401, 83, 0, 0, 0, 0, 80, 81,
 	0, 0, 0, 117, 0, 101, 102, 114, 119, 0,
-	122, 0, 0, 0, 0, 375, 0, 289, 0, 0,
-	423, 387, 0, 0, 0, 235, 236, 0, 371, 238,
+	122, 0, 0, 0, 0, 376, 0, 289, 0, 0,
+	424, 388, 0, 0, 0, 235, 236, 0, 372, 238,
 	239, 0, 287, 288, 146, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 124, 0, 0,
-	155, 374, 376, 0, 173, 178, 374, 180, 0, 0,
+	155, 375, 377, 0, 173, 178, 375, 180, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 313, 315, 0, 422,
-	0, 0, 458, 0, 457, 461, 459, 463, 0, 0,
-	300, -2, 0, 0, -2, 387, 458, -2, 334, 335,
-	336, 337, 0, 354, 355, 356, 357, 358, 359, 360,
-	361, 422, 362, 0, 394, 395, 470, 472, 0, 0,
-	365, 367, 369, 422, 0, 0, 396, 295, 389, 390,
-	396, 388, 445, 0, 0, 485, 486, 0, 488, 489,
-	0, 412, 0, 0, 0, 0, 0, 442, 383, 0,
-	386, 458, 0, 85, 0, 84, 93, 80, 0, 96,
-	0, 0, 117, 0, 98, 0, 0, 0, 117, 120,
-	100, 0, 0, 123, 132, 125, 126, 127, 128, 129,
-	130, 0, 0, 0, 374, 0, 290, 292, 0, 139,
-	140, 141, 142, 0, 143, 0, 0, 144, 0, 317,
+	0, 0, 0, 0, 0, 0, 0, 314, 316, 0,
+	423, 0, 0, 459, 0, 458, 462, 460, 464, 0,
+	0, 300, -2, 0, 0, -2, 388, 459, -2, 335,
+	336, 337, 338, 0, 355, 356, 357, 358, 359, 360,
+	361, 362, 423, 363, 0, 395, 396, 471, 473, 0,
+	0, 366, 368, 370, 423, 0, 0, 397, 295, 390,
+	391, 397, 389, 446, 0, 0, 486, 487, 0, 489,
+	490, 0, 413, 0, 0, 0, 0, 0, 443, 384,
+	0, 387, 459, 0, 85, 0, 84, 93, 80, 0,
+	96, 0, 0, 117, 0, 98, 0, 0, 0, 117,
+	120, 100, 0, 0, 123, 132, 125, 126, 127, 128,
+	129, 130, 0, 0, 0, 375, 0, 290, 292, 0,
+	139, 140, 141, 142, 0, 143, 0, 0, 144, 0,
 	318, 319, 320, 321, 322, 323, 324, 325, 326, 327,
-	328, 329, 330, 331, 332, 333, -2, -2, -2, -2,
-	-2, -2, -2, -2, -2, 347, 0, 0, 352, 107,
-	162, -2, 0, 0, 0, 153, 154, 374, 0, 178,
-	182, 0, 0, 374, 0, 0, 208, 0, 211, 124,
-	298, 0, 301, 302, 303, 304, 305, 306, 307, 308,
-	309, 310, 311, 312, 0, 0, 0, 439, 454, 0,
-	456, 0, 399, 458, 0, -2, 458, 0, 0, -2,
-	0, 364, 471, 468, 469, 0, 0, 0, 0, 425,
-	0, 0, 0, -2, -2, 0, 77, 78, 70, 71,
-	72, 73, 74, 75, 76, 2, 3, 4, 5, 6,
-	7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
-	17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
-	27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
-	37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
-	47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
-	57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
-	67, 68, 69, 0, -2, -2, 294, 397, 0, 422,
-	0, 0, 0, 178, 107, 490, 492, 0, 0, 411,
-	414, 413, -2, 0, 228, 107, 230, 232, 0, 0,
-	82, 92, 0, 95, 97, 99, 0, 117, 113, 0,
-	117, 0, 118, 0, 121, 374, 0, 0, 0, 289,
-	0, 0, 234, 237, 240, 286, 0, 351, 0, 108,
-	0, 0, 156, 0, -2, 182, 374, 0, 179, 242,
-	0, 181, 247, 0, 0, 0, 299, 0, 432, 434,
-	435, 0, 0, 0, 460, 462, 0, 0, 0, -2,
-	399, 392, 0, 479, 480, 0, 482, 474, 475, 476,
-	0, 478, 368, 433, 384, 0, 385, 449, 0, 0,
-	448, 450, 182, 0, 108, 484, 487, 0, 213, 215,
-	166, 220, 221, 0, 223, 224, 225, 441, 0, 108,
-	233, 398, 94, 0, 0, 107, 110, 115, 0, 0,
-	285, 0, 135, 203, 124, 0, 0, 291, 138, 198,
-	198, 350, 0, 163, 0, -2, 0, 0, 458, 150,
-	192, 124, 160, -2, 0, 374, 0, 183, 268, 242,
-	0, 0, 0, 0, 205, 124, 455, 0, 297, -2,
-	458, 467, 473, 481, 0, 452, 446, 447, 374, 483,
-	491, 226, 219, 168, 167, 222, 229, 231, 107, 112,
-	0, 0, 108, 116, 107, 131, 0, 0, 289, 0,
-	198, 0, 198, 147, 0, 0, -2, 458, 0, 0,
-	152, 0, 0, 0, 377, 0, 242, 176, 241, 219,
-	0, 0, -2, 267, 270, 272, 273, 274, 275, 276,
-	277, 268, 248, 206, 124, 212, -2, 296, 0, 0,
-	0, 374, 0, 216, 0, 169, 0, 108, 107, 105,
-	109, 0, 0, 136, 0, 194, 0, 0, 0, 0,
-	0, 148, 190, 124, 0, -2, 0, -2, 0, 0,
-	124, 226, 226, 0, 242, 268, 0, 0, 375, 0,
-	271, 177, -2, 466, 477, 242, 0, 227, 217, 103,
-	111, 0, 106, 204, 0, 0, 124, 201, 202, 195,
-	196, 0, 0, 0, 186, 193, 0, 158, 0, 0,
-	0, 0, 268, 171, 0, 279, 374, 0, 283, 0,
-	0, 245, 249, 0, 268, 0, 0, 104, 137, 188,
-	124, 124, -2, 197, 0, 149, 0, 0, 161, 124,
-	124, 0, 380, 381, 0, 170, 243, 0, 280, 0,
-	244, 0, 0, 374, 250, 0, 252, 0, 0, 262,
-	0, 0, 261, 57, -2, 293, 373, 218, 0, -2,
-	191, 0, 159, 0, 0, 378, 0, 382, 278, 374,
-	282, 374, 0, 251, 253, 254, 255, 0, 0, 0,
-	0, 124, 165, 372, 379, 281, 284, -2, 256, 257,
-	258, 260, 263, 189, 0, 0, 259, 157, 226, 0,
-	246, 264, 124, 0, 265,
+	328, 329, 330, 331, 332, 333, 334, -2, -2, -2,
+	-2, -2, -2, -2, -2, -2, 348, 0, 0, 353,
+	107, 162, -2, 0, 0, 0, 153, 154, 375, 0,
+	178, 182, 0, 0, 375, 0, 0, 208, 0, 211,
+	124, 298, 0, 301, 302, 303, 304, 305, 306, 307,
+	308, 309, 310, 311, 312, 313, 0, 0, 0, 440,
+	455, 0, 457, 0, 400, 459, 0, -2, 459, 0,
+	0, -2, 0, 365, 472, 469, 470, 0, 0, 0,
+	0, 426, 0, 0, 0, -2, -2, 0, 77, 78,
+	70, 71, 72, 73, 74, 75, 76, 2, 3, 4,
+	5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+	15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+	25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+	35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+	45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+	55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+	65, 66, 67, 68, 69, 0, -2, -2, 294, 398,
+	0, 423, 0, 0, 0, 178, 107, 491, 493, 0,
+	0, 412, 415, 414, -2, 0, 228, 107, 230, 232,
+	0, 0, 82, 92, 0, 95, 97, 99, 0, 117,
+	113, 0, 117, 0, 118, 0, 121, 375, 0, 0,
+	0, 289, 0, 0, 234, 237, 240, 286, 0, 352,
+	0, 108, 0, 0, 156, 0, -2, 182, 375, 0,
+	179, 242, 0, 181, 247, 0, 0, 0, 299, 0,
+	433, 435, 436, 0, 0, 0, 461, 463, 0, 0,
+	0, -2, 400, 393, 0, 480, 481, 0, 483, 475,
+	476, 477, 0, 479, 369, 434, 385, 0, 386, 450,
+	0, 0, 449, 451, 182, 0, 108, 485, 488, 0,
+	213, 215, 166, 220, 221, 0, 223, 224, 225, 442,
+	0, 108, 233, 399, 94, 0, 0, 107, 110, 115,
+	0, 0, 285, 0, 135, 203, 124, 0, 0, 291,
+	138, 198, 198, 351, 0, 163, 0, -2, 0, 0,
+	459, 150, 192, 124, 160, -2, 0, 375, 0, 183,
+	268, 242, 0, 0, 0, 0, 205, 124, 456, 0,
+	297, -2, 459, 468, 474, 482, 0, 453, 447, 448,
+	375, 484, 492, 226, 219, 168, 167, 222, 229, 231,
+	107, 112, 0, 0, 108, 116, 107, 131, 0, 0,
+	289, 0, 198, 0, 198, 147, 0, 0, -2, 459,
+	0, 0, 152, 0, 0, 0, 378, 0, 242, 176,
+	241, 219, 0, 0, -2, 267, 270, 272, 273, 274,
+	275, 276, 277, 268, 248, 206, 124, 212, -2, 296,
+	0, 0, 0, 375, 0, 216, 0, 169, 0, 108,
+	107, 105, 109, 0, 0, 136, 0, 194, 0, 0,
+	0, 0, 0, 148, 190, 124, 0, -2, 0, -2,
+	0, 0, 124, 226, 226, 0, 242, 268, 0, 0,
+	376, 0, 271, 177, -2, 467, 478, 242, 0, 227,
+	217, 103, 111, 0, 106, 204, 0, 0, 124, 201,
+	202, 195, 196, 0, 0, 0, 186, 193, 0, 158,
+	0, 0, 0, 0, 268, 171, 0, 279, 375, 0,
+	283, 0, 0, 245, 249, 0, 268, 0, 0, 104,
+	137, 188, 124, 124, -2, 197, 0, 149, 0, 0,
+	161, 124, 124, 0, 381, 382, 0, 170, 243, 0,
+	280, 0, 244, 0, 0, 375, 250, 0, 252, 0,
+	0, 262, 0, 0, 261, 57, -2, 293, 374, 218,
+	0, -2, 191, 0, 159, 0, 0, 379, 0, 383,
+	278, 375, 282, 375, 0, 251, 253, 254, 255, 0,
+	0, 0, 0, 124, 165, 373, 380, 281, 284, -2,
+	256, 257, 258, 260, 263, 189, 0, 0, 259, 157,
+	226, 0, 246, 264, 124, 0, 265,
 }
 
 var yyTok1 = [...]int{
@@ -5892,13 +5896,13 @@ yydefault:
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 313:
-		yyDollar = yyS[yypt-2 : yypt+1]
+		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3428
 		{
-			yyVAL.node = expr.NewPostInc(yyDollar[1].node)
+			yyVAL.node = assign.NewCoalesce(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[2].token))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
 
 			// save comments
 			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
@@ -5910,28 +5914,28 @@ yydefault:
 		yyDollar = yyS[yypt-2 : yypt+1]
 //line php7.y:3441
 		{
-			yyVAL.node = expr.NewPreInc(yyDollar[2].node)
+			yyVAL.node = expr.NewPostInc(yyDollar[1].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[2].token))
 
 			// save comments
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
+			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Var, yyDollar[2].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 315:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3453
+//line php7.y:3454
 		{
-			yyVAL.node = expr.NewPostDec(yyDollar[1].node)
+			yyVAL.node = expr.NewPreInc(yyDollar[2].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[2].token))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
 
 			// save comments
-			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Var, yyDollar[2].token.FreeFloating)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
@@ -5939,28 +5943,28 @@ yydefault:
 		yyDollar = yyS[yypt-2 : yypt+1]
 //line php7.y:3466
 		{
-			yyVAL.node = expr.NewPreDec(yyDollar[2].node)
+			yyVAL.node = expr.NewPostDec(yyDollar[1].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodeTokenPosition(yyDollar[1].node, yyDollar[2].token))
 
 			// save comments
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
+			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Var, yyDollar[2].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 317:
-		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:3478
+		yyDollar = yyS[yypt-2 : yypt+1]
+//line php7.y:3479
 		{
-			yyVAL.node = binary.NewBooleanOr(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = expr.NewPreDec(yyDollar[2].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
 
 			// save comments
-			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
@@ -5968,7 +5972,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3491
 		{
-			yyVAL.node = binary.NewBooleanAnd(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewBooleanOr(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -5983,7 +5987,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3504
 		{
-			yyVAL.node = binary.NewLogicalOr(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewBooleanAnd(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -5998,7 +6002,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3517
 		{
-			yyVAL.node = binary.NewLogicalAnd(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewLogicalOr(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6013,7 +6017,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3530
 		{
-			yyVAL.node = binary.NewLogicalXor(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewLogicalAnd(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6028,7 +6032,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3543
 		{
-			yyVAL.node = binary.NewBitwiseOr(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewLogicalXor(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6043,7 +6047,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3556
 		{
-			yyVAL.node = binary.NewBitwiseAnd(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewBitwiseOr(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6058,7 +6062,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3569
 		{
-			yyVAL.node = binary.NewBitwiseXor(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewBitwiseAnd(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6073,7 +6077,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3582
 		{
-			yyVAL.node = binary.NewConcat(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewBitwiseXor(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6088,7 +6092,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3595
 		{
-			yyVAL.node = binary.NewPlus(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewConcat(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6103,7 +6107,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3608
 		{
-			yyVAL.node = binary.NewMinus(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewPlus(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6118,7 +6122,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3621
 		{
-			yyVAL.node = binary.NewMul(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewMinus(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6133,7 +6137,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3634
 		{
-			yyVAL.node = binary.NewPow(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewMul(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6148,7 +6152,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3647
 		{
-			yyVAL.node = binary.NewDiv(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewPow(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6163,7 +6167,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3660
 		{
-			yyVAL.node = binary.NewMod(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewDiv(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6178,7 +6182,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3673
 		{
-			yyVAL.node = binary.NewShiftLeft(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewMod(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6193,7 +6197,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3686
 		{
-			yyVAL.node = binary.NewShiftRight(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewShiftLeft(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6205,24 +6209,25 @@ yydefault:
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 334:
-		yyDollar = yyS[yypt-2 : yypt+1]
+		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3699
 		{
-			yyVAL.node = expr.NewUnaryPlus(yyDollar[2].node)
+			yyVAL.node = binary.NewShiftRight(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
 
 			// save comments
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
+			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 335:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3711
+//line php7.y:3712
 		{
-			yyVAL.node = expr.NewUnaryMinus(yyDollar[2].node)
+			yyVAL.node = expr.NewUnaryPlus(yyDollar[2].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
@@ -6234,9 +6239,9 @@ yydefault:
 		}
 	case 336:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3723
+//line php7.y:3724
 		{
-			yyVAL.node = expr.NewBooleanNot(yyDollar[2].node)
+			yyVAL.node = expr.NewUnaryMinus(yyDollar[2].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
@@ -6248,9 +6253,9 @@ yydefault:
 		}
 	case 337:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3735
+//line php7.y:3736
 		{
-			yyVAL.node = expr.NewBitwiseNot(yyDollar[2].node)
+			yyVAL.node = expr.NewBooleanNot(yyDollar[2].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
@@ -6261,17 +6266,16 @@ yydefault:
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 338:
-		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:3747
+		yyDollar = yyS[yypt-2 : yypt+1]
+//line php7.y:3748
 		{
-			yyVAL.node = binary.NewIdentical(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = expr.NewBitwiseNot(yyDollar[2].node)
 
 			// save position
-			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewTokenNodePosition(yyDollar[1].token, yyDollar[2].node))
 
 			// save comments
-			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Start, yyDollar[1].token.FreeFloating)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
@@ -6279,7 +6283,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3760
 		{
-			yyVAL.node = binary.NewNotIdentical(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewIdentical(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6294,7 +6298,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3773
 		{
-			yyVAL.node = binary.NewEqual(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewNotIdentical(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6309,7 +6313,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3786
 		{
-			yyVAL.node = binary.NewNotEqual(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewEqual(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6317,15 +6321,14 @@ yydefault:
 			// save comments
 			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
 			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
-			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Equal, yylex.(*Parser).GetFreeFloatingToken(yyDollar[2].token))
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
 	case 342:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:3800
+//line php7.y:3799
 		{
-			yyVAL.node = binary.NewSmaller(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewNotEqual(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6333,6 +6336,7 @@ yydefault:
 			// save comments
 			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
 			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Equal, yylex.(*Parser).GetFreeFloatingToken(yyDollar[2].token))
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
@@ -6340,7 +6344,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3813
 		{
-			yyVAL.node = binary.NewSmallerOrEqual(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewSmaller(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6355,7 +6359,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3826
 		{
-			yyVAL.node = binary.NewGreater(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewSmallerOrEqual(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6370,7 +6374,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3839
 		{
-			yyVAL.node = binary.NewGreaterOrEqual(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewGreater(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6385,7 +6389,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3852
 		{
-			yyVAL.node = binary.NewSpaceship(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewGreaterOrEqual(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6400,7 +6404,7 @@ yydefault:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3865
 		{
-			yyVAL.node = expr.NewInstanceOf(yyDollar[1].node, yyDollar[3].node)
+			yyVAL.node = binary.NewSpaceship(yyDollar[1].node, yyDollar[3].node)
 
 			// save position
 			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
@@ -6414,6 +6418,21 @@ yydefault:
 	case 348:
 		yyDollar = yyS[yypt-3 : yypt+1]
 //line php7.y:3878
+		{
+			yyVAL.node = expr.NewInstanceOf(yyDollar[1].node, yyDollar[3].node)
+
+			// save position
+			yyVAL.node.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition(yyDollar[1].node, yyDollar[3].node))
+
+			// save comments
+			yylex.(*Parser).MoveFreeFloating(yyDollar[1].node, yyVAL.node)
+			yylex.(*Parser).setFreeFloating(yyVAL.node, freefloating.Expr, yyDollar[2].token.FreeFloating)
+
+			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
+		}
+	case 349:
+		yyDollar = yyS[yypt-3 : yypt+1]
+//line php7.y:3891
 		{
 			yyVAL.node = &expr.Paren{Expr: yyDollar[2].node}
 
@@ -6426,17 +6445,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 349:
+	case 350:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:3891
+//line php7.y:3904
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 350:
+	case 351:
 		yyDollar = yyS[yypt-5 : yypt+1]
-//line php7.y:3897
+//line php7.y:3910
 		{
 			yyVAL.node = expr.NewTernary(yyDollar[1].node, yyDollar[3].node, yyDollar[5].node)
 
@@ -6450,9 +6469,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 351:
+	case 352:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:3911
+//line php7.y:3924
 		{
 			yyVAL.node = expr.NewTernary(yyDollar[1].node, nil, yyDollar[4].node)
 
@@ -6466,9 +6485,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 352:
+	case 353:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:3925
+//line php7.y:3938
 		{
 			yyVAL.node = binary.NewCoalesce(yyDollar[1].node, yyDollar[3].node)
 
@@ -6481,17 +6500,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 353:
+	case 354:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:3938
+//line php7.y:3951
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 354:
+	case 355:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3944
+//line php7.y:3957
 		{
 			yyVAL.node = cast.NewInt(yyDollar[2].node)
 
@@ -6504,9 +6523,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 355:
+	case 356:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3957
+//line php7.y:3970
 		{
 			yyVAL.node = cast.NewDouble(yyDollar[2].node)
 
@@ -6519,9 +6538,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 356:
+	case 357:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3970
+//line php7.y:3983
 		{
 			yyVAL.node = cast.NewString(yyDollar[2].node)
 
@@ -6534,9 +6553,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 357:
+	case 358:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3983
+//line php7.y:3996
 		{
 			yyVAL.node = cast.NewArray(yyDollar[2].node)
 
@@ -6549,9 +6568,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 358:
+	case 359:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:3996
+//line php7.y:4009
 		{
 			yyVAL.node = cast.NewObject(yyDollar[2].node)
 
@@ -6564,9 +6583,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 359:
+	case 360:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4009
+//line php7.y:4022
 		{
 			yyVAL.node = cast.NewBool(yyDollar[2].node)
 
@@ -6579,9 +6598,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 360:
+	case 361:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4022
+//line php7.y:4035
 		{
 			yyVAL.node = cast.NewUnset(yyDollar[2].node)
 
@@ -6594,9 +6613,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 361:
+	case 362:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4035
+//line php7.y:4048
 		{
 			var e *expr.Exit
 			if yyDollar[2].node != nil {
@@ -6623,9 +6642,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 362:
+	case 363:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4062
+//line php7.y:4075
 		{
 			yyVAL.node = expr.NewErrorSuppress(yyDollar[2].node)
 
@@ -6637,17 +6656,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 363:
+	case 364:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4074
+//line php7.y:4087
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 364:
+	case 365:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4080
+//line php7.y:4093
 		{
 			yyVAL.node = expr.NewShellExec(yyDollar[2].list)
 
@@ -6659,9 +6678,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 365:
+	case 366:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4092
+//line php7.y:4105
 		{
 			yyVAL.node = expr.NewPrint(yyDollar[2].node)
 
@@ -6673,9 +6692,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 366:
+	case 367:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4104
+//line php7.y:4117
 		{
 			yyVAL.node = expr.NewYield(nil, nil)
 
@@ -6687,9 +6706,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 367:
+	case 368:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4116
+//line php7.y:4129
 		{
 			yyVAL.node = expr.NewYield(nil, yyDollar[2].node)
 
@@ -6701,9 +6720,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 368:
+	case 369:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4128
+//line php7.y:4141
 		{
 			yyVAL.node = expr.NewYield(yyDollar[2].node, yyDollar[4].node)
 
@@ -6716,9 +6735,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 369:
+	case 370:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4141
+//line php7.y:4154
 		{
 			yyVAL.node = expr.NewYieldFrom(yyDollar[2].node)
 
@@ -6730,17 +6749,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 370:
+	case 371:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4153
+//line php7.y:4166
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 371:
+	case 372:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4159
+//line php7.y:4172
 		{
 			yyVAL.node = yyDollar[2].node
 
@@ -6761,9 +6780,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 372:
+	case 373:
 		yyDollar = yyS[yypt-11 : yypt+1]
-//line php7.y:4182
+//line php7.y:4195
 		{
 			yyVAL.node = expr.NewClosure(yyDollar[5].list, yyDollar[7].ClosureUse, yyDollar[8].node, yyDollar[10].list, false, yyDollar[2].token != nil, yyDollar[3].str)
 
@@ -6798,9 +6817,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 373:
+	case 374:
 		yyDollar = yyS[yypt-9 : yypt+1]
-//line php7.y:4214
+//line php7.y:4227
 		{
 			yyVAL.node = expr.NewArrowFunction(yyDollar[4].list, yyDollar[6].node, yyDollar[9].node, false, yyDollar[2].token != nil, yyDollar[7].str)
 
@@ -6830,38 +6849,38 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 374:
+	case 375:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4245
+//line php7.y:4258
 		{
 			yyVAL.str = yylex.(*Parser).Lexer.GetPhpDocComment()
 			yylex.(*Parser).Lexer.SetPhpDocComment("")
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 375:
+	case 376:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4255
+//line php7.y:4268
 		{
 			yyVAL.token = nil
 		}
-	case 376:
+	case 377:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4259
+//line php7.y:4272
 		{
 			yyVAL.token = yyDollar[1].token
 		}
-	case 377:
+	case 378:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4266
+//line php7.y:4279
 		{
 			yyVAL.ClosureUse = nil
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 378:
+	case 379:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4272
+//line php7.y:4285
 		{
 			yyVAL.ClosureUse = expr.NewClosureUse(yyDollar[3].list)
 
@@ -6875,9 +6894,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 379:
+	case 380:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4289
+//line php7.y:4302
 		{
 			yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
 
@@ -6886,17 +6905,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 380:
+	case 381:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4298
+//line php7.y:4311
 		{
 			yyVAL.list = []node.Node{yyDollar[1].node}
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 381:
+	case 382:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4307
+//line php7.y:4320
 		{
 			yyVAL.node = node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 
@@ -6909,9 +6928,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 382:
+	case 383:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4320
+//line php7.y:4333
 		{
 			variable := node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[2].token.Value, isDollar))
 			yyVAL.node = expr.NewReference(variable)
@@ -6927,9 +6946,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 383:
+	case 384:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4339
+//line php7.y:4352
 		{
 			yyVAL.node = expr.NewFunctionCall(yyDollar[1].node, yyDollar[2].node.(*node.ArgumentList))
 
@@ -6941,9 +6960,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 384:
+	case 385:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4351
+//line php7.y:4364
 		{
 			yyVAL.node = expr.NewStaticCall(yyDollar[1].node, yyDollar[3].node, yyDollar[4].node.(*node.ArgumentList))
 
@@ -6956,9 +6975,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 385:
+	case 386:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4364
+//line php7.y:4377
 		{
 			yyVAL.node = expr.NewStaticCall(yyDollar[1].node, yyDollar[3].node, yyDollar[4].node.(*node.ArgumentList))
 
@@ -6971,9 +6990,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 386:
+	case 387:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4377
+//line php7.y:4390
 		{
 			yyVAL.node = expr.NewFunctionCall(yyDollar[1].node, yyDollar[2].node.(*node.ArgumentList))
 
@@ -6985,9 +7004,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 387:
+	case 388:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4392
+//line php7.y:4405
 		{
 			yyVAL.node = node.NewIdentifier(yyDollar[1].token.Value)
 
@@ -6999,41 +7018,41 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 388:
+	case 389:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4404
+//line php7.y:4417
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 389:
+	case 390:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4413
+//line php7.y:4426
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 390:
+	case 391:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4419
+//line php7.y:4432
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 391:
+	case 392:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4428
+//line php7.y:4441
 		{
 			yyVAL.node = nil
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 392:
+	case 393:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4434
+//line php7.y:4447
 		{
 			yyVAL.node = expr.NewExit(yyDollar[2].node)
 
@@ -7046,17 +7065,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 393:
+	case 394:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4450
+//line php7.y:4463
 		{
 			yyVAL.list = []node.Node{}
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 394:
+	case 395:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4456
+//line php7.y:4469
 		{
 			part := scalar.NewEncapsedStringPart(yyDollar[1].token.Value)
 			yyVAL.list = []node.Node{part}
@@ -7066,33 +7085,33 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 395:
+	case 396:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4466
+//line php7.y:4479
 		{
 			yyVAL.list = yyDollar[1].list
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 396:
+	case 397:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4475
+//line php7.y:4488
 		{
 			yyVAL.node = nil
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 397:
+	case 398:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4481
+//line php7.y:4494
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 398:
+	case 399:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4490
+//line php7.y:4503
 		{
 			yyVAL.node = expr.NewArray(yyDollar[3].arrayItems)
 
@@ -7106,9 +7125,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 399:
+	case 400:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4504
+//line php7.y:4517
 		{
 			theExpr := expr.NewArray(yyDollar[2].arrayItems)
 			theExpr.ShortSyntax = true
@@ -7123,9 +7142,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 400:
+	case 401:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4519
+//line php7.y:4532
 		{
 			yyVAL.node = scalar.NewString(yyDollar[1].token.Value)
 
@@ -7137,9 +7156,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 401:
+	case 402:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4534
+//line php7.y:4547
 		{
 			yyVAL.node = scalar.NewLnumber(yyDollar[1].token.Value)
 
@@ -7151,9 +7170,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 402:
+	case 403:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4546
+//line php7.y:4559
 		{
 			yyVAL.node = scalar.NewDnumber(yyDollar[1].token.Value)
 
@@ -7165,9 +7184,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 403:
+	case 404:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4558
+//line php7.y:4571
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7179,9 +7198,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 404:
+	case 405:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4570
+//line php7.y:4583
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7193,9 +7212,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 405:
+	case 406:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4582
+//line php7.y:4595
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7207,9 +7226,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 406:
+	case 407:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4594
+//line php7.y:4607
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7221,9 +7240,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 407:
+	case 408:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4606
+//line php7.y:4619
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7235,9 +7254,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 408:
+	case 409:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4618
+//line php7.y:4631
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7249,9 +7268,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 409:
+	case 410:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4630
+//line php7.y:4643
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7263,9 +7282,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 410:
+	case 411:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4642
+//line php7.y:4655
 		{
 			yyVAL.node = scalar.NewMagicConstant(yyDollar[1].token.Value)
 
@@ -7277,9 +7296,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 411:
+	case 412:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4654
+//line php7.y:4667
 		{
 			encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value)
 			yyVAL.node = scalar.NewHeredoc(yyDollar[1].token.Value, []node.Node{encapsed})
@@ -7293,9 +7312,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 412:
+	case 413:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4668
+//line php7.y:4681
 		{
 			yyVAL.node = scalar.NewHeredoc(yyDollar[1].token.Value, nil)
 
@@ -7307,9 +7326,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 413:
+	case 414:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4680
+//line php7.y:4693
 		{
 			yyVAL.node = scalar.NewEncapsed(yyDollar[2].list)
 
@@ -7321,9 +7340,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 414:
+	case 415:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4692
+//line php7.y:4705
 		{
 			yyVAL.node = scalar.NewHeredoc(yyDollar[1].token.Value, yyDollar[2].list)
 
@@ -7335,25 +7354,25 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 415:
+	case 416:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4704
+//line php7.y:4717
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 416:
+	case 417:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4710
+//line php7.y:4723
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 417:
+	case 418:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4719
+//line php7.y:4732
 		{
 			yyVAL.node = expr.NewConstFetch(yyDollar[1].node)
 
@@ -7365,9 +7384,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 418:
+	case 419:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4731
+//line php7.y:4744
 		{
 			target := node.NewIdentifier(yyDollar[3].token.Value)
 			yyVAL.node = expr.NewClassConstFetch(yyDollar[1].node, target)
@@ -7383,9 +7402,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 419:
+	case 420:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4747
+//line php7.y:4760
 		{
 			target := node.NewIdentifier(yyDollar[3].token.Value)
 			yyVAL.node = expr.NewClassConstFetch(yyDollar[1].node, target)
@@ -7401,57 +7420,57 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 420:
+	case 421:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4766
+//line php7.y:4779
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 421:
+	case 422:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4772
+//line php7.y:4785
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 422:
+	case 423:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:4781
+//line php7.y:4794
 		{
 			yyVAL.node = nil
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 423:
+	case 424:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4787
+//line php7.y:4800
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 424:
+	case 425:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4796
+//line php7.y:4809
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 425:
+	case 426:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4805
+//line php7.y:4818
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 426:
+	case 427:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4811
+//line php7.y:4824
 		{
 			yyVAL.node = &expr.Paren{Expr: yyDollar[2].node}
 
@@ -7464,25 +7483,25 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 427:
+	case 428:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4824
+//line php7.y:4837
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 428:
+	case 429:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4833
+//line php7.y:4846
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 429:
+	case 430:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4839
+//line php7.y:4852
 		{
 			yyVAL.node = &expr.Paren{Expr: yyDollar[2].node}
 
@@ -7495,25 +7514,25 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 430:
+	case 431:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4852
+//line php7.y:4865
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 431:
+	case 432:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4861
+//line php7.y:4874
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 432:
+	case 433:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4867
+//line php7.y:4880
 		{
 			yyVAL.node = expr.NewArrayDimFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7527,9 +7546,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 433:
+	case 434:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4881
+//line php7.y:4894
 		{
 			yyVAL.node = expr.NewArrayDimFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7543,9 +7562,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 434:
+	case 435:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4895
+//line php7.y:4908
 		{
 			yyVAL.node = expr.NewArrayDimFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7559,9 +7578,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 435:
+	case 436:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4909
+//line php7.y:4922
 		{
 			yyVAL.node = expr.NewMethodCall(yyDollar[1].node, yyDollar[3].node, yyDollar[4].node.(*node.ArgumentList))
 
@@ -7574,33 +7593,33 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 436:
+	case 437:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4922
+//line php7.y:4935
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 437:
+	case 438:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4931
+//line php7.y:4944
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 438:
+	case 439:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4937
+//line php7.y:4950
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 439:
+	case 440:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:4943
+//line php7.y:4956
 		{
 			yyVAL.node = expr.NewPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7613,9 +7632,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 440:
+	case 441:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:4959
+//line php7.y:4972
 		{
 			yyVAL.node = node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 
@@ -7628,9 +7647,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 441:
+	case 442:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:4972
+//line php7.y:4985
 		{
 			yyVAL.node = node.NewVar(yyDollar[3].node)
 
@@ -7645,9 +7664,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 442:
+	case 443:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:4987
+//line php7.y:5000
 		{
 			yyVAL.node = node.NewVar(yyDollar[2].node)
 
@@ -7660,9 +7679,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 443:
+	case 444:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5003
+//line php7.y:5016
 		{
 			yyVAL.node = expr.NewStaticPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7675,9 +7694,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 444:
+	case 445:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5016
+//line php7.y:5029
 		{
 			yyVAL.node = expr.NewStaticPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7690,17 +7709,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 445:
+	case 446:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5032
+//line php7.y:5045
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 446:
+	case 447:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5038
+//line php7.y:5051
 		{
 			yyVAL.node = expr.NewArrayDimFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7714,9 +7733,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 447:
+	case 448:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5052
+//line php7.y:5065
 		{
 			yyVAL.node = expr.NewArrayDimFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7730,9 +7749,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 448:
+	case 449:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5066
+//line php7.y:5079
 		{
 			yyVAL.node = expr.NewPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7745,9 +7764,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 449:
+	case 450:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5079
+//line php7.y:5092
 		{
 			yyVAL.node = expr.NewStaticPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7760,9 +7779,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 450:
+	case 451:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5092
+//line php7.y:5105
 		{
 			yyVAL.node = expr.NewStaticPropertyFetch(yyDollar[1].node, yyDollar[3].node)
 
@@ -7775,9 +7794,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 451:
+	case 452:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5108
+//line php7.y:5121
 		{
 			yyVAL.node = node.NewIdentifier(yyDollar[1].token.Value)
 
@@ -7789,9 +7808,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 452:
+	case 453:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5120
+//line php7.y:5133
 		{
 			yyVAL.node = yyDollar[2].node
 
@@ -7801,17 +7820,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 453:
+	case 454:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5130
+//line php7.y:5143
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 454:
+	case 455:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5139
+//line php7.y:5152
 		{
 			yyVAL.node = node.NewIdentifier(yyDollar[1].token.Value)
 
@@ -7823,9 +7842,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 455:
+	case 456:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5151
+//line php7.y:5164
 		{
 			yyVAL.node = yyDollar[2].node
 
@@ -7835,41 +7854,41 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 456:
+	case 457:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5161
+//line php7.y:5174
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 457:
+	case 458:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5170
+//line php7.y:5183
 		{
 			yyVAL.arrayItems = yyDollar[1].arrayItems
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 458:
+	case 459:
 		yyDollar = yyS[yypt-0 : yypt+1]
-//line php7.y:5179
+//line php7.y:5192
 		{
 			yyVAL.node = expr.NewArrayItem(nil, nil)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 459:
+	case 460:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5185
+//line php7.y:5198
 		{
 			yyVAL.node = yyDollar[1].node
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 460:
+	case 461:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5194
+//line php7.y:5207
 		{
 			if len(yyDollar[1].arrayItems) == 0 {
 				yyDollar[1].arrayItems = []*expr.ArrayItem{expr.NewArrayItem(nil, nil)}
@@ -7886,9 +7905,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 461:
+	case 462:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5211
+//line php7.y:5224
 		{
 			if yyDollar[1].node.(*expr.ArrayItem).Key == nil && yyDollar[1].node.(*expr.ArrayItem).Val == nil {
 				yyVAL.arrayItems = []*expr.ArrayItem{}
@@ -7898,9 +7917,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 462:
+	case 463:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5224
+//line php7.y:5237
 		{
 			yyVAL.node = expr.NewArrayItem(yyDollar[1].node, yyDollar[3].node)
 
@@ -7913,9 +7932,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 463:
+	case 464:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5237
+//line php7.y:5250
 		{
 			yyVAL.node = expr.NewArrayItem(nil, yyDollar[1].node)
 
@@ -7927,9 +7946,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 464:
+	case 465:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5249
+//line php7.y:5262
 		{
 			reference := expr.NewReference(yyDollar[4].node)
 			yyVAL.node = expr.NewArrayItem(yyDollar[1].node, reference)
@@ -7945,9 +7964,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 465:
+	case 466:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5265
+//line php7.y:5278
 		{
 			reference := expr.NewReference(yyDollar[2].node)
 			yyVAL.node = expr.NewArrayItem(nil, reference)
@@ -7961,9 +7980,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 466:
+	case 467:
 		yyDollar = yyS[yypt-6 : yypt+1]
-//line php7.y:5279
+//line php7.y:5292
 		{
 			// TODO: Cannot use list() as standalone expression
 			listNode := expr.NewList(yyDollar[5].arrayItems)
@@ -7982,9 +8001,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 467:
+	case 468:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5298
+//line php7.y:5311
 		{
 			// TODO: Cannot use list() as standalone expression
 			listNode := expr.NewList(yyDollar[3].arrayItems)
@@ -8001,17 +8020,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 468:
+	case 469:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5318
+//line php7.y:5331
 		{
 			yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 469:
+	case 470:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5324
+//line php7.y:5337
 		{
 			encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value)
 			yyVAL.list = append(yyDollar[1].list, encapsed)
@@ -8024,17 +8043,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 470:
+	case 471:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5337
+//line php7.y:5350
 		{
 			yyVAL.list = []node.Node{yyDollar[1].node}
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 471:
+	case 472:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5343
+//line php7.y:5356
 		{
 			encapsed := scalar.NewEncapsedStringPart(yyDollar[1].token.Value)
 			yyVAL.list = []node.Node{encapsed, yyDollar[2].node}
@@ -8047,9 +8066,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 472:
+	case 473:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5359
+//line php7.y:5372
 		{
 			yyVAL.node = node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 
@@ -8062,9 +8081,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 473:
+	case 474:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5372
+//line php7.y:5385
 		{
 			variable := node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 			yyVAL.node = expr.NewArrayDimFetch(variable, yyDollar[3].node)
@@ -8080,9 +8099,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 474:
+	case 475:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5388
+//line php7.y:5401
 		{
 			variable := node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 			fetch := node.NewIdentifier(yyDollar[3].token.Value)
@@ -8100,9 +8119,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 475:
+	case 476:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5406
+//line php7.y:5419
 		{
 			variable := node.NewVar(yyDollar[2].node)
 
@@ -8117,9 +8136,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 476:
+	case 477:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5421
+//line php7.y:5434
 		{
 			variable := node.NewSimpleVar(yyDollar[2].token.Value)
 
@@ -8134,9 +8153,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 477:
+	case 478:
 		yyDollar = yyS[yypt-6 : yypt+1]
-//line php7.y:5436
+//line php7.y:5449
 		{
 			variable := node.NewSimpleVar(yyDollar[2].token.Value)
 			yyVAL.node = expr.NewArrayDimFetch(variable, yyDollar[4].node)
@@ -8153,9 +8172,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 478:
+	case 479:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5453
+//line php7.y:5466
 		{
 			yyVAL.node = yyDollar[2].node
 
@@ -8165,9 +8184,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 479:
+	case 480:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5466
+//line php7.y:5479
 		{
 			yyVAL.node = scalar.NewString(yyDollar[1].token.Value)
 
@@ -8179,9 +8198,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 480:
+	case 481:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5478
+//line php7.y:5491
 		{
 			// TODO: add option to handle 64 bit integer
 			if _, err := strconv.Atoi(yyDollar[1].token.Value); err == nil {
@@ -8198,9 +8217,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 481:
+	case 482:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5495
+//line php7.y:5508
 		{
 			var lnumber *scalar.Lnumber
 			// TODO: add option to handle 64 bit integer
@@ -8226,9 +8245,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 482:
+	case 483:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5521
+//line php7.y:5534
 		{
 			yyVAL.node = node.NewSimpleVar(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
 
@@ -8241,9 +8260,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 483:
+	case 484:
 		yyDollar = yyS[yypt-5 : yypt+1]
-//line php7.y:5537
+//line php7.y:5550
 		{
 			yyVAL.node = expr.NewIsset(yyDollar[3].list)
 
@@ -8261,9 +8280,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 484:
+	case 485:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5555
+//line php7.y:5568
 		{
 			yyVAL.node = expr.NewEmpty(yyDollar[3].node)
 
@@ -8277,9 +8296,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 485:
+	case 486:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5569
+//line php7.y:5582
 		{
 			yyVAL.node = expr.NewInclude(yyDollar[2].node)
 
@@ -8291,9 +8310,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 486:
+	case 487:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5581
+//line php7.y:5594
 		{
 			yyVAL.node = expr.NewIncludeOnce(yyDollar[2].node)
 
@@ -8305,9 +8324,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 487:
+	case 488:
 		yyDollar = yyS[yypt-4 : yypt+1]
-//line php7.y:5593
+//line php7.y:5606
 		{
 			yyVAL.node = expr.NewEval(yyDollar[3].node)
 
@@ -8321,9 +8340,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 488:
+	case 489:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5607
+//line php7.y:5620
 		{
 			yyVAL.node = expr.NewRequire(yyDollar[2].node)
 
@@ -8335,9 +8354,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 489:
+	case 490:
 		yyDollar = yyS[yypt-2 : yypt+1]
-//line php7.y:5619
+//line php7.y:5632
 		{
 			yyVAL.node = expr.NewRequireOnce(yyDollar[2].node)
 
@@ -8349,17 +8368,17 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 490:
+	case 491:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5634
+//line php7.y:5647
 		{
 			yyVAL.list = []node.Node{yyDollar[1].node}
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 491:
+	case 492:
 		yyDollar = yyS[yypt-3 : yypt+1]
-//line php7.y:5640
+//line php7.y:5653
 		{
 			yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
 
@@ -8368,9 +8387,9 @@ yydefault:
 
 			yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
 		}
-	case 492:
+	case 493:
 		yyDollar = yyS[yypt-1 : yypt+1]
-//line php7.y:5652
+//line php7.y:5665
 		{
 			yyVAL.node = yyDollar[1].node
 
diff --git a/src/php/parser/php7/php7.y b/src/php/parser/php7/php7.y
index d16412c..031ea15 100644
--- a/src/php/parser/php7/php7.y
+++ b/src/php/parser/php7/php7.y
@@ -210,7 +210,7 @@ import (
 %right T_YIELD
 %right T_DOUBLE_ARROW
 %right T_YIELD_FROM
-%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
+%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
 %left '?' ':'
 %right T_COALESCE
 %left T_BOOLEAN_OR
@@ -3424,6 +3424,19 @@ expr_without_variable:
 
                 yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
             }
+     |   variable T_COALESCE_EQUAL expr
+    	    {
+    	        $$ = assign.NewCoalesce($1, $3)
+
+    	        // save position
+    	        $$.SetPosition(yylex.(*Parser).positionBuilder.NewNodesPosition($1, $3))
+
+    	        // save comments
+    	        yylex.(*Parser).MoveFreeFloating($1, $$)
+    	        yylex.(*Parser).setFreeFloating($$, freefloating.Var, $2.FreeFloating)
+
+    	        yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
+    	    }
     |   variable T_INC
             {
                 $$ = expr.NewPostInc($1)
diff --git a/src/php/parser/printer/printer.go b/src/php/parser/printer/printer.go
index 211e241..2711bbf 100644
--- a/src/php/parser/printer/printer.go
+++ b/src/php/parser/printer/printer.go
@@ -146,6 +146,8 @@ func (p *Printer) printNode(n node.Node) {
 		p.printAssignBitwiseOr(n)
 	case *assign.BitwiseXor:
 		p.printAssignBitwiseXor(n)
+	case *assign.Coalesce:
+		p.printAssignCoalesce(n)
 	case *assign.Concat:
 		p.printAssignConcat(n)
 	case *assign.Div:
@@ -711,6 +713,17 @@ func (p *Printer) printAssignBitwiseXor(n node.Node) {
 	p.printFreeFloating(nn, freefloating.End)
 }
 
+func (p *Printer) printAssignCoalesce(n node.Node) {
+	nn := n.(*assign.Coalesce)
+	p.printFreeFloating(nn, freefloating.Start)
+	p.Print(nn.Variable)
+	p.printFreeFloating(nn, freefloating.Var)
+	io.WriteString(p.w, "??=")
+	p.Print(nn.Expression)
+
+	p.printFreeFloating(nn, freefloating.End)
+}
+
 func (p *Printer) printAssignConcat(n node.Node) {
 	nn := n.(*assign.Concat)
 	p.printFreeFloating(nn, freefloating.Start)


Test patch:
diff --git a/src/php/parser/node/expr/assign/t_assign_op_test.go b/src/php/parser/node/expr/assign/t_assign_op_test.go
index c97cd9f..b1d92fd 100644
--- a/src/php/parser/node/expr/assign/t_assign_op_test.go
+++ b/src/php/parser/node/expr/assign/t_assign_op_test.go
@@ -942,3 +942,57 @@ func TestShiftRight(t *testing.T) {
 	actual := php7parser.GetRootNode()
 	assert.DeepEqual(t, expected, actual)
 }
+
+func TestCoalesce(t *testing.T) {
+	src := `<? $a ??= $b;`
+
+	expected := &node.Root{
+		Position: &position.Position{
+			StartLine: 1,
+			EndLine:   1,
+			StartPos:  3,
+			EndPos:    13,
+		},
+		Stmts: []node.Node{
+			&stmt.Expression{
+				Position: &position.Position{
+					StartLine: 1,
+					EndLine:   1,
+					StartPos:  3,
+					EndPos:    13,
+				},
+				Expr: &assign.Coalesce{
+					Position: &position.Position{
+						StartLine: 1,
+						EndLine:   1,
+						StartPos:  3,
+						EndPos:    12,
+					},
+					Variable: &node.SimpleVar{
+						Position: &position.Position{
+							StartLine: 1,
+							EndLine:   1,
+							StartPos:  3,
+							EndPos:    5,
+						},
+						Name: "a",
+					},
+					Expression: &node.SimpleVar{
+						Position: &position.Position{
+							StartLine: 1,
+							EndLine:   1,
+							StartPos:  10,
+							EndPos:    12,
+						},
+						Name: "b",
+					},
+				},
+			},
+		},
+	}
+
+	php7parser := php7.NewParser([]byte(src))
+	php7parser.Parse()
+	actual := php7parser.GetRootNode()
+	assert.DeepEqual(t, expected, actual)
+}
diff --git a/src/php/parser/node/expr/t_freefloating_test.go b/src/php/parser/node/expr/t_freefloating_test.go
index c4c5255..37e3729 100644
--- a/src/php/parser/node/expr/t_freefloating_test.go
+++ b/src/php/parser/node/expr/t_freefloating_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/VKCOM/noverify/src/linttest/assert"
+	"github.com/VKCOM/noverify/src/php/parser/node/expr/assign"
 
 	"github.com/VKCOM/noverify/src/php/parser/freefloating"
 	"github.com/VKCOM/noverify/src/php/parser/node"
@@ -41,6 +42,9 @@ var nodes = []node.Node{
 	&expr.BitwiseNot{
 		FreeFloating: expected,
 	},
+	&assign.Coalesce{
+		FreeFloating: expected,
+	},
 	&expr.BooleanNot{
 		FreeFloating: expected,
 	},
diff --git a/src/php/parser/printer/printer_parsed_php7_test.go b/src/php/parser/printer/printer_parsed_php7_test.go
index 5345d4c..5ff1bf5 100644
--- a/src/php/parser/printer/printer_parsed_php7_test.go
+++ b/src/php/parser/printer/printer_parsed_php7_test.go
@@ -270,6 +270,7 @@ func TestParseAndPrintAssign(t *testing.T) {
 	$a &= $b ;
 	$a |= $b ;
 	$a ^= $b ;
+	$a ??= $b ;
 	$a .= $b ;
 	$a /= $b ;
 	$a -= $b ;
diff --git a/src/php/parser/printer/printer_test.go b/src/php/parser/printer/printer_test.go
index 1fb91be..666887d 100644
--- a/src/php/parser/printer/printer_test.go
+++ b/src/php/parser/printer/printer_test.go
@@ -544,6 +544,27 @@ func TestPrinterPrintAssignBitwiseXor(t *testing.T) {
 	}
 }
 
+func TestPrinterPrintAssignCoalesce(t *testing.T) {
+	o := bytes.NewBufferString("")
+
+	p := printer.NewPrinter(o)
+	p.Print(&assign.Coalesce{
+		Variable: &node.SimpleVar{
+			Name: "a",
+		},
+		Expression: &node.SimpleVar{
+			Name: "b",
+		},
+	})
+
+	expected := `$a??=$b`
+	actual := o.String()
+
+	if expected != actual {
+		t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
+	}
+}
+
 func TestPrinterPrintAssignConcat(t *testing.T) {
 	o := bytes.NewBufferString("")