phi-lang/stage2.js
2025-09-23 17:35:09 +02:00

1230 lines
55 KiB
JavaScript

#!/usr/bin/env node
import { Runtime } from "./runtime.js";
const runtime = new Runtime("compile.phi");
function _Emitter14(_ast25, _filename26) {
runtime.pushCall("Emitter");
const r_0 = ({ type: "list", values: [] });
let _output41 = r_0;
const r_1 = (runtime.setLine(5), _Syms16());
const r_2 = r_1.values[0] ?? { type: "null"};
let _enter_scope42 = r_2;
const r_3 = r_1.values[1] ?? { type: "null"};
let _leave_scope43 = r_3;
const r_4 = r_1.values[2] ?? { type: "null"};
let _define_sym44 = r_4;
const r_5 = r_1.values[3] ?? { type: "null"};
let _get_sym45 = r_5;
const r_6 = r_1.values[4] ?? { type: "null"};
let _print_syms46 = r_6;
const r_7 = (runtime.setLine(7), _Counter15());
const r_8 = r_7.values[0] ?? { type: "null"};
let _let_node_reg_count47 = r_8;
const r_9 = r_7.values[1] ?? { type: "null"};
let _let_node_reg_increment48 = r_9;
const r_10 = (runtime.setLine(8), _Counter15());
const r_11 = r_10.values[0] ?? { type: "null"};
let _sym_id_count49 = r_11;
const r_12 = r_10.values[1] ?? { type: "null"};
let _sym_id_increment50 = r_12;
const r_13 = ({ type: "list", values: [({ type: "list", values: [({ type: "string", value: "format" }), ({ type: "string", value: "builtinFormat" })] }), ({ type: "list", values: [({ type: "string", value: "print" }), ({ type: "string", value: "builtinPrint" })] }), ({ type: "list", values: [({ type: "string", value: "println" }), ({ type: "string", value: "builtinPrintln" })] }), ({ type: "list", values: [({ type: "string", value: "panic" }), ({ type: "string", value: "builtinPanic" })] }), ({ type: "list", values: [({ type: "string", value: "read_text_file" }), ({ type: "string", value: "builtinReadTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "write_text_file" }), ({ type: "string", value: "builtinWriteTextFile" })] }), ({ type: "list", values: [({ type: "string", value: "push" }), ({ type: "string", value: "builtinPush" })] }), ({ type: "list", values: [({ type: "string", value: "at" }), ({ type: "string", value: "builtinAt" })] }), ({ type: "list", values: [({ type: "string", value: "set" }), ({ type: "string", value: "builtinSet" })] }), ({ type: "list", values: [({ type: "string", value: "len" }), ({ type: "string", value: "builtinLen" })] }), ({ type: "list", values: [({ type: "string", value: "string_to_int" }), ({ type: "string", value: "builtinStringToInt" })] }), ({ type: "list", values: [({ type: "string", value: "char_code" }), ({ type: "string", value: "builtinCharCode" })] }), ({ type: "list", values: [({ type: "string", value: "strings_join" }), ({ type: "string", value: "builtinStringsJoin" })] }), ({ type: "list", values: [({ type: "string", value: "get_args" }), ({ type: "string", value: "builtinGetArgs" })] })] });
let _builtin_syms51 = r_13;
function _generate27() {
runtime.pushCall("generate");
(runtime.setLine(28), _emit36(({ type: "string", value: "#!/usr/bin/env node\n" })));
(runtime.setLine(29), _emit36(({ type: "string", value: "import { Runtime } from \"./runtime.js\";\n" })));
(runtime.setLine(30), _emit36((runtime.setLine(30), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const runtime = new Runtime(\"%\");\n" }), _filename26))));
for (const r_14 of _builtin_syms51.values) {;
const r_15 = r_14.values[0] ?? { type: "null"};
let _ident52 = r_15;
const r_16 = r_14.values[1] ?? { type: "null"};
let _builtin_id53 = r_16;
(runtime.setLine(33), _define_builtin37(_ident52, _builtin_id53));
};
(runtime.setLine(36), _discover_syms29(_ast25));
(runtime.setLine(37), _emit_exprs28(_ast25));
runtime.popCall();
return (runtime.setLine(38), ((...args) => runtime.builtinStringsJoin(...args))(_output41));
;
runtime.popCall();
return { type: "null" };
};
function _emit_exprs28(_exprs54) {
runtime.pushCall("emit_exprs");
for (const r_17 of _exprs54.values) {;
let _expr55 = r_17;
(runtime.setLine(43), _emit_expr30(_expr55));
(runtime.setLine(44), _emit36(({ type: "string", value: ";\n" })));
};
;
runtime.popCall();
return { type: "null" };
};
function _discover_syms29(_exprs56) {
runtime.pushCall("discover_syms");
for (const r_18 of _exprs56.values) {;
let _expr57 = r_18;
const r_19 = _expr57;
const r_20 = r_19.values[0] ?? { type: "null"};
let _ty58 = r_20;
const r_21 = r_19.values[1] ?? { type: "null"};
let _line59 = r_21;
if (runtime.truthy(runtime.opNe(_ty58, ({ type: "string", value: "list" })))) {
runtime.popCall();
return { type: "null" }};
const r_22 = _expr57;
const r_23 = r_22.values[0] ?? { type: "null"};
const r_24 = r_22.values[1] ?? { type: "null"};
const r_25 = r_22.values[2] ?? { type: "null"};
let _s60 = r_25;
if (runtime.truthy(runtime.opEq((runtime.setLine(53), ((...args) => runtime.builtinLen(...args))(_s60)), ({ type: "int", value: 0 })))) {
runtime.popCall();
return { type: "null" }};
const r_26 = _s60;
const r_27 = r_26.values[0] ?? { type: "null"};
const r_28 = r_27.values[0] ?? { type: "null"};
const r_29 = r_27.values[1] ?? { type: "null"};
const r_30 = r_27.values[2] ?? { type: "null"};
let _id61 = r_30;
if (runtime.truthy(runtime.opEq(_id61, ({ type: "string", value: "fn" })))) {
const r_31 = _s60;
const r_32 = r_31.values[0] ?? { type: "null"};
const r_33 = r_31.values[1] ?? { type: "null"};
const r_34 = r_33.values[0] ?? { type: "null"};
const r_35 = r_33.values[1] ?? { type: "null"};
const r_36 = r_33.values[2] ?? { type: "null"};
let _ident62 = r_36;
const r_37 = r_31.values[2] ?? { type: "null"};
const r_38 = r_37.values[0] ?? { type: "null"};
const r_39 = r_37.values[1] ?? { type: "null"};
const r_40 = r_37.values[2] ?? { type: "null"};
let _params63 = r_40;
const r_41 = r_31.values[3] ?? { type: "null"};
let _body64 = r_41;
(runtime.setLine(57), _define_fn38(_ident62, _line59));
};
};
;
runtime.popCall();
return { type: "null" };
};
function _emit_expr30(_expr65) {
runtime.pushCall("emit_expr");
const r_42 = _expr65;
const r_43 = r_42.values[0] ?? { type: "null"};
let _ty66 = r_43;
const r_44 = r_42.values[1] ?? { type: "null"};
let _line67 = r_44;
if (runtime.truthy(runtime.opEq(_ty66, ({ type: "string", value: "list" })))) {
(runtime.setLine(65), _emit_list31(_expr65));
} else {
if (runtime.truthy(runtime.opEq(_ty66, ({ type: "string", value: "int" })))) {
const r_45 = _expr65;
const r_46 = r_45.values[0] ?? { type: "null"};
const r_47 = r_45.values[1] ?? { type: "null"};
const r_48 = r_45.values[2] ?? { type: "null"};
let _value68 = r_48;
(runtime.setLine(68), _emit36((runtime.setLine(68), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"int\", value: % })" }), _value68))));
} else {
if (runtime.truthy(runtime.opEq(_ty66, ({ type: "string", value: "string" })))) {
const r_49 = _expr65;
const r_50 = r_49.values[0] ?? { type: "null"};
const r_51 = r_49.values[1] ?? { type: "null"};
const r_52 = r_49.values[2] ?? { type: "null"};
let _value69 = r_52;
(runtime.setLine(71), _emit36((runtime.setLine(71), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "({ type: \"string\", value: \"%\" })" }), (runtime.setLine(71), _string_escape17(_value69))))));
} else {
if (runtime.truthy(runtime.opEq(_ty66, ({ type: "string", value: "ident" })))) {
const r_53 = _expr65;
const r_54 = r_53.values[0] ?? { type: "null"};
const r_55 = r_53.values[1] ?? { type: "null"};
const r_56 = r_53.values[2] ?? { type: "null"};
let _value70 = r_56;
if (runtime.truthy(runtime.opEq(_value70, ({ type: "string", value: "null" })))) {
(runtime.setLine(76), _emit36(({ type: "string", value: "({ type: \"null\" })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.truthy(runtime.opEq(_value70, ({ type: "string", value: "false" })))) {
(runtime.setLine(79), _emit36(({ type: "string", value: "({ type: \"bool\", value: false })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.truthy(runtime.opEq(_value70, ({ type: "string", value: "true" })))) {
(runtime.setLine(82), _emit36(({ type: "string", value: "({ type: \"bool\", value: true })" })));
runtime.popCall();
return { type: "null" };
}}};
const r_57 = (runtime.setLine(86), _get_sym45(_value70));
let _sym71 = r_57;
if (runtime.truthy(runtime.opEq(_sym71, ({ type: "null" })))) {
(runtime.setLine(88), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value70, _line67));
};
const r_58 = _sym71;
const r_59 = r_58.values[0] ?? { type: "null"};
let _sym_id72 = r_59;
const r_60 = r_58.values[1] ?? { type: "null"};
let _sym_ty73 = r_60;
if (runtime.truthy(runtime.opEq(_sym_ty73, ({ type: "string", value: "builtin" })))) {
const r_61 = _sym71;
const r_62 = r_61.values[0] ?? { type: "null"};
const r_63 = r_61.values[1] ?? { type: "null"};
const r_64 = r_61.values[2] ?? { type: "null"};
let _id74 = r_64;
(runtime.setLine(94), _emit36((runtime.setLine(94), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id74))));
} else {
if (runtime.truthy(runtime.opEq(_sym_ty73, ({ type: "string", value: "fn" })))) {
(runtime.setLine(96), _emit36((runtime.setLine(96), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value70, _sym_id72))));
} else {
if (runtime.truthy(runtime.opEq(_sym_ty73, ({ type: "string", value: "param" })))) {
(runtime.setLine(98), _emit36((runtime.setLine(98), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value70, _sym_id72))));
} else {
if (runtime.truthy(runtime.opEq(_sym_ty73, ({ type: "string", value: "let" })))) {
(runtime.setLine(100), _emit36((runtime.setLine(100), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _value70, _sym_id72))));
} else {
(runtime.setLine(102), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty73));
}}}};
} else {
(runtime.setLine(105), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty66, _line67));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_list31(_expr75) {
runtime.pushCall("emit_list");
const r_65 = _expr75;
const r_66 = r_65.values[0] ?? { type: "null"};
let _ty76 = r_66;
const r_67 = r_65.values[1] ?? { type: "null"};
let _line77 = r_67;
const r_68 = r_65.values[2] ?? { type: "null"};
let _s78 = r_68;
if (runtime.truthy(runtime.opEq((runtime.setLine(111), ((...args) => runtime.builtinLen(...args))(_s78)), ({ type: "int", value: 0 })))) {
(runtime.setLine(112), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function on line %" }), _line77));
};
const r_69 = _s78;
const r_70 = r_69.values[0] ?? { type: "null"};
const r_71 = r_70.values[0] ?? { type: "null"};
let _id_ty79 = r_71;
const r_72 = r_70.values[1] ?? { type: "null"};
const r_73 = r_70.values[2] ?? { type: "null"};
let _id80 = r_73;
if (runtime.truthy(runtime.opNe(_id_ty79, ({ type: "string", value: "ident" })))) {
(runtime.setLine(116), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "illegal function on line %" }), _line77));
};
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "fn" })))) {
const r_74 = _s78;
const r_75 = r_74.values[0] ?? { type: "null"};
const r_76 = r_74.values[1] ?? { type: "null"};
const r_77 = r_76.values[0] ?? { type: "null"};
const r_78 = r_76.values[1] ?? { type: "null"};
const r_79 = r_76.values[2] ?? { type: "null"};
let _ident81 = r_79;
const r_80 = r_74.values[2] ?? { type: "null"};
const r_81 = r_80.values[0] ?? { type: "null"};
const r_82 = r_80.values[1] ?? { type: "null"};
const r_83 = r_80.values[2] ?? { type: "null"};
let _params82 = r_83;
const r_84 = r_74.values[3] ?? { type: "null"};
let _body83 = r_84;
const r_85 = (runtime.setLine(121), _get_sym45(_ident81));
let _sym84 = r_85;
const r_86 = _sym84;
const r_87 = r_86.values[0] ?? { type: "null"};
let _sym_id85 = r_87;
(runtime.setLine(124), _emit36((runtime.setLine(124), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%%(" }), _ident81, _sym_id85))));
(runtime.setLine(126), _enter_scope42());
const r_88 = ({ type: "bool", value: true });
let _first86 = r_88;
for (const r_89 of _params82.values) {;
const r_90 = r_89.values[0] ?? { type: "null"};
const r_91 = r_89.values[1] ?? { type: "null"};
const r_92 = r_89.values[2] ?? { type: "null"};
let _ident87 = r_92;
if (runtime.truthy(runtime.opNot(_first86))) {
(runtime.setLine(131), _emit36(({ type: "string", value: ", " })));
};
(_first86 = ({ type: "bool", value: false }));
const r_93 = (runtime.setLine(135), _define_param39(_ident87, _line77));
let _sym_id88 = r_93;
(runtime.setLine(136), _emit36((runtime.setLine(136), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%%" }), _ident87, _sym_id88))));
};
(runtime.setLine(140), _emit36(({ type: "string", value: ") {\n" })));
(runtime.setLine(141), _emit36((runtime.setLine(141), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _ident81))));
(runtime.setLine(143), _emit_expr30(_body83));
(runtime.setLine(144), _emit36(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" })));
(runtime.setLine(146), _leave_scope43());
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "let" })))) {
const r_94 = _s78;
const r_95 = r_94.values[0] ?? { type: "null"};
const r_96 = r_94.values[1] ?? { type: "null"};
let _pat89 = r_96;
const r_97 = r_94.values[2] ?? { type: "null"};
let _expr90 = r_97;
const r_98 = (runtime.setLine(149), _let_node_reg_count47());
let _reg91 = r_98;
(runtime.setLine(150), _let_node_reg_increment48());
(runtime.setLine(151), _emit36((runtime.setLine(151), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "const r_% = " }), _reg91))));
(runtime.setLine(152), _emit_expr30(_expr90));
(runtime.setLine(153), _emit_let_node33(_pat89, _reg91));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "do" })))) {
(runtime.setLine(155), _enter_scope42());
(runtime.setLine(156), _discover_syms29((runtime.setLine(156), _slice24(_s78, ({ type: "int", value: 1 })))));
(runtime.setLine(157), _emit_exprs28((runtime.setLine(157), _slice24(_s78, ({ type: "int", value: 1 })))));
(runtime.setLine(158), _leave_scope43());
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "for" })))) {
const r_99 = _s78;
const r_100 = r_99.values[0] ?? { type: "null"};
const r_101 = r_99.values[1] ?? { type: "null"};
let _pat92 = r_101;
const r_102 = r_99.values[2] ?? { type: "null"};
let _expr93 = r_102;
const r_103 = r_99.values[3] ?? { type: "null"};
let _body94 = r_103;
const r_104 = (runtime.setLine(162), _let_node_reg_count47());
let _reg95 = r_104;
(runtime.setLine(163), _let_node_reg_increment48());
(runtime.setLine(164), _emit36((runtime.setLine(164), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "for (const r_% of " }), _reg95))));
(runtime.setLine(165), _emit_expr30(_expr93));
(runtime.setLine(166), _emit36(({ type: "string", value: ".values) {" })));
(runtime.setLine(168), _enter_scope42());
(runtime.setLine(169), _emit_let_node33(_pat92, _reg95));
(runtime.setLine(170), _enter_scope42());
(runtime.setLine(172), _emit36(({ type: "string", value: ";\n" })));
(runtime.setLine(173), _emit_expr30(_body94));
(runtime.setLine(174), _emit36(({ type: "string", value: "}" })));
(runtime.setLine(176), _leave_scope43());
(runtime.setLine(177), _leave_scope43());
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "loop" })))) {
const r_105 = _s78;
const r_106 = r_105.values[0] ?? { type: "null"};
const r_107 = r_105.values[1] ?? { type: "null"};
let _body96 = r_107;
(runtime.setLine(180), _emit36(({ type: "string", value: "while (true) {\n" })));
(runtime.setLine(181), _emit_expr30(_body96));
(runtime.setLine(182), _emit36(({ type: "string", value: "}" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "if" })))) {
const r_108 = _s78;
const r_109 = r_108.values[0] ?? { type: "null"};
const r_110 = r_108.values[1] ?? { type: "null"};
let _cond97 = r_110;
const r_111 = r_108.values[2] ?? { type: "null"};
let _truthy98 = r_111;
const r_112 = r_108.values[3] ?? { type: "null"};
let _falsy99 = r_112;
(runtime.setLine(185), _emit36(({ type: "string", value: "if (runtime.truthy(" })));
(runtime.setLine(186), _emit_expr30(_cond97));
(runtime.setLine(187), _emit36(({ type: "string", value: ")) {\n" })));
(runtime.setLine(188), _emit_expr30(_truthy98));
(runtime.setLine(189), _emit36(({ type: "string", value: "}" })));
if (runtime.truthy(runtime.opNe(_falsy99, ({ type: "null" })))) {
(runtime.setLine(191), _emit36(({ type: "string", value: " else {\n" })));
(runtime.setLine(192), _emit_expr30(_falsy99));
(runtime.setLine(193), _emit36(({ type: "string", value: "}" })));
};
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "return" })))) {
const r_113 = _s78;
const r_114 = r_113.values[0] ?? { type: "null"};
const r_115 = r_113.values[1] ?? { type: "null"};
let _value100 = r_115;
(runtime.setLine(197), _emit36(({ type: "string", value: "runtime.popCall();\n" })));
(runtime.setLine(198), _emit36(({ type: "string", value: "return " })));
if (runtime.truthy(runtime.opNe(_value100, ({ type: "null" })))) {
(runtime.setLine(200), _emit_expr30(_value100));
} else {
(runtime.setLine(202), _emit36(({ type: "string", value: "{ type: \"null\" }" })));
};
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "break" })))) {
const r_116 = _s78;
const r_117 = r_116.values[0] ?? { type: "null"};
const r_118 = r_116.values[1] ?? { type: "null"};
let _value101 = r_118;
(runtime.setLine(206), _emit36(({ type: "string", value: "break" })));
if (runtime.truthy(runtime.opNe(_value101, ({ type: "null" })))) {
(runtime.setLine(208), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
};
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "call" })))) {
const r_119 = _s78;
const r_120 = r_119.values[0] ?? { type: "null"};
const r_121 = r_119.values[1] ?? { type: "null"};
let _callee102 = r_121;
const r_122 = (runtime.setLine(212), _slice24(_s78, ({ type: "int", value: 2 })));
let _args103 = r_122;
(runtime.setLine(213), _emit36((runtime.setLine(213), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line77))));
(runtime.setLine(214), _emit_expr30(_callee102));
(runtime.setLine(215), _emit36(({ type: "string", value: "(" })));
const r_123 = ({ type: "bool", value: true });
let _first104 = r_123;
for (const r_124 of _args103.values) {;
let _arg105 = r_124;
if (runtime.truthy(runtime.opNot(_first104))) {
(runtime.setLine(220), _emit36(({ type: "string", value: ", " })));
};
(_first104 = ({ type: "bool", value: false }));
(runtime.setLine(224), _emit_expr30(_arg105));
};
(runtime.setLine(227), _emit36(({ type: "string", value: "))" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "list" })))) {
(runtime.setLine(229), _emit_list_literal32((runtime.setLine(229), _slice24(_s78, ({ type: "int", value: 1 })))));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "=" })))) {
(runtime.setLine(231), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "=" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "+=" })))) {
(runtime.setLine(233), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "+" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "-=" })))) {
(runtime.setLine(235), _emit_assign_expr35(_s78, _line77, ({ type: "string", value: "-" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "or" })))) {
const r_125 = _s78;
const r_126 = r_125.values[0] ?? { type: "null"};
const r_127 = r_125.values[1] ?? { type: "null"};
let _left106 = r_127;
const r_128 = r_125.values[2] ?? { type: "null"};
let _right107 = r_128;
(runtime.setLine(238), _emit36((runtime.setLine(238), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77))));
(runtime.setLine(239), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" })));
(runtime.setLine(240), _emit_expr30(_left106));
(runtime.setLine(241), _emit36(({ type: "string", value: ") || runtime.truthy(" })));
(runtime.setLine(242), _emit_expr30(_right107));
(runtime.setLine(243), _emit36(({ type: "string", value: ") })" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "and" })))) {
const r_129 = _s78;
const r_130 = r_129.values[0] ?? { type: "null"};
const r_131 = r_129.values[1] ?? { type: "null"};
let _left108 = r_131;
const r_132 = r_129.values[2] ?? { type: "null"};
let _right109 = r_132;
(runtime.setLine(246), _emit36((runtime.setLine(246), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line77))));
(runtime.setLine(247), _emit36(({ type: "string", value: ", { type: \"bool\", value: runtime.truthy(" })));
(runtime.setLine(248), _emit_expr30(_left108));
(runtime.setLine(249), _emit36(({ type: "string", value: ") && runtime.truthy(" })));
(runtime.setLine(250), _emit_expr30(_right109));
(runtime.setLine(251), _emit36(({ type: "string", value: ") })" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "==" })))) {
(runtime.setLine(253), _emit_binary_op34(_s78, ({ type: "string", value: "opEq" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "!=" })))) {
(runtime.setLine(255), _emit_binary_op34(_s78, ({ type: "string", value: "opNe" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "<" })))) {
(runtime.setLine(257), _emit_binary_op34(_s78, ({ type: "string", value: "opLt" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: ">" })))) {
(runtime.setLine(259), _emit_binary_op34(_s78, ({ type: "string", value: "opGt" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "<=" })))) {
(runtime.setLine(261), _emit_binary_op34(_s78, ({ type: "string", value: "opLte" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: ">=" })))) {
(runtime.setLine(263), _emit_binary_op34(_s78, ({ type: "string", value: "opGte" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "+" })))) {
(runtime.setLine(265), _emit_binary_op34(_s78, ({ type: "string", value: "opAdd" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "-" })))) {
(runtime.setLine(267), _emit_binary_op34(_s78, ({ type: "string", value: "opSub" })));
} else {
if (runtime.truthy(runtime.opEq(_id80, ({ type: "string", value: "not" })))) {
const r_133 = _s78;
const r_134 = r_133.values[0] ?? { type: "null"};
const r_135 = r_133.values[1] ?? { type: "null"};
let _expr110 = r_135;
(runtime.setLine(270), _emit36(({ type: "string", value: "runtime.opNot(" })));
(runtime.setLine(271), _emit_expr30(_expr110));
(runtime.setLine(272), _emit36(({ type: "string", value: ")" })));
} else {
const r_136 = _s78;
const r_137 = r_136.values[0] ?? { type: "null"};
let _callee111 = r_137;
const r_138 = (runtime.setLine(275), _slice24(_s78, ({ type: "int", value: 1 })));
let _args112 = r_138;
(runtime.setLine(276), _emit36((runtime.setLine(276), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line77))));
(runtime.setLine(277), _emit_expr30(_callee111));
(runtime.setLine(278), _emit36(({ type: "string", value: "(" })));
const r_139 = ({ type: "bool", value: true });
let _first113 = r_139;
for (const r_140 of _args112.values) {;
let _arg114 = r_140;
if (runtime.truthy(runtime.opNot(_first113))) {
(runtime.setLine(283), _emit36(({ type: "string", value: ", " })));
};
(_first113 = ({ type: "bool", value: false }));
(runtime.setLine(287), _emit_expr30(_arg114));
};
(runtime.setLine(290), _emit36(({ type: "string", value: "))" })));
}}}}}}}}}}}}}}}}}}}}}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_list_literal32(_s115) {
runtime.pushCall("emit_list_literal");
(runtime.setLine(295), _emit36(({ type: "string", value: "({ type: \"list\", values: [" })));
const r_141 = ({ type: "bool", value: true });
let _first116 = r_141;
for (const r_142 of _s115.values) {;
let _e117 = r_142;
if (runtime.truthy(runtime.opNot(_first116))) {
(runtime.setLine(299), _emit36(({ type: "string", value: ", " })));
};
(_first116 = ({ type: "bool", value: false }));
(runtime.setLine(303), _emit_expr30(_e117));
};
(runtime.setLine(305), _emit36(({ type: "string", value: "] })" })));
;
runtime.popCall();
return { type: "null" };
};
function _emit_let_node33(_pat118, _base_reg119) {
runtime.pushCall("emit_let_node");
const r_143 = _pat118;
const r_144 = r_143.values[0] ?? { type: "null"};
let _pat_ty120 = r_144;
const r_145 = r_143.values[1] ?? { type: "null"};
let _line121 = r_145;
if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "ident" })))) {
const r_146 = _pat118;
const r_147 = r_146.values[0] ?? { type: "null"};
const r_148 = r_146.values[1] ?? { type: "null"};
const r_149 = r_146.values[2] ?? { type: "null"};
let _ident122 = r_149;
if (runtime.truthy(runtime.opEq(_ident122, ({ type: "string", value: "_" })))) {
runtime.popCall();
return { type: "null" }};
const r_150 = (runtime.setLine(315), _define_let40(_ident122, _line121));
let _sym_id123 = r_150;
(runtime.setLine(316), _emit36((runtime.setLine(316), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _%% = r_%" }), _ident122, _sym_id123, _base_reg119))));
} else {
if (runtime.truthy(runtime.opEq(_pat_ty120, ({ type: "string", value: "list" })))) {
const r_151 = _pat118;
const r_152 = r_151.values[0] ?? { type: "null"};
const r_153 = r_151.values[1] ?? { type: "null"};
const r_154 = r_151.values[2] ?? { type: "null"};
let _pats124 = r_154;
const r_155 = ({ type: "int", value: 0 });
let _i125 = r_155;
for (const r_156 of _pats124.values) {;
let _pat126 = r_156;
const r_157 = (runtime.setLine(322), _let_node_reg_count47());
let _reg127 = r_157;
(runtime.setLine(323), _let_node_reg_increment48());
(runtime.setLine(324), _emit36((runtime.setLine(324), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nconst r_% = r_%.values[%] ?? { type: \"null\"}" }), _reg127, _base_reg119, _i125))));
(runtime.setLine(328), _emit_let_node33(_pat126, _reg127));
(_i125 = runtime.opAdd(_i125, ({ type: "int", value: 1 })));
};
} else {
(runtime.setLine(332), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line121));
}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_binary_op34(_s128, _id129) {
runtime.pushCall("emit_binary_op");
const r_158 = _s128;
const r_159 = r_158.values[0] ?? { type: "null"};
const r_160 = r_158.values[1] ?? { type: "null"};
let _left130 = r_160;
const r_161 = r_158.values[2] ?? { type: "null"};
let _right131 = r_161;
(runtime.setLine(338), _emit36((runtime.setLine(338), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id129))));
(runtime.setLine(339), _emit_expr30(_left130));
(runtime.setLine(340), _emit36(({ type: "string", value: ", " })));
(runtime.setLine(341), _emit_expr30(_right131));
(runtime.setLine(342), _emit36(({ type: "string", value: ")" })));
;
runtime.popCall();
return { type: "null" };
};
function _emit_assign_expr35(_s132, _line133, _id134) {
runtime.pushCall("emit_assign_expr");
const r_162 = _s132;
const r_163 = r_162.values[0] ?? { type: "null"};
const r_164 = r_162.values[1] ?? { type: "null"};
const r_165 = r_164.values[0] ?? { type: "null"};
let _target_type135 = r_165;
const r_166 = r_162.values[2] ?? { type: "null"};
let _expr136 = r_166;
if (runtime.truthy(runtime.opNe(_target_type135, ({ type: "string", value: "ident" })))) {
(runtime.setLine(348), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line133));
};
const r_167 = _s132;
const r_168 = r_167.values[0] ?? { type: "null"};
const r_169 = r_167.values[1] ?? { type: "null"};
const r_170 = r_169.values[0] ?? { type: "null"};
const r_171 = r_169.values[1] ?? { type: "null"};
const r_172 = r_169.values[2] ?? { type: "null"};
let _ident137 = r_172;
const r_173 = (runtime.setLine(351), _get_sym45(_ident137));
let _sym138 = r_173;
if (runtime.truthy(runtime.opEq(_sym138, ({ type: "null" })))) {
(runtime.setLine(353), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident137, _line133));
};
const r_174 = _sym138;
const r_175 = r_174.values[0] ?? { type: "null"};
let _sym_id139 = r_175;
const r_176 = r_174.values[1] ?? { type: "null"};
let _sym_type140 = r_176;
const r_177 = r_174.values[2] ?? { type: "null"};
let _sym_ident141 = r_177;
const r_178 = r_174.values[3] ?? { type: "null"};
if (runtime.truthy(runtime.opEq(_sym_type140, ({ type: "string", value: "let" })))) {
(runtime.setLine(357), _emit36((runtime.setLine(357), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_%% = " }), _sym_ident141, _sym_id139))));
if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "=" })))) {
(runtime.setLine(359), _emit_expr30(_expr136));
} else {
if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "+" })))) {
(runtime.setLine(361), _emit36((runtime.setLine(361), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%%, " }), _sym_ident141, _sym_id139))));
(runtime.setLine(362), _emit_expr30(_expr136));
(runtime.setLine(363), _emit36(({ type: "string", value: ")" })));
} else {
if (runtime.truthy(runtime.opEq(_id134, ({ type: "string", value: "-" })))) {
(runtime.setLine(365), _emit36((runtime.setLine(365), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%%, " }), _sym_ident141, _sym_id139))));
(runtime.setLine(366), _emit_expr30(_expr136));
(runtime.setLine(367), _emit36(({ type: "string", value: ")" })));
} else {
(runtime.setLine(369), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
}}};
(runtime.setLine(371), _emit36(({ type: "string", value: ")" })));
} else {
(runtime.setLine(373), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident141, _line133));
};
;
runtime.popCall();
return { type: "null" };
};
function _emit36(_str142) {
runtime.pushCall("emit");
(runtime.setLine(378), ((...args) => runtime.builtinPush(...args))(_output41, _str142));
;
runtime.popCall();
return { type: "null" };
};
function _define_builtin37(_ident143, _builtin_id144) {
runtime.pushCall("define_builtin");
const r_179 = (runtime.setLine(382), _sym_id_count49());
let _sym_id145 = r_179;
(runtime.setLine(383), _sym_id_increment50());
(runtime.setLine(385), _define_sym44(_ident143, ({ type: "list", values: [_sym_id145, ({ type: "string", value: "builtin" }), _builtin_id144] })));
runtime.popCall();
return _sym_id145;
;
runtime.popCall();
return { type: "null" };
};
function _define_fn38(_ident146, _line147) {
runtime.pushCall("define_fn");
const r_180 = (runtime.setLine(390), _sym_id_count49());
let _sym_id148 = r_180;
(runtime.setLine(391), _sym_id_increment50());
(runtime.setLine(393), _define_sym44(_ident146, ({ type: "list", values: [_sym_id148, ({ type: "string", value: "fn" }), _ident146, _line147] })));
runtime.popCall();
return _sym_id148;
;
runtime.popCall();
return { type: "null" };
};
function _define_param39(_ident149, _line150) {
runtime.pushCall("define_param");
const r_181 = (runtime.setLine(398), _sym_id_count49());
let _sym_id151 = r_181;
(runtime.setLine(399), _sym_id_increment50());
(runtime.setLine(401), _define_sym44(_ident149, ({ type: "list", values: [_sym_id151, ({ type: "string", value: "param" }), _ident149, _line150] })));
runtime.popCall();
return _sym_id151;
;
runtime.popCall();
return { type: "null" };
};
function _define_let40(_ident152, _line153) {
runtime.pushCall("define_let");
const r_182 = (runtime.setLine(406), _sym_id_count49());
let _sym_id154 = r_182;
(runtime.setLine(407), _sym_id_increment50());
(runtime.setLine(409), _define_sym44(_ident152, ({ type: "list", values: [_sym_id154, ({ type: "string", value: "let" }), _ident152, _line153] })));
runtime.popCall();
return _sym_id154;
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_generate27] });
;
runtime.popCall();
return { type: "null" };
};
function _Counter15() {
runtime.pushCall("Counter");
const r_183 = ({ type: "int", value: 0 });
let _counter157 = r_183;
function _count155() {
runtime.pushCall("count");
runtime.popCall();
return _counter157;
;
runtime.popCall();
return { type: "null" };
};
function _increment156() {
runtime.pushCall("increment");
(_counter157 = runtime.opAdd(_counter157, ({ type: "int", value: 1 })));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_count155, _increment156] });
;
runtime.popCall();
return { type: "null" };
};
function _Syms16() {
runtime.pushCall("Syms");
const r_184 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] });
let _syms165 = r_184;
function _enter_scope158() {
runtime.pushCall("enter_scope");
(_syms165 = ({ type: "list", values: [_syms165, ({ type: "list", values: [] })] }));
;
runtime.popCall();
return { type: "null" };
};
function _leave_scope159() {
runtime.pushCall("leave_scope");
const r_185 = _syms165;
const r_186 = r_185.values[0] ?? { type: "null"};
let _parent166 = r_186;
const r_187 = r_185.values[1] ?? { type: "null"};
(_syms165 = _parent166);
;
runtime.popCall();
return { type: "null" };
};
function _define160(_ident167, _sym168) {
runtime.pushCall("define");
const r_188 = _syms165;
const r_189 = r_188.values[0] ?? { type: "null"};
const r_190 = r_188.values[1] ?? { type: "null"};
let _map169 = r_190;
const r_191 = ({ type: "int", value: 0 });
let _i170 = r_191;
while (true) {
if (runtime.truthy(runtime.opGte(_i170, (runtime.setLine(446), ((...args) => runtime.builtinLen(...args))(_map169))))) {
break};
const r_192 = (runtime.setLine(447), ((...args) => runtime.builtinAt(...args))(_map169, _i170));
const r_193 = r_192.values[0] ?? { type: "null"};
let _s_ident171 = r_193;
const r_194 = r_192.values[1] ?? { type: "null"};
if (runtime.truthy(runtime.opEq(_ident167, _s_ident171))) {
(runtime.setLine(449), ((...args) => runtime.builtinSet(...args))(_map169, _i170, ({ type: "list", values: [_ident167, _sym168] })));
runtime.popCall();
return { type: "null" };
};
(_i170 = runtime.opAdd(_i170, ({ type: "int", value: 1 })));
};
(runtime.setLine(454), ((...args) => runtime.builtinPush(...args))(_map169, ({ type: "list", values: [_ident167, _sym168] })));
;
runtime.popCall();
return { type: "null" };
};
function _find_sym161(_syms172, _ident173) {
runtime.pushCall("find_sym");
const r_195 = _syms172;
const r_196 = r_195.values[0] ?? { type: "null"};
let _parent174 = r_196;
const r_197 = r_195.values[1] ?? { type: "null"};
let _map175 = r_197;
const r_198 = ({ type: "int", value: 0 });
let _i176 = r_198;
while (true) {
if (runtime.truthy(runtime.opGte(_i176, (runtime.setLine(461), ((...args) => runtime.builtinLen(...args))(_map175))))) {
break};
const r_199 = (runtime.setLine(462), ((...args) => runtime.builtinAt(...args))(_map175, _i176));
const r_200 = r_199.values[0] ?? { type: "null"};
let _s_ident177 = r_200;
const r_201 = r_199.values[1] ?? { type: "null"};
let _s_sym178 = r_201;
if (runtime.truthy(runtime.opEq(_ident173, _s_ident177))) {
runtime.popCall();
return _s_sym178;
};
(_i176 = runtime.opAdd(_i176, ({ type: "int", value: 1 })));
};
if (runtime.truthy(runtime.opNe(_parent174, ({ type: "null" })))) {
runtime.popCall();
return (runtime.setLine(469), _find_sym161(_parent174, _ident173));
};
runtime.popCall();
return ({ type: "null" });
;
runtime.popCall();
return { type: "null" };
};
function _get162(_ident179) {
runtime.pushCall("get");
runtime.popCall();
return (runtime.setLine(475), _find_sym161(_syms165, _ident179));
;
runtime.popCall();
return { type: "null" };
};
function _print_syms_node163(_syms180, _depth181) {
runtime.pushCall("print_syms_node");
const r_202 = _syms180;
const r_203 = r_202.values[0] ?? { type: "null"};
let _parent182 = r_203;
const r_204 = r_202.values[1] ?? { type: "null"};
let _map183 = r_204;
for (const r_205 of _map183.values) {;
const r_206 = r_205.values[0] ?? { type: "null"};
let _ident184 = r_206;
const r_207 = r_205.values[1] ?? { type: "null"};
let _sym185 = r_207;
(runtime.setLine(481), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(481), _indent23(_depth181)), _ident184, _sym185));
};
if (runtime.truthy(runtime.opNe(_parent182, ({ type: "null" })))) {
(runtime.setLine(484), _print_syms_node163(_parent182, runtime.opAdd(_depth181, ({ type: "int", value: 1 }))));
};
;
runtime.popCall();
return { type: "null" };
};
function _print_syms164() {
runtime.pushCall("print_syms");
(runtime.setLine(489), _print_syms_node163(_syms165, ({ type: "int", value: 0 })));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_enter_scope158, _leave_scope159, _define160, _get162, _print_syms164] });
;
runtime.popCall();
return { type: "null" };
};
function _string_escape17(_str186) {
runtime.pushCall("string_escape");
const r_208 = (runtime.setLine(503), ((...args) => runtime.builtinLen(...args))(_str186));
let _str_len187 = r_208;
const r_209 = ({ type: "int", value: 0 });
let _i188 = r_209;
const r_210 = ({ type: "string", value: "" });
let _result189 = r_210;
while (true) {
if (runtime.truthy(runtime.opGte(_i188, _str_len187))) {
break};
const r_211 = (runtime.setLine(508), ((...args) => runtime.builtinAt(...args))(_str186, _i188));
let _ch190 = r_211;
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\\" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\\" })));
} else {
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\"" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\\"" })));
} else {
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\t" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\t" })));
} else {
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\r" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\r" })));
} else {
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\n" })));
} else {
if (runtime.truthy(runtime.opEq(_ch190, ({ type: "string", value: "\n" })))) {
(_result189 = runtime.opAdd(_result189, ({ type: "string", value: "\\0" })));
} else {
(_result189 = runtime.opAdd(_result189, _ch190));
}}}}}};
(_i188 = runtime.opAdd(_i188, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _result189;
;
runtime.popCall();
return { type: "null" };
};
function _Parser18(_tokens191) {
runtime.pushCall("Parser");
const r_212 = ({ type: "int", value: 0 });
let _i198 = r_212;
const r_213 = (runtime.setLine(531), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198));
let _tok199 = r_213;
function _parse192() {
runtime.pushCall("parse");
const r_214 = ({ type: "list", values: [] });
let _exprs200 = r_214;
while (true) {
if (runtime.truthy((runtime.setLine(536), _done197()))) {
break};
(runtime.setLine(537), ((...args) => runtime.builtinPush(...args))(_exprs200, (runtime.setLine(537), _parse_expr193())));
};
runtime.popCall();
return _exprs200;
;
runtime.popCall();
return { type: "null" };
};
function _parse_expr193() {
runtime.pushCall("parse_expr");
const r_215 = _tok199;
const r_216 = r_215.values[0] ?? { type: "null"};
let _ty201 = r_216;
const r_217 = r_215.values[1] ?? { type: "null"};
let _line202 = r_217;
const r_218 = r_215.values[2] ?? { type: "null"};
let _value203 = r_218;
if (runtime.truthy((runtime.setLine(544), _eat194(({ type: "string", value: "(" }))))) {
const r_219 = ({ type: "list", values: [] });
let _values204 = r_219;
while (true) {
if (runtime.truthy((runtime.setLine(547), _test196(({ type: "string", value: ")" }))))) {
break};
(runtime.setLine(548), ((...args) => runtime.builtinPush(...args))(_values204, (runtime.setLine(548), _parse_expr193())));
};
if (runtime.truthy(runtime.opNot((runtime.setLine(550), _eat194(({ type: "string", value: ")" })))))) {
(runtime.setLine(551), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(551), ((...args) => runtime.builtinAt(...args))(_tok199, ({ type: "int", value: 1 })))));
};
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "list" }), _line202, _values204] });
} else {
if (runtime.truthy((runtime.setLine(554), _eat194(({ type: "string", value: "string" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "string" }), _line202, _value203] });
} else {
if (runtime.truthy((runtime.setLine(556), _eat194(({ type: "string", value: "int" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "int" }), _line202, (runtime.setLine(557), ((...args) => runtime.builtinStringToInt(...args))(_value203))] });
} else {
if (runtime.truthy((runtime.setLine(558), _eat194(({ type: "string", value: "ident" }))))) {
runtime.popCall();
return ({ type: "list", values: [({ type: "string", value: "ident" }), _line202, _value203] });
} else {
(runtime.setLine(561), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty201, _line202));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _eat194(_pat205) {
runtime.pushCall("eat");
if (runtime.truthy(runtime.opNot((runtime.setLine(566), _test196(_pat205))))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(runtime.setLine(567), _step195());
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _step195() {
runtime.pushCall("step");
(_i198 = runtime.opAdd(_i198, ({ type: "int", value: 1 })));
if (runtime.truthy(runtime.opNot((runtime.setLine(573), _done197())))) {
const r_220 = (runtime.setLine(574), ((...args) => runtime.builtinAt(...args))(_tokens191, _i198));
let _new_tok206 = r_220;
(_tok199 = _new_tok206);
};
;
runtime.popCall();
return { type: "null" };
};
function _test196(_pat207) {
runtime.pushCall("test");
if (runtime.truthy((runtime.setLine(580), _done197()))) {
runtime.popCall();
return ({ type: "bool", value: false })};
const r_221 = _tok199;
const r_222 = r_221.values[0] ?? { type: "null"};
let _ty208 = r_222;
runtime.popCall();
return runtime.opEq(_pat207, _ty208);
;
runtime.popCall();
return { type: "null" };
};
function _done197() {
runtime.pushCall("done");
runtime.popCall();
return runtime.opGte(_i198, (runtime.setLine(586), ((...args) => runtime.builtinLen(...args))(_tokens191)));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_parse192] });
;
runtime.popCall();
return { type: "null" };
};
function _tokenize19(_text209) {
runtime.pushCall("tokenize");
const r_223 = (runtime.setLine(593), ((...args) => runtime.builtinLen(...args))(_text209));
let _text_len210 = r_223;
const r_224 = ({ type: "list", values: [] });
let _tokens211 = r_224;
const r_225 = ({ type: "int", value: 0 });
let _i212 = r_225;
const r_226 = ({ type: "int", value: 1 });
let _line213 = r_226;
const r_227 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" }));
let _ident_chars214 = r_227;
while (true) {
if (runtime.truthy(runtime.opGte(_i212, _text_len210))) {
break};
const r_228 = (runtime.setLine(605), ((...args) => runtime.builtinAt(...args))(_text209, _i212));
let _ch215 = r_228;
if (runtime.truthy((runtime.setLine(607), _contains20(({ type: "string", value: " \t\r\n" }), _ch215)))) {
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\n" })))) {
(_line213 = runtime.opAdd(_line213, ({ type: "int", value: 1 })));
};
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
} else {
if (runtime.truthy((runtime.setLine(612), _slice_eq21(_text209, _i212, ({ type: "string", value: "//" }))))) {
while (true) {
if (runtime.truthy((runtime.setLine(614), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq((runtime.setLine(614), ((...args) => runtime.builtinAt(...args))(_text209, _i212)), ({ type: "string", value: "\n" }))) }))) {
break;
};
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
};
} else {
if (runtime.truthy((runtime.setLine(619), _contains20(({ type: "string", value: "()" }), _ch215)))) {
(runtime.setLine(620), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [_ch215, _line213] })));
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
} else {
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" })))) {
const r_229 = ({ type: "string", value: "" });
let _value216 = r_229;
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
(_ch215 = (runtime.setLine(625), ((...args) => runtime.builtinAt(...args))(_text209, _i212)));
while (true) {
if (runtime.truthy((runtime.setLine(627), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\"" }))) }))) {
break;
};
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "\\" })))) {
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
if (runtime.truthy(runtime.opGte(_i212, _text_len210))) {
break;
};
(_ch215 = (runtime.setLine(635), ((...args) => runtime.builtinAt(...args))(_text209, _i212)));
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "t" })))) {
(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\t" })));
} else {
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "r" })))) {
(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\r" })));
} else {
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "n" })))) {
(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" })));
} else {
if (runtime.truthy(runtime.opEq(_ch215, ({ type: "string", value: "0" })))) {
(_value216 = runtime.opAdd(_value216, ({ type: "string", value: "\n" })));
} else {
(_value216 = runtime.opAdd(_value216, _ch215));
}}}};
} else {
(_value216 = runtime.opAdd(_value216, _ch215));
};
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
(_ch215 = (runtime.setLine(651), ((...args) => runtime.builtinAt(...args))(_text209, _i212)));
};
if (runtime.truthy((runtime.setLine(653), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNe(_ch215, ({ type: "string", value: "\"" }))) }))) {
(runtime.setLine(654), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line213));
};
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
(runtime.setLine(657), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "string" }), _line213, _value216] })));
} else {
if (runtime.truthy((runtime.setLine(658), _contains20(({ type: "string", value: "0123456789" }), _ch215)))) {
const r_230 = ({ type: "string", value: "" });
let _value217 = r_230;
while (true) {
(_ch215 = (runtime.setLine(661), ((...args) => runtime.builtinAt(...args))(_text209, _i212)));
if (runtime.truthy((runtime.setLine(662), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(662), _contains20(({ type: "string", value: "0123456789" }), _ch215)))) }))) {
break;
};
(_value217 = runtime.opAdd(_value217, _ch215));
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
};
(runtime.setLine(668), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "int" }), _line213, _value217] })));
} else {
if (runtime.truthy((runtime.setLine(669), _contains20(_ident_chars214, _ch215)))) {
const r_231 = ({ type: "string", value: "" });
let _value218 = r_231;
while (true) {
(_ch215 = (runtime.setLine(672), ((...args) => runtime.builtinAt(...args))(_text209, _i212)));
if (runtime.truthy((runtime.setLine(673), { type: "bool", value: runtime.truthy(runtime.opGte(_i212, _text_len210)) || runtime.truthy(runtime.opNot((runtime.setLine(673), _contains20(_ident_chars214, _ch215)))) }))) {
break;
};
(_value218 = runtime.opAdd(_value218, _ch215));
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
};
(runtime.setLine(679), ((...args) => runtime.builtinPush(...args))(_tokens211, ({ type: "list", values: [({ type: "string", value: "ident" }), _line213, _value218] })));
} else {
(runtime.setLine(681), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch215));
(_i212 = runtime.opAdd(_i212, ({ type: "int", value: 1 })));
}}}}}};
};
runtime.popCall();
return _tokens211;
;
runtime.popCall();
return { type: "null" };
};
function _contains20(_text219, _ch220) {
runtime.pushCall("contains");
const r_232 = (runtime.setLine(689), ((...args) => runtime.builtinLen(...args))(_text219));
let _text_len221 = r_232;
const r_233 = ({ type: "int", value: 0 });
let _i222 = r_233;
while (true) {
if (runtime.truthy(runtime.opGte(_i222, _text_len221))) {
break};
if (runtime.truthy(runtime.opEq((runtime.setLine(693), ((...args) => runtime.builtinAt(...args))(_text219, _i222)), _ch220))) {
runtime.popCall();
return ({ type: "bool", value: true });
};
(_i222 = runtime.opAdd(_i222, ({ type: "int", value: 1 })));
};
runtime.popCall();
return ({ type: "bool", value: false });
;
runtime.popCall();
return { type: "null" };
};
function _slice_eq21(_str223, _slice_idx224, _substr225) {
runtime.pushCall("slice_eq");
const r_234 = (runtime.setLine(702), ((...args) => runtime.builtinLen(...args))(_str223));
let _str_len226 = r_234;
const r_235 = (runtime.setLine(703), ((...args) => runtime.builtinLen(...args))(_substr225));
let _substr_len227 = r_235;
const r_236 = ({ type: "int", value: 0 });
let _i228 = r_236;
while (true) {
if (runtime.truthy(runtime.opGte(_i228, _substr_len227))) {
runtime.popCall();
return ({ type: "bool", value: true })};
if (runtime.truthy(runtime.opGte(runtime.opAdd(_slice_idx224, _i228), _str_len226))) {
runtime.popCall();
return ({ type: "bool", value: false })};
if (runtime.truthy(runtime.opNe((runtime.setLine(710), ((...args) => runtime.builtinAt(...args))(_str223, runtime.opAdd(_slice_idx224, _i228))), (runtime.setLine(710), ((...args) => runtime.builtinAt(...args))(_substr225, _i228))))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(_i228 = runtime.opAdd(_i228, ({ type: "int", value: 1 })));
};
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _print_expr22(_expr229, _depth230) {
runtime.pushCall("print_expr");
const r_237 = _expr229;
const r_238 = r_237.values[0] ?? { type: "null"};
let _ty231 = r_238;
const r_239 = r_237.values[1] ?? { type: "null"};
let _line232 = r_239;
const r_240 = r_237.values[2] ?? { type: "null"};
let _value233 = r_240;
if (runtime.truthy(runtime.opEq(_ty231, ({ type: "string", value: "list" })))) {
(runtime.setLine(720), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(720), _indent23(_depth230)), _ty231, _line232));
for (const r_241 of _value233.values) {;
let _e234 = r_241;
(runtime.setLine(722), _print_expr22(_e234, runtime.opAdd(_depth230, ({ type: "int", value: 1 }))));
};
(runtime.setLine(724), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(724), _indent23(_depth230))));
} else {
(runtime.setLine(726), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(726), _indent23(_depth230)), _expr229));
};
;
runtime.popCall();
return { type: "null" };
};
function _indent23(_depth235) {
runtime.pushCall("indent");
const r_242 = ({ type: "string", value: "" });
let _space236 = r_242;
const r_243 = ({ type: "int", value: 0 });
let _i237 = r_243;
while (true) {
if (runtime.truthy(runtime.opGte(_i237, _depth235))) {
break};
(_space236 = runtime.opAdd(_space236, ({ type: "string", value: " " })));
(_i237 = runtime.opAdd(_i237, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _space236;
;
runtime.popCall();
return { type: "null" };
};
function _slice24(_list238, _idx239) {
runtime.pushCall("slice");
const r_244 = (runtime.setLine(742), ((...args) => runtime.builtinLen(...args))(_list238));
let _list_len240 = r_244;
const r_245 = ({ type: "list", values: [] });
let _elems241 = r_245;
const r_246 = _idx239;
let _i242 = r_246;
while (true) {
if (runtime.truthy(runtime.opGte(_i242, _list_len240))) {
break};
(runtime.setLine(747), ((...args) => runtime.builtinPush(...args))(_elems241, (runtime.setLine(747), ((...args) => runtime.builtinAt(...args))(_list238, _i242))));
(_i242 = runtime.opAdd(_i242, ({ type: "int", value: 1 })));
};
runtime.popCall();
return _elems241;
;
runtime.popCall();
return { type: "null" };
};
const r_247 = ({ type: "bool", value: false });
let _silent243 = r_247;
const r_248 = (runtime.setLine(755), ((...args) => runtime.builtinGetArgs(...args))());
const r_249 = r_248.values[0] ?? { type: "null"};
let _input_filename244 = r_249;
const r_250 = r_248.values[1] ?? { type: "null"};
let _output_filename245 = r_250;
if (runtime.truthy(runtime.opNot(_silent243))) {
(runtime.setLine(757), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file '%'..." }), _input_filename244))};
const r_251 = (runtime.setLine(758), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename244));
let _text246 = r_251;
if (runtime.truthy(runtime.opNot(_silent243))) {
(runtime.setLine(764), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))};
const r_252 = (runtime.setLine(765), _tokenize19(_text246));
let _tokens247 = r_252;
if (runtime.truthy(runtime.opNot(_silent243))) {
(runtime.setLine(778), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))};
const r_253 = (runtime.setLine(779), _Parser18(_tokens247));
let _parser248 = r_253;
const r_254 = _parser248;
const r_255 = r_254.values[0] ?? { type: "null"};
let _parse249 = r_255;
const r_256 = (runtime.setLine(781), _parse249());
let _ast250 = r_256;
if (runtime.truthy(runtime.opNot(_silent243))) {
(runtime.setLine(788), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))};
const r_257 = (runtime.setLine(789), _Emitter14(_ast250, _input_filename244));
let _emitter251 = r_257;
const r_258 = _emitter251;
const r_259 = r_258.values[0] ?? { type: "null"};
let _emit252 = r_259;
const r_260 = (runtime.setLine(791), _emit252());
let _js_code253 = r_260;
if (runtime.truthy(runtime.opNot(_silent243))) {
(runtime.setLine(796), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file '%'..." }), _output_filename245))};
(runtime.setLine(797), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename245, _js_code253));