From fb9772db4993e148f9770aa71b7961aceacf8a97 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 7 May 2026 17:58:29 -0500 Subject: [PATCH] feat(elc, runtime): RBrace stop in parse_html_children; html_raw/html_escape; elc.c canonical MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit parse_html_children consumed the closing `}` of the outer El function as HTML text content when a tag was left open across a function boundary (e.g. `page_open()` opens `` without a closing ``). Fix: stop the children loop when the current token is RBrace — that token belongs to the El function, not the HTML tree. Add html_raw() and html_escape() builtins to el_runtime so templates can interpolate trusted raw HTML and safely escape user-supplied content. Rename elc-new.c → elc.c as the canonical compiler source; rebuild elc binary from it. --- lang/dist/platform/elc | Bin 319032 -> 339312 bytes lang/el-compiler/runtime/el_runtime.c | 37 + lang/el-compiler/runtime/el_runtime.h | 2 + lang/elc.c | 10062 ++++++++++++++++++++++++ 4 files changed, 10101 insertions(+) create mode 100644 lang/elc.c diff --git a/lang/dist/platform/elc b/lang/dist/platform/elc index f1cba6543f94e7f8d0b9591dee691e26a3f89d54..a6973d001f31b0fabfec9901d59e8f98eecdbd79 100755 GIT binary patch literal 339312 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 z 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 z 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%0A@1GJecJ$F__ITx4`U% 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 literal 319032 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

aa80dF7{krtF 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 X-kg2on>XSg9J2e(G2_mV)Q|Q*vWdAl diff --git a/lang/el-compiler/runtime/el_runtime.c b/lang/el-compiler/runtime/el_runtime.c index df83e95..bb74f39 100644 --- a/lang/el-compiler/runtime/el_runtime.c +++ b/lang/el-compiler/runtime/el_runtime.c @@ -2241,6 +2241,43 @@ el_val_t url_decode(el_val_t sv) { return el_wrap_str(out); } +/* ── html_raw ──────────────────────────────────────────────────────────────── + * Identity passthrough for raw HTML template interpolation. + * El's {raw(expr)} compiles to html_raw(expr) — the value is output as-is + * without any escaping. The caller is responsible for safety. + */ +el_val_t html_raw(el_val_t s) { + return s; +} + +/* ── html_escape ───────────────────────────────────────────────────────────── + * Escape < > " ' & for safe HTML text interpolation. + * El's {expr} in HTML templates compiles to html_escape(expr). + */ +el_val_t html_escape(el_val_t sv) { + const char* src = EL_CSTR(sv); + if (!src) return EL_STR(""); + size_t len = strlen(src); + /* Worst case: every byte → 6 chars (") */ + char* out = (char*)malloc(len * 6 + 1); + if (!out) return sv; + el_arena_track(out); + char* p = out; + for (size_t i = 0; i < len; i++) { + unsigned char c = (unsigned char)src[i]; + switch (c) { + case '&': memcpy(p, "&", 5); p += 5; break; + case '<': memcpy(p, "<", 4); p += 4; break; + case '>': memcpy(p, ">", 4); p += 4; break; + case '"': memcpy(p, """, 6); p += 6; break; + case '\'': memcpy(p, "'", 5); p += 5; break; + default: *p++ = (char)c; break; + } + } + *p = '\0'; + return el_wrap_str(out); +} + /* ── HTML allowlist sanitizer ──────────────────────────────────────────────── * el_html_sanitize(input, allowlist_json) * diff --git a/lang/el-compiler/runtime/el_runtime.h b/lang/el-compiler/runtime/el_runtime.h index c0529ef..b4cff9d 100644 --- a/lang/el-compiler/runtime/el_runtime.h +++ b/lang/el-compiler/runtime/el_runtime.h @@ -227,6 +227,8 @@ el_val_t url_decode(el_val_t s); /* '+' → space, %XX → byte */ * {"p":[],"a":["href","title"],"strong":[],...} * where each value is the array of attribute names allowed for that tag. */ el_val_t el_html_sanitize(el_val_t input_html, el_val_t allowlist_json); +el_val_t html_raw(el_val_t s); +el_val_t html_escape(el_val_t s); /* ── Filesystem ──────────────────────────────────────────────────────────── */ diff --git a/lang/elc.c b/lang/elc.c new file mode 100644 index 0000000..5104d13 --- /dev/null +++ b/lang/elc.c @@ -0,0 +1,10062 @@ +#include +#include +#include "el_runtime.h" + +el_val_t is_digit_code(el_val_t c); +el_val_t is_alpha_code(el_val_t c); +el_val_t is_alnum_or_underscore_code(el_val_t c); +el_val_t is_ws_code(el_val_t c); +el_val_t lex_is_digit(el_val_t ch); +el_val_t lex_is_alpha(el_val_t ch); +el_val_t is_alnum_or_underscore(el_val_t ch); +el_val_t lex_is_whitespace(el_val_t ch); +el_val_t tok_append(el_val_t tokens, el_val_t kind, el_val_t value); +el_val_t keyword_kind(el_val_t word); +el_val_t scan_digits(el_val_t src, el_val_t start, el_val_t total); +el_val_t scan_ident(el_val_t src, el_val_t start, el_val_t total); +el_val_t substr_at(el_val_t src, el_val_t start, el_val_t total, el_val_t needle); +el_val_t str_has(el_val_t s, el_val_t needle); +el_val_t looks_like_code(el_val_t s); +el_val_t strip_code_comments(el_val_t s); +el_val_t scan_string(el_val_t src, el_val_t start, el_val_t total); +el_val_t scan_interp_brace(el_val_t src, el_val_t start, el_val_t total); +el_val_t interp_tokens_append_all(el_val_t dst, el_val_t src); +el_val_t scan_interp_string(el_val_t src, el_val_t start, el_val_t total); +el_val_t lex(el_val_t source); +el_val_t tok_at(el_val_t tokens, el_val_t pos); +el_val_t tok_kind(el_val_t tokens, el_val_t pos); +el_val_t tok_value(el_val_t tokens, el_val_t pos); +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind); +el_val_t make_result(el_val_t node, el_val_t pos); +el_val_t skip_type(el_val_t tokens, el_val_t pos); +el_val_t parse_params(el_val_t tokens, el_val_t pos); +el_val_t is_html_tag_name(el_val_t name); +el_val_t is_void_element(el_val_t name); +el_val_t parse_raw_text_content(el_val_t tokens, el_val_t pos, el_val_t tag_name); +el_val_t parse_html_text_tokens(el_val_t tokens, el_val_t pos); +el_val_t parse_html_attrs(el_val_t tokens, el_val_t pos); +el_val_t parse_html_children(el_val_t tokens, el_val_t pos, el_val_t parent_tag); +el_val_t parse_html_each_body(el_val_t tokens, el_val_t pos); +el_val_t parse_html_element(el_val_t tokens, el_val_t pos); +el_val_t parse_html_template(el_val_t tokens, el_val_t pos); +el_val_t parse_primary(el_val_t tokens, el_val_t pos); +el_val_t parse_if(el_val_t tokens, el_val_t pos); +el_val_t parse_match(el_val_t tokens, el_val_t pos); +el_val_t parse_pattern(el_val_t tokens, el_val_t pos); +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_block(el_val_t tokens, el_val_t pos); +el_val_t is_duration_unit(el_val_t name); +el_val_t parse_postfix(el_val_t tokens, el_val_t pos); +el_val_t op_precedence(el_val_t kind); +el_val_t is_binop(el_val_t kind); +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec); +el_val_t parse_expr(el_val_t tokens, el_val_t pos); +el_val_t parse_stmt(el_val_t tokens, el_val_t pos); +el_val_t parse(el_val_t tokens); +el_val_t parse_one(el_val_t tokens, el_val_t pos); +el_val_t skip_to_rbrace(el_val_t tokens, el_val_t pos); +el_val_t is_stmt_start_kind(el_val_t k); +el_val_t skip_expr_to_stmt_boundary(el_val_t tokens, el_val_t pos); +el_val_t scan_params_c(el_val_t tokens, el_val_t pos); +el_val_t scan_fn_sigs(el_val_t tokens); +el_val_t nibble_to_hex(el_val_t n); +el_val_t byte_to_hex2(el_val_t b); +el_val_t is_hex_digit_byte(el_val_t b); +el_val_t c_escape(el_val_t s); +el_val_t c_str_lit(el_val_t s); +el_val_t sanitize_test_name(el_val_t name); +el_val_t el_type_to_c(el_val_t type_str); +el_val_t emit_line(el_val_t line); +el_val_t emit_blank(void); +el_val_t binop_to_c(el_val_t op); +el_val_t duration_unit_nanos(el_val_t unit); +el_val_t next_html_id(void); +el_val_t cg_html_parts(el_val_t children, el_val_t acc_var); +el_val_t cg_html_attrs_str(el_val_t attrs, el_val_t acc_var); +el_val_t cg_html_element_str(el_val_t elem, el_val_t acc_var); +el_val_t cg_html_each(el_val_t node, el_val_t acc_var); +el_val_t cg_html_if(el_val_t node, el_val_t acc_var); +el_val_t cg_html_template(el_val_t expr); +el_val_t cg_expr(el_val_t expr); +el_val_t next_match_id(void); +el_val_t cg_match(el_val_t expr); +el_val_t cg_match_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t next_if_id(void); +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var); +el_val_t cg_if_expr(el_val_t expr); +el_val_t list_contains(el_val_t lst, el_val_t s); +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t strip_outer_parens(el_val_t s); +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t param_decl(el_val_t param, el_val_t idx); +el_val_t params_to_c(el_val_t params); +el_val_t transform_implicit_return(el_val_t body); +el_val_t is_int_name(el_val_t name); +el_val_t is_instant_name(el_val_t name); +el_val_t is_duration_name(el_val_t name); +el_val_t is_int_call(el_val_t call_expr); +el_val_t is_instant_call(el_val_t call_expr); +el_val_t is_duration_call(el_val_t call_expr); +el_val_t is_calendar_name(el_val_t name); +el_val_t is_caltime_name(el_val_t name); +el_val_t is_rhythm_name(el_val_t name); +el_val_t is_localdate_name(el_val_t name); +el_val_t is_localtime_name(el_val_t name); +el_val_t is_localdt_name(el_val_t name); +el_val_t is_zone_name(el_val_t name); +el_val_t is_calendar_call(el_val_t call_expr); +el_val_t is_caltime_call(el_val_t call_expr); +el_val_t is_rhythm_call(el_val_t call_expr); +el_val_t is_localdate_call(el_val_t call_expr); +el_val_t is_localtime_call(el_val_t call_expr); +el_val_t is_localdt_call(el_val_t call_expr); +el_val_t is_zone_call(el_val_t call_expr); +el_val_t is_calendar_expr(el_val_t expr); +el_val_t is_caltime_expr(el_val_t expr); +el_val_t is_rhythm_expr(el_val_t expr); +el_val_t is_localdate_expr(el_val_t expr); +el_val_t is_localtime_expr(el_val_t expr); +el_val_t is_localdt_expr(el_val_t expr); +el_val_t is_zone_expr(el_val_t expr); +el_val_t is_instant_expr(el_val_t expr); +el_val_t is_duration_expr(el_val_t expr); +el_val_t time_record_violation(el_val_t kind, el_val_t detail); +el_val_t is_int_expr(el_val_t expr); +el_val_t is_float_expr(el_val_t expr); +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name); +el_val_t is_self_formation_call(el_val_t fn_name); +el_val_t is_dharma_call(el_val_t fn_name); +el_val_t is_llm_call(el_val_t fn_name); +el_val_t cap_check_call(el_val_t fn_name); +el_val_t emit_cap_violations(void); +el_val_t emit_time_violations(void); +el_val_t builtin_arity(el_val_t name); +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual); +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual); +el_val_t emit_arity_violations(void); +el_val_t add_int_name(el_val_t name); +el_val_t add_instant_name(el_val_t name); +el_val_t add_duration_name(el_val_t name); +el_val_t add_calendar_name(el_val_t name); +el_val_t add_caltime_name(el_val_t name); +el_val_t add_rhythm_name(el_val_t name); +el_val_t add_localdate_name(el_val_t name); +el_val_t add_localtime_name(el_val_t name); +el_val_t add_localdt_name(el_val_t name); +el_val_t add_zone_name(el_val_t name); +el_val_t build_int_names_for_params(el_val_t params); +el_val_t cg_fn(el_val_t stmt); +el_val_t is_fndef(el_val_t stmt); +el_val_t is_top_level_decl(el_val_t stmt); +el_val_t cgi_arg(el_val_t value, el_val_t has_value); +el_val_t vbd_is_restricted_name(el_val_t name); +el_val_t vbd_expr_has_restricted_call(el_val_t expr); +el_val_t vbd_has_restricted_call(el_val_t stmts); +el_val_t codegen(el_val_t stmts, el_val_t source); +el_val_t cg_decl_streaming(el_val_t stmt); +el_val_t emit_streaming_preamble(el_val_t sigs, el_val_t source); +el_val_t codegen_streaming(el_val_t tokens, el_val_t sigs, el_val_t source); +el_val_t js_escape(el_val_t s); +el_val_t js_str_lit(el_val_t s); +el_val_t js_emit_line(el_val_t line); +el_val_t js_emit_blank(void); +el_val_t js_binop(el_val_t op); +el_val_t js_is_el_method(el_val_t name); +el_val_t js_is_async_builtin(el_val_t name); +el_val_t js_register_async_fn(el_val_t name); +el_val_t js_is_async_fn(el_val_t name); +el_val_t js_is_int_name(el_val_t name); +el_val_t js_add_int_name(el_val_t name); +el_val_t js_build_int_names_for_params(el_val_t params); +el_val_t js_is_int_call(el_val_t call_expr); +el_val_t js_next_html_id(void); +el_val_t js_cg_html_parts(el_val_t children, el_val_t acc_var); +el_val_t js_cg_html_attrs_str(el_val_t attrs, el_val_t acc_var); +el_val_t js_cg_html_element_str(el_val_t elem, el_val_t acc_var); +el_val_t js_cg_html_each(el_val_t node, el_val_t acc_var); +el_val_t js_cg_html_template(el_val_t expr); +el_val_t js_cg_expr(el_val_t expr); +el_val_t js_next_match_id(void); +el_val_t js_cg_match(el_val_t expr); +el_val_t js_next_lambda_id(void); +el_val_t js_cg_lambda(el_val_t expr); +el_val_t js_list_contains(el_val_t lst, el_val_t s); +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared); +el_val_t js_strip_outer_parens(el_val_t s); +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared); +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared); +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared); +el_val_t js_params_str(el_val_t params); +el_val_t js_transform_implicit_return(el_val_t body); +el_val_t js_cg_fn(el_val_t stmt); +el_val_t js_is_fndef(el_val_t stmt); +el_val_t js_is_top_level_decl(el_val_t stmt); +el_val_t codegen_js(el_val_t stmts, el_val_t source); +el_val_t codegen_js_bundle(el_val_t stmts, el_val_t source, el_val_t runtime_content); +el_val_t codegen_js_inner(el_val_t stmts, el_val_t source, el_val_t bundle_mode, el_val_t runtime_content); +el_val_t js_strip_es_exports(el_val_t content); +el_val_t compile(el_val_t source); +el_val_t compile_test(el_val_t source); +el_val_t compile_js(el_val_t source); +el_val_t compile_js_with_bundle(el_val_t source, el_val_t runtime_path); +el_val_t compile_dispatch(el_val_t tgt, el_val_t source); +el_val_t compile_dispatch_bundle(el_val_t tgt, el_val_t source, el_val_t runtime_path); +el_val_t detect_target(el_val_t argv); +el_val_t strip_flags(el_val_t argv); +el_val_t detect_emit_header(el_val_t argv); +el_val_t detect_bundle(el_val_t argv); +el_val_t detect_minify(el_val_t argv); +el_val_t detect_obfuscate(el_val_t argv); +el_val_t detect_test(el_val_t argv); +el_val_t make_temp_path(el_val_t suffix); +el_val_t js_reserved_names(void); +el_val_t find_node_tool(el_val_t tool_name, el_val_t src_dir); +el_val_t apply_minify(el_val_t js_path, el_val_t out_path, el_val_t src_dir); +el_val_t apply_obfuscate(el_val_t js_path, el_val_t out_path, el_val_t src_dir); +el_val_t resolve_runtime_path(el_val_t src_path); +el_val_t type_node_to_el(el_val_t t); +el_val_t emit_header(el_val_t stmts, el_val_t hdr_path); +el_val_t dirname_of(el_val_t path); +el_val_t parse_import_line(el_val_t trimmed, el_val_t dir); +el_val_t resolve_imports(el_val_t src_path); +el_val_t run_with_postprocess(el_val_t tgt, el_val_t source, el_val_t src_path, el_val_t do_bundle, el_val_t do_obfuscate, el_val_t argc, el_val_t positional); + +el_val_t is_digit_code(el_val_t c) { + if (c >= 48) { + if (c <= 57) { + return 1; + } + } + return 0; + return 0; +} + +el_val_t is_alpha_code(el_val_t c) { + if (c >= 65) { + if (c <= 90) { + return 1; + } + } + if (c >= 97) { + if (c <= 122) { + return 1; + } + } + return 0; + return 0; +} + +el_val_t is_alnum_or_underscore_code(el_val_t c) { + if (is_digit_code(c)) { + return 1; + } + if (is_alpha_code(c)) { + return 1; + } + if (c == 95) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_ws_code(el_val_t c) { + if (c == 32) { + return 1; + } + if (c == 9) { + return 1; + } + if (c == 10) { + return 1; + } + if (c == 13) { + return 1; + } + return 0; + return 0; +} + +el_val_t lex_is_digit(el_val_t ch) { + if (str_eq(ch, EL_STR("0"))) { + return 1; + } + if (str_eq(ch, EL_STR("1"))) { + return 1; + } + if (str_eq(ch, EL_STR("2"))) { + return 1; + } + if (str_eq(ch, EL_STR("3"))) { + return 1; + } + if (str_eq(ch, EL_STR("4"))) { + return 1; + } + if (str_eq(ch, EL_STR("5"))) { + return 1; + } + if (str_eq(ch, EL_STR("6"))) { + return 1; + } + if (str_eq(ch, EL_STR("7"))) { + return 1; + } + if (str_eq(ch, EL_STR("8"))) { + return 1; + } + if (str_eq(ch, EL_STR("9"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t lex_is_alpha(el_val_t ch) { + if (str_eq(ch, EL_STR("a"))) { + return 1; + } + if (str_eq(ch, EL_STR("b"))) { + return 1; + } + if (str_eq(ch, EL_STR("c"))) { + return 1; + } + if (str_eq(ch, EL_STR("d"))) { + return 1; + } + if (str_eq(ch, EL_STR("e"))) { + return 1; + } + if (str_eq(ch, EL_STR("f"))) { + return 1; + } + if (str_eq(ch, EL_STR("g"))) { + return 1; + } + if (str_eq(ch, EL_STR("h"))) { + return 1; + } + if (str_eq(ch, EL_STR("i"))) { + return 1; + } + if (str_eq(ch, EL_STR("j"))) { + return 1; + } + if (str_eq(ch, EL_STR("k"))) { + return 1; + } + if (str_eq(ch, EL_STR("l"))) { + return 1; + } + if (str_eq(ch, EL_STR("m"))) { + return 1; + } + if (str_eq(ch, EL_STR("n"))) { + return 1; + } + if (str_eq(ch, EL_STR("o"))) { + return 1; + } + if (str_eq(ch, EL_STR("p"))) { + return 1; + } + if (str_eq(ch, EL_STR("q"))) { + return 1; + } + if (str_eq(ch, EL_STR("r"))) { + return 1; + } + if (str_eq(ch, EL_STR("s"))) { + return 1; + } + if (str_eq(ch, EL_STR("t"))) { + return 1; + } + if (str_eq(ch, EL_STR("u"))) { + return 1; + } + if (str_eq(ch, EL_STR("v"))) { + return 1; + } + if (str_eq(ch, EL_STR("w"))) { + return 1; + } + if (str_eq(ch, EL_STR("x"))) { + return 1; + } + if (str_eq(ch, EL_STR("y"))) { + return 1; + } + if (str_eq(ch, EL_STR("z"))) { + return 1; + } + if (str_eq(ch, EL_STR("A"))) { + return 1; + } + if (str_eq(ch, EL_STR("B"))) { + return 1; + } + if (str_eq(ch, EL_STR("C"))) { + return 1; + } + if (str_eq(ch, EL_STR("D"))) { + return 1; + } + if (str_eq(ch, EL_STR("E"))) { + return 1; + } + if (str_eq(ch, EL_STR("F"))) { + return 1; + } + if (str_eq(ch, EL_STR("G"))) { + return 1; + } + if (str_eq(ch, EL_STR("H"))) { + return 1; + } + if (str_eq(ch, EL_STR("I"))) { + return 1; + } + if (str_eq(ch, EL_STR("J"))) { + return 1; + } + if (str_eq(ch, EL_STR("K"))) { + return 1; + } + if (str_eq(ch, EL_STR("L"))) { + return 1; + } + if (str_eq(ch, EL_STR("M"))) { + return 1; + } + if (str_eq(ch, EL_STR("N"))) { + return 1; + } + if (str_eq(ch, EL_STR("O"))) { + return 1; + } + if (str_eq(ch, EL_STR("P"))) { + return 1; + } + if (str_eq(ch, EL_STR("Q"))) { + return 1; + } + if (str_eq(ch, EL_STR("R"))) { + return 1; + } + if (str_eq(ch, EL_STR("S"))) { + return 1; + } + if (str_eq(ch, EL_STR("T"))) { + return 1; + } + if (str_eq(ch, EL_STR("U"))) { + return 1; + } + if (str_eq(ch, EL_STR("V"))) { + return 1; + } + if (str_eq(ch, EL_STR("W"))) { + return 1; + } + if (str_eq(ch, EL_STR("X"))) { + return 1; + } + if (str_eq(ch, EL_STR("Y"))) { + return 1; + } + if (str_eq(ch, EL_STR("Z"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_alnum_or_underscore(el_val_t ch) { + if (lex_is_digit(ch)) { + return 1; + } + if (lex_is_alpha(ch)) { + return 1; + } + if (str_eq(ch, EL_STR("_"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t lex_is_whitespace(el_val_t ch) { + if (str_eq(ch, EL_STR(" "))) { + return 1; + } + if (str_eq(ch, EL_STR("\t"))) { + return 1; + } + if (str_eq(ch, EL_STR("\n"))) { + return 1; + } + if (str_eq(ch, EL_STR("\r"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t tok_append(el_val_t tokens, el_val_t kind, el_val_t value) { + tokens = native_list_append(tokens, kind); + return native_list_append(tokens, value); + return 0; +} + +el_val_t keyword_kind(el_val_t word) { + if (str_eq(word, EL_STR("let"))) { + return EL_STR("Let"); + } + if (str_eq(word, EL_STR("fn"))) { + return EL_STR("Fn"); + } + if (str_eq(word, EL_STR("type"))) { + return EL_STR("Type"); + } + if (str_eq(word, EL_STR("enum"))) { + return EL_STR("Enum"); + } + if (str_eq(word, EL_STR("match"))) { + return EL_STR("Match"); + } + if (str_eq(word, EL_STR("return"))) { + return EL_STR("Return"); + } + if (str_eq(word, EL_STR("if"))) { + return EL_STR("If"); + } + if (str_eq(word, EL_STR("else"))) { + return EL_STR("Else"); + } + if (str_eq(word, EL_STR("for"))) { + return EL_STR("For"); + } + if (str_eq(word, EL_STR("in"))) { + return EL_STR("In"); + } + if (str_eq(word, EL_STR("while"))) { + return EL_STR("While"); + } + if (str_eq(word, EL_STR("import"))) { + return EL_STR("Import"); + } + if (str_eq(word, EL_STR("from"))) { + return EL_STR("From"); + } + if (str_eq(word, EL_STR("as"))) { + return EL_STR("As"); + } + if (str_eq(word, EL_STR("with"))) { + return EL_STR("With"); + } + if (str_eq(word, EL_STR("sealed"))) { + return EL_STR("Sealed"); + } + if (str_eq(word, EL_STR("activate"))) { + return EL_STR("Activate"); + } + if (str_eq(word, EL_STR("where"))) { + return EL_STR("Where"); + } + if (str_eq(word, EL_STR("test"))) { + return EL_STR("Test"); + } + if (str_eq(word, EL_STR("seed"))) { + return EL_STR("Seed"); + } + if (str_eq(word, EL_STR("assert"))) { + return EL_STR("Assert"); + } + if (str_eq(word, EL_STR("protocol"))) { + return EL_STR("Protocol"); + } + if (str_eq(word, EL_STR("impl"))) { + return EL_STR("Impl"); + } + if (str_eq(word, EL_STR("retry"))) { + return EL_STR("Retry"); + } + if (str_eq(word, EL_STR("times"))) { + return EL_STR("Times"); + } + if (str_eq(word, EL_STR("fallback"))) { + return EL_STR("Fallback"); + } + if (str_eq(word, EL_STR("reason"))) { + return EL_STR("Reason"); + } + if (str_eq(word, EL_STR("parallel"))) { + return EL_STR("Parallel"); + } + if (str_eq(word, EL_STR("trace"))) { + return EL_STR("Trace"); + } + if (str_eq(word, EL_STR("requires"))) { + return EL_STR("Requires"); + } + if (str_eq(word, EL_STR("deploy"))) { + return EL_STR("Deploy"); + } + if (str_eq(word, EL_STR("to"))) { + return EL_STR("To"); + } + if (str_eq(word, EL_STR("via"))) { + return EL_STR("Via"); + } + if (str_eq(word, EL_STR("target"))) { + return EL_STR("Target"); + } + if (str_eq(word, EL_STR("true"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("false"))) { + return EL_STR("Bool"); + } + if (str_eq(word, EL_STR("cgi"))) { + return EL_STR("Cgi"); + } + if (str_eq(word, EL_STR("service"))) { + return EL_STR("Service"); + } + if (str_eq(word, EL_STR("manager"))) { + return EL_STR("Manager"); + } + if (str_eq(word, EL_STR("engine"))) { + return EL_STR("Engine"); + } + if (str_eq(word, EL_STR("accessor"))) { + return EL_STR("Accessor"); + } + if (str_eq(word, EL_STR("vessel"))) { + return EL_STR("Vessel"); + } + if (str_eq(word, EL_STR("extern"))) { + return EL_STR("Extern"); + } + if (str_eq(word, EL_STR("break"))) { + return EL_STR("Break"); + } + if (str_eq(word, EL_STR("continue"))) { + return EL_STR("Continue"); + } + return EL_STR(""); + return 0; +} + +el_val_t scan_digits(el_val_t src, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t c = str_char_code(src, i); + if (is_digit_code(c)) { + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", str_slice(src, start, i), "pos", i); + return 0; +} + +el_val_t scan_ident(el_val_t src, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t c = str_char_code(src, i); + if (is_alnum_or_underscore_code(c)) { + i = (i + 1); + } else { + running = 0; + } + } + } + return el_map_new(2, "text", str_slice(src, start, i), "pos", i); + return 0; +} + +el_val_t substr_at(el_val_t src, el_val_t start, el_val_t total, el_val_t needle) { + el_val_t nlen = str_len(needle); + if ((start + nlen) > total) { + return 0; + } + return str_eq(str_slice(src, start, (start + nlen)), needle); + return 0; +} + +el_val_t str_has(el_val_t s, el_val_t needle) { + return str_contains(s, needle); + return 0; +} + +el_val_t looks_like_code(el_val_t s) { + if (str_has(s, EL_STR("= total) { + scanning = 0; + } else { + el_val_t lc = str_char_at(s, i); + if (str_eq(lc, EL_STR("\n"))) { + scanning = 0; + } else { + i = (i + 1); + } + } + } + prev = EL_STR(""); + } + } else { + if (str_eq(next_ch, EL_STR("*"))) { + i = (i + 2); + el_val_t scanning2 = 1; + while (scanning2) { + if (i >= total) { + scanning2 = 0; + } else { + el_val_t bc = str_char_at(s, i); + if (str_eq(bc, EL_STR("*"))) { + el_val_t after = (i + 1); + if (after < total) { + el_val_t nc2 = str_char_at(s, after); + if (str_eq(nc2, EL_STR("/"))) { + i = (after + 1); + scanning2 = 0; + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } + } + prev = EL_STR(""); + } else { + out_parts = native_list_append(out_parts, ch); + prev = ch; + i = (i + 1); + } + } + } else { + if (str_eq(ch, EL_STR("'"))) { + in_squote = 1; + out_parts = native_list_append(out_parts, ch); + prev = ch; + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("\""))) { + in_dquote = 1; + out_parts = native_list_append(out_parts, ch); + prev = ch; + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("`"))) { + in_btick = 1; + out_parts = native_list_append(out_parts, ch); + prev = ch; + i = (i + 1); + } else { + out_parts = native_list_append(out_parts, ch); + prev = ch; + i = (i + 1); + } + } + } + } + } + } + return str_join(out_parts, EL_STR("")); + return 0; +} + +el_val_t scan_string(el_val_t src, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t parts = native_list_empty(); + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = str_char_at(src, i); + if (str_eq(ch, EL_STR("\\"))) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t next_ch = str_char_at(src, next_i); + if (str_eq(next_ch, EL_STR("\""))) { + parts = native_list_append(parts, EL_STR("\"")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("n"))) { + parts = native_list_append(parts, EL_STR("\n")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("t"))) { + parts = native_list_append(parts, EL_STR("\t")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("r"))) { + parts = native_list_append(parts, EL_STR("\r")); + i = (next_i + 1); + } else { + if (str_eq(next_ch, EL_STR("\\"))) { + parts = native_list_append(parts, EL_STR("\\")); + i = (next_i + 1); + } else { + parts = native_list_append(parts, next_ch); + i = (next_i + 1); + } + } + } + } + } + } else { + i = (i + 1); + } + } else { + if (str_eq(ch, EL_STR("\""))) { + i = (i + 1); + running = 0; + } else { + parts = native_list_append(parts, ch); + i = (i + 1); + } + } + } + } + return el_map_new(2, "text", str_join(parts, EL_STR("")), "pos", i); + return 0; +} + +el_val_t scan_interp_brace(el_val_t src, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t depth = 1; + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t ch = str_char_at(src, i); + if (str_eq(ch, EL_STR("{"))) { + depth = (depth + 1); + i = (i + 1); + } else { + if (str_eq(ch, EL_STR("}"))) { + depth = (depth - 1); + if (depth <= 0) { + i = (i + 1); + running = 0; + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } + } + } + return el_map_new(2, "text", str_slice(src, start, (i - 1)), "pos", i); + return 0; +} + +el_val_t interp_tokens_append_all(el_val_t dst, el_val_t src) { + el_val_t src_len = native_list_len(src); + el_val_t j = 0; + el_val_t result = dst; + while (j < src_len) { + el_val_t kind = native_list_get(src, j); + if (str_eq(kind, EL_STR("Eof"))) { + j = src_len; + } else { + el_val_t val = native_list_get(src, (j + 1)); + result = native_list_append(result, kind); + result = native_list_append(result, val); + j = (j + 2); + } + } + return result; + return 0; +} + +el_val_t scan_interp_string(el_val_t src, el_val_t start, el_val_t total) { + el_val_t i = start; + el_val_t out_tokens = native_list_empty(); + el_val_t cur_parts = native_list_empty(); + el_val_t clean_start = start; + el_val_t has_interp = 0; + el_val_t need_plus = 0; + el_val_t running = 1; + while (running) { + if (i >= total) { + running = 0; + } else { + el_val_t c = str_char_code(src, i); + if (c == 92) { + if (clean_start < i) { + cur_parts = native_list_append(cur_parts, str_slice(src, clean_start, i)); + } + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t nc = str_char_code(src, next_i); + if (nc == 36) { + cur_parts = native_list_append(cur_parts, EL_STR("$")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + if (nc == 34) { + cur_parts = native_list_append(cur_parts, EL_STR("\"")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + if (nc == 110) { + cur_parts = native_list_append(cur_parts, EL_STR("\n")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + if (nc == 116) { + cur_parts = native_list_append(cur_parts, EL_STR("\t")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + if (nc == 114) { + cur_parts = native_list_append(cur_parts, EL_STR("\r")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + if (nc == 92) { + cur_parts = native_list_append(cur_parts, EL_STR("\\")); + clean_start = (next_i + 1); + i = (next_i + 1); + } else { + cur_parts = native_list_append(cur_parts, str_slice(src, next_i, (next_i + 1))); + clean_start = (next_i + 1); + i = (next_i + 1); + } + } + } + } + } + } + } else { + clean_start = next_i; + i = next_i; + } + } else { + if (c == 34) { + if (clean_start < i) { + cur_parts = native_list_append(cur_parts, str_slice(src, clean_start, i)); + } + i = (i + 1); + clean_start = i; + running = 0; + } else { + if (c == 36) { + el_val_t next_i = (i + 1); + el_val_t is_interp = 0; + if (next_i < total) { + el_val_t nc2 = str_char_code(src, next_i); + if (nc2 == 123) { + is_interp = 1; + } + } + if (is_interp) { + if (clean_start < i) { + cur_parts = native_list_append(cur_parts, str_slice(src, clean_start, i)); + } + el_val_t part_len = native_list_len(cur_parts); + if (part_len > 0) { + el_val_t part_text = str_join(cur_parts, EL_STR("")); + if (need_plus) { + out_tokens = tok_append(out_tokens, EL_STR("Plus"), EL_STR("+")); + } + el_val_t clean_part = part_text; + if (looks_like_code(part_text)) { + clean_part = strip_code_comments(part_text); + } + out_tokens = tok_append(out_tokens, EL_STR("Str"), clean_part); + need_plus = 1; + } + cur_parts = native_list_empty(); + has_interp = 1; + el_val_t brace_result = scan_interp_brace(src, (next_i + 1), total); + el_val_t expr_src = el_get_field(brace_result, EL_STR("text")); + el_val_t new_i = el_get_field(brace_result, EL_STR("pos")); + i = new_i; + clean_start = new_i; + el_val_t inner_toks = lex(expr_src); + el_val_t inner_len = native_list_len(inner_toks); + if (need_plus) { + out_tokens = tok_append(out_tokens, EL_STR("Plus"), EL_STR("+")); + } + if (inner_len <= 2) { + out_tokens = tok_append(out_tokens, EL_STR("Str"), EL_STR("")); + } else { + out_tokens = tok_append(out_tokens, EL_STR("LParen"), EL_STR("(")); + out_tokens = interp_tokens_append_all(out_tokens, inner_toks); + out_tokens = tok_append(out_tokens, EL_STR("RParen"), EL_STR(")")); + } + need_plus = 1; + } else { + i = (i + 1); + } + } else { + i = (i + 1); + } + } + } + } + } + if (clean_start < i) { + cur_parts = native_list_append(cur_parts, str_slice(src, clean_start, i)); + } + el_val_t part_len = native_list_len(cur_parts); + el_val_t part_text = str_join(cur_parts, EL_STR("")); + if (has_interp) { + if (part_len > 0) { + el_val_t clean_part = part_text; + if (looks_like_code(part_text)) { + clean_part = strip_code_comments(part_text); + } + if (need_plus) { + out_tokens = tok_append(out_tokens, EL_STR("Plus"), EL_STR("+")); + } + out_tokens = tok_append(out_tokens, EL_STR("Str"), clean_part); + } + } else { + el_val_t clean_text = part_text; + if (looks_like_code(part_text)) { + clean_text = strip_code_comments(part_text); + } + out_tokens = tok_append(out_tokens, EL_STR("Str"), clean_text); + } + return el_map_new(2, "tokens", out_tokens, "pos", i); + return 0; +} + +el_val_t lex(el_val_t source) { + el_val_t total = str_len(source); + el_val_t tokens = native_list_empty(); + el_val_t i = 0; + while (i < total) { + el_val_t c = str_char_code(source, i); + if (is_ws_code(c)) { + i = (i + 1); + } else { + if (c == 47) { + el_val_t next_i = (i + 1); + if (next_i < total) { + el_val_t nc = str_char_code(source, next_i); + if (nc == 47) { + i = (i + 2); + el_val_t running2 = 1; + while (running2) { + if (i >= total) { + running2 = 0; + } else { + el_val_t lc = str_char_code(source, i); + if (lc == 10) { + running2 = 0; + } else { + i = (i + 1); + } + } + } + } else { + tokens = tok_append(tokens, EL_STR("Slash"), EL_STR("/")); + i = (i + 1); + } + } else { + tokens = tok_append(tokens, EL_STR("Slash"), EL_STR("/")); + i = (i + 1); + } + } else { + if (c == 34) { + el_val_t interp_result = scan_interp_string(source, (i + 1), total); + el_val_t interp_toks = el_get_field(interp_result, EL_STR("tokens")); + el_val_t new_pos = el_get_field(interp_result, EL_STR("pos")); + tokens = interp_tokens_append_all(tokens, interp_toks); + i = new_pos; + } else { + if (is_digit_code(c)) { + el_val_t result = scan_digits(source, i, total); + el_val_t num_text = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + if (new_pos < total) { + el_val_t dc = str_char_code(source, new_pos); + if (dc == 46) { + el_val_t after_dot = (new_pos + 1); + if (after_dot < total) { + el_val_t adc = str_char_code(source, after_dot); + if (is_digit_code(adc)) { + el_val_t frac_result = scan_digits(source, after_dot, total); + el_val_t frac_text = el_get_field(frac_result, EL_STR("text")); + el_val_t frac_pos = el_get_field(frac_result, EL_STR("pos")); + tokens = tok_append(tokens, EL_STR("Float"), el_str_concat(el_str_concat(num_text, EL_STR(".")), frac_text)); + i = frac_pos; + } else { + tokens = tok_append(tokens, EL_STR("Int"), num_text); + i = new_pos; + } + } else { + tokens = tok_append(tokens, EL_STR("Int"), num_text); + i = new_pos; + } + } else { + tokens = tok_append(tokens, EL_STR("Int"), num_text); + i = new_pos; + } + } else { + tokens = tok_append(tokens, EL_STR("Int"), num_text); + i = new_pos; + } + } else { + if (is_alpha_code(c) || (c == 95)) { + el_val_t result = scan_ident(source, i, total); + el_val_t word = el_get_field(result, EL_STR("text")); + el_val_t new_pos = el_get_field(result, EL_STR("pos")); + el_val_t kw = keyword_kind(word); + if (str_eq(kw, EL_STR(""))) { + tokens = tok_append(tokens, EL_STR("Ident"), word); + } else { + tokens = tok_append(tokens, kw, word); + } + i = new_pos; + } else { + el_val_t peek_i = (i + 1); + el_val_t peek_c = (-1); + if (peek_i < total) { + peek_c = str_char_code(source, peek_i); + } + if (c == 61) { + if (peek_c == 61) { + tokens = tok_append(tokens, EL_STR("EqEq"), EL_STR("==")); + i = (i + 2); + } else { + if (peek_c == 62) { + tokens = tok_append(tokens, EL_STR("FatArrow"), EL_STR("=>")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Eq"), EL_STR("=")); + i = (i + 1); + } + } + } else { + if (c == 33) { + if (peek_c == 61) { + tokens = tok_append(tokens, EL_STR("NotEq"), EL_STR("!=")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Not"), EL_STR("!")); + i = (i + 1); + } + } else { + if (c == 60) { + if (peek_c == 61) { + tokens = tok_append(tokens, EL_STR("LtEq"), EL_STR("<=")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Lt"), EL_STR("<")); + i = (i + 1); + } + } else { + if (c == 62) { + if (peek_c == 61) { + tokens = tok_append(tokens, EL_STR("GtEq"), EL_STR(">=")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Gt"), EL_STR(">")); + i = (i + 1); + } + } else { + if (c == 38) { + if (peek_c == 38) { + tokens = tok_append(tokens, EL_STR("And"), EL_STR("&&")); + i = (i + 2); + } else { + i = (i + 1); + } + } else { + if (c == 124) { + if (peek_c == 124) { + tokens = tok_append(tokens, EL_STR("Or"), EL_STR("||")); + i = (i + 2); + } else { + if (peek_c == 62) { + tokens = tok_append(tokens, EL_STR("PipeOp"), EL_STR("|>")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Pipe"), EL_STR("|")); + i = (i + 1); + } + } + } else { + if (c == 45) { + if (peek_c == 62) { + tokens = tok_append(tokens, EL_STR("Arrow"), EL_STR("->")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Minus"), EL_STR("-")); + i = (i + 1); + } + } else { + if (c == 58) { + if (peek_c == 58) { + tokens = tok_append(tokens, EL_STR("ColonColon"), EL_STR("::")); + i = (i + 2); + } else { + tokens = tok_append(tokens, EL_STR("Colon"), EL_STR(":")); + i = (i + 1); + } + } else { + if (c == 43) { + tokens = tok_append(tokens, EL_STR("Plus"), EL_STR("+")); + i = (i + 1); + } else { + if (c == 42) { + tokens = tok_append(tokens, EL_STR("Star"), EL_STR("*")); + i = (i + 1); + } else { + if (c == 37) { + tokens = tok_append(tokens, EL_STR("Percent"), EL_STR("%")); + i = (i + 1); + } else { + if (c == 40) { + tokens = tok_append(tokens, EL_STR("LParen"), EL_STR("(")); + i = (i + 1); + } else { + if (c == 41) { + tokens = tok_append(tokens, EL_STR("RParen"), EL_STR(")")); + i = (i + 1); + } else { + if (c == 123) { + tokens = tok_append(tokens, EL_STR("LBrace"), EL_STR("{")); + i = (i + 1); + } else { + if (c == 125) { + tokens = tok_append(tokens, EL_STR("RBrace"), EL_STR("}")); + i = (i + 1); + } else { + if (c == 91) { + tokens = tok_append(tokens, EL_STR("LBracket"), EL_STR("[")); + i = (i + 1); + } else { + if (c == 93) { + tokens = tok_append(tokens, EL_STR("RBracket"), EL_STR("]")); + i = (i + 1); + } else { + if (c == 44) { + tokens = tok_append(tokens, EL_STR("Comma"), EL_STR(",")); + i = (i + 1); + } else { + if (c == 46) { + el_val_t peek2_i = (i + 2); + el_val_t peek2_c = (-1); + if (peek2_i < total) { + peek2_c = str_char_code(source, peek2_i); + } + if (peek_c == 46) { + if (peek2_c == 61) { + tokens = tok_append(tokens, EL_STR("DotDotEq"), EL_STR("..=")); + i = (i + 3); + } else { + tokens = tok_append(tokens, EL_STR("DotDot"), EL_STR("..")); + i = (i + 2); + } + } else { + tokens = tok_append(tokens, EL_STR("Dot"), EL_STR(".")); + i = (i + 1); + } + } else { + if (c == 59) { + tokens = tok_append(tokens, EL_STR("Semicolon"), EL_STR(";")); + i = (i + 1); + } else { + if (c == 64) { + tokens = tok_append(tokens, EL_STR("At"), EL_STR("@")); + i = (i + 1); + } else { + if (c == 63) { + tokens = tok_append(tokens, EL_STR("QuestionMark"), EL_STR("?")); + i = (i + 1); + } else { + i = (i + 1); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + tokens = tok_append(tokens, EL_STR("Eof"), EL_STR("")); + return tokens; + return 0; +} + +el_val_t tok_at(el_val_t tokens, el_val_t pos) { + el_val_t kind = native_list_get(tokens, (pos * 2)); + el_val_t value = native_list_get(tokens, ((pos * 2) + 1)); + return el_map_new(2, "kind", kind, "value", value); + return 0; +} + +el_val_t tok_kind(el_val_t tokens, el_val_t pos) { + return native_list_get(tokens, (pos * 2)); + return 0; +} + +el_val_t tok_value(el_val_t tokens, el_val_t pos) { + return native_list_get(tokens, ((pos * 2) + 1)); + return 0; +} + +el_val_t expect(el_val_t tokens, el_val_t pos, el_val_t kind) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, kind)) { + return (pos + 1); + } + return (pos + 1); + return 0; +} + +el_val_t make_result(el_val_t node, el_val_t pos) { + return el_map_new(2, "node", node, "pos", pos); + return 0; +} + +el_val_t skip_type(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + p = skip_type(tokens, p); + p = expect(tokens, p, EL_STR("RBracket")); + return p; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Lt"))) { + p = (p + 1); + el_val_t depth = 1; + el_val_t running = 1; + while (running) { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(kk, EL_STR("Lt"))) { + depth = (depth + 1); + p = (p + 1); + } else { + if (str_eq(kk, EL_STR("Gt"))) { + depth = (depth - 1); + p = (p + 1); + if (depth <= 0) { + running = 0; + } + } else { + p = (p + 1); + } + } + } + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("QuestionMark"))) { + p = (p + 1); + } + return p; + } + if (str_eq(k2, EL_STR("QuestionMark"))) { + return (p + 1); + } + return p; + } + return (pos + 1); + return 0; +} + +el_val_t parse_params(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LParen")); + el_val_t params = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RParen"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t pname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t ptype = EL_STR(""); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ptype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + el_val_t param = el_map_new(2, "name", pname, "type", ptype); + params = native_list_append(params, param); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + return el_map_new(2, "params", params, "pos", p); + return 0; +} + +el_val_t is_html_tag_name(el_val_t name) { + if (str_eq(name, EL_STR("a"))) { + return 1; + } + if (str_eq(name, EL_STR("abbr"))) { + return 1; + } + if (str_eq(name, EL_STR("address"))) { + return 1; + } + if (str_eq(name, EL_STR("area"))) { + return 1; + } + if (str_eq(name, EL_STR("article"))) { + return 1; + } + if (str_eq(name, EL_STR("aside"))) { + return 1; + } + if (str_eq(name, EL_STR("audio"))) { + return 1; + } + if (str_eq(name, EL_STR("b"))) { + return 1; + } + if (str_eq(name, EL_STR("base"))) { + return 1; + } + if (str_eq(name, EL_STR("blockquote"))) { + return 1; + } + if (str_eq(name, EL_STR("body"))) { + return 1; + } + if (str_eq(name, EL_STR("br"))) { + return 1; + } + if (str_eq(name, EL_STR("button"))) { + return 1; + } + if (str_eq(name, EL_STR("canvas"))) { + return 1; + } + if (str_eq(name, EL_STR("caption"))) { + return 1; + } + if (str_eq(name, EL_STR("cite"))) { + return 1; + } + if (str_eq(name, EL_STR("code"))) { + return 1; + } + if (str_eq(name, EL_STR("col"))) { + return 1; + } + if (str_eq(name, EL_STR("colgroup"))) { + return 1; + } + if (str_eq(name, EL_STR("data"))) { + return 1; + } + if (str_eq(name, EL_STR("datalist"))) { + return 1; + } + if (str_eq(name, EL_STR("dd"))) { + return 1; + } + if (str_eq(name, EL_STR("del"))) { + return 1; + } + if (str_eq(name, EL_STR("details"))) { + return 1; + } + if (str_eq(name, EL_STR("dfn"))) { + return 1; + } + if (str_eq(name, EL_STR("dialog"))) { + return 1; + } + if (str_eq(name, EL_STR("div"))) { + return 1; + } + if (str_eq(name, EL_STR("dl"))) { + return 1; + } + if (str_eq(name, EL_STR("dt"))) { + return 1; + } + if (str_eq(name, EL_STR("em"))) { + return 1; + } + if (str_eq(name, EL_STR("embed"))) { + return 1; + } + if (str_eq(name, EL_STR("fieldset"))) { + return 1; + } + if (str_eq(name, EL_STR("figcaption"))) { + return 1; + } + if (str_eq(name, EL_STR("figure"))) { + return 1; + } + if (str_eq(name, EL_STR("footer"))) { + return 1; + } + if (str_eq(name, EL_STR("form"))) { + return 1; + } + if (str_eq(name, EL_STR("h1"))) { + return 1; + } + if (str_eq(name, EL_STR("h2"))) { + return 1; + } + if (str_eq(name, EL_STR("h3"))) { + return 1; + } + if (str_eq(name, EL_STR("h4"))) { + return 1; + } + if (str_eq(name, EL_STR("h5"))) { + return 1; + } + if (str_eq(name, EL_STR("h6"))) { + return 1; + } + if (str_eq(name, EL_STR("head"))) { + return 1; + } + if (str_eq(name, EL_STR("header"))) { + return 1; + } + if (str_eq(name, EL_STR("hr"))) { + return 1; + } + if (str_eq(name, EL_STR("html"))) { + return 1; + } + if (str_eq(name, EL_STR("i"))) { + return 1; + } + if (str_eq(name, EL_STR("iframe"))) { + return 1; + } + if (str_eq(name, EL_STR("img"))) { + return 1; + } + if (str_eq(name, EL_STR("input"))) { + return 1; + } + if (str_eq(name, EL_STR("ins"))) { + return 1; + } + if (str_eq(name, EL_STR("kbd"))) { + return 1; + } + if (str_eq(name, EL_STR("label"))) { + return 1; + } + if (str_eq(name, EL_STR("legend"))) { + return 1; + } + if (str_eq(name, EL_STR("li"))) { + return 1; + } + if (str_eq(name, EL_STR("link"))) { + return 1; + } + if (str_eq(name, EL_STR("main"))) { + return 1; + } + if (str_eq(name, EL_STR("map"))) { + return 1; + } + if (str_eq(name, EL_STR("mark"))) { + return 1; + } + if (str_eq(name, EL_STR("menu"))) { + return 1; + } + if (str_eq(name, EL_STR("meta"))) { + return 1; + } + if (str_eq(name, EL_STR("meter"))) { + return 1; + } + if (str_eq(name, EL_STR("nav"))) { + return 1; + } + if (str_eq(name, EL_STR("noscript"))) { + return 1; + } + if (str_eq(name, EL_STR("object"))) { + return 1; + } + if (str_eq(name, EL_STR("ol"))) { + return 1; + } + if (str_eq(name, EL_STR("optgroup"))) { + return 1; + } + if (str_eq(name, EL_STR("option"))) { + return 1; + } + if (str_eq(name, EL_STR("output"))) { + return 1; + } + if (str_eq(name, EL_STR("p"))) { + return 1; + } + if (str_eq(name, EL_STR("param"))) { + return 1; + } + if (str_eq(name, EL_STR("picture"))) { + return 1; + } + if (str_eq(name, EL_STR("pre"))) { + return 1; + } + if (str_eq(name, EL_STR("progress"))) { + return 1; + } + if (str_eq(name, EL_STR("q"))) { + return 1; + } + if (str_eq(name, EL_STR("rp"))) { + return 1; + } + if (str_eq(name, EL_STR("rt"))) { + return 1; + } + if (str_eq(name, EL_STR("ruby"))) { + return 1; + } + if (str_eq(name, EL_STR("s"))) { + return 1; + } + if (str_eq(name, EL_STR("samp"))) { + return 1; + } + if (str_eq(name, EL_STR("script"))) { + return 1; + } + if (str_eq(name, EL_STR("section"))) { + return 1; + } + if (str_eq(name, EL_STR("select"))) { + return 1; + } + if (str_eq(name, EL_STR("small"))) { + return 1; + } + if (str_eq(name, EL_STR("source"))) { + return 1; + } + if (str_eq(name, EL_STR("span"))) { + return 1; + } + if (str_eq(name, EL_STR("strong"))) { + return 1; + } + if (str_eq(name, EL_STR("style"))) { + return 1; + } + if (str_eq(name, EL_STR("sub"))) { + return 1; + } + if (str_eq(name, EL_STR("summary"))) { + return 1; + } + if (str_eq(name, EL_STR("sup"))) { + return 1; + } + if (str_eq(name, EL_STR("table"))) { + return 1; + } + if (str_eq(name, EL_STR("tbody"))) { + return 1; + } + if (str_eq(name, EL_STR("td"))) { + return 1; + } + if (str_eq(name, EL_STR("template"))) { + return 1; + } + if (str_eq(name, EL_STR("textarea"))) { + return 1; + } + if (str_eq(name, EL_STR("tfoot"))) { + return 1; + } + if (str_eq(name, EL_STR("th"))) { + return 1; + } + if (str_eq(name, EL_STR("thead"))) { + return 1; + } + if (str_eq(name, EL_STR("time"))) { + return 1; + } + if (str_eq(name, EL_STR("title"))) { + return 1; + } + if (str_eq(name, EL_STR("tr"))) { + return 1; + } + if (str_eq(name, EL_STR("track"))) { + return 1; + } + if (str_eq(name, EL_STR("u"))) { + return 1; + } + if (str_eq(name, EL_STR("ul"))) { + return 1; + } + if (str_eq(name, EL_STR("var"))) { + return 1; + } + if (str_eq(name, EL_STR("video"))) { + return 1; + } + if (str_eq(name, EL_STR("wbr"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_void_element(el_val_t name) { + if (str_eq(name, EL_STR("area"))) { + return 1; + } + if (str_eq(name, EL_STR("base"))) { + return 1; + } + if (str_eq(name, EL_STR("br"))) { + return 1; + } + if (str_eq(name, EL_STR("col"))) { + return 1; + } + if (str_eq(name, EL_STR("embed"))) { + return 1; + } + if (str_eq(name, EL_STR("hr"))) { + return 1; + } + if (str_eq(name, EL_STR("img"))) { + return 1; + } + if (str_eq(name, EL_STR("input"))) { + return 1; + } + if (str_eq(name, EL_STR("link"))) { + return 1; + } + if (str_eq(name, EL_STR("meta"))) { + return 1; + } + if (str_eq(name, EL_STR("param"))) { + return 1; + } + if (str_eq(name, EL_STR("source"))) { + return 1; + } + if (str_eq(name, EL_STR("track"))) { + return 1; + } + if (str_eq(name, EL_STR("wbr"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_raw_text_content(el_val_t tokens, el_val_t pos, el_val_t tag_name) { + el_val_t parts = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Lt"))) { + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k2, EL_STR("Slash"))) { + el_val_t close_name = tok_value(tokens, (p + 2)); + if (str_eq(close_name, tag_name)) { + p = (p + 3); + p = expect(tokens, p, EL_STR("Gt")); + running = 0; + } else { + el_val_t v = tok_value(tokens, p); + parts = native_list_append(parts, v); + p = (p + 1); + } + } else { + el_val_t v = tok_value(tokens, p); + parts = native_list_append(parts, v); + p = (p + 1); + } + } else { + el_val_t v = tok_value(tokens, p); + parts = native_list_append(parts, v); + p = (p + 1); + } + } + } + return el_map_new(2, "text", str_join(parts, EL_STR(" ")), "pos", p); + return 0; +} + +el_val_t parse_html_text_tokens(el_val_t tokens, el_val_t pos) { + el_val_t parts = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Lt"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("LBrace"))) { + running = 0; + } else { + el_val_t v = tok_value(tokens, p); + parts = native_list_append(parts, v); + p = (p + 1); + } + } + } + } + return el_map_new(2, "text", str_join(parts, EL_STR(" ")), "pos", p); + return 0; +} + +el_val_t parse_html_attrs(el_val_t tokens, el_val_t pos) { + el_val_t attrs = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Gt"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Slash"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t attr_name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Eq"))) { + p = (p + 1); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Str"))) { + el_val_t attr_val = tok_value(tokens, p); + p = (p + 1); + attrs = native_list_append(attrs, el_map_new(3, "name", attr_name, "kind", EL_STR("static"), "value", attr_val)); + } else { + if (str_eq(k3, EL_STR("LBrace"))) { + el_val_t r = parse_expr(tokens, (p + 1)); + el_val_t val_node = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + p = expect(tokens, p, EL_STR("RBrace")); + attrs = native_list_append(attrs, el_map_new(3, "name", attr_name, "kind", EL_STR("dynamic"), "value", val_node)); + } else { + } + } + } else { + attrs = native_list_append(attrs, el_map_new(2, "name", attr_name, "kind", EL_STR("bool"))); + } + } + } + } + } + return el_map_new(2, "attrs", attrs, "pos", p); + return 0; +} + +el_val_t parse_html_children(el_val_t tokens, el_val_t pos, el_val_t parent_tag) { + el_val_t children = native_list_empty(); + el_val_t p = pos; + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + /* A bare `}` at this level is the El function-body closing brace — + * e.g. intentionally left open in page_open(), closed by + * page_close(). Stop here so the outer El parser can consume the `}`. */ + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Lt"))) { + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k2, EL_STR("Slash"))) { + p = (p + 2); + el_val_t close_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Gt")); + running = 0; + } else { + if (str_eq(k2, EL_STR("Not"))) { + el_val_t k3_v = str_lower(tok_value(tokens, (p + 2))); + if (str_eq(k3_v, EL_STR("doctype"))) { + p = (p + 2); + el_val_t scanning = 1; + while (scanning) { + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("Eof"))) { + scanning = 0; + } + if (str_eq(ck, EL_STR("Gt"))) { + p = (p + 1); + scanning = 0; + } else { + p = (p + 1); + } + } + children = native_list_append(children, el_map_new(1, "html", EL_STR("Doctype"))); + } else { + p = (p + 1); + } + } else { + el_val_t r = parse_html_element(tokens, p); + el_val_t child = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + children = native_list_append(children, child); + } + } + } else { + if (str_eq(k, EL_STR("LBrace"))) { + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k2, EL_STR("Slash"))) { + p = (p + 2); + p = (p + 1); + p = expect(tokens, p, EL_STR("RBrace")); + running = 0; + } else { + if (str_eq(k2, EL_STR("If"))) { + p = (p + 2); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r_cond = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond_expr = el_get_field(r_cond, EL_STR("node")); + p = el_get_field(r_cond, EL_STR("pos")); + el_release(r_cond); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t r_then = parse_html_children(tokens, p, EL_STR("__if_then__")); + el_val_t then_children = el_get_field(r_then, EL_STR("children")); + p = el_get_field(r_then, EL_STR("pos")); + el_release(r_then); + el_val_t else_children = native_list_empty(); + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("LBrace"))) { + el_val_t ck2 = tok_kind(tokens, (p + 1)); + if (str_eq(ck2, EL_STR("Else"))) { + p = (p + 2); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t r_else = parse_html_children(tokens, p, EL_STR("__if_else__")); + else_children = el_get_field(r_else, EL_STR("children")); + p = el_get_field(r_else, EL_STR("pos")); + el_release(r_else); + } + } + el_val_t if_node = el_map_new(4, "html", EL_STR("HtmlIf"), "cond", cond_expr, "then", then_children, "else", else_children); + children = native_list_append(children, if_node); + } else { + if (str_eq(k2, EL_STR("Else"))) { + running = 0; + } else { + el_val_t k2_v = tok_value(tokens, (p + 1)); + if (str_eq(k2_v, EL_STR("each"))) { + p = (p + 2); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r_list = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r_list, EL_STR("node")); + p = el_get_field(r_list, EL_STR("pos")); + el_release(r_list); + p = expect(tokens, p, EL_STR("As")); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t r_body = parse_html_each_body(tokens, p); + el_val_t body_children = el_get_field(r_body, EL_STR("children")); + p = el_get_field(r_body, EL_STR("pos")); + el_release(r_body); + el_val_t each_node = el_map_new(4, "html", EL_STR("Each"), "list", list_expr, "item", item_name, "body", body_children); + children = native_list_append(children, each_node); + } else { + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, (p + 1)); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t interp_val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + p = expect(tokens, p, EL_STR("RBrace")); + el_val_t is_raw_call = 0; + el_val_t interp_kind = el_get_field(interp_val, EL_STR("expr")); + if (str_eq(interp_kind, EL_STR("Call"))) { + el_val_t fn_node = el_get_field(interp_val, EL_STR("func")); + el_val_t fn_kind = el_get_field(fn_node, EL_STR("expr")); + if (str_eq(fn_kind, EL_STR("Ident"))) { + el_val_t fn_name_v = el_get_field(fn_node, EL_STR("name")); + if (str_eq(fn_name_v, EL_STR("raw"))) { + is_raw_call = 1; + } + } + } + if (is_raw_call) { + el_val_t raw_args = el_get_field(interp_val, EL_STR("args")); + el_val_t raw_inner = native_list_get(raw_args, 0); + children = native_list_append(children, el_map_new(2, "html", EL_STR("Raw"), "value", raw_inner)); + } else { + children = native_list_append(children, el_map_new(2, "html", EL_STR("Interp"), "value", interp_val)); + } + } + } + } + } + } else { + el_val_t r_text = parse_html_text_tokens(tokens, p); + el_val_t text_str = el_get_field(r_text, EL_STR("text")); + p = el_get_field(r_text, EL_STR("pos")); + el_release(r_text); + el_val_t text_trimmed = str_trim(text_str); + if (!str_eq(text_trimmed, EL_STR(""))) { + children = native_list_append(children, el_map_new(2, "html", EL_STR("Text"), "text", text_trimmed)); + } + } + } + } /* closes: else { // not RBrace */ + } + } + return el_map_new(2, "children", children, "pos", p); + return 0; +} + +el_val_t parse_html_each_body(el_val_t tokens, el_val_t pos) { + return parse_html_children(tokens, pos, EL_STR("__each__")); + return 0; +} + +el_val_t parse_html_element(el_val_t tokens, el_val_t pos) { + el_val_t p = pos; + p = expect(tokens, p, EL_STR("Lt")); + el_val_t tag_name = tok_value(tokens, p); + p = (p + 1); + el_val_t r_attrs = parse_html_attrs(tokens, p); + el_val_t attrs = el_get_field(r_attrs, EL_STR("attrs")); + p = el_get_field(r_attrs, EL_STR("pos")); + el_release(r_attrs); + el_val_t k = tok_kind(tokens, p); + el_val_t self_closing = 0; + if (str_eq(k, EL_STR("Slash"))) { + p = (p + 1); + p = expect(tokens, p, EL_STR("Gt")); + self_closing = 1; + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", native_list_empty(), "self_closing", 1), p); + } + p = expect(tokens, p, EL_STR("Gt")); + if (is_void_element(tag_name)) { + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", native_list_empty(), "self_closing", 1), p); + } + if (str_eq(tag_name, EL_STR("style"))) { + el_val_t r_raw = parse_raw_text_content(tokens, p, EL_STR("style")); + el_val_t raw_text = el_get_field(r_raw, EL_STR("text")); + p = el_get_field(r_raw, EL_STR("pos")); + el_release(r_raw); + el_val_t raw_child = el_map_new(2, "html", EL_STR("Text"), "text", raw_text); + el_val_t raw_children = native_list_empty(); + raw_children = native_list_append(raw_children, raw_child); + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", raw_children, "self_closing", 0), p); + } + if (str_eq(tag_name, EL_STR("script"))) { + el_val_t r_raw = parse_raw_text_content(tokens, p, EL_STR("script")); + el_val_t raw_text = el_get_field(r_raw, EL_STR("text")); + p = el_get_field(r_raw, EL_STR("pos")); + el_release(r_raw); + el_val_t raw_child = el_map_new(2, "html", EL_STR("Text"), "text", raw_text); + el_val_t raw_children = native_list_empty(); + raw_children = native_list_append(raw_children, raw_child); + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", raw_children, "self_closing", 0), p); + } + el_val_t r_children = parse_html_children(tokens, p, tag_name); + el_val_t children = el_get_field(r_children, EL_STR("children")); + p = el_get_field(r_children, EL_STR("pos")); + el_release(r_children); + return make_result(el_map_new(5, "html", EL_STR("Element"), "tag", tag_name, "attrs", attrs, "children", children, "self_closing", 0), p); + return 0; +} + +el_val_t parse_html_template(el_val_t tokens, el_val_t pos) { + el_val_t p = pos; + el_val_t doctype = 0; + el_val_t k = tok_kind(tokens, p); + el_val_t k2 = tok_kind(tokens, (p + 1)); + if (str_eq(k, EL_STR("Lt"))) { + if (str_eq(k2, EL_STR("Not"))) { + el_val_t k3_v = str_lower(tok_value(tokens, (p + 2))); + if (str_eq(k3_v, EL_STR("doctype"))) { + doctype = 1; + p = (p + 2); + el_val_t scanning = 1; + while (scanning) { + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("Eof"))) { + scanning = 0; + } + if (str_eq(ck, EL_STR("Gt"))) { + p = (p + 1); + scanning = 0; + } else { + p = (p + 1); + } + } + } + } + } + el_val_t r = parse_html_element(tokens, p); + el_val_t root = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t root_with_doctype = root; + if (doctype) { + root_with_doctype = el_map_new(6, "html", el_get_field(root, EL_STR("html")), "tag", el_get_field(root, EL_STR("tag")), "attrs", el_get_field(root, EL_STR("attrs")), "children", el_get_field(root, EL_STR("children")), "self_closing", el_get_field(root, EL_STR("self_closing")), "doctype", 1); + } + return make_result(el_map_new(2, "expr", EL_STR("HtmlTemplate"), "root", root_with_doctype), p); + return 0; +} + +el_val_t parse_primary(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + el_val_t v = tok_value(tokens, pos); + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "expr", EL_STR("Int"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Float"))) { + return make_result(el_map_new(2, "expr", EL_STR("Float"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "expr", EL_STR("Str"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "expr", EL_STR("Bool"), "value", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Lt"))) { + el_val_t k2 = tok_kind(tokens, (pos + 1)); + if (str_eq(k2, EL_STR("Not"))) { + return parse_html_template(tokens, pos); + } + if (str_eq(k2, EL_STR("Ident"))) { + el_val_t tag_candidate = tok_value(tokens, (pos + 1)); + if (is_html_tag_name(tag_candidate)) { + return parse_html_template(tokens, pos); + } + } + } + if (str_eq(k, EL_STR("Ident"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("LParen"))) { + el_val_t r = parse_expr(tokens, (pos + 1)); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + p = expect(tokens, p, EL_STR("RParen")); + return make_result(node, p); + } + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t p = (pos + 1); + el_val_t elems = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBracket"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_expr(tokens, p); + el_val_t elem = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + elems = native_list_append(elems, elem); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBracket")); + return make_result(el_map_new(2, "expr", EL_STR("Array"), "elems", elems), p); + } + if (str_eq(k, EL_STR("LBrace"))) { + el_val_t no_block = state_get(EL_STR("__no_block_expr")); + if (str_eq(no_block, EL_STR("1"))) { + return make_result(el_map_new(1, "expr", EL_STR("Nil")), pos); + } + el_val_t first_k = tok_kind(tokens, (pos + 1)); + el_val_t second_k = tok_kind(tokens, (pos + 2)); + if (str_eq(first_k, EL_STR("RBrace"))) { + return make_result(el_map_new(2, "expr", EL_STR("Map"), "pairs", native_list_empty()), (pos + 2)); + } + if (str_eq(second_k, EL_STR("Colon"))) { + el_val_t p = (pos + 1); + el_val_t pairs = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t key = tok_value(tokens, p); + el_val_t new_p = (p + 1); + new_p = expect(tokens, new_p, EL_STR("Colon")); + el_val_t r = parse_expr(tokens, new_p); + el_val_t val_node = el_get_field(r, EL_STR("node")); + new_p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t pair = el_map_new(2, "key", key, "value", val_node); + pairs = native_list_append(pairs, pair); + el_val_t k3 = tok_kind(tokens, new_p); + if (str_eq(k3, EL_STR("Comma"))) { + new_p = (new_p + 1); + } + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(2, "expr", EL_STR("Map"), "pairs", pairs), p); + } + el_val_t p = pos; + el_val_t chain_node = el_map_new(1, "expr", EL_STR("Nil")); + el_val_t chain_started = 0; + el_val_t chain_running = 1; + while (chain_running) { + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("LBrace"))) { + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, (p + 1)); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t part = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + p = expect(tokens, p, EL_STR("RBrace")); + if (!chain_started) { + chain_node = part; + chain_started = 1; + } else { + chain_node = el_map_new(4, "expr", EL_STR("BinOp"), "op", EL_STR("Plus"), "left", chain_node, "right", part); + } + } else { + if (str_eq(ck, EL_STR("Lt"))) { + el_val_t ck2 = tok_kind(tokens, (p + 1)); + if (str_eq(ck2, EL_STR("Not"))) { + el_val_t r = parse_html_template(tokens, p); + el_val_t part = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + if (!chain_started) { + chain_node = part; + chain_started = 1; + } else { + chain_node = el_map_new(4, "expr", EL_STR("BinOp"), "op", EL_STR("Plus"), "left", chain_node, "right", part); + } + } else { + if (str_eq(ck2, EL_STR("Ident"))) { + el_val_t tag_candidate = tok_value(tokens, (p + 1)); + if (is_html_tag_name(tag_candidate)) { + el_val_t r = parse_html_template(tokens, p); + el_val_t part = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + if (!chain_started) { + chain_node = part; + chain_started = 1; + } else { + chain_node = el_map_new(4, "expr", EL_STR("BinOp"), "op", EL_STR("Plus"), "left", chain_node, "right", part); + } + } else { + chain_running = 0; + } + } else { + chain_running = 0; + } + } + } else { + chain_running = 0; + } + } + } + return make_result(chain_node, p); + } + if (str_eq(k, EL_STR("If"))) { + el_val_t r = parse_if(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Match"))) { + el_val_t r = parse_match(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("For"))) { + el_val_t r = parse_for_expr(tokens, pos); + return r; + } + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t r = parse_params(tokens, p); + el_val_t params = el_get_field(r, EL_STR("params")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t ret_type = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ret_type = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + return make_result(el_map_new(4, "expr", EL_STR("Lambda"), "params", params, "body", body, "ret_type", ret_type), p); + } + if (str_eq(k, EL_STR("Not"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(2, "expr", EL_STR("Not"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Minus"))) { + el_val_t r = parse_primary(tokens, (pos + 1)); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(2, "expr", EL_STR("Neg"), "inner", inner), p); + } + if (str_eq(k, EL_STR("Target"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("To"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Via"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Deploy"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Reason"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Times"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Fallback"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Retry"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Parallel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Trace"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Requires"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Where"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("As"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("With"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Manager"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Engine"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Accessor"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Vessel"))) { + return make_result(el_map_new(2, "expr", EL_STR("Ident"), "name", v), (pos + 1)); + } + return make_result(el_map_new(1, "expr", EL_STR("Nil")), (pos + 1)); + return 0; +} + +el_val_t parse_if(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("If")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t r2 = parse_block(tokens, p); + el_val_t then_stmts = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + el_val_t has_else = 0; + el_val_t else_stmts = native_list_empty(); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Else"))) { + p = (p + 1); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("If"))) { + el_val_t r3 = parse_if(tokens, p); + el_val_t nested = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + el_release(r3); + else_stmts = native_list_append(else_stmts, el_map_new(2, "stmt", EL_STR("Expr"), "value", nested)); + has_else = 1; + } else { + el_val_t r3 = parse_block(tokens, p); + else_stmts = el_get_field(r3, EL_STR("stmts")); + p = el_get_field(r3, EL_STR("pos")); + el_release(r3); + has_else = 1; + } + } + return make_result(el_map_new(5, "expr", EL_STR("If"), "cond", cond, "then", then_stmts, "else", else_stmts, "has_else", has_else), p); + return 0; +} + +el_val_t parse_match(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("Match")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t subject = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t arms = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r2 = parse_pattern(tokens, p); + el_val_t pattern = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + p = expect(tokens, p, EL_STR("FatArrow")); + el_val_t r3 = parse_expr(tokens, p); + el_val_t body = el_get_field(r3, EL_STR("node")); + p = el_get_field(r3, EL_STR("pos")); + el_release(r3); + el_val_t arm = el_map_new(2, "pattern", pattern, "body", body); + arms = native_list_append(arms, arm); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "expr", EL_STR("Match"), "subject", subject, "arms", arms), p); + return 0; +} + +el_val_t parse_pattern(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Ident"))) { + el_val_t v = tok_value(tokens, pos); + if (str_eq(v, EL_STR("_"))) { + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + } + el_val_t next_k = tok_kind(tokens, (pos + 1)); + if (str_eq(next_k, EL_STR("ColonColon"))) { + el_val_t variant_name = tok_value(tokens, (pos + 2)); + return make_result(el_map_new(3, "pattern", EL_STR("Variant"), "enum_name", v, "variant", variant_name), (pos + 3)); + } + return make_result(el_map_new(2, "pattern", EL_STR("Binding"), "name", v), (pos + 1)); + } + if (str_eq(k, EL_STR("Int"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitInt"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Str"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitStr"), "value", tok_value(tokens, pos)), (pos + 1)); + } + if (str_eq(k, EL_STR("Bool"))) { + return make_result(el_map_new(2, "pattern", EL_STR("LitBool"), "value", tok_value(tokens, pos)), (pos + 1)); + } + return make_result(el_map_new(1, "pattern", EL_STR("Wildcard")), (pos + 1)); + return 0; +} + +el_val_t parse_for_expr(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("For")); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t list_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + return make_result(el_map_new(4, "expr", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + return 0; +} + +el_val_t parse_block(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LBrace")); + el_val_t stmts = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, p); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_p = el_get_field(r, EL_STR("pos")); + el_release(r); + stmts = native_list_append(stmts, stmt); + if (new_p <= p) { + p = (p + 1); + } else { + p = new_p; + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return el_map_new(2, "stmts", stmts, "pos", p); + return 0; +} + +el_val_t is_duration_unit(el_val_t name) { + if (str_eq(name, EL_STR("nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("nano"))) { + return 1; + } + if (str_eq(name, EL_STR("millis"))) { + return 1; + } + if (str_eq(name, EL_STR("milli"))) { + return 1; + } + if (str_eq(name, EL_STR("millisecond"))) { + return 1; + } + if (str_eq(name, EL_STR("milliseconds"))) { + return 1; + } + if (str_eq(name, EL_STR("second"))) { + return 1; + } + if (str_eq(name, EL_STR("seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("minute"))) { + return 1; + } + if (str_eq(name, EL_STR("minutes"))) { + return 1; + } + if (str_eq(name, EL_STR("hour"))) { + return 1; + } + if (str_eq(name, EL_STR("hours"))) { + return 1; + } + if (str_eq(name, EL_STR("day"))) { + return 1; + } + if (str_eq(name, EL_STR("days"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_postfix(el_val_t tokens, el_val_t pos) { + el_val_t r = parse_primary(tokens, pos); + el_val_t node = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t primary_kind = el_get_field(node, EL_STR("expr")); + if (str_eq(primary_kind, EL_STR("Int"))) { + el_val_t dot_kind = tok_kind(tokens, p); + if (str_eq(dot_kind, EL_STR("Dot"))) { + el_val_t unit_kind = tok_kind(tokens, (p + 1)); + if (str_eq(unit_kind, EL_STR("Ident"))) { + el_val_t unit_name = tok_value(tokens, (p + 1)); + if (is_duration_unit(unit_name)) { + el_val_t count_str = el_get_field(node, EL_STR("value")); + node = el_map_new(3, "expr", EL_STR("DurationLit"), "count", count_str, "unit", unit_name); + p = (p + 2); + } + } + } + } + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + if (str_eq(k, EL_STR("LParen"))) { + p = (p + 1); + el_val_t args = native_list_empty(); + el_val_t run2 = 1; + while (run2) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RParen"))) { + run2 = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + run2 = 0; + } else { + el_val_t r2 = parse_expr(tokens, p); + el_val_t arg = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + args = native_list_append(args, arg); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + node = el_map_new(3, "expr", EL_STR("Call"), "func", node, "args", args); + } else { + if (str_eq(k, EL_STR("Dot"))) { + el_val_t field = tok_value(tokens, (p + 1)); + p = (p + 2); + node = el_map_new(3, "expr", EL_STR("Field"), "object", node, "field", field); + } else { + if (str_eq(k, EL_STR("LBracket"))) { + el_val_t r2 = parse_expr(tokens, (p + 1)); + el_val_t idx = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + p = expect(tokens, p, EL_STR("RBracket")); + node = el_map_new(3, "expr", EL_STR("Index"), "object", node, "index", idx); + } else { + if (str_eq(k, EL_STR("QuestionMark"))) { + p = (p + 1); + node = el_map_new(2, "expr", EL_STR("Try"), "inner", node); + } else { + running = 0; + } + } + } + } + } + return make_result(node, p); + return 0; +} + +el_val_t op_precedence(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 2; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 3; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 4; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 4; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 4; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 5; + } + if (str_eq(kind, EL_STR("Star"))) { + return 6; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 6; + } + if (str_eq(kind, EL_STR("Percent"))) { + return 6; + } + return 0; + return 0; +} + +el_val_t is_binop(el_val_t kind) { + if (str_eq(kind, EL_STR("Or"))) { + return 1; + } + if (str_eq(kind, EL_STR("And"))) { + return 1; + } + if (str_eq(kind, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Lt"))) { + return 1; + } + if (str_eq(kind, EL_STR("Gt"))) { + return 1; + } + if (str_eq(kind, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(kind, EL_STR("Plus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Minus"))) { + return 1; + } + if (str_eq(kind, EL_STR("Star"))) { + return 1; + } + if (str_eq(kind, EL_STR("Slash"))) { + return 1; + } + if (str_eq(kind, EL_STR("Percent"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t parse_binop(el_val_t tokens, el_val_t pos, el_val_t min_prec) { + el_val_t r = parse_postfix(tokens, pos); + el_val_t left = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t running = 1; + while (running) { + el_val_t k = tok_kind(tokens, p); + el_val_t prec = op_precedence(k); + if (is_binop(k)) { + if (prec >= min_prec) { + el_val_t op = k; + el_val_t r2 = parse_binop(tokens, (p + 1), (prec + 1)); + el_val_t right = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + left = el_map_new(4, "expr", EL_STR("BinOp"), "op", op, "left", left, "right", right); + } else { + running = 0; + } + } else { + running = 0; + } + } + return make_result(left, p); + return 0; +} + +el_val_t parse_expr(el_val_t tokens, el_val_t pos) { + return parse_binop(tokens, pos, 1); + return 0; +} + +el_val_t parse_stmt(el_val_t tokens, el_val_t pos) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Let"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t ltype = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Colon"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ltype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("Eq")); + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(4, "stmt", EL_STR("Let"), "name", name, "value", val, "type", ltype), p); + } + if (str_eq(k, EL_STR("Return"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + if (str_eq(k2, EL_STR("Eof"))) { + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", el_map_new(1, "expr", EL_STR("Nil"))), p); + } + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(2, "stmt", EL_STR("Return"), "value", val), p); + } + if (str_eq(k, EL_STR("Extern"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Fn"))) { + p = (p + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_params(tokens, p); + el_val_t params = el_get_field(r, EL_STR("params")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t ret_type = EL_STR(""); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ret_type = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + return make_result(el_map_new(4, "stmt", EL_STR("ExternFn"), "name", name, "params", params, "ret_type", ret_type), p); + } + } + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_params(tokens, p); + el_val_t params = el_get_field(r, EL_STR("params")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t ret_type = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ret_type = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + return make_result(el_map_new(5, "stmt", EL_STR("FnDef"), "name", name, "params", params, "body", body, "ret_type", ret_type), p); + } + if (str_eq(k, EL_STR("Type"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t pk = tok_kind(tokens, p); + if (str_eq(pk, EL_STR("Eq"))) { + p = (p + 1); + } + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t fields = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + p = skip_type(tokens, p); + fields = native_list_append(fields, el_map_new(1, "name", fname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("TypeDef"), "name", name, "fields", fields), p); + } + if (str_eq(k, EL_STR("Enum"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t variants = native_list_empty(); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t vname = tok_value(tokens, p); + p = (p + 1); + variants = native_list_append(variants, el_map_new(1, "name", vname)); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(3, "stmt", EL_STR("EnumDef"), "name", name, "variants", variants), p); + } + if (str_eq(k, EL_STR("Import"))) { + el_val_t p = (pos + 1); + el_val_t path = tok_value(tokens, p); + p = (p + 1); + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", path), p); + } + if (str_eq(k, EL_STR("From"))) { + el_val_t p = (pos + 1); + el_val_t module_name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Import"))) { + p = (p + 1); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("LBrace"))) { + p = (p + 1); + el_val_t running = 1; + while (running) { + el_val_t k4 = tok_kind(tokens, p); + if (str_eq(k4, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k4, EL_STR("Eof"))) { + running = 0; + } else { + p = (p + 1); + el_val_t k5 = tok_kind(tokens, p); + if (str_eq(k5, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + } + return make_result(el_map_new(2, "stmt", EL_STR("Import"), "path", module_name), p); + } + if (str_eq(k, EL_STR("While"))) { + el_val_t p = (pos + 1); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t cond = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + return make_result(el_map_new(3, "stmt", EL_STR("While"), "cond", cond, "body", body), p); + } + if (str_eq(k, EL_STR("Break"))) { + return make_result(el_map_new(1, "stmt", EL_STR("Break")), (pos + 1)); + } + if (str_eq(k, EL_STR("Continue"))) { + return make_result(el_map_new(1, "stmt", EL_STR("Continue")), (pos + 1)); + } + if (str_eq(k, EL_STR("For"))) { + el_val_t p = (pos + 1); + el_val_t item_name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("In")); + el_val_t prev_no_block = state_get(EL_STR("__no_block_expr")); + state_set(EL_STR("__no_block_expr"), EL_STR("1")); + el_val_t r = parse_expr(tokens, p); + state_set(EL_STR("__no_block_expr"), prev_no_block); + el_val_t start_expr = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t range_k = tok_kind(tokens, p); + if (str_eq(range_k, EL_STR("DotDot"))) { + p = (p + 1); + el_val_t r2 = parse_expr(tokens, p); + el_val_t end_expr = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + el_val_t r3 = parse_block(tokens, p); + el_val_t body = el_get_field(r3, EL_STR("stmts")); + p = el_get_field(r3, EL_STR("pos")); + el_release(r3); + return make_result(el_map_new(6, "stmt", EL_STR("ForRange"), "var", item_name, "start", start_expr, "end", end_expr, "inclusive", 0, "body", body), p); + } + if (str_eq(range_k, EL_STR("DotDotEq"))) { + p = (p + 1); + el_val_t r2 = parse_expr(tokens, p); + el_val_t end_expr = el_get_field(r2, EL_STR("node")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + el_val_t r3 = parse_block(tokens, p); + el_val_t body = el_get_field(r3, EL_STR("stmts")); + p = el_get_field(r3, EL_STR("pos")); + el_release(r3); + return make_result(el_map_new(6, "stmt", EL_STR("ForRange"), "var", item_name, "start", start_expr, "end", end_expr, "inclusive", 1, "body", body), p); + } + el_val_t list_expr = start_expr; + el_val_t r2 = parse_block(tokens, p); + el_val_t body = el_get_field(r2, EL_STR("stmts")); + p = el_get_field(r2, EL_STR("pos")); + el_release(r2); + return make_result(el_map_new(4, "stmt", EL_STR("For"), "item", item_name, "list", list_expr, "body", body), p); + } + if (str_eq(k, EL_STR("Try"))) { + el_val_t p = (pos + 1); + el_val_t r_try = parse_block(tokens, p); + el_val_t try_body = el_get_field(r_try, EL_STR("stmts")); + p = el_get_field(r_try, EL_STR("pos")); + el_release(r_try); + el_val_t catch_name = EL_STR("err"); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Catch"))) { + p = (p + 1); + p = expect(tokens, p, EL_STR("LParen")); + el_val_t kn = tok_kind(tokens, p); + if (str_eq(kn, EL_STR("Ident"))) { + catch_name = tok_value(tokens, p); + p = (p + 1); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Colon"))) { + p = (p + 1); + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("RParen")); + el_val_t r_catch = parse_block(tokens, p); + el_val_t catch_body = el_get_field(r_catch, EL_STR("stmts")); + p = el_get_field(r_catch, EL_STR("pos")); + el_release(r_catch); + return make_result(el_map_new(4, "stmt", EL_STR("TryCatch"), "try_body", try_body, "catch_name", catch_name, "catch_body", catch_body), p); + } + return make_result(el_map_new(4, "stmt", EL_STR("TryCatch"), "try_body", try_body, "catch_name", catch_name, "catch_body", native_list_empty()), p); + } + if (str_eq(k, EL_STR("At"))) { + el_val_t p = (pos + 1); + el_val_t dec_name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = parse_stmt(tokens, p); + el_val_t inner = el_get_field(r, EL_STR("node")); + el_val_t p2 = el_get_field(r, EL_STR("pos")); + el_val_t inner_kind = el_get_field(inner, EL_STR("stmt")); + if (str_eq(inner_kind, EL_STR("FnDef"))) { + el_val_t with_dec = el_map_new(6, "stmt", EL_STR("FnDef"), "name", el_get_field(inner, EL_STR("name")), "params", el_get_field(inner, EL_STR("params")), "body", el_get_field(inner, EL_STR("body")), "ret_type", el_get_field(inner, EL_STR("ret_type")), "decorator", dec_name); + el_release(r); + return make_result(with_dec, p2); + } + return r; + } + if (str_eq(k, EL_STR("Cgi"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t dharma_id = EL_STR(""); + el_val_t principal = EL_STR(""); + el_val_t network = EL_STR(""); + el_val_t engram = EL_STR(""); + el_val_t has_dharma_id = 0; + el_val_t has_principal = 0; + el_val_t has_network = 0; + el_val_t has_engram = 0; + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("dharma_id"))) { + dharma_id = fval; + has_dharma_id = 1; + } + if (str_eq(fname, EL_STR("principal"))) { + principal = fval; + has_principal = 1; + } + if (str_eq(fname, EL_STR("network"))) { + network = fval; + has_network = 1; + } + if (str_eq(fname, EL_STR("engram"))) { + engram = fval; + has_engram = 1; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(10, "stmt", EL_STR("CgiBlock"), "name", name, "dharma_id", dharma_id, "principal", principal, "network", network, "engram", engram, "has_dharma_id", has_dharma_id, "has_principal", has_principal, "has_network", has_network, "has_engram", has_engram), p); + } + if (str_eq(k, EL_STR("Service"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("LBrace")); + el_val_t sponsor = EL_STR(""); + el_val_t domain = EL_STR(""); + el_val_t running = 1; + while (running) { + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("RBrace"))) { + running = 0; + } else { + if (str_eq(k2, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t fname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t fval = tok_value(tokens, p); + p = (p + 1); + if (str_eq(fname, EL_STR("sponsor"))) { + sponsor = fval; + } + if (str_eq(fname, EL_STR("domain"))) { + domain = fval; + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RBrace")); + return make_result(el_map_new(4, "stmt", EL_STR("ServiceBlock"), "name", name, "sponsor", sponsor, "domain", domain), p); + } + if (str_eq(k, EL_STR("Assert"))) { + el_val_t p = (pos + 1); + el_val_t cond_r = parse_expr(tokens, p); + el_val_t cond_node = el_get_field(cond_r, EL_STR("node")); + p = el_get_field(cond_r, EL_STR("pos")); + el_release(cond_r); + el_val_t after_k = tok_kind(tokens, p); + if (str_eq(after_k, EL_STR("Comma"))) { + p = (p + 1); + el_val_t msg_r = parse_expr(tokens, p); + el_val_t msg_node = el_get_field(msg_r, EL_STR("node")); + p = el_get_field(msg_r, EL_STR("pos")); + el_release(msg_r); + return make_result(el_map_new(3, "stmt", EL_STR("Assert"), "cond", cond_node, "msg", msg_node), p); + } + return make_result(el_map_new(3, "stmt", EL_STR("Assert"), "cond", cond_node, "msg", el_map_new(2, "expr", EL_STR("Str"), "value", EL_STR(""))), p); + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t k2 = tok_kind(tokens, (pos + 1)); + if (str_eq(k2, EL_STR("Eq"))) { + el_val_t name = tok_value(tokens, pos); + el_val_t p = (pos + 2); + el_val_t r = parse_expr(tokens, p); + el_val_t val = el_get_field(r, EL_STR("node")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(3, "stmt", EL_STR("Assign"), "name", name, "value", val), p); + } + } + el_val_t r = parse_expr(tokens, pos); + el_val_t val = el_get_field(r, EL_STR("node")); + el_val_t p = el_get_field(r, EL_STR("pos")); + el_release(r); + return make_result(el_map_new(2, "stmt", EL_STR("Expr"), "value", val), p); + return 0; +} + +el_val_t parse(el_val_t tokens) { + el_val_t total = (native_list_len(tokens) / 2); + el_val_t stmts = native_list_empty(); + el_val_t pos = 0; + el_val_t running = 1; + while (running) { + if (pos >= total) { + running = 0; + } else { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + running = 0; + } else { + el_val_t r = parse_stmt(tokens, pos); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_pos = el_get_field(r, EL_STR("pos")); + el_release(r); + stmts = native_list_append(stmts, stmt); + if (new_pos <= pos) { + pos = (pos + 1); + } else { + pos = new_pos; + } + } + } + } + return stmts; + return 0; +} + +el_val_t parse_one(el_val_t tokens, el_val_t pos) { + return parse_stmt(tokens, pos); + return 0; +} + +el_val_t skip_to_rbrace(el_val_t tokens, el_val_t pos) { + el_val_t total = (native_list_len(tokens) / 2); + el_val_t p = (pos + 1); + el_val_t depth = 1; + el_val_t going = 1; + while (going) { + if (p >= total) { + going = 0; + } else { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("Eof"))) { + going = 0; + } else { + if (str_eq(kk, EL_STR("LBrace"))) { + depth = (depth + 1); + p = (p + 1); + } else { + if (str_eq(kk, EL_STR("RBrace"))) { + depth = (depth - 1); + p = (p + 1); + if (depth <= 0) { + going = 0; + } + } else { + p = (p + 1); + } + } + } + } + } + return p; + return 0; +} + +el_val_t is_stmt_start_kind(el_val_t k) { + if (str_eq(k, EL_STR("Fn"))) { + return 1; + } + if (str_eq(k, EL_STR("Let"))) { + return 1; + } + if (str_eq(k, EL_STR("Extern"))) { + return 1; + } + if (str_eq(k, EL_STR("Cgi"))) { + return 1; + } + if (str_eq(k, EL_STR("Service"))) { + return 1; + } + if (str_eq(k, EL_STR("Type"))) { + return 1; + } + if (str_eq(k, EL_STR("Enum"))) { + return 1; + } + if (str_eq(k, EL_STR("Import"))) { + return 1; + } + if (str_eq(k, EL_STR("From"))) { + return 1; + } + if (str_eq(k, EL_STR("Eof"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t skip_expr_to_stmt_boundary(el_val_t tokens, el_val_t pos) { + el_val_t total = (native_list_len(tokens) / 2); + el_val_t p = pos; + el_val_t depth = 0; + el_val_t going = 1; + while (going) { + if (p >= total) { + going = 0; + } else { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("Eof"))) { + going = 0; + } else { + if (str_eq(kk, EL_STR("LBrace"))) { + depth = (depth + 1); + p = (p + 1); + } else { + if (str_eq(kk, EL_STR("RBrace"))) { + if (depth <= 0) { + going = 0; + } else { + depth = (depth - 1); + p = (p + 1); + } + } else { + if (depth == 0) { + if (is_stmt_start_kind(kk)) { + going = 0; + } else { + p = (p + 1); + } + } else { + p = (p + 1); + } + } + } + } + } + } + return p; + return 0; +} + +el_val_t scan_params_c(el_val_t tokens, el_val_t pos) { + el_val_t p = expect(tokens, pos, EL_STR("LParen")); + el_val_t parts = native_list_empty(); + el_val_t going = 1; + while (going) { + el_val_t kk = tok_kind(tokens, p); + if (str_eq(kk, EL_STR("RParen"))) { + going = 0; + } else { + if (str_eq(kk, EL_STR("Eof"))) { + going = 0; + } else { + el_val_t pname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + p = skip_type(tokens, p); + parts = native_list_append(parts, el_str_concat(EL_STR("el_val_t "), pname)); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + el_val_t c_str = str_join(parts, EL_STR(", ")); + el_release(parts); + if (str_eq(c_str, EL_STR(""))) { + c_str = EL_STR("void"); + } + return el_map_new(2, "c", c_str, "pos", p); + return 0; +} + +el_val_t scan_fn_sigs(el_val_t tokens) { + el_val_t total = (native_list_len(tokens) / 2); + el_val_t sigs = native_list_empty(); + el_val_t pos = 0; + el_val_t going = 1; + while (going) { + if (pos >= total) { + going = 0; + } else { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + going = 0; + } else { + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = scan_params_c(tokens, p); + el_val_t params_c = el_get_field(r, EL_STR("c")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Arrow"))) { + p = (p + 1); + p = skip_type(tokens, p); + } + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("LBrace"))) { + p = skip_to_rbrace(tokens, p); + } + el_val_t is_main = str_eq(name, EL_STR("main")); + sigs = native_list_append(sigs, el_map_new(4, "kind", EL_STR("fn"), "name", name, "params_c", params_c, "is_main", is_main)); + pos = p; + } else { + if (str_eq(k, EL_STR("Extern"))) { + el_val_t p = (pos + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Fn"))) { + p = (p + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t r = scan_params_c(tokens, p); + el_val_t params_c = el_get_field(r, EL_STR("c")); + p = el_get_field(r, EL_STR("pos")); + el_release(r); + el_val_t k3 = tok_kind(tokens, p); + if (str_eq(k3, EL_STR("Arrow"))) { + p = (p + 1); + p = skip_type(tokens, p); + } + sigs = native_list_append(sigs, el_map_new(4, "kind", EL_STR("extern_fn"), "name", name, "params_c", params_c, "is_main", 0)); + pos = p; + } else { + pos = (pos + 1); + } + } else { + if (str_eq(k, EL_STR("Let"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t ltype = EL_STR(""); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("Colon"))) { + p = (p + 1); + el_val_t kt = tok_kind(tokens, p); + if (str_eq(kt, EL_STR("Ident"))) { + ltype = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + p = expect(tokens, p, EL_STR("Eq")); + p = skip_expr_to_stmt_boundary(tokens, p); + sigs = native_list_append(sigs, el_map_new(3, "kind", EL_STR("toplevel_let"), "name", name, "ltype", ltype)); + pos = p; + } else { + if (str_eq(k, EL_STR("Cgi"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("LBrace"))) { + p = skip_to_rbrace(tokens, p); + } + sigs = native_list_append(sigs, el_map_new(2, "kind", EL_STR("cgi_block"), "name", name)); + pos = p; + } else { + if (str_eq(k, EL_STR("Service"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + el_val_t k2 = tok_kind(tokens, p); + if (str_eq(k2, EL_STR("LBrace"))) { + p = skip_to_rbrace(tokens, p); + } + sigs = native_list_append(sigs, el_map_new(2, "kind", EL_STR("service_block"), "name", name)); + pos = p; + } else { + el_val_t p = (pos + 1); + p = skip_expr_to_stmt_boundary(tokens, p); + pos = p; + } + } + } + } + } + } + } + } + return sigs; + return 0; +} + +el_val_t nibble_to_hex(el_val_t n) { + return str_char_at(EL_STR("0123456789abcdef"), n); + return 0; +} + +el_val_t byte_to_hex2(el_val_t b) { + el_val_t hi = (b / 16); + el_val_t lo = (b - (hi * 16)); + return el_str_concat(nibble_to_hex(hi), nibble_to_hex(lo)); + return 0; +} + +el_val_t is_hex_digit_byte(el_val_t b) { + if (b >= 48) { + if (b <= 57) { + return 1; + } + } + if (b >= 65) { + if (b <= 70) { + return 1; + } + } + if (b >= 97) { + if (b <= 102) { + return 1; + } + } + return 0; + return 0; +} + +el_val_t c_escape(el_val_t s) { + el_val_t total = str_len(s); + el_val_t parts = native_list_empty(); + el_val_t i = 0; + el_val_t clean_start = 0; + el_val_t prev_was_hex_escape = 0; + while (i < total) { + el_val_t bval = str_char_code(s, i); + if (prev_was_hex_escape) { + if (is_hex_digit_byte(bval)) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\"\"")); + clean_start = i; + } + } + prev_was_hex_escape = 0; + if (bval == 34) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\\\"")); + clean_start = (i + 1); + } else { + if (bval == 92) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\\\\")); + clean_start = (i + 1); + } else { + if (bval == 10) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\\n")); + clean_start = (i + 1); + } else { + if (bval == 13) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\\r")); + clean_start = (i + 1); + } else { + if (bval == 9) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, EL_STR("\\t")); + clean_start = (i + 1); + } else { + if (bval >= 128) { + if (clean_start < i) { + parts = native_list_append(parts, str_slice(s, clean_start, i)); + } + parts = native_list_append(parts, el_str_concat(EL_STR("\\x"), byte_to_hex2(bval))); + prev_was_hex_escape = 1; + clean_start = (i + 1); + } + } + } + } + } + } + i = (i + 1); + } + if (clean_start < total) { + parts = native_list_append(parts, str_slice(s, clean_start, total)); + } + el_val_t result = str_join(parts, EL_STR("")); + el_release(parts); + return result; + return 0; +} + +el_val_t c_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), c_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t sanitize_test_name(el_val_t name) { + el_val_t n = str_len(name); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t code = str_char_code(name, i); + if (code >= 97) { + if (code <= 122) { + out = el_str_concat(out, str_char_at(name, i)); + } else { + out = el_str_concat(out, EL_STR("_")); + } + } else { + if (code >= 65) { + if (code <= 90) { + out = el_str_concat(out, str_char_at(name, i)); + } else { + if (code >= 48) { + if (code <= 57) { + out = el_str_concat(out, str_char_at(name, i)); + } else { + out = el_str_concat(out, EL_STR("_")); + } + } else { + out = el_str_concat(out, EL_STR("_")); + } + } + } else { + if (code >= 48) { + if (code <= 57) { + out = el_str_concat(out, str_char_at(name, i)); + } else { + out = el_str_concat(out, EL_STR("_")); + } + } else { + out = el_str_concat(out, EL_STR("_")); + } + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t el_type_to_c(el_val_t type_str) { + if (str_eq(type_str, EL_STR("String"))) { + return EL_STR("const char*"); + } + if (str_eq(type_str, EL_STR("Int"))) { + return EL_STR("int64_t"); + } + if (str_eq(type_str, EL_STR("Bool"))) { + return EL_STR("int"); + } + if (str_eq(type_str, EL_STR("Float"))) { + return EL_STR("double"); + } + if (str_eq(type_str, EL_STR("Void"))) { + return EL_STR("void"); + } + if (str_eq(type_str, EL_STR("void"))) { + return EL_STR("void"); + } + return EL_STR("void*"); + return 0; +} + +el_val_t emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t binop_to_c(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("Percent"))) { + return EL_STR("%"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("=="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t duration_unit_nanos(el_val_t unit) { + if (str_eq(unit, EL_STR("nano"))) { + return EL_STR("1LL"); + } + if (str_eq(unit, EL_STR("nanos"))) { + return EL_STR("1LL"); + } + if (str_eq(unit, EL_STR("milli"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("millis"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("millisecond"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("milliseconds"))) { + return EL_STR("1000000LL"); + } + if (str_eq(unit, EL_STR("second"))) { + return EL_STR("1000000000LL"); + } + if (str_eq(unit, EL_STR("seconds"))) { + return EL_STR("1000000000LL"); + } + if (str_eq(unit, EL_STR("minute"))) { + return EL_STR("60000000000LL"); + } + if (str_eq(unit, EL_STR("minutes"))) { + return EL_STR("60000000000LL"); + } + if (str_eq(unit, EL_STR("hour"))) { + return EL_STR("3600000000000LL"); + } + if (str_eq(unit, EL_STR("hours"))) { + return EL_STR("3600000000000LL"); + } + if (str_eq(unit, EL_STR("day"))) { + return EL_STR("86400000000000LL"); + } + if (str_eq(unit, EL_STR("days"))) { + return EL_STR("86400000000000LL"); + } + return EL_STR("1LL"); + return 0; +} + +el_val_t next_html_id(void) { + el_val_t csv = state_get(EL_STR("__html_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__html_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_html_parts(el_val_t children, el_val_t acc_var) { + el_val_t n = native_list_len(children); + el_val_t i = 0; + el_val_t parts = native_list_empty(); + while (i < n) { + el_val_t child = native_list_get(children, i); + el_val_t html_kind = el_get_field(child, EL_STR("html")); + if (str_eq(html_kind, EL_STR("Text"))) { + el_val_t text = el_get_field(child, EL_STR("text")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(")), c_str_lit(text)), EL_STR(")); "))); + } + if (str_eq(html_kind, EL_STR("Doctype"))) { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"\")); "))); + } + if (str_eq(html_kind, EL_STR("Interp"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_escape(")), val_c), EL_STR(")); "))); + } + if (str_eq(html_kind, EL_STR("Raw"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_raw(")), val_c), EL_STR(")); "))); + } + if (str_eq(html_kind, EL_STR("Element"))) { + el_val_t elem_c = cg_html_element_str(child, acc_var); + parts = native_list_append(parts, elem_c); + } + if (str_eq(html_kind, EL_STR("Each"))) { + el_val_t each_c = cg_html_each(child, acc_var); + parts = native_list_append(parts, each_c); + } + if (str_eq(html_kind, EL_STR("HtmlIf"))) { + el_val_t if_c = cg_html_if(child, acc_var); + parts = native_list_append(parts, if_c); + } + i = (i + 1); + } + return str_join(parts, EL_STR("")); + return 0; +} + +el_val_t cg_html_attrs_str(el_val_t attrs, el_val_t acc_var) { + el_val_t n = native_list_len(attrs); + el_val_t i = 0; + el_val_t parts = native_list_empty(); + el_val_t close_q = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(EL_STR("\""))), EL_STR(")")); + while (i < n) { + el_val_t attr = native_list_get(attrs, i); + el_val_t attr_name = el_get_field(attr, EL_STR("name")); + el_val_t kind = el_get_field(attr, EL_STR("kind")); + el_val_t open_val = el_str_concat(el_str_concat(EL_STR(" "), attr_name), EL_STR("=\"")); + el_val_t open_attr = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(open_val)), EL_STR(")")); + if (str_eq(kind, EL_STR("static"))) { + el_val_t sv = el_get_field(attr, EL_STR("value")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), open_attr), EL_STR("); "))); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(")), c_str_lit(sv)), EL_STR(")); "))); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), close_q), EL_STR("); "))); + } else { + if (str_eq(kind, EL_STR("dynamic"))) { + el_val_t val_node = el_get_field(attr, EL_STR("value")); + el_val_t val_c = cg_expr(val_node); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), open_attr), EL_STR("); "))); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", html_escape(")), val_c), EL_STR(")); "))); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), close_q), EL_STR("); "))); + } else { + el_val_t bool_attr = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(el_str_concat(EL_STR(" "), attr_name))), EL_STR(")")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", ")), bool_attr), EL_STR("); "))); + } + } + i = (i + 1); + } + return str_join(parts, EL_STR("")); + return 0; +} + +el_val_t cg_html_element_str(el_val_t elem, el_val_t acc_var) { + el_val_t tag = el_get_field(elem, EL_STR("tag")); + el_val_t attrs = el_get_field(elem, EL_STR("attrs")); + el_val_t children = el_get_field(elem, EL_STR("children")); + el_val_t self_closing = el_get_field(elem, EL_STR("self_closing")); + el_val_t parts = native_list_empty(); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"<")), tag), EL_STR("\")); "))); + parts = native_list_append(parts, cg_html_attrs_str(attrs, acc_var)); + if (self_closing) { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"/>\")); "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\">\")); "))); + parts = native_list_append(parts, cg_html_parts(children, acc_var)); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" = el_str_concat(")), acc_var), EL_STR(", EL_STR(\"\")); "))); + } + return str_join(parts, EL_STR("")); + return 0; +} + +el_val_t cg_html_each(el_val_t node, el_val_t acc_var) { + el_val_t list_expr = el_get_field(node, EL_STR("list")); + el_val_t item_name = el_get_field(node, EL_STR("item")); + el_val_t body_children = el_get_field(node, EL_STR("body")); + el_val_t id = next_html_id(); + el_val_t list_var = el_str_concat(EL_STR("_html_list_"), id); + el_val_t len_var = el_str_concat(EL_STR("_html_len_"), id); + el_val_t idx_var = el_str_concat(EL_STR("_html_i_"), id); + el_val_t list_c = cg_expr(list_expr); + el_val_t inner_c = cg_html_parts(body_children, acc_var); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ el_val_t "), list_var), EL_STR(" = (")), list_c), EL_STR("); el_val_t ")), len_var), EL_STR(" = el_list_len(")), list_var), EL_STR("); for (el_val_t ")), idx_var), EL_STR(" = 0; ")), idx_var), EL_STR(" < ")), len_var), EL_STR("; ")), idx_var), EL_STR("++) { el_val_t ")), item_name), EL_STR(" = el_list_get(")), list_var), EL_STR(", ")), idx_var), EL_STR("); ")), inner_c), EL_STR("} } ")); + return 0; +} + +el_val_t cg_html_if(el_val_t node, el_val_t acc_var) { + el_val_t cond_expr = el_get_field(node, EL_STR("cond")); + el_val_t then_children = el_get_field(node, EL_STR("then")); + el_val_t else_children = el_get_field(node, EL_STR("else")); + el_val_t cond_c = cg_expr(cond_expr); + el_val_t then_c = cg_html_parts(then_children, acc_var); + el_val_t else_c = cg_html_parts(else_children, acc_var); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), cond_c), EL_STR(") { ")), then_c), EL_STR(" } else { ")), else_c), EL_STR(" } ")); + return 0; +} + +el_val_t cg_html_template(el_val_t expr) { + el_val_t root = el_get_field(expr, EL_STR("root")); + el_val_t id = next_html_id(); + el_val_t acc = el_str_concat(EL_STR("_html_"), id); + el_val_t doctype_flag = el_get_field(root, EL_STR("doctype")); + el_val_t doctype_prefix = EL_STR(""); + if (doctype_flag) { + doctype_prefix = el_str_concat(el_str_concat(el_str_concat(acc, EL_STR(" = el_str_concat(")), acc), EL_STR(", EL_STR(\"\")); ")); + } + el_val_t body = cg_html_element_str(root, acc); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), acc), EL_STR(" = EL_STR(\"\"); ")), doctype_prefix), body), acc), EL_STR("; })")); + return 0; +} + +el_val_t cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("DurationLit"))) { + el_val_t count = el_get_field(expr, EL_STR("count")); + el_val_t unit = el_get_field(expr, EL_STR("unit")); + el_val_t mult = duration_unit_nanos(unit); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_from_nanos((el_val_t)("), count), EL_STR("LL * ")), mult), EL_STR("))")); + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("el_from_float("), v), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(v)), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("1"); + } + return EL_STR("0"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("EL_NULL"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_kind = el_get_field(inner, EL_STR("expr")); + if (str_eq(inner_kind, EL_STR("Float"))) { + el_val_t fval = el_get_field(inner, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("el_from_float(-"), fval), EL_STR(")")); + } + el_val_t inner_c = cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = cg_expr(left); + el_val_t right_c = cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + el_val_t left_is_inst = is_instant_expr(left); + el_val_t right_is_inst = is_instant_expr(right); + el_val_t left_is_dur = is_duration_expr(left); + el_val_t right_is_dur = is_duration_expr(right); + el_val_t left_is_ld = is_localdate_expr(left); + el_val_t right_is_ld = is_localdate_expr(right); + el_val_t left_is_lt = is_localtime_expr(left); + el_val_t right_is_lt = is_localtime_expr(right); + el_val_t left_is_ct = is_caltime_expr(left); + el_val_t right_is_ct = is_caltime_expr(right); + if (left_is_ld) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("Lt"))) { + if (right_is_ld) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (right_is_ld) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_date_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (left_is_lt) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_local_time_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (left_is_ct) { + if (str_eq(op, EL_STR("Plus"))) { + if (right_is_ct) { + time_record_violation(EL_STR("caltime_plus_caltime"), EL_STR("CalendarTime + CalendarTime is not allowed (use cal_to_instant + Duration)")); + return EL_STR("0 /* TIME_TYPE_ERROR: CalendarTime + CalendarTime */"); + } + } + } + el_val_t any_temporal = 0; + if (left_is_inst) { + any_temporal = 1; + } + if (right_is_inst) { + any_temporal = 1; + } + if (left_is_dur) { + any_temporal = 1; + } + if (right_is_dur) { + any_temporal = 1; + } + if (any_temporal) { + if (str_eq(op, EL_STR("Plus"))) { + if (left_is_inst) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_add_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + time_record_violation(EL_STR("instant_plus_instant"), EL_STR("Instant + Instant is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Instant + Instant */"); + } + } + if (left_is_dur) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_add_dur("), right_c), EL_STR(", ")), left_c), EL_STR(")")); + } + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_add("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(right)) { + time_record_violation(EL_STR("duration_plus_int"), EL_STR("Duration + Int is not allowed (use duration_seconds(n) or N.seconds)")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration + Int */"); + } + } + if (right_is_dur) { + if (is_int_expr(left)) { + time_record_violation(EL_STR("duration_plus_int"), EL_STR("Int + Duration is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Int + Duration */"); + } + } + } + if (str_eq(op, EL_STR("Minus"))) { + if (left_is_inst) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_sub_dur("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_diff("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_sub("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(right)) { + time_record_violation(EL_STR("duration_minus_int"), EL_STR("Duration - Int is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration - Int */"); + } + } + } + if (str_eq(op, EL_STR("Star"))) { + if (left_is_dur) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_scale("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (right_is_dur) { + if (is_int_expr(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_scale("), right_c), EL_STR(", ")), left_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Slash"))) { + if (left_is_dur) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_div("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Lt"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_dur) { + time_record_violation(EL_STR("instant_cmp_duration"), EL_STR("Instant < Duration is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Instant < Duration */"); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_lt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (right_is_inst) { + time_record_violation(EL_STR("duration_cmp_instant"), EL_STR("Duration < Instant is not allowed")); + return EL_STR("0 /* TIME_TYPE_ERROR: Duration < Instant */"); + } + } + } + if (str_eq(op, EL_STR("LtEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_le("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_le("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("Gt"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_gt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_gt("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("GtEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_ge("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_ge("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (left_is_inst) { + if (right_is_inst) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_instant_ne("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (left_is_dur) { + if (right_is_dur) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_duration_ne("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (is_int_expr(left)) { + if (is_int_expr(right)) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("BinOp"))) { + el_val_t left_op = el_get_field(left, EL_STR("op")); + if (str_eq(left_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(right_kind, EL_STR("BinOp"))) { + el_val_t right_op = el_get_field(right, EL_STR("op")); + if (str_eq(right_op, EL_STR("Plus"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + } + } + } + if (is_int_expr(left)) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + } + if (is_float_expr(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (is_float_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" == ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (is_int_name(lname)) { + if (is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + } + } + } + if (is_int_expr(left)) { + if (is_int_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + } + if (is_float_expr(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (is_float_expr(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" != ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + el_val_t op_c = binop_to_c(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_parts = native_list_empty(); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = cg_expr(arg); + args_parts = native_list_append(args_parts, arg_c); + i = (i + 1); + } + el_val_t args_c = str_join(args_parts, EL_STR(", ")); + el_release(args_parts); + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + cap_check_call(fn_name); + arity_check_call(fn_name, arity); + if (str_eq(fn_name, EL_STR("sleep"))) { + if (arity == 1) { + el_val_t only_arg = native_list_get(args, 0); + if (is_duration_expr(only_arg)) { + return el_str_concat(el_str_concat(EL_STR("el_sleep_duration("), args_c), EL_STR(")")); + } + } + } + if (str_eq(fn_name, EL_STR("el_from_float"))) { + if (arity == 1) { + el_val_t only_arg = native_list_get(args, 0); + el_val_t arg_kind = el_get_field(only_arg, EL_STR("expr")); + if (str_eq(arg_kind, EL_STR("Float"))) { + el_val_t v = el_get_field(only_arg, EL_STR("value")); + return el_str_concat(el_str_concat(EL_STR("el_from_float("), v), EL_STR(")")); + } + } + } + return el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + el_val_t fn_c = cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_c = cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", EL_STR(")), c_str_lit(field)), EL_STR("))")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = cg_expr(obj); + el_val_t idx_c = cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("el_list_empty()"); + } + el_val_t items_parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = cg_expr(elem); + items_parts = native_list_append(items_parts, elem_c); + i = (i + 1); + } + el_val_t items_joined = str_join(items_parts, EL_STR(", ")); + el_release(items_parts); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_new("), native_int_to_str(n)), EL_STR(", ")), items_joined), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("el_map_new(0)"); + } + el_val_t items_parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = cg_expr(val); + items_parts = native_list_append(items_parts, el_str_concat(el_str_concat(c_str_lit(key), EL_STR(", ")), val_c)); + i = (i + 1); + } + el_val_t items_joined = str_join(items_parts, EL_STR(", ")); + el_release(items_parts); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_map_new("), native_int_to_str(n)), EL_STR(", ")), items_joined), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + return cg_if_expr(expr); + } + if (str_eq(kind, EL_STR("Match"))) { + return cg_match(expr); + } + if (str_eq(kind, EL_STR("HtmlTemplate"))) { + return cg_html_template(expr); + } + if (str_eq(kind, EL_STR("Lambda"))) { + EL_STR("EL_NULL"); + } else { + EL_STR("EL_NULL"); + } + return 0; +} + +el_val_t next_match_id(void) { + el_val_t csv = state_get(EL_STR("__match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = cg_expr(subject); + el_val_t id = next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t result_var = el_str_concat(EL_STR("_match_result_"), id); + el_val_t done_label = el_str_concat(EL_STR("_match_done_"), id); + el_val_t parts = native_list_empty(); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), subj_var), EL_STR(" = ")), subj_c), EL_STR("; el_val_t ")), result_var), EL_STR(" = 0; "))); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ "), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ el_val_t "), bname), EL_STR(" = ")), subj_var), EL_STR("; ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), subj_var), EL_STR(" == ")), v), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if (str_eq("), subj_var), EL_STR(", EL_STR(")), c_str_lit(v)), EL_STR("))) { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("0"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("1"); + } + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), subj_var), EL_STR(" == ")), bv), EL_STR(") { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + if (str_eq(pkind, EL_STR("Variant"))) { + el_val_t variant = el_get_field(pat, EL_STR("variant")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if (str_eq("), subj_var), EL_STR(", EL_STR(")), c_str_lit(variant)), EL_STR("))) { ")), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ "), result_var), EL_STR(" = (")), body_c), EL_STR("); goto ")), done_label), EL_STR("; } "))); + } + } + } + } + } + } + i = (i + 1); + } + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(done_label, EL_STR(":; ")), result_var), EL_STR("; })"))); + el_val_t result = str_join(parts, EL_STR("")); + el_release(parts); + return result; + return 0; +} + +el_val_t cg_match_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = cg_expr(subject); + el_val_t id = next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t inner = el_str_concat(indent, EL_STR(" ")); + emit_line(el_str_concat(indent, EL_STR("{"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("el_val_t ")), subj_var), EL_STR(" = ")), subj_c), EL_STR(";"))); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + el_val_t first_cond = 1; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = cg_expr(body); + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t cond_str = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), subj_var), EL_STR(", EL_STR(")), c_str_lit(v)), EL_STR("))")); + if (first_cond) { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("if (")), cond_str), EL_STR(") {"))); + first_cond = 0; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("} else if (")), cond_str), EL_STR(") {"))); + } + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR(" ")), body_c), EL_STR(";"))); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t cond_str = el_str_concat(el_str_concat(subj_var, EL_STR(" == ")), v); + if (first_cond) { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("if (")), cond_str), EL_STR(") {"))); + first_cond = 0; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("} else if (")), cond_str), EL_STR(") {"))); + } + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR(" ")), body_c), EL_STR(";"))); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("0"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("1"); + } + el_val_t cond_str = el_str_concat(el_str_concat(subj_var, EL_STR(" == ")), bv); + if (first_cond) { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("if (")), cond_str), EL_STR(") {"))); + first_cond = 0; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR("} else if (")), cond_str), EL_STR(") {"))); + } + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR(" ")), body_c), EL_STR(";"))); + } else { + if (first_cond) { + emit_line(el_str_concat(inner, EL_STR("{"))); + } else { + emit_line(el_str_concat(inner, EL_STR("} else {"))); + } + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR(" el_val_t ")), bname), EL_STR(" = ")), subj_var), EL_STR(";"))); + } + emit_line(el_str_concat(el_str_concat(el_str_concat(inner, EL_STR(" ")), body_c), EL_STR(";"))); + emit_line(el_str_concat(inner, EL_STR("}"))); + first_cond = 1; + } + } + } + i = (i + 1); + } + if (!first_cond) { + emit_line(el_str_concat(inner, EL_STR("}"))); + } + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t next_if_id(void) { + el_val_t csv = state_get(EL_STR("__if_expr_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__if_expr_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t cg_if_expr_arm(el_val_t stmts, el_val_t result_var) { + el_val_t n = native_list_len(stmts); + el_val_t parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + el_val_t is_last = 0; + if (i == (n - 1)) { + is_last = 1; + } + if (str_eq(sk, EL_STR("Let"))) { + el_val_t name = el_get_field(s, EL_STR("name")); + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), name), EL_STR(" = ")), val_c), EL_STR("; "))); + } else { + if (str_eq(sk, EL_STR("Return"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(result_var, EL_STR(" = (")), val_c), EL_STR("); "))); + } else { + if (str_eq(sk, EL_STR("Expr"))) { + el_val_t val = el_get_field(s, EL_STR("value")); + el_val_t val_c = cg_expr(val); + if (is_last) { + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(result_var, EL_STR(" = (")), val_c), EL_STR("); "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("(void)("), val_c), EL_STR("); "))); + } + } else { + if (str_eq(sk, EL_STR("Assign"))) { + el_val_t aname = el_get_field(s, EL_STR("name")); + el_val_t aval = el_get_field(s, EL_STR("value")); + el_val_t aval_c = cg_expr(aval); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(aname, EL_STR(" = ")), aval_c), EL_STR("; "))); + } else { + } + } + } + } + i = (i + 1); + } + el_val_t result = str_join(parts, EL_STR("")); + el_release(parts); + return result; + return 0; +} + +el_val_t cg_if_expr(el_val_t expr) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + el_val_t id = next_if_id(); + el_val_t result_var = el_str_concat(EL_STR("_if_result_"), id); + el_val_t then_c = cg_if_expr_arm(then_stmts, result_var); + el_val_t else_c = EL_STR(""); + if (has_else) { + else_c = cg_if_expr_arm(else_stmts, result_var); + } + el_val_t out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("({ el_val_t "), result_var), EL_STR(" = 0; if (")), cond_c), EL_STR(") { ")), then_c), EL_STR("} else { ")), else_c), EL_STR("} ")), result_var), EL_STR("; })")); + return out; + return 0; +} + +el_val_t list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + if (str_eq(ltype, EL_STR("Instant"))) { + add_instant_name(name); + } + if (str_eq(ltype, EL_STR("Duration"))) { + add_duration_name(name); + } + if (str_eq(ltype, EL_STR("Calendar"))) { + add_calendar_name(name); + } + if (str_eq(ltype, EL_STR("CalendarTime"))) { + add_caltime_name(name); + } + if (str_eq(ltype, EL_STR("Rhythm"))) { + add_rhythm_name(name); + } + if (str_eq(ltype, EL_STR("LocalDate"))) { + add_localdate_name(name); + } + if (str_eq(ltype, EL_STR("LocalTime"))) { + add_localtime_name(name); + } + if (str_eq(ltype, EL_STR("LocalDateTime"))) { + add_localdt_name(name); + } + if (str_eq(ltype, EL_STR("Zone"))) { + add_zone_name(name); + } + if (is_instant_expr(val)) { + add_instant_name(name); + } + if (is_duration_expr(val)) { + add_duration_name(name); + } + if (is_calendar_expr(val)) { + add_calendar_name(name); + } + if (is_caltime_expr(val)) { + add_caltime_name(name); + } + if (is_rhythm_expr(val)) { + add_rhythm_name(name); + } + if (is_localdate_expr(val)) { + add_localdate_name(name); + } + if (is_localtime_expr(val)) { + add_localtime_name(name); + } + if (is_localdt_expr(val)) { + add_localdt_name(name); + } + if (is_zone_expr(val)) { + add_zone_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + if (list_contains(declared, name)) { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("el_val_t ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + emit_line(el_str_concat(indent, EL_STR("return 0;"))); + } else { + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Break"))) { + emit_line(el_str_concat(indent, EL_STR("break;"))); + return declared; + } + if (str_eq(kind, EL_STR("Continue"))) { + emit_line(el_str_concat(indent, EL_STR("continue;"))); + return declared; + } + if (str_eq(kind, EL_STR("Assign"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + cg_for_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("Match"))) { + cg_match_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = cg_expr(val); + emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("ForRange"))) { + el_val_t var_name = el_get_field(stmt, EL_STR("var")); + el_val_t start_expr = el_get_field(stmt, EL_STR("start")); + el_val_t end_expr = el_get_field(stmt, EL_STR("end")); + el_val_t inclusive = el_get_field(stmt, EL_STR("inclusive")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t start_c = cg_expr(start_expr); + el_val_t end_c = cg_expr(end_expr); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, var_name); + if (inclusive) { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("for (el_val_t ")), var_name), EL_STR(" = ")), start_c), EL_STR("; ")), var_name), EL_STR(" <= ")), end_c), EL_STR("; ")), var_name), EL_STR("++) {"))); + } else { + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("for (el_val_t ")), var_name), EL_STR(" = ")), start_c), EL_STR("; ")), var_name), EL_STR(" < ")), end_c), EL_STR("; ")), var_name), EL_STR("++) {"))); + } + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("ExternFn"))) { + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return declared; + } + if (str_eq(kind, EL_STR("TryCatch"))) { + el_val_t try_body = el_get_field(stmt, EL_STR("try_body")); + emit_line(el_str_concat(indent, EL_STR("/* try (C target: exception handling not supported) */"))); + cg_stmts(try_body, indent, native_list_clone(declared)); + return declared; + } + if (str_eq(kind, EL_STR("Assert"))) { + el_val_t cond_node = el_get_field(stmt, EL_STR("cond")); + el_val_t msg_node = el_get_field(stmt, EL_STR("msg")); + el_val_t c_cond = cg_expr(cond_node); + el_val_t c_msg = EL_STR(""); + el_val_t msg_kind = el_get_field(msg_node, EL_STR("expr")); + if (str_eq(msg_kind, EL_STR("Str"))) { + el_val_t raw_msg = el_get_field(msg_node, EL_STR("value")); + c_msg = el_str_concat(el_str_concat(EL_STR("\""), c_escape(raw_msg)), EL_STR("\"")); + } else { + c_msg = el_str_concat(el_str_concat(EL_STR("EL_STR_PTR("), cg_expr(msg_node)), EL_STR(")")); + } + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (!(")), c_cond), EL_STR(")) {"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" __el_test_fail(__el_cur_test, ")), c_msg), EL_STR("); __el_fail++;"))); + emit_line(el_str_concat(indent, EL_STR("} else { __el_pass++; }"))); + return declared; + } + return declared; + return 0; +} + +el_val_t strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + return str_slice(s, 1, (n - 1)); + } + } + } + return s; + return 0; +} + +el_val_t cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = cg_expr(cond); + cond_c = strip_outer_parens(cond_c); + emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + emit_line(el_str_concat(indent, EL_STR("} else {"))); + cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = cg_expr(list_expr); + el_val_t idx = EL_STR("_el_i"); + el_val_t list_tmp = EL_STR("_el_lst"); + el_val_t len_tmp = EL_STR("_el_len"); + emit_line(el_str_concat(indent, EL_STR("{"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), list_tmp), EL_STR(" = ")), list_c), EL_STR(";"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), len_tmp), EL_STR(" = el_list_len(")), list_tmp), EL_STR(");"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" for (el_val_t ")), idx), EL_STR(" = 0; ")), idx), EL_STR(" < ")), len_tmp), EL_STR("; ")), idx), EL_STR("++) {"))); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR(" el_val_t ")), item), EL_STR(" = el_list_get(")), list_tmp), EL_STR(", ")), idx), EL_STR(");"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + emit_line(el_str_concat(indent, EL_STR(" }"))); + emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t s_mark = el_arena_push(); + decl = cg_stmt(stmt, indent, decl); + el_arena_pop(s_mark); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t param_decl(el_val_t param, el_val_t idx) { + el_val_t name = el_get_field(param, EL_STR("name")); + return el_str_concat(EL_STR("el_val_t "), name); + return 0; +} + +el_val_t params_to_c(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR("void"); + } + el_val_t parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t decl = param_decl(param, i); + parts = native_list_append(parts, decl); + i = (i + 1); + } + el_val_t result = str_join(parts, EL_STR(", ")); + el_release(parts); + return result; + return 0; +} + +el_val_t transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_instant_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__instant_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_duration_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__duration_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_words"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_letters"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_digits"))) { + return 1; + } + if (str_eq(name, EL_STR("str_last_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_find_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 1; + } + if (str_eq(name, EL_STR("time_add"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("unix_timestamp"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_to_unix_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_to_unix_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_to_nanos"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_instant_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("now"))) { + return 1; + } + if (str_eq(name, EL_STR("el_now_instant"))) { + return 1; + } + if (str_eq(name, EL_STR("unix_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("unix_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("instant_from_iso8601"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_add_dur"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_sub_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_duration_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("el_duration_from_nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_seconds"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_millis"))) { + return 1; + } + if (str_eq(name, EL_STR("duration_nanos"))) { + return 1; + } + if (str_eq(name, EL_STR("el_instant_diff"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_add"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_sub"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_scale"))) { + return 1; + } + if (str_eq(name, EL_STR("el_duration_div"))) { + return 1; + } + if (str_eq(name, EL_STR("ttl_cache_age"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_calendar_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__calendar_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_caltime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__caltime_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_rhythm_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__rhythm_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localdate_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdate_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localtime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localtime_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_localdt_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdt_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_zone_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__zone_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t is_calendar_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("earth_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("earth_calendar_default"))) { + return 1; + } + if (str_eq(name, EL_STR("mars_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("cycle_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("no_cycle_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("relative_calendar"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_caltime_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("now_in"))) { + return 1; + } + if (str_eq(name, EL_STR("in_calendar"))) { + return 1; + } + if (str_eq(name, EL_STR("cal_in"))) { + return 1; + } + if (str_eq(name, EL_STR("zoned"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_rhythm_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("rhythm_cycle_start"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_cycle_phase"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_duration"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_session_start"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_event"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_and"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_or"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_weekday"))) { + return 1; + } + if (str_eq(name, EL_STR("rhythm_weekly_at"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localdate_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_date"))) { + return 1; + } + if (str_eq(name, EL_STR("el_local_date_add_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localtime_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_time"))) { + return 1; + } + if (str_eq(name, EL_STR("el_local_time_add_dur"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_localdt_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("local_datetime"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_zone_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("zone"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_local"))) { + return 1; + } + if (str_eq(name, EL_STR("zone_offset"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_calendar_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_calendar_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_calendar_call(expr); + } + return 0; + return 0; +} + +el_val_t is_caltime_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_caltime_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_caltime_call(expr); + } + return 0; + return 0; +} + +el_val_t is_rhythm_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_rhythm_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_rhythm_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localdate_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localdate_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localdate_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localtime_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localtime_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localtime_call(expr); + } + return 0; + return 0; +} + +el_val_t is_localdt_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_localdt_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_localdt_call(expr); + } + return 0; + return 0; +} + +el_val_t is_zone_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + return is_zone_name(el_get_field(expr, EL_STR("name"))); + } + if (str_eq(k, EL_STR("Call"))) { + return is_zone_call(expr); + } + return 0; + return 0; +} + +el_val_t is_instant_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_instant_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_instant_call(expr); + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("Plus"))) { + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_instant_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t is_duration_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("DurationLit"))) { + return 1; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_duration_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_duration_call(expr); + } + if (str_eq(k, EL_STR("Neg"))) { + return is_duration_expr(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("Plus"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_instant_expr(el_get_field(expr, EL_STR("left")))) { + if (is_instant_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Star"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_duration_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Slash"))) { + if (is_duration_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t time_record_violation(el_val_t kind, el_val_t detail) { + el_val_t csv = state_get(EL_STR("__time_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), detail); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__time_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t is_int_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Int"))) { + return 1; + } + if (str_eq(k, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return is_int_name(name); + } + if (str_eq(k, EL_STR("Call"))) { + return is_int_call(expr); + } + if (str_eq(k, EL_STR("Neg"))) { + return is_int_expr(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(k, EL_STR("Not"))) { + return 1; + } + if (str_eq(k, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + if (str_eq(op, EL_STR("EqEq"))) { + return 1; + } + if (str_eq(op, EL_STR("NotEq"))) { + return 1; + } + if (str_eq(op, EL_STR("Lt"))) { + return 1; + } + if (str_eq(op, EL_STR("Gt"))) { + return 1; + } + if (str_eq(op, EL_STR("LtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("GtEq"))) { + return 1; + } + if (str_eq(op, EL_STR("And"))) { + return 1; + } + if (str_eq(op, EL_STR("Or"))) { + return 1; + } + if (str_eq(op, EL_STR("Plus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Minus"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Star"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Slash"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + if (str_eq(op, EL_STR("Percent"))) { + if (is_int_expr(el_get_field(expr, EL_STR("left")))) { + if (is_int_expr(el_get_field(expr, EL_STR("right")))) { + return 1; + } + } + return 0; + } + return 0; + } + return 0; + return 0; +} + +el_val_t is_float_expr(el_val_t expr) { + el_val_t k = el_get_field(expr, EL_STR("expr")); + if (str_eq(k, EL_STR("Float"))) { + return 1; + } + if (str_eq(k, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t ik = el_get_field(inner, EL_STR("expr")); + if (str_eq(ik, EL_STR("Float"))) { + return 1; + } + } + return 0; + return 0; +} + +el_val_t cap_record_violation(el_val_t kind, el_val_t fn_name) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(kind, EL_STR(":")), fn_name); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__cap_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t is_self_formation_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_dharma_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_send"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_strengthen"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("dharma_peers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_llm_call(el_val_t fn_name) { + if (str_eq(fn_name, EL_STR("llm_call"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_system"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_call_agentic"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_vision"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_register_tool"))) { + return 1; + } + if (str_eq(fn_name, EL_STR("llm_models"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cap_check_call(el_val_t fn_name) { + el_val_t kind = state_get(EL_STR("__program_kind")); + if (str_eq(kind, EL_STR("cgi"))) { + return 1; + } + if (str_eq(kind, EL_STR("service"))) { + if (is_self_formation_call(fn_name)) { + cap_record_violation(EL_STR("service"), fn_name); + return 0; + } + return 1; + } + if (is_dharma_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + if (is_llm_call(fn_name)) { + cap_record_violation(EL_STR("utility"), fn_name); + return 0; + } + return 1; + return 0; +} + +el_val_t emit_cap_violations(void) { + el_val_t csv = state_get(EL_STR("__cap_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t kind = str_slice(entry, 0, colon); + el_val_t fn_name = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"capability violation: '"), kind), EL_STR("' programs may not call '")), fn_name), EL_STR("' (self-formation primitive - only 'cgi' programs may use it)\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t emit_time_violations(void) { + el_val_t csv = state_get(EL_STR("__time_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t colon = str_index_of(entry, EL_STR(":")); + if (colon > 0) { + el_val_t detail = str_slice(entry, (colon + 1), str_len(entry)); + emit_line(el_str_concat(el_str_concat(EL_STR("#error \"temporal type error: "), detail), EL_STR("\""))); + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t builtin_arity(el_val_t name) { + if (str_eq(name, EL_STR("println"))) { + return 1; + } + if (str_eq(name, EL_STR("print"))) { + return 1; + } + if (str_eq(name, EL_STR("readline"))) { + return 0; + } + if (str_eq(name, EL_STR("__read_n"))) { + return 1; + } + if (str_eq(name, EL_STR("__print_raw"))) { + return 1; + } + if (str_eq(name, EL_STR("el_str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("str_eq"))) { + return 2; + } + if (str_eq(name, EL_STR("str_starts_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_ends_with"))) { + return 2; + } + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_concat"))) { + return 2; + } + if (str_eq(name, EL_STR("int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_slice"))) { + return 3; + } + if (str_eq(name, EL_STR("str_contains"))) { + return 2; + } + if (str_eq(name, EL_STR("str_replace"))) { + return 3; + } + if (str_eq(name, EL_STR("str_to_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_trim"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 2; + } + if (str_eq(name, EL_STR("str_split"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_at"))) { + return 2; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 2; + } + if (str_eq(name, EL_STR("str_pad_left"))) { + return 3; + } + if (str_eq(name, EL_STR("str_pad_right"))) { + return 3; + } + if (str_eq(name, EL_STR("str_format"))) { + return 2; + } + if (str_eq(name, EL_STR("str_lower"))) { + return 1; + } + if (str_eq(name, EL_STR("str_upper"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count"))) { + return 2; + } + if (str_eq(name, EL_STR("str_count_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_words"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_letters"))) { + return 1; + } + if (str_eq(name, EL_STR("str_count_digits"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of_all"))) { + return 2; + } + if (str_eq(name, EL_STR("str_last_index_of"))) { + return 2; + } + if (str_eq(name, EL_STR("str_find_chars"))) { + return 2; + } + if (str_eq(name, EL_STR("str_repeat"))) { + return 2; + } + if (str_eq(name, EL_STR("str_reverse"))) { + return 1; + } + if (str_eq(name, EL_STR("str_strip_prefix"))) { + return 2; + } + if (str_eq(name, EL_STR("str_strip_suffix"))) { + return 2; + } + if (str_eq(name, EL_STR("str_strip_chars"))) { + return 2; + } + if (str_eq(name, EL_STR("str_lstrip"))) { + return 1; + } + if (str_eq(name, EL_STR("str_rstrip"))) { + return 1; + } + if (str_eq(name, EL_STR("is_letter"))) { + return 1; + } + if (str_eq(name, EL_STR("is_digit"))) { + return 1; + } + if (str_eq(name, EL_STR("is_alphanumeric"))) { + return 1; + } + if (str_eq(name, EL_STR("is_whitespace"))) { + return 1; + } + if (str_eq(name, EL_STR("is_punctuation"))) { + return 1; + } + if (str_eq(name, EL_STR("is_uppercase"))) { + return 1; + } + if (str_eq(name, EL_STR("is_lowercase"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_lines"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("str_split_n"))) { + return 3; + } + if (str_eq(name, EL_STR("str_join"))) { + return 2; + } + if (str_eq(name, EL_STR("el_html_sanitize"))) { + return 2; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 2; + } + if (str_eq(name, EL_STR("el_min"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("el_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("el_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("list_push"))) { + return 2; + } + if (str_eq(name, EL_STR("list_push_front"))) { + return 2; + } + if (str_eq(name, EL_STR("list_join"))) { + return 2; + } + if (str_eq(name, EL_STR("list_range"))) { + return 2; + } + if (str_eq(name, EL_STR("el_get_field"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("el_map_set"))) { + return 3; + } + if (str_eq(name, EL_STR("http_get"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_json"))) { + return 2; + } + if (str_eq(name, EL_STR("http_get_with_headers"))) { + return 2; + } + if (str_eq(name, EL_STR("http_post_with_headers"))) { + return 3; + } + if (str_eq(name, EL_STR("http_post_form_auth"))) { + return 3; + } + if (str_eq(name, EL_STR("http_serve"))) { + return 2; + } + if (str_eq(name, EL_STR("http_set_handler"))) { + return 1; + } + if (str_eq(name, EL_STR("__str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("__str_char_at"))) { + return 2; + } + if (str_eq(name, EL_STR("__str_alloc"))) { + return 1; + } + if (str_eq(name, EL_STR("__str_set_char"))) { + return 3; + } + if (str_eq(name, EL_STR("__str_cmp"))) { + return 2; + } + if (str_eq(name, EL_STR("__str_ncmp"))) { + return 3; + } + if (str_eq(name, EL_STR("__str_concat_raw"))) { + return 2; + } + if (str_eq(name, EL_STR("__str_slice_raw"))) { + return 3; + } + if (str_eq(name, EL_STR("__int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("__str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("__float_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("__str_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("__println"))) { + return 1; + } + if (str_eq(name, EL_STR("__print"))) { + return 1; + } + if (str_eq(name, EL_STR("__readline"))) { + return 0; + } + if (str_eq(name, EL_STR("__fs_read"))) { + return 1; + } + if (str_eq(name, EL_STR("__fs_write"))) { + return 2; + } + if (str_eq(name, EL_STR("__fs_exists"))) { + return 1; + } + if (str_eq(name, EL_STR("__fs_list_raw"))) { + return 1; + } + if (str_eq(name, EL_STR("__fs_mkdir"))) { + return 1; + } + if (str_eq(name, EL_STR("__fs_write_bytes"))) { + return 3; + } + if (str_eq(name, EL_STR("__http_do"))) { + return 5; + } + if (str_eq(name, EL_STR("__http_do_map"))) { + return 5; + } + if (str_eq(name, EL_STR("__http_do_to_file"))) { + return 5; + } + if (str_eq(name, EL_STR("__http_serve"))) { + return 2; + } + if (str_eq(name, EL_STR("__http_serve_v2"))) { + return 2; + } + if (str_eq(name, EL_STR("__http_response"))) { + return 3; + } + if (str_eq(name, EL_STR("__thread_create"))) { + return 2; + } + if (str_eq(name, EL_STR("__thread_join"))) { + return 1; + } + if (str_eq(name, EL_STR("__mutex_new"))) { + return 0; + } + if (str_eq(name, EL_STR("__mutex_lock"))) { + return 1; + } + if (str_eq(name, EL_STR("__mutex_unlock"))) { + return 1; + } + if (str_eq(name, EL_STR("__exec"))) { + return 1; + } + if (str_eq(name, EL_STR("__exec_bg"))) { + return 1; + } + if (str_eq(name, EL_STR("__env_get"))) { + return 1; + } + if (str_eq(name, EL_STR("__args_json"))) { + return 0; + } + if (str_eq(name, EL_STR("__exit_program"))) { + return 1; + } + if (str_eq(name, EL_STR("__time_now_ns"))) { + return 0; + } + if (str_eq(name, EL_STR("__sleep_ms"))) { + return 1; + } + if (str_eq(name, EL_STR("__uuid_v4"))) { + return 0; + } + if (str_eq(name, EL_STR("__sqrt_f"))) { + return 1; + } + if (str_eq(name, EL_STR("__log_f"))) { + return 1; + } + if (str_eq(name, EL_STR("__ln_f"))) { + return 1; + } + if (str_eq(name, EL_STR("__sin_f"))) { + return 1; + } + if (str_eq(name, EL_STR("__cos_f"))) { + return 1; + } + if (str_eq(name, EL_STR("__pi_f"))) { + return 0; + } + if (str_eq(name, EL_STR("__state_set"))) { + return 2; + } + if (str_eq(name, EL_STR("__state_get"))) { + return 1; + } + if (str_eq(name, EL_STR("__state_del"))) { + return 1; + } + if (str_eq(name, EL_STR("__state_keys"))) { + return 0; + } + if (str_eq(name, EL_STR("__html_sanitize"))) { + return 2; + } + if (str_eq(name, EL_STR("__url_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("__url_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("__json_get"))) { + return 2; + } + if (str_eq(name, EL_STR("__json_get_raw"))) { + return 2; + } + if (str_eq(name, EL_STR("__json_parse_map"))) { + return 1; + } + if (str_eq(name, EL_STR("__json_stringify_val"))) { + return 1; + } + if (str_eq(name, EL_STR("__json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("__json_array_get"))) { + return 2; + } + if (str_eq(name, EL_STR("__json_array_get_string"))) { + return 2; + } + if (str_eq(name, EL_STR("__json_set"))) { + return 3; + } + if (str_eq(name, EL_STR("__engram_node"))) { + return 3; + } + if (str_eq(name, EL_STR("__engram_node_full"))) { + return 8; + } + if (str_eq(name, EL_STR("__engram_get_node"))) { + return 1; + } + if (str_eq(name, EL_STR("__engram_strengthen"))) { + return 1; + } + if (str_eq(name, EL_STR("__engram_forget"))) { + return 1; + } + if (str_eq(name, EL_STR("__engram_node_count"))) { + return 0; + } + if (str_eq(name, EL_STR("__engram_search"))) { + return 2; + } + if (str_eq(name, EL_STR("__engram_scan_nodes"))) { + return 2; + } + if (str_eq(name, EL_STR("__engram_connect"))) { + return 4; + } + if (str_eq(name, EL_STR("__engram_edge_between"))) { + return 2; + } + if (str_eq(name, EL_STR("__engram_neighbors"))) { + return 1; + } + if (str_eq(name, EL_STR("__engram_neighbors_filtered"))) { + return 3; + } + if (str_eq(name, EL_STR("__engram_activate"))) { + return 2; + } + if (str_eq(name, EL_STR("__engram_activate_json"))) { + return 2; + } + if (str_eq(name, EL_STR("__engram_scan_nodes_json"))) { + return 2; + } + if (str_eq(name, EL_STR("__generate"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_read"))) { + return 1; + } + if (str_eq(name, EL_STR("fs_write"))) { + return 2; + } + if (str_eq(name, EL_STR("fs_list"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get"))) { + return 2; + } + if (str_eq(name, EL_STR("json_parse"))) { + return 1; + } + if (str_eq(name, EL_STR("json_stringify"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_string"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_float"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_bool"))) { + return 2; + } + if (str_eq(name, EL_STR("json_get_raw"))) { + return 2; + } + if (str_eq(name, EL_STR("json_set"))) { + return 3; + } + if (str_eq(name, EL_STR("json_array_len"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 0; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 0; + } + if (str_eq(name, EL_STR("sleep_secs"))) { + return 1; + } + if (str_eq(name, EL_STR("sleep_ms"))) { + return 1; + } + if (str_eq(name, EL_STR("time_format"))) { + return 2; + } + if (str_eq(name, EL_STR("time_to_parts"))) { + return 1; + } + if (str_eq(name, EL_STR("time_from_parts"))) { + return 3; + } + if (str_eq(name, EL_STR("time_add"))) { + return 3; + } + if (str_eq(name, EL_STR("time_diff"))) { + return 3; + } + if (str_eq(name, EL_STR("uuid_new"))) { + return 0; + } + if (str_eq(name, EL_STR("uuid_v4"))) { + return 0; + } + if (str_eq(name, EL_STR("env"))) { + return 1; + } + if (str_eq(name, EL_STR("state_set"))) { + return 2; + } + if (str_eq(name, EL_STR("state_get"))) { + return 1; + } + if (str_eq(name, EL_STR("state_del"))) { + return 1; + } + if (str_eq(name, EL_STR("state_keys"))) { + return 0; + } + if (str_eq(name, EL_STR("float_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("int_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("float_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("format_float"))) { + return 2; + } + if (str_eq(name, EL_STR("decimal_round"))) { + return 2; + } + if (str_eq(name, EL_STR("str_to_float"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sqrt"))) { + return 1; + } + if (str_eq(name, EL_STR("math_log"))) { + return 1; + } + if (str_eq(name, EL_STR("math_ln"))) { + return 1; + } + if (str_eq(name, EL_STR("math_sin"))) { + return 1; + } + if (str_eq(name, EL_STR("math_cos"))) { + return 1; + } + if (str_eq(name, EL_STR("math_pi"))) { + return 0; + } + if (str_eq(name, EL_STR("bool_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("exit_program"))) { + return 1; + } + if (str_eq(name, EL_STR("getpid_now"))) { + return 0; + } + if (str_eq(name, EL_STR("stdout_to_file"))) { + return 1; + } + if (str_eq(name, EL_STR("stdout_restore"))) { + return 0; + } + if (str_eq(name, EL_STR("exec_command"))) { + return 1; + } + if (str_eq(name, EL_STR("exec_capture"))) { + return 1; + } + if (str_eq(name, EL_STR("exec"))) { + return 1; + } + if (str_eq(name, EL_STR("exec_bg"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_connect"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_send"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_activate"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_emit"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_strengthen"))) { + return 2; + } + if (str_eq(name, EL_STR("dharma_relationship"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_peers"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_node"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_node_full"))) { + return 8; + } + if (str_eq(name, EL_STR("engram_get_node"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_strengthen"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_forget"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_node_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_search"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_connect"))) { + return 4; + } + if (str_eq(name, EL_STR("engram_edge_between"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_neighbors_filtered"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_edge_count"))) { + return 0; + } + if (str_eq(name, EL_STR("engram_activate"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_save"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_load"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_get_node_json"))) { + return 1; + } + if (str_eq(name, EL_STR("engram_search_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_scan_nodes_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_neighbors_json"))) { + return 3; + } + if (str_eq(name, EL_STR("engram_activate_json"))) { + return 2; + } + if (str_eq(name, EL_STR("engram_stats_json"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_call"))) { + return 2; + } + if (str_eq(name, EL_STR("llm_call_system"))) { + return 3; + } + if (str_eq(name, EL_STR("llm_call_agentic"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_vision"))) { + return 4; + } + if (str_eq(name, EL_STR("llm_models"))) { + return 0; + } + if (str_eq(name, EL_STR("llm_register_tool"))) { + return 2; + } + if (str_eq(name, EL_STR("sha256_hex"))) { + return 1; + } + if (str_eq(name, EL_STR("sha256_bytes"))) { + return 1; + } + if (str_eq(name, EL_STR("hmac_sha256_hex"))) { + return 2; + } + if (str_eq(name, EL_STR("hmac_sha256_bytes"))) { + return 2; + } + if (str_eq(name, EL_STR("base64_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_encode"))) { + return 1; + } + if (str_eq(name, EL_STR("base64url_decode"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_get"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_append"))) { + return 2; + } + if (str_eq(name, EL_STR("native_list_empty"))) { + return 0; + } + if (str_eq(name, EL_STR("native_list_clone"))) { + return 1; + } + if (str_eq(name, EL_STR("native_string_chars"))) { + return 1; + } + if (str_eq(name, EL_STR("native_int_to_str"))) { + return 1; + } + if (str_eq(name, EL_STR("append"))) { + return 2; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_get"))) { + return 2; + } + if (str_eq(name, EL_STR("map_set"))) { + return 3; + } + if (str_eq(name, EL_STR("__thread_create"))) { + return 2; + } + if (str_eq(name, EL_STR("__thread_join"))) { + return 1; + } + if (str_eq(name, EL_STR("__mutex_new"))) { + return 0; + } + if (str_eq(name, EL_STR("__mutex_lock"))) { + return 1; + } + if (str_eq(name, EL_STR("__mutex_unlock"))) { + return 1; + } + if (str_eq(name, EL_STR("__channel_new"))) { + return 1; + } + if (str_eq(name, EL_STR("__channel_send"))) { + return 2; + } + if (str_eq(name, EL_STR("__channel_recv"))) { + return 1; + } + if (str_eq(name, EL_STR("__channel_try_recv"))) { + return 1; + } + if (str_eq(name, EL_STR("__channel_close"))) { + return 1; + } + if (str_eq(name, EL_STR("el_arena_push"))) { + return 0; + } + if (str_eq(name, EL_STR("el_arena_pop"))) { + return 1; + } + return (-1); + return 0; +} + +el_val_t arity_record_violation(el_val_t fn_name, el_val_t expected, el_val_t actual) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t entry = el_str_concat(el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("|")), native_int_to_str(expected)), EL_STR("|")), native_int_to_str(actual)); + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), entry), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__arity_violations"), el_str_concat(el_str_concat(csv, entry), EL_STR(","))); + return 1; + return 0; +} + +el_val_t arity_check_call(el_val_t fn_name, el_val_t actual) { + el_val_t expected = builtin_arity(fn_name); + if (expected < 0) { + return 1; + } + if (expected == actual) { + return 1; + } + arity_record_violation(fn_name, expected, actual); + return 1; + return 0; +} + +el_val_t emit_arity_violations(void) { + el_val_t csv = state_get(EL_STR("__arity_violations")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + if (str_eq(csv, EL_STR(","))) { + return 0; + } + el_val_t n = str_len(csv); + el_val_t i = 1; + while (i < n) { + el_val_t next_comma = str_index_of(str_slice(csv, i, n), EL_STR(",")); + if (next_comma < 0) { + return 0; + } + el_val_t entry = str_slice(csv, i, (i + next_comma)); + el_val_t p1 = str_index_of(entry, EL_STR("|")); + if (p1 > 0) { + el_val_t fn_name = str_slice(entry, 0, p1); + el_val_t rest = str_slice(entry, (p1 + 1), str_len(entry)); + el_val_t p2 = str_index_of(rest, EL_STR("|")); + if (p2 > 0) { + el_val_t exp_s = str_slice(rest, 0, p2); + el_val_t act_s = str_slice(rest, (p2 + 1), str_len(rest)); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("#error \"arity error: '"), fn_name), EL_STR("' takes ")), exp_s), EL_STR(" arguments, but called with ")), act_s), EL_STR("\""))); + } + } + i = ((i + next_comma) + 1); + } + return 0; +} + +el_val_t add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__int_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_instant_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__instant_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__instant_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_duration_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__duration_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__duration_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_calendar_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__calendar_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__calendar_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_caltime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__caltime_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__caltime_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_rhythm_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__rhythm_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__rhythm_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localdate_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdate_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localdate_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localtime_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localtime_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localtime_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_localdt_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__localdt_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__localdt_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t add_zone_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__zone_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__zone_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__int_names"), EL_STR(",")); + state_set(EL_STR("__instant_names"), EL_STR(",")); + state_set(EL_STR("__duration_names"), EL_STR(",")); + state_set(EL_STR("__calendar_names"), EL_STR(",")); + state_set(EL_STR("__caltime_names"), EL_STR(",")); + state_set(EL_STR("__rhythm_names"), EL_STR(",")); + state_set(EL_STR("__localdate_names"), EL_STR(",")); + state_set(EL_STR("__localtime_names"), EL_STR(",")); + state_set(EL_STR("__localdt_names"), EL_STR(",")); + state_set(EL_STR("__zone_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + add_int_name(pname); + } + if (str_eq(ptype, EL_STR("Instant"))) { + add_instant_name(pname); + } + if (str_eq(ptype, EL_STR("Duration"))) { + add_duration_name(pname); + } + if (str_eq(ptype, EL_STR("Calendar"))) { + add_calendar_name(pname); + } + if (str_eq(ptype, EL_STR("CalendarTime"))) { + add_caltime_name(pname); + } + if (str_eq(ptype, EL_STR("Rhythm"))) { + add_rhythm_name(pname); + } + if (str_eq(ptype, EL_STR("LocalDate"))) { + add_localdate_name(pname); + } + if (str_eq(ptype, EL_STR("LocalTime"))) { + add_localtime_name(pname); + } + if (str_eq(ptype, EL_STR("LocalDateTime"))) { + add_localdt_name(pname); + } + if (str_eq(ptype, EL_STR("Zone"))) { + add_zone_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + return 0; + } + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t params_c = params_to_c(params); + el_val_t decorator = el_get_field(stmt, EL_STR("decorator")); + if (vbd_has_restricted_call(body)) { + if (!str_eq(decorator, EL_STR("manager"))) { + emit_line(el_str_concat(el_str_concat(EL_STR("#error \"VBD violation: dharma_emit/dharma_field called from non-@manager fn '"), fn_name), EL_STR("'\""))); + } + } + build_int_names_for_params(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(") {"))); + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = transform_implicit_return(body); + } + el_val_t final_decl = cg_stmts(body_xformed, EL_STR(" "), decl); + el_release(final_decl); + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + return 0; +} + +el_val_t is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + if (str_eq(kind, EL_STR("ExternFn"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t cgi_arg(el_val_t value, el_val_t has_value) { + if (has_value) { + return el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(value)), EL_STR(")")); + } + return EL_STR("EL_NULL"); + return 0; +} + +el_val_t vbd_is_restricted_name(el_val_t name) { + if (str_eq(name, EL_STR("dharma_emit"))) { + return 1; + } + if (str_eq(name, EL_STR("dharma_field"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t vbd_expr_has_restricted_call(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (str_eq(fk, EL_STR("Ident"))) { + el_val_t fname = el_get_field(func, EL_STR("name")); + if (vbd_is_restricted_name(fname)) { + return 1; + } + } + if (vbd_expr_has_restricted_call(func)) { + return 1; + } + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t an = native_list_len(args); + el_val_t ai = 0; + while (ai < an) { + el_val_t a = native_list_get(args, ai); + if (vbd_expr_has_restricted_call(a)) { + return 1; + } + ai = (ai + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t l = el_get_field(expr, EL_STR("left")); + el_val_t r = el_get_field(expr, EL_STR("right")); + if (vbd_expr_has_restricted_call(l)) { + return 1; + } + if (vbd_expr_has_restricted_call(r)) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Not"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Neg"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Field"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object"))); + } + if (str_eq(kind, EL_STR("Index"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("object")))) { + return 1; + } + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("index")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Try"))) { + return vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("inner"))); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + el_val_t i = 0; + while (i < n) { + el_val_t e = native_list_get(elems, i); + if (vbd_expr_has_restricted_call(e)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t v = el_get_field(pair, EL_STR("value")); + if (vbd_expr_has_restricted_call(v)) { + return 1; + } + i = (i + 1); + } + return 0; + } + if (str_eq(kind, EL_STR("If"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("then")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("else")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(expr, EL_STR("body")))) { + return 1; + } + return 0; + } + if (str_eq(kind, EL_STR("Match"))) { + if (vbd_expr_has_restricted_call(el_get_field(expr, EL_STR("subject")))) { + return 1; + } + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t body = el_get_field(arm, EL_STR("body")); + if (vbd_expr_has_restricted_call(body)) { + return 1; + } + i = (i + 1); + } + return 0; + } + return 0; + return 0; +} + +el_val_t vbd_has_restricted_call(el_val_t stmts) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t s = native_list_get(stmts, i); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Let"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Return"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("Expr"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("value")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("While"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("cond")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + if (str_eq(sk, EL_STR("For"))) { + if (vbd_expr_has_restricted_call(el_get_field(s, EL_STR("list")))) { + return 1; + } + if (vbd_has_restricted_call(el_get_field(s, EL_STR("body")))) { + return 1; + } + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t codegen(el_val_t stmts, el_val_t source) { + el_val_t n_top = native_list_len(stmts); + el_val_t cgi_count = 0; + el_val_t cgi_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t svc_count = 0; + el_val_t svc_block = el_map_new(1, "stmt", EL_STR("None")); + el_val_t ti = 0; + while (ti < n_top) { + el_val_t s = native_list_get(stmts, ti); + el_val_t sk = el_get_field(s, EL_STR("stmt")); + if (str_eq(sk, EL_STR("CgiBlock"))) { + cgi_count = (cgi_count + 1); + if (cgi_count == 1) { + cgi_block = s; + } + } + if (str_eq(sk, EL_STR("ServiceBlock"))) { + svc_count = (svc_count + 1); + if (svc_count == 1) { + svc_block = s; + } + } + ti = (ti + 1); + } + if (cgi_count > 1) { + emit_line(EL_STR("#error \"El: multiple cgi blocks in program (only one allowed)\"")); + } + if (svc_count > 1) { + emit_line(EL_STR("#error \"El: multiple service blocks in program (only one allowed)\"")); + } + if (cgi_count >= 1) { + if (svc_count >= 1) { + emit_line(EL_STR("#error \"El: program declares both cgi and service blocks (mutually exclusive - pick one)\"")); + } + } + el_val_t kind = EL_STR("utility"); + if (cgi_count >= 1) { + kind = EL_STR("cgi"); + } + if (svc_count >= 1) { + kind = EL_STR("service"); + } + state_set(EL_STR("__program_kind"), kind); + state_set(EL_STR("__cap_violations"), EL_STR("")); + state_set(EL_STR("__arity_violations"), EL_STR("")); + state_set(EL_STR("__time_violations"), EL_STR("")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include \"el_runtime.h\"")); + el_val_t imp_n = native_list_len(stmts); + el_val_t imp_i = 0; + while (imp_i < imp_n) { + el_val_t imp_stmt = native_list_get(stmts, imp_i); + el_val_t imp_kind = el_get_field(imp_stmt, EL_STR("stmt")); + if (str_eq(imp_kind, EL_STR("Import"))) { + el_val_t imp_path = el_get_field(imp_stmt, EL_STR("path")); + el_val_t imp_path_len = str_len(imp_path); + el_val_t imp_last_slash = (-1); + el_val_t imp_j = 0; + while (imp_j < imp_path_len) { + el_val_t imp_c = str_slice(imp_path, imp_j, (imp_j + 1)); + if (str_eq(imp_c, EL_STR("/"))) { + imp_last_slash = imp_j; + } + imp_j = (imp_j + 1); + } + el_val_t imp_base = str_slice(imp_path, (imp_last_slash + 1), imp_path_len); + el_val_t imp_base_len = str_len(imp_base); + el_val_t imp_bname = imp_base; + if (str_ends_with(imp_base, EL_STR(".el"))) { + imp_bname = str_slice(imp_base, 0, (imp_base_len - 3)); + } + emit_line(el_str_concat(el_str_concat(EL_STR("#include \""), imp_bname), EL_STR(".elh\""))); + } + imp_i = (imp_i + 1); + } + emit_blank(); + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t params_c = params_to_c(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + } + if (str_eq(kind, EL_STR("ExternFn"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t params_c = params_to_c(params); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + i = (i + 1); + } + emit_blank(); + el_val_t has_toplevel_lets = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + add_int_name(name); + } + emit_line(el_str_concat(el_str_concat(EL_STR("el_val_t "), name), EL_STR(";"))); + has_toplevel_lets = 1; + } + i = (i + 1); + } + if (has_toplevel_lets) { + emit_blank(); + } + el_val_t has_el_main = 0; + el_val_t has_toplevel_stmts = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t fn_name_chk = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name_chk, EL_STR("main"))) { + has_el_main = 1; + } + } + if (!is_fndef(stmt)) { + if (!is_top_level_decl(stmt)) { + if (!str_eq(sk, EL_STR("Let"))) { + has_toplevel_stmts = 1; + } + } + } + i = (i + 1); + } + el_val_t is_library = 0; + if (!has_el_main) { + if (!has_toplevel_stmts) { + is_library = 1; + } + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + cg_fn(stmt); + } + i = (i + 1); + } + if (is_library) { + return EL_STR(""); + } + emit_line(EL_STR("int main(int _argc, char** _argv) {")); + emit_line(EL_STR(" el_runtime_init_args(_argc, _argv);")); + if (cgi_count >= 1) { + el_val_t cname = el_get_field(cgi_block, EL_STR("name")); + el_val_t cdid = el_get_field(cgi_block, EL_STR("dharma_id")); + el_val_t cprin = el_get_field(cgi_block, EL_STR("principal")); + el_val_t cnet = el_get_field(cgi_block, EL_STR("network")); + el_val_t ceng = el_get_field(cgi_block, EL_STR("engram")); + el_val_t has_did = el_get_field(cgi_block, EL_STR("has_dharma_id")); + el_val_t has_prin = el_get_field(cgi_block, EL_STR("has_principal")); + el_val_t has_net = el_get_field(cgi_block, EL_STR("has_network")); + el_val_t has_eng = el_get_field(cgi_block, EL_STR("has_engram")); + el_val_t arg_name = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(cname)), EL_STR(")")); + el_val_t arg_did = cgi_arg(cdid, has_did); + el_val_t arg_prin = cgi_arg(cprin, has_prin); + el_val_t arg_net = cgi_arg(cnet, has_net); + el_val_t arg_eng = cgi_arg(ceng, has_eng); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" el_cgi_init("), arg_name), EL_STR(", ")), arg_did), EL_STR(", ")), arg_prin), EL_STR(", ")), arg_net), EL_STR(", ")), arg_eng), EL_STR(");"))); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + main_decl = native_list_append(main_decl, name); + } + i = (i + 1); + } + el_val_t el_main_body = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t bn = native_list_len(body); + el_val_t bi = 0; + while (bi < bn) { + el_main_body = native_list_append(el_main_body, native_list_get(body, bi)); + bi = (bi + 1); + } + } + } + i = (i + 1); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (is_fndef(stmt)) { + } else { + if (is_top_level_decl(stmt)) { + } else { + main_decl = cg_stmt(stmt, EL_STR(" "), main_decl); + } + } + el_release(stmt); + i = (i + 1); + } + el_val_t mn = native_list_len(el_main_body); + el_val_t mi = 0; + while (mi < mn) { + el_val_t mstmt = native_list_get(el_main_body, mi); + main_decl = cg_stmt(mstmt, EL_STR(" "), main_decl); + mi = (mi + 1); + } + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + emit_cap_violations(); + emit_arity_violations(); + emit_time_violations(); + return EL_STR(""); + return 0; +} + +el_val_t cg_decl_streaming(el_val_t stmt) { + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + cg_fn(stmt); + return 0; + } + if (!str_eq(sk, EL_STR("FnDef"))) { + if (!is_top_level_decl(stmt)) { + if (!str_eq(sk, EL_STR("Let"))) { + state_set(EL_STR("__streaming_has_toplevel_stmts"), EL_STR("1")); + } + } + } + return 0; +} + +el_val_t emit_streaming_preamble(el_val_t sigs, el_val_t source) { + el_val_t n = native_list_len(sigs); + el_val_t cgi_count = 0; + el_val_t svc_count = 0; + el_val_t i = 0; + while (i < n) { + el_val_t sig = native_list_get(sigs, i); + el_val_t sk = el_get_field(sig, EL_STR("kind")); + if (str_eq(sk, EL_STR("cgi_block"))) { + cgi_count = (cgi_count + 1); + } + if (str_eq(sk, EL_STR("service_block"))) { + svc_count = (svc_count + 1); + } + i = (i + 1); + } + if (cgi_count > 1) { + emit_line(EL_STR("#error \"El: multiple cgi blocks in program (only one allowed)\"")); + } + if (svc_count > 1) { + emit_line(EL_STR("#error \"El: multiple service blocks in program (only one allowed)\"")); + } + if (cgi_count >= 1) { + if (svc_count >= 1) { + emit_line(EL_STR("#error \"El: program declares both cgi and service blocks (mutually exclusive - pick one)\"")); + } + } + el_val_t kind = EL_STR("utility"); + if (cgi_count >= 1) { + kind = EL_STR("cgi"); + } + if (svc_count >= 1) { + kind = EL_STR("service"); + } + state_set(EL_STR("__program_kind"), kind); + state_set(EL_STR("__cap_violations"), EL_STR("")); + state_set(EL_STR("__arity_violations"), EL_STR("")); + state_set(EL_STR("__time_violations"), EL_STR("")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include ")); + emit_line(EL_STR("#include \"el_runtime.h\"")); + emit_blank(); + i = 0; + while (i < n) { + el_val_t sig = native_list_get(sigs, i); + el_val_t sk = el_get_field(sig, EL_STR("kind")); + if (str_eq(sk, EL_STR("fn"))) { + el_val_t fn_name = el_get_field(sig, EL_STR("name")); + if (!str_eq(fn_name, EL_STR("main"))) { + el_val_t params_c = el_get_field(sig, EL_STR("params_c")); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + } + if (str_eq(sk, EL_STR("extern_fn"))) { + el_val_t fn_name = el_get_field(sig, EL_STR("name")); + el_val_t params_c = el_get_field(sig, EL_STR("params_c")); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_val_t "), fn_name), EL_STR("(")), params_c), EL_STR(");"))); + } + i = (i + 1); + } + emit_blank(); + el_val_t has_toplevel_lets = 0; + i = 0; + while (i < n) { + el_val_t sig = native_list_get(sigs, i); + el_val_t sk = el_get_field(sig, EL_STR("kind")); + if (str_eq(sk, EL_STR("toplevel_let"))) { + el_val_t name = el_get_field(sig, EL_STR("name")); + el_val_t ltype = el_get_field(sig, EL_STR("ltype")); + if (str_eq(ltype, EL_STR("Int"))) { + add_int_name(name); + } + emit_line(el_str_concat(el_str_concat(EL_STR("el_val_t "), name), EL_STR(";"))); + has_toplevel_lets = 1; + } + i = (i + 1); + } + if (has_toplevel_lets) { + emit_blank(); + } + return 0; +} + +el_val_t codegen_streaming(el_val_t tokens, el_val_t sigs, el_val_t source) { + el_val_t total_tokens = (native_list_len(tokens) / 2); + el_val_t preamble_mark = el_arena_push(); + emit_streaming_preamble(sigs, source); + el_arena_pop(preamble_mark); + el_val_t has_el_main = 0; + el_val_t ns = native_list_len(sigs); + el_val_t si = 0; + while (si < ns) { + el_val_t sig = native_list_get(sigs, si); + el_val_t sk2 = el_get_field(sig, EL_STR("kind")); + if (str_eq(sk2, EL_STR("fn"))) { + el_val_t fn_name_chk = el_get_field(sig, EL_STR("name")); + if (str_eq(fn_name_chk, EL_STR("main"))) { + has_el_main = 1; + } + } + si = (si + 1); + } + el_val_t toplevel_let_names = native_list_empty(); + si = 0; + while (si < ns) { + el_val_t sig = native_list_get(sigs, si); + el_val_t sk2 = el_get_field(sig, EL_STR("kind")); + if (str_eq(sk2, EL_STR("toplevel_let"))) { + el_val_t tname = el_get_field(sig, EL_STR("name")); + toplevel_let_names = native_list_append(toplevel_let_names, tname); + } + si = (si + 1); + } + el_val_t test_is_mode = 0; + el_val_t tmode_str = state_get(EL_STR("__test_mode")); + if (str_eq(tmode_str, EL_STR("1"))) { + test_is_mode = 1; + } + el_val_t test_names = native_list_empty(); + el_val_t test_c_names = native_list_empty(); + if (test_is_mode) { + emit_line(EL_STR("#include ")); + emit_blank(); + emit_line(EL_STR("static int __el_pass = 0, __el_fail = 0;")); + emit_line(EL_STR("static const char *__el_cur_test = \"(none)\";")); + emit_line(EL_STR("static void __el_test_fail(const char *test, const char *msg) {")); + emit_line(EL_STR(" fprintf(stderr, \"FAIL %-40s %s\\n\", test, msg);")); + emit_line(EL_STR("}")); + emit_blank(); + } + el_val_t pos = 0; + el_val_t el_main_body = native_list_empty(); + el_val_t toplevel_exec_stmts = native_list_empty(); + el_val_t has_toplevel_exec = 0; + el_val_t stream_running = 1; + while (stream_running) { + if (pos >= total_tokens) { + stream_running = 0; + } else { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + stream_running = 0; + } else { + if (str_eq(k, EL_STR("Test"))) { + if (test_is_mode) { + el_val_t p = (pos + 1); + el_val_t test_name = EL_STR("unnamed"); + if (str_eq(tok_kind(tokens, p), EL_STR("Str"))) { + test_name = tok_value(tokens, p); + p = (p + 1); + } + el_val_t fn_c_name = el_str_concat(EL_STR("__el_test_"), sanitize_test_name(test_name)); + test_names = native_list_append(test_names, test_name); + test_c_names = native_list_append(test_c_names, fn_c_name); + emit_line(el_str_concat(el_str_concat(EL_STR("static void "), fn_c_name), EL_STR("(void) {"))); + emit_line(el_str_concat(el_str_concat(EL_STR(" __el_cur_test = \""), c_escape(test_name)), EL_STR("\";"))); + if (str_eq(tok_kind(tokens, p), EL_STR("LBrace"))) { + p = (p + 1); + } + el_val_t body_decl = native_list_empty(); + el_val_t body_done = 0; + while (!body_done) { + el_val_t bk = tok_kind(tokens, p); + if (str_eq(bk, EL_STR("RBrace"))) { + body_done = 1; + } else { + if (str_eq(bk, EL_STR("Eof"))) { + body_done = 1; + } else { + el_val_t br = parse_one(tokens, p); + el_val_t bstmt = el_get_field(br, EL_STR("node")); + el_val_t np = el_get_field(br, EL_STR("pos")); + el_release(br); + if (np > p) { + el_val_t body_arena = el_arena_push(); + body_decl = cg_stmt(bstmt, EL_STR(" "), body_decl); + el_arena_pop(body_arena); + el_release(bstmt); + p = np; + } else { + p = (p + 1); + } + } + } + } + if (str_eq(tok_kind(tokens, p), EL_STR("RBrace"))) { + p = (p + 1); + } + el_release(body_decl); + emit_line(EL_STR("}")); + emit_blank(); + pos = p; + } else { + el_val_t p = (pos + 1); + el_val_t k_name = tok_kind(tokens, p); + if (str_eq(k_name, EL_STR("Str"))) { + p = (p + 1); + } + el_val_t k_body = tok_kind(tokens, p); + if (str_eq(k_body, EL_STR("LBrace"))) { + p = skip_to_rbrace(tokens, p); + } + pos = p; + } + } else { + el_val_t r = parse_one(tokens, pos); + el_val_t stmt = el_get_field(r, EL_STR("node")); + el_val_t new_pos = el_get_field(r, EL_STR("pos")); + el_release(r); + if (new_pos <= pos) { + el_release(stmt); + pos = (pos + 1); + } else { + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t fn_name2 = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name2, EL_STR("main"))) { + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t bn = native_list_len(body); + el_val_t bi = 0; + while (bi < bn) { + el_main_body = native_list_append(el_main_body, native_list_get(body, bi)); + bi = (bi + 1); + } + el_release(stmt); + } else { + el_val_t fn_arena_mark = el_arena_push(); + cg_fn(stmt); + el_release(stmt); + el_arena_pop(fn_arena_mark); + } + } else { + if (is_top_level_decl(stmt)) { + el_release(stmt); + } else { + if (str_eq(sk, EL_STR("Let"))) { + toplevel_exec_stmts = native_list_append(toplevel_exec_stmts, stmt); + has_toplevel_exec = 1; + } else { + toplevel_exec_stmts = native_list_append(toplevel_exec_stmts, stmt); + has_toplevel_exec = 1; + } + } + } + pos = new_pos; + } + } + } + } + } + el_release(tokens); + if (test_is_mode) { + el_release(el_main_body); + el_release(toplevel_exec_stmts); + el_release(toplevel_let_names); + el_release(sigs); + el_val_t test_arena_mark = el_arena_push(); + emit_line(EL_STR("int main(int _argc, char **_argv) {")); + emit_line(EL_STR(" el_runtime_init_args(_argc, _argv);")); + el_val_t ti = 0; + el_val_t tn = native_list_len(test_c_names); + while (ti < tn) { + el_val_t tc_name = native_list_get(test_c_names, ti); + emit_line(el_str_concat(el_str_concat(EL_STR(" "), tc_name), EL_STR("();"))); + ti = (ti + 1); + } + emit_line(EL_STR(" printf(\"%d passed, %d failed\\n\", __el_pass, __el_fail);")); + emit_line(EL_STR(" return __el_fail;")); + emit_line(EL_STR("}")); + el_arena_pop(test_arena_mark); + el_release(test_names); + el_release(test_c_names); + return EL_STR(""); + } + el_release(test_names); + el_release(test_c_names); + el_val_t is_library = 0; + if (!has_el_main) { + if (!has_toplevel_exec) { + is_library = 1; + } + } + if (is_library) { + return EL_STR(""); + } + el_val_t main_arena_mark = el_arena_push(); + el_val_t kind2 = state_get(EL_STR("__program_kind")); + emit_line(EL_STR("int main(int _argc, char** _argv) {")); + emit_line(EL_STR(" el_runtime_init_args(_argc, _argv);")); + el_val_t ns2 = native_list_len(sigs); + el_val_t si2 = 0; + while (si2 < ns2) { + el_val_t sig2 = native_list_get(sigs, si2); + el_val_t sk3 = el_get_field(sig2, EL_STR("kind")); + if (str_eq(sk3, EL_STR("cgi_block"))) { + el_val_t tes_n = native_list_len(toplevel_exec_stmts); + el_val_t tes_i = 0; + while (tes_i < tes_n) { + el_val_t tes = native_list_get(toplevel_exec_stmts, tes_i); + el_val_t tes_k = el_get_field(tes, EL_STR("stmt")); + if (str_eq(tes_k, EL_STR("CgiBlock"))) { + el_val_t cname2 = el_get_field(tes, EL_STR("name")); + el_val_t cdid2 = el_get_field(tes, EL_STR("dharma_id")); + el_val_t cprin2 = el_get_field(tes, EL_STR("principal")); + el_val_t cnet2 = el_get_field(tes, EL_STR("network")); + el_val_t ceng2 = el_get_field(tes, EL_STR("engram")); + el_val_t has_did2 = el_get_field(tes, EL_STR("has_dharma_id")); + el_val_t has_prin2 = el_get_field(tes, EL_STR("has_principal")); + el_val_t has_net2 = el_get_field(tes, EL_STR("has_network")); + el_val_t has_eng2 = el_get_field(tes, EL_STR("has_engram")); + el_val_t arg_name2 = el_str_concat(el_str_concat(EL_STR("EL_STR("), c_str_lit(cname2)), EL_STR(")")); + el_val_t arg_did2 = cgi_arg(cdid2, has_did2); + el_val_t arg_prin2 = cgi_arg(cprin2, has_prin2); + el_val_t arg_net2 = cgi_arg(cnet2, has_net2); + el_val_t arg_eng2 = cgi_arg(ceng2, has_eng2); + emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR(" el_cgi_init("), arg_name2), EL_STR(", ")), arg_did2), EL_STR(", ")), arg_prin2), EL_STR(", ")), arg_net2), EL_STR(", ")), arg_eng2), EL_STR(");"))); + } + tes_i = (tes_i + 1); + } + } + si2 = (si2 + 1); + } + el_release(sigs); + el_val_t main_decl2 = native_list_empty(); + el_val_t tln = native_list_len(toplevel_let_names); + el_val_t tli = 0; + while (tli < tln) { + main_decl2 = native_list_append(main_decl2, native_list_get(toplevel_let_names, tli)); + tli = (tli + 1); + } + el_release(toplevel_let_names); + el_val_t tes_n2 = native_list_len(toplevel_exec_stmts); + el_val_t tes_i2 = 0; + while (tes_i2 < tes_n2) { + el_val_t tes2 = native_list_get(toplevel_exec_stmts, tes_i2); + el_val_t tes_k2 = el_get_field(tes2, EL_STR("stmt")); + if (!str_eq(tes_k2, EL_STR("CgiBlock"))) { + if (!str_eq(tes_k2, EL_STR("ServiceBlock"))) { + el_val_t tes_mark = el_arena_push(); + main_decl2 = cg_stmt(tes2, EL_STR(" "), main_decl2); + el_arena_pop(tes_mark); + } + } + tes_i2 = (tes_i2 + 1); + } + el_release(toplevel_exec_stmts); + el_val_t mn = native_list_len(el_main_body); + el_val_t mi = 0; + while (mi < mn) { + el_val_t mstmt = native_list_get(el_main_body, mi); + el_val_t stmt_mark = el_arena_push(); + main_decl2 = cg_stmt(mstmt, EL_STR(" "), main_decl2); + el_arena_pop(stmt_mark); + mi = (mi + 1); + } + el_release(el_main_body); + el_release(main_decl2); + emit_line(EL_STR(" return 0;")); + emit_line(EL_STR("}")); + emit_blank(); + emit_cap_violations(); + emit_arity_violations(); + emit_time_violations(); + el_arena_pop(main_arena_mark); + return EL_STR(""); + return 0; +} + +el_val_t js_escape(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t total = native_list_len(chars); + el_val_t parts = native_list_empty(); + el_val_t i = 0; + while (i < total) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("\""))) { + parts = native_list_append(parts, EL_STR("\\\"")); + } else { + if (str_eq(ch, EL_STR("\\"))) { + parts = native_list_append(parts, EL_STR("\\\\")); + } else { + if (str_eq(ch, EL_STR("\n"))) { + parts = native_list_append(parts, EL_STR("\\n")); + } else { + if (str_eq(ch, EL_STR("\r"))) { + parts = native_list_append(parts, EL_STR("\\r")); + } else { + if (str_eq(ch, EL_STR("\t"))) { + parts = native_list_append(parts, EL_STR("\\t")); + } else { + parts = native_list_append(parts, ch); + } + } + } + } + } + i = (i + 1); + } + return str_join(parts, EL_STR("")); + return 0; +} + +el_val_t js_str_lit(el_val_t s) { + return el_str_concat(el_str_concat(EL_STR("\""), js_escape(s)), EL_STR("\"")); + return 0; +} + +el_val_t js_emit_line(el_val_t line) { + println(line); + return 0; +} + +el_val_t js_emit_blank(void) { + println(EL_STR("")); + return 0; +} + +el_val_t js_binop(el_val_t op) { + if (str_eq(op, EL_STR("Plus"))) { + return EL_STR("+"); + } + if (str_eq(op, EL_STR("Minus"))) { + return EL_STR("-"); + } + if (str_eq(op, EL_STR("Star"))) { + return EL_STR("*"); + } + if (str_eq(op, EL_STR("Slash"))) { + return EL_STR("/"); + } + if (str_eq(op, EL_STR("Percent"))) { + return EL_STR("%"); + } + if (str_eq(op, EL_STR("EqEq"))) { + return EL_STR("==="); + } + if (str_eq(op, EL_STR("NotEq"))) { + return EL_STR("!=="); + } + if (str_eq(op, EL_STR("Lt"))) { + return EL_STR("<"); + } + if (str_eq(op, EL_STR("Gt"))) { + return EL_STR(">"); + } + if (str_eq(op, EL_STR("LtEq"))) { + return EL_STR("<="); + } + if (str_eq(op, EL_STR("GtEq"))) { + return EL_STR(">="); + } + if (str_eq(op, EL_STR("And"))) { + return EL_STR("&&"); + } + if (str_eq(op, EL_STR("Or"))) { + return EL_STR("||"); + } + return op; + return 0; +} + +el_val_t js_is_el_method(el_val_t name) { + if (str_eq(name, EL_STR("append"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("get"))) { + return 1; + } + if (str_eq(name, EL_STR("map_get"))) { + return 1; + } + if (str_eq(name, EL_STR("map_set"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_is_async_builtin(el_val_t name) { + if (str_eq(name, EL_STR("http_get"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post_json"))) { + return 1; + } + if (str_eq(name, EL_STR("http_get_with_headers"))) { + return 1; + } + if (str_eq(name, EL_STR("http_post_with_headers"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_register_async_fn(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_async_fns")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__js_async_fns"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t js_is_async_fn(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_async_fns")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t js_is_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + return 0; + } + return str_contains(csv, el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(","))); + return 0; +} + +el_val_t js_add_int_name(el_val_t name) { + el_val_t csv = state_get(EL_STR("__js_int_names")); + if (str_eq(csv, EL_STR(""))) { + csv = EL_STR(","); + } + el_val_t key = el_str_concat(el_str_concat(EL_STR(","), name), EL_STR(",")); + if (str_contains(csv, key)) { + return 1; + } + state_set(EL_STR("__js_int_names"), el_str_concat(el_str_concat(csv, name), EL_STR(","))); + return 1; + return 0; +} + +el_val_t js_build_int_names_for_params(el_val_t params) { + state_set(EL_STR("__js_int_names"), EL_STR(",")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR("Int"))) { + js_add_int_name(pname); + } + pi = (pi + 1); + } + return 1; + return 0; +} + +el_val_t js_is_int_call(el_val_t call_expr) { + el_val_t func = el_get_field(call_expr, EL_STR("func")); + el_val_t fk = el_get_field(func, EL_STR("expr")); + if (!str_eq(fk, EL_STR("Ident"))) { + return 0; + } + el_val_t name = el_get_field(func, EL_STR("name")); + if (str_eq(name, EL_STR("str_len"))) { + return 1; + } + if (str_eq(name, EL_STR("str_index_of"))) { + return 1; + } + if (str_eq(name, EL_STR("str_to_int"))) { + return 1; + } + if (str_eq(name, EL_STR("str_char_code"))) { + return 1; + } + if (str_eq(name, EL_STR("native_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("el_list_len"))) { + return 1; + } + if (str_eq(name, EL_STR("len"))) { + return 1; + } + if (str_eq(name, EL_STR("json_get_int"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now"))) { + return 1; + } + if (str_eq(name, EL_STR("time_now_utc"))) { + return 1; + } + if (str_eq(name, EL_STR("el_abs"))) { + return 1; + } + if (str_eq(name, EL_STR("el_max"))) { + return 1; + } + if (str_eq(name, EL_STR("el_min"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_next_html_id(void) { + el_val_t csv = state_get(EL_STR("__js_html_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__js_html_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_html_parts(el_val_t children, el_val_t acc_var) { + el_val_t n = native_list_len(children); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t child = native_list_get(children, i); + el_val_t html_kind = el_get_field(child, EL_STR("html")); + if (str_eq(html_kind, EL_STR("Text"))) { + el_val_t text = el_get_field(child, EL_STR("text")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(text)), EL_STR("; ")); + } + if (str_eq(html_kind, EL_STR("Doctype"))) { + out = el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \"\"; ")); + } + if (str_eq(html_kind, EL_STR("Interp"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_escape(")), val_c), EL_STR("); ")); + } + if (str_eq(html_kind, EL_STR("Raw"))) { + el_val_t val_node = el_get_field(child, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_raw(")), val_c), EL_STR("); ")); + } + if (str_eq(html_kind, EL_STR("Element"))) { + el_val_t elem_c = js_cg_html_element_str(child, acc_var); + out = el_str_concat(out, elem_c); + } + if (str_eq(html_kind, EL_STR("Each"))) { + el_val_t each_c = js_cg_html_each(child, acc_var); + out = el_str_concat(out, each_c); + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_cg_html_attrs_str(el_val_t attrs, el_val_t acc_var) { + el_val_t n = native_list_len(attrs); + el_val_t i = 0; + el_val_t out = EL_STR(""); + while (i < n) { + el_val_t attr = native_list_get(attrs, i); + el_val_t attr_name = el_get_field(attr, EL_STR("name")); + el_val_t kind = el_get_field(attr, EL_STR("kind")); + el_val_t open_val = el_str_concat(el_str_concat(EL_STR(" "), attr_name), EL_STR("=\"")); + if (str_eq(kind, EL_STR("static"))) { + el_val_t sv = el_get_field(attr, EL_STR("value")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(open_val)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(sv)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(EL_STR("\""))), EL_STR("; ")); + } else { + if (str_eq(kind, EL_STR("dynamic"))) { + el_val_t val_node = el_get_field(attr, EL_STR("value")); + el_val_t val_c = js_cg_expr(val_node); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(open_val)), EL_STR("; ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += html_escape(")), val_c), EL_STR("); ")); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(EL_STR("\""))), EL_STR("; ")); + } else { + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(el_str_concat(EL_STR(" "), attr_name))), EL_STR("; ")); + } + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t js_cg_html_element_str(el_val_t elem, el_val_t acc_var) { + el_val_t tag = el_get_field(elem, EL_STR("tag")); + el_val_t attrs = el_get_field(elem, EL_STR("attrs")); + el_val_t children = el_get_field(elem, EL_STR("children")); + el_val_t self_closing = el_get_field(elem, EL_STR("self_closing")); + el_val_t out = el_str_concat(el_str_concat(el_str_concat(acc_var, EL_STR(" += ")), js_str_lit(el_str_concat(EL_STR("<"), tag))), EL_STR("; ")); + out = el_str_concat(out, js_cg_html_attrs_str(attrs, acc_var)); + if (self_closing) { + out = el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \"/>\"")), EL_STR("; ")); + } else { + out = el_str_concat(el_str_concat(out, acc_var), EL_STR(" += \">\"; ")); + out = el_str_concat(out, js_cg_html_parts(children, acc_var)); + out = el_str_concat(el_str_concat(el_str_concat(el_str_concat(out, acc_var), EL_STR(" += ")), js_str_lit(el_str_concat(el_str_concat(EL_STR("")))), EL_STR("; ")); + } + return out; + return 0; +} + +el_val_t js_cg_html_each(el_val_t node, el_val_t acc_var) { + el_val_t list_expr = el_get_field(node, EL_STR("list")); + el_val_t item_name = el_get_field(node, EL_STR("item")); + el_val_t body_children = el_get_field(node, EL_STR("body")); + el_val_t id = js_next_html_id(); + el_val_t list_var = el_str_concat(EL_STR("_html_list_"), id); + el_val_t len_var = el_str_concat(EL_STR("_html_len_"), id); + el_val_t idx_var = el_str_concat(EL_STR("_html_i_"), id); + el_val_t list_c = js_cg_expr(list_expr); + el_val_t inner_c = js_cg_html_parts(body_children, acc_var); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ const "), list_var), EL_STR(" = ")), list_c), EL_STR("; const ")), len_var), EL_STR(" = el_list_len(")), list_var), EL_STR("); for (let ")), idx_var), EL_STR(" = 0; ")), idx_var), EL_STR(" < ")), len_var), EL_STR("; ")), idx_var), EL_STR("++) { const ")), item_name), EL_STR(" = el_list_get(")), list_var), EL_STR(", ")), idx_var), EL_STR("); ")), inner_c), EL_STR("} } ")); + return 0; +} + +el_val_t js_cg_html_template(el_val_t expr) { + el_val_t root = el_get_field(expr, EL_STR("root")); + el_val_t id = js_next_html_id(); + el_val_t acc = el_str_concat(EL_STR("_html_"), id); + el_val_t doctype_flag = el_get_field(root, EL_STR("doctype")); + el_val_t doctype_prefix = EL_STR(""); + if (doctype_flag) { + doctype_prefix = el_str_concat(acc, EL_STR(" += \"\"; ")); + } + el_val_t body = js_cg_html_element_str(root, acc); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("(() => { let "), acc), EL_STR(" = \"\"; ")), doctype_prefix), body), EL_STR("return ")), acc), EL_STR("; })()")); + return 0; +} + +el_val_t js_cg_expr(el_val_t expr) { + el_val_t kind = el_get_field(expr, EL_STR("expr")); + if (str_eq(kind, EL_STR("Int"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("DurationLit"))) { + el_val_t count = el_get_field(expr, EL_STR("count")); + el_val_t unit = el_get_field(expr, EL_STR("unit")); + el_val_t mult_ns = EL_STR("1"); + if (str_eq(unit, EL_STR("nano"))) { + mult_ns = EL_STR("1"); + } + if (str_eq(unit, EL_STR("nanos"))) { + mult_ns = EL_STR("1"); + } + if (str_eq(unit, EL_STR("milli"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("millis"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("millisecond"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("milliseconds"))) { + mult_ns = EL_STR("1000000"); + } + if (str_eq(unit, EL_STR("second"))) { + mult_ns = EL_STR("1000000000"); + } + if (str_eq(unit, EL_STR("seconds"))) { + mult_ns = EL_STR("1000000000"); + } + if (str_eq(unit, EL_STR("minute"))) { + mult_ns = EL_STR("60000000000"); + } + if (str_eq(unit, EL_STR("minutes"))) { + mult_ns = EL_STR("60000000000"); + } + if (str_eq(unit, EL_STR("hour"))) { + mult_ns = EL_STR("3600000000000"); + } + if (str_eq(unit, EL_STR("hours"))) { + mult_ns = EL_STR("3600000000000"); + } + if (str_eq(unit, EL_STR("day"))) { + mult_ns = EL_STR("86400000000000"); + } + if (str_eq(unit, EL_STR("days"))) { + mult_ns = EL_STR("86400000000000"); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), count), EL_STR(" * ")), mult_ns), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Float"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return v; + } + if (str_eq(kind, EL_STR("Str"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + return js_str_lit(v); + } + if (str_eq(kind, EL_STR("Bool"))) { + el_val_t v = el_get_field(expr, EL_STR("value")); + if (str_eq(v, EL_STR("true"))) { + return EL_STR("true"); + } + return EL_STR("false"); + } + if (str_eq(kind, EL_STR("Nil"))) { + return EL_STR("null"); + } + if (str_eq(kind, EL_STR("Ident"))) { + el_val_t name = el_get_field(expr, EL_STR("name")); + return name; + } + if (str_eq(kind, EL_STR("Not"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(EL_STR("!"), inner_c); + } + if (str_eq(kind, EL_STR("Neg"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(EL_STR("(-"), inner_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("BinOp"))) { + el_val_t op = el_get_field(expr, EL_STR("op")); + el_val_t left = el_get_field(expr, EL_STR("left")); + el_val_t right = el_get_field(expr, EL_STR("right")); + el_val_t left_c = js_cg_expr(left); + el_val_t right_c = js_cg_expr(right); + el_val_t left_kind = el_get_field(left, EL_STR("expr")); + el_val_t right_kind = el_get_field(right, EL_STR("expr")); + if (str_eq(op, EL_STR("Plus"))) { + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(right_kind, EL_STR("Ident"))) { + if (str_eq(left_kind, EL_STR("Call"))) { + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(rname)) { + if (js_is_int_call(left)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Call"))) { + if (str_eq(right_kind, EL_STR("Call"))) { + if (js_is_int_call(left)) { + if (js_is_int_call(right)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" + ")), right_c), EL_STR(")")); + } + } + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Call"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Ident"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_str_concat("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + } + if (str_eq(op, EL_STR("EqEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" === ")), right_c), EL_STR(")")); + } + if (str_eq(op, EL_STR("NotEq"))) { + if (str_eq(left_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Int"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Bool"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Nil"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + if (str_eq(left_kind, EL_STR("Ident"))) { + if (str_eq(right_kind, EL_STR("Ident"))) { + el_val_t lname = el_get_field(left, EL_STR("name")); + el_val_t rname = el_get_field(right, EL_STR("name")); + if (js_is_int_name(lname)) { + if (js_is_int_name(rname)) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + } + } + } + if (str_eq(left_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + if (str_eq(right_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("!str_eq("), left_c), EL_STR(", ")), right_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" !== ")), right_c), EL_STR(")")); + } + el_val_t op_c = js_binop(op); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), left_c), EL_STR(" ")), op_c), EL_STR(" ")), right_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Call"))) { + el_val_t func = el_get_field(expr, EL_STR("func")); + el_val_t args = el_get_field(expr, EL_STR("args")); + el_val_t arity = native_list_len(args); + el_val_t func_kind = el_get_field(func, EL_STR("expr")); + el_val_t args_parts = native_list_empty(); + el_val_t i = 0; + while (i < arity) { + el_val_t arg = native_list_get(args, i); + el_val_t arg_c = js_cg_expr(arg); + args_parts = native_list_append(args_parts, arg_c); + i = (i + 1); + } + el_val_t args_c = str_join(args_parts, EL_STR(", ")); + if (str_eq(func_kind, EL_STR("Ident"))) { + el_val_t fn_name = el_get_field(func, EL_STR("name")); + el_val_t call_expr = el_str_concat(el_str_concat(el_str_concat(fn_name, EL_STR("(")), args_c), EL_STR(")")); + if (js_is_async_builtin(fn_name)) { + return el_str_concat(EL_STR("await "), call_expr); + } + if (js_is_async_fn(fn_name)) { + return el_str_concat(EL_STR("await "), call_expr); + } + return call_expr; + } + if (str_eq(func_kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(func, EL_STR("object")); + el_val_t field = el_get_field(func, EL_STR("field")); + el_val_t obj_c = js_cg_expr(obj); + if (js_is_el_method(field)) { + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(", ")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(field, EL_STR("(")), obj_c), EL_STR(")")); + } + if (arity > 0) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(obj_c, EL_STR(".")), field), EL_STR("(")), args_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(obj_c, EL_STR(".")), field), EL_STR("()")); + } + el_val_t fn_c = js_cg_expr(func); + return el_str_concat(el_str_concat(el_str_concat(fn_c, EL_STR("(")), args_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Field"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t field = el_get_field(expr, EL_STR("field")); + el_val_t obj_kind = el_get_field(obj, EL_STR("expr")); + if (str_eq(obj_kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(obj, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), inner_c), EL_STR(")?.[")), js_str_lit(field)), EL_STR("] ?? null")); + } + el_val_t obj_c = js_cg_expr(obj); + return el_str_concat(el_str_concat(el_str_concat(obj_c, EL_STR("[")), js_str_lit(field)), EL_STR("]")); + } + if (str_eq(kind, EL_STR("Index"))) { + el_val_t obj = el_get_field(expr, EL_STR("object")); + el_val_t idx = el_get_field(expr, EL_STR("index")); + el_val_t obj_c = js_cg_expr(obj); + el_val_t idx_c = js_cg_expr(idx); + el_val_t idx_kind = el_get_field(idx, EL_STR("expr")); + el_val_t obj_kind = el_get_field(obj, EL_STR("expr")); + if (str_eq(obj_kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(obj, EL_STR("inner")); + el_val_t inner_c = js_cg_expr(inner); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), inner_c), EL_STR(")?.[")), idx_c), EL_STR("] ?? null")); + } + if (str_eq(idx_kind, EL_STR("Str"))) { + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_get_field("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("el_list_get("), obj_c), EL_STR(", ")), idx_c), EL_STR(")")); + } + if (str_eq(kind, EL_STR("Array"))) { + el_val_t elems = el_get_field(expr, EL_STR("elems")); + el_val_t n = native_list_len(elems); + if (n == 0) { + return EL_STR("[]"); + } + el_val_t items_parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t elem = native_list_get(elems, i); + el_val_t elem_c = js_cg_expr(elem); + items_parts = native_list_append(items_parts, elem_c); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("["), str_join(items_parts, EL_STR(", "))), EL_STR("]")); + } + if (str_eq(kind, EL_STR("Map"))) { + el_val_t pairs = el_get_field(expr, EL_STR("pairs")); + el_val_t n = native_list_len(pairs); + if (n == 0) { + return EL_STR("{}"); + } + el_val_t items_parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t pair = native_list_get(pairs, i); + el_val_t key = el_get_field(pair, EL_STR("key")); + el_val_t val = el_get_field(pair, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + items_parts = native_list_append(items_parts, el_str_concat(el_str_concat(js_str_lit(key), EL_STR(": ")), val_c)); + i = (i + 1); + } + return el_str_concat(el_str_concat(EL_STR("{"), str_join(items_parts, EL_STR(", "))), EL_STR("}")); + } + if (str_eq(kind, EL_STR("Try"))) { + el_val_t inner = el_get_field(expr, EL_STR("inner")); + return js_cg_expr(inner); + } + if (str_eq(kind, EL_STR("If"))) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t cond_c = js_cg_expr(cond); + return el_str_concat(el_str_concat(EL_STR("("), cond_c), EL_STR(" ? 1 : 0)")); + } + if (str_eq(kind, EL_STR("Match"))) { + return js_cg_match(expr); + } + if (str_eq(kind, EL_STR("Lambda"))) { + return js_cg_lambda(expr); + } + if (str_eq(kind, EL_STR("HtmlTemplate"))) { + return js_cg_html_template(expr); + } + return EL_STR("null"); + return 0; +} + +el_val_t js_next_match_id(void) { + el_val_t csv = state_get(EL_STR("__js_match_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__js_match_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_match(el_val_t expr) { + el_val_t subject = el_get_field(expr, EL_STR("subject")); + el_val_t arms = el_get_field(expr, EL_STR("arms")); + el_val_t subj_c = js_cg_expr(subject); + el_val_t id = js_next_match_id(); + el_val_t subj_var = el_str_concat(EL_STR("_match_subj_"), id); + el_val_t parts = native_list_empty(); + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("(("), subj_var), EL_STR(") => { "))); + el_val_t n = native_list_len(arms); + el_val_t i = 0; + while (i < n) { + el_val_t arm = native_list_get(arms, i); + el_val_t pat = el_get_field(arm, EL_STR("pattern")); + el_val_t body = el_get_field(arm, EL_STR("body")); + el_val_t pkind = el_get_field(pat, EL_STR("pattern")); + el_val_t body_c = js_cg_expr(body); + if (str_eq(pkind, EL_STR("Wildcard"))) { + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("return ("), body_c), EL_STR("); "))); + } else { + if (str_eq(pkind, EL_STR("Binding"))) { + el_val_t bname = el_get_field(pat, EL_STR("name")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{ const "), bname), EL_STR(" = ")), subj_var), EL_STR("; return (")), body_c), EL_STR("); } "))); + } else { + if (str_eq(pkind, EL_STR("LitInt"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), subj_var), EL_STR(" === ")), v), EL_STR(") return (")), body_c), EL_STR("); "))); + } else { + if (str_eq(pkind, EL_STR("LitStr"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if (str_eq("), subj_var), EL_STR(", ")), js_str_lit(v)), EL_STR(")) return (")), body_c), EL_STR("); "))); + } else { + if (str_eq(pkind, EL_STR("LitBool"))) { + el_val_t v = el_get_field(pat, EL_STR("value")); + el_val_t bv = EL_STR("false"); + if (str_eq(v, EL_STR("true"))) { + bv = EL_STR("true"); + } + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if ("), subj_var), EL_STR(" === ")), bv), EL_STR(") return (")), body_c), EL_STR("); "))); + } else { + if (str_eq(pkind, EL_STR("Variant"))) { + el_val_t variant = el_get_field(pat, EL_STR("variant")); + parts = native_list_append(parts, el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("if (str_eq("), subj_var), EL_STR(", ")), js_str_lit(variant)), EL_STR(")) return (")), body_c), EL_STR("); "))); + } else { + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("return ("), body_c), EL_STR("); "))); + } + } + } + } + } + } + i = (i + 1); + } + parts = native_list_append(parts, el_str_concat(el_str_concat(EL_STR("return null; })("), subj_c), EL_STR(")"))); + return str_join(parts, EL_STR("")); + return 0; +} + +el_val_t js_next_lambda_id(void) { + el_val_t csv = state_get(EL_STR("__js_lambda_counter")); + el_val_t n = 0; + if (!str_eq(csv, EL_STR(""))) { + n = str_to_int(csv); + } + n = (n + 1); + state_set(EL_STR("__js_lambda_counter"), native_int_to_str(n)); + return native_int_to_str(n); + return 0; +} + +el_val_t js_cg_lambda(el_val_t expr) { + el_val_t params = el_get_field(expr, EL_STR("params")); + el_val_t body = el_get_field(expr, EL_STR("body")); + el_val_t ret_type = el_get_field(expr, EL_STR("ret_type")); + el_val_t id = js_next_lambda_id(); + el_val_t lambda_name = el_str_concat(EL_STR("__lambda_"), id); + el_val_t params_str = js_params_str(params); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("function "), lambda_name), EL_STR("(")), params_str), EL_STR(") {"))); + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = js_transform_implicit_return(body); + } + js_build_int_names_for_params(params); + js_cg_stmts(body_xformed, EL_STR(" "), decl); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return lambda_name; + return 0; +} + +el_val_t js_list_contains(el_val_t lst, el_val_t s) { + el_val_t n = native_list_len(lst); + el_val_t i = 0; + while (i < n) { + el_val_t item = native_list_get(lst, i); + if (str_eq(item, s)) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t js_cg_stmt(el_val_t stmt, el_val_t indent, el_val_t declared) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("Let"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + el_val_t ltype = el_get_field(stmt, EL_STR("type")); + if (str_eq(ltype, EL_STR("Int"))) { + js_add_int_name(name); + } + el_val_t vk = el_get_field(val, EL_STR("expr")); + if (str_eq(vk, EL_STR("Int"))) { + js_add_int_name(name); + } + if (js_list_contains(declared, name)) { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("let ")), name), EL_STR(" = ")), val_c), EL_STR(";"))); + return native_list_append(declared, name); + } + } + if (str_eq(kind, EL_STR("Return"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("Nil"))) { + js_emit_line(el_str_concat(indent, EL_STR("return null;"))); + } else { + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("return ")), val_c), EL_STR(";"))); + } + return declared; + } + if (str_eq(kind, EL_STR("Assign"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, name), EL_STR(" = ")), val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(stmt, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + js_cg_if_stmt(val, indent, declared); + return declared; + } + if (str_eq(val_kind, EL_STR("For"))) { + js_cg_for_stmt(val, indent, declared); + return declared; + } + el_val_t val_c = js_cg_expr(val); + js_emit_line(el_str_concat(el_str_concat(indent, val_c), EL_STR(";"))); + return declared; + } + if (str_eq(kind, EL_STR("While"))) { + el_val_t cond = el_get_field(stmt, EL_STR("cond")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("while (")), cond_c), EL_STR(") {"))); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("For"))) { + el_val_t item = el_get_field(stmt, EL_STR("item")); + el_val_t list_expr = el_get_field(stmt, EL_STR("list")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return declared; + } + if (str_eq(kind, EL_STR("FnDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("TypeDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return declared; + } + if (str_eq(kind, EL_STR("Import"))) { + return declared; + } + if (str_eq(kind, EL_STR("TryCatch"))) { + el_val_t try_body = el_get_field(stmt, EL_STR("try_body")); + el_val_t catch_name = el_get_field(stmt, EL_STR("catch_name")); + el_val_t catch_body = el_get_field(stmt, EL_STR("catch_body")); + js_emit_line(el_str_concat(indent, EL_STR("try {"))); + js_cg_stmts(try_body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("} catch (")), catch_name), EL_STR(") {"))); + js_cg_stmts(catch_body, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return declared; + } + if (str_eq(kind, EL_STR("ExternFn"))) { + el_val_t ename = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// extern fn ")), ename), EL_STR(" \xe2\x80\x94 provided by the JS environment"))); + return declared; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + el_val_t cname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// cgi block '")), cname), EL_STR("' \xe2\x80\x94 no-op in JS target (server-side concept)"))); + return declared; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + el_val_t sname = el_get_field(stmt, EL_STR("name")); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("// service block '")), sname), EL_STR("' \xe2\x80\x94 no-op in JS target"))); + return declared; + } + return declared; + return 0; +} + +el_val_t js_strip_outer_parens(el_val_t s) { + el_val_t chars = native_string_chars(s); + el_val_t n = native_list_len(chars); + if (n < 2) { + return s; + } + el_val_t first = native_list_get(chars, 0); + el_val_t last = native_list_get(chars, (n - 1)); + if (str_eq(first, EL_STR("("))) { + if (str_eq(last, EL_STR(")"))) { + el_val_t depth = 1; + el_val_t i = 1; + el_val_t balanced = 1; + while (i < (n - 1)) { + el_val_t ch = native_list_get(chars, i); + if (str_eq(ch, EL_STR("("))) { + depth = (depth + 1); + } + if (str_eq(ch, EL_STR(")"))) { + depth = (depth - 1); + if (depth == 0) { + balanced = 0; + i = n; + } + } + i = (i + 1); + } + if (balanced) { + return str_slice(s, 1, (n - 1)); + } + } + } + return s; + return 0; +} + +el_val_t js_cg_if_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t cond = el_get_field(expr, EL_STR("cond")); + el_val_t then_stmts = el_get_field(expr, EL_STR("then")); + el_val_t else_stmts = el_get_field(expr, EL_STR("else")); + el_val_t has_else = el_get_field(expr, EL_STR("has_else")); + el_val_t cond_c = js_cg_expr(cond); + cond_c = js_strip_outer_parens(cond_c); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("if (")), cond_c), EL_STR(") {"))); + js_cg_stmts(then_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + if (has_else) { + js_emit_line(el_str_concat(indent, EL_STR("} else {"))); + js_cg_stmts(else_stmts, el_str_concat(indent, EL_STR(" ")), native_list_clone(declared)); + } + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_body(el_val_t item, el_val_t list_expr, el_val_t body, el_val_t indent, el_val_t declared) { + el_val_t list_c = js_cg_expr(list_expr); + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(indent, EL_STR("for (const ")), item), EL_STR(" of ")), list_c), EL_STR(") {"))); + el_val_t body_decl = native_list_clone(declared); + body_decl = native_list_append(body_decl, item); + js_cg_stmts(body, el_str_concat(indent, EL_STR(" ")), body_decl); + js_emit_line(el_str_concat(indent, EL_STR("}"))); + return 0; +} + +el_val_t js_cg_for_stmt(el_val_t expr, el_val_t indent, el_val_t declared) { + el_val_t item = el_get_field(expr, EL_STR("item")); + el_val_t list_expr = el_get_field(expr, EL_STR("list")); + el_val_t body = el_get_field(expr, EL_STR("body")); + js_cg_for_body(item, list_expr, body, indent, declared); + return 0; +} + +el_val_t js_cg_stmts(el_val_t stmts, el_val_t indent, el_val_t declared) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t decl = declared; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + decl = js_cg_stmt(stmt, indent, decl); + i = (i + 1); + } + return decl; + return 0; +} + +el_val_t js_params_str(el_val_t params) { + el_val_t n = native_list_len(params); + if (n == 0) { + return EL_STR(""); + } + el_val_t parts = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t param = native_list_get(params, i); + el_val_t name = el_get_field(param, EL_STR("name")); + parts = native_list_append(parts, name); + i = (i + 1); + } + return str_join(parts, EL_STR(", ")); + return 0; +} + +el_val_t js_transform_implicit_return(el_val_t body) { + el_val_t n = native_list_len(body); + if (n == 0) { + return body; + } + el_val_t last = native_list_get(body, (n - 1)); + el_val_t last_kind = el_get_field(last, EL_STR("stmt")); + if (str_eq(last_kind, EL_STR("Expr"))) { + el_val_t val = el_get_field(last, EL_STR("value")); + el_val_t val_kind = el_get_field(val, EL_STR("expr")); + if (str_eq(val_kind, EL_STR("If"))) { + return body; + } + if (str_eq(val_kind, EL_STR("For"))) { + return body; + } + el_val_t new_body = native_list_empty(); + el_val_t i = 0; + while (i < (n - 1)) { + new_body = native_list_append(new_body, native_list_get(body, i)); + i = (i + 1); + } + el_val_t return_stmt = el_map_new(2, "stmt", EL_STR("Return"), "value", val); + new_body = native_list_append(new_body, return_stmt); + return new_body; + } + return body; + return 0; +} + +el_val_t js_cg_fn(el_val_t stmt) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t body = el_get_field(stmt, EL_STR("body")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t decorator = el_get_field(stmt, EL_STR("decorator")); + el_val_t params_str = js_params_str(params); + js_build_int_names_for_params(params); + if (str_eq(decorator, EL_STR("async"))) { + js_register_async_fn(fn_name); + if (str_eq(fn_name, EL_STR("main"))) { + js_emit_line(el_str_concat(el_str_concat(EL_STR("async function main("), params_str), EL_STR(") {"))); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("async function "), fn_name), EL_STR("(")), params_str), EL_STR(") {"))); + } + } else { + if (str_eq(fn_name, EL_STR("main"))) { + js_emit_line(el_str_concat(el_str_concat(EL_STR("function main("), params_str), EL_STR(") {"))); + } else { + js_emit_line(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("function "), fn_name), EL_STR("(")), params_str), EL_STR(") {"))); + } + } + el_val_t decl = native_list_empty(); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + decl = native_list_append(decl, pname); + pi = (pi + 1); + } + el_val_t body_xformed = body; + if (!str_eq(ret_type, EL_STR("Void"))) { + body_xformed = js_transform_implicit_return(body); + } + js_cg_stmts(body_xformed, EL_STR(" "), decl); + js_emit_line(EL_STR("}")); + js_emit_blank(); + return 0; +} + +el_val_t js_is_fndef(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t js_is_top_level_decl(el_val_t stmt) { + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("TypeDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("EnumDef"))) { + return 1; + } + if (str_eq(kind, EL_STR("Import"))) { + return 1; + } + if (str_eq(kind, EL_STR("CgiBlock"))) { + return 1; + } + if (str_eq(kind, EL_STR("ServiceBlock"))) { + return 1; + } + if (str_eq(kind, EL_STR("ExternFn"))) { + return 1; + } + return 0; + return 0; +} + +el_val_t codegen_js(el_val_t stmts, el_val_t source) { + return codegen_js_inner(stmts, source, 0, EL_STR("")); + return 0; +} + +el_val_t codegen_js_bundle(el_val_t stmts, el_val_t source, el_val_t runtime_content) { + return codegen_js_inner(stmts, source, 1, runtime_content); + return 0; +} + +el_val_t codegen_js_inner(el_val_t stmts, el_val_t source, el_val_t bundle_mode, el_val_t runtime_content) { + state_set(EL_STR("__js_int_names"), EL_STR("")); + state_set(EL_STR("__js_match_counter"), EL_STR("")); + state_set(EL_STR("__js_async_fns"), EL_STR("")); + state_set(EL_STR("__js_lambda_counter"), EL_STR("")); + js_emit_line(EL_STR("// Generated by elc --target=js")); + if (bundle_mode) { + js_emit_line(EL_STR("// Bundle mode: runtime inlined, no import statement needed.")); + js_emit_line(EL_STR("")); + js_emit_line(EL_STR(";(function() {")); + js_emit_line(EL_STR("\"use strict\";")); + js_emit_line(js_strip_es_exports(runtime_content)); + js_emit_line(EL_STR("")); + } else { + js_emit_line(EL_STR("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js")); + js_emit_line(EL_STR("import \"./el_runtime.js\";")); + } + if (!bundle_mode) { + js_emit_line(EL_STR("const {")); + js_emit_line(EL_STR(" println, print, el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with,")); + js_emit_line(EL_STR(" str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace,")); + js_emit_line(EL_STR(" str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at,")); + js_emit_line(EL_STR(" str_char_code, str_lower, str_upper, el_abs, el_max, el_min,")); + js_emit_line(EL_STR(" el_list_new, el_list_len, el_list_get, el_list_append, el_list_empty, el_list_clone,")); + js_emit_line(EL_STR(" list_push, list_join, list_range,")); + js_emit_line(EL_STR(" el_map_new, el_get_field, el_map_get, el_map_set,")); + js_emit_line(EL_STR(" http_get, http_post, http_post_json,")); + js_emit_line(EL_STR(" fs_read, fs_write, fs_list,")); + js_emit_line(EL_STR(" json_parse, json_stringify, json_get, json_get_string, json_get_int,")); + js_emit_line(EL_STR(" time_now, time_now_utc, sleep_ms, bool_to_str, exit_program,")); + js_emit_line(EL_STR(" el_retain, el_release,")); + js_emit_line(EL_STR(" append, len, get, map_get, map_set,")); + js_emit_line(EL_STR(" native_list_get, native_list_len, native_list_append, native_list_empty,")); + js_emit_line(EL_STR(" native_list_clone, native_string_chars, native_int_to_str,")); + js_emit_line(EL_STR(" args, state_set, state_get, state_del, state_keys, env,")); + js_emit_line(EL_STR(" dharma_connect, dharma_send, dharma_emit, dharma_field, dharma_activate,")); + js_emit_line(EL_STR(" engram_node, engram_search, engram_activate,")); + js_emit_line(EL_STR(" llm_call, llm_call_system,")); + js_emit_line(EL_STR(" dom_get_element, dom_get_value, dom_set_value, dom_get_text, dom_set_text,")); + js_emit_line(EL_STR(" dom_set_prop, dom_get_prop, dom_set_style, dom_add_class, dom_remove_class,")); + js_emit_line(EL_STR(" dom_show, dom_hide, dom_listen, dom_query, dom_query_all, dom_create,")); + js_emit_line(EL_STR(" dom_append, dom_remove, dom_is_null,")); + js_emit_line(EL_STR(" dom_set_attr, dom_get_attr, dom_remove_attr, dom_set_html, dom_get_html,")); + js_emit_line(EL_STR(" dom_get_parent, dom_contains_class, dom_get_checked, dom_set_checked,")); + js_emit_line(EL_STR(" set_timeout, set_interval, clear_interval,")); + js_emit_line(EL_STR(" local_storage_get, local_storage_set, local_storage_remove,")); + js_emit_line(EL_STR(" window_location, window_redirect, window_on_load,")); + js_emit_line(EL_STR(" console_log,")); + js_emit_line(EL_STR(" window_set, window_get, native_js, native_js_call,")); + js_emit_line(EL_STR(" promise_then, promise_catch, promise_resolve, promise_reject,")); + js_emit_line(EL_STR(" object_assign, object_keys, object_values, json_deep_clone,")); + js_emit_line(EL_STR(" array_from, type_of, instanceof_check,")); + js_emit_line(EL_STR("} = globalThis.__el;")); + js_emit_blank(); + } + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("Import"))) { + el_val_t ipath = el_get_field(stmt, EL_STR("path")); + el_val_t is_url = str_starts_with(ipath, EL_STR("http://")); + is_url = (is_url || str_starts_with(ipath, EL_STR("https://"))); + el_val_t is_js = !str_ends_with(ipath, EL_STR(".el")); + if (is_url || is_js) { + if (bundle_mode) { + js_emit_line(el_str_concat(EL_STR("// external: "), ipath)); + } else { + js_emit_line(el_str_concat(el_str_concat(EL_STR("import "), js_str_lit(ipath)), EL_STR(";"))); + } + } + } + i = (i + 1); + } + js_emit_blank(); + n = native_list_len(stmts); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t dec = el_get_field(stmt, EL_STR("decorator")); + if (str_eq(dec, EL_STR("async"))) { + el_val_t aname = el_get_field(stmt, EL_STR("name")); + js_register_async_fn(aname); + } + } + i = (i + 1); + } + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + js_cg_fn(stmt); + } + i = (i + 1); + } + el_val_t has_main = 0; + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t sk = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(sk, EL_STR("FnDef"))) { + el_val_t fn_name = el_get_field(stmt, EL_STR("name")); + if (str_eq(fn_name, EL_STR("main"))) { + has_main = 1; + } + } + i = (i + 1); + } + el_val_t main_decl = native_list_empty(); + i = 0; + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + if (js_is_fndef(stmt)) { + } else { + if (js_is_top_level_decl(stmt)) { + } else { + main_decl = js_cg_stmt(stmt, EL_STR(""), main_decl); + } + } + i = (i + 1); + } + if (has_main) { + js_emit_blank(); + js_emit_line(EL_STR("main();")); + } + if (bundle_mode) { + js_emit_line(EL_STR("")); + js_emit_line(EL_STR("})();")); + } + return EL_STR(""); + return 0; +} + +el_val_t js_strip_es_exports(el_val_t content) { + el_val_t lines = str_split(content, EL_STR("\n")); + el_val_t n = native_list_len(lines); + el_val_t out = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t line = native_list_get(lines, i); + el_val_t trimmed = str_trim(line); + if (str_starts_with(trimmed, EL_STR("export {"))) { + i = n; + } else { + if (str_starts_with(trimmed, EL_STR("export default"))) { + i = n; + } else { + out = native_list_append(out, line); + } + } + i = (i + 1); + } + return str_join(out, EL_STR("\n")); + return 0; +} + +el_val_t compile(el_val_t source) { + el_val_t top_mark = el_arena_push(); + el_val_t tokens = lex(source); + el_val_t sigs = scan_fn_sigs(tokens); + codegen_streaming(tokens, sigs, source); + el_arena_pop(top_mark); + return EL_STR(""); + return 0; +} + +el_val_t compile_test(el_val_t source) { + state_set(EL_STR("__test_mode"), EL_STR("1")); + el_val_t top_mark = el_arena_push(); + el_val_t tokens = lex(source); + el_val_t sigs = scan_fn_sigs(tokens); + codegen_streaming(tokens, sigs, source); + el_arena_pop(top_mark); + state_set(EL_STR("__test_mode"), EL_STR("")); + return EL_STR(""); + return 0; +} + +el_val_t compile_js(el_val_t source) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + return codegen_js(stmts, source); + return 0; +} + +el_val_t compile_js_with_bundle(el_val_t source, el_val_t runtime_path) { + el_val_t tokens = lex(source); + el_val_t stmts = parse(tokens); + el_release(tokens); + el_val_t runtime_content = fs_read(runtime_path); + if (str_eq(runtime_content, EL_STR(""))) { + println(el_str_concat(EL_STR("el-compiler: warning: --bundle: could not read runtime at "), runtime_path)); + println(EL_STR("el-compiler: warning: bundle output will be incomplete")); + } + return codegen_js_bundle(stmts, source, runtime_content); + return 0; +} + +el_val_t compile_dispatch(el_val_t tgt, el_val_t source) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js(source); + } + return compile(source); + return 0; +} + +el_val_t compile_dispatch_bundle(el_val_t tgt, el_val_t source, el_val_t runtime_path) { + if (str_eq(tgt, EL_STR("js"))) { + return compile_js_with_bundle(source, runtime_path); + } + return compile(source); + return 0; +} + +el_val_t detect_target(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_starts_with(a, EL_STR("--target="))) { + el_val_t v = str_slice(a, 9, str_len(a)); + return v; + } + i = (i + 1); + } + return EL_STR("c"); + return 0; +} + +el_val_t strip_flags(el_val_t argv) { + el_val_t out = native_list_empty(); + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (!str_starts_with(a, EL_STR("--"))) { + out = native_list_append(out, a); + } + i = (i + 1); + } + return out; + return 0; +} + +el_val_t detect_emit_header(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_eq(a, EL_STR("--emit-header"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_bundle(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_eq(a, EL_STR("--bundle"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_minify(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_eq(a, EL_STR("--minify"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_obfuscate(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_eq(a, EL_STR("--obfuscate"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t detect_test(el_val_t argv) { + el_val_t n = native_list_len(argv); + el_val_t i = 0; + while (i < n) { + el_val_t a = native_list_get(argv, i); + if (str_eq(a, EL_STR("--test"))) { + return 1; + } + i = (i + 1); + } + return 0; + return 0; +} + +el_val_t make_temp_path(el_val_t suffix) { + el_val_t pid = getpid_now(); + el_val_t ts = time_now(); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("/tmp/elc-"), native_int_to_str(pid)), EL_STR("-")), native_int_to_str(ts)), EL_STR(".")), suffix); + return 0; +} + +el_val_t js_reserved_names(void) { + return EL_STR("neuronDemoToggle,neuronDemoSend,neuronDemoReset,signInWith,signInWithEmail,signUpWithEmail,sendMagicLink,signOut,resetPassword,sendResetEmail,updatePassword,showSignIn,showSignUp,hideReset,setSort,addFamilyMember,removeFamilyMember,copyForPlatform,entHeadcountChange,NEURON_CFG"); + return 0; +} + +el_val_t find_node_tool(el_val_t tool_name, el_val_t src_dir) { + el_val_t cand1 = el_str_concat(el_str_concat(src_dir, EL_STR("/node_modules/.bin/")), tool_name); + el_val_t check1 = str_trim(exec_capture(el_str_concat(el_str_concat(EL_STR("test -x "), cand1), EL_STR(" && echo yes 2>/dev/null")))); + if (str_eq(check1, EL_STR("yes"))) { + return cand1; + } + el_val_t parent_dir = dirname_of(src_dir); + el_val_t cand2 = el_str_concat(el_str_concat(parent_dir, EL_STR("/node_modules/.bin/")), tool_name); + el_val_t check2 = str_trim(exec_capture(el_str_concat(el_str_concat(EL_STR("test -x "), cand2), EL_STR(" && echo yes 2>/dev/null")))); + if (str_eq(check2, EL_STR("yes"))) { + return cand2; + } + el_val_t npx_path = str_trim(exec_capture(EL_STR("which npx 2>/dev/null"))); + if (!str_eq(npx_path, EL_STR(""))) { + return el_str_concat(EL_STR("npx --yes "), tool_name); + } + return EL_STR(""); + return 0; +} + +el_val_t apply_minify(el_val_t js_path, el_val_t out_path, el_val_t src_dir) { + el_val_t terser = find_node_tool(EL_STR("terser"), src_dir); + if (str_eq(terser, EL_STR(""))) { + println(EL_STR("el-compiler: error: terser not found. Run 'npm install terser' in your project directory.")); + return 0; + } + el_val_t names = js_reserved_names(); + el_val_t compress_opts = EL_STR("passes=2,drop_console=false,drop_debugger=true"); + el_val_t mangle_reserved = el_str_concat(el_str_concat(EL_STR("'reserved=["), names), EL_STR("]'")); + el_val_t cmd = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(terser, EL_STR(" ")), js_path), EL_STR(" --compress ")), compress_opts), EL_STR(" --mangle ")), mangle_reserved), EL_STR(" --output ")), out_path); + el_val_t ret = exec_command(cmd); + if (ret == 0) { + return 1; + } + println(el_str_concat(el_str_concat(EL_STR("el-compiler: error: terser failed (exit "), native_int_to_str(ret)), EL_STR(")"))); + return 0; + return 0; +} + +el_val_t apply_obfuscate(el_val_t js_path, el_val_t out_path, el_val_t src_dir) { + el_val_t obfuscator = find_node_tool(EL_STR("javascript-obfuscator"), src_dir); + if (str_eq(obfuscator, EL_STR(""))) { + println(EL_STR("el-compiler: error: javascript-obfuscator not found. Run 'npm install javascript-obfuscator' in your project directory.")); + return 0; + } + el_val_t names = js_reserved_names(); + el_val_t cmd = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(obfuscator, EL_STR(" ")), js_path), EL_STR(" --output ")), out_path), EL_STR(" --compact true --simplify true --string-array true --string-array-encoding base64 --string-array-threshold 0.75 --identifier-names-generator hexadecimal --rename-globals false --self-defending false --reserved-names ")), names); + el_val_t ret = exec_command(cmd); + if (ret == 0) { + return 1; + } + println(el_str_concat(el_str_concat(EL_STR("el-compiler: error: javascript-obfuscator failed (exit "), native_int_to_str(ret)), EL_STR(")"))); + return 0; + return 0; +} + +el_val_t resolve_runtime_path(el_val_t src_path) { + el_val_t src_dir = dirname_of(src_path); + el_val_t candidate = el_str_concat(src_dir, EL_STR("/el_runtime.js")); + el_val_t existing = fs_read(candidate); + if (!str_eq(existing, EL_STR(""))) { + return candidate; + } + return EL_STR(""); + return 0; +} + +el_val_t type_node_to_el(el_val_t t) { + el_val_t k = el_get_field(t, EL_STR("kind")); + if (str_eq(k, EL_STR("Simple"))) { + return el_get_field(t, EL_STR("name")); + } + if (str_eq(k, EL_STR("List"))) { + el_val_t inner = type_node_to_el(el_get_field(t, EL_STR("inner"))); + return el_str_concat(el_str_concat(EL_STR("["), inner), EL_STR("]")); + } + if (str_eq(k, EL_STR("Map"))) { + el_val_t kt = type_node_to_el(el_get_field(t, EL_STR("key"))); + el_val_t vt = type_node_to_el(el_get_field(t, EL_STR("val"))); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("Map<"), kt), EL_STR(", ")), vt), EL_STR(">")); + } + return EL_STR("Any"); + return 0; +} + +/* ── emit_header_from_tokens ───────────────────────────────────────────────── + * Token-based header emitter. Scans the token stream for `fn` definitions + * using brace-depth counting (same strategy as scan_fn_sigs) so large + * HTML-template functions like page_open() don't cause the parser to consume + * subsequent function definitions. + * + * Replaces the parse()-based emit_header for the --emit-header code path. + */ +el_val_t emit_header_from_tokens(el_val_t tokens, el_val_t hdr_path) { + el_val_t total = (native_list_len(tokens) / 2); + el_val_t pos = 0; + el_val_t parts = native_list_empty(); + parts = native_list_append(parts, EL_STR("// auto-generated by elc --emit-header \xe2\x80\x94 do not edit\n")); + while (pos < total) { + el_val_t k = tok_kind(tokens, pos); + if (str_eq(k, EL_STR("Eof"))) { + pos = total; + } else { + if (str_eq(k, EL_STR("Fn"))) { + el_val_t p = (pos + 1); + el_val_t name = tok_value(tokens, p); + p = (p + 1); + /* Scan El-format params: collect "name: Type" pairs */ + el_val_t param_parts = native_list_empty(); + p = expect(tokens, p, EL_STR("LParen")); + el_val_t going = 1; + while (going) { + el_val_t pk = tok_kind(tokens, p); + if (str_eq(pk, EL_STR("RParen"))) { + going = 0; + } else { + if (str_eq(pk, EL_STR("Eof"))) { + going = 0; + } else { + el_val_t pname = tok_value(tokens, p); + p = (p + 1); + p = expect(tokens, p, EL_STR("Colon")); + el_val_t type_name = EL_STR("Any"); + el_val_t type_k = tok_kind(tokens, p); + if (str_eq(type_k, EL_STR("Ident"))) { + type_name = tok_value(tokens, p); + } + p = skip_type(tokens, p); + param_parts = native_list_append(param_parts, el_str_concat(el_str_concat(pname, EL_STR(": ")), type_name)); + el_val_t ck = tok_kind(tokens, p); + if (str_eq(ck, EL_STR("Comma"))) { + p = (p + 1); + } + } + } + } + p = expect(tokens, p, EL_STR("RParen")); + el_val_t params_el = str_join(param_parts, EL_STR(", ")); + el_release(param_parts); + /* Capture return type */ + el_val_t ret_str = EL_STR("Any"); + el_val_t rk = tok_kind(tokens, p); + if (str_eq(rk, EL_STR("Arrow"))) { + p = (p + 1); + el_val_t rtk = tok_kind(tokens, p); + if (str_eq(rtk, EL_STR("Ident"))) { + ret_str = tok_value(tokens, p); + } + p = skip_type(tokens, p); + } + /* Skip function body using brace depth (same as scan_fn_sigs) */ + el_val_t bk = tok_kind(tokens, p); + if (str_eq(bk, EL_STR("LBrace"))) { + p = skip_to_rbrace(tokens, p); + } + if (!str_eq(name, EL_STR("main"))) { + el_val_t sig = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("extern fn "), name), EL_STR("(")), params_el), EL_STR(") -> ")), ret_str); + parts = native_list_append(parts, el_str_concat(sig, EL_STR("\n"))); + } + pos = p; + } else { + pos = (pos + 1); + } + } + } + el_val_t content = str_join(parts, EL_STR("")); + el_release(parts); + el_val_t ok = fs_write(hdr_path, content); + return 0; +} + +el_val_t emit_header(el_val_t stmts, el_val_t hdr_path) { + el_val_t n = native_list_len(stmts); + el_val_t i = 0; + el_val_t parts = native_list_empty(); + parts = native_list_append(parts, EL_STR("// auto-generated by elc --emit-header \xe2\x80\x94 do not edit\n")); + while (i < n) { + el_val_t stmt = native_list_get(stmts, i); + el_val_t kind = el_get_field(stmt, EL_STR("stmt")); + if (str_eq(kind, EL_STR("FnDef"))) { + el_val_t name = el_get_field(stmt, EL_STR("name")); + if (!str_eq(name, EL_STR("main"))) { + el_val_t params = el_get_field(stmt, EL_STR("params")); + el_val_t ret_type = el_get_field(stmt, EL_STR("ret_type")); + el_val_t np = native_list_len(params); + el_val_t pi = 0; + el_val_t param_parts = native_list_empty(); + while (pi < np) { + el_val_t param = native_list_get(params, pi); + el_val_t pname = el_get_field(param, EL_STR("name")); + el_val_t ptype = el_get_field(param, EL_STR("type")); + if (str_eq(ptype, EL_STR(""))) { + ptype = EL_STR("Any"); + } + param_parts = native_list_append(param_parts, el_str_concat(el_str_concat(pname, EL_STR(": ")), ptype)); + pi = (pi + 1); + } + el_val_t params_str = str_join(param_parts, EL_STR(", ")); + el_val_t ret_str = ret_type; + if (str_eq(ret_str, EL_STR(""))) { + ret_str = EL_STR("Any"); + } + el_val_t sig = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("extern fn "), name), EL_STR("(")), params_str), EL_STR(") -> ")), ret_str); + parts = native_list_append(parts, el_str_concat(sig, EL_STR("\n"))); + } + } + i = (i + 1); + } + el_val_t content = str_join(parts, EL_STR("")); + el_val_t ok = fs_write(hdr_path, content); + return 0; +} + +el_val_t dirname_of(el_val_t path) { + el_val_t n = str_len(path); + el_val_t i = (n - 1); + while (i >= 0) { + el_val_t c = str_slice(path, i, (i + 1)); + if (str_eq(c, EL_STR("/"))) { + return str_slice(path, 0, i); + } + i = (i - 1); + } + return EL_STR("."); + return 0; +} + +el_val_t parse_import_line(el_val_t trimmed, el_val_t dir) { + if (str_starts_with(trimmed, EL_STR("import \""))) { + el_val_t after = str_slice(trimmed, 8, str_len(trimmed)); + el_val_t q = str_index_of(after, EL_STR("\"")); + if (q > 0) { + el_val_t mod = str_slice(after, 0, q); + return el_str_concat(el_str_concat(dir, EL_STR("/")), mod); + } + } + if (str_starts_with(trimmed, EL_STR("from "))) { + el_val_t after = str_slice(trimmed, 5, str_len(trimmed)); + el_val_t sp = str_index_of(after, EL_STR(" ")); + if (sp > 0) { + el_val_t mod_raw = str_slice(after, 0, sp); + el_val_t mod = str_trim(mod_raw); + if (!str_eq(mod, EL_STR(""))) { + return el_str_concat(el_str_concat(el_str_concat(dir, EL_STR("/")), mod), EL_STR(".el")); + } + } + } + return EL_STR(""); + return 0; +} + +el_val_t resolve_imports(el_val_t src_path) { + el_val_t seen_key = el_str_concat(EL_STR("__elc_imp__:"), src_path); + el_val_t already = state_get(seen_key); + if (!str_eq(already, EL_STR(""))) { + return EL_STR(""); + } + state_set(seen_key, EL_STR("1")); + el_val_t source = fs_read(src_path); + el_val_t dir = dirname_of(src_path); + el_val_t lines = str_split(source, EL_STR("\n")); + el_val_t n = native_list_len(lines); + el_val_t prefix_chunks = native_list_empty(); + el_val_t body_chunks = native_list_empty(); + el_val_t i = 0; + while (i < n) { + el_val_t line = native_list_get(lines, i); + el_val_t trimmed = str_trim(line); + el_val_t imp_path = parse_import_line(trimmed, dir); + if (!str_eq(imp_path, EL_STR(""))) { + el_val_t imp_elh_path = el_str_concat(str_slice(imp_path, 0, (str_len(imp_path) - 3)), EL_STR(".elh")); + el_val_t imp_elh = fs_read(imp_elh_path); + if (!str_eq(imp_elh, EL_STR(""))) { + el_val_t seen_imp_key = el_str_concat(EL_STR("__elc_imp__:"), imp_path); + state_set(seen_imp_key, EL_STR("1")); + prefix_chunks = native_list_append(prefix_chunks, imp_elh); + } else { + el_val_t imp_body = resolve_imports(imp_path); + prefix_chunks = native_list_append(prefix_chunks, imp_body); + } + } else { + body_chunks = native_list_append(body_chunks, el_str_concat(line, EL_STR("\n"))); + } + i = (i + 1); + } + return el_str_concat(str_join(prefix_chunks, EL_STR("")), str_join(body_chunks, EL_STR(""))); + return 0; +} + +el_val_t run_with_postprocess(el_val_t tgt, el_val_t source, el_val_t src_path, el_val_t do_bundle, el_val_t do_obfuscate, el_val_t argc, el_val_t positional) { + el_val_t src_dir = dirname_of(src_path); + el_val_t tmp_gen = make_temp_path(EL_STR("js")); + el_val_t tmp_min = make_temp_path(EL_STR("min.js")); + stdout_to_file(tmp_gen); + if (do_bundle) { + el_val_t runtime_path = resolve_runtime_path(src_path); + compile_dispatch_bundle(tgt, source, runtime_path); + } else { + compile_dispatch(tgt, source); + } + stdout_restore(); + el_val_t ok_min = apply_minify(tmp_gen, tmp_min, src_dir); + if (!ok_min) { + exec_command(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min)); + exit(1); + } + state_set(EL_STR("__elc_final_js"), tmp_min); + if (do_obfuscate) { + el_val_t tmp_obf = make_temp_path(EL_STR("obf.js")); + el_val_t ok_obf = apply_obfuscate(tmp_min, tmp_obf, src_dir); + if (!ok_obf) { + exec_command(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min), EL_STR(" ")), tmp_obf)); + exit(1); + } + state_set(EL_STR("__elc_final_js"), tmp_obf); + } + el_val_t final_path = state_get(EL_STR("__elc_final_js")); + el_val_t final_js = fs_read(final_path); + exec_command(el_str_concat(el_str_concat(el_str_concat(EL_STR("rm -f "), tmp_gen), EL_STR(" ")), tmp_min)); + if (do_obfuscate) { + exec_command(el_str_concat(EL_STR("rm -f "), final_path)); + } + if (argc >= 2) { + el_val_t out_path = native_list_get(positional, 1); + el_val_t ok = fs_write(out_path, final_js); + if (ok) { + return 0; + } else { + println(EL_STR("el-compiler: failed to write output")); + exit(1); + } + } + print(final_js); + return 0; +} + +int main(int _argc, char** _argv) { + el_runtime_init_args(_argc, _argv); + el_val_t argv = args(); + el_val_t tgt = detect_target(argv); + el_val_t do_emit_header = detect_emit_header(argv); + el_val_t do_bundle = detect_bundle(argv); + el_val_t do_minify = detect_minify(argv); + el_val_t do_obfuscate = detect_obfuscate(argv); + el_val_t do_test = detect_test(argv); + if (do_obfuscate) { + do_minify = 1; + } + el_val_t positional = strip_flags(argv); + el_val_t argc = native_list_len(positional); + if (argc < 1) { + println(EL_STR("el-compiler: usage: elc [--target=c|js] [--bundle] [--minify] [--obfuscate] [--emit-header] [--test] []")); + exit(1); + } + if (do_minify) { + if (!str_eq(tgt, EL_STR("js"))) { + println(EL_STR("el-compiler: error: --minify and --obfuscate require --target=js")); + exit(1); + } + } + el_val_t src_path = native_list_get(positional, 0); + if (do_emit_header) { + el_val_t raw_source = fs_read(src_path); + el_val_t hdr_tokens = lex(raw_source); + el_val_t hdr_path = el_str_concat(str_slice(src_path, 0, (str_len(src_path) - 3)), EL_STR(".elh")); + emit_header_from_tokens(hdr_tokens, hdr_path); + el_release(hdr_tokens); + } + el_val_t source = resolve_imports(src_path); + if (do_minify) { + run_with_postprocess(tgt, source, src_path, do_bundle, do_obfuscate, argc, positional); + exit(0); + } + if (do_test) { + compile_test(source); + exit(0); + } + el_val_t out = EL_STR(""); + if (do_bundle) { + el_val_t runtime_path = resolve_runtime_path(src_path); + out = compile_dispatch_bundle(tgt, source, runtime_path); + } else { + out = compile_dispatch(tgt, source); + } + if (argc >= 2) { + el_val_t out_path = native_list_get(positional, 1); + el_val_t ok = fs_write(out_path, out); + if (ok) { + exit(0); + } else { + println(EL_STR("el-compiler: failed to write output")); + exit(1); + } + } + return 0; +} +