diff --git a/docs/content/manual/manual.yml b/docs/content/manual/manual.yml index d5918be8..16d17c07 100644 --- a/docs/content/manual/manual.yml +++ b/docs/content/manual/manual.yml @@ -2147,7 +2147,7 @@ sections: `if A then B end` is the same as `if A then B else . end`. That is, the `else` branch is optional, and if absent is the - same as `.`. + same as `.`. This also applies to `elif` with absent ending `else` branch. Checking for false or null is a simpler notion of "truthiness" than is found in JavaScript or Python, but it diff --git a/src/parser.c b/src/parser.c index 28d47c50..66469b5c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -893,7 +893,7 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 27 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2143 +#define YYLAST 2093 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 69 @@ -957,12 +957,12 @@ static const yytype_int8 yytranslate[] = static const yytype_int16 yyrline[] = { 0, 306, 306, 309, 314, 317, 332, 335, 340, 343, - 348, 352, 355, 359, 363, 367, 370, 373, 378, 382, - 386, 391, 398, 402, 406, 410, 414, 418, 422, 426, - 430, 434, 438, 442, 446, 450, 454, 458, 462, 468, - 474, 478, 482, 486, 490, 494, 498, 502, 506, 511, - 514, 531, 540, 547, 555, 566, 571, 577, 580, 585, - 589, 593, 600, 600, 604, 604, 611, 614, 617, 623, + 348, 352, 355, 359, 363, 367, 370, 375, 379, 383, + 388, 395, 399, 403, 407, 411, 415, 419, 423, 427, + 431, 435, 439, 443, 447, 451, 455, 459, 465, 471, + 475, 479, 483, 487, 491, 495, 499, 503, 508, 511, + 528, 537, 544, 552, 563, 568, 574, 577, 582, 586, + 590, 597, 597, 601, 601, 608, 611, 614, 620, 623, 626, 631, 634, 637, 643, 646, 649, 657, 661, 664, 667, 670, 673, 676, 679, 682, 685, 689, 695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, @@ -1031,35 +1031,35 @@ static const yytype_int16 yypact[] = 13, 775, 14, 49, -55, 11, -120, 7, -120, 32, 775, 508, 508, 775, 19, 2, -120, 775, 525, 887, 292, 458, 358, 1391, 775, -120, 6, -120, -3, -3, - 775, 49, 683, 775, -120, -120, 52, 1797, 8, 10, + 775, 49, 683, 775, -120, -120, 52, 1747, 8, 10, 48, 79, -120, 106, -120, 66, 50, 1221, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, 61, -120, -120, 124, 7, 68, 62, -120, 968, -22, 64, 775, - 2084, 69, 71, 63, 87, 775, 775, 775, 775, 775, + 2034, 69, 71, 63, 87, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, -120, - -120, 1965, 78, -20, 15, 169, 125, -120, -120, -120, - 1965, 775, -120, -120, 1442, 1965, -10, -120, -120, -2, + -120, 1915, 78, -20, 15, 169, 125, -120, -120, -120, + 1915, 775, -120, -120, 1442, 1915, -10, -120, -120, -2, 775, 590, -20, -20, 655, 90, -120, 12, -120, -120, 77, -120, -120, -120, -120, 415, 443, -120, 443, 1255, - 81, -120, 443, 443, -120, 415, 1999, 353, 353, 214, - 571, 2031, 1999, 1999, 1999, 1999, 1999, 1999, 353, 353, - 1965, 214, 1999, 353, 353, 66, 66, 82, 82, 82, + 81, -120, 443, 443, -120, 415, 1949, 353, 353, 214, + 571, 1981, 1949, 1949, 1949, 1949, 1949, 1949, 353, 353, + 1915, 214, 1949, 353, 353, 66, 66, 82, 82, 82, -120, 138, -20, 837, 105, 99, 113, 775, 96, 93, 775, 103, 918, 20, -120, -120, 775, -120, 16, -120, - 2112, 18, -120, 1493, -120, 1697, 102, 104, -120, -120, + 2062, 18, -120, 1493, -120, 1697, 102, 104, -120, -120, 775, -120, 775, -120, 159, -11, -120, 443, 119, 3, 119, 108, 443, 119, 119, -120, -120, -120, -13, 109, 115, 775, 163, 116, -38, -120, 118, -20, 775, 1018, -120, -120, 1068, -120, 747, 110, -120, 165, -120, -120, -120, -120, -2, 121, -120, 775, 775, -120, -120, 775, - 775, 1965, 1831, -120, -120, 443, 443, 119, -20, -120, - -20, -20, 1289, 122, -20, 837, -120, -20, 150, 1965, - 136, 139, 142, 1118, -120, -120, -120, 775, 1881, 1931, + 775, 1915, 1781, -120, -120, 443, 443, 119, -20, -120, + -20, -20, 1289, 122, -20, 837, -120, -20, 150, 1915, + 136, 139, 142, 1118, -120, -120, -120, 775, 1831, 1881, 1544, 1595, -120, 119, 119, -120, -120, -120, 140, -20, -120, -120, -120, -120, -120, -120, 143, 1646, -120, 775, - 775, 775, -20, -120, -120, -120, 1747, 1323, 1168, -120, + 775, 775, -20, -120, -120, -120, 1697, 1323, 1168, -120, -120, -120, 775, -120, 1357, -120 }; @@ -1069,38 +1069,38 @@ static const yytype_int16 yypact[] = static const yytype_uint8 yydefact[] = { 4, 0, 0, 6, 110, 83, 100, 102, 75, 0, - 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, - 0, 0, 0, 0, 0, 101, 48, 1, 0, 0, - 8, 6, 0, 0, 79, 64, 0, 0, 0, 0, - 19, 0, 77, 0, 66, 33, 0, 0, 108, 137, + 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 0, 0, 0, 101, 47, 1, 0, 0, + 8, 6, 0, 0, 79, 63, 0, 0, 0, 0, + 18, 0, 77, 0, 65, 32, 0, 0, 108, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 0, 109, 86, 0, 0, 85, 0, 105, 0, 0, 167, 0, 0, 163, 168, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, - 5, 10, 82, 0, 0, 0, 0, 54, 53, 3, - 2, 8, 7, 49, 0, 118, 0, 116, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 5, 10, 82, 0, 0, 0, 0, 53, 52, 3, + 2, 8, 7, 48, 0, 118, 0, 116, 65, 0, 0, 0, 0, 0, 0, 0, 76, 0, 112, 103, 0, 87, 81, 113, 104, 0, 0, 115, 0, 0, - 165, 166, 0, 0, 106, 0, 41, 42, 43, 26, - 25, 24, 28, 32, 35, 37, 40, 27, 46, 47, - 29, 30, 23, 44, 45, 31, 34, 36, 38, 39, + 165, 166, 0, 0, 106, 0, 40, 41, 42, 25, + 24, 23, 27, 31, 34, 36, 39, 26, 45, 46, + 28, 29, 22, 43, 44, 30, 33, 35, 37, 38, 78, 0, 0, 0, 0, 0, 122, 0, 84, 0, - 0, 93, 0, 0, 9, 50, 0, 111, 0, 61, - 0, 0, 57, 0, 17, 0, 0, 0, 20, 18, - 0, 67, 0, 63, 0, 0, 159, 0, 170, 73, + 0, 93, 0, 0, 9, 49, 0, 111, 0, 60, + 0, 0, 56, 0, 16, 0, 0, 0, 19, 17, + 0, 66, 0, 62, 0, 0, 159, 0, 170, 73, 160, 0, 0, 162, 161, 158, 123, 126, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, - 80, 114, 0, 92, 0, 89, 52, 0, 117, 65, - 59, 60, 0, 0, 55, 0, 0, 16, 15, 0, - 0, 21, 0, 107, 72, 0, 0, 164, 0, 124, + 80, 114, 0, 92, 0, 89, 51, 0, 117, 64, + 58, 59, 0, 0, 54, 0, 0, 70, 15, 0, + 0, 20, 0, 107, 72, 0, 0, 164, 0, 124, 0, 0, 0, 130, 0, 0, 125, 0, 121, 11, - 91, 99, 98, 0, 88, 51, 58, 0, 0, 0, - 0, 0, 68, 71, 169, 127, 136, 132, 0, 0, - 134, 129, 133, 90, 96, 95, 97, 0, 70, 0, - 0, 0, 0, 131, 94, 56, 0, 0, 0, 135, - 69, 12, 0, 14, 0, 13 + 91, 99, 98, 0, 88, 50, 57, 0, 0, 0, + 0, 0, 67, 71, 169, 127, 136, 132, 0, 0, + 134, 129, 133, 90, 96, 95, 97, 0, 69, 0, + 0, 0, 0, 131, 94, 55, 0, 0, 0, 135, + 68, 12, 0, 14, 0, 13 }; /* YYPGOTO[NTERM-NUM]. */ @@ -1299,11 +1299,6 @@ static const yytype_int16 yytable[] = 0, 257, 89, 90, 0, 0, 0, 0, 0, 91, 92, 93, 94, 95, 96, 97, 98, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 0, 109, 85, 86, 87, 88, - 0, 0, 0, 0, 0, 0, 0, 255, 256, 0, - 0, 0, 89, 90, 0, 0, 0, 0, 0, 91, - 92, 93, 94, 95, 96, 97, 98, 0, 0, 0, - 0, 0, 0, 0, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 0, 109, 85, 86, 87, 88, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 89, 90, 0, 0, 0, 0, 0, 91, @@ -1519,11 +1514,6 @@ static const yytype_int16 yycheck[] = 33, 34, 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, -1, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, -1, 58, 9, 10, 11, 12, - -1, -1, -1, -1, -1, -1, -1, 20, 21, -1, - -1, -1, 25, 26, -1, -1, -1, -1, -1, 32, - 33, 34, 35, 36, 37, 38, 39, -1, -1, -1, - -1, -1, -1, -1, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, -1, 58, 9, 10, 11, 12, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, 25, 26, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, -1, -1, -1, @@ -1606,9 +1596,9 @@ static const yytype_int8 yyr1[] = 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, - 75, 76, 76, 76, 77, 78, 78, 79, 79, 80, - 80, 80, 82, 81, 83, 81, 84, 84, 84, 85, + 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, + 76, 76, 76, 77, 78, 78, 79, 79, 80, 80, + 80, 82, 81, 83, 81, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, @@ -1626,13 +1616,13 @@ static const yytype_int8 yyr1[] = static const yytype_int8 yyr2[] = { 0, 2, 3, 3, 0, 3, 0, 2, 0, 2, - 2, 5, 9, 11, 9, 5, 5, 4, 4, 2, - 4, 5, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, - 3, 5, 4, 2, 1, 5, 8, 1, 3, 2, - 2, 1, 0, 4, 0, 5, 0, 2, 4, 5, - 3, 3, 2, 1, 1, 1, 3, 2, 3, 2, + 2, 5, 9, 11, 9, 5, 4, 4, 2, 4, + 5, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 1, 2, 3, + 5, 4, 2, 1, 5, 8, 1, 3, 2, 2, + 1, 0, 4, 0, 5, 0, 2, 4, 5, 3, + 1, 3, 2, 1, 1, 1, 3, 2, 3, 2, 4, 3, 2, 1, 3, 2, 2, 3, 5, 4, 6, 5, 4, 3, 7, 6, 6, 6, 5, 5, 1, 1, 1, 3, 3, 2, 3, 5, 2, 2, @@ -2212,187 +2202,187 @@ yydestruct (const char *yymsg, case YYSYMBOL_IDENT: /* IDENT */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2216 "src/parser.c" +#line 2206 "src/parser.c" break; case YYSYMBOL_FIELD: /* FIELD */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2222 "src/parser.c" +#line 2212 "src/parser.c" break; case YYSYMBOL_LITERAL: /* LITERAL */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2228 "src/parser.c" +#line 2218 "src/parser.c" break; case YYSYMBOL_FORMAT: /* FORMAT */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2234 "src/parser.c" +#line 2224 "src/parser.c" break; case YYSYMBOL_QQSTRING_TEXT: /* QQSTRING_TEXT */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2240 "src/parser.c" +#line 2230 "src/parser.c" break; case YYSYMBOL_Module: /* Module */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2246 "src/parser.c" +#line 2236 "src/parser.c" break; case YYSYMBOL_Imports: /* Imports */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2252 "src/parser.c" +#line 2242 "src/parser.c" break; case YYSYMBOL_FuncDefs: /* FuncDefs */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2258 "src/parser.c" +#line 2248 "src/parser.c" break; case YYSYMBOL_Exp: /* Exp */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2264 "src/parser.c" +#line 2254 "src/parser.c" break; case YYSYMBOL_Import: /* Import */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2270 "src/parser.c" +#line 2260 "src/parser.c" break; case YYSYMBOL_ImportWhat: /* ImportWhat */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2276 "src/parser.c" +#line 2266 "src/parser.c" break; case YYSYMBOL_ImportFrom: /* ImportFrom */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2282 "src/parser.c" +#line 2272 "src/parser.c" break; case YYSYMBOL_FuncDef: /* FuncDef */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2288 "src/parser.c" +#line 2278 "src/parser.c" break; case YYSYMBOL_Params: /* Params */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2294 "src/parser.c" +#line 2284 "src/parser.c" break; case YYSYMBOL_Param: /* Param */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2300 "src/parser.c" +#line 2290 "src/parser.c" break; case YYSYMBOL_String: /* String */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2306 "src/parser.c" +#line 2296 "src/parser.c" break; case YYSYMBOL_QQString: /* QQString */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2312 "src/parser.c" +#line 2302 "src/parser.c" break; case YYSYMBOL_ElseBody: /* ElseBody */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2318 "src/parser.c" +#line 2308 "src/parser.c" break; case YYSYMBOL_ExpD: /* ExpD */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2324 "src/parser.c" +#line 2314 "src/parser.c" break; case YYSYMBOL_Term: /* Term */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2330 "src/parser.c" +#line 2320 "src/parser.c" break; case YYSYMBOL_Args: /* Args */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2336 "src/parser.c" +#line 2326 "src/parser.c" break; case YYSYMBOL_Arg: /* Arg */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2342 "src/parser.c" +#line 2332 "src/parser.c" break; case YYSYMBOL_RepPatterns: /* RepPatterns */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2348 "src/parser.c" +#line 2338 "src/parser.c" break; case YYSYMBOL_Patterns: /* Patterns */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2354 "src/parser.c" +#line 2344 "src/parser.c" break; case YYSYMBOL_Pattern: /* Pattern */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2360 "src/parser.c" +#line 2350 "src/parser.c" break; case YYSYMBOL_ArrayPats: /* ArrayPats */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2366 "src/parser.c" +#line 2356 "src/parser.c" break; case YYSYMBOL_ObjPats: /* ObjPats */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2372 "src/parser.c" +#line 2362 "src/parser.c" break; case YYSYMBOL_ObjPat: /* ObjPat */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2378 "src/parser.c" +#line 2368 "src/parser.c" break; case YYSYMBOL_Keyword: /* Keyword */ #line 36 "src/parser.y" { jv_free(((*yyvaluep).literal)); } -#line 2384 "src/parser.c" +#line 2374 "src/parser.c" break; case YYSYMBOL_MkDict: /* MkDict */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2390 "src/parser.c" +#line 2380 "src/parser.c" break; case YYSYMBOL_MkDictPair: /* MkDictPair */ #line 37 "src/parser.y" { block_free(((*yyvaluep).blk)); } -#line 2396 "src/parser.c" +#line 2386 "src/parser.c" break; default: @@ -2700,7 +2690,7 @@ yyreduce: { *answer = BLOCK((yyvsp[-2].blk), (yyvsp[-1].blk), gen_op_simple(TOP), (yyvsp[0].blk)); } -#line 2704 "src/parser.c" +#line 2694 "src/parser.c" break; case 3: /* TopLevel: Module Imports FuncDefs */ @@ -2708,7 +2698,7 @@ yyreduce: { *answer = BLOCK((yyvsp[-2].blk), (yyvsp[-1].blk), (yyvsp[0].blk)); } -#line 2712 "src/parser.c" +#line 2702 "src/parser.c" break; case 4: /* Module: %empty */ @@ -2716,7 +2706,7 @@ yyreduce: { (yyval.blk) = gen_noop(); } -#line 2720 "src/parser.c" +#line 2710 "src/parser.c" break; case 5: /* Module: "module" Exp ';' */ @@ -2734,7 +2724,7 @@ yyreduce: (yyval.blk) = gen_module((yyvsp[-1].blk)); } } -#line 2738 "src/parser.c" +#line 2728 "src/parser.c" break; case 6: /* Imports: %empty */ @@ -2742,7 +2732,7 @@ yyreduce: { (yyval.blk) = gen_noop(); } -#line 2746 "src/parser.c" +#line 2736 "src/parser.c" break; case 7: /* Imports: Import Imports */ @@ -2750,7 +2740,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-1].blk), (yyvsp[0].blk)); } -#line 2754 "src/parser.c" +#line 2744 "src/parser.c" break; case 8: /* FuncDefs: %empty */ @@ -2758,7 +2748,7 @@ yyreduce: { (yyval.blk) = gen_noop(); } -#line 2762 "src/parser.c" +#line 2752 "src/parser.c" break; case 9: /* FuncDefs: FuncDef FuncDefs */ @@ -2766,7 +2756,7 @@ yyreduce: { (yyval.blk) = block_join((yyvsp[-1].blk), (yyvsp[0].blk)); } -#line 2770 "src/parser.c" +#line 2760 "src/parser.c" break; case 10: /* Exp: FuncDef Exp */ @@ -2774,7 +2764,7 @@ yyreduce: { (yyval.blk) = block_bind_referenced((yyvsp[-1].blk), (yyvsp[0].blk), OP_IS_CALL_PSEUDO); } -#line 2778 "src/parser.c" +#line 2768 "src/parser.c" break; case 11: /* Exp: Term "as" Patterns '|' Exp */ @@ -2782,7 +2772,7 @@ yyreduce: { (yyval.blk) = gen_destructure((yyvsp[-4].blk), (yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2786 "src/parser.c" +#line 2776 "src/parser.c" break; case 12: /* Exp: "reduce" Term "as" Patterns '(' Exp ';' Exp ')' */ @@ -2790,7 +2780,7 @@ yyreduce: { (yyval.blk) = gen_reduce((yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk)); } -#line 2794 "src/parser.c" +#line 2784 "src/parser.c" break; case 13: /* Exp: "foreach" Term "as" Patterns '(' Exp ';' Exp ';' Exp ')' */ @@ -2798,7 +2788,7 @@ yyreduce: { (yyval.blk) = gen_foreach((yyvsp[-9].blk), (yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk)); } -#line 2802 "src/parser.c" +#line 2792 "src/parser.c" break; case 14: /* Exp: "foreach" Term "as" Patterns '(' Exp ';' Exp ')' */ @@ -2806,7 +2796,7 @@ yyreduce: { (yyval.blk) = gen_foreach((yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk), gen_noop()); } -#line 2810 "src/parser.c" +#line 2800 "src/parser.c" break; case 15: /* Exp: "if" Exp "then" Exp ElseBody */ @@ -2814,294 +2804,286 @@ yyreduce: { (yyval.blk) = gen_cond((yyvsp[-3].blk), (yyvsp[-1].blk), (yyvsp[0].blk)); } -#line 2818 "src/parser.c" +#line 2808 "src/parser.c" break; - case 16: /* Exp: "if" Exp "then" Exp "end" */ + case 16: /* Exp: "if" Exp "then" error */ #line 370 "src/parser.y" - { - (yyval.blk) = gen_cond((yyvsp[-3].blk), (yyvsp[-1].blk), gen_noop()); -} -#line 2826 "src/parser.c" - break; - - case 17: /* Exp: "if" Exp "then" error */ -#line 373 "src/parser.y" { FAIL((yyloc), "Possibly unterminated 'if' statement"); (yyval.blk) = (yyvsp[-2].blk); } -#line 2835 "src/parser.c" +#line 2817 "src/parser.c" break; - case 18: /* Exp: "try" Exp "catch" Exp */ -#line 378 "src/parser.y" + case 17: /* Exp: "try" Exp "catch" Exp */ +#line 375 "src/parser.y" { //$$ = BLOCK(gen_op_target(FORK_OPT, $2), $2, $4); (yyval.blk) = gen_try((yyvsp[-2].blk), gen_try_handler((yyvsp[0].blk))); } -#line 2844 "src/parser.c" +#line 2826 "src/parser.c" break; - case 19: /* Exp: "try" Exp */ -#line 382 "src/parser.y" + case 18: /* Exp: "try" Exp */ +#line 379 "src/parser.y" { //$$ = BLOCK(gen_op_target(FORK_OPT, $2), $2, gen_op_simple(BACKTRACK)); (yyval.blk) = gen_try((yyvsp[0].blk), gen_op_simple(BACKTRACK)); } -#line 2853 "src/parser.c" +#line 2835 "src/parser.c" break; - case 20: /* Exp: "try" Exp "catch" error */ -#line 386 "src/parser.y" + case 19: /* Exp: "try" Exp "catch" error */ +#line 383 "src/parser.y" { FAIL((yyloc), "Possibly unterminated 'try' statement"); (yyval.blk) = (yyvsp[-2].blk); } -#line 2862 "src/parser.c" +#line 2844 "src/parser.c" break; - case 21: /* Exp: "label" '$' IDENT '|' Exp */ -#line 391 "src/parser.y" + case 20: /* Exp: "label" '$' IDENT '|' Exp */ +#line 388 "src/parser.y" { jv v = jv_string_fmt("*label-%s", jv_string_value((yyvsp[-2].literal))); (yyval.blk) = gen_location((yyloc), locations, gen_label(jv_string_value(v), (yyvsp[0].blk))); jv_free((yyvsp[-2].literal)); jv_free(v); } -#line 2873 "src/parser.c" +#line 2855 "src/parser.c" break; - case 22: /* Exp: Exp '?' */ -#line 398 "src/parser.y" + case 21: /* Exp: Exp '?' */ +#line 395 "src/parser.y" { (yyval.blk) = gen_try((yyvsp[-1].blk), gen_op_simple(BACKTRACK)); } -#line 2881 "src/parser.c" +#line 2863 "src/parser.c" break; - case 23: /* Exp: Exp '=' Exp */ -#line 402 "src/parser.y" + case 22: /* Exp: Exp '=' Exp */ +#line 399 "src/parser.y" { (yyval.blk) = gen_call("_assign", BLOCK(gen_lambda((yyvsp[-2].blk)), gen_lambda((yyvsp[0].blk)))); } -#line 2889 "src/parser.c" +#line 2871 "src/parser.c" break; - case 24: /* Exp: Exp "or" Exp */ -#line 406 "src/parser.y" + case 23: /* Exp: Exp "or" Exp */ +#line 403 "src/parser.y" { (yyval.blk) = gen_or((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2897 "src/parser.c" +#line 2879 "src/parser.c" break; - case 25: /* Exp: Exp "and" Exp */ -#line 410 "src/parser.y" + case 24: /* Exp: Exp "and" Exp */ +#line 407 "src/parser.y" { (yyval.blk) = gen_and((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2905 "src/parser.c" +#line 2887 "src/parser.c" break; - case 26: /* Exp: Exp "//" Exp */ -#line 414 "src/parser.y" + case 25: /* Exp: Exp "//" Exp */ +#line 411 "src/parser.y" { (yyval.blk) = gen_definedor((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2913 "src/parser.c" +#line 2895 "src/parser.c" break; - case 27: /* Exp: Exp "//=" Exp */ -#line 418 "src/parser.y" + case 26: /* Exp: Exp "//=" Exp */ +#line 415 "src/parser.y" { (yyval.blk) = gen_definedor_assign((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2921 "src/parser.c" +#line 2903 "src/parser.c" break; - case 28: /* Exp: Exp "|=" Exp */ -#line 422 "src/parser.y" + case 27: /* Exp: Exp "|=" Exp */ +#line 419 "src/parser.y" { (yyval.blk) = gen_call("_modify", BLOCK(gen_lambda((yyvsp[-2].blk)), gen_lambda((yyvsp[0].blk)))); } -#line 2929 "src/parser.c" +#line 2911 "src/parser.c" break; - case 29: /* Exp: Exp '|' Exp */ -#line 426 "src/parser.y" + case 28: /* Exp: Exp '|' Exp */ +#line 423 "src/parser.y" { (yyval.blk) = block_join((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2937 "src/parser.c" +#line 2919 "src/parser.c" break; - case 30: /* Exp: Exp ',' Exp */ -#line 430 "src/parser.y" + case 29: /* Exp: Exp ',' Exp */ +#line 427 "src/parser.y" { (yyval.blk) = gen_both((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 2945 "src/parser.c" +#line 2927 "src/parser.c" break; - case 31: /* Exp: Exp '+' Exp */ -#line 434 "src/parser.y" + case 30: /* Exp: Exp '+' Exp */ +#line 431 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '+'); } -#line 2953 "src/parser.c" +#line 2935 "src/parser.c" break; - case 32: /* Exp: Exp "+=" Exp */ -#line 438 "src/parser.y" + case 31: /* Exp: Exp "+=" Exp */ +#line 435 "src/parser.y" { (yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '+'); } -#line 2961 "src/parser.c" +#line 2943 "src/parser.c" break; - case 33: /* Exp: '-' Exp */ -#line 442 "src/parser.y" + case 32: /* Exp: '-' Exp */ +#line 439 "src/parser.y" { (yyval.blk) = BLOCK((yyvsp[0].blk), gen_call("_negate", gen_noop())); } -#line 2969 "src/parser.c" +#line 2951 "src/parser.c" break; - case 34: /* Exp: Exp '-' Exp */ -#line 446 "src/parser.y" + case 33: /* Exp: Exp '-' Exp */ +#line 443 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '-'); } -#line 2977 "src/parser.c" +#line 2959 "src/parser.c" break; - case 35: /* Exp: Exp "-=" Exp */ -#line 450 "src/parser.y" + case 34: /* Exp: Exp "-=" Exp */ +#line 447 "src/parser.y" { (yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '-'); } -#line 2985 "src/parser.c" +#line 2967 "src/parser.c" break; - case 36: /* Exp: Exp '*' Exp */ -#line 454 "src/parser.y" + case 35: /* Exp: Exp '*' Exp */ +#line 451 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '*'); } -#line 2993 "src/parser.c" +#line 2975 "src/parser.c" break; - case 37: /* Exp: Exp "*=" Exp */ -#line 458 "src/parser.y" + case 36: /* Exp: Exp "*=" Exp */ +#line 455 "src/parser.y" { (yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '*'); } -#line 3001 "src/parser.c" +#line 2983 "src/parser.c" break; - case 38: /* Exp: Exp '/' Exp */ -#line 462 "src/parser.y" + case 37: /* Exp: Exp '/' Exp */ +#line 459 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '/'); if (block_is_const_inf((yyval.blk))) FAIL((yyloc), "Division by zero?"); } -#line 3011 "src/parser.c" +#line 2993 "src/parser.c" break; - case 39: /* Exp: Exp '%' Exp */ -#line 468 "src/parser.y" + case 38: /* Exp: Exp '%' Exp */ +#line 465 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '%'); if (block_is_const_inf((yyval.blk))) FAIL((yyloc), "Remainder by zero?"); } -#line 3021 "src/parser.c" +#line 3003 "src/parser.c" break; - case 40: /* Exp: Exp "/=" Exp */ -#line 474 "src/parser.y" + case 39: /* Exp: Exp "/=" Exp */ +#line 471 "src/parser.y" { (yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '/'); } -#line 3029 "src/parser.c" +#line 3011 "src/parser.c" break; - case 41: /* Exp: Exp "%=" Exp */ -#line 478 "src/parser.y" + case 40: /* Exp: Exp "%=" Exp */ +#line 475 "src/parser.y" { (yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '%'); } -#line 3037 "src/parser.c" +#line 3019 "src/parser.c" break; - case 42: /* Exp: Exp "==" Exp */ -#line 482 "src/parser.y" + case 41: /* Exp: Exp "==" Exp */ +#line 479 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), EQ); } -#line 3045 "src/parser.c" +#line 3027 "src/parser.c" break; - case 43: /* Exp: Exp "!=" Exp */ -#line 486 "src/parser.y" + case 42: /* Exp: Exp "!=" Exp */ +#line 483 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), NEQ); } -#line 3053 "src/parser.c" +#line 3035 "src/parser.c" break; - case 44: /* Exp: Exp '<' Exp */ -#line 490 "src/parser.y" + case 43: /* Exp: Exp '<' Exp */ +#line 487 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '<'); } -#line 3061 "src/parser.c" +#line 3043 "src/parser.c" break; - case 45: /* Exp: Exp '>' Exp */ -#line 494 "src/parser.y" + case 44: /* Exp: Exp '>' Exp */ +#line 491 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '>'); } -#line 3069 "src/parser.c" +#line 3051 "src/parser.c" break; - case 46: /* Exp: Exp "<=" Exp */ -#line 498 "src/parser.y" + case 45: /* Exp: Exp "<=" Exp */ +#line 495 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), LESSEQ); } -#line 3077 "src/parser.c" +#line 3059 "src/parser.c" break; - case 47: /* Exp: Exp ">=" Exp */ -#line 502 "src/parser.y" + case 46: /* Exp: Exp ">=" Exp */ +#line 499 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), GREATEREQ); } -#line 3085 "src/parser.c" +#line 3067 "src/parser.c" break; - case 48: /* Exp: Term */ -#line 506 "src/parser.y" + case 47: /* Exp: Term */ +#line 503 "src/parser.y" { (yyval.blk) = (yyvsp[0].blk); } -#line 3093 "src/parser.c" +#line 3075 "src/parser.c" break; - case 49: /* Import: ImportWhat ';' */ -#line 511 "src/parser.y" + case 48: /* Import: ImportWhat ';' */ +#line 508 "src/parser.y" { (yyval.blk) = (yyvsp[-1].blk); } -#line 3101 "src/parser.c" +#line 3083 "src/parser.c" break; - case 50: /* Import: ImportWhat Exp ';' */ -#line 514 "src/parser.y" + case 49: /* Import: ImportWhat Exp ';' */ +#line 511 "src/parser.y" { if (!block_is_const((yyvsp[-1].blk))) { FAIL((yyloc), "Module metadata must be constant"); @@ -3117,11 +3099,11 @@ yyreduce: (yyval.blk) = gen_import_meta((yyvsp[-2].blk), (yyvsp[-1].blk)); } } -#line 3121 "src/parser.c" +#line 3103 "src/parser.c" break; - case 51: /* ImportWhat: "import" ImportFrom "as" '$' IDENT */ -#line 531 "src/parser.y" + case 50: /* ImportWhat: "import" ImportFrom "as" '$' IDENT */ +#line 528 "src/parser.y" { jv v = block_const((yyvsp[-3].blk)); // XXX Make gen_import take only blocks and the int is_data so we @@ -3131,11 +3113,11 @@ yyreduce: jv_free((yyvsp[0].literal)); jv_free(v); } -#line 3135 "src/parser.c" +#line 3117 "src/parser.c" break; - case 52: /* ImportWhat: "import" ImportFrom "as" IDENT */ -#line 540 "src/parser.y" + case 51: /* ImportWhat: "import" ImportFrom "as" IDENT */ +#line 537 "src/parser.y" { jv v = block_const((yyvsp[-2].blk)); (yyval.blk) = gen_import(jv_string_value(v), jv_string_value((yyvsp[0].literal)), 0); @@ -3143,22 +3125,22 @@ yyreduce: jv_free((yyvsp[0].literal)); jv_free(v); } -#line 3147 "src/parser.c" +#line 3129 "src/parser.c" break; - case 53: /* ImportWhat: "include" ImportFrom */ -#line 547 "src/parser.y" + case 52: /* ImportWhat: "include" ImportFrom */ +#line 544 "src/parser.y" { jv v = block_const((yyvsp[0].blk)); (yyval.blk) = gen_import(jv_string_value(v), NULL, 0); block_free((yyvsp[0].blk)); jv_free(v); } -#line 3158 "src/parser.c" +#line 3140 "src/parser.c" break; - case 54: /* ImportFrom: String */ -#line 555 "src/parser.y" + case 53: /* ImportFrom: String */ +#line 552 "src/parser.y" { if (!block_is_const((yyvsp[0].blk))) { FAIL((yyloc), "Import path must be constant"); @@ -3168,138 +3150,146 @@ yyreduce: (yyval.blk) = (yyvsp[0].blk); } } -#line 3172 "src/parser.c" +#line 3154 "src/parser.c" break; - case 55: /* FuncDef: "def" IDENT ':' Exp ';' */ -#line 566 "src/parser.y" + case 54: /* FuncDef: "def" IDENT ':' Exp ';' */ +#line 563 "src/parser.y" { (yyval.blk) = gen_function(jv_string_value((yyvsp[-3].literal)), gen_noop(), (yyvsp[-1].blk)); jv_free((yyvsp[-3].literal)); } -#line 3181 "src/parser.c" +#line 3163 "src/parser.c" break; - case 56: /* FuncDef: "def" IDENT '(' Params ')' ':' Exp ';' */ -#line 571 "src/parser.y" + case 55: /* FuncDef: "def" IDENT '(' Params ')' ':' Exp ';' */ +#line 568 "src/parser.y" { (yyval.blk) = gen_function(jv_string_value((yyvsp[-6].literal)), (yyvsp[-4].blk), (yyvsp[-1].blk)); jv_free((yyvsp[-6].literal)); } -#line 3190 "src/parser.c" +#line 3172 "src/parser.c" break; - case 57: /* Params: Param */ -#line 577 "src/parser.y" + case 56: /* Params: Param */ +#line 574 "src/parser.y" { (yyval.blk) = (yyvsp[0].blk); } -#line 3198 "src/parser.c" +#line 3180 "src/parser.c" break; - case 58: /* Params: Params ';' Param */ -#line 580 "src/parser.y" + case 57: /* Params: Params ';' Param */ +#line 577 "src/parser.y" { (yyval.blk) = BLOCK((yyvsp[-2].blk), (yyvsp[0].blk)); } +#line 3188 "src/parser.c" + break; + + case 58: /* Param: '$' IDENT */ +#line 582 "src/parser.y" + { + (yyval.blk) = gen_param_regular(jv_string_value((yyvsp[0].literal))); + jv_free((yyvsp[0].literal)); +} +#line 3197 "src/parser.c" + break; + + case 59: /* Param: '$' Keyword */ +#line 586 "src/parser.y" + { + (yyval.blk) = gen_param_regular(jv_string_value((yyvsp[0].literal))); + jv_free((yyvsp[0].literal)); +} #line 3206 "src/parser.c" break; - case 59: /* Param: '$' IDENT */ -#line 585 "src/parser.y" - { - (yyval.blk) = gen_param_regular(jv_string_value((yyvsp[0].literal))); + case 60: /* Param: IDENT */ +#line 590 "src/parser.y" + { + (yyval.blk) = gen_param(jv_string_value((yyvsp[0].literal))); jv_free((yyvsp[0].literal)); } #line 3215 "src/parser.c" break; - case 60: /* Param: '$' Keyword */ -#line 589 "src/parser.y" - { - (yyval.blk) = gen_param_regular(jv_string_value((yyvsp[0].literal))); - jv_free((yyvsp[0].literal)); -} -#line 3224 "src/parser.c" - break; - - case 61: /* Param: IDENT */ -#line 593 "src/parser.y" - { - (yyval.blk) = gen_param(jv_string_value((yyvsp[0].literal))); - jv_free((yyvsp[0].literal)); -} -#line 3233 "src/parser.c" - break; - - case 62: /* @1: %empty */ -#line 600 "src/parser.y" + case 61: /* @1: %empty */ +#line 597 "src/parser.y" { (yyval.literal) = jv_string("text"); } -#line 3239 "src/parser.c" +#line 3221 "src/parser.c" break; - case 63: /* String: QQSTRING_START @1 QQString QQSTRING_END */ -#line 600 "src/parser.y" + case 62: /* String: QQSTRING_START @1 QQString QQSTRING_END */ +#line 597 "src/parser.y" { (yyval.blk) = (yyvsp[-1].blk); jv_free((yyvsp[-2].literal)); } -#line 3248 "src/parser.c" +#line 3230 "src/parser.c" break; - case 64: /* @2: %empty */ -#line 604 "src/parser.y" + case 63: /* @2: %empty */ +#line 601 "src/parser.y" { (yyval.literal) = (yyvsp[-1].literal); } -#line 3254 "src/parser.c" +#line 3236 "src/parser.c" break; - case 65: /* String: FORMAT QQSTRING_START @2 QQString QQSTRING_END */ -#line 604 "src/parser.y" + case 64: /* String: FORMAT QQSTRING_START @2 QQString QQSTRING_END */ +#line 601 "src/parser.y" { (yyval.blk) = (yyvsp[-1].blk); jv_free((yyvsp[-2].literal)); } -#line 3263 "src/parser.c" +#line 3245 "src/parser.c" break; - case 66: /* QQString: %empty */ -#line 611 "src/parser.y" + case 65: /* QQString: %empty */ +#line 608 "src/parser.y" { (yyval.blk) = gen_const(jv_string("")); } -#line 3271 "src/parser.c" +#line 3253 "src/parser.c" break; - case 67: /* QQString: QQString QQSTRING_TEXT */ -#line 614 "src/parser.y" + case 66: /* QQString: QQString QQSTRING_TEXT */ +#line 611 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-1].blk), gen_const((yyvsp[0].literal)), '+'); } -#line 3279 "src/parser.c" +#line 3261 "src/parser.c" break; - case 68: /* QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END */ -#line 617 "src/parser.y" + case 67: /* QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END */ +#line 614 "src/parser.y" { (yyval.blk) = gen_binop((yyvsp[-3].blk), gen_format((yyvsp[-1].blk), jv_copy((yyvsp[-4].literal))), '+'); } -#line 3287 "src/parser.c" +#line 3269 "src/parser.c" break; - case 69: /* ElseBody: "elif" Exp "then" Exp ElseBody */ -#line 623 "src/parser.y" + case 68: /* ElseBody: "elif" Exp "then" Exp ElseBody */ +#line 620 "src/parser.y" { (yyval.blk) = gen_cond((yyvsp[-3].blk), (yyvsp[-1].blk), (yyvsp[0].blk)); } -#line 3295 "src/parser.c" +#line 3277 "src/parser.c" break; - case 70: /* ElseBody: "else" Exp "end" */ -#line 626 "src/parser.y" + case 69: /* ElseBody: "else" Exp "end" */ +#line 623 "src/parser.y" { (yyval.blk) = (yyvsp[-1].blk); } -#line 3303 "src/parser.c" +#line 3285 "src/parser.c" + break; + + case 70: /* ElseBody: "end" */ +#line 626 "src/parser.y" + { + (yyval.blk) = gen_noop(); +} +#line 3293 "src/parser.c" break; case 71: /* ExpD: ExpD '|' ExpD */ @@ -3307,7 +3297,7 @@ yyreduce: { (yyval.blk) = block_join((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3311 "src/parser.c" +#line 3301 "src/parser.c" break; case 72: /* ExpD: '-' ExpD */ @@ -3315,7 +3305,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[0].blk), gen_call("_negate", gen_noop())); } -#line 3319 "src/parser.c" +#line 3309 "src/parser.c" break; case 73: /* ExpD: Term */ @@ -3323,7 +3313,7 @@ yyreduce: { (yyval.blk) = (yyvsp[0].blk); } -#line 3327 "src/parser.c" +#line 3317 "src/parser.c" break; case 74: /* Term: '.' */ @@ -3331,7 +3321,7 @@ yyreduce: { (yyval.blk) = gen_noop(); } -#line 3335 "src/parser.c" +#line 3325 "src/parser.c" break; case 75: /* Term: ".." */ @@ -3339,7 +3329,7 @@ yyreduce: { (yyval.blk) = gen_call("recurse", gen_noop()); } -#line 3343 "src/parser.c" +#line 3333 "src/parser.c" break; case 76: /* Term: "break" '$' IDENT */ @@ -3352,7 +3342,7 @@ yyreduce: jv_free(v); jv_free((yyvsp[0].literal)); } -#line 3356 "src/parser.c" +#line 3346 "src/parser.c" break; case 77: /* Term: "break" error */ @@ -3361,7 +3351,7 @@ yyreduce: FAIL((yyloc), "break requires a label to break to"); (yyval.blk) = gen_noop(); } -#line 3365 "src/parser.c" +#line 3355 "src/parser.c" break; case 78: /* Term: Term FIELD '?' */ @@ -3369,7 +3359,7 @@ yyreduce: { (yyval.blk) = gen_index_opt((yyvsp[-2].blk), gen_const((yyvsp[-1].literal))); } -#line 3373 "src/parser.c" +#line 3363 "src/parser.c" break; case 79: /* Term: FIELD '?' */ @@ -3377,7 +3367,7 @@ yyreduce: { (yyval.blk) = gen_index_opt(gen_noop(), gen_const((yyvsp[-1].literal))); } -#line 3381 "src/parser.c" +#line 3371 "src/parser.c" break; case 80: /* Term: Term '.' String '?' */ @@ -3385,7 +3375,7 @@ yyreduce: { (yyval.blk) = gen_index_opt((yyvsp[-3].blk), (yyvsp[-1].blk)); } -#line 3389 "src/parser.c" +#line 3379 "src/parser.c" break; case 81: /* Term: '.' String '?' */ @@ -3393,7 +3383,7 @@ yyreduce: { (yyval.blk) = gen_index_opt(gen_noop(), (yyvsp[-1].blk)); } -#line 3397 "src/parser.c" +#line 3387 "src/parser.c" break; case 82: /* Term: Term FIELD */ @@ -3401,7 +3391,7 @@ yyreduce: { (yyval.blk) = gen_index((yyvsp[-1].blk), gen_const((yyvsp[0].literal))); } -#line 3405 "src/parser.c" +#line 3395 "src/parser.c" break; case 83: /* Term: FIELD */ @@ -3409,7 +3399,7 @@ yyreduce: { (yyval.blk) = gen_index(gen_noop(), gen_const((yyvsp[0].literal))); } -#line 3413 "src/parser.c" +#line 3403 "src/parser.c" break; case 84: /* Term: Term '.' String */ @@ -3417,7 +3407,7 @@ yyreduce: { (yyval.blk) = gen_index((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3421 "src/parser.c" +#line 3411 "src/parser.c" break; case 85: /* Term: '.' String */ @@ -3425,7 +3415,7 @@ yyreduce: { (yyval.blk) = gen_index(gen_noop(), (yyvsp[0].blk)); } -#line 3429 "src/parser.c" +#line 3419 "src/parser.c" break; case 86: /* Term: '.' error */ @@ -3434,7 +3424,7 @@ yyreduce: FAIL((yyloc), "try .[\"field\"] instead of .field for unusually named fields"); (yyval.blk) = gen_noop(); } -#line 3438 "src/parser.c" +#line 3428 "src/parser.c" break; case 87: /* Term: '.' IDENT error */ @@ -3444,7 +3434,7 @@ yyreduce: FAIL((yyloc), "try .[\"field\"] instead of .field for unusually named fields"); (yyval.blk) = gen_noop(); } -#line 3448 "src/parser.c" +#line 3438 "src/parser.c" break; case 88: /* Term: Term '[' Exp ']' '?' */ @@ -3452,7 +3442,7 @@ yyreduce: { (yyval.blk) = gen_index_opt((yyvsp[-4].blk), (yyvsp[-2].blk)); } -#line 3456 "src/parser.c" +#line 3446 "src/parser.c" break; case 89: /* Term: Term '[' Exp ']' */ @@ -3460,7 +3450,7 @@ yyreduce: { (yyval.blk) = gen_index((yyvsp[-3].blk), (yyvsp[-1].blk)); } -#line 3464 "src/parser.c" +#line 3454 "src/parser.c" break; case 90: /* Term: Term '.' '[' Exp ']' '?' */ @@ -3468,7 +3458,7 @@ yyreduce: { (yyval.blk) = gen_index_opt((yyvsp[-5].blk), (yyvsp[-2].blk)); } -#line 3472 "src/parser.c" +#line 3462 "src/parser.c" break; case 91: /* Term: Term '.' '[' Exp ']' */ @@ -3476,7 +3466,7 @@ yyreduce: { (yyval.blk) = gen_index((yyvsp[-4].blk), (yyvsp[-1].blk)); } -#line 3480 "src/parser.c" +#line 3470 "src/parser.c" break; case 92: /* Term: Term '[' ']' '?' */ @@ -3484,7 +3474,7 @@ yyreduce: { (yyval.blk) = block_join((yyvsp[-3].blk), gen_op_simple(EACH_OPT)); } -#line 3488 "src/parser.c" +#line 3478 "src/parser.c" break; case 93: /* Term: Term '[' ']' */ @@ -3492,7 +3482,7 @@ yyreduce: { (yyval.blk) = block_join((yyvsp[-2].blk), gen_op_simple(EACH)); } -#line 3496 "src/parser.c" +#line 3486 "src/parser.c" break; case 94: /* Term: Term '[' Exp ':' Exp ']' '?' */ @@ -3500,7 +3490,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-6].blk), (yyvsp[-4].blk), (yyvsp[-2].blk), INDEX_OPT); } -#line 3504 "src/parser.c" +#line 3494 "src/parser.c" break; case 95: /* Term: Term '[' Exp ':' ']' '?' */ @@ -3508,7 +3498,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-5].blk), (yyvsp[-3].blk), gen_const(jv_null()), INDEX_OPT); } -#line 3512 "src/parser.c" +#line 3502 "src/parser.c" break; case 96: /* Term: Term '[' ':' Exp ']' '?' */ @@ -3516,7 +3506,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-5].blk), gen_const(jv_null()), (yyvsp[-2].blk), INDEX_OPT); } -#line 3520 "src/parser.c" +#line 3510 "src/parser.c" break; case 97: /* Term: Term '[' Exp ':' Exp ']' */ @@ -3524,7 +3514,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk), INDEX); } -#line 3528 "src/parser.c" +#line 3518 "src/parser.c" break; case 98: /* Term: Term '[' Exp ':' ']' */ @@ -3532,7 +3522,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-4].blk), (yyvsp[-2].blk), gen_const(jv_null()), INDEX); } -#line 3536 "src/parser.c" +#line 3526 "src/parser.c" break; case 99: /* Term: Term '[' ':' Exp ']' */ @@ -3540,7 +3530,7 @@ yyreduce: { (yyval.blk) = gen_slice_index((yyvsp[-4].blk), gen_const(jv_null()), (yyvsp[-1].blk), INDEX); } -#line 3544 "src/parser.c" +#line 3534 "src/parser.c" break; case 100: /* Term: LITERAL */ @@ -3548,7 +3538,7 @@ yyreduce: { (yyval.blk) = gen_const((yyvsp[0].literal)); } -#line 3552 "src/parser.c" +#line 3542 "src/parser.c" break; case 101: /* Term: String */ @@ -3556,7 +3546,7 @@ yyreduce: { (yyval.blk) = (yyvsp[0].blk); } -#line 3560 "src/parser.c" +#line 3550 "src/parser.c" break; case 102: /* Term: FORMAT */ @@ -3564,7 +3554,7 @@ yyreduce: { (yyval.blk) = gen_format(gen_noop(), (yyvsp[0].literal)); } -#line 3568 "src/parser.c" +#line 3558 "src/parser.c" break; case 103: /* Term: '(' Exp ')' */ @@ -3572,7 +3562,7 @@ yyreduce: { (yyval.blk) = (yyvsp[-1].blk); } -#line 3576 "src/parser.c" +#line 3566 "src/parser.c" break; case 104: /* Term: '[' Exp ']' */ @@ -3580,7 +3570,7 @@ yyreduce: { (yyval.blk) = gen_collect((yyvsp[-1].blk)); } -#line 3584 "src/parser.c" +#line 3574 "src/parser.c" break; case 105: /* Term: '[' ']' */ @@ -3588,7 +3578,7 @@ yyreduce: { (yyval.blk) = gen_const(jv_array()); } -#line 3592 "src/parser.c" +#line 3582 "src/parser.c" break; case 106: /* Term: '{' MkDict '}' */ @@ -3600,7 +3590,7 @@ yyreduce: else (yyval.blk) = BLOCK(gen_subexp(gen_const(jv_object())), (yyvsp[-1].blk), gen_op_simple(POP)); } -#line 3604 "src/parser.c" +#line 3594 "src/parser.c" break; case 107: /* Term: '$' '$' '$' '$' IDENT */ @@ -3609,7 +3599,7 @@ yyreduce: (yyval.blk) = gen_location((yyloc), locations, gen_op_unbound(LOADVN, jv_string_value((yyvsp[0].literal)))); jv_free((yyvsp[0].literal)); } -#line 3613 "src/parser.c" +#line 3603 "src/parser.c" break; case 108: /* Term: '$' IDENT */ @@ -3618,7 +3608,7 @@ yyreduce: (yyval.blk) = gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[0].literal)))); jv_free((yyvsp[0].literal)); } -#line 3622 "src/parser.c" +#line 3612 "src/parser.c" break; case 109: /* Term: '$' Keyword */ @@ -3632,7 +3622,7 @@ yyreduce: } jv_free((yyvsp[0].literal)); } -#line 3636 "src/parser.c" +#line 3626 "src/parser.c" break; case 110: /* Term: IDENT */ @@ -3649,7 +3639,7 @@ yyreduce: (yyval.blk) = gen_location((yyloc), locations, gen_call(s, gen_noop())); jv_free((yyvsp[0].literal)); } -#line 3653 "src/parser.c" +#line 3643 "src/parser.c" break; case 111: /* Term: IDENT '(' Args ')' */ @@ -3659,31 +3649,31 @@ yyreduce: (yyval.blk) = gen_location((yylsp[-3]), locations, (yyval.blk)); jv_free((yyvsp[-3].literal)); } -#line 3663 "src/parser.c" +#line 3653 "src/parser.c" break; case 112: /* Term: '(' error ')' */ #line 805 "src/parser.y" { (yyval.blk) = gen_noop(); } -#line 3669 "src/parser.c" +#line 3659 "src/parser.c" break; case 113: /* Term: '[' error ']' */ #line 806 "src/parser.y" { (yyval.blk) = gen_noop(); } -#line 3675 "src/parser.c" +#line 3665 "src/parser.c" break; case 114: /* Term: Term '[' error ']' */ #line 807 "src/parser.y" { (yyval.blk) = (yyvsp[-3].blk); } -#line 3681 "src/parser.c" +#line 3671 "src/parser.c" break; case 115: /* Term: '{' error '}' */ #line 808 "src/parser.y" { (yyval.blk) = gen_noop(); } -#line 3687 "src/parser.c" +#line 3677 "src/parser.c" break; case 116: /* Args: Arg */ @@ -3691,7 +3681,7 @@ yyreduce: { (yyval.blk) = (yyvsp[0].blk); } -#line 3695 "src/parser.c" +#line 3685 "src/parser.c" break; case 117: /* Args: Args ';' Arg */ @@ -3699,7 +3689,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3703 "src/parser.c" +#line 3693 "src/parser.c" break; case 118: /* Arg: Exp */ @@ -3707,7 +3697,7 @@ yyreduce: { (yyval.blk) = gen_lambda((yyvsp[0].blk)); } -#line 3711 "src/parser.c" +#line 3701 "src/parser.c" break; case 119: /* RepPatterns: RepPatterns "?//" Pattern */ @@ -3715,7 +3705,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-2].blk), gen_destructure_alt((yyvsp[0].blk))); } -#line 3719 "src/parser.c" +#line 3709 "src/parser.c" break; case 120: /* RepPatterns: Pattern */ @@ -3723,7 +3713,7 @@ yyreduce: { (yyval.blk) = gen_destructure_alt((yyvsp[0].blk)); } -#line 3727 "src/parser.c" +#line 3717 "src/parser.c" break; case 121: /* Patterns: RepPatterns "?//" Pattern */ @@ -3731,7 +3721,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3735 "src/parser.c" +#line 3725 "src/parser.c" break; case 122: /* Patterns: Pattern */ @@ -3739,7 +3729,7 @@ yyreduce: { (yyval.blk) = (yyvsp[0].blk); } -#line 3743 "src/parser.c" +#line 3733 "src/parser.c" break; case 123: /* Pattern: '$' IDENT */ @@ -3748,7 +3738,7 @@ yyreduce: (yyval.blk) = gen_op_unbound(STOREV, jv_string_value((yyvsp[0].literal))); jv_free((yyvsp[0].literal)); } -#line 3752 "src/parser.c" +#line 3742 "src/parser.c" break; case 124: /* Pattern: '[' ArrayPats ']' */ @@ -3756,7 +3746,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-1].blk), gen_op_simple(POP)); } -#line 3760 "src/parser.c" +#line 3750 "src/parser.c" break; case 125: /* Pattern: '{' ObjPats '}' */ @@ -3764,7 +3754,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-1].blk), gen_op_simple(POP)); } -#line 3768 "src/parser.c" +#line 3758 "src/parser.c" break; case 126: /* ArrayPats: Pattern */ @@ -3772,7 +3762,7 @@ yyreduce: { (yyval.blk) = gen_array_matcher(gen_noop(), (yyvsp[0].blk)); } -#line 3776 "src/parser.c" +#line 3766 "src/parser.c" break; case 127: /* ArrayPats: ArrayPats ',' Pattern */ @@ -3780,7 +3770,7 @@ yyreduce: { (yyval.blk) = gen_array_matcher((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3784 "src/parser.c" +#line 3774 "src/parser.c" break; case 128: /* ObjPats: ObjPat */ @@ -3788,7 +3778,7 @@ yyreduce: { (yyval.blk) = (yyvsp[0].blk); } -#line 3792 "src/parser.c" +#line 3782 "src/parser.c" break; case 129: /* ObjPats: ObjPats ',' ObjPat */ @@ -3796,7 +3786,7 @@ yyreduce: { (yyval.blk) = BLOCK((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3800 "src/parser.c" +#line 3790 "src/parser.c" break; case 130: /* ObjPat: '$' IDENT */ @@ -3804,7 +3794,7 @@ yyreduce: { (yyval.blk) = gen_object_matcher(gen_const((yyvsp[0].literal)), gen_op_unbound(STOREV, jv_string_value((yyvsp[0].literal)))); } -#line 3808 "src/parser.c" +#line 3798 "src/parser.c" break; case 131: /* ObjPat: '$' IDENT ':' Pattern */ @@ -3812,7 +3802,7 @@ yyreduce: { (yyval.blk) = gen_object_matcher(gen_const((yyvsp[-2].literal)), BLOCK(gen_op_simple(DUP), gen_op_unbound(STOREV, jv_string_value((yyvsp[-2].literal))), (yyvsp[0].blk))); } -#line 3816 "src/parser.c" +#line 3806 "src/parser.c" break; case 132: /* ObjPat: IDENT ':' Pattern */ @@ -3820,7 +3810,7 @@ yyreduce: { (yyval.blk) = gen_object_matcher(gen_const((yyvsp[-2].literal)), (yyvsp[0].blk)); } -#line 3824 "src/parser.c" +#line 3814 "src/parser.c" break; case 133: /* ObjPat: Keyword ':' Pattern */ @@ -3828,7 +3818,7 @@ yyreduce: { (yyval.blk) = gen_object_matcher(gen_const((yyvsp[-2].literal)), (yyvsp[0].blk)); } -#line 3832 "src/parser.c" +#line 3822 "src/parser.c" break; case 134: /* ObjPat: String ':' Pattern */ @@ -3836,7 +3826,7 @@ yyreduce: { (yyval.blk) = gen_object_matcher((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 3840 "src/parser.c" +#line 3830 "src/parser.c" break; case 135: /* ObjPat: '(' Exp ')' ':' Pattern */ @@ -3849,7 +3839,7 @@ yyreduce: jv_free(msg); (yyval.blk) = gen_object_matcher((yyvsp[-3].blk), (yyvsp[0].blk)); } -#line 3853 "src/parser.c" +#line 3843 "src/parser.c" break; case 136: /* ObjPat: error ':' Pattern */ @@ -3858,7 +3848,7 @@ yyreduce: FAIL((yyloc), "May need parentheses around object key expression"); (yyval.blk) = (yyvsp[0].blk); } -#line 3862 "src/parser.c" +#line 3852 "src/parser.c" break; case 137: /* Keyword: "as" */ @@ -3866,7 +3856,7 @@ yyreduce: { (yyval.literal) = jv_string("as"); } -#line 3870 "src/parser.c" +#line 3860 "src/parser.c" break; case 138: /* Keyword: "def" */ @@ -3874,7 +3864,7 @@ yyreduce: { (yyval.literal) = jv_string("def"); } -#line 3878 "src/parser.c" +#line 3868 "src/parser.c" break; case 139: /* Keyword: "module" */ @@ -3882,7 +3872,7 @@ yyreduce: { (yyval.literal) = jv_string("module"); } -#line 3886 "src/parser.c" +#line 3876 "src/parser.c" break; case 140: /* Keyword: "import" */ @@ -3890,7 +3880,7 @@ yyreduce: { (yyval.literal) = jv_string("import"); } -#line 3894 "src/parser.c" +#line 3884 "src/parser.c" break; case 141: /* Keyword: "include" */ @@ -3898,7 +3888,7 @@ yyreduce: { (yyval.literal) = jv_string("include"); } -#line 3902 "src/parser.c" +#line 3892 "src/parser.c" break; case 142: /* Keyword: "if" */ @@ -3906,7 +3896,7 @@ yyreduce: { (yyval.literal) = jv_string("if"); } -#line 3910 "src/parser.c" +#line 3900 "src/parser.c" break; case 143: /* Keyword: "then" */ @@ -3914,7 +3904,7 @@ yyreduce: { (yyval.literal) = jv_string("then"); } -#line 3918 "src/parser.c" +#line 3908 "src/parser.c" break; case 144: /* Keyword: "else" */ @@ -3922,7 +3912,7 @@ yyreduce: { (yyval.literal) = jv_string("else"); } -#line 3926 "src/parser.c" +#line 3916 "src/parser.c" break; case 145: /* Keyword: "elif" */ @@ -3930,7 +3920,7 @@ yyreduce: { (yyval.literal) = jv_string("elif"); } -#line 3934 "src/parser.c" +#line 3924 "src/parser.c" break; case 146: /* Keyword: "reduce" */ @@ -3938,7 +3928,7 @@ yyreduce: { (yyval.literal) = jv_string("reduce"); } -#line 3942 "src/parser.c" +#line 3932 "src/parser.c" break; case 147: /* Keyword: "foreach" */ @@ -3946,7 +3936,7 @@ yyreduce: { (yyval.literal) = jv_string("foreach"); } -#line 3950 "src/parser.c" +#line 3940 "src/parser.c" break; case 148: /* Keyword: "end" */ @@ -3954,7 +3944,7 @@ yyreduce: { (yyval.literal) = jv_string("end"); } -#line 3958 "src/parser.c" +#line 3948 "src/parser.c" break; case 149: /* Keyword: "and" */ @@ -3962,7 +3952,7 @@ yyreduce: { (yyval.literal) = jv_string("and"); } -#line 3966 "src/parser.c" +#line 3956 "src/parser.c" break; case 150: /* Keyword: "or" */ @@ -3970,7 +3960,7 @@ yyreduce: { (yyval.literal) = jv_string("or"); } -#line 3974 "src/parser.c" +#line 3964 "src/parser.c" break; case 151: /* Keyword: "try" */ @@ -3978,7 +3968,7 @@ yyreduce: { (yyval.literal) = jv_string("try"); } -#line 3982 "src/parser.c" +#line 3972 "src/parser.c" break; case 152: /* Keyword: "catch" */ @@ -3986,7 +3976,7 @@ yyreduce: { (yyval.literal) = jv_string("catch"); } -#line 3990 "src/parser.c" +#line 3980 "src/parser.c" break; case 153: /* Keyword: "label" */ @@ -3994,7 +3984,7 @@ yyreduce: { (yyval.literal) = jv_string("label"); } -#line 3998 "src/parser.c" +#line 3988 "src/parser.c" break; case 154: /* Keyword: "break" */ @@ -4002,7 +3992,7 @@ yyreduce: { (yyval.literal) = jv_string("break"); } -#line 4006 "src/parser.c" +#line 3996 "src/parser.c" break; case 155: /* Keyword: "__loc__" */ @@ -4010,7 +4000,7 @@ yyreduce: { (yyval.literal) = jv_string("__loc__"); } -#line 4014 "src/parser.c" +#line 4004 "src/parser.c" break; case 156: /* MkDict: %empty */ @@ -4018,25 +4008,25 @@ yyreduce: { (yyval.blk)=gen_noop(); } -#line 4022 "src/parser.c" +#line 4012 "src/parser.c" break; case 157: /* MkDict: MkDictPair */ #line 959 "src/parser.y" { (yyval.blk) = (yyvsp[0].blk); } -#line 4028 "src/parser.c" +#line 4018 "src/parser.c" break; case 158: /* MkDict: MkDictPair ',' MkDict */ #line 960 "src/parser.y" { (yyval.blk)=block_join((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 4034 "src/parser.c" +#line 4024 "src/parser.c" break; case 159: /* MkDict: error ',' MkDict */ #line 961 "src/parser.y" { (yyval.blk) = (yyvsp[0].blk); } -#line 4040 "src/parser.c" +#line 4030 "src/parser.c" break; case 160: /* MkDictPair: IDENT ':' ExpD */ @@ -4044,7 +4034,7 @@ yyreduce: { (yyval.blk) = gen_dictpair(gen_const((yyvsp[-2].literal)), (yyvsp[0].blk)); } -#line 4048 "src/parser.c" +#line 4038 "src/parser.c" break; case 161: /* MkDictPair: Keyword ':' ExpD */ @@ -4052,7 +4042,7 @@ yyreduce: { (yyval.blk) = gen_dictpair(gen_const((yyvsp[-2].literal)), (yyvsp[0].blk)); } -#line 4056 "src/parser.c" +#line 4046 "src/parser.c" break; case 162: /* MkDictPair: String ':' ExpD */ @@ -4060,7 +4050,7 @@ yyreduce: { (yyval.blk) = gen_dictpair((yyvsp[-2].blk), (yyvsp[0].blk)); } -#line 4064 "src/parser.c" +#line 4054 "src/parser.c" break; case 163: /* MkDictPair: String */ @@ -4069,7 +4059,7 @@ yyreduce: (yyval.blk) = gen_dictpair((yyvsp[0].blk), BLOCK(gen_op_simple(POP), gen_op_simple(DUP2), gen_op_simple(DUP2), gen_op_simple(INDEX))); } -#line 4073 "src/parser.c" +#line 4063 "src/parser.c" break; case 164: /* MkDictPair: '$' IDENT ':' ExpD */ @@ -4078,7 +4068,7 @@ yyreduce: (yyval.blk) = gen_dictpair(gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[-2].literal)))), (yyvsp[0].blk)); } -#line 4082 "src/parser.c" +#line 4072 "src/parser.c" break; case 165: /* MkDictPair: '$' IDENT */ @@ -4087,7 +4077,7 @@ yyreduce: (yyval.blk) = gen_dictpair(gen_const((yyvsp[0].literal)), gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[0].literal))))); } -#line 4091 "src/parser.c" +#line 4081 "src/parser.c" break; case 166: /* MkDictPair: '$' Keyword */ @@ -4096,7 +4086,7 @@ yyreduce: (yyval.blk) = gen_dictpair(gen_const((yyvsp[0].literal)), gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[0].literal))))); } -#line 4100 "src/parser.c" +#line 4090 "src/parser.c" break; case 167: /* MkDictPair: IDENT */ @@ -4105,7 +4095,7 @@ yyreduce: (yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))), gen_index(gen_noop(), gen_const((yyvsp[0].literal)))); } -#line 4109 "src/parser.c" +#line 4099 "src/parser.c" break; case 168: /* MkDictPair: Keyword */ @@ -4114,7 +4104,7 @@ yyreduce: (yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))), gen_index(gen_noop(), gen_const((yyvsp[0].literal)))); } -#line 4118 "src/parser.c" +#line 4108 "src/parser.c" break; case 169: /* MkDictPair: '(' Exp ')' ':' ExpD */ @@ -4127,7 +4117,7 @@ yyreduce: jv_free(msg); (yyval.blk) = gen_dictpair((yyvsp[-3].blk), (yyvsp[0].blk)); } -#line 4131 "src/parser.c" +#line 4121 "src/parser.c" break; case 170: /* MkDictPair: error ':' ExpD */ @@ -4136,11 +4126,11 @@ yyreduce: FAIL((yyloc), "May need parentheses around object key expression"); (yyval.blk) = (yyvsp[0].blk); } -#line 4140 "src/parser.c" +#line 4130 "src/parser.c" break; -#line 4144 "src/parser.c" +#line 4134 "src/parser.c" default: break; } diff --git a/src/parser.y b/src/parser.y index a5fc9da9..a216f706 100644 --- a/src/parser.y +++ b/src/parser.y @@ -367,9 +367,6 @@ Term "as" Patterns '|' Exp { "if" Exp "then" Exp ElseBody { $$ = gen_cond($2, $4, $5); } | -"if" Exp "then" Exp "end" { - $$ = gen_cond($2, $4, gen_noop()); -} | "if" Exp "then" error { FAIL(@$, "Possibly unterminated 'if' statement"); $$ = $2; @@ -625,6 +622,9 @@ ElseBody: } | "else" Exp "end" { $$ = $2; +} | +"end" { + $$ = gen_noop(); } ExpD: diff --git a/tests/jq.test b/tests/jq.test index 78c4017b..e62949b7 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -1116,6 +1116,13 @@ null 7 [7] +[if false then 3 elif false then 4 end] +7 +[7] + +[if false then 3 elif false then 4 else . end] +7 +[7] [.[] | [.foo[] // .bar]] [{"foo":[1,2], "bar": 42}, {"foo":[1], "bar": null}, {"foo":[null,false,3], "bar": 18}, {"foo":[], "bar":42}, {"foo": [null,false,null], "bar": 41}]