summaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorEmanuele Torre <torreemanuele6@gmail.com>2023-08-04 00:12:48 +0200
committerNico Williams <nico@cryptonector.com>2023-08-04 11:47:34 -0500
commit3b6e7ddd72d6080959a44bdcca068c3a200eb2ef (patch)
tree951edc6c11af2d4a59edb1bb0770b9bf8b4a6968 /src/parser.c
parent5fc5453409b858e4c6f68507f4147cf4a275f82b (diff)
Constant fold all kinds of constants
This patch exports all the binary operator builtins functions from builtin.c and uses them for constant folding in the parser, allowing constant folding to work will all kinds and combinations of constants. Now string*number, $ARGS+$ARGS, string/string, etc will also be constant folded and the implementation of constant folded operators and runtime operators will be the same. And thanks to the new ERRORK bytecode operation, errors are constant folded too! (e.g. 1 / 0 [] * {} etc)
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c930
1 files changed, 449 insertions, 481 deletions
diff --git a/src/parser.c b/src/parser.c
index 429a4304..0599db7f 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -75,10 +75,11 @@
#include <string.h>
#include "compile.h"
#include "jv_alloc.h"
+#include "builtin.h"
#define YYMALLOC jv_mem_alloc
#define YYFREE jv_mem_free
-#line 82 "src/parser.c"
+#line 83 "src/parser.c"
# ifndef YY_CAST
# ifdef __cplusplus
@@ -113,7 +114,7 @@
extern int yydebug;
#endif
/* "%code requires" blocks. */
-#line 11 "src/parser.y"
+#line 12 "src/parser.y"
#include "locfile.h"
struct lexer_param;
@@ -130,7 +131,7 @@ struct lexer_param;
} \
} while (0)
-#line 134 "src/parser.c"
+#line 135 "src/parser.c"
/* Token kinds. */
#ifndef YYTOKENTYPE
@@ -246,12 +247,12 @@ struct lexer_param;
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
-#line 31 "src/parser.y"
+#line 32 "src/parser.y"
jv literal;
block blk;
-#line 255 "src/parser.c"
+#line 256 "src/parser.c"
};
typedef union YYSTYPE YYSTYPE;
@@ -388,7 +389,7 @@ typedef enum yysymbol_kind_t yysymbol_kind_t;
/* Second part of user prologue. */
-#line 126 "src/parser.y"
+#line 127 "src/parser.y"
#include "lexer.h"
struct lexer_param {
@@ -468,64 +469,31 @@ static block constant_fold(block a, block b, int op) {
if (!block_is_single(a) || !block_is_const(a) ||
!block_is_single(b) || !block_is_const(b))
return gen_noop();
- if (op == '+') {
- if (block_const_kind(a) == JV_KIND_NULL) {
- block_free(a);
- return b;
- }
- if (block_const_kind(b) == JV_KIND_NULL) {
- block_free(b);
- return a;
- }
- }
- if (block_const_kind(a) != block_const_kind(b))
- return gen_noop();
- jv res = jv_invalid();
+ jv jv_a = block_const(a);
+ block_free(a);
+ jv jv_b = block_const(b);
+ block_free(b);
- if (block_const_kind(a) == JV_KIND_NUMBER) {
- jv jv_a = block_const(a);
- jv jv_b = block_const(b);
-
- double na = jv_number_value(jv_a);
- double nb = jv_number_value(jv_b);
-
- int cmp = jv_cmp(jv_a, jv_b);
-
- switch (op) {
- case '+': res = jv_number(na + nb); break;
- case '-': res = jv_number(na - nb); break;
- case '*': res = jv_number(na * nb); break;
- case '/':
- if (nb == 0.0) return gen_noop();
- res = jv_number(na / nb);
- break;
- case '%':
-#define is_unsafe_to_int_cast(n) (isnan(n) || (n) < INTMAX_MIN || -(n) < INTMAX_MIN)
- if (is_unsafe_to_int_cast(na) || is_unsafe_to_int_cast(nb) || (intmax_t)nb == 0) return gen_noop();
-#undef is_unsafe_to_int_cast
- res = jv_number((intmax_t)na % (intmax_t)nb);
- break;
- case EQ: res = (cmp == 0 ? jv_true() : jv_false()); break;
- case NEQ: res = (cmp != 0 ? jv_true() : jv_false()); break;
- case '<': res = (cmp < 0 ? jv_true() : jv_false()); break;
- case '>': res = (cmp > 0 ? jv_true() : jv_false()); break;
- case LESSEQ: res = (cmp <= 0 ? jv_true() : jv_false()); break;
- case GREATEREQ: res = (cmp >= 0 ? jv_true() : jv_false()); break;
- default: break;
- }
- } else if (op == '+' && block_const_kind(a) == JV_KIND_STRING) {
- res = jv_string_concat(block_const(a), block_const(b));
- } else {
- return gen_noop();
+ jv res = jv_invalid();
+ switch (op) {
+ case '+': res = binop_plus(jv_a, jv_b); break;
+ case '-': res = binop_minus(jv_a, jv_b); break;
+ case '*': res = binop_multiply(jv_a, jv_b); break;
+ case '/': res = binop_divide(jv_a, jv_b); break;
+ case '%': res = binop_mod(jv_a, jv_b); break;
+ case EQ: res = binop_equal(jv_a, jv_b); break;
+ case NEQ: res = binop_notequal(jv_a, jv_b); break;
+ case '<': res = binop_less(jv_a, jv_b); break;
+ case '>': res = binop_greater(jv_a, jv_b); break;
+ case LESSEQ: res = binop_lesseq(jv_a, jv_b); break;
+ case GREATEREQ: res = binop_greatereq(jv_a, jv_b); break;
}
- if (jv_get_kind(res) == JV_KIND_INVALID)
- return gen_noop();
+ if (jv_is_valid(res))
+ return gen_const(res);
- block_free(a);
- block_free(b);
- return gen_const(res);
+ return gen_error(jv_invalid_get_msg(res));
}
static block gen_binop(block a, block b, int op) {
@@ -582,7 +550,7 @@ static block gen_loc_object(location *loc, struct locfile *locations) {
}
-#line 586 "src/parser.c"
+#line 554 "src/parser.c"
#ifdef short
@@ -972,23 +940,23 @@ static const yytype_int8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_int16 yyrline[] =
{
- 0, 322, 322, 325, 330, 333, 348, 351, 356, 359,
- 364, 368, 371, 375, 379, 383, 386, 391, 394, 397,
- 402, 409, 413, 417, 421, 425, 429, 433, 437, 441,
- 445, 449, 453, 457, 461, 465, 469, 473, 477, 481,
- 485, 489, 493, 497, 501, 505, 509, 513, 518, 521,
- 538, 547, 554, 562, 573, 578, 584, 587, 592, 596,
- 603, 606, 612, 619, 622, 625, 631, 634, 637, 642,
- 645, 648, 654, 657, 660, 668, 672, 675, 678, 681,
- 684, 687, 690, 693, 696, 700, 706, 709, 712, 715,
- 718, 721, 724, 727, 730, 733, 736, 739, 742, 745,
- 748, 751, 754, 757, 760, 763, 766, 788, 792, 796,
- 799, 811, 816, 817, 818, 819, 822, 825, 830, 835,
- 838, 843, 846, 851, 855, 858, 863, 866, 871, 874,
- 879, 882, 885, 888, 891, 894, 902, 908, 911, 914,
- 917, 920, 923, 926, 929, 932, 935, 938, 941, 944,
- 947, 950, 953, 956, 959, 964, 967, 968, 969, 972,
- 975, 978, 981, 985, 990, 994, 998, 1002, 1006, 1014
+ 0, 290, 290, 293, 298, 301, 316, 319, 324, 327,
+ 332, 336, 339, 343, 347, 351, 354, 359, 362, 365,
+ 370, 377, 381, 385, 389, 393, 397, 401, 405, 409,
+ 413, 417, 421, 425, 429, 433, 437, 441, 445, 449,
+ 453, 457, 461, 465, 469, 473, 477, 481, 486, 489,
+ 506, 515, 522, 530, 541, 546, 552, 555, 560, 564,
+ 571, 574, 580, 587, 590, 593, 599, 602, 605, 610,
+ 613, 616, 622, 625, 628, 636, 640, 643, 646, 649,
+ 652, 655, 658, 661, 664, 668, 674, 677, 680, 683,
+ 686, 689, 692, 695, 698, 701, 704, 707, 710, 713,
+ 716, 719, 722, 725, 728, 731, 734, 756, 760, 764,
+ 767, 779, 784, 785, 786, 787, 790, 793, 798, 803,
+ 806, 811, 814, 819, 823, 826, 831, 834, 839, 842,
+ 847, 850, 853, 856, 859, 862, 870, 876, 879, 882,
+ 885, 888, 891, 894, 897, 900, 903, 906, 909, 912,
+ 915, 918, 921, 924, 927, 932, 935, 936, 937, 940,
+ 943, 946, 949, 953, 958, 962, 966, 970, 974, 982
};
#endif
@@ -2202,201 +2170,201 @@ yydestruct (const char *yymsg,
switch (yykind)
{
case YYSYMBOL_IDENT: /* IDENT */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2208 "src/parser.c"
+#line 2176 "src/parser.c"
break;
case YYSYMBOL_FIELD: /* FIELD */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2214 "src/parser.c"
+#line 2182 "src/parser.c"
break;
case YYSYMBOL_BINDING: /* BINDING */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2220 "src/parser.c"
+#line 2188 "src/parser.c"
break;
case YYSYMBOL_LITERAL: /* LITERAL */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2226 "src/parser.c"
+#line 2194 "src/parser.c"
break;
case YYSYMBOL_FORMAT: /* FORMAT */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2232 "src/parser.c"
+#line 2200 "src/parser.c"
break;
case YYSYMBOL_QQSTRING_TEXT: /* QQSTRING_TEXT */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2238 "src/parser.c"
+#line 2206 "src/parser.c"
break;
case YYSYMBOL_Module: /* Module */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2244 "src/parser.c"
+#line 2212 "src/parser.c"
break;
case YYSYMBOL_Imports: /* Imports */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2250 "src/parser.c"
+#line 2218 "src/parser.c"
break;
case YYSYMBOL_FuncDefs: /* FuncDefs */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2256 "src/parser.c"
+#line 2224 "src/parser.c"
break;
case YYSYMBOL_Exp: /* Exp */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2262 "src/parser.c"
+#line 2230 "src/parser.c"
break;
case YYSYMBOL_Import: /* Import */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2268 "src/parser.c"
+#line 2236 "src/parser.c"
break;
case YYSYMBOL_ImportWhat: /* ImportWhat */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2274 "src/parser.c"
+#line 2242 "src/parser.c"
break;
case YYSYMBOL_ImportFrom: /* ImportFrom */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2280 "src/parser.c"
+#line 2248 "src/parser.c"
break;
case YYSYMBOL_FuncDef: /* FuncDef */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2286 "src/parser.c"
+#line 2254 "src/parser.c"
break;
case YYSYMBOL_Params: /* Params */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2292 "src/parser.c"
+#line 2260 "src/parser.c"
break;
case YYSYMBOL_Param: /* Param */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2298 "src/parser.c"
+#line 2266 "src/parser.c"
break;
case YYSYMBOL_StringStart: /* StringStart */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2304 "src/parser.c"
+#line 2272 "src/parser.c"
break;
case YYSYMBOL_String: /* String */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2310 "src/parser.c"
+#line 2278 "src/parser.c"
break;
case YYSYMBOL_QQString: /* QQString */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2316 "src/parser.c"
+#line 2284 "src/parser.c"
break;
case YYSYMBOL_ElseBody: /* ElseBody */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2322 "src/parser.c"
+#line 2290 "src/parser.c"
break;
case YYSYMBOL_ExpD: /* ExpD */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2328 "src/parser.c"
+#line 2296 "src/parser.c"
break;
case YYSYMBOL_Term: /* Term */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2334 "src/parser.c"
+#line 2302 "src/parser.c"
break;
case YYSYMBOL_Args: /* Args */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2340 "src/parser.c"
+#line 2308 "src/parser.c"
break;
case YYSYMBOL_Arg: /* Arg */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2346 "src/parser.c"
+#line 2314 "src/parser.c"
break;
case YYSYMBOL_RepPatterns: /* RepPatterns */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2352 "src/parser.c"
+#line 2320 "src/parser.c"
break;
case YYSYMBOL_Patterns: /* Patterns */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2358 "src/parser.c"
+#line 2326 "src/parser.c"
break;
case YYSYMBOL_Pattern: /* Pattern */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2364 "src/parser.c"
+#line 2332 "src/parser.c"
break;
case YYSYMBOL_ArrayPats: /* ArrayPats */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2370 "src/parser.c"
+#line 2338 "src/parser.c"
break;
case YYSYMBOL_ObjPats: /* ObjPats */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2376 "src/parser.c"
+#line 2344 "src/parser.c"
break;
case YYSYMBOL_ObjPat: /* ObjPat */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2382 "src/parser.c"
+#line 2350 "src/parser.c"
break;
case YYSYMBOL_Keyword: /* Keyword */
-#line 36 "src/parser.y"
+#line 37 "src/parser.y"
{ jv_free(((*yyvaluep).literal)); }
-#line 2388 "src/parser.c"
+#line 2356 "src/parser.c"
break;
case YYSYMBOL_MkDict: /* MkDict */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2394 "src/parser.c"
+#line 2362 "src/parser.c"
break;
case YYSYMBOL_MkDictPair: /* MkDictPair */
-#line 37 "src/parser.y"
+#line 38 "src/parser.y"
{ block_free(((*yyvaluep).blk)); }
-#line 2400 "src/parser.c"
+#line 2368 "src/parser.c"
break;
default:
@@ -2700,31 +2668,31 @@ yyreduce:
switch (yyn)
{
case 2: /* TopLevel: Module Imports Exp */
-#line 322 "src/parser.y"
+#line 290 "src/parser.y"
{
*answer = BLOCK((yyvsp[-2].blk), (yyvsp[-1].blk), gen_op_simple(TOP), (yyvsp[0].blk));
}
-#line 2708 "src/parser.c"
+#line 2676 "src/parser.c"
break;
case 3: /* TopLevel: Module Imports FuncDefs */
-#line 325 "src/parser.y"
+#line 293 "src/parser.y"
{
*answer = BLOCK((yyvsp[-2].blk), (yyvsp[-1].blk), (yyvsp[0].blk));
}
-#line 2716 "src/parser.c"
+#line 2684 "src/parser.c"
break;
case 4: /* Module: %empty */
-#line 330 "src/parser.y"
+#line 298 "src/parser.y"
{
(yyval.blk) = gen_noop();
}
-#line 2724 "src/parser.c"
+#line 2692 "src/parser.c"
break;
case 5: /* Module: "module" Exp ';' */
-#line 333 "src/parser.y"
+#line 301 "src/parser.y"
{
if (!block_is_const((yyvsp[-1].blk))) {
FAIL((yyloc), "Module metadata must be constant");
@@ -2738,360 +2706,360 @@ yyreduce:
(yyval.blk) = gen_module((yyvsp[-1].blk));
}
}
-#line 2742 "src/parser.c"
+#line 2710 "src/parser.c"
break;
case 6: /* Imports: %empty */
-#line 348 "src/parser.y"
+#line 316 "src/parser.y"
{
(yyval.blk) = gen_noop();
}
-#line 2750 "src/parser.c"
+#line 2718 "src/parser.c"
break;
case 7: /* Imports: Import Imports */
-#line 351 "src/parser.y"
+#line 319 "src/parser.y"
{
(yyval.blk) = BLOCK((yyvsp[-1].blk), (yyvsp[0].blk));
}
-#line 2758 "src/parser.c"
+#line 2726 "src/parser.c"
break;
case 8: /* FuncDefs: %empty */
-#line 356 "src/parser.y"
+#line 324 "src/parser.y"
{
(yyval.blk) = gen_noop();
}
-#line 2766 "src/parser.c"
+#line 2734 "src/parser.c"
break;
case 9: /* FuncDefs: FuncDef FuncDefs */
-#line 359 "src/parser.y"
+#line 327 "src/parser.y"
{
(yyval.blk) = block_join((yyvsp[-1].blk), (yyvsp[0].blk));
}
-#line 2774 "src/parser.c"
+#line 2742 "src/parser.c"
break;
case 10: /* Exp: FuncDef Exp */
-#line 364 "src/parser.y"
+#line 332 "src/parser.y"
{
(yyval.blk) = block_bind_referenced((yyvsp[-1].blk), (yyvsp[0].blk), OP_IS_CALL_PSEUDO);
}
-#line 2782 "src/parser.c"
+#line 2750 "src/parser.c"
break;
case 11: /* Exp: Term "as" Patterns '|' Exp */
-#line 368 "src/parser.y"
+#line 336 "src/parser.y"
{
(yyval.blk) = gen_destructure((yyvsp[-4].blk), (yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2790 "src/parser.c"
+#line 2758 "src/parser.c"
break;
case 12: /* Exp: "reduce" Term "as" Patterns '(' Exp ';' Exp ')' */
-#line 371 "src/parser.y"
+#line 339 "src/parser.y"
{
(yyval.blk) = gen_reduce((yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk));
}
-#line 2798 "src/parser.c"
+#line 2766 "src/parser.c"
break;
case 13: /* Exp: "foreach" Term "as" Patterns '(' Exp ';' Exp ';' Exp ')' */
-#line 375 "src/parser.y"
+#line 343 "src/parser.y"
{
(yyval.blk) = gen_foreach((yyvsp[-9].blk), (yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk));
}
-#line 2806 "src/parser.c"
+#line 2774 "src/parser.c"
break;
case 14: /* Exp: "foreach" Term "as" Patterns '(' Exp ';' Exp ')' */
-#line 379 "src/parser.y"
+#line 347 "src/parser.y"
{
(yyval.blk) = gen_foreach((yyvsp[-7].blk), (yyvsp[-5].blk), (yyvsp[-3].blk), (yyvsp[-1].blk), gen_noop());
}
-#line 2814 "src/parser.c"
+#line 2782 "src/parser.c"
break;
case 15: /* Exp: "if" Exp "then" Exp ElseBody */
-#line 383 "src/parser.y"
+#line 351 "src/parser.y"
{
(yyval.blk) = gen_cond((yyvsp[-3].blk), (yyvsp[-1].blk), (yyvsp[0].blk));
}
-#line 2822 "src/parser.c"
+#line 2790 "src/parser.c"
break;
case 16: /* Exp: "if" Exp "then" error */
-#line 386 "src/parser.y"
+#line 354 "src/parser.y"
{
FAIL((yyloc), "Possibly unterminated 'if' statement");
(yyval.blk) = (yyvsp[-2].blk);
}
-#line 2831 "src/parser.c"
+#line 2799 "src/parser.c"
break;
case 17: /* Exp: "try" Exp "catch" Exp */
-#line 391 "src/parser.y"
+#line 359 "src/parser.y"
{
(yyval.blk) = gen_try((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2839 "src/parser.c"
+#line 2807 "src/parser.c"
break;
case 18: /* Exp: "try" Exp */
-#line 394 "src/parser.y"
+#line 362 "src/parser.y"
{
(yyval.blk) = gen_try((yyvsp[0].blk), gen_op_simple(BACKTRACK));
}
-#line 2847 "src/parser.c"
+#line 2815 "src/parser.c"
break;
case 19: /* Exp: "try" Exp "catch" error */
-#line 397 "src/parser.y"
+#line 365 "src/parser.y"
{
FAIL((yyloc), "Possibly unterminated 'try' statement");
(yyval.blk) = (yyvsp[-2].blk);
}
-#line 2856 "src/parser.c"
+#line 2824 "src/parser.c"
break;
case 20: /* Exp: "label" BINDING '|' Exp */
-#line 402 "src/parser.y"
+#line 370 "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 2867 "src/parser.c"
+#line 2835 "src/parser.c"
break;
case 21: /* Exp: Exp '?' */
-#line 409 "src/parser.y"
+#line 377 "src/parser.y"
{
(yyval.blk) = gen_try((yyvsp[-1].blk), gen_op_simple(BACKTRACK));
}
-#line 2875 "src/parser.c"
+#line 2843 "src/parser.c"
break;
case 22: /* Exp: Exp '=' Exp */
-#line 413 "src/parser.y"
+#line 381 "src/parser.y"
{
(yyval.blk) = gen_call("_assign", BLOCK(gen_lambda((yyvsp[-2].blk)), gen_lambda((yyvsp[0].blk))));
}
-#line 2883 "src/parser.c"
+#line 2851 "src/parser.c"
break;
case 23: /* Exp: Exp "or" Exp */
-#line 417 "src/parser.y"
+#line 385 "src/parser.y"
{
(yyval.blk) = gen_or((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2891 "src/parser.c"
+#line 2859 "src/parser.c"
break;
case 24: /* Exp: Exp "and" Exp */
-#line 421 "src/parser.y"
+#line 389 "src/parser.y"
{
(yyval.blk) = gen_and((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2899 "src/parser.c"
+#line 2867 "src/parser.c"
break;
case 25: /* Exp: Exp "//" Exp */
-#line 425 "src/parser.y"
+#line 393 "src/parser.y"
{
(yyval.blk) = gen_definedor((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2907 "src/parser.c"
+#line 2875 "src/parser.c"
break;
case 26: /* Exp: Exp "//=" Exp */
-#line 429 "src/parser.y"
+#line 397 "src/parser.y"
{
(yyval.blk) = gen_definedor_assign((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2915 "src/parser.c"
+#line 2883 "src/parser.c"
break;
case 27: /* Exp: Exp "|=" Exp */
-#line 433 "src/parser.y"
+#line 401 "src/parser.y"
{
(yyval.blk) = gen_call("_modify", BLOCK(gen_lambda((yyvsp[-2].blk)), gen_lambda((yyvsp[0].blk))));
}
-#line 2923 "src/parser.c"
+#line 2891 "src/parser.c"
break;
case 28: /* Exp: Exp '|' Exp */
-#line 437 "src/parser.y"
+#line 405 "src/parser.y"
{
(yyval.blk) = block_join((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2931 "src/parser.c"
+#line 2899 "src/parser.c"
break;
case 29: /* Exp: Exp ',' Exp */
-#line 441 "src/parser.y"
+#line 409 "src/parser.y"
{
(yyval.blk) = gen_both((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 2939 "src/parser.c"
+#line 2907 "src/parser.c"
break;
case 30: /* Exp: Exp '+' Exp */
-#line 445 "src/parser.y"
+#line 413 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '+');
}
-#line 2947 "src/parser.c"
+#line 2915 "src/parser.c"
break;
case 31: /* Exp: Exp "+=" Exp */
-#line 449 "src/parser.y"
+#line 417 "src/parser.y"
{
(yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '+');
}
-#line 2955 "src/parser.c"
+#line 2923 "src/parser.c"
break;
case 32: /* Exp: '-' Exp */
-#line 453 "src/parser.y"
+#line 421 "src/parser.y"
{
(yyval.blk) = BLOCK((yyvsp[0].blk), gen_call("_negate", gen_noop()));
}
-#line 2963 "src/parser.c"
+#line 2931 "src/parser.c"
break;
case 33: /* Exp: Exp '-' Exp */
-#line 457 "src/parser.y"
+#line 425 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '-');
}
-#line 2971 "src/parser.c"
+#line 2939 "src/parser.c"
break;
case 34: /* Exp: Exp "-=" Exp */
-#line 461 "src/parser.y"
+#line 429 "src/parser.y"
{
(yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '-');
}
-#line 2979 "src/parser.c"
+#line 2947 "src/parser.c"
break;
case 35: /* Exp: Exp '*' Exp */
-#line 465 "src/parser.y"
+#line 433 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '*');
}
-#line 2987 "src/parser.c"
+#line 2955 "src/parser.c"
break;
case 36: /* Exp: Exp "*=" Exp */
-#line 469 "src/parser.y"
+#line 437 "src/parser.y"
{
(yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '*');
}
-#line 2995 "src/parser.c"
+#line 2963 "src/parser.c"
break;
case 37: /* Exp: Exp '/' Exp */
-#line 473 "src/parser.y"
+#line 441 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '/');
}
-#line 3003 "src/parser.c"
+#line 2971 "src/parser.c"
break;
case 38: /* Exp: Exp '%' Exp */
-#line 477 "src/parser.y"
+#line 445 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '%');
}
-#line 3011 "src/parser.c"
+#line 2979 "src/parser.c"
break;
case 39: /* Exp: Exp "/=" Exp */
-#line 481 "src/parser.y"
+#line 449 "src/parser.y"
{
(yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '/');
}
-#line 3019 "src/parser.c"
+#line 2987 "src/parser.c"
break;
case 40: /* Exp: Exp "%=" Exp */
-#line 485 "src/parser.y"
+#line 453 "src/parser.y"
{
(yyval.blk) = gen_update((yyvsp[-2].blk), (yyvsp[0].blk), '%');
}
-#line 3027 "src/parser.c"
+#line 2995 "src/parser.c"
break;
case 41: /* Exp: Exp "==" Exp */
-#line 489 "src/parser.y"
+#line 457 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), EQ);
}
-#line 3035 "src/parser.c"
+#line 3003 "src/parser.c"
break;
case 42: /* Exp: Exp "!=" Exp */
-#line 493 "src/parser.y"
+#line 461 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), NEQ);
}
-#line 3043 "src/parser.c"
+#line 3011 "src/parser.c"
break;
case 43: /* Exp: Exp '<' Exp */
-#line 497 "src/parser.y"
+#line 465 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '<');
}
-#line 3051 "src/parser.c"
+#line 3019 "src/parser.c"
break;
case 44: /* Exp: Exp '>' Exp */
-#line 501 "src/parser.y"
+#line 469 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), '>');
}
-#line 3059 "src/parser.c"
+#line 3027 "src/parser.c"
break;
case 45: /* Exp: Exp "<=" Exp */
-#line 505 "src/parser.y"
+#line 473 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), LESSEQ);
}
-#line 3067 "src/parser.c"
+#line 3035 "src/parser.c"
break;
case 46: /* Exp: Exp ">=" Exp */
-#line 509 "src/parser.y"
+#line 477 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-2].blk), (yyvsp[0].blk), GREATEREQ);
}
-#line 3075 "src/parser.c"
+#line 3043 "src/parser.c"
break;
case 47: /* Exp: Term */
-#line 513 "src/parser.y"
+#line 481 "src/parser.y"
{
(yyval.blk) = (yyvsp[0].blk);
}
-#line 3083 "src/parser.c"
+#line 3051 "src/parser.c"
break;
case 48: /* Import: ImportWhat ';' */
-#line 518 "src/parser.y"
+#line 486 "src/parser.y"
{
(yyval.blk) = (yyvsp[-1].blk);
}
-#line 3091 "src/parser.c"
+#line 3059 "src/parser.c"
break;
case 49: /* Import: ImportWhat Exp ';' */
-#line 521 "src/parser.y"
+#line 489 "src/parser.y"
{
if (!block_is_const((yyvsp[-1].blk))) {
FAIL((yyloc), "Module metadata must be constant");
@@ -3107,11 +3075,11 @@ yyreduce:
(yyval.blk) = gen_import_meta((yyvsp[-2].blk), (yyvsp[-1].blk));
}
}
-#line 3111 "src/parser.c"
+#line 3079 "src/parser.c"
break;
case 50: /* ImportWhat: "import" ImportFrom "as" BINDING */
-#line 538 "src/parser.y"
+#line 506 "src/parser.y"
{
jv v = block_const((yyvsp[-2].blk));
// XXX Make gen_import take only blocks and the int is_data so we
@@ -3121,11 +3089,11 @@ yyreduce:
jv_free((yyvsp[0].literal));
jv_free(v);
}
-#line 3125 "src/parser.c"
+#line 3093 "src/parser.c"
break;
case 51: /* ImportWhat: "import" ImportFrom "as" IDENT */
-#line 547 "src/parser.y"
+#line 515 "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);
@@ -3133,22 +3101,22 @@ yyreduce:
jv_free((yyvsp[0].literal));
jv_free(v);
}
-#line 3137 "src/parser.c"
+#line 3105 "src/parser.c"
break;
case 52: /* ImportWhat: "include" ImportFrom */
-#line 554 "src/parser.y"
+#line 522 "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 3148 "src/parser.c"
+#line 3116 "src/parser.c"
break;
case 53: /* ImportFrom: String */
-#line 562 "src/parser.y"
+#line 530 "src/parser.y"
{
if (!block_is_const((yyvsp[0].blk))) {
FAIL((yyloc), "Import path must be constant");
@@ -3158,176 +3126,176 @@ yyreduce:
(yyval.blk) = (yyvsp[0].blk);
}
}
-#line 3162 "src/parser.c"
+#line 3130 "src/parser.c"
break;
case 54: /* FuncDef: "def" IDENT ':' Exp ';' */
-#line 573 "src/parser.y"
+#line 541 "src/parser.y"
{
(yyval.blk) = gen_function(jv_string_value((yyvsp[-3].literal)), gen_noop(), (yyvsp[-1].blk));
jv_free((yyvsp[-3].literal));
}
-#line 3171 "src/parser.c"
+#line 3139 "src/parser.c"
break;
case 55: /* FuncDef: "def" IDENT '(' Params ')' ':' Exp ';' */
-#line 578 "src/parser.y"
+#line 546 "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 3180 "src/parser.c"
+#line 3148 "src/parser.c"
break;
case 56: /* Params: Param */
-#line 584 "src/parser.y"
+#line 552 "src/parser.y"
{
(yyval.blk) = (yyvsp[0].blk);
}
-#line 3188 "src/parser.c"
+#line 3156 "src/parser.c"
break;
case 57: /* Params: Params ';' Param */
-#line 587 "src/parser.y"
+#line 555 "src/parser.y"
{
(yyval.blk) = BLOCK((yyvsp[-2].blk), (yyvsp[0].blk));
}
-#line 3196 "src/parser.c"
+#line 3164 "src/parser.c"
break;
case 58: /* Param: BINDING */
-#line 592 "src/parser.y"
+#line 560 "src/parser.y"
{
(yyval.blk) = gen_param_regular(jv_string_value((yyvsp[0].literal)));
jv_free((yyvsp[0].literal));
}
-#line 3205 "src/parser.c"
+#line 3173 "src/parser.c"
break;
case 59: /* Param: IDENT */
-#line 596 "src/parser.y"
+#line 564 "src/parser.y"
{
(yyval.blk) = gen_param(jv_string_value((yyvsp[0].literal)));
jv_free((yyvsp[0].literal));
}
-#line 3214 "src/parser.c"
+#line 3182 "src/parser.c"
break;
case 60: /* StringStart: FORMAT QQSTRING_START */
-#line 603 "src/parser.y"
+#line 571 "src/parser.y"
{
(yyval.literal) = (yyvsp[-1].literal);
}
-#line 3222 "src/parser.c"
+#line 3190 "src/parser.c"
break;
case 61: /* StringStart: QQSTRING_START */
-#line 606 "src/parser.y"
+#line 574 "src/parser.y"
{
(yyval.literal) = jv_string("text");
}
-#line 3230 "src/parser.c"
+#line 3198 "src/parser.c"
break;
case 62: /* String: StringStart QQString QQSTRING_END */
-#line 612 "src/parser.y"
+#line 580 "src/parser.y"
{
(yyval.blk) = (yyvsp[-1].blk);
jv_free((yyvsp[-2].literal));
}
-#line 3239 "src/parser.c"
+#line 3207 "src/parser.c"
break;
case 63: /* QQString: %empty */
-#line 619 "src/parser.y"
+#line 587 "src/parser.y"
{
(yyval.blk) = gen_const(jv_string(""));
}
-#line 3247 "src/parser.c"
+#line 3215 "src/parser.c"
break;
case 64: /* QQString: QQString QQSTRING_TEXT */
-#line 622 "src/parser.y"
+#line 590 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-1].blk), gen_const((yyvsp[0].literal)), '+');
}
-#line 3255 "src/parser.c"
+#line 3223 "src/parser.c"
break;
case 65: /* QQString: QQString QQSTRING_INTERP_START Exp QQSTRING_INTERP_END */
-#line 625 "src/parser.y"
+#line 593 "src/parser.y"
{
(yyval.blk) = gen_binop((yyvsp[-3].blk), gen_format((yyvsp[-1].blk), jv_copy((yyvsp[-4].literal))), '+');
}
-#line 3263 "src/parser.c"
+#line 3231 "src/parser.c"
break;
case 66: /* ElseBody: "elif" Exp "then" Exp ElseBody */
-#line 631 "src/parser.y"
+#line 599 "src/parser.y"
{
(yyval.blk) = gen_cond((yyvsp[-3].blk), (yyvsp[-1].blk), (yyvsp[0].blk));
}
-#line 3271 "src/parser.c"
+#line 3239 "src/parser.c"
break;
case 67: /* ElseBody: "else" Exp "end" */
-#line 634 "src/parser.y"
+#line 602 "src/parser.y"
{
(yyval.blk) = (yyvsp[-1].blk);
}
-#line 3279 "src/parser.c"
+#line 3247 "src/parser.c"
break;
<