phi-lang/stage1.js
Simon From Jakobsen 4289d04ec3 more compiler stuff
2025-09-22 16:22:03 +02:00

1151 lines
44 KiB
JavaScript

#!/usr/bin/env node
import { Runtime } from "./runtime.js"
const runtime = new Runtime("compile.phi")
function _Emitter(_ast, _filename) {
runtime.pushCall("Emitter");
let r_0 = ({ type: "list", values: [] });
let _output = r_0;
let r_1 = (runtime.setLine(5), _Syms());
let r_2 = r_1.values[0];
let _enter_scope = r_2;
let r_3 = r_1.values[1];
let _leave_scope = r_3;
let r_4 = r_1.values[2];
let _define_sym = r_4;
let r_5 = r_1.values[3];
let _get_sym = r_5;
let r_6 = r_1.values[4];
let _print_syms = r_6;
let r_7 = (runtime.setLine(7), _Counter());
let r_8 = r_7.values[0];
let _let_node_reg_count = r_8;
let r_9 = r_7.values[1];
let _let_node_reg_increment = r_9;
function _generate() {
runtime.pushCall("generate");
(runtime.setLine(10), _emit(({ type: "string", value: "#!/usr/bin/env node\n" })));
(runtime.setLine(11), _emit(({ type: "string", value: "import { Runtime } from \"./runtime.js\"\n" })));
(runtime.setLine(12), _emit(({ type: "string", value: "const runtime = new Runtime(\"" })));
(runtime.setLine(13), _emit(_filename));
(runtime.setLine(14), _emit(({ type: "string", value: "\")\n" })));
(runtime.setLine(15), _discover_syms(_ast));
(runtime.setLine(16), _emit_exprs(_ast));
runtime.popCall();
return (runtime.setLine(17), ((...args) => runtime.builtinStringsJoin(...args))(_output));
;
runtime.popCall();
return { type: "null" };
};
function _emit_exprs(_exprs) {
runtime.pushCall("emit_exprs");
for (let _expr of _exprs.values) {
(runtime.setLine(22), _emit_expr(_expr));
(runtime.setLine(23), _emit(({ type: "string", value: ";\n" })));
};
;
runtime.popCall();
return { type: "null" };
};
function _discover_syms(_exprs) {
runtime.pushCall("discover_syms");
for (let _expr of _exprs.values) {
let r_10 = _expr;
let r_11 = r_10.values[0];
let _ty = r_11;
let r_12 = r_10.values[1];
let _line = r_12;
if (runtime.opNe(_ty, ({ type: "string", value: "list" }))) {
runtime.popCall();
return { type: "null" }};
let r_13 = _expr;
let r_14 = r_13.values[0];
let r_15 = r_13.values[1];
let r_16 = r_13.values[2];
let _s = r_16;
if (runtime.opEq((runtime.setLine(32), ((...args) => runtime.builtinLen(...args))(_s)), ({ type: "int", value: 0 }))) {
runtime.popCall();
return { type: "null" }};
let r_17 = _s;
let r_18 = r_17.values[0];
let r_19 = r_18.values[0];
let r_20 = r_18.values[1];
let r_21 = r_18.values[2];
let _id = r_21;
if (runtime.opEq(_id, ({ type: "string", value: "fn" }))) {
let r_22 = _s;
let r_23 = r_22.values[0];
let r_24 = r_22.values[1];
let r_25 = r_24.values[0];
let r_26 = r_24.values[1];
let r_27 = r_24.values[2];
let _name = r_27;
let r_28 = r_22.values[2];
let r_29 = r_28.values[0];
let r_30 = r_28.values[1];
let r_31 = r_28.values[2];
let _params = r_31;
let r_32 = r_22.values[3];
let _body = r_32;
(runtime.setLine(36), _define_sym(_name, ({ type: "list", values: [] })));
};
};
;
runtime.popCall();
return { type: "null" };
};
function _emit_expr(_expr) {
runtime.pushCall("emit_expr");
let r_33 = _expr;
let r_34 = r_33.values[0];
let _ty = r_34;
let r_35 = r_33.values[1];
let _line = r_35;
if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) {
(runtime.setLine(44), _emit_list(_expr));
} else {
if (runtime.opEq(_ty, ({ type: "string", value: "int" }))) {
({ type: "list", values: [] })} else {
if (runtime.opEq(_ty, ({ type: "string", value: "string" }))) {
({ type: "list", values: [] })} else {
if (runtime.opEq(_ty, ({ type: "string", value: "ident" }))) {
let r_36 = _expr;
let r_37 = r_36.values[0];
let r_38 = r_36.values[1];
let r_39 = r_36.values[2];
let _value = r_39;
if (runtime.opEq(_value, ({ type: "string", value: "null" }))) {
(runtime.setLine(55), _emit(({ type: "string", value: "({ type: \"null\" })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.opEq(_value, ({ type: "string", value: "false" }))) {
(runtime.setLine(58), _emit(({ type: "string", value: "({ type: \"bool\", value: false })" })));
runtime.popCall();
return { type: "null" };
} else {
if (runtime.opEq(_value, ({ type: "string", value: "true" }))) {
(runtime.setLine(61), _emit(({ type: "string", value: "({ type: \"bool\", value: true })" })));
runtime.popCall();
return { type: "null" };
}}};
let r_40 = (runtime.setLine(65), _get_sym(_value));
let _sym = r_40;
if (runtime.opEq(_sym, ({ type: "null" }))) {
(runtime.setLine(67), _print_syms());
(runtime.setLine(68), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "undefined symbol '%' on line %" }), _value, _line));
};
let r_41 = _sym;
let r_42 = r_41.values[0];
let _sym_ty = r_42;
if (runtime.opEq(_sym_ty, ({ type: "string", value: "builtin" }))) {
let r_43 = _sym;
let r_44 = r_43.values[0];
let r_45 = r_43.values[1];
let _id = r_45;
(runtime.setLine(74), _emit((runtime.setLine(74), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "((...args) => runtime.%(...args))" }), _id))));
} else {
if (runtime.opEq(_sym_ty, ({ type: "string", value: "fn" }))) {
(runtime.setLine(76), _emit((runtime.setLine(76), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value))));
} else {
if (runtime.opEq(_sym_ty, ({ type: "string", value: "param" }))) {
(runtime.setLine(78), _emit((runtime.setLine(78), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value))));
} else {
if (runtime.opEq(_sym_ty, ({ type: "string", value: "let" }))) {
(runtime.setLine(80), _emit((runtime.setLine(80), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _value))));
} else {
(runtime.setLine(82), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented '%'" }), _sym_ty));
}}}};
} else {
(runtime.setLine(85), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "unknown expr type '%' on line %" }), _ty, _line));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_list(_expr) {
runtime.pushCall("emit_list");
let r_46 = _expr;
let r_47 = r_46.values[0];
let _ty = r_47;
let r_48 = r_46.values[1];
let _line = r_48;
let r_49 = r_46.values[2];
let _s = r_49;
if (runtime.opEq((runtime.setLine(91), ((...args) => runtime.builtinLen(...args))(_s)), ({ type: "int", value: 0 }))) {
(runtime.setLine(92), _emit(({ type: "string", value: "({ type: \"list\", values: [] })" })));
runtime.popCall();
return { type: "null" };
};
let r_50 = _s;
let r_51 = r_50.values[0];
let r_52 = r_51.values[0];
let _id_ty = r_52;
let r_53 = r_51.values[1];
let r_54 = r_51.values[2];
let _id = r_54;
if (runtime.opNe(_id_ty, ({ type: "string", value: "ident" }))) {
(runtime.setLine(97), _emit(({ type: "string", value: "({ type: \"list\", values: [] })" })));
runtime.popCall();
return { type: "null" };
};
if (runtime.opEq(_id, ({ type: "string", value: "fn" }))) {
let r_55 = _s;
let r_56 = r_55.values[0];
let r_57 = r_55.values[1];
let r_58 = r_57.values[0];
let r_59 = r_57.values[1];
let r_60 = r_57.values[2];
let _name = r_60;
let r_61 = r_55.values[2];
let r_62 = r_61.values[0];
let r_63 = r_61.values[1];
let r_64 = r_61.values[2];
let _params = r_64;
let r_65 = r_55.values[3];
let _body = r_65;
(runtime.setLine(102), _emit((runtime.setLine(102), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "function _%(" }), _name))));
(runtime.setLine(104), _enter_scope());
let r_66 = ({ type: "bool", value: true });
let _first = r_66;
for (let [, , _name] of _params.values) {
if (runtime.opNot(_first)) {
(runtime.setLine(109), _emit(({ type: "string", value: ", " })));
};
(_106 = runtime.assignValue(({ type: "bool", value: false })));
(runtime.setLine(113), _emit((runtime.setLine(113), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _name))));
(runtime.setLine(115), _define_sym(_name, ({ type: "list", values: [] })));
};
(runtime.setLine(119), _emit((runtime.setLine(119), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ") {\n" }), _name))));
(runtime.setLine(120), _emit((runtime.setLine(120), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.pushCall(\"%\");\n" }), _name))));
(runtime.setLine(122), _emit_expr(_body));
(runtime.setLine(123), _emit(({ type: "string", value: ";\nruntime.popCall();\nreturn { type: \"null\" };\n}" })));
(runtime.setLine(125), _leave_scope());
} else {
if (runtime.opEq(_id, ({ type: "string", value: "let" }))) {
let r_67 = _s;
let r_68 = r_67.values[0];
let r_69 = r_67.values[1];
let _pat = r_69;
let r_70 = r_67.values[2];
let _expr = r_70;
let r_71 = (runtime.setLine(128), _let_node_reg_count());
let _reg = r_71;
(runtime.setLine(129), _let_node_reg_increment());
(runtime.setLine(130), _emit((runtime.setLine(130), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "let r_% = " }), _reg))));
(runtime.setLine(131), _emit_expr(_expr));
(runtime.setLine(132), _emit_let_node(_pat, _reg));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "do" }))) {
(runtime.setLine(134), _enter_scope());
(runtime.setLine(135), _discover_syms((runtime.setLine(135), _slice(_s, ({ type: "int", value: 1 })))));
(runtime.setLine(136), _emit_exprs((runtime.setLine(136), _slice(_s, ({ type: "int", value: 1 })))));
(runtime.setLine(137), _leave_scope());
} else {
if (runtime.opEq(_id, ({ type: "string", value: "for" }))) {
let r_72 = _s;
let r_73 = r_72.values[0];
let r_74 = r_72.values[1];
let _pat = r_74;
let r_75 = r_72.values[2];
let _expr = r_75;
let r_76 = r_72.values[3];
let _body = r_76;
(runtime.setLine(140), _enter_scope());
(runtime.setLine(141), _emit(({ type: "string", value: "for (let " })));
(runtime.setLine(142), _emit_pat(_pat));
(runtime.setLine(143), _emit(({ type: "string", value: " of " })));
(runtime.setLine(144), _emit_expr(_expr));
(runtime.setLine(145), _emit(({ type: "string", value: ".values) {\n" })));
(runtime.setLine(146), _emit_expr(_body));
(runtime.setLine(147), _emit(({ type: "string", value: "}" })));
(runtime.setLine(148), _leave_scope());
} else {
if (runtime.opEq(_id, ({ type: "string", value: "loop" }))) {
let r_77 = _s;
let r_78 = r_77.values[0];
let r_79 = r_77.values[1];
let _body = r_79;
(runtime.setLine(151), _emit(({ type: "string", value: "while (true) {\n" })));
(runtime.setLine(152), _emit_expr(_body));
(runtime.setLine(153), _emit(({ type: "string", value: "}" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "if" }))) {
let r_80 = _s;
let r_81 = r_80.values[0];
let r_82 = r_80.values[1];
let _cond = r_82;
let r_83 = r_80.values[2];
let _truthy = r_83;
let r_84 = r_80.values[3];
let _falsy = r_84;
(runtime.setLine(156), _emit(({ type: "string", value: "if (" })));
(runtime.setLine(157), _emit_expr(_cond));
(runtime.setLine(158), _emit(({ type: "string", value: ") {\n" })));
(runtime.setLine(159), _emit_expr(_truthy));
(runtime.setLine(160), _emit(({ type: "string", value: "}" })));
if (runtime.opNe(_falsy, ({ type: "null" }))) {
(runtime.setLine(162), _emit(({ type: "string", value: " else {\n" })));
(runtime.setLine(163), _emit_expr(_falsy));
(runtime.setLine(164), _emit(({ type: "string", value: "}" })));
};
} else {
if (runtime.opEq(_id, ({ type: "string", value: "return" }))) {
let r_85 = _s;
let r_86 = r_85.values[0];
let r_87 = r_85.values[1];
let _value = r_87;
(runtime.setLine(168), _emit(({ type: "string", value: "runtime.popCall();\n" })));
(runtime.setLine(169), _emit(({ type: "string", value: "return " })));
if (runtime.opNe(_value, ({ type: "null" }))) {
(runtime.setLine(171), _emit_expr(_value));
} else {
(runtime.setLine(173), _emit(({ type: "string", value: "{ type: \"null\" }" })));
};
} else {
if (runtime.opEq(_id, ({ type: "string", value: "break" }))) {
let r_88 = _s;
let r_89 = r_88.values[0];
let r_90 = r_88.values[1];
let _value = r_90;
(runtime.setLine(177), _emit(({ type: "string", value: "break" })));
if (runtime.opNe(_value, ({ type: "null" }))) {
(runtime.setLine(179), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
};
} else {
if (runtime.opEq(_id, ({ type: "string", value: "call" }))) {
let r_91 = _s;
let r_92 = r_91.values[0];
let r_93 = r_91.values[1];
let _callee = r_93;
let r_94 = (runtime.setLine(183), _slice(_s, ({ type: "int", value: 2 })));
let _args = r_94;
(runtime.setLine(184), _emit((runtime.setLine(184), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%), " }), _line))));
(runtime.setLine(185), _emit_expr(_callee));
(runtime.setLine(186), _emit(({ type: "string", value: "(" })));
let r_95 = ({ type: "bool", value: true });
let _first = r_95;
for (let _arg of _args.values) {
if (runtime.opNot(_first)) {
(runtime.setLine(191), _emit(({ type: "string", value: ", " })));
};
(_188 = runtime.assignValue(({ type: "bool", value: false })));
(runtime.setLine(195), _emit_expr(_arg));
};
(runtime.setLine(198), _emit(({ type: "string", value: "))" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "=" }))) {
(runtime.setLine(200), _emit_assign_expr(_s, _line, ({ type: "string", value: "=" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "+=" }))) {
(runtime.setLine(202), _emit_assign_expr(_s, _line, ({ type: "string", value: "+" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "-=" }))) {
(runtime.setLine(204), _emit_assign_expr(_s, _line, ({ type: "string", value: "-" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "or" }))) {
let r_96 = _s;
let r_97 = r_96.values[0];
let r_98 = r_96.values[1];
let _left = r_98;
let r_99 = r_96.values[2];
let _right = r_99;
(runtime.setLine(207), _emit((runtime.setLine(207), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line))));
(runtime.setLine(208), _emit(({ type: "string", value: ", { type: \"bool\", value: this.runtime.truthy(" })));
(runtime.setLine(209), _emit_expr(_left));
(runtime.setLine(210), _emit(({ type: "string", value: ") || this.runtime.falsy(" })));
(runtime.setLine(211), _emit_expr(_right));
(runtime.setLine(212), _emit(({ type: "string", value: ") })" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "and" }))) {
let r_100 = _s;
let r_101 = r_100.values[0];
let r_102 = r_100.values[1];
let _left = r_102;
let r_103 = r_100.values[2];
let _right = r_103;
(runtime.setLine(215), _emit((runtime.setLine(215), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(runtime.setLine(%)" }), _line))));
(runtime.setLine(216), _emit(({ type: "string", value: ", { type: \"bool\", value: this.runtime.truthy(" })));
(runtime.setLine(217), _emit_expr(_left));
(runtime.setLine(218), _emit(({ type: "string", value: ") && this.runtime.falsy(" })));
(runtime.setLine(219), _emit_expr(_right));
(runtime.setLine(220), _emit(({ type: "string", value: ") })" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "==" }))) {
(runtime.setLine(222), _emit_binary_op(_s, ({ type: "string", value: "opEq" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "!=" }))) {
(runtime.setLine(224), _emit_binary_op(_s, ({ type: "string", value: "opNe" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "<" }))) {
(runtime.setLine(226), _emit_binary_op(_s, ({ type: "string", value: "opLt" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: ">" }))) {
(runtime.setLine(228), _emit_binary_op(_s, ({ type: "string", value: "opGt" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "<=" }))) {
(runtime.setLine(230), _emit_binary_op(_s, ({ type: "string", value: "opLte" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: ">=" }))) {
(runtime.setLine(232), _emit_binary_op(_s, ({ type: "string", value: "opGte" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "+" }))) {
(runtime.setLine(234), _emit_binary_op(_s, ({ type: "string", value: "opAdd" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "-" }))) {
(runtime.setLine(236), _emit_binary_op(_s, ({ type: "string", value: "opSub" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "not" }))) {
let r_104 = _s;
let r_105 = r_104.values[0];
let r_106 = r_104.values[1];
let _expr = r_106;
(runtime.setLine(239), _emit(({ type: "string", value: "runtime.opNot(" })));
(runtime.setLine(240), _emit_expr(_expr));
(runtime.setLine(241), _emit(({ type: "string", value: ")" })));
} else {
(runtime.setLine(243), _emit(({ type: "string", value: "({ type: \"list\", values: [" })));
let r_107 = ({ type: "bool", value: true });
let _first = r_107;
for (let _e of _s.values) {
if (runtime.opNot(_first)) {
(runtime.setLine(247), _emit(({ type: "string", value: ", " })));
};
(_244 = runtime.assignValue(({ type: "bool", value: false })));
(runtime.setLine(251), _emit_expr(_e));
};
(runtime.setLine(253), _emit(({ type: "string", value: "] })" })));
}}}}}}}}}}}}}}}}}}}}}}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_let_node(_pat, _base_reg) {
runtime.pushCall("emit_let_node");
let r_108 = _pat;
let r_109 = r_108.values[0];
let _pat_ty = r_109;
let r_110 = r_108.values[1];
let _line = r_110;
if (runtime.opEq(_pat_ty, ({ type: "string", value: "ident" }))) {
let r_111 = _pat;
let r_112 = r_111.values[0];
let r_113 = r_111.values[1];
let r_114 = r_111.values[2];
let _ident = r_114;
if (runtime.opEq(_ident, ({ type: "string", value: "_" }))) {
runtime.popCall();
return { type: "null" }};
(runtime.setLine(264), _emit((runtime.setLine(264), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet _% = r_%" }), _ident, _base_reg))));
(runtime.setLine(265), _define_sym(_ident, ({ type: "list", values: [] })));
} else {
if (runtime.opEq(_pat_ty, ({ type: "string", value: "list" }))) {
let r_115 = _pat;
let r_116 = r_115.values[0];
let r_117 = r_115.values[1];
let r_118 = r_115.values[2];
let _pats = r_118;
let r_119 = ({ type: "int", value: 0 });
let _i = r_119;
for (let _pat of _pats.values) {
let r_120 = (runtime.setLine(271), _let_node_reg_count());
let _reg = r_120;
(runtime.setLine(272), _let_node_reg_increment());
(runtime.setLine(273), _emit((runtime.setLine(273), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: ";\nlet r_% = r_%.values[%]" }), _reg, _base_reg, _i))));
(runtime.setLine(274), _emit_let_node(_pat, _reg));
(_269 = runtime.assignValue(runtime.opAdd(_269, ({ type: "int", value: 1 }))));
};
} else {
(runtime.setLine(278), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "malformed pattern on line %" }), _line));
}};
;
runtime.popCall();
return { type: "null" };
};
function _emit_binary_op(_s, _id) {
runtime.pushCall("emit_binary_op");
let r_121 = _s;
let r_122 = r_121.values[0];
let r_123 = r_121.values[1];
let _left = r_123;
let r_124 = r_121.values[2];
let _right = r_124;
(runtime.setLine(284), _emit((runtime.setLine(284), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.%(" }), _id))));
(runtime.setLine(285), _emit_expr(_left));
(runtime.setLine(286), _emit(({ type: "string", value: ", " })));
(runtime.setLine(287), _emit_expr(_right));
(runtime.setLine(288), _emit(({ type: "string", value: ")" })));
;
runtime.popCall();
return { type: "null" };
};
function _emit_assign_expr(_s, _line, _id) {
runtime.pushCall("emit_assign_expr");
let r_125 = _s;
let r_126 = r_125.values[0];
let r_127 = r_125.values[1];
let r_128 = r_127.values[0];
let _target_type = r_128;
let r_129 = r_125.values[2];
let _expr = r_129;
if (runtime.opNe(_target_type, ({ type: "string", value: "ident" }))) {
(runtime.setLine(294), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to expression on line %" }), _line));
};
let r_130 = _s;
let r_131 = r_130.values[0];
let r_132 = r_130.values[1];
let r_133 = r_132.values[0];
let r_134 = r_132.values[1];
let r_135 = r_132.values[2];
let _ident = r_135;
let r_136 = (runtime.setLine(297), _get_sym(_ident));
let _sym = r_136;
if (runtime.opEq(_sym, ({ type: "null" }))) {
(runtime.setLine(299), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "could not find symbol '%' on line %" }), _ident, _line));
};
let r_137 = _sym;
let r_138 = r_137.values[0];
let _sym_type = r_138;
let r_139 = r_137.values[1];
let _sym_ident = r_139;
let r_140 = r_137.values[2];
if (runtime.opEq(_sym_type, ({ type: "string", value: "let" }))) {
(runtime.setLine(303), _emit((runtime.setLine(303), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "(_% = runtime.assignValue(" }), _sym_ident))));
if (runtime.opEq(_id, ({ type: "string", value: "=" }))) {
(runtime.setLine(305), _emit_expr(_expr));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "+" }))) {
(runtime.setLine(307), _emit((runtime.setLine(307), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opAdd(_%, " }), _sym_ident))));
(runtime.setLine(308), _emit_expr(_expr));
(runtime.setLine(309), _emit(({ type: "string", value: ")" })));
} else {
if (runtime.opEq(_id, ({ type: "string", value: "-" }))) {
(runtime.setLine(311), _emit((runtime.setLine(311), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "runtime.opSub(_%, " }), _sym_ident))));
(runtime.setLine(312), _emit_expr(_expr));
(runtime.setLine(313), _emit(({ type: "string", value: ")" })));
} else {
(runtime.setLine(315), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "not implemented" })));
}}};
(runtime.setLine(317), _emit(({ type: "string", value: "))" })));
} else {
(runtime.setLine(319), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to symbol '%' on line %" }), _sym_ident, _line));
};
;
runtime.popCall();
return { type: "null" };
};
function _emit_pat(_pat) {
runtime.pushCall("emit_pat");
let r_141 = _pat;
let r_142 = r_141.values[0];
let _ty = r_142;
if (runtime.opEq(_ty, ({ type: "string", value: "ident" }))) {
let r_143 = _pat;
let r_144 = r_143.values[0];
let r_145 = r_143.values[1];
let _line = r_145;
let r_146 = r_143.values[2];
let _name = r_146;
if (runtime.opEq(_name, ({ type: "string", value: "_" }))) {
runtime.popCall();
return { type: "null" };
};
(runtime.setLine(330), _emit((runtime.setLine(330), ((...args) => runtime.builtinFormat(...args))(({ type: "string", value: "_%" }), _name))));
(runtime.setLine(331), _define_sym(_name, ({ type: "list", values: [] })));
} else {
if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) {
let r_147 = _pat;
let r_148 = r_147.values[0];
let r_149 = r_147.values[1];
let r_150 = r_147.values[2];
let _pats = r_150;
(runtime.setLine(334), _emit(({ type: "string", value: "[" })));
let r_151 = ({ type: "bool", value: true });
let _first = r_151;
for (let _pat of _pats.values) {
if (runtime.opNot(_first)) {
(runtime.setLine(338), _emit(({ type: "string", value: ", " })));
};
(_335 = runtime.assignValue(({ type: "bool", value: false })));
(runtime.setLine(342), _emit_pat(_pat));
};
(runtime.setLine(344), _emit(({ type: "string", value: "]" })));
} else {
(runtime.setLine(346), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "cannot assign to '%'" }), _pat));
}};
;
runtime.popCall();
return { type: "null" };
};
function _emit(_str) {
runtime.pushCall("emit");
(runtime.setLine(351), ((...args) => runtime.builtinPush(...args))(_output, _str));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_generate] });
;
runtime.popCall();
return { type: "null" };
};
function _Counter() {
runtime.pushCall("Counter");
let r_152 = ({ type: "int", value: 0 });
let _counter = r_152;
function _count() {
runtime.pushCall("count");
runtime.popCall();
return _counter;
;
runtime.popCall();
return { type: "null" };
};
function _increment() {
runtime.pushCall("increment");
(_358 = runtime.assignValue(runtime.opAdd(_358, ({ type: "int", value: 1 }))));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_count, _increment] });
;
runtime.popCall();
return { type: "null" };
};
function _Syms() {
runtime.pushCall("Syms");
let r_153 = ({ type: "list", values: [({ type: "null" }), ({ type: "list", values: [] })] });
let _syms = r_153;
function _enter_scope() {
runtime.pushCall("enter_scope");
(_372 = runtime.assignValue(({ type: "list", values: [_syms, ({ type: "list", values: [] })] })));
;
runtime.popCall();
return { type: "null" };
};
function _leave_scope() {
runtime.pushCall("leave_scope");
let r_154 = _syms;
let r_155 = r_154.values[0];
let _parent = r_155;
let r_156 = r_154.values[1];
(_372 = runtime.assignValue(_parent));
;
runtime.popCall();
return { type: "null" };
};
function _define(_ident, _sym) {
runtime.pushCall("define");
let r_157 = _syms;
let r_158 = r_157.values[0];
let r_159 = r_157.values[1];
let _syms = r_159;
let r_160 = ({ type: "int", value: 0 });
let _i = r_160;
while (true) {
if (runtime.opGte(_i, (runtime.setLine(402), ((...args) => runtime.builtinLen(...args))(_syms)))) {
break};
let r_161 = (runtime.setLine(403), ((...args) => runtime.builtinAt(...args))(_syms, _i));
let r_162 = r_161.values[0];
let _s_ident = r_162;
let r_163 = r_161.values[1];
if (runtime.opEq(_ident, _s_ident)) {
(runtime.setLine(405), ((...args) => runtime.builtinSet(...args))(_syms, _i, ({ type: "list", values: [_ident, _sym] })));
runtime.popCall();
return { type: "null" };
};
(_400 = runtime.assignValue(runtime.opAdd(_400, ({ type: "int", value: 1 }))));
};
(runtime.setLine(410), ((...args) => runtime.builtinPush(...args))(_syms, ({ type: "list", values: [_ident, _sym] })));
;
runtime.popCall();
return { type: "null" };
};
function _find_sym(_syms, _ident) {
runtime.pushCall("find_sym");
let r_164 = _syms;
let r_165 = r_164.values[0];
let _parent = r_165;
let r_166 = r_164.values[1];
let _map = r_166;
let r_167 = ({ type: "int", value: 0 });
let _i = r_167;
while (true) {
if (runtime.opGte(_i, (runtime.setLine(417), ((...args) => runtime.builtinLen(...args))(_map)))) {
break};
let r_168 = (runtime.setLine(418), ((...args) => runtime.builtinAt(...args))(_map, _i));
let r_169 = r_168.values[0];
let _s_ident = r_169;
let r_170 = r_168.values[1];
let _s_sym = r_170;
if (runtime.opEq(_ident, _s_ident)) {
runtime.popCall();
return _s_sym;
};
(_415 = runtime.assignValue(runtime.opAdd(_415, ({ type: "int", value: 1 }))));
};
if (runtime.opNe(_parent, ({ type: "null" }))) {
runtime.popCall();
return (runtime.setLine(425), _find_sym(_parent, _ident));
};
runtime.popCall();
return ({ type: "null" });
;
runtime.popCall();
return { type: "null" };
};
function _get(_ident) {
runtime.pushCall("get");
runtime.popCall();
return (runtime.setLine(431), _find_sym(_syms, _ident));
;
runtime.popCall();
return { type: "null" };
};
function _print_syms_node(_syms, _depth) {
runtime.pushCall("print_syms_node");
let r_171 = _syms;
let r_172 = r_171.values[0];
let _parent = r_172;
let r_173 = r_171.values[1];
let _map = r_173;
for (let [_ident, _sym] of _map.values) {
(runtime.setLine(437), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%- %: %" }), (runtime.setLine(437), _indent(_depth)), _ident, _sym));
};
if (runtime.opNe(_parent, ({ type: "null" }))) {
(runtime.setLine(440), _print_syms_node(_parent, runtime.opAdd(_depth, ({ type: "int", value: 1 }))));
};
;
runtime.popCall();
return { type: "null" };
};
function _print_syms() {
runtime.pushCall("print_syms");
(runtime.setLine(445), _print_syms_node(_syms, ({ type: "int", value: 0 })));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_enter_scope, _leave_scope, _define, _get, _print_syms] });
;
runtime.popCall();
return { type: "null" };
};
function _string_escape(_str) {
runtime.pushCall("string_escape");
let r_174 = (runtime.setLine(459), ((...args) => runtime.builtinLen(...args))(_str));
let _str_len = r_174;
let r_175 = ({ type: "int", value: 0 });
let _i = r_175;
let r_176 = ({ type: "string", value: "" });
let _result = r_176;
while (true) {
if (runtime.opGte(_i, _str_len)) {
break};
let r_177 = (runtime.setLine(464), ((...args) => runtime.builtinAt(...args))(_str, _i));
let _ch = r_177;
if (runtime.opEq(_ch, ({ type: "string", value: "\\" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\\\" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\"" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\\"" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\t" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\t" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\r" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\r" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\n" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) {
(_461 = runtime.assignValue(runtime.opAdd(_461, ({ type: "string", value: "\\0" }))));
} else {
(_461 = runtime.assignValue(runtime.opAdd(_461, _ch)));
}}}}}};
(_460 = runtime.assignValue(runtime.opAdd(_460, ({ type: "int", value: 1 }))));
};
runtime.popCall();
return _result;
;
runtime.popCall();
return { type: "null" };
};
function _Parser(_tokens) {
runtime.pushCall("Parser");
let r_178 = ({ type: "int", value: 0 });
let _i = r_178;
let r_179 = (runtime.setLine(487), ((...args) => runtime.builtinAt(...args))(_tokens, _i));
let _tok = r_179;
function _parse() {
runtime.pushCall("parse");
let r_180 = ({ type: "list", values: [] });
let _exprs = r_180;
while (true) {
if ((runtime.setLine(492), _done())) {
break};
(runtime.setLine(493), ((...args) => runtime.builtinPush(...args))(_exprs, (runtime.setLine(493), _parse_expr())));
};
runtime.popCall();
return _exprs;
;
runtime.popCall();
return { type: "null" };
};
function _parse_expr() {
runtime.pushCall("parse_expr");
let r_181 = _tok;
let r_182 = r_181.values[0];
let _ty = r_182;
let r_183 = r_181.values[1];
let _line = r_183;
let r_184 = r_181.values[2];
let _value = r_184;
if ((runtime.setLine(500), _eat(({ type: "string", value: "(" })))) {
let r_185 = ({ type: "list", values: [] });
let _values = r_185;
while (true) {
if ((runtime.setLine(503), _test(({ type: "string", value: ")" })))) {
break};
(runtime.setLine(504), ((...args) => runtime.builtinPush(...args))(_values, (runtime.setLine(504), _parse_expr())));
};
if (runtime.opNot((runtime.setLine(506), _eat(({ type: "string", value: ")" }))))) {
(runtime.setLine(507), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected ')' on line %" }), (runtime.setLine(507), ((...args) => runtime.builtinAt(...args))(_tok, ({ type: "int", value: 1 })))));
};
runtime.popCall();
return ({ type: "list", values: [] });
} else {
if ((runtime.setLine(510), _eat(({ type: "string", value: "string" })))) {
runtime.popCall();
return ({ type: "list", values: [] });
} else {
if ((runtime.setLine(512), _eat(({ type: "string", value: "int" })))) {
runtime.popCall();
return ({ type: "list", values: [] });
} else {
if ((runtime.setLine(514), _eat(({ type: "string", value: "ident" })))) {
runtime.popCall();
return ({ type: "list", values: [] });
} else {
(runtime.setLine(517), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected expression, got '%' on line %" }), _ty, _line));
}}}};
;
runtime.popCall();
return { type: "null" };
};
function _eat(_pat) {
runtime.pushCall("eat");
if (runtime.opNot((runtime.setLine(522), _test(_pat)))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(runtime.setLine(523), _step());
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _step() {
runtime.pushCall("step");
(_486 = runtime.assignValue(runtime.opAdd(_486, ({ type: "int", value: 1 }))));
if (runtime.opNot((runtime.setLine(529), _done()))) {
let r_186 = (runtime.setLine(530), ((...args) => runtime.builtinAt(...args))(_tokens, _i));
let _new_tok = r_186;
(_487 = runtime.assignValue(_new_tok));
};
;
runtime.popCall();
return { type: "null" };
};
function _test(_pat) {
runtime.pushCall("test");
if ((runtime.setLine(536), _done())) {
runtime.popCall();
return ({ type: "bool", value: false })};
let r_187 = _tok;
let r_188 = r_187.values[0];
let _ty = r_188;
runtime.popCall();
return runtime.opEq(_pat, _ty);
;
runtime.popCall();
return { type: "null" };
};
function _done() {
runtime.pushCall("done");
runtime.popCall();
return runtime.opGte(_i, (runtime.setLine(542), ((...args) => runtime.builtinLen(...args))(_tokens)));
;
runtime.popCall();
return { type: "null" };
};
runtime.popCall();
return ({ type: "list", values: [_parse] });
;
runtime.popCall();
return { type: "null" };
};
function _tokenize(_text) {
runtime.pushCall("tokenize");
let r_189 = (runtime.setLine(549), ((...args) => runtime.builtinLen(...args))(_text));
let _text_len = r_189;
let r_190 = ({ type: "list", values: [] });
let _tokens = r_190;
let r_191 = ({ type: "int", value: 0 });
let _i = r_191;
let r_192 = ({ type: "int", value: 1 });
let _line = r_192;
let r_193 = runtime.opAdd(({ type: "string", value: "abcdefghijklmnopqrstuvwxyz" }), ({ type: "string", value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/%&|=?!<>'_" }));
let _ident_chars = r_193;
while (true) {
if (runtime.opGte(_i, _text_len)) {
break};
let r_194 = (runtime.setLine(561), ((...args) => runtime.builtinAt(...args))(_text, _i));
let _ch = r_194;
if ((runtime.setLine(563), _contains(({ type: "string", value: " \t\r\n" }), _ch))) {
if (runtime.opEq(_ch, ({ type: "string", value: "\n" }))) {
(_553 = runtime.assignValue(runtime.opAdd(_553, ({ type: "int", value: 1 }))));
};
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
} else {
if ((runtime.setLine(568), _slice_eq(_text, _i, ({ type: "string", value: "//" })))) {
while (true) {
if ((runtime.setLine(570), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opEq((runtime.setLine(570), ((...args) => runtime.builtinAt(...args))(_text, _i)), ({ type: "string", value: "\n" }))) })) {
break;
};
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
};
} else {
if ((runtime.setLine(575), _contains(({ type: "string", value: "()" }), _ch))) {
(runtime.setLine(576), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [_ch, _line] })));
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "\"" }))) {
let r_195 = ({ type: "string", value: "" });
let _value = r_195;
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
(_561 = runtime.assignValue((runtime.setLine(581), ((...args) => runtime.builtinAt(...args))(_text, _i))));
while (true) {
if ((runtime.setLine(583), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opEq(_ch, ({ type: "string", value: "\"" }))) })) {
break;
};
if (runtime.opEq(_ch, ({ type: "string", value: "\\" }))) {
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
if (runtime.opGte(_i, _text_len)) {
break;
};
(_561 = runtime.assignValue((runtime.setLine(591), ((...args) => runtime.builtinAt(...args))(_text, _i))));
if (runtime.opEq(_ch, ({ type: "string", value: "t" }))) {
(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\t" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "r" }))) {
(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\r" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "n" }))) {
(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\n" }))));
} else {
if (runtime.opEq(_ch, ({ type: "string", value: "0" }))) {
(_579 = runtime.assignValue(runtime.opAdd(_579, ({ type: "string", value: "\n" }))));
} else {
(_579 = runtime.assignValue(runtime.opAdd(_579, _ch)));
}}}};
} else {
(_579 = runtime.assignValue(runtime.opAdd(_579, _ch)));
};
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
(_561 = runtime.assignValue((runtime.setLine(607), ((...args) => runtime.builtinAt(...args))(_text, _i))));
};
if ((runtime.setLine(609), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNe(_ch, ({ type: "string", value: "\"" }))) })) {
(runtime.setLine(610), ((...args) => runtime.builtinPanic(...args))(({ type: "string", value: "expected '\"' on line %" }), _line));
};
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
(runtime.setLine(613), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] })));
} else {
if ((runtime.setLine(614), _contains(({ type: "string", value: "0123456789" }), _ch))) {
let r_196 = ({ type: "string", value: "" });
let _value = r_196;
while (true) {
(_561 = runtime.assignValue((runtime.setLine(617), ((...args) => runtime.builtinAt(...args))(_text, _i))));
if ((runtime.setLine(618), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNot((runtime.setLine(618), _contains(({ type: "string", value: "0123456789" }), _ch)))) })) {
break;
};
(_615 = runtime.assignValue(runtime.opAdd(_615, _ch)));
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
};
(runtime.setLine(624), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] })));
} else {
if ((runtime.setLine(625), _contains(_ident_chars, _ch))) {
let r_197 = ({ type: "string", value: "" });
let _value = r_197;
while (true) {
(_561 = runtime.assignValue((runtime.setLine(628), ((...args) => runtime.builtinAt(...args))(_text, _i))));
if ((runtime.setLine(629), { type: "bool", value: this.runtime.truthy(runtime.opGte(_i, _text_len)) || this.runtime.falsy(runtime.opNot((runtime.setLine(629), _contains(_ident_chars, _ch)))) })) {
break;
};
(_626 = runtime.assignValue(runtime.opAdd(_626, _ch)));
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
};
(runtime.setLine(635), ((...args) => runtime.builtinPush(...args))(_tokens, ({ type: "list", values: [] })));
} else {
(runtime.setLine(637), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "illegal char '%'" }), _ch));
(_552 = runtime.assignValue(runtime.opAdd(_552, ({ type: "int", value: 1 }))));
}}}}}};
};
runtime.popCall();
return _tokens;
;
runtime.popCall();
return { type: "null" };
};
function _contains(_text, _ch) {
runtime.pushCall("contains");
let r_198 = (runtime.setLine(645), ((...args) => runtime.builtinLen(...args))(_text));
let _text_len = r_198;
let r_199 = ({ type: "int", value: 0 });
let _i = r_199;
while (true) {
if (runtime.opGte(_i, _text_len)) {
break};
if (runtime.opEq((runtime.setLine(649), ((...args) => runtime.builtinAt(...args))(_text, _i)), _ch)) {
runtime.popCall();
return ({ type: "bool", value: true });
};
(_646 = runtime.assignValue(runtime.opAdd(_646, ({ type: "int", value: 1 }))));
};
runtime.popCall();
return ({ type: "bool", value: false });
;
runtime.popCall();
return { type: "null" };
};
function _slice_eq(_str, _slice_idx, _substr) {
runtime.pushCall("slice_eq");
let r_200 = (runtime.setLine(658), ((...args) => runtime.builtinLen(...args))(_str));
let _str_len = r_200;
let r_201 = (runtime.setLine(659), ((...args) => runtime.builtinLen(...args))(_substr));
let _substr_len = r_201;
let r_202 = ({ type: "int", value: 0 });
let _i = r_202;
while (true) {
if (runtime.opGte(_i, _substr_len)) {
runtime.popCall();
return ({ type: "bool", value: true })};
if (runtime.opGte(runtime.opAdd(_slice_idx, _i), _str_len)) {
runtime.popCall();
return ({ type: "bool", value: false })};
if (runtime.opNe((runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_str, runtime.opAdd(_slice_idx, _i))), (runtime.setLine(666), ((...args) => runtime.builtinAt(...args))(_substr, _i)))) {
runtime.popCall();
return ({ type: "bool", value: false })};
(_660 = runtime.assignValue(runtime.opAdd(_660, ({ type: "int", value: 1 }))));
};
runtime.popCall();
return ({ type: "bool", value: true });
;
runtime.popCall();
return { type: "null" };
};
function _print_expr(_expr, _depth) {
runtime.pushCall("print_expr");
let r_203 = _expr;
let r_204 = r_203.values[0];
let _ty = r_204;
let r_205 = r_203.values[1];
let _line = r_205;
let r_206 = r_203.values[2];
let _value = r_206;
if (runtime.opEq(_ty, ({ type: "string", value: "list" }))) {
(runtime.setLine(676), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%(% %" }), (runtime.setLine(676), _indent(_depth)), _ty, _line));
for (let _e of _value.values) {
(runtime.setLine(678), _print_expr(_e, runtime.opAdd(_depth, ({ type: "int", value: 1 }))));
};
(runtime.setLine(680), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%)" }), (runtime.setLine(680), _indent(_depth))));
} else {
(runtime.setLine(682), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "%%" }), (runtime.setLine(682), _indent(_depth)), _expr));
};
;
runtime.popCall();
return { type: "null" };
};
function _indent(_depth) {
runtime.pushCall("indent");
let r_207 = ({ type: "string", value: "" });
let _space = r_207;
let r_208 = ({ type: "int", value: 0 });
let _i = r_208;
while (true) {
if (runtime.opGte(_i, _depth)) {
break};
(_687 = runtime.assignValue(runtime.opAdd(_687, ({ type: "string", value: " " }))));
(_688 = runtime.assignValue(runtime.opAdd(_688, ({ type: "int", value: 1 }))));
};
runtime.popCall();
return _space;
;
runtime.popCall();
return { type: "null" };
};
function _slice(_list, _idx) {
runtime.pushCall("slice");
let r_209 = (runtime.setLine(698), ((...args) => runtime.builtinLen(...args))(_list));
let _list_len = r_209;
let r_210 = ({ type: "list", values: [] });
let _elems = r_210;
let r_211 = _idx;
let _i = r_211;
while (true) {
if (runtime.opGte(_i, _list_len)) {
break};
(runtime.setLine(703), ((...args) => runtime.builtinPush(...args))(_elems, (runtime.setLine(703), ((...args) => runtime.builtinAt(...args))(_list, _i))));
(_700 = runtime.assignValue(runtime.opAdd(_700, ({ type: "int", value: 1 }))));
};
runtime.popCall();
return _elems;
;
runtime.popCall();
return { type: "null" };
};
let r_212 = ({ type: "bool", value: true });
let _silent = r_212;
let r_213 = (runtime.setLine(711), ((...args) => runtime.builtinGetArgs(...args))());
let r_214 = r_213.values[0];
let _input_filename = r_214;
let r_215 = r_213.values[1];
let _output_filename = r_215;
if (runtime.opNot(_silent)) {
(runtime.setLine(713), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "reading file..." })))};
let r_216 = (runtime.setLine(714), ((...args) => runtime.builtinReadTextFile(...args))(_input_filename));
let _text = r_216;
(runtime.setLine(716), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "=== text ===" })));
(runtime.setLine(718), ((...args) => runtime.builtinPrintln(...args))((runtime.setLine(718), ((...args) => runtime.builtinLen(...args))(_text))));
if (runtime.opNot(_silent)) {
(runtime.setLine(720), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "tokenizing..." })))};
let r_217 = (runtime.setLine(721), _tokenize(_text));
let _tokens = r_217;
(runtime.setLine(723), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "=== tokens ===" })));
(runtime.setLine(727), ((...args) => runtime.builtinPrintln(...args))((runtime.setLine(727), ((...args) => runtime.builtinLen(...args))(_tokens))));
if (runtime.opNot(_silent)) {
(runtime.setLine(729), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "parsing..." })))};
let r_218 = (runtime.setLine(730), _Parser(_tokens));
let _parser = r_218;
let r_219 = _parser;
let r_220 = r_219.values[0];
let _parse = r_220;
let r_221 = (runtime.setLine(732), _parse());
let _ast = r_221;
if (runtime.opNot(_silent)) {
(runtime.setLine(739), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "emitting..." })))};
let r_222 = (runtime.setLine(740), _Emitter(_ast, _input_filename));
let _emitter = r_222;
let r_223 = _emitter;
let r_224 = r_223.values[0];
let _emit = r_224;
let r_225 = (runtime.setLine(742), _emit());
let _js_code = r_225;
if (runtime.opNot(_silent)) {
(runtime.setLine(747), ((...args) => runtime.builtinPrintln(...args))(({ type: "string", value: "writing file..." })))};
(runtime.setLine(748), ((...args) => runtime.builtinWriteTextFile(...args))(_output_filename, _js_code));