diff --git a/ast/expr.go b/ast/expr.go index 875ebba9..0327d2c4 100644 --- a/ast/expr.go +++ b/ast/expr.go @@ -104,6 +104,7 @@ type CallExpr struct { SubExprs []Expr VarArg bool Go bool + Defer bool } // AnonCallExpr provide anonymous calling expression. ex: func(){}(). @@ -113,6 +114,7 @@ type AnonCallExpr struct { SubExprs []Expr VarArg bool Go bool + Defer bool } // MemberExpr provide expression to refer member. diff --git a/ast/stmt.go b/ast/stmt.go index 3a681201..c489c629 100644 --- a/ast/stmt.go +++ b/ast/stmt.go @@ -138,3 +138,9 @@ type GoroutineStmt struct { StmtImpl Expr Expr } + +// DeferStmt provide statement of defer. +type DeferStmt struct { + StmtImpl + Expr Expr +} diff --git a/parser/lexer.go b/parser/lexer.go index 85e32ecc..6dc762a3 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -62,6 +62,7 @@ var opName = map[string]int{ "case": CASE, "default": DEFAULT, "go": GO, + "defer": DEFER, "chan": CHAN, "make": MAKE, "type": TYPE, diff --git a/parser/parser.go b/parser/parser.go index 9463d18d..018e8140 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -79,13 +79,14 @@ const SWITCH = 57386 const CASE = 57387 const DEFAULT = 57388 const GO = 57389 -const CHAN = 57390 -const MAKE = 57391 -const OPCHAN = 57392 -const TYPE = 57393 -const LEN = 57394 -const DELETE = 57395 -const UNARY = 57396 +const DEFER = 57390 +const CHAN = 57391 +const MAKE = 57392 +const OPCHAN = 57393 +const TYPE = 57394 +const LEN = 57395 +const DELETE = 57396 +const UNARY = 57397 var yyToknames = [...]string{ "$end", @@ -135,6 +136,7 @@ var yyToknames = [...]string{ "CASE", "DEFAULT", "GO", + "DEFER", "CHAN", "MAKE", "OPCHAN", @@ -173,684 +175,741 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.go.y:822 +//line parser.go.y:842 //line yacctab:1 var yyExca = [...]int{ -1, 0, 1, 3, - -2, 139, + -2, 143, -1, 1, 1, -1, -2, 0, -1, 2, - 57, 58, + 58, 62, -2, 1, -1, 10, - 57, 59, - -2, 28, - -1, 46, - 57, 58, - -2, 140, - -1, 89, - 67, 3, - -2, 139, - -1, 92, - 57, 59, - -2, 55, + 58, 63, + -2, 32, + -1, 47, + 58, 62, + -2, 144, + -1, 90, + 68, 3, + -2, 143, -1, 93, - 16, 50, - 57, 50, - -2, 68, - -1, 95, - 67, 3, - -2, 139, - -1, 104, - 1, 73, - 8, 73, - 45, 73, - 46, 73, - 54, 73, - 56, 73, - 57, 73, - 66, 73, - 67, 73, - 68, 73, - 70, 73, - 72, 73, - 78, 73, - -2, 68, - -1, 106, - 1, 75, - 8, 75, - 45, 75, - 46, 75, - 54, 75, - 56, 75, - 57, 75, - 66, 75, - 67, 75, - 68, 75, - 70, 75, - 72, 75, - 78, 75, - -2, 68, - -1, 136, + 58, 63, + -2, 59, + -1, 94, + 16, 54, + 58, 54, + -2, 72, + -1, 96, + 68, 3, + -2, 143, + -1, 107, + 1, 77, + 8, 77, + 45, 77, + 46, 77, + 55, 77, + 57, 77, + 58, 77, + 67, 77, + 68, 77, + 69, 77, + 71, 77, + 73, 77, + 79, 77, + -2, 72, + -1, 109, + 1, 79, + 8, 79, + 45, 79, + 46, 79, + 55, 79, + 57, 79, + 58, 79, + 67, 79, + 68, 79, + 69, 79, + 71, 79, + 73, 79, + 79, 79, + -2, 72, + -1, 139, 17, 0, 18, 0, - -2, 100, - -1, 137, + -2, 104, + -1, 140, 17, 0, 18, 0, - -2, 101, - -1, 157, - 57, 59, - -2, 55, - -1, 159, - 67, 3, - -2, 139, - -1, 161, - 67, 3, - -2, 139, - -1, 163, - 67, 1, - -2, 46, + -2, 105, + -1, 160, + 58, 63, + -2, 59, + -1, 162, + 68, 3, + -2, 143, + -1, 164, + 68, 3, + -2, 143, -1, 166, - 67, 3, - -2, 139, - -1, 193, - 67, 3, - -2, 139, - -1, 242, - 57, 60, - -2, 56, - -1, 243, - 1, 57, - 45, 57, - 46, 57, - 54, 57, - 56, 57, - 57, 61, - 67, 57, - 68, 57, - 78, 57, - -2, 68, - -1, 252, + 68, 1, + -2, 50, + -1, 169, + 68, 3, + -2, 143, + -1, 198, + 68, 3, + -2, 143, + -1, 249, + 58, 64, + -2, 60, + -1, 250, 1, 61, - 8, 61, 45, 61, 46, 61, + 55, 61, 57, 61, - 67, 61, + 58, 65, 68, 61, - 70, 61, - 72, 61, - 78, 61, - -2, 68, - -1, 254, - 67, 3, - -2, 139, - -1, 256, - 67, 3, - -2, 139, - -1, 270, + 69, 61, + 79, 61, + -2, 72, + -1, 259, + 1, 65, + 8, 65, + 45, 65, + 46, 65, + 58, 65, + 68, 65, + 69, 65, + 71, 65, + 73, 65, + 79, 65, + -2, 72, + -1, 261, + 68, 3, + -2, 143, + -1, 263, + 68, 3, + -2, 143, + -1, 277, 1, 25, 45, 25, 46, 25, - 67, 25, 68, 25, - 78, 25, - -2, 119, - -1, 272, + 69, 25, + 79, 25, + -2, 123, + -1, 279, 1, 27, 45, 27, 46, 27, - 67, 27, 68, 27, - 78, 27, - -2, 121, - -1, 277, - 67, 3, - -2, 139, - -1, 300, - 67, 3, - -2, 139, - -1, 304, + 69, 27, + 79, 27, + -2, 125, + -1, 281, + 1, 29, + 45, 29, + 46, 29, + 68, 29, + 69, 29, + 79, 29, + -2, 123, + -1, 283, + 1, 31, + 45, 31, + 46, 31, + 68, 31, + 69, 31, + 79, 31, + -2, 125, + -1, 288, + 68, 3, + -2, 143, + -1, 311, + 68, 3, + -2, 143, + -1, 315, 1, 24, 45, 24, 46, 24, - 67, 24, 68, 24, - 78, 24, - -2, 118, - -1, 305, + 69, 24, + 79, 24, + -2, 122, + -1, 316, 1, 26, 45, 26, 46, 26, - 67, 26, 68, 26, - 78, 26, - -2, 120, - -1, 308, - 67, 3, - -2, 139, - -1, 309, - 67, 3, - -2, 139, - -1, 320, - 67, 3, - -2, 139, + 69, 26, + 79, 26, + -2, 124, + -1, 317, + 1, 28, + 45, 28, + 46, 28, + 68, 28, + 69, 28, + 79, 28, + -2, 122, + -1, 318, + 1, 30, + 45, 30, + 46, 30, + 68, 30, + 69, 30, + 79, 30, + -2, 124, -1, 321, - 67, 3, - -2, 139, - -1, 325, + 68, 3, + -2, 143, + -1, 322, + 68, 3, + -2, 143, + -1, 333, + 68, 3, + -2, 143, + -1, 334, + 68, 3, + -2, 143, + -1, 338, 45, 3, 46, 3, - 67, 3, - -2, 139, - -1, 329, - 67, 3, - -2, 139, - -1, 337, + 68, 3, + -2, 143, + -1, 342, + 68, 3, + -2, 143, + -1, 350, 45, 3, 46, 3, - 67, 3, - -2, 139, - -1, 338, + 68, 3, + -2, 143, + -1, 351, 45, 3, 46, 3, - 67, 3, - -2, 139, - -1, 352, - 67, 3, - -2, 139, - -1, 353, - 67, 3, - -2, 139, + 68, 3, + -2, 143, + -1, 365, + 68, 3, + -2, 143, + -1, 366, + 68, 3, + -2, 143, } const yyPrivate = 57344 -const yyLast = 3007 +const yyLast = 3196 var yyAct = [...]int{ - 85, 181, 262, 10, 261, 43, 263, 185, 6, 289, - 282, 48, 37, 1, 11, 100, 86, 99, 7, 92, - 84, 96, 98, 229, 239, 101, 102, 103, 105, 107, - 90, 310, 234, 94, 6, 233, 170, 112, 99, 305, - 304, 278, 116, 276, 7, 119, 186, 10, 250, 178, - 109, 123, 124, 126, 117, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 115, 114, 148, 149, 150, - 151, 280, 153, 155, 157, 113, 152, 182, 165, 68, - 69, 70, 71, 72, 73, 154, 227, 2, 156, 59, - 172, 45, 357, 162, 356, 271, 174, 6, 81, 168, - 269, 349, 291, 236, 184, 108, 179, 7, 191, 345, - 177, 225, 157, 344, 288, 290, 198, 80, 233, 51, - 122, 53, 110, 111, 78, 76, 194, 287, 341, 187, - 233, 340, 189, 279, 336, 326, 319, 318, 313, 264, - 265, 294, 220, 284, 158, 258, 255, 253, 353, 158, - 299, 204, 190, 212, 10, 208, 209, 272, 157, 352, - 122, 260, 270, 203, 219, 205, 215, 216, 206, 292, - 210, 200, 211, 224, 329, 321, 309, 163, 160, 308, - 226, 277, 159, 242, 95, 235, 237, 246, 164, 121, - 249, 158, 122, 251, 22, 23, 207, 244, 158, 33, - 14, 9, 15, 44, 221, 18, 192, 268, 273, 266, - 195, 267, 300, 39, 30, 31, 32, 16, 19, 118, - 158, 351, 285, 324, 303, 231, 8, 12, 13, 122, - 167, 161, 293, 201, 20, 83, 346, 21, 259, 40, - 41, 88, 38, 42, 5, 182, 202, 286, 298, 47, - 245, 24, 28, 264, 265, 301, 35, 214, 296, 36, - 297, 34, 238, 186, 25, 26, 27, 228, 230, 302, - 49, 223, 251, 120, 222, 312, 127, 87, 188, 314, - 4, 307, 315, 316, 46, 180, 91, 213, 17, 3, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, - 0, 0, 327, 328, 0, 281, 0, 283, 0, 0, - 0, 0, 0, 343, 334, 335, 0, 0, 0, 339, - 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, - 0, 347, 348, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 354, 355, 0, 0, - 82, 62, 63, 65, 67, 77, 79, 0, 0, 0, - 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, - 73, 0, 0, 74, 75, 59, 60, 61, 0, 0, - 0, 325, 0, 0, 81, 0, 0, 0, 0, 52, - 0, 332, 64, 66, 54, 55, 56, 57, 58, 0, - 0, 337, 338, 80, 331, 51, 0, 53, 0, 0, - 78, 76, 82, 62, 63, 65, 67, 77, 79, 0, - 0, 0, 0, 0, 0, 0, 0, 68, 69, 70, - 71, 72, 73, 0, 0, 74, 75, 59, 60, 61, - 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, - 0, 52, 0, 241, 64, 66, 54, 55, 56, 57, - 58, 0, 0, 0, 0, 80, 240, 51, 0, 53, - 0, 0, 78, 76, 82, 62, 63, 65, 67, 77, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 68, - 69, 70, 71, 72, 73, 0, 0, 74, 75, 59, - 60, 61, 0, 0, 0, 0, 0, 0, 81, 0, - 0, 0, 0, 52, 217, 0, 64, 66, 54, 55, - 56, 57, 58, 0, 0, 0, 0, 80, 0, 51, - 218, 53, 0, 0, 78, 76, 82, 62, 63, 65, - 67, 77, 79, 0, 0, 0, 0, 0, 0, 0, - 0, 68, 69, 70, 71, 72, 73, 0, 0, 74, - 75, 59, 60, 61, 0, 0, 0, 0, 0, 0, - 81, 0, 0, 0, 0, 52, 196, 0, 64, 66, - 54, 55, 56, 57, 58, 0, 0, 0, 0, 80, - 0, 51, 197, 53, 0, 0, 78, 76, 22, 23, - 29, 0, 0, 33, 14, 9, 15, 44, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 39, 30, 31, - 32, 16, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 13, 0, 0, 0, 0, 0, 20, 0, - 0, 21, 0, 40, 41, 0, 38, 42, 0, 0, - 0, 0, 0, 0, 0, 24, 28, 0, 0, 0, - 35, 0, 6, 36, 0, 34, 0, 0, 25, 26, - 27, 0, 7, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 0, 0, 0, 0, 80, 350, 51, 0, - 53, 0, 0, 78, 76, 82, 62, 63, 65, 67, - 77, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 0, 0, 74, 75, - 59, 60, 61, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 52, 0, 0, 64, 66, 54, - 55, 56, 57, 58, 0, 0, 0, 0, 80, 333, - 51, 0, 53, 0, 0, 78, 76, 82, 62, 63, - 65, 67, 77, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 60, 61, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 52, 0, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 0, 0, 0, - 80, 330, 51, 0, 53, 0, 0, 78, 76, 82, - 62, 63, 65, 67, 77, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 0, 0, 74, 75, 59, 60, 61, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 52, 323, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 0, - 0, 0, 80, 0, 51, 0, 53, 0, 0, 78, - 76, 82, 62, 63, 65, 67, 77, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 0, 0, 74, 75, 59, 60, 61, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 52, 0, 0, 64, 66, 54, 55, 56, 57, 58, - 0, 320, 0, 0, 80, 0, 51, 0, 53, 0, - 0, 78, 76, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 0, 0, 0, 0, 80, 317, 51, 0, - 53, 0, 0, 78, 76, 82, 62, 63, 65, 67, - 77, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 0, 0, 74, 75, - 59, 60, 61, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 52, 0, 0, 64, 66, 54, - 55, 56, 57, 58, 0, 0, 0, 0, 80, 0, - 51, 306, 53, 0, 0, 78, 76, 82, 62, 63, - 65, 67, 77, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 60, 61, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 52, 0, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 0, 0, 0, - 80, 0, 51, 295, 53, 0, 0, 78, 76, 82, - 62, 63, 65, 67, 77, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 0, 0, 74, 75, 59, 60, 61, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 52, 0, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 0, - 0, 0, 80, 0, 51, 275, 53, 0, 0, 78, - 76, 82, 62, 63, 65, 67, 77, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 0, 0, 74, 75, 59, 60, 61, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 52, 0, 0, 64, 66, 54, 55, 56, 57, 58, - 0, 0, 0, 257, 80, 0, 51, 0, 53, 0, - 0, 78, 76, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 0, 256, 0, 0, 80, 0, 51, 0, - 53, 0, 0, 78, 76, 82, 62, 63, 65, 67, - 77, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 0, 0, 74, 75, - 59, 60, 61, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 52, 0, 0, 64, 66, 54, - 55, 56, 57, 58, 0, 254, 0, 0, 80, 0, - 51, 0, 53, 0, 0, 78, 76, 82, 62, 63, - 65, 67, 77, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 60, 61, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 52, 0, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 0, 0, 0, - 80, 0, 51, 248, 53, 0, 0, 78, 76, 82, - 62, 63, 65, 67, 77, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 0, 0, 74, 75, 59, 60, 61, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 52, 0, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 0, - 0, 0, 80, 232, 51, 0, 53, 0, 0, 78, - 76, 82, 62, 63, 65, 67, 77, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 0, 0, 74, 75, 59, 60, 61, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 52, 199, 0, 64, 66, 54, 55, 56, 57, 58, - 0, 0, 0, 0, 80, 0, 51, 0, 53, 0, - 0, 78, 76, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 0, 193, 0, 0, 80, 0, 51, 0, - 53, 0, 0, 78, 76, 82, 62, 63, 65, 67, - 77, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 0, 0, 74, 75, - 59, 60, 61, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 52, 0, 0, 64, 66, 54, - 55, 56, 57, 58, 0, 0, 0, 0, 80, 183, - 51, 0, 53, 0, 0, 78, 76, 82, 62, 63, - 65, 67, 77, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 60, 61, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 52, 0, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 169, 0, 0, - 80, 0, 51, 0, 53, 0, 0, 78, 76, 82, - 62, 63, 65, 67, 77, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 0, 0, 74, 75, 59, 60, 61, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 52, 0, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 166, - 0, 0, 80, 0, 51, 0, 53, 0, 0, 78, - 76, 82, 62, 63, 65, 67, 77, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 0, 0, 74, 75, 59, 60, 61, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 50, - 52, 0, 0, 64, 66, 54, 55, 56, 57, 58, - 0, 0, 0, 0, 80, 0, 51, 0, 53, 0, - 0, 78, 76, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 0, 0, 0, 0, 80, 0, 51, 0, - 53, 0, 0, 78, 76, 82, 62, 63, 65, 67, - 77, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 69, 70, 71, 72, 73, 0, 0, 74, 75, - 59, 60, 61, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 52, 0, 0, 64, 66, 54, - 55, 56, 57, 58, 0, 0, 0, 0, 80, 0, - 51, 0, 176, 0, 0, 78, 76, 82, 62, 63, - 65, 67, 77, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 60, 61, 0, 0, 0, 0, 0, - 0, 81, 0, 0, 0, 0, 52, 0, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 0, 0, 0, - 80, 0, 51, 0, 175, 0, 0, 78, 76, 82, - 62, 63, 65, 67, 77, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 0, 0, 74, 75, 59, 60, 61, 0, 0, 0, - 0, 0, 0, 81, 0, 0, 0, 0, 52, 0, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 0, - 0, 0, 171, 0, 51, 0, 53, 0, 0, 78, - 76, 82, 62, 63, 65, 67, 0, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 0, 0, 74, 75, 59, 60, 61, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, - 0, 0, 0, 64, 66, 54, 55, 56, 57, 58, - 0, 0, 0, 0, 80, 0, 51, 0, 53, 0, - 0, 78, 76, 22, 23, 29, 0, 0, 33, 14, - 9, 15, 44, 0, 18, 0, 0, 0, 0, 0, - 0, 0, 39, 30, 31, 32, 16, 19, 0, 0, + 86, 186, 269, 10, 302, 38, 268, 270, 6, 300, + 190, 293, 49, 1, 236, 11, 87, 301, 7, 93, + 240, 97, 99, 101, 299, 6, 104, 105, 106, 108, + 110, 91, 246, 241, 95, 7, 240, 298, 115, 103, + 240, 102, 175, 119, 102, 191, 122, 173, 10, 102, + 323, 2, 126, 127, 129, 46, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 44, 318, 151, 152, + 153, 154, 291, 156, 158, 160, 282, 113, 114, 157, + 234, 85, 69, 70, 71, 72, 73, 74, 280, 317, + 159, 6, 60, 177, 165, 192, 316, 278, 194, 276, + 171, 7, 82, 243, 315, 289, 287, 189, 257, 112, + 183, 196, 120, 118, 182, 160, 187, 117, 195, 203, + 116, 81, 125, 52, 232, 54, 161, 227, 79, 77, + 199, 168, 166, 205, 370, 290, 310, 369, 161, 283, + 362, 271, 272, 358, 357, 354, 353, 161, 155, 161, + 349, 281, 339, 332, 209, 331, 305, 10, 213, 214, + 279, 160, 277, 197, 267, 295, 208, 200, 210, 226, + 179, 265, 262, 215, 125, 111, 216, 161, 326, 260, + 184, 217, 211, 161, 163, 366, 233, 231, 249, 365, + 228, 342, 253, 242, 244, 256, 206, 334, 258, 311, + 322, 321, 251, 207, 288, 162, 96, 167, 124, 303, + 161, 125, 275, 121, 219, 284, 273, 274, 337, 314, + 238, 170, 84, 271, 272, 364, 235, 237, 359, 296, + 266, 5, 8, 89, 187, 297, 48, 252, 164, 304, + 220, 221, 222, 223, 245, 191, 50, 230, 229, 125, + 130, 259, 24, 30, 88, 309, 34, 4, 193, 185, + 92, 47, 312, 218, 17, 307, 3, 308, 0, 0, + 40, 31, 32, 33, 0, 0, 292, 313, 294, 48, + 123, 0, 0, 258, 0, 0, 325, 0, 0, 0, + 327, 0, 320, 328, 329, 0, 0, 41, 42, 0, + 39, 43, 0, 0, 0, 0, 0, 0, 0, 25, + 29, 0, 0, 0, 36, 335, 0, 37, 0, 35, + 324, 0, 26, 27, 28, 340, 341, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 356, 347, 348, 0, + 0, 0, 352, 0, 0, 0, 355, 0, 0, 0, + 0, 0, 0, 0, 360, 361, 338, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 24, 30, 367, + 368, 34, 14, 9, 15, 45, 0, 18, 350, 351, + 0, 0, 0, 0, 0, 40, 31, 32, 33, 16, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 13, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 22, 0, 41, 42, 0, 39, 43, 0, 0, 0, + 0, 0, 0, 0, 25, 29, 0, 0, 0, 36, + 0, 6, 37, 0, 35, 0, 0, 26, 27, 28, + 0, 7, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 53, 0, 345, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 81, 344, 52, 0, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, + 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, + 82, 0, 0, 0, 0, 53, 0, 248, 65, 67, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 81, + 247, 52, 0, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 53, 224, + 0, 65, 67, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 81, 0, 52, 225, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 53, 201, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 81, 0, 52, 202, 54, + 0, 0, 79, 77, 83, 63, 64, 66, 68, 78, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 53, 0, 0, 65, 67, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 81, 363, + 52, 0, 54, 0, 0, 79, 77, 83, 63, 64, + 66, 68, 78, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 53, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 81, 346, 52, 0, 54, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 53, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 81, 343, 52, 0, 54, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 53, 336, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 81, 0, 52, + 0, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 53, 0, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 333, 0, 0, + 81, 0, 52, 0, 54, 0, 0, 79, 77, 83, + 63, 64, 66, 68, 78, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, + 0, 0, 75, 76, 60, 61, 62, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 53, + 0, 0, 65, 67, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 81, 330, 52, 0, 54, 0, 0, + 79, 77, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 53, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 81, 0, 52, 319, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, + 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, + 82, 0, 0, 0, 0, 53, 0, 0, 65, 67, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 81, + 0, 52, 306, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 53, 0, + 0, 65, 67, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 81, 0, 52, 286, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 53, 0, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 0, 0, 264, 81, 0, 52, 0, 54, + 0, 0, 79, 77, 83, 63, 64, 66, 68, 78, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 53, 0, 0, 65, 67, 55, + 56, 57, 58, 59, 0, 263, 0, 0, 81, 0, + 52, 0, 54, 0, 0, 79, 77, 83, 63, 64, + 66, 68, 78, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 53, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 261, 0, + 0, 81, 0, 52, 0, 54, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 53, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 81, 0, 52, 255, 54, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 53, 0, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 81, 239, 52, + 0, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 53, 204, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 81, 0, 52, 0, 54, 0, 0, 79, 77, 83, + 63, 64, 66, 68, 78, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, + 0, 0, 75, 76, 60, 61, 62, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 53, + 0, 0, 65, 67, 55, 56, 57, 58, 59, 0, + 198, 0, 0, 81, 0, 52, 0, 54, 0, 0, + 79, 77, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 53, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 81, 188, 52, 0, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, + 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, + 82, 0, 0, 0, 0, 53, 0, 0, 65, 67, + 55, 56, 57, 58, 59, 0, 172, 0, 0, 81, + 0, 52, 0, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 53, 0, + 0, 65, 67, 55, 56, 57, 58, 59, 0, 169, + 0, 0, 81, 0, 52, 0, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 51, 53, 0, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 81, 0, 52, 0, 54, + 0, 0, 79, 77, 83, 63, 64, 66, 68, 78, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 53, 0, 0, 65, 67, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 81, 0, + 52, 0, 54, 0, 0, 79, 77, 83, 63, 64, + 66, 68, 78, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 53, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 81, 0, 52, 0, 181, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 53, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 81, 0, 52, 0, 180, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 53, 0, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 176, 0, 52, + 0, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 53, 0, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 174, 0, 52, 0, 54, 0, 0, 79, 77, 23, + 24, 212, 0, 0, 34, 14, 9, 15, 45, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 40, 31, + 32, 33, 16, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 13, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 41, 42, 0, 39, 43, + 0, 0, 0, 0, 0, 0, 0, 25, 29, 0, + 0, 0, 36, 0, 0, 37, 0, 35, 0, 0, + 26, 27, 28, 23, 24, 30, 0, 0, 34, 14, + 9, 15, 45, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 40, 31, 32, 33, 16, 19, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, - 0, 0, 0, 20, 0, 0, 21, 0, 40, 41, - 0, 38, 42, 0, 0, 0, 0, 0, 0, 0, - 24, 28, 0, 0, 0, 35, 0, 0, 36, 0, - 34, 0, 0, 25, 26, 27, 82, 62, 63, 65, - 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 68, 69, 70, 71, 72, 73, 0, 0, 74, - 75, 59, 60, 61, 0, 0, 0, 0, 0, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 64, 66, - 54, 55, 56, 57, 58, 0, 65, 67, 0, 80, - 0, 51, 0, 53, 0, 0, 78, 76, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 252, 23, 29, 0, 81, 33, 0, - 0, 0, 0, 0, 0, 64, 66, 54, 55, 56, - 57, 58, 39, 30, 31, 32, 80, 0, 51, 0, - 53, 0, 0, 78, 76, 22, 23, 29, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 40, 41, - 0, 38, 42, 0, 39, 30, 31, 32, 0, 0, - 24, 28, 0, 0, 0, 35, 0, 0, 36, 0, - 34, 311, 0, 25, 26, 27, 0, 0, 0, 0, - 40, 41, 0, 38, 42, 0, 0, 0, 0, 22, - 23, 29, 24, 28, 33, 0, 0, 35, 0, 0, - 36, 0, 34, 274, 0, 25, 26, 27, 39, 30, - 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 41, 0, 38, 42, 0, - 0, 0, 0, 0, 0, 0, 24, 28, 0, 0, - 0, 35, 0, 0, 36, 0, 34, 247, 0, 25, - 26, 27, 68, 69, 70, 71, 72, 73, 0, 0, - 74, 75, 59, 0, 0, 0, 0, 22, 23, 29, - 0, 81, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 55, 56, 57, 58, 39, 30, 31, 32, - 80, 0, 51, 0, 53, 0, 0, 78, 76, 0, - 0, 22, 23, 29, 0, 0, 33, 0, 0, 0, - 0, 0, 40, 41, 0, 38, 42, 0, 0, 173, - 39, 30, 31, 32, 24, 28, 0, 0, 0, 35, - 0, 0, 36, 0, 34, 0, 0, 25, 26, 27, - 0, 0, 0, 0, 0, 0, 40, 41, 0, 38, - 42, 0, 0, 125, 0, 22, 23, 29, 24, 28, - 33, 0, 0, 35, 0, 0, 36, 0, 34, 0, - 0, 25, 26, 27, 39, 30, 31, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 252, 23, 29, 0, - 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 41, 0, 38, 42, 39, 30, 31, 32, 0, - 0, 0, 24, 28, 0, 0, 0, 35, 0, 0, - 36, 0, 34, 0, 0, 25, 26, 27, 0, 0, - 0, 40, 41, 0, 38, 42, 0, 0, 0, 0, - 243, 23, 29, 24, 28, 33, 0, 0, 35, 0, - 0, 36, 0, 34, 0, 0, 25, 26, 27, 39, - 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 106, 23, 29, 0, 0, 33, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 41, 0, 38, 42, - 39, 30, 31, 32, 0, 0, 0, 24, 28, 0, - 0, 0, 35, 0, 0, 36, 0, 34, 0, 0, - 25, 26, 27, 0, 0, 0, 40, 41, 0, 38, - 42, 0, 0, 0, 0, 104, 23, 29, 24, 28, - 33, 0, 0, 35, 0, 0, 36, 0, 34, 0, - 0, 25, 26, 27, 39, 30, 31, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 23, 29, 0, - 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 41, 0, 38, 42, 39, 30, 31, 32, 0, - 0, 0, 24, 28, 0, 0, 0, 35, 0, 0, - 36, 0, 34, 0, 0, 25, 26, 27, 0, 0, - 0, 40, 41, 0, 38, 42, 0, 0, 0, 0, - 93, 23, 29, 24, 28, 33, 0, 0, 35, 0, - 0, 36, 0, 34, 0, 0, 25, 26, 27, 39, - 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 0, 0, 21, 22, 0, 41, + 42, 0, 39, 43, 0, 0, 0, 0, 0, 0, + 0, 25, 29, 0, 0, 0, 36, 0, 0, 37, + 0, 35, 0, 0, 26, 27, 28, 83, 63, 64, + 66, 68, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 81, 0, 52, 0, 54, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 0, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 66, 68, 0, 81, 0, 52, 0, 54, 0, + 0, 79, 77, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 23, + 24, 30, 0, 82, 34, 0, 0, 0, 0, 0, + 0, 65, 67, 55, 56, 57, 58, 59, 40, 31, + 32, 33, 81, 0, 52, 0, 54, 0, 0, 79, + 77, 23, 24, 30, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 42, 0, 39, 43, + 40, 31, 32, 33, 0, 0, 0, 25, 29, 0, + 0, 0, 36, 0, 0, 37, 0, 35, 285, 0, + 26, 27, 28, 0, 0, 0, 0, 41, 42, 0, + 39, 43, 0, 0, 0, 0, 0, 0, 0, 25, + 29, 0, 0, 0, 36, 0, 0, 37, 0, 35, + 254, 0, 26, 27, 28, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 0, 0, 0, 0, + 0, 23, 24, 30, 0, 82, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 56, 57, 58, 59, + 40, 31, 32, 33, 81, 0, 52, 0, 54, 0, + 0, 79, 77, 0, 0, 0, 23, 24, 30, 0, + 0, 34, 0, 0, 0, 0, 0, 41, 42, 0, + 39, 43, 0, 0, 178, 40, 31, 32, 33, 25, + 29, 0, 0, 0, 36, 0, 0, 37, 0, 35, + 0, 0, 26, 27, 28, 0, 0, 0, 0, 0, + 0, 0, 41, 42, 0, 39, 43, 0, 0, 128, + 0, 23, 24, 30, 25, 29, 34, 0, 0, 36, + 0, 0, 37, 0, 35, 0, 0, 26, 27, 28, + 40, 31, 32, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 259, 24, 30, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, + 39, 43, 40, 31, 32, 33, 0, 0, 0, 25, + 29, 0, 0, 0, 36, 0, 0, 37, 0, 35, + 0, 0, 26, 27, 28, 0, 0, 0, 0, 41, + 42, 0, 39, 43, 0, 0, 0, 0, 250, 24, + 30, 25, 29, 34, 0, 0, 36, 0, 0, 37, + 0, 35, 0, 0, 26, 27, 28, 40, 31, 32, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 24, 30, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 41, 42, 0, 39, 43, 40, + 31, 32, 33, 0, 0, 0, 25, 29, 0, 0, + 0, 36, 0, 0, 37, 0, 35, 0, 0, 26, + 27, 28, 0, 0, 0, 0, 41, 42, 0, 39, + 43, 0, 0, 0, 0, 107, 24, 30, 25, 29, + 34, 0, 0, 36, 0, 0, 37, 0, 35, 0, + 0, 26, 27, 28, 40, 31, 32, 33, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 24, 30, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 41, 42, 0, 39, 43, 40, 31, 32, 33, + 0, 0, 0, 25, 29, 0, 0, 0, 36, 0, + 0, 37, 0, 35, 0, 0, 26, 27, 28, 0, + 0, 0, 0, 41, 42, 0, 39, 43, 0, 0, + 0, 0, 98, 24, 30, 25, 29, 34, 0, 0, + 36, 0, 0, 37, 0, 35, 0, 0, 26, 27, + 28, 40, 31, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 24, 30, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, + 0, 39, 43, 40, 31, 32, 33, 0, 0, 0, + 25, 29, 0, 0, 0, 36, 0, 0, 37, 0, + 35, 0, 0, 26, 27, 28, 0, 0, 0, 0, + 41, 42, 0, 39, 43, 0, 0, 0, 0, 0, + 0, 0, 25, 29, 0, 0, 0, 90, 0, 0, + 37, 0, 35, 0, 0, 26, 27, 28, 69, 70, + 71, 72, 73, 74, 0, 0, 0, 0, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 41, 0, 38, 42, - 68, 69, 70, 71, 72, 73, 0, 24, 28, 0, - 59, 0, 89, 0, 0, 36, 0, 34, 0, 81, - 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, - 0, 56, 57, 58, 0, 0, 0, 0, 80, 0, - 51, 0, 53, 0, 0, 78, 76, + 57, 58, 59, 0, 0, 0, 0, 81, 0, 52, + 0, 54, 0, 0, 79, 77, } var yyPact = [...]int{ - -60, -1000, 2239, -60, -60, -1000, -1000, -1000, -1000, 276, - 1855, 191, -1000, -1000, 2651, 2651, 283, 237, 2906, 128, - 2651, 2852, -54, -1000, 2651, 2651, 2651, 2821, 2767, -1000, - -1000, -1000, -1000, 46, -60, -60, 2651, -1000, 16, 7, - 6, 2651, -15, 172, 2651, -1000, 614, -1000, 145, -1000, - 2651, 2597, 2651, 282, 2651, 2651, 2651, 2651, 2651, 2651, - 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651, - 2651, 2651, 2651, 2651, -1000, -1000, 2651, 2651, 2651, 2651, - 2651, 2651, 2651, 2651, 151, 1917, 1917, 126, 175, -60, - 182, 20, 1793, -54, 186, -60, 1731, -33, 2103, 2563, - 2651, 58, 58, 58, -54, 2041, -54, 1979, 276, -20, - 2651, 249, 1669, 2651, 269, 91, 1917, 2651, -60, 1607, - -1000, 2651, -60, 1917, 540, 2651, 1545, -1000, 2929, 2929, - 58, 58, 58, 1917, 2521, 2521, 2347, 2347, 2521, 2521, - 2521, 2521, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 2165, - 1917, 2300, 173, 1917, -1000, 2300, -1000, 1917, -60, -60, - 2651, -60, 111, 200, 2651, 2651, -60, 2651, 96, -60, - 2651, 2651, 478, 2651, 144, 280, 277, 113, 276, 39, - -34, -1000, 179, -1000, 1483, -38, -1000, 269, 42, 268, - -48, 416, 2736, -60, -1000, 256, 2475, -1000, 1421, 2651, - -22, -1000, 2682, 90, 1359, 89, -1000, 179, 1297, 1235, - 88, -1000, 219, 104, 218, 102, 97, 2421, -1000, 1173, - -27, -1000, -1000, -1000, 125, -29, 73, -60, -62, -60, - 86, 2651, -1000, 253, -1000, 67, -63, 55, 122, -1000, - -1000, 2651, 1917, -54, 84, -1000, 1111, -1000, -1000, 1917, - -1000, 1917, -54, -1000, -60, -1000, -60, 2651, -1000, 156, - -1000, -1000, -1000, -1000, 2651, 178, -1000, -1000, -1000, -30, - -1000, -31, -1000, 1049, -1000, -1000, -1000, -60, 123, 120, - -39, 2389, -1000, 81, -1000, 1917, -1000, -1000, 2651, -1000, - -1000, 2651, 2651, 987, -1000, -1000, 80, 79, 925, 119, - -60, 863, 177, -60, -1000, -1000, -1000, 78, -60, -60, - 118, -1000, -1000, -1000, 801, 354, 739, -1000, -1000, -1000, - -60, -60, 77, -60, -60, -60, -1000, 74, 71, -60, - -1000, -1000, 2651, -1000, 56, 52, 216, -60, -60, -1000, - -1000, -1000, 44, 677, -1000, 201, 103, -1000, -1000, -1000, - -1000, 92, -60, -60, 37, 35, -1000, -1000, + -61, -1000, 2349, -61, -61, -1000, -1000, -1000, -1000, 252, + 1885, 177, -1000, -1000, 2777, 2777, 260, 229, 3070, 149, + 2777, 3038, 2983, -31, -1000, 2777, 2777, 2777, 2951, 2896, + -1000, -1000, -1000, -1000, 115, -61, -61, 2777, -1000, 60, + 57, 53, 2777, 52, 165, 2777, -1000, 372, -1000, 163, + -1000, 2777, 2722, 2777, 256, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, -1000, -1000, 2777, 2777, 2777, + 2777, 2777, 2777, 2777, 2777, 162, 1948, 1948, 148, 181, + -61, 201, 72, 1822, -31, 176, -61, 1759, -23, 2200, + -28, 2137, 2687, 2777, 61, 61, 61, -31, 2074, -31, + 2011, 252, 50, 2777, 238, 1696, 2777, 251, 56, 1948, + 2777, -61, 1633, -1000, 2777, -61, 1948, 625, 2777, 1570, + -1000, 3117, 3117, 61, 61, 61, 1948, 2644, 2644, 2522, + 2522, 2644, 2644, 2644, 2644, 1948, 1948, 1948, 1948, 1948, + 1948, 1948, 2411, 1948, 2474, 135, 1948, -1000, 2474, -1000, + 1948, -61, -61, 2777, -61, 124, 2275, 2777, 2777, -61, + 2777, 123, -61, 2777, 2777, 2777, 2777, 562, 2777, 129, + 254, 253, 126, 252, 32, -44, -1000, 173, -1000, 1507, + -38, -1000, 251, 41, 250, -41, 499, 2864, -61, -1000, + 243, 2597, -1000, 1444, 2777, 47, -1000, 2809, 121, 1381, + 114, -1000, 173, 1318, 1255, 113, -1000, 211, 106, 188, + 101, 99, 90, 78, 2565, -1000, 1192, 45, -1000, -1000, + -1000, 147, 44, 74, -61, -62, -61, 107, 2777, -1000, + 241, -1000, -34, -64, -54, 161, -1000, -1000, 2777, 1948, + -31, 98, -1000, 1129, -1000, -1000, 1948, -1000, 1948, -31, + -1000, -61, -1000, -61, 2777, -1000, 142, -1000, -1000, -1000, + -1000, 2777, 172, -1000, -1000, -1000, 43, -1000, 35, -1000, + 28, -1000, 6, -1000, 1066, -1000, -1000, -1000, -61, 144, + 143, -21, 257, -1000, 120, -1000, 1948, -1000, -1000, 2777, + -1000, -1000, 2777, 2777, 1003, -1000, -1000, 97, 95, 940, + 140, -61, 877, 171, -61, -1000, -1000, -1000, -1000, -1000, + 94, -61, -61, 134, -1000, -1000, -1000, 814, 436, 751, + -1000, -1000, -1000, -61, -61, 92, -61, -61, -61, -1000, + 88, 87, -61, -1000, -1000, 2777, -1000, 86, 85, 208, + -61, -61, -1000, -1000, -1000, 82, 688, -1000, 205, 132, + -1000, -1000, -1000, -1000, 128, -61, -61, 79, 76, -1000, + -1000, } var yyPgo = [...]int{ - 0, 13, 299, 236, 298, 6, 4, 297, 0, 5, - 14, 296, 1, 295, 11, 7, 288, 12, 2, 97, - 290, 254, + 0, 13, 276, 242, 274, 7, 6, 273, 0, 76, + 15, 270, 1, 269, 12, 10, 268, 5, 2, 51, + 267, 241, } var yyR1 = [...]int{ 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 7, 7, 7, 7, 7, 7, 7, 6, - 18, 5, 16, 16, 16, 12, 13, 13, 13, 14, - 14, 14, 15, 15, 11, 10, 10, 10, 9, 9, - 9, 9, 17, 17, 17, 17, 17, 17, 8, 8, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 4, 7, 7, 7, 7, + 7, 7, 7, 6, 18, 5, 16, 16, 16, 12, + 13, 13, 13, 14, 14, 14, 15, 15, 11, 10, + 10, 10, 9, 9, 9, 9, 17, 17, 17, 17, + 17, 17, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 19, - 19, 20, 20, 21, 21, + 8, 8, 8, 19, 19, 20, 20, 21, 21, } var yyR2 = [...]int{ 0, 1, 2, 0, 2, 3, 4, 3, 3, 1, 1, 2, 2, 5, 1, 4, 7, 9, 5, 13, - 12, 9, 8, 5, 6, 5, 6, 5, 1, 7, - 5, 5, 0, 2, 2, 2, 2, 2, 2, 5, - 5, 4, 0, 2, 3, 3, 0, 1, 4, 0, - 1, 4, 1, 3, 3, 1, 4, 4, 0, 1, - 4, 4, 6, 5, 5, 6, 5, 5, 1, 1, - 2, 2, 2, 2, 4, 2, 4, 1, 1, 1, - 1, 5, 3, 7, 8, 8, 9, 5, 6, 5, - 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 12, 9, 8, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 1, 7, 5, 5, 0, 2, 2, 2, + 2, 2, 2, 5, 5, 4, 0, 2, 3, 3, + 0, 1, 4, 0, 1, 4, 1, 3, 3, 1, + 4, 4, 0, 1, 4, 4, 6, 5, 5, 6, + 5, 5, 1, 1, 2, 2, 2, 2, 4, 2, + 4, 1, 1, 1, 1, 5, 3, 7, 8, 8, + 9, 5, 6, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 3, 3, 3, 3, 5, 4, - 5, 4, 4, 4, 1, 4, 4, 5, 7, 5, - 7, 9, 7, 3, 2, 4, 6, 3, 3, 0, - 1, 1, 2, 1, 1, + 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, + 3, 3, 5, 4, 5, 4, 4, 4, 1, 4, + 4, 5, 7, 5, 7, 9, 7, 3, 2, 4, + 6, 3, 3, 0, 1, 1, 2, 1, 1, } var yyChk = [...]int{ - -1000, -1, -19, -2, -20, -21, 68, 78, -3, 11, + -1000, -1, -19, -2, -20, -21, 69, 79, -3, 11, -8, -10, 37, 38, 10, 12, 27, -4, 15, 28, - 44, 47, 4, 5, 61, 74, 75, 76, 62, 6, - 24, 25, 26, 9, 71, 66, 69, -17, 52, 23, - 49, 50, 53, -9, 13, -19, -20, -21, -14, 4, - 54, 71, 55, 73, 60, 61, 62, 63, 64, 41, - 42, 43, 17, 18, 58, 19, 59, 20, 31, 32, - 33, 34, 35, 36, 39, 40, 77, 21, 76, 22, - 69, 50, 16, 54, -9, -8, -8, 4, 14, 66, - -14, -11, -8, 4, -10, 66, -8, 4, -8, 71, - 69, -8, -8, -8, 4, -8, 4, -8, 69, 4, - -19, -19, -8, 69, 69, 69, -8, 69, 57, -8, - -3, 54, 57, -8, -8, 56, -8, 4, -8, -8, + 44, 47, 48, 4, 5, 62, 75, 76, 77, 63, + 6, 24, 25, 26, 9, 72, 67, 70, -17, 53, + 23, 50, 51, 54, -9, 13, -19, -20, -21, -14, + 4, 55, 72, 56, 74, 61, 62, 63, 64, 65, + 41, 42, 43, 17, 18, 59, 19, 60, 20, 31, + 32, 33, 34, 35, 36, 39, 40, 78, 21, 77, + 22, 70, 51, 16, 55, -9, -8, -8, 4, 14, + 67, -14, -11, -8, 4, -10, 67, -8, 4, -8, + 4, -8, 72, 70, -8, -8, -8, 4, -8, 4, + -8, 70, 4, -19, -19, -8, 70, 70, 70, -8, + 70, 58, -8, -3, 55, 58, -8, -8, 57, -8, + 4, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -9, -8, -17, -8, -10, -8, 57, 66, - 13, 66, -1, -19, 16, 68, 66, 54, -1, 66, - 69, 69, -8, 56, -9, 73, 73, -14, 69, -9, - -13, -12, 6, 70, -8, -15, 4, 48, -16, 51, - 71, -8, -19, 66, -10, -19, 56, 72, -8, 56, - 8, 70, -19, -1, -8, -1, 67, 6, -8, -8, - -1, -10, 67, -7, -19, -9, -9, 56, 72, -8, - 8, 70, 4, 4, 70, 8, -14, 57, -19, 57, - -19, 56, 70, 73, 70, -15, 71, -15, 4, 72, - 70, 57, -8, 4, -1, 4, -8, 72, 72, -8, - 70, -8, 4, 67, 66, 67, 66, 68, 67, 29, - 67, -6, -18, -5, 45, 46, -6, -5, -18, 8, - 70, 8, 70, -8, 72, 72, 70, 66, 70, 70, - 8, -19, 72, -19, 67, -8, 4, 70, 57, 72, - 70, 57, 57, -8, 67, 72, -1, -1, -8, 4, - 66, -8, -10, 56, 70, 70, 72, -1, 66, 66, - 70, 72, -12, 67, -8, -8, -8, 70, 67, 67, - 66, 66, -1, 56, 56, -19, 67, -1, -1, 66, - 70, 70, 57, 70, -1, -1, 67, -19, -19, -1, - 67, 67, -1, -8, 67, 67, 30, -1, -1, 67, - 70, 30, 66, 66, -1, -1, 67, 67, + -8, -8, -8, -8, -8, -9, -8, -17, -8, -10, + -8, 58, 67, 13, 67, -1, -19, 16, 69, 67, + 55, -1, 67, 70, 70, 70, 70, -8, 57, -9, + 74, 74, -14, 70, -9, -13, -12, 6, 71, -8, + -15, 4, 49, -16, 52, 72, -8, -19, 67, -10, + -19, 57, 73, -8, 57, 8, 71, -19, -1, -8, + -1, 68, 6, -8, -8, -1, -10, 68, -7, -19, + -9, -9, -9, -9, 57, 73, -8, 8, 71, 4, + 4, 71, 8, -14, 58, -19, 58, -19, 57, 71, + 74, 71, -15, 72, -15, 4, 73, 71, 58, -8, + 4, -1, 4, -8, 73, 73, -8, 71, -8, 4, + 68, 67, 68, 67, 69, 68, 29, 68, -6, -18, + -5, 45, 46, -6, -5, -18, 8, 71, 8, 71, + 8, 71, 8, 71, -8, 73, 73, 71, 67, 71, + 71, 8, -19, 73, -19, 68, -8, 4, 71, 58, + 73, 71, 58, 58, -8, 68, 73, -1, -1, -8, + 4, 67, -8, -10, 57, 71, 71, 71, 71, 73, + -1, 67, 67, 71, 73, -12, 68, -8, -8, -8, + 71, 68, 68, 67, 67, -1, 57, 57, -19, 68, + -1, -1, 67, 71, 71, 58, 71, -1, -1, 68, + -19, -19, -1, 68, 68, -1, -8, 68, 68, 30, + -1, -1, 68, 71, 30, 67, 67, -1, -1, 68, + 68, } var yyDef = [...]int{ - -2, -2, -2, 139, 140, 141, 143, 144, 4, 49, - -2, 0, 9, 10, 58, 0, 0, 14, 49, 0, - 0, 0, 68, 69, 0, 0, 0, 0, 0, 77, - 78, 79, 80, 0, 139, 139, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 2, -2, 142, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -2, -2, -2, 143, 144, 145, 147, 148, 4, 53, + -2, 0, 9, 10, 62, 0, 0, 14, 53, 0, + 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, + 81, 82, 83, 84, 0, 143, 143, 0, 128, 0, + 0, 0, 0, 0, 0, 0, 2, -2, 146, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, - 58, 0, 0, 58, 11, 59, 12, 0, 0, -2, - 0, 0, -2, -2, 0, -2, 0, 68, 0, 0, - 58, 70, 71, 72, -2, 0, -2, 0, 49, 0, - 58, 46, 0, 0, 0, 42, 134, 0, 139, 0, - 5, 58, 139, 7, 0, 0, 0, 82, 92, 93, - 94, 95, 96, 97, 98, 99, -2, -2, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 114, 115, - 116, 117, 0, 133, 124, 138, 8, -2, 139, -2, - 0, -2, 0, -2, 0, 0, -2, 58, 0, 32, - 58, 58, 0, 0, 0, 0, 0, 0, 49, 139, - 139, 47, 0, 91, 0, 0, 52, 0, 0, 0, - 0, 0, 0, -2, 6, 0, 0, 123, 0, 0, - 0, 121, 0, 0, 0, 0, 15, 77, 0, 0, - 0, 54, 0, 0, 0, 0, 0, 0, 122, 0, - 0, 119, 74, 76, 0, 0, 0, 139, 0, 139, - 0, 0, 125, 0, 126, 0, 0, 0, 0, 43, - 135, 0, -2, -2, 0, 51, 0, 66, 67, 81, - 120, 60, -2, 13, -2, 30, -2, 0, 18, 0, - 23, 35, 37, 38, 58, 0, 33, 34, 36, 0, - -2, 0, -2, 0, 63, 64, 118, -2, 0, 0, - 0, 0, 87, 0, 89, 45, 53, 127, 0, 44, - 129, 0, 0, 0, 31, 65, 0, 0, 0, 0, - -2, 59, 0, 139, -2, -2, 62, 0, -2, -2, - 0, 88, 48, 90, 0, 0, 0, 136, 29, 16, - -2, -2, 0, 139, 139, -2, 83, 0, 0, -2, - 128, 130, 0, 132, 0, 0, 22, -2, -2, 41, - 84, 85, 0, 0, 17, 21, 0, 39, 40, 86, - 131, 0, -2, -2, 0, 0, 20, 19, + 0, 0, 0, 0, 0, 116, 117, 0, 0, 0, + 0, 62, 0, 0, 62, 11, 63, 12, 0, 0, + -2, 0, 0, -2, -2, 0, -2, 0, 72, 0, + 72, 0, 0, 62, 74, 75, 76, -2, 0, -2, + 0, 53, 0, 62, 50, 0, 0, 0, 46, 138, + 0, 143, 0, 5, 62, 143, 7, 0, 0, 0, + 86, 96, 97, 98, 99, 100, 101, 102, 103, -2, + -2, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 118, 119, 120, 121, 0, 137, 128, 142, 8, + -2, 143, -2, 0, -2, 0, -2, 0, 0, -2, + 62, 0, 36, 62, 62, 62, 62, 0, 0, 0, + 0, 0, 0, 53, 143, 143, 51, 0, 95, 0, + 0, 56, 0, 0, 0, 0, 0, 0, -2, 6, + 0, 0, 127, 0, 0, 0, 125, 0, 0, 0, + 0, 15, 81, 0, 0, 0, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 126, 0, 0, 123, 78, + 80, 0, 0, 0, 143, 0, 143, 0, 0, 129, + 0, 130, 0, 0, 0, 0, 47, 139, 0, -2, + -2, 0, 55, 0, 70, 71, 85, 124, 64, -2, + 13, -2, 34, -2, 0, 18, 0, 23, 39, 41, + 42, 62, 0, 37, 38, 40, 0, -2, 0, -2, + 0, -2, 0, -2, 0, 67, 68, 122, -2, 0, + 0, 0, 0, 91, 0, 93, 49, 57, 131, 0, + 48, 133, 0, 0, 0, 35, 69, 0, 0, 0, + 0, -2, 63, 0, 143, -2, -2, -2, -2, 66, + 0, -2, -2, 0, 92, 52, 94, 0, 0, 0, + 140, 33, 16, -2, -2, 0, 143, 143, -2, 87, + 0, 0, -2, 132, 134, 0, 136, 0, 0, 22, + -2, -2, 45, 88, 89, 0, 0, 17, 21, 0, + 43, 44, 90, 135, 0, -2, -2, 0, 0, 20, + 19, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 78, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 79, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 74, 3, 3, 3, 64, 76, 3, - 69, 70, 62, 60, 57, 61, 73, 63, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 56, 68, - 59, 54, 58, 55, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 75, 3, 3, 3, 65, 77, 3, + 70, 71, 63, 61, 58, 62, 74, 64, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 57, 69, + 60, 55, 59, 56, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 71, 3, 72, 75, 3, 3, 3, 3, 3, + 3, 72, 3, 73, 76, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 66, 77, 67, + 3, 3, 3, 67, 78, 68, } var yyTok2 = [...]int{ @@ -859,7 +918,7 @@ var yyTok2 = [...]int{ 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, 65, + 52, 53, 54, 66, } var yyTok3 = [...]int{ 0, @@ -1404,22 +1463,50 @@ yydefault: yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 28: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] //line parser.go.y:223 + { + yyVAL.stmt = &ast.DeferStmt{Expr: &ast.CallExpr{Name: yyDollar[2].tok.Lit, SubExprs: yyDollar[4].exprs, VarArg: true, Defer: true}} + yyVAL.stmt.SetPosition(yyDollar[2].tok.Position()) + } + case 29: + yyDollar = yyS[yypt-5 : yypt+1] + //line parser.go.y:228 + { + yyVAL.stmt = &ast.DeferStmt{Expr: &ast.CallExpr{Name: yyDollar[2].tok.Lit, SubExprs: yyDollar[4].exprs, Defer: true}} + yyVAL.stmt.SetPosition(yyDollar[2].tok.Position()) + } + case 30: + yyDollar = yyS[yypt-6 : yypt+1] + //line parser.go.y:233 + { + yyVAL.stmt = &ast.DeferStmt{Expr: &ast.AnonCallExpr{Expr: yyDollar[2].expr, SubExprs: yyDollar[4].exprs, VarArg: true, Defer: true}} + yyVAL.stmt.SetPosition(yyDollar[2].expr.Position()) + } + case 31: + yyDollar = yyS[yypt-5 : yypt+1] + //line parser.go.y:238 + { + yyVAL.stmt = &ast.DeferStmt{Expr: &ast.AnonCallExpr{Expr: yyDollar[2].expr, SubExprs: yyDollar[4].exprs, Defer: true}} + yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) + } + case 32: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.go.y:243 { yyVAL.stmt = &ast.ExprStmt{Expr: yyDollar[1].expr} yyVAL.stmt.SetPosition(yyDollar[1].expr.Position()) } - case 29: + case 33: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:231 + //line parser.go.y:251 { yyDollar[1].stmt_if.(*ast.IfStmt).ElseIf = append(yyDollar[1].stmt_if.(*ast.IfStmt).ElseIf, &ast.IfStmt{If: yyDollar[4].expr, Then: yyDollar[6].compstmt}) yyVAL.stmt_if.SetPosition(yyDollar[1].stmt_if.Position()) } - case 30: + case 34: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:236 + //line parser.go.y:256 { if yyVAL.stmt_if.(*ast.IfStmt).Else != nil { yylex.Error("multiple else statement") @@ -1428,52 +1515,52 @@ yydefault: } yyVAL.stmt_if.SetPosition(yyDollar[1].stmt_if.Position()) } - case 31: + case 35: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:245 + //line parser.go.y:265 { yyVAL.stmt_if = &ast.IfStmt{If: yyDollar[2].expr, Then: yyDollar[4].compstmt, Else: nil} yyVAL.stmt_if.SetPosition(yyDollar[1].tok.Position()) } - case 32: + case 36: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:251 + //line parser.go.y:271 { yyVAL.stmt_cases = []ast.Stmt{} } - case 33: + case 37: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:255 + //line parser.go.y:275 { yyVAL.stmt_cases = []ast.Stmt{yyDollar[2].stmt_case} } - case 34: + case 38: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:259 + //line parser.go.y:279 { yyVAL.stmt_cases = []ast.Stmt{yyDollar[2].stmt_default} } - case 35: + case 39: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:263 + //line parser.go.y:283 { yyVAL.stmt_cases = append(yyDollar[1].stmt_cases, yyDollar[2].stmt_case) } - case 36: + case 40: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:267 + //line parser.go.y:287 { yyVAL.stmt_cases = yyDollar[2].stmt_multi_case } - case 37: + case 41: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:271 + //line parser.go.y:291 { yyVAL.stmt_cases = append(yyDollar[1].stmt_cases, yyDollar[2].stmt_multi_case...) } - case 38: + case 42: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:275 + //line parser.go.y:295 { for _, stmt := range yyDollar[1].stmt_cases { if _, ok := stmt.(*ast.DefaultStmt); ok { @@ -1482,15 +1569,15 @@ yydefault: } yyVAL.stmt_cases = append(yyDollar[1].stmt_cases, yyDollar[2].stmt_default) } - case 39: + case 43: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:286 + //line parser.go.y:306 { yyVAL.stmt_case = &ast.CaseStmt{Expr: yyDollar[2].expr, Stmts: yyDollar[5].compstmt} } - case 40: + case 44: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:292 + //line parser.go.y:312 { var cases = []ast.Stmt{} for _, stmt := range yyDollar[2].expr_many { @@ -1498,334 +1585,334 @@ yydefault: } yyVAL.stmt_multi_case = cases } - case 41: + case 45: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:302 + //line parser.go.y:322 { yyVAL.stmt_default = &ast.DefaultStmt{Stmts: yyDollar[4].compstmt} } - case 42: + case 46: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:307 + //line parser.go.y:327 { yyVAL.array_count = ast.ArrayCount{Count: 0} } - case 43: + case 47: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:311 + //line parser.go.y:331 { yyVAL.array_count = ast.ArrayCount{Count: 1} } - case 44: + case 48: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:315 + //line parser.go.y:335 { yyVAL.array_count.Count = yyVAL.array_count.Count + 1 } - case 45: + case 49: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:321 + //line parser.go.y:341 { yyVAL.expr_pair = &ast.PairExpr{Key: yyDollar[1].tok.Lit, Value: yyDollar[3].expr} } - case 46: + case 50: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:326 + //line parser.go.y:346 { yyVAL.expr_pairs = []ast.Expr{} } - case 47: + case 51: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:330 + //line parser.go.y:350 { yyVAL.expr_pairs = []ast.Expr{yyDollar[1].expr_pair} } - case 48: + case 52: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:334 + //line parser.go.y:354 { if len(yyDollar[1].expr_pairs) == 0 { yylex.Error("syntax error: unexpected ','") } yyVAL.expr_pairs = append(yyDollar[1].expr_pairs, yyDollar[4].expr_pair) } - case 49: + case 53: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:342 + //line parser.go.y:362 { yyVAL.expr_idents = []string{} } - case 50: + case 54: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:346 + //line parser.go.y:366 { yyVAL.expr_idents = []string{yyDollar[1].tok.Lit} } - case 51: + case 55: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:350 + //line parser.go.y:370 { if len(yyDollar[1].expr_idents) == 0 { yylex.Error("syntax error: unexpected ','") } yyVAL.expr_idents = append(yyDollar[1].expr_idents, yyDollar[4].tok.Lit) } - case 52: + case 56: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:359 + //line parser.go.y:379 { yyVAL.expr_type = yyDollar[1].tok.Lit } - case 53: + case 57: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:363 + //line parser.go.y:383 { yyVAL.expr_type = yyVAL.expr_type + "." + yyDollar[3].tok.Lit } - case 54: + case 58: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:368 + //line parser.go.y:388 { yyVAL.expr_lets = &ast.LetsExpr{Lhss: yyDollar[1].expr_many, Operator: "=", Rhss: yyDollar[3].expr_many} } - case 55: + case 59: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:374 + //line parser.go.y:394 { yyVAL.expr_many = []ast.Expr{yyDollar[1].expr} } - case 56: + case 60: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:378 + //line parser.go.y:398 { yyVAL.expr_many = append(yyDollar[1].exprs, yyDollar[4].expr) } - case 57: + case 61: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:382 + //line parser.go.y:402 { yyVAL.expr_many = append(yyDollar[1].exprs, &ast.IdentExpr{Lit: yyDollar[4].tok.Lit}) } - case 58: + case 62: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:387 + //line parser.go.y:407 { yyVAL.exprs = nil } - case 59: + case 63: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:391 + //line parser.go.y:411 { yyVAL.exprs = []ast.Expr{yyDollar[1].expr} } - case 60: + case 64: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:395 + //line parser.go.y:415 { if len(yyDollar[1].exprs) == 0 { yylex.Error("syntax error: unexpected ','") } yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[4].expr) } - case 61: + case 65: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:402 + //line parser.go.y:422 { if len(yyDollar[1].exprs) == 0 { yylex.Error("syntax error: unexpected ','") } yyVAL.exprs = append(yyDollar[1].exprs, &ast.IdentExpr{Lit: yyDollar[4].tok.Lit}) } - case 62: + case 66: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:411 + //line parser.go.y:431 { yyVAL.expr_slice = ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: yyDollar[3].expr, End: yyDollar[5].expr} } - case 63: + case 67: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:415 + //line parser.go.y:435 { yyVAL.expr_slice = ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: yyDollar[3].expr, End: nil} } - case 64: + case 68: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:419 + //line parser.go.y:439 { yyVAL.expr_slice = ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: nil, End: yyDollar[4].expr} } - case 65: + case 69: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:423 + //line parser.go.y:443 { yyVAL.expr_slice = ast.SliceExpr{Value: yyDollar[1].expr, Begin: yyDollar[3].expr, End: yyDollar[5].expr} } - case 66: + case 70: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:427 + //line parser.go.y:447 { yyVAL.expr_slice = ast.SliceExpr{Value: yyDollar[1].expr, Begin: yyDollar[3].expr, End: nil} } - case 67: + case 71: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:431 + //line parser.go.y:451 { yyVAL.expr_slice = ast.SliceExpr{Value: yyDollar[1].expr, Begin: nil, End: yyDollar[4].expr} } - case 68: + case 72: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:437 + //line parser.go.y:457 { yyVAL.expr = &ast.IdentExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 69: + case 73: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:442 + //line parser.go.y:462 { yyVAL.expr = &ast.NumberExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 70: + case 74: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:447 + //line parser.go.y:467 { yyVAL.expr = &ast.UnaryExpr{Operator: "-", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 71: + case 75: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:452 + //line parser.go.y:472 { yyVAL.expr = &ast.UnaryExpr{Operator: "!", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 72: + case 76: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:457 + //line parser.go.y:477 { yyVAL.expr = &ast.UnaryExpr{Operator: "^", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 73: + case 77: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:462 + //line parser.go.y:482 { yyVAL.expr = &ast.AddrExpr{Expr: &ast.IdentExpr{Lit: yyDollar[2].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].tok.Position()) } - case 74: + case 78: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:467 + //line parser.go.y:487 { yyVAL.expr = &ast.AddrExpr{Expr: &ast.MemberExpr{Expr: yyDollar[2].expr, Name: yyDollar[4].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 75: + case 79: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:472 + //line parser.go.y:492 { yyVAL.expr = &ast.DerefExpr{Expr: &ast.IdentExpr{Lit: yyDollar[2].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].tok.Position()) } - case 76: + case 80: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:477 + //line parser.go.y:497 { yyVAL.expr = &ast.DerefExpr{Expr: &ast.MemberExpr{Expr: yyDollar[2].expr, Name: yyDollar[4].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 77: + case 81: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:482 + //line parser.go.y:502 { yyVAL.expr = &ast.StringExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 78: + case 82: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:487 + //line parser.go.y:507 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 79: + case 83: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:492 + //line parser.go.y:512 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 80: + case 84: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:497 + //line parser.go.y:517 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 81: + case 85: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:502 + //line parser.go.y:522 { yyVAL.expr = &ast.TernaryOpExpr{Expr: yyDollar[1].expr, Lhs: yyDollar[3].expr, Rhs: yyDollar[5].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 82: + case 86: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:507 + //line parser.go.y:527 { yyVAL.expr = &ast.MemberExpr{Expr: yyDollar[1].expr, Name: yyDollar[3].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 83: + case 87: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:512 + //line parser.go.y:532 { yyVAL.expr = &ast.FuncExpr{Params: yyDollar[3].expr_idents, Stmts: yyDollar[6].compstmt} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 84: + case 88: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.go.y:517 + //line parser.go.y:537 { yyVAL.expr = &ast.FuncExpr{Params: yyDollar[3].expr_idents, Stmts: yyDollar[7].compstmt, VarArg: true} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 85: + case 89: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.go.y:522 + //line parser.go.y:542 { yyVAL.expr = &ast.FuncExpr{Name: yyDollar[2].tok.Lit, Params: yyDollar[4].expr_idents, Stmts: yyDollar[7].compstmt} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 86: + case 90: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:527 + //line parser.go.y:547 { yyVAL.expr = &ast.FuncExpr{Name: yyDollar[2].tok.Lit, Params: yyDollar[4].expr_idents, Stmts: yyDollar[8].compstmt, VarArg: true} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 87: + case 91: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:532 + //line parser.go.y:552 { yyVAL.expr = &ast.ArrayExpr{Exprs: yyDollar[3].exprs} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 88: + case 92: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:537 + //line parser.go.y:557 { yyVAL.expr = &ast.ArrayExpr{Exprs: yyDollar[3].exprs} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 89: + case 93: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:542 + //line parser.go.y:562 { mapExpr := make(map[string]ast.Expr) for _, v := range yyDollar[3].expr_pairs { @@ -1836,9 +1923,9 @@ yydefault: yyVAL.expr.SetPosition(l.pos) } } - case 90: + case 94: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:551 + //line parser.go.y:571 { mapExpr := make(map[string]ast.Expr) for _, v := range yyDollar[3].expr_pairs { @@ -1849,362 +1936,362 @@ yydefault: yyVAL.expr.SetPosition(l.pos) } } - case 91: + case 95: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:560 + //line parser.go.y:580 { yyVAL.expr = &ast.ParenExpr{SubExpr: yyDollar[2].expr} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 92: + case 96: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:565 + //line parser.go.y:585 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "+", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 93: + case 97: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:570 + //line parser.go.y:590 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "-", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 94: + case 98: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:575 + //line parser.go.y:595 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "*", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 95: + case 99: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:580 + //line parser.go.y:600 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "/", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 96: + case 100: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:585 + //line parser.go.y:605 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "%", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 97: + case 101: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:590 + //line parser.go.y:610 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "**", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 98: + case 102: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:595 + //line parser.go.y:615 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<<", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 99: + case 103: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:600 + //line parser.go.y:620 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">>", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 100: + case 104: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:605 + //line parser.go.y:625 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "==", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 101: + case 105: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:610 + //line parser.go.y:630 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "!=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 102: + case 106: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:615 + //line parser.go.y:635 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 103: + case 107: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:620 + //line parser.go.y:640 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 104: + case 108: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:625 + //line parser.go.y:645 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 105: + case 109: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:630 + //line parser.go.y:650 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 106: + case 110: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:635 + //line parser.go.y:655 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "+=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 107: + case 111: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:640 + //line parser.go.y:660 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "-=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 108: + case 112: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:645 + //line parser.go.y:665 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "*=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 109: + case 113: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:650 + //line parser.go.y:670 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "/=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 110: + case 114: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:655 + //line parser.go.y:675 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "&=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 111: + case 115: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:660 + //line parser.go.y:680 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "|=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 112: + case 116: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:665 + //line parser.go.y:685 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "++"} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 113: + case 117: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:670 + //line parser.go.y:690 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "--"} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 114: + case 118: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:675 + //line parser.go.y:695 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "|", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 115: + case 119: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:680 + //line parser.go.y:700 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "||", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 116: + case 120: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:685 + //line parser.go.y:705 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "&", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 117: + case 121: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:690 + //line parser.go.y:710 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "&&", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 118: + case 122: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:695 + //line parser.go.y:715 { yyVAL.expr = &ast.CallExpr{Name: yyDollar[1].tok.Lit, SubExprs: yyDollar[3].exprs, VarArg: true} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 119: + case 123: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:700 + //line parser.go.y:720 { yyVAL.expr = &ast.CallExpr{Name: yyDollar[1].tok.Lit, SubExprs: yyDollar[3].exprs} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 120: + case 124: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:705 + //line parser.go.y:725 { yyVAL.expr = &ast.AnonCallExpr{Expr: yyDollar[1].expr, SubExprs: yyDollar[3].exprs, VarArg: true} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 121: + case 125: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:710 + //line parser.go.y:730 { yyVAL.expr = &ast.AnonCallExpr{Expr: yyDollar[1].expr, SubExprs: yyDollar[3].exprs} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 122: + case 126: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:715 + //line parser.go.y:735 { yyVAL.expr = &ast.ItemExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Index: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 123: + case 127: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:720 + //line parser.go.y:740 { yyVAL.expr = &ast.ItemExpr{Value: yyDollar[1].expr, Index: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 124: + case 128: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:725 + //line parser.go.y:745 { yyVAL.expr = &yyDollar[1].expr_slice yyVAL.expr.SetPosition(yyDollar[1].expr_slice.Position()) } - case 125: + case 129: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:730 + //line parser.go.y:750 { yyVAL.expr = &ast.LenExpr{Expr: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 126: + case 130: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:735 + //line parser.go.y:755 { yyVAL.expr = &ast.NewExpr{Type: yyDollar[3].expr_type} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 127: + case 131: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:740 + //line parser.go.y:760 { yyVAL.expr = &ast.MakeChanExpr{Type: yyDollar[4].expr_type, SizeExpr: nil} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 128: + case 132: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:745 + //line parser.go.y:765 { yyVAL.expr = &ast.MakeChanExpr{Type: yyDollar[4].expr_type, SizeExpr: yyDollar[6].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 129: + case 133: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:750 + //line parser.go.y:770 { yyVAL.expr = &ast.MakeExpr{Dimensions: yyDollar[3].array_count.Count, Type: yyDollar[4].expr_type} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 130: + case 134: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:755 + //line parser.go.y:775 { yyVAL.expr = &ast.MakeExpr{Dimensions: yyDollar[3].array_count.Count, Type: yyDollar[4].expr_type, LenExpr: yyDollar[6].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 131: + case 135: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:760 + //line parser.go.y:780 { yyVAL.expr = &ast.MakeExpr{Dimensions: yyDollar[3].array_count.Count, Type: yyDollar[4].expr_type, LenExpr: yyDollar[6].expr, CapExpr: yyDollar[8].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 132: + case 136: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:765 + //line parser.go.y:785 { yyVAL.expr = &ast.MakeTypeExpr{Name: yyDollar[4].tok.Lit, Type: yyDollar[6].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 133: + case 137: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:770 + //line parser.go.y:790 { yyVAL.expr = &ast.ChanExpr{Lhs: yyDollar[1].expr, Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 134: + case 138: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:775 + //line parser.go.y:795 { yyVAL.expr = &ast.ChanExpr{Rhs: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 135: + case 139: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:780 + //line parser.go.y:800 { yyVAL.expr = &ast.DeleteExpr{WhatExpr: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 136: + case 140: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:785 + //line parser.go.y:805 { yyVAL.expr = &ast.DeleteExpr{WhatExpr: yyDollar[3].expr, KeyExpr: yyDollar[5].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 137: + case 141: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:790 + //line parser.go.y:810 { yyVAL.expr = &ast.IncludeExpr{ItemExpr: yyDollar[1].expr, ListExpr: yyDollar[3].expr_slice} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 138: + case 142: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:795 + //line parser.go.y:815 { yyVAL.expr = &ast.IncludeExpr{ItemExpr: yyDollar[1].expr, ListExpr: ast.SliceExpr{Value: yyDollar[3].expr, Begin: nil, End: nil}} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 141: + case 145: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:808 + //line parser.go.y:828 { } - case 142: + case 146: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:811 + //line parser.go.y:831 { } - case 143: + case 147: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:816 + //line parser.go.y:836 { } - case 144: + case 148: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:819 + //line parser.go.y:839 { } } diff --git a/parser/parser.go.y b/parser/parser.go.y index 4ec3758e..b3e2dcd0 100644 --- a/parser/parser.go.y +++ b/parser/parser.go.y @@ -51,7 +51,7 @@ import ( stmt_multi_case []ast.Stmt } -%token IDENT NUMBER STRING ARRAY VARARG FUNC RETURN VAR THROW IF ELSE FOR IN EQEQ NEQ GE LE OROR ANDAND NEW TRUE FALSE NIL MODULE TRY CATCH FINALLY PLUSEQ MINUSEQ MULEQ DIVEQ ANDEQ OREQ BREAK CONTINUE PLUSPLUS MINUSMINUS POW SHIFTLEFT SHIFTRIGHT SWITCH CASE DEFAULT GO CHAN MAKE OPCHAN TYPE LEN DELETE +%token IDENT NUMBER STRING ARRAY VARARG FUNC RETURN VAR THROW IF ELSE FOR IN EQEQ NEQ GE LE OROR ANDAND NEW TRUE FALSE NIL MODULE TRY CATCH FINALLY PLUSEQ MINUSEQ MULEQ DIVEQ ANDEQ OREQ BREAK CONTINUE PLUSPLUS MINUSMINUS POW SHIFTLEFT SHIFTRIGHT SWITCH CASE DEFAULT GO DEFER CHAN MAKE OPCHAN TYPE LEN DELETE %right '=' %right '?' ':' @@ -219,6 +219,26 @@ stmt : $$ = &ast.GoroutineStmt{Expr: &ast.AnonCallExpr{Expr: $2, SubExprs: $4, Go: true}} $$.SetPosition($1.Position()) } + | DEFER IDENT '(' exprs VARARG ')' + { + $$ = &ast.DeferStmt{Expr: &ast.CallExpr{Name: $2.Lit, SubExprs: $4, VarArg: true, Defer: true}} + $$.SetPosition($2.Position()) + } + | DEFER IDENT '(' exprs ')' + { + $$ = &ast.DeferStmt{Expr: &ast.CallExpr{Name: $2.Lit, SubExprs: $4, Defer: true}} + $$.SetPosition($2.Position()) + } + | DEFER expr '(' exprs VARARG ')' + { + $$ = &ast.DeferStmt{Expr: &ast.AnonCallExpr{Expr: $2, SubExprs: $4, VarArg: true, Defer: true}} + $$.SetPosition($2.Position()) + } + | DEFER expr '(' exprs ')' + { + $$ = &ast.DeferStmt{Expr: &ast.AnonCallExpr{Expr: $2, SubExprs: $4, Defer: true}} + $$.SetPosition($1.Position()) + } | expr { $$ = &ast.ExprStmt{Expr: $1} diff --git a/vm/env.go b/vm/env.go index 5fe58af1..3814fbcf 100644 --- a/vm/env.go +++ b/vm/env.go @@ -15,12 +15,19 @@ type EnvResolver interface { Type(string) (reflect.Type, error) } +type capturedFunc struct { + Func reflect.Value + Args []reflect.Value + CallSlice bool +} + // Env provides interface to run VM. This mean function scope and blocked-scope. // If stack goes to blocked-scope, it will make new Env. type Env struct { name string env map[string]reflect.Value typ map[string]reflect.Type + defers []capturedFunc parent *Env interrupt *bool external EnvResolver diff --git a/vm/vmStmt.go b/vm/vmStmt.go index f2ead49c..cb6a3219 100644 --- a/vm/vmStmt.go +++ b/vm/vmStmt.go @@ -22,6 +22,17 @@ func Run(stmts []ast.Stmt, env *Env) (interface{}, error) { // run executes statements in the specified environment. func run(stmts []ast.Stmt, env *Env) (reflect.Value, error) { rv := nilValue + defer func() { + for i := len(env.defers) - 1; i >= 0; i-- { + cf := env.defers[i] + if cf.CallSlice { + cf.Func.CallSlice(cf.Args) + } else { + cf.Func.Call(cf.Args) + } + } + }() + var err error for _, stmt := range stmts { switch stmt.(type) { @@ -448,6 +459,48 @@ func runSingleStmt(stmt ast.Stmt, env *Env) (reflect.Value, error) { return rv, nil case *ast.GoroutineStmt: return invokeExpr(stmt.Expr, env) + case *ast.DeferStmt: + switch t := stmt.Expr.(type) { + case *ast.AnonCallExpr: + f, err := invokeExpr(t.Expr, env) + if err != nil { + return nilValue, newError(stmt, err) + } + fType := f.Type() + callExpr := &ast.CallExpr{Func: f, SubExprs: t.SubExprs, VarArg: t.VarArg} + args, useCallSlice, err := makeCallArgs(fType, true, callExpr, env) + if err != nil { + return nilValue, newError(stmt, err) + } + env.defers = append(env.defers, capturedFunc{ + Func: f, + Args: args, + CallSlice: useCallSlice, + }) + case *ast.CallExpr: + var err error + f := t.Func + if !f.IsValid() { + f, err = env.get(t.Name) + if err != nil { + return nilValue, newError(stmt, err) + } + } + fType := f.Type() + isRunVmFunction := checkIfRunVmFunction(fType) + args, useCallSlice, err := makeCallArgs(fType, isRunVmFunction, t, env) + if err != nil { + return nilValue, newError(stmt, err) + } + env.defers = append(env.defers, capturedFunc{ + Func: f, + Args: args, + CallSlice: useCallSlice, + }) + default: + return invokeExpr(stmt.Expr, env) + } + return nilValue, nil default: return nilValue, newStringError(stmt, "unknown statement") }