From 1f4b594ae7bf4515a6bd24b9e1b61e1f9f9379b7 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 7 May 2026 17:58:23 -0500 Subject: [PATCH 1/2] feat(elb): c_source manifest directive + macOS OpenSSL path detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `c_source "path"` in manifest.el build block — lets packages link extra C files (platform stubs, native glue) without touching elb source. On macOS, homebrew OpenSSL isn't on the default linker path. Detect it via `brew --prefix` and inject -L/-I flags; no-op on Linux. Rebuild elb binary; remove elc-new binary (elc is now canonical). --- lang/dist/platform/elb | Bin 325792 -> 212312 bytes lang/dist/platform/elc-new | Bin 319032 -> 0 bytes lang/elb.el | 45 +++++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) delete mode 100755 lang/dist/platform/elc-new diff --git a/lang/dist/platform/elb b/lang/dist/platform/elb index 2df99e2087db0ba98af36a7084e685d151e0abb2..a397f4bd678d9d970a41eb1aae5056b70567e1f1 100755 GIT binary patch delta 78319 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%0ACHXb#syz|7-)?cIzOXiM-5GnVD-^X86u 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 BY2g3> diff --git a/lang/dist/platform/elc-new b/lang/dist/platform/elc-new deleted file mode 100755 index f1cba6543f94e7f8d0b9591dee691e26a3f89d54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319032 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

aa80dF7{krtF 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 X-kg2on>XSg9J2e(G2_mV)Q|Q*vWdAl diff --git a/lang/elb.el b/lang/elb.el index 9dcd731..21a0676 100644 --- a/lang/elb.el +++ b/lang/elb.el @@ -77,6 +77,33 @@ fn parse_manifest_entry(src: String) -> String { return "" } +// parse_manifest_c_sources - collect all `c_source "path"` lines from the +// build block. Returns a flat list of path strings. +fn parse_manifest_c_sources(src: String) -> [String] { + let result: [String] = native_list_empty() + let lines: [String] = str_split(src, "\n") + let n: Int = native_list_len(lines) + let i = 0 + while i < n { + let line: String = native_list_get(lines, i) + let t: String = str_trim(line) + if str_starts_with(t, "c_source ") { + let after: String = str_slice(t, 9, str_len(t)) + let trimmed: String = str_trim(after) + if str_starts_with(trimmed, "\"") { + let inner: String = str_slice(trimmed, 1, str_len(trimmed)) + let q: Int = str_index_of(inner, "\"") + if q >= 0 { + let path: String = str_slice(inner, 0, q) + let result = native_list_append(result, path) + } + } + } + let i = i + 1 + } + return result +} + fn parse_manifest_name(src: String) -> String { let lines: [String] = str_split(src, "\n") let n: Int = native_list_len(lines) @@ -274,7 +301,11 @@ fn link_binary(c_files: [String], out_bin: String, runtime_path: String, out_dir // Detect clang vs gcc: -fbracket-depth is clang-only; silently ignored // if unsupported but gcc rejects it with an error. let bracket_flag: String = "$(cc --version 2>&1 | grep -q clang && printf -- '-fbracket-depth=1024' || true)" - let parts = native_list_append(parts, "cc -O2 " + bracket_flag + " -I " + dirname_of(runtime_path) + " -I " + out_dir) + // On macOS, OpenSSL is not on the default linker path. Detect homebrew + // prefix and add it if present (no-op on Linux where libssl is in /usr/lib). + let ossl_lib_flag: String = "$(brew --prefix openssl 2>/dev/null | xargs -I{} printf -- '-L{}/lib' 2>/dev/null || true)" + let ossl_inc_flag: String = "$(brew --prefix openssl 2>/dev/null | xargs -I{} printf -- '-I{}/include' 2>/dev/null || true)" + let parts = native_list_append(parts, "cc -O2 " + bracket_flag + " " + ossl_inc_flag + " -I " + dirname_of(runtime_path) + " -I " + out_dir) let i = 0 while i < n { let f: String = native_list_get(c_files, i) @@ -282,7 +313,7 @@ fn link_binary(c_files: [String], out_bin: String, runtime_path: String, out_dir let i = i + 1 } let parts = native_list_append(parts, runtime_path) - let parts = native_list_append(parts, "-lcurl -lssl -lcrypto -lpthread -lm") + let parts = native_list_append(parts, ossl_lib_flag + " -lcurl -lssl -lcrypto -lpthread -lm") let parts = native_list_append(parts, "-o " + out_bin) let cmd: String = str_join(parts, " ") println(" link " + out_bin) @@ -315,6 +346,7 @@ fn main() -> Void { let pkg_name: String = parse_manifest_name(manifest_src) let entry: String = parse_manifest_entry(manifest_src) + let extra_c: [String] = parse_manifest_c_sources(manifest_src) if str_eq(entry, "") { println("elb: manifest.el has no 'entry' declaration") exit(1) @@ -393,6 +425,15 @@ fn main() -> Void { exit(1) } + // Append any extra C sources declared in the manifest (e.g. platform stubs) + let ei = 0 + let en: Int = native_list_len(extra_c) + while ei < en { + let ec: String = native_list_get(extra_c, ei) + let c_files = native_list_append(c_files, ec) + let ei = ei + 1 + } + // Link let out_bin: String = out_dir + "/" + pkg_name let linked: Bool = link_binary(c_files, out_bin, runtime_path, out_dir, dry_run) -- 2.52.0 From a7e6fbf2d2a0e32be85c96e387627ae7a4dc19ea Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Thu, 7 May 2026 17:58:29 -0500 Subject: [PATCH 2/2] 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/el-compiler/runtime/el_runtime.c | 37 + lang/el-compiler/runtime/el_runtime.h | 2 + lang/elc.c | 10062 ++++++++++++++++++++++++ 3 files changed, 10101 insertions(+) create mode 100644 lang/elc.c diff --git a/lang/el-compiler/runtime/el_runtime.c b/lang/el-compiler/runtime/el_runtime.c index 982441a..9697867 100644 --- a/lang/el-compiler/runtime/el_runtime.c +++ b/lang/el-compiler/runtime/el_runtime.c @@ -2242,6 +2242,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 211c923..2f9583f 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; +} + -- 2.52.0