diff --git a/ast/expr.go b/ast/expr.go index 09cee205..12ef26ca 100644 --- a/ast/expr.go +++ b/ast/expr.go @@ -88,6 +88,13 @@ type BinOpExpr struct { Rhs Expr } +// NilCoalescingOpExpr provide if invalid operator expression. +type NilCoalescingOpExpr struct { + ExprImpl + Lhs Expr + Rhs Expr +} + // TernaryOpExpr provide ternary operator expression. type TernaryOpExpr struct { ExprImpl diff --git a/parser/lexer.go b/parser/lexer.go index b428f7fa..398c9aa3 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -145,6 +145,17 @@ retry: tok = int(ch) lit = string(ch) } + case '?': + s.next() + switch s.peek() { + case '?': + tok = NILCOALESCE + lit = "??" + default: + s.back() + tok = int(ch) + lit = string(ch) + } case '+': s.next() switch s.peek() { @@ -291,7 +302,7 @@ retry: tok = int(ch) lit = string(ch) } - case '\n', '(', ')', ':', ';', '%', '?', '{', '}', '[', ']', ',', '^': + case '\n', '(', ')', ':', ';', '%', '{', '}', '[', ']', ',', '^': tok = int(ch) lit = string(ch) default: diff --git a/parser/parser.go b/parser/parser.go index 05641b67..8de0e37d 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -58,34 +58,35 @@ const NEW = 57365 const TRUE = 57366 const FALSE = 57367 const NIL = 57368 -const MODULE = 57369 -const TRY = 57370 -const CATCH = 57371 -const FINALLY = 57372 -const PLUSEQ = 57373 -const MINUSEQ = 57374 -const MULEQ = 57375 -const DIVEQ = 57376 -const ANDEQ = 57377 -const OREQ = 57378 -const BREAK = 57379 -const CONTINUE = 57380 -const PLUSPLUS = 57381 -const MINUSMINUS = 57382 -const POW = 57383 -const SHIFTLEFT = 57384 -const SHIFTRIGHT = 57385 -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 NILCOALESCE = 57369 +const MODULE = 57370 +const TRY = 57371 +const CATCH = 57372 +const FINALLY = 57373 +const PLUSEQ = 57374 +const MINUSEQ = 57375 +const MULEQ = 57376 +const DIVEQ = 57377 +const ANDEQ = 57378 +const OREQ = 57379 +const BREAK = 57380 +const CONTINUE = 57381 +const PLUSPLUS = 57382 +const MINUSMINUS = 57383 +const POW = 57384 +const SHIFTLEFT = 57385 +const SHIFTRIGHT = 57386 +const SWITCH = 57387 +const CASE = 57388 +const DEFAULT = 57389 +const GO = 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", @@ -114,6 +115,7 @@ var yyToknames = [...]string{ "TRUE", "FALSE", "NIL", + "NILCOALESCE", "MODULE", "TRY", "CATCH", @@ -173,554 +175,571 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.go.y:817 +//line parser.go.y:823 //line yacctab:1 var yyExca = [...]int{ -1, 0, 1, 3, - -2, 138, + -2, 139, -1, 1, 1, -1, -2, 0, -1, 2, - 57, 58, + 58, 58, -2, 1, -1, 10, - 57, 59, + 58, 59, -2, 28, -1, 46, - 57, 58, + 58, 58, + -2, 140, + -1, 90, + 68, 3, -2, 139, - -1, 89, - 67, 3, - -2, 138, - -1, 92, - 57, 59, - -2, 55, -1, 93, + 58, 59, + -2, 55, + -1, 94, 16, 50, - 57, 50, + 58, 50, -2, 68, - -1, 95, - 67, 3, - -2, 138, - -1, 104, + -1, 96, + 68, 3, + -2, 139, + -1, 105, 1, 73, 8, 73, - 45, 73, 46, 73, - 54, 73, - 56, 73, + 47, 73, + 55, 73, 57, 73, - 66, 73, + 58, 73, 67, 73, 68, 73, - 70, 73, - 72, 73, - 78, 73, + 69, 73, + 71, 73, + 73, 73, + 79, 73, -2, 68, - -1, 106, + -1, 107, 1, 75, 8, 75, - 45, 75, 46, 75, - 54, 75, - 56, 75, + 47, 75, + 55, 75, 57, 75, - 66, 75, + 58, 75, 67, 75, 68, 75, - 70, 75, - 72, 75, - 78, 75, + 69, 75, + 71, 75, + 73, 75, + 79, 75, -2, 68, - -1, 136, + -1, 138, 17, 0, 18, 0, - -2, 100, - -1, 137, + -2, 101, + -1, 139, 17, 0, 18, 0, - -2, 101, - -1, 156, - 57, 59, - -2, 55, + -2, 102, -1, 158, - 67, 3, - -2, 138, + 58, 59, + -2, 55, -1, 160, - 67, 3, - -2, 138, + 68, 3, + -2, 139, -1, 162, - 67, 1, + 68, 3, + -2, 139, + -1, 164, + 68, 1, -2, 46, - -1, 165, - 67, 3, - -2, 138, - -1, 192, - 67, 3, - -2, 138, - -1, 241, - 57, 60, + -1, 167, + 68, 3, + -2, 139, + -1, 194, + 68, 3, + -2, 139, + -1, 243, + 58, 60, -2, 56, - -1, 242, + -1, 244, 1, 57, - 45, 57, 46, 57, - 54, 57, - 56, 57, - 57, 61, - 67, 57, + 47, 57, + 55, 57, + 57, 57, + 58, 61, 68, 57, - 78, 57, + 69, 57, + 79, 57, -2, 68, - -1, 251, + -1, 253, 1, 61, 8, 61, - 45, 61, 46, 61, - 57, 61, - 67, 61, + 47, 61, + 58, 61, 68, 61, - 70, 61, - 72, 61, - 78, 61, + 69, 61, + 71, 61, + 73, 61, + 79, 61, -2, 68, - -1, 253, - 67, 3, - -2, 138, -1, 255, - 67, 3, - -2, 138, - -1, 269, + 68, 3, + -2, 139, + -1, 257, + 68, 3, + -2, 139, + -1, 271, 1, 25, - 45, 25, 46, 25, - 67, 25, + 47, 25, 68, 25, - 78, 25, - -2, 119, - -1, 271, + 69, 25, + 79, 25, + -2, 120, + -1, 273, 1, 27, - 45, 27, 46, 27, - 67, 27, + 47, 27, 68, 27, - 78, 27, - -2, 121, - -1, 276, - 67, 3, - -2, 138, - -1, 299, - 67, 3, - -2, 138, - -1, 303, + 69, 27, + 79, 27, + -2, 122, + -1, 278, + 68, 3, + -2, 139, + -1, 301, + 68, 3, + -2, 139, + -1, 305, 1, 24, - 45, 24, 46, 24, - 67, 24, + 47, 24, 68, 24, - 78, 24, - -2, 118, - -1, 304, + 69, 24, + 79, 24, + -2, 119, + -1, 306, 1, 26, - 45, 26, 46, 26, - 67, 26, + 47, 26, 68, 26, - 78, 26, - -2, 120, - -1, 307, - 67, 3, - -2, 138, - -1, 308, - 67, 3, - -2, 138, - -1, 319, - 67, 3, - -2, 138, - -1, 320, - 67, 3, - -2, 138, - -1, 324, - 45, 3, + 69, 26, + 79, 26, + -2, 121, + -1, 309, + 68, 3, + -2, 139, + -1, 310, + 68, 3, + -2, 139, + -1, 321, + 68, 3, + -2, 139, + -1, 322, + 68, 3, + -2, 139, + -1, 326, 46, 3, - 67, 3, - -2, 138, - -1, 328, - 67, 3, - -2, 138, - -1, 336, - 45, 3, + 47, 3, + 68, 3, + -2, 139, + -1, 330, + 68, 3, + -2, 139, + -1, 338, 46, 3, - 67, 3, - -2, 138, - -1, 337, - 45, 3, + 47, 3, + 68, 3, + -2, 139, + -1, 339, 46, 3, - 67, 3, - -2, 138, - -1, 351, - 67, 3, - -2, 138, - -1, 352, - 67, 3, - -2, 138, + 47, 3, + 68, 3, + -2, 139, + -1, 353, + 68, 3, + -2, 139, + -1, 354, + 68, 3, + -2, 139, } const yyPrivate = 57344 -const yyLast = 3009 +const yyLast = 3172 var yyAct = [...]int{ - 85, 180, 261, 10, 260, 262, 184, 6, 288, 281, - 238, 11, 48, 1, 309, 304, 86, 7, 43, 92, - 303, 96, 98, 228, 277, 101, 102, 103, 105, 107, - 94, 90, 233, 84, 6, 232, 100, 112, 99, 169, - 177, 99, 116, 275, 7, 119, 249, 10, 185, 117, - 115, 123, 124, 126, 114, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 109, 290, 148, 149, 150, - 151, 2, 153, 154, 156, 45, 251, 23, 29, 289, - 226, 33, 232, 279, 113, 155, 164, 287, 356, 152, - 171, 6, 355, 161, 348, 39, 30, 31, 32, 167, - 286, 7, 344, 232, 183, 235, 110, 111, 190, 173, - 270, 176, 156, 181, 186, 343, 197, 188, 340, 178, - 339, 40, 41, 193, 38, 42, 268, 263, 264, 335, - 108, 325, 122, 24, 28, 318, 224, 189, 35, 298, - 317, 36, 219, 34, 310, 278, 25, 26, 27, 259, - 203, 199, 293, 10, 207, 208, 283, 156, 257, 157, - 254, 162, 202, 218, 204, 252, 211, 205, 210, 209, - 352, 351, 271, 163, 312, 157, 328, 159, 214, 215, - 225, 320, 241, 234, 236, 122, 245, 308, 269, 248, - 191, 157, 250, 307, 194, 276, 243, 158, 223, 95, - 157, 299, 121, 291, 220, 122, 267, 272, 265, 266, - 157, 118, 323, 200, 122, 302, 230, 166, 350, 83, - 345, 284, 68, 69, 70, 71, 72, 73, 5, 201, - 160, 292, 59, 47, 263, 264, 8, 258, 88, 181, - 213, 81, 285, 244, 237, 185, 49, 297, 222, 221, - 227, 229, 127, 87, 300, 37, 187, 295, 179, 296, - 80, 91, 51, 212, 53, 301, 4, 78, 76, 17, - 46, 250, 3, 0, 311, 47, 0, 0, 313, 0, - 306, 314, 315, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, - 282, 0, 0, 321, 0, 0, 0, 0, 0, 0, - 0, 326, 327, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 342, 333, 334, 0, 0, 0, 338, 0, - 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, - 346, 347, 0, 82, 62, 63, 65, 67, 77, 79, - 0, 0, 0, 0, 0, 353, 354, 0, 68, 69, - 70, 71, 72, 73, 0, 0, 74, 75, 59, 60, - 61, 0, 0, 0, 324, 0, 0, 81, 0, 0, - 0, 0, 52, 0, 331, 64, 66, 54, 55, 56, - 57, 58, 0, 0, 336, 337, 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, 0, 240, 64, 66, 54, - 55, 56, 57, 58, 0, 0, 0, 0, 80, 239, - 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, 216, 0, 64, - 66, 54, 55, 56, 57, 58, 0, 0, 0, 0, - 80, 0, 51, 217, 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, 195, - 0, 64, 66, 54, 55, 56, 57, 58, 0, 0, - 0, 0, 80, 0, 51, 196, 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, - 349, 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, 332, 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, 329, 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, 322, 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, 319, 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, - 316, 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, 305, 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, 294, 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, 274, 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, 256, 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, 255, 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, 253, 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, 247, 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, 231, 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, 198, 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, 192, 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, 182, 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, - 168, 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, 165, 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, 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, 80, 0, 51, 0, 174, 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, 170, 0, 51, 0, 53, - 0, 0, 78, 76, 22, 23, 206, 0, 0, 33, + 86, 182, 263, 10, 262, 264, 186, 6, 290, 283, + 240, 11, 48, 1, 311, 306, 87, 7, 43, 93, + 305, 97, 99, 230, 279, 102, 103, 104, 106, 108, + 95, 91, 235, 85, 6, 234, 101, 113, 100, 187, + 277, 171, 117, 100, 7, 120, 251, 10, 110, 281, + 179, 124, 125, 127, 128, 118, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 228, 292, 150, 151, + 152, 153, 2, 155, 156, 158, 45, 6, 188, 289, + 291, 190, 272, 234, 270, 226, 157, 7, 221, 123, + 154, 173, 288, 116, 163, 234, 115, 237, 114, 201, + 169, 191, 280, 358, 109, 185, 183, 111, 112, 192, + 175, 166, 178, 158, 265, 266, 357, 199, 350, 346, + 180, 345, 342, 341, 195, 337, 327, 320, 319, 295, + 300, 285, 159, 259, 159, 123, 261, 256, 159, 254, + 213, 207, 354, 161, 168, 273, 353, 271, 225, 159, + 330, 222, 205, 322, 310, 10, 209, 210, 165, 158, + 309, 278, 202, 164, 204, 220, 206, 293, 314, 160, + 212, 211, 96, 122, 159, 119, 123, 325, 304, 232, + 216, 217, 227, 84, 243, 236, 238, 8, 247, 265, + 266, 250, 193, 301, 252, 352, 196, 162, 245, 347, + 123, 260, 69, 70, 71, 72, 73, 74, 269, 274, + 267, 268, 60, 5, 89, 183, 287, 246, 47, 239, + 187, 82, 49, 286, 224, 223, 129, 88, 37, 189, + 181, 4, 203, 294, 121, 46, 92, 214, 17, 3, + 81, 0, 51, 215, 54, 0, 0, 79, 77, 299, + 0, 0, 0, 229, 231, 0, 302, 0, 0, 297, + 47, 298, 0, 0, 0, 0, 0, 303, 0, 0, + 0, 0, 0, 252, 0, 0, 313, 0, 0, 0, + 315, 0, 308, 316, 317, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 282, 0, 284, 0, 323, 0, 0, 0, 0, + 0, 0, 0, 328, 329, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 344, 335, 336, 0, 0, 0, + 340, 0, 0, 0, 343, 0, 0, 0, 0, 0, + 0, 0, 348, 349, 0, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 53, 355, 356, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 326, 0, 0, + 82, 0, 0, 0, 0, 52, 0, 333, 65, 67, + 55, 56, 57, 58, 59, 0, 0, 338, 339, 81, + 332, 51, 0, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, + 0, 0, 75, 76, 60, 61, 62, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 52, 0, + 242, 65, 67, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 81, 241, 51, 0, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 53, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 52, 218, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 81, 0, 51, 219, 54, + 0, 0, 79, 77, 83, 63, 64, 66, 68, 78, + 80, 0, 0, 0, 0, 53, 0, 0, 0, 0, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, + 60, 61, 62, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 52, 197, 0, 65, 67, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 81, 0, + 51, 198, 54, 0, 0, 79, 77, 83, 63, 64, + 66, 68, 78, 80, 0, 0, 0, 0, 53, 0, + 0, 0, 0, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 52, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 81, 351, 51, 0, 54, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 52, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 81, 334, 51, 0, 54, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 53, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 52, 0, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 81, 331, 51, + 0, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 53, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 52, 324, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 81, 0, 51, 0, 54, 0, 0, 79, 77, 83, + 63, 64, 66, 68, 78, 80, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 52, + 0, 0, 65, 67, 55, 56, 57, 58, 59, 0, + 321, 0, 0, 81, 0, 51, 0, 54, 0, 0, + 79, 77, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 52, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 81, 318, 51, 0, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 53, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 82, 0, 0, 0, 0, 52, 0, 0, 65, 67, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 81, + 0, 51, 307, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, + 0, 0, 75, 76, 60, 61, 62, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 52, 0, + 0, 65, 67, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 81, 0, 51, 296, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 53, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 52, 0, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 81, 0, 51, 276, 54, + 0, 0, 79, 77, 83, 63, 64, 66, 68, 78, + 80, 0, 0, 0, 0, 53, 0, 0, 0, 0, + 69, 70, 71, 72, 73, 74, 0, 0, 75, 76, + 60, 61, 62, 0, 0, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 52, 0, 0, 65, 67, 55, + 56, 57, 58, 59, 0, 0, 0, 258, 81, 0, + 51, 0, 54, 0, 0, 79, 77, 83, 63, 64, + 66, 68, 78, 80, 0, 0, 0, 0, 53, 0, + 0, 0, 0, 69, 70, 71, 72, 73, 74, 0, + 0, 75, 76, 60, 61, 62, 0, 0, 0, 0, + 0, 0, 82, 0, 0, 0, 0, 52, 0, 0, + 65, 67, 55, 56, 57, 58, 59, 0, 257, 0, + 0, 81, 0, 51, 0, 54, 0, 0, 79, 77, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 52, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 255, 0, 0, 81, 0, 51, 0, 54, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 53, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 52, 0, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 81, 0, 51, + 249, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 53, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 52, 0, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 81, 233, 51, 0, 54, 0, 0, 79, 77, 83, + 63, 64, 66, 68, 78, 80, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 52, + 200, 0, 65, 67, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 81, 0, 51, 0, 54, 0, 0, + 79, 77, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 52, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 194, 0, 0, 81, 0, 51, 0, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 53, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 82, 0, 0, 0, 0, 52, 0, 0, 65, 67, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 81, + 184, 51, 0, 54, 0, 0, 79, 77, 83, 63, + 64, 66, 68, 78, 80, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, + 0, 0, 75, 76, 60, 61, 62, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 52, 0, + 0, 65, 67, 55, 56, 57, 58, 59, 0, 170, + 0, 0, 81, 0, 51, 0, 54, 0, 0, 79, + 77, 83, 63, 64, 66, 68, 78, 80, 0, 0, + 0, 0, 53, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 0, 0, 75, 76, 60, 61, 62, + 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 52, 0, 0, 65, 67, 55, 56, 57, 58, + 59, 0, 167, 0, 0, 81, 0, 51, 0, 54, + 0, 0, 79, 77, 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, 0, 36, - 0, 34, 0, 0, 25, 26, 27, 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, 0, 0, 0, 0, + 0, 0, 0, 39, 30, 31, 32, 0, 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, + 83, 63, 64, 66, 68, 78, 80, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 69, 70, 71, 72, + 73, 74, 0, 0, 75, 76, 60, 61, 62, 0, + 0, 0, 0, 0, 0, 82, 0, 0, 0, 50, + 52, 0, 0, 65, 67, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 81, 0, 51, 0, 54, 0, + 0, 79, 77, 83, 63, 64, 66, 68, 78, 80, + 0, 0, 0, 0, 53, 0, 0, 0, 0, 69, + 70, 71, 72, 73, 74, 0, 0, 75, 76, 60, + 61, 62, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 52, 0, 0, 65, 67, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 81, 0, 51, + 0, 54, 0, 0, 79, 77, 83, 63, 64, 66, + 68, 78, 80, 0, 0, 0, 0, 53, 0, 0, + 0, 0, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 0, 52, 0, 0, 65, + 67, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 81, 0, 51, 0, 177, 0, 0, 79, 77, 83, + 63, 64, 66, 68, 78, 80, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 69, 70, 71, 72, 73, + 74, 0, 0, 75, 76, 60, 61, 62, 0, 0, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 52, + 0, 0, 65, 67, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 81, 0, 51, 0, 176, 0, 0, + 79, 77, 83, 63, 64, 66, 68, 78, 80, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 61, + 62, 0, 0, 0, 0, 0, 0, 82, 0, 0, + 0, 0, 52, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 172, 0, 51, 0, + 54, 0, 0, 79, 77, 83, 63, 64, 66, 68, + 78, 80, 0, 0, 0, 0, 53, 0, 0, 0, + 0, 69, 70, 71, 72, 73, 74, 0, 0, 75, + 76, 60, 61, 62, 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, 51, 0, 54, 0, 0, 79, 77, 22, 23, + 208, 0, 0, 33, 14, 9, 15, 44, 0, 18, + 0, 0, 0, 0, 0, 0, 0, 39, 30, 31, + 32, 0, 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, 22, - 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, 273, 0, 25, - 26, 27, 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, 246, - 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, + 26, 27, 83, 63, 64, 66, 68, 0, 80, 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, 82, 0, 0, + 0, 0, 0, 0, 0, 65, 67, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 81, 0, 51, 0, + 54, 0, 0, 79, 77, 22, 23, 29, 0, 0, + 33, 14, 9, 15, 44, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 39, 30, 31, 32, 0, 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, 83, + 63, 64, 66, 68, 0, 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, 82, 0, 0, 0, 0, 0, + 0, 0, 65, 67, 55, 56, 57, 58, 59, 66, + 68, 0, 0, 81, 0, 51, 0, 54, 0, 0, + 79, 77, 69, 70, 71, 72, 73, 74, 0, 0, + 75, 76, 60, 61, 62, 0, 0, 253, 23, 29, + 0, 82, 33, 0, 0, 0, 0, 0, 0, 65, + 67, 55, 56, 57, 58, 59, 39, 30, 31, 32, + 81, 0, 51, 0, 54, 0, 0, 79, 77, 22, + 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, 312, 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, 275, 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, 0, + 40, 41, 0, 38, 42, 0, 0, 0, 0, 0, + 0, 0, 24, 28, 0, 0, 0, 35, 0, 0, + 36, 0, 34, 248, 0, 25, 26, 27, 69, 70, + 71, 72, 73, 74, 0, 0, 75, 76, 60, 0, + 0, 0, 0, 22, 23, 29, 0, 82, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 55, 56, 57, + 58, 59, 39, 30, 31, 32, 81, 0, 51, 0, + 54, 0, 0, 79, 77, 0, 0, 0, 22, 23, + 29, 0, 0, 33, 0, 0, 0, 0, 0, 40, + 41, 0, 38, 42, 0, 0, 174, 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, 0, 40, 41, 0, 38, 42, 0, - 0, 172, 39, 30, 31, 32, 24, 28, 0, 0, + 0, 126, 0, 22, 23, 29, 24, 28, 33, 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, 251, 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, 242, 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, + 26, 27, 39, 30, 31, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 253, 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, + 0, 40, 41, 0, 38, 42, 0, 0, 0, 0, + 244, 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, 107, 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, 0, 40, 41, + 0, 38, 42, 0, 0, 0, 0, 105, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, + 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, 39, 30, 31, 32, 0, 0, 0, 0, 0, + 27, 0, 0, 0, 0, 40, 41, 0, 38, 42, + 0, 0, 0, 0, 94, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 38, 42, 69, 70, 71, 72, 73, + 74, 0, 24, 28, 0, 60, 0, 90, 0, 0, + 36, 0, 34, 0, 82, 25, 26, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, + 0, 0, 0, 81, 0, 51, 0, 54, 0, 0, + 79, 77, } var yyPact = [...]int{ - -61, -1000, 2295, -61, -61, -1000, -1000, -1000, -1000, 252, - 1838, 175, -1000, -1000, 2653, 2653, 259, 234, 2908, 143, - 2653, 2854, -33, -1000, 2653, 2653, 2653, 2823, 2769, -1000, - -1000, -1000, -1000, 71, -61, -61, 2653, -1000, 25, -15, - -19, 2653, -20, 164, 2653, -1000, 597, -1000, 158, -1000, - 2653, 2599, 2653, 258, 2653, 2653, 2653, 2653, 2653, 2653, - 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, - 2653, 2653, 2653, 2653, -1000, -1000, 2653, 2653, 2653, 2653, - 2653, 2653, 2653, 2653, 163, 1900, 1900, 141, 174, -61, - 167, 28, 1776, -33, 173, -61, 1714, -30, 2086, 2565, - 2653, 201, 201, 201, -33, 2024, -33, 1962, 252, -29, - 2653, 243, 1652, 2653, 251, 76, 1900, 2653, -61, 1590, - -1000, 2653, -61, 1900, 523, 2653, 1528, -1000, 2931, 2931, - 201, 201, 201, 1900, 2523, 2523, 2403, 2403, 2523, 2523, - 2523, 2523, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 2221, - 1900, 2356, 153, 1900, 2356, -1000, 1900, -61, -61, 2653, - -61, 110, 2160, 2653, 2653, -61, 2653, 109, -61, 2653, - 2653, 461, 2653, 144, 255, 254, 138, 252, 33, -34, - -1000, 170, -1000, 1466, -38, -1000, 251, 44, 250, -62, - 399, 2738, -61, -1000, 249, 2477, -1000, 1404, 2653, -24, - -1000, 2684, 108, 1342, 103, -1000, 170, 1280, 1218, 101, - -1000, 218, 92, 199, 128, 112, 2445, -1000, 1156, -27, - -1000, -1000, -1000, 139, -46, 85, -61, -63, -61, 99, - 2653, -1000, 248, -1000, 40, -64, 19, 156, -1000, -1000, - 2653, 1900, -33, 95, -1000, 1094, -1000, -1000, 1900, -1000, - 1900, -33, -1000, -61, -1000, -61, 2653, -1000, 145, -1000, - -1000, -1000, -1000, 2653, 169, -1000, -1000, -1000, -50, -1000, - -55, -1000, 1032, -1000, -1000, -1000, -61, 137, 131, -56, - 82, -1000, 117, -1000, 1900, -1000, -1000, 2653, -1000, -1000, - 2653, 2653, 970, -1000, -1000, 83, 78, 908, 125, -61, - 846, 166, -61, -1000, -1000, -1000, 74, -61, -61, 120, - -1000, -1000, -1000, 784, 337, 722, -1000, -1000, -1000, -61, - -61, 72, -61, -61, -61, -1000, 63, 61, -61, -1000, - -1000, 2653, -1000, 58, 45, 200, -61, -61, -1000, -1000, - -1000, 37, 660, -1000, 198, 115, -1000, -1000, -1000, -1000, - 114, -61, -61, 35, 31, -1000, -1000, + -62, -1000, 2391, -62, -62, -1000, -1000, -1000, -1000, 228, + 1864, 138, -1000, -1000, 2809, 2809, 233, 210, 3070, 115, + 2809, 3015, -34, -1000, 2809, 2809, 2809, 2983, 2928, -1000, + -1000, -1000, -1000, 44, -62, -62, 2809, -1000, 38, 36, + 33, 2809, -15, 127, 2809, -1000, 1800, -1000, 128, -1000, + 2809, 2754, 2809, 2809, 232, 2809, 2809, 2809, 2809, 2809, + 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, + 2809, 2809, 2809, 2809, 2809, -1000, -1000, 2809, 2809, 2809, + 2809, 2809, 2809, 2809, 2809, 126, 1927, 1927, 112, 140, + -62, 152, 52, 1725, -34, 99, -62, 1662, -29, 2116, + 2719, 2809, 180, 180, 180, -34, 2053, -34, 1990, 228, + -20, 2809, 219, 1599, 2809, 226, 39, 1927, 2809, -62, + 1536, -1000, 2809, -62, 1927, 528, 2809, 1473, 2179, -1000, + 3093, 3093, 180, 180, 180, 1927, 2676, 2676, 2500, 2500, + 2676, 2676, 2676, 2676, 1927, 1927, 1927, 1927, 1927, 1927, + 1927, 2316, 1927, 2453, 101, 1927, 2453, -1000, 1927, -62, + -62, 2809, -62, 83, 2254, 2809, 2809, -62, 2809, 82, + -62, 2809, 2809, 465, 2809, 90, 231, 230, 87, 228, + 18, -35, -1000, 132, -1000, 1410, -39, -1000, 226, 35, + 225, -63, 402, 2896, -62, -1000, 223, 2630, -1000, 1347, + 2809, -25, -1000, 2841, 81, 1284, 79, -1000, 132, 1221, + 1158, 75, -1000, 181, 78, 153, 86, 84, 2575, -1000, + 1095, -31, -1000, -1000, -1000, 104, -47, 41, -62, -64, + -62, 73, 2809, -1000, 222, -1000, 31, -65, 19, 119, + -1000, -1000, 2809, 1927, -34, 71, -1000, 1032, -1000, -1000, + 1927, -1000, 1927, -34, -1000, -62, -1000, -62, 2809, -1000, + 136, -1000, -1000, -1000, -1000, 2809, 131, -1000, -1000, -1000, + -51, -1000, -56, -1000, 969, -1000, -1000, -1000, -62, 103, + 97, -57, 2543, -1000, 110, -1000, 1927, -1000, -1000, 2809, + -1000, -1000, 2809, 2809, 906, -1000, -1000, 70, 69, 843, + 96, -62, 780, 130, -62, -1000, -1000, -1000, 68, -62, + -62, 93, -1000, -1000, -1000, 717, 339, 654, -1000, -1000, + -1000, -62, -62, 67, -62, -62, -62, -1000, 65, 64, + -62, -1000, -1000, 2809, -1000, 63, 61, 178, -62, -62, + -1000, -1000, -1000, 60, 591, -1000, 174, 89, -1000, -1000, + -1000, -1000, 85, -62, -62, 58, 45, -1000, -1000, } var yyPgo = [...]int{ - 0, 13, 282, 246, 279, 5, 4, 273, 0, 18, - 11, 271, 1, 268, 12, 6, 266, 265, 2, 81, - 276, 238, + 0, 13, 249, 197, 248, 5, 4, 247, 0, 18, + 11, 246, 1, 240, 12, 6, 239, 238, 2, 82, + 241, 223, } var yyR1 = [...]int{ @@ -737,8 +756,8 @@ var yyR1 = [...]int{ 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, 8, 8, 8, 8, 8, 8, 19, + 19, 20, 20, 21, 21, } var yyR2 = [...]int{ @@ -750,107 +769,107 @@ var yyR2 = [...]int{ 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, + 1, 5, 3, 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, 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, 0, 1, - 1, 2, 1, 1, + 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, 0, + 1, 1, 2, 1, 1, } var yyChk = [...]int{ - -1000, -1, -19, -2, -20, -21, 68, 78, -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, + -1000, -1, -19, -2, -20, -21, 69, 79, -3, 11, + -8, -10, 38, 39, 10, 12, 28, -4, 15, 29, + 45, 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, 27, 74, 61, 62, 63, 64, 65, + 42, 43, 44, 17, 18, 59, 19, 60, 20, 32, + 33, 34, 35, 36, 37, 40, 41, 78, 21, 77, + 22, 70, 51, 16, 55, -9, -8, -8, 4, 14, + 67, -14, -11, -8, 4, -10, 67, -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, -8, 4, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -9, -8, -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, -9, -8, -8, -10, -8, 58, + 67, 13, 67, -1, -19, 16, 69, 67, 55, -1, + 67, 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, 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, + 30, 68, -6, -18, -5, 46, 47, -6, -5, -18, + 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, 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, 31, -1, -1, + 68, 71, 31, 67, 67, -1, -1, 68, 68, } var yyDef = [...]int{ - -2, -2, -2, 138, 139, 140, 142, 143, 4, 49, + -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, 138, 138, 0, 124, 0, 0, - 0, 0, 0, 0, 0, 2, -2, 141, 0, 50, + 78, 79, 80, 0, 139, 139, 0, 125, 0, 0, + 0, 0, 0, 0, 0, 2, -2, 142, 0, 50, 0, 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, 138, 0, - 5, 58, 138, 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, 137, 8, -2, 138, -2, 0, - -2, 0, -2, 0, 0, -2, 58, 0, 32, 58, - 58, 0, 0, 0, 0, 0, 0, 49, 138, 138, - 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, 138, 0, 138, 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, 138, -2, -2, 62, 0, -2, -2, 0, - 88, 48, 90, 0, 0, 0, 136, 29, 16, -2, - -2, 0, 138, 138, -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, 113, 114, 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, 135, 0, 139, + 0, 5, 58, 139, 7, 0, 0, 0, 82, 83, + 93, 94, 95, 96, 97, 98, 99, 100, -2, -2, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 115, 116, 117, 118, 0, 134, 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, 92, 0, 0, 52, 0, 0, + 0, 0, 0, 0, -2, 6, 0, 0, 124, 0, + 0, 0, 122, 0, 0, 0, 0, 15, 77, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 0, 123, + 0, 0, 120, 74, 76, 0, 0, 0, 139, 0, + 139, 0, 0, 126, 0, 127, 0, 0, 0, 0, + 43, 136, 0, -2, -2, 0, 51, 0, 66, 67, + 81, 121, 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, 119, -2, 0, + 0, 0, 0, 88, 0, 90, 45, 53, 128, 0, + 44, 130, 0, 0, 0, 31, 65, 0, 0, 0, + 0, -2, 59, 0, 139, -2, -2, 62, 0, -2, + -2, 0, 89, 48, 91, 0, 0, 0, 137, 29, + 16, -2, -2, 0, 139, 139, -2, 84, 0, 0, + -2, 129, 131, 0, 133, 0, 0, 22, -2, -2, + 41, 85, 86, 0, 0, 17, 21, 0, 39, 40, + 87, 132, 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 +878,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, @@ -1204,19 +1223,19 @@ yydefault: case 1: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:73 + //line parser.go.y:74 { yyVAL.compstmt = nil } case 2: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:77 + //line parser.go.y:78 { yyVAL.compstmt = yyDollar[1].stmts } case 3: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:82 + //line parser.go.y:83 { yyVAL.stmts = nil if l, ok := yylex.(*Lexer); ok { @@ -1225,7 +1244,7 @@ yydefault: } case 4: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:89 + //line parser.go.y:90 { yyVAL.stmts = []ast.Stmt{yyDollar[2].stmt} if l, ok := yylex.(*Lexer); ok { @@ -1234,7 +1253,7 @@ yydefault: } case 5: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:96 + //line parser.go.y:97 { if yyDollar[3].stmt != nil { yyVAL.stmts = append(yyDollar[1].stmts, yyDollar[3].stmt) @@ -1245,20 +1264,20 @@ yydefault: } case 6: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:107 + //line parser.go.y:108 { yyVAL.stmt = &ast.VarStmt{Names: yyDollar[2].expr_idents, Exprs: yyDollar[4].expr_many} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 7: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:112 + //line parser.go.y:113 { yyVAL.stmt = &ast.LetsStmt{Lhss: []ast.Expr{yyDollar[1].expr}, Operator: "=", Rhss: []ast.Expr{yyDollar[3].expr}} } case 8: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:116 + //line parser.go.y:117 { if len(yyDollar[1].expr_many) == 2 && len(yyDollar[3].expr_many) == 1 { if _, ok := yyDollar[3].expr_many[0].(*ast.ItemExpr); ok { @@ -1272,154 +1291,154 @@ yydefault: } case 9: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:128 + //line parser.go.y:129 { yyVAL.stmt = &ast.BreakStmt{} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 10: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:133 + //line parser.go.y:134 { yyVAL.stmt = &ast.ContinueStmt{} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 11: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:138 + //line parser.go.y:139 { yyVAL.stmt = &ast.ReturnStmt{Exprs: yyDollar[2].exprs} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 12: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:143 + //line parser.go.y:144 { yyVAL.stmt = &ast.ThrowStmt{Expr: yyDollar[2].expr} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 13: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:148 + //line parser.go.y:149 { yyVAL.stmt = &ast.ModuleStmt{Name: yyDollar[2].tok.Lit, Stmts: yyDollar[4].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 14: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:153 + //line parser.go.y:154 { yyVAL.stmt = yyDollar[1].stmt_if yyVAL.stmt.SetPosition(yyDollar[1].stmt_if.Position()) } case 15: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:158 + //line parser.go.y:159 { yyVAL.stmt = &ast.LoopStmt{Stmts: yyDollar[3].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 16: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:163 + //line parser.go.y:164 { yyVAL.stmt = &ast.ForStmt{Vars: yyDollar[2].expr_idents, Value: yyDollar[4].expr, Stmts: yyDollar[6].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 17: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:168 + //line parser.go.y:169 { yyVAL.stmt = &ast.CForStmt{Expr1: yyDollar[2].expr_lets, Expr2: yyDollar[4].expr, Expr3: yyDollar[6].expr, Stmts: yyDollar[8].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 18: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:173 + //line parser.go.y:174 { yyVAL.stmt = &ast.LoopStmt{Expr: yyDollar[2].expr, Stmts: yyDollar[4].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 19: yyDollar = yyS[yypt-13 : yypt+1] - //line parser.go.y:178 + //line parser.go.y:179 { yyVAL.stmt = &ast.TryStmt{Try: yyDollar[3].compstmt, Var: yyDollar[6].tok.Lit, Catch: yyDollar[8].compstmt, Finally: yyDollar[12].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 20: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.go.y:183 + //line parser.go.y:184 { yyVAL.stmt = &ast.TryStmt{Try: yyDollar[3].compstmt, Catch: yyDollar[7].compstmt, Finally: yyDollar[11].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 21: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:188 + //line parser.go.y:189 { yyVAL.stmt = &ast.TryStmt{Try: yyDollar[3].compstmt, Var: yyDollar[6].tok.Lit, Catch: yyDollar[8].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 22: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.go.y:193 + //line parser.go.y:194 { yyVAL.stmt = &ast.TryStmt{Try: yyDollar[3].compstmt, Catch: yyDollar[7].compstmt} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 23: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:198 + //line parser.go.y:199 { yyVAL.stmt = &ast.SwitchStmt{Expr: yyDollar[2].expr, Cases: yyDollar[4].stmt_cases} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 24: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:203 + //line parser.go.y:204 { yyVAL.stmt = &ast.GoroutineStmt{Expr: &ast.CallExpr{Name: yyDollar[2].tok.Lit, SubExprs: yyDollar[4].exprs, VarArg: true, Go: true}} yyVAL.stmt.SetPosition(yyDollar[2].tok.Position()) } case 25: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:208 + //line parser.go.y:209 { yyVAL.stmt = &ast.GoroutineStmt{Expr: &ast.CallExpr{Name: yyDollar[2].tok.Lit, SubExprs: yyDollar[4].exprs, Go: true}} yyVAL.stmt.SetPosition(yyDollar[2].tok.Position()) } case 26: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:213 + //line parser.go.y:214 { yyVAL.stmt = &ast.GoroutineStmt{Expr: &ast.AnonCallExpr{Expr: yyDollar[2].expr, SubExprs: yyDollar[4].exprs, VarArg: true, Go: true}} yyVAL.stmt.SetPosition(yyDollar[2].expr.Position()) } case 27: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:218 + //line parser.go.y:219 { yyVAL.stmt = &ast.GoroutineStmt{Expr: &ast.AnonCallExpr{Expr: yyDollar[2].expr, SubExprs: yyDollar[4].exprs, Go: true}} yyVAL.stmt.SetPosition(yyDollar[1].tok.Position()) } case 28: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:223 + //line parser.go.y:224 { yyVAL.stmt = &ast.ExprStmt{Expr: yyDollar[1].expr} yyVAL.stmt.SetPosition(yyDollar[1].expr.Position()) } case 29: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:231 + //line parser.go.y:232 { 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: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:236 + //line parser.go.y:237 { if yyVAL.stmt_if.(*ast.IfStmt).Else != nil { yylex.Error("multiple else statement") @@ -1430,50 +1449,50 @@ yydefault: } case 31: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:245 + //line parser.go.y:246 { 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: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:251 + //line parser.go.y:252 { yyVAL.stmt_cases = []ast.Stmt{} } case 33: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:255 + //line parser.go.y:256 { yyVAL.stmt_cases = []ast.Stmt{yyDollar[2].stmt_case} } case 34: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:259 + //line parser.go.y:260 { yyVAL.stmt_cases = []ast.Stmt{yyDollar[2].stmt_default} } case 35: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:263 + //line parser.go.y:264 { yyVAL.stmt_cases = append(yyDollar[1].stmt_cases, yyDollar[2].stmt_case) } case 36: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:267 + //line parser.go.y:268 { yyVAL.stmt_cases = yyDollar[2].stmt_multi_case } case 37: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:271 + //line parser.go.y:272 { yyVAL.stmt_cases = append(yyDollar[1].stmt_cases, yyDollar[2].stmt_multi_case...) } case 38: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:275 + //line parser.go.y:276 { for _, stmt := range yyDollar[1].stmt_cases { if _, ok := stmt.(*ast.DefaultStmt); ok { @@ -1484,13 +1503,13 @@ yydefault: } case 39: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:286 + //line parser.go.y:287 { yyVAL.stmt_case = &ast.CaseStmt{Expr: yyDollar[2].expr, Stmts: yyDollar[5].compstmt} } case 40: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:292 + //line parser.go.y:293 { var cases = []ast.Stmt{} for _, stmt := range yyDollar[2].expr_many { @@ -1500,49 +1519,49 @@ yydefault: } case 41: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:302 + //line parser.go.y:303 { yyVAL.stmt_default = &ast.DefaultStmt{Stmts: yyDollar[4].compstmt} } case 42: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:307 + //line parser.go.y:308 { yyVAL.array_count = ast.ArrayCount{Count: 0} } case 43: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:311 + //line parser.go.y:312 { yyVAL.array_count = ast.ArrayCount{Count: 1} } case 44: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:315 + //line parser.go.y:316 { yyVAL.array_count.Count = yyVAL.array_count.Count + 1 } case 45: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:321 + //line parser.go.y:322 { yyVAL.expr_pair = &ast.PairExpr{Key: yyDollar[1].tok.Lit, Value: yyDollar[3].expr} } case 46: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:326 + //line parser.go.y:327 { yyVAL.expr_pairs = []ast.Expr{} } case 47: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:330 + //line parser.go.y:331 { yyVAL.expr_pairs = []ast.Expr{yyDollar[1].expr_pair} } case 48: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:334 + //line parser.go.y:335 { if len(yyDollar[1].expr_pairs) == 0 { yylex.Error("syntax error: unexpected ','") @@ -1551,19 +1570,19 @@ yydefault: } case 49: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:342 + //line parser.go.y:343 { yyVAL.expr_idents = []string{} } case 50: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:346 + //line parser.go.y:347 { yyVAL.expr_idents = []string{yyDollar[1].tok.Lit} } case 51: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:350 + //line parser.go.y:351 { if len(yyDollar[1].expr_idents) == 0 { yylex.Error("syntax error: unexpected ','") @@ -1572,55 +1591,55 @@ yydefault: } case 52: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:359 + //line parser.go.y:360 { yyVAL.expr_type = yyDollar[1].tok.Lit } case 53: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:363 + //line parser.go.y:364 { yyVAL.expr_type = yyVAL.expr_type + "." + yyDollar[3].tok.Lit } case 54: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:368 + //line parser.go.y:369 { yyVAL.expr_lets = &ast.LetsExpr{Lhss: yyDollar[1].expr_many, Operator: "=", Rhss: yyDollar[3].expr_many} } case 55: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:374 + //line parser.go.y:375 { yyVAL.expr_many = []ast.Expr{yyDollar[1].expr} } case 56: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:378 + //line parser.go.y:379 { yyVAL.expr_many = append(yyDollar[1].exprs, yyDollar[4].expr) } case 57: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:382 + //line parser.go.y:383 { yyVAL.expr_many = append(yyDollar[1].exprs, &ast.IdentExpr{Lit: yyDollar[4].tok.Lit}) } case 58: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.go.y:387 + //line parser.go.y:388 { yyVAL.exprs = nil } case 59: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:391 + //line parser.go.y:392 { yyVAL.exprs = []ast.Expr{yyDollar[1].expr} } case 60: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:395 + //line parser.go.y:396 { if len(yyDollar[1].exprs) == 0 { yylex.Error("syntax error: unexpected ','") @@ -1629,7 +1648,7 @@ yydefault: } case 61: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:402 + //line parser.go.y:403 { if len(yyDollar[1].exprs) == 0 { yylex.Error("syntax error: unexpected ','") @@ -1638,194 +1657,201 @@ yydefault: } case 62: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:411 + //line parser.go.y:412 { yyVAL.expr_slice = &ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: yyDollar[3].expr, End: yyDollar[5].expr} } case 63: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:415 + //line parser.go.y:416 { yyVAL.expr_slice = &ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: yyDollar[3].expr, End: nil} } case 64: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:419 + //line parser.go.y:420 { yyVAL.expr_slice = &ast.SliceExpr{Value: &ast.IdentExpr{Lit: yyDollar[1].tok.Lit}, Begin: nil, End: yyDollar[4].expr} } case 65: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:423 + //line parser.go.y:424 { yyVAL.expr_slice = &ast.SliceExpr{Value: yyDollar[1].expr, Begin: yyDollar[3].expr, End: yyDollar[5].expr} } case 66: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:427 + //line parser.go.y:428 { yyVAL.expr_slice = &ast.SliceExpr{Value: yyDollar[1].expr, Begin: yyDollar[3].expr, End: nil} } case 67: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:431 + //line parser.go.y:432 { yyVAL.expr_slice = &ast.SliceExpr{Value: yyDollar[1].expr, Begin: nil, End: yyDollar[4].expr} } case 68: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:437 + //line parser.go.y:438 { yyVAL.expr = &ast.IdentExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 69: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:442 + //line parser.go.y:443 { yyVAL.expr = &ast.NumberExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 70: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:447 + //line parser.go.y:448 { yyVAL.expr = &ast.UnaryExpr{Operator: "-", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } case 71: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:452 + //line parser.go.y:453 { yyVAL.expr = &ast.UnaryExpr{Operator: "!", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } case 72: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:457 + //line parser.go.y:458 { yyVAL.expr = &ast.UnaryExpr{Operator: "^", Expr: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } case 73: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:462 + //line parser.go.y:463 { yyVAL.expr = &ast.AddrExpr{Expr: &ast.IdentExpr{Lit: yyDollar[2].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].tok.Position()) } case 74: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:467 + //line parser.go.y:468 { 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: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:472 + //line parser.go.y:473 { yyVAL.expr = &ast.DerefExpr{Expr: &ast.IdentExpr{Lit: yyDollar[2].tok.Lit}} yyVAL.expr.SetPosition(yyDollar[2].tok.Position()) } case 76: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:477 + //line parser.go.y:478 { 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: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:482 + //line parser.go.y:483 { yyVAL.expr = &ast.StringExpr{Lit: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 78: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:487 + //line parser.go.y:488 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 79: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:492 + //line parser.go.y:493 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 80: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:497 + //line parser.go.y:498 { yyVAL.expr = &ast.ConstExpr{Value: yyDollar[1].tok.Lit} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } case 81: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:502 + //line parser.go.y:503 { 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: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:507 + //line parser.go.y:508 { - yyVAL.expr = &ast.MemberExpr{Expr: yyDollar[1].expr, Name: yyDollar[3].tok.Lit} + yyVAL.expr = &ast.NilCoalescingOpExpr{Lhs: yyDollar[1].expr, Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } case 83: + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.go.y:513 + { + yyVAL.expr = &ast.MemberExpr{Expr: yyDollar[1].expr, Name: yyDollar[3].tok.Lit} + yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) + } + case 84: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:512 + //line parser.go.y:518 { yyVAL.expr = &ast.FuncExpr{Params: yyDollar[3].expr_idents, Stmts: yyDollar[6].compstmt} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 84: + case 85: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.go.y:517 + //line parser.go.y:523 { 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 86: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.go.y:522 + //line parser.go.y:528 { 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 87: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:527 + //line parser.go.y:533 { 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 88: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:532 + //line parser.go.y:538 { yyVAL.expr = &ast.ArrayExpr{Exprs: yyDollar[3].exprs} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 88: + case 89: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:537 + //line parser.go.y:543 { yyVAL.expr = &ast.ArrayExpr{Exprs: yyDollar[3].exprs} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 89: + case 90: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:542 + //line parser.go.y:548 { mapExpr := make(map[string]ast.Expr) for _, v := range yyDollar[3].expr_pairs { @@ -1836,9 +1862,9 @@ yydefault: yyVAL.expr.SetPosition(l.pos) } } - case 90: + case 91: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:551 + //line parser.go.y:557 { mapExpr := make(map[string]ast.Expr) for _, v := range yyDollar[3].expr_pairs { @@ -1849,355 +1875,355 @@ yydefault: yyVAL.expr.SetPosition(l.pos) } } - case 91: + case 92: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:560 + //line parser.go.y:566 { yyVAL.expr = &ast.ParenExpr{SubExpr: yyDollar[2].expr} if l, ok := yylex.(*Lexer); ok { yyVAL.expr.SetPosition(l.pos) } } - case 92: + case 93: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:565 + //line parser.go.y:571 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "+", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 93: + case 94: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:570 + //line parser.go.y:576 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "-", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 94: + case 95: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:575 + //line parser.go.y:581 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "*", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 95: + case 96: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:580 + //line parser.go.y:586 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "/", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 96: + case 97: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:585 + //line parser.go.y:591 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "%", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 97: + case 98: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:590 + //line parser.go.y:596 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "**", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 98: + case 99: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:595 + //line parser.go.y:601 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<<", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 99: + case 100: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:600 + //line parser.go.y:606 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">>", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 100: + case 101: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:605 + //line parser.go.y:611 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "==", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 101: + case 102: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:610 + //line parser.go.y:616 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "!=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 102: + case 103: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:615 + //line parser.go.y:621 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 103: + case 104: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:620 + //line parser.go.y:626 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: ">=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 104: + case 105: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:625 + //line parser.go.y:631 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 105: + case 106: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:630 + //line parser.go.y:636 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "<=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 106: + case 107: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:635 + //line parser.go.y:641 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "+=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 107: + case 108: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:640 + //line parser.go.y:646 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "-=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 108: + case 109: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:645 + //line parser.go.y:651 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "*=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 109: + case 110: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:650 + //line parser.go.y:656 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "/=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 110: + case 111: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:655 + //line parser.go.y:661 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "&=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 111: + case 112: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:660 + //line parser.go.y:666 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "|=", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 112: + case 113: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:665 + //line parser.go.y:671 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "++"} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 113: + case 114: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:670 + //line parser.go.y:676 { yyVAL.expr = &ast.AssocExpr{Lhs: yyDollar[1].expr, Operator: "--"} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 114: + case 115: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:675 + //line parser.go.y:681 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "|", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 115: + case 116: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:680 + //line parser.go.y:686 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "||", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 116: + case 117: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:685 + //line parser.go.y:691 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "&", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 117: + case 118: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:690 + //line parser.go.y:696 { yyVAL.expr = &ast.BinOpExpr{Lhs: yyDollar[1].expr, Operator: "&&", Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 118: + case 119: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:695 + //line parser.go.y:701 { 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 120: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:700 + //line parser.go.y:706 { yyVAL.expr = &ast.CallExpr{Name: yyDollar[1].tok.Lit, SubExprs: yyDollar[3].exprs} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 120: + case 121: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:705 + //line parser.go.y:711 { yyVAL.expr = &ast.AnonCallExpr{Expr: yyDollar[1].expr, SubExprs: yyDollar[3].exprs, VarArg: true} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 121: + case 122: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:710 + //line parser.go.y:716 { yyVAL.expr = &ast.AnonCallExpr{Expr: yyDollar[1].expr, SubExprs: yyDollar[3].exprs} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 122: + case 123: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:715 + //line parser.go.y:721 { 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 124: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:720 + //line parser.go.y:726 { yyVAL.expr = &ast.ItemExpr{Value: yyDollar[1].expr, Index: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 124: + case 125: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:725 + //line parser.go.y:731 { yyVAL.expr = yyDollar[1].expr_slice yyVAL.expr.SetPosition(yyDollar[1].expr_slice.Position()) } - case 125: + case 126: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:730 + //line parser.go.y:736 { yyVAL.expr = &ast.LenExpr{Expr: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 126: + case 127: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:735 + //line parser.go.y:741 { yyVAL.expr = &ast.NewExpr{Type: yyDollar[3].expr_type} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 127: + case 128: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:740 + //line parser.go.y:746 { yyVAL.expr = &ast.MakeChanExpr{Type: yyDollar[4].expr_type, SizeExpr: nil} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 128: + case 129: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:745 + //line parser.go.y:751 { yyVAL.expr = &ast.MakeChanExpr{Type: yyDollar[4].expr_type, SizeExpr: yyDollar[6].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 129: + case 130: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.go.y:750 + //line parser.go.y:756 { 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 131: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:755 + //line parser.go.y:761 { 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 132: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.go.y:760 + //line parser.go.y:766 { 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 133: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.go.y:765 + //line parser.go.y:771 { yyVAL.expr = &ast.MakeTypeExpr{Name: yyDollar[4].tok.Lit, Type: yyDollar[6].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 133: + case 134: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:770 + //line parser.go.y:776 { yyVAL.expr = &ast.ChanExpr{Lhs: yyDollar[1].expr, Rhs: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].expr.Position()) } - case 134: + case 135: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:775 + //line parser.go.y:781 { yyVAL.expr = &ast.ChanExpr{Rhs: yyDollar[2].expr} yyVAL.expr.SetPosition(yyDollar[2].expr.Position()) } - case 135: + case 136: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.go.y:780 + //line parser.go.y:786 { yyVAL.expr = &ast.DeleteExpr{WhatExpr: yyDollar[3].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 136: + case 137: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.go.y:785 + //line parser.go.y:791 { yyVAL.expr = &ast.DeleteExpr{WhatExpr: yyDollar[3].expr, KeyExpr: yyDollar[5].expr} yyVAL.expr.SetPosition(yyDollar[1].tok.Position()) } - case 137: + case 138: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.go.y:790 + //line parser.go.y:796 { 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 140: + case 141: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:803 + //line parser.go.y:809 { } - case 141: + case 142: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.go.y:806 + //line parser.go.y:812 { } - case 142: + case 143: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:811 + //line parser.go.y:817 { } - case 143: + case 144: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.go.y:814 + //line parser.go.y:820 { } } diff --git a/parser/parser.go.y b/parser/parser.go.y index 2a3bc737..154a3fba 100644 --- a/parser/parser.go.y +++ b/parser/parser.go.y @@ -51,10 +51,11 @@ 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 NILCOALESCE 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 %right '=' %right '?' ':' +%right NILCOALESCE %left OROR %left ANDAND %right IN @@ -503,6 +504,11 @@ expr : $$ = &ast.TernaryOpExpr{Expr: $1, Lhs: $3, Rhs: $5} $$.SetPosition($1.Position()) } + | expr NILCOALESCE expr + { + $$ = &ast.NilCoalescingOpExpr{Lhs: $1, Rhs: $3} + $$.SetPosition($1.Position()) + } | expr '.' IDENT { $$ = &ast.MemberExpr{Expr: $1, Name: $3.Lit} diff --git a/vm/vm.go b/vm/vm.go index f7a8ecb8..b9653e73 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -183,11 +183,11 @@ func equal(lhsV, rhsV reflect.Value) bool { // Try to compare bools to strings and numbers if lhsV.Kind() == reflect.Bool || rhsV.Kind() == reflect.Bool { - lhsB, err := tryToBool(lhsV, false) + lhsB, err := tryToBool(lhsV) if err != nil { return false } - rhsB, err := tryToBool(rhsV, false) + rhsB, err := tryToBool(rhsV) if err != nil { return false } diff --git a/vm/vmExpr.go b/vm/vmExpr.go index 87a46692..f01204b6 100644 --- a/vm/vmExpr.go +++ b/vm/vmExpr.go @@ -560,6 +560,17 @@ func invokeExpr(expr ast.Expr, env *Env) (reflect.Value, error) { } return rhsV, nil + case *ast.NilCoalescingOpExpr: + lhsV, err := invokeExpr(e.Lhs, env) + if toBool(lhsV) { + return lhsV, nil + } + rhsV, err := invokeExpr(e.Rhs, env) + if err != nil { + return nilValue, newError(e.Rhs, err) + } + return rhsV, nil + case *ast.LenExpr: rv, err := invokeExpr(e.Expr, env) if err != nil { diff --git a/vm/vmOperators_test.go b/vm/vmOperators_test.go index 6a5a9ca4..a839244c 100644 --- a/vm/vmOperators_test.go +++ b/vm/vmOperators_test.go @@ -274,16 +274,23 @@ func TestComparisonOperators(t *testing.T) { {Script: `1 == 2 || 1 == 1`, RunOutput: true}, {Script: `1 == 2 || 1 == 2`, RunOutput: false}, + {Script: `true == "1"`, RunOutput: true}, + {Script: `true == "t"`, RunOutput: true}, + {Script: `true == "T"`, RunOutput: true}, {Script: `true == "true"`, RunOutput: true}, {Script: `true == "TRUE"`, RunOutput: true}, {Script: `true == "True"`, RunOutput: true}, {Script: `true == "false"`, RunOutput: false}, - {Script: `true == "foo"`, RunOutput: false}, + {Script: `false == "0"`, RunOutput: true}, + {Script: `false == "f"`, RunOutput: true}, + {Script: `false == "F"`, RunOutput: true}, + {Script: `false == "false"`, RunOutput: true}, {Script: `false == "false"`, RunOutput: true}, {Script: `false == "FALSE"`, RunOutput: true}, {Script: `false == "False"`, RunOutput: true}, {Script: `false == "true"`, RunOutput: false}, {Script: `false == "foo"`, RunOutput: false}, + {Script: `true == "foo"`, RunOutput: true}, {Script: `0 == "0"`, RunOutput: true}, {Script: `"1.0" == 1`, RunOutput: true}, @@ -360,3 +367,85 @@ func TestComparisonOperators(t *testing.T) { } testlib.Run(t, tests, nil) } + +func TestTernaryOperator(t *testing.T) { + os.Setenv("ANKO_DEBUG", "1") + tests := []testlib.Test{ + {Script: `a = 1 ? 2 : panic(2)`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = c ? a : b`, RunError: fmt.Errorf("undefined symbol 'c'")}, + {Script: `a = a ? a : b`, RunError: fmt.Errorf("undefined symbol 'a'")}, + {Script: `a = 0; a = a ? a : b`, RunError: fmt.Errorf("undefined symbol 'b'")}, + {Script: `a = -1 ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = true ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = false ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "true" ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = "false" ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "-1" ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = "0" ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "0.0" ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "2" ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": int64(0)}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": int64(2)}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": float64(0.0)}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": float64(2.0)}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ? 2 : 1.0`, Input: map[string]interface{}{"b": float64(0.0)}, RunOutput: float64(1.0), Output: map[string]interface{}{"a": float64(1.0)}}, + {Script: `a = b ? 2 : 1.0`, Input: map[string]interface{}{"b": float64(0.1)}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ? 2 : 1.0`, Input: map[string]interface{}{"b": nil}, RunOutput: float64(1.0), Output: map[string]interface{}{"a": float64(1.0)}}, + {Script: `a = nil ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": map[string]interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b[1] ? 2 : 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunError: fmt.Errorf("index out of range")}, + {Script: `a = b[1][2] ? 2 : 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunError: fmt.Errorf("index out of range")}, + {Script: `a = [] ? 2 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = [2] ? 2 : 1`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ? 2 : 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": int64(2)}}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b["test"] ? 2 : 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": int64(2)}}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b["test"][1] ? 2 : 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": 2}}, RunError: fmt.Errorf("type int does not support index operation")}, + {Script: `b = "test"; a = b ? 2 : "empty"`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `b = "test"; a = b[1:3] ? 2 : "empty"`, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `b = "test"; a = b[2:2] ? 2 : "empty"`, RunOutput: "empty", Output: map[string]interface{}{"a": "empty"}}, + {Script: `b = "0.0"; a = false ? 2 : b ? 3 : 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `b = "true"; a = false ? 2 : b ? 3 : 1`, RunOutput: int64(3), Output: map[string]interface{}{"a": int64(3)}}, + } + testlib.Run(t, tests, nil) +} + +func TestNilCoalescingOperator(t *testing.T) { + os.Setenv("ANKO_DEBUG", "1") + tests := []testlib.Test{ + {Script: `a = 1 ?? panic(2)`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = c ?? b`, RunError: fmt.Errorf("undefined symbol 'b'")}, + {Script: `a = -1 ?? 1`, RunOutput: int64(-1), Output: map[string]interface{}{"a": int64(-1)}}, + {Script: `a = true ?? 1`, RunOutput: true, Output: map[string]interface{}{"a": true}}, + {Script: `a = false ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "true" ?? 1`, RunOutput: "true", Output: map[string]interface{}{"a": "true"}}, + {Script: `a = "false" ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "-1" ?? 1`, RunOutput: "-1", Output: map[string]interface{}{"a": "-1"}}, + {Script: `a = "0" ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "0.0" ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = "2" ?? 1`, RunOutput: "2", Output: map[string]interface{}{"a": "2"}}, + {Script: `a = b ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": int64(0)}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": int64(2)}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": float64(0.0)}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": float64(2.0)}, RunOutput: float64(2.0), Output: map[string]interface{}{"a": float64(2.0)}}, + {Script: `a = b ?? 1.0`, Input: map[string]interface{}{"b": float64(0.0)}, RunOutput: float64(1.0), Output: map[string]interface{}{"a": float64(1.0)}}, + {Script: `a = b ?? 1.0`, Input: map[string]interface{}{"b": float64(0.1)}, RunOutput: float64(0.1), Output: map[string]interface{}{"a": float64(0.1)}}, + {Script: `a = b ?? 1.0`, Input: map[string]interface{}{"b": nil}, RunOutput: float64(1.0), Output: map[string]interface{}{"a": float64(1.0)}}, + {Script: `a = nil ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": map[string]interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b[1] ?? 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = b[1][2] ?? 1`, Input: map[string]interface{}{"b": []interface{}{}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = [] ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `a = [2] ?? 1`, RunOutput: []interface{}{int64(2)}, Output: map[string]interface{}{"a": []interface{}{int64(2)}}}, + {Script: `a = b ?? 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": int64(2)}}, RunOutput: map[string]interface{}{"test": int64(2)}, Output: map[string]interface{}{"a": map[string]interface{}{"test": int64(2)}}}, + {Script: `a = b["test"] ?? 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": int64(2)}}, RunOutput: int64(2), Output: map[string]interface{}{"a": int64(2)}}, + {Script: `a = b["test"][1] ?? 1`, Input: map[string]interface{}{"b": map[string]interface{}{"test": 2}}, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + {Script: `b = "test"; a = b ?? "empty"`, RunOutput: "test", Output: map[string]interface{}{"a": "test"}}, + {Script: `b = "test"; a = b[1:3] ?? "empty"`, RunOutput: "es", Output: map[string]interface{}{"a": "es"}}, + {Script: `b = "test"; a = b[2:2] ?? "empty"`, RunOutput: "empty", Output: map[string]interface{}{"a": "empty"}}, + {Script: `b = "0.0"; a = false ?? b ?? 1`, RunOutput: int64(1), Output: map[string]interface{}{"a": int64(1)}}, + } + testlib.Run(t, tests, nil) +} diff --git a/vm/vmToX.go b/vm/vmToX.go index ad5a3020..15a10365 100644 --- a/vm/vmToX.go +++ b/vm/vmToX.go @@ -27,18 +27,16 @@ func toString(v reflect.Value) string { // toBool converts all reflect.Value-s into bool. func toBool(v reflect.Value) bool { - b, _ := tryToBool(v, true) + b, _ := tryToBool(v) return b } // tryToBool attempts to convert the value 'v' to a boolean, returning // an error if it cannot. When converting a string, the function returns -// true if the string is the word "true", false if the string is "false", -// and returns false & an error if it is any other string. -// The 'caseSensitive' flag affects the behavior when converting strings; -// if set to true, the function only matches on "true" or "false", not -// e.g. "True" or "FALSE" -func tryToBool(v reflect.Value, caseSensitive bool) (bool, error) { +// true if the string nonempty and does not satisfy the condition for false +// with parseBool https://golang.org/pkg/strconv/#ParseBool +// and is not 0.0 +func tryToBool(v reflect.Value) (bool, error) { if v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { v = v.Elem() } @@ -50,19 +48,24 @@ func tryToBool(v reflect.Value, caseSensitive bool) (bool, error) { case reflect.Bool: return v.Bool(), nil case reflect.String: + if v.Len() == 0 { + return false, nil + } + s := v.String() - if !caseSensitive { - s = strings.ToLower(s) + if b, err := strconv.ParseBool(s); err == nil && !b { + return false, nil } - if s == "true" { - return true, nil - } else if s == "false" { + + if f, err := tryToFloat64(v); err == nil && f == 0 { return false, nil } - if toInt64(v) != 0 { + return true, nil + case reflect.Slice, reflect.Map: + if v.Len() > 0 { return true, nil } - return false, errors.New("couldn't convert string to bool") + return false, nil } return false, errors.New("unknown type") }