From dcc0bf550a19c1862d7004837d7167984481bf83 Mon Sep 17 00:00:00 2001 From: Will Anderson Date: Sat, 27 Jun 2026 11:46:30 -0500 Subject: [PATCH] Add Ollama provider, portable memory, cultivation digest, refugee importer, GLM-OCR spike MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - P0: unified soul binary with engram_node_full fix, read-back-verify, search fix - P0: move API keys from plaintext plists to macOS Keychain - P0: fix MCP backend URL (port 8742 → 7770) - P1.6: memory-export/import scripts (AES-256-CBC, versioned .neuronmem format) - P1.7: nightly cultivation digest with sharpness metric (launchd at 23:55) - P2.10: Ollama provider in agentic loop (SOUL_LLM_PROVIDER=ollama) - P3.12: refugee importer for ChatGPT/Screenpipe/generic formats - P3.13: GLM-OCR spike — SHIP IT (mlx-vlm, 1.59GB, photo-to-memory.sh) --- dist/chat.c | 3 +- dist/elp.c | 24062 +------------------------------ dist/elp.elh | 6 +- dist/grammar.c | 5 - dist/grammar.elh | 56 +- dist/language-profile.c | 5 - dist/memory.c | 26 +- dist/neuron-api.c | 2 +- dist/realizer.c | 9 +- dist/realizer.elh | 10 +- dist/semantics.c | 5 - dist/semantics.elh | 30 +- dist/soul.c | 142 +- dist/vocabulary.c | 5 - docs/research/glm-ocr-spike.md | 110 + memory.el | 27 +- neuron-api.el | 4 +- tools/cultivation-digest.sh | 221 + tools/memory-export.sh | 162 + tools/memory-import-refugee.sh | 427 + tools/memory-import.sh | 289 + tools/photo-to-memory.sh | 135 + 22 files changed, 1623 insertions(+), 24118 deletions(-) create mode 100644 docs/research/glm-ocr-spike.md create mode 100755 tools/cultivation-digest.sh create mode 100755 tools/memory-export.sh create mode 100755 tools/memory-import-refugee.sh create mode 100755 tools/memory-import.sh create mode 100755 tools/photo-to-memory.sh diff --git a/dist/chat.c b/dist/chat.c index bf64d69..6efcb26 100644 --- a/dist/chat.c +++ b/dist/chat.c @@ -679,8 +679,7 @@ el_val_t handle_chat(el_val_t body) { el_val_t thread_snip = ({ el_val_t _if_result_112 = 0; if ((str_len(last_content) > 250)) { _if_result_112 = (str_slice(last_content, 0, 250)); } else { _if_result_112 = (last_content); } _if_result_112; }); el_val_t activation_seed = ({ el_val_t _if_result_113 = 0; if (!str_eq(thread_snip, EL_STR(""))) { _if_result_113 = (el_str_concat(el_str_concat(thread_snip, EL_STR(" ")), message)); } else { _if_result_113 = (message); } _if_result_113; }); el_val_t affective_prefix = EL_NULL; - EL_NULL; - Int = time_now(); + el_val_t aff_now_ts = time_now(); el_val_t aff_cutoff = (aff_now_ts - 259200); el_val_t boot_aff = state_get(EL_STR("soul_affective_context")); el_val_t has_boot_aff = !str_eq(boot_aff, EL_STR("")); diff --git a/dist/elp.c b/dist/elp.c index 6edb34d..ee01cea 100644 --- a/dist/elp.c +++ b/dist/elp.c @@ -66,6 +66,32 @@ el_val_t entry_found(el_val_t entry); el_val_t entry_word(el_val_t entry); el_val_t entry_pos(el_val_t entry); el_val_t entry_form(el_val_t entry, el_val_t n); +el_val_t str_ends(el_val_t s, el_val_t suf); +el_val_t str_last_char(el_val_t s); +el_val_t str_last2(el_val_t s); +el_val_t str_last3(el_val_t s); +el_val_t str_drop_last(el_val_t s, el_val_t n); +el_val_t is_vowel(el_val_t c); +el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix); +el_val_t en_irregular_plural(el_val_t word); +el_val_t en_irregular_singular(el_val_t word); +el_val_t en_irregular_verb(el_val_t base); +el_val_t en_verb_3sg(el_val_t base); +el_val_t en_should_double_final(el_val_t base); +el_val_t en_verb_past(el_val_t base); +el_val_t en_verb_gerund(el_val_t base); +el_val_t en_pluralize_regular(el_val_t singular); +el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); +el_val_t agree_determiner(el_val_t det, el_val_t noun); +el_val_t morph_pluralize(el_val_t noun, el_val_t profile); +el_val_t morph_map_canonical(el_val_t verb, el_val_t code); +el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile); +el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile); +el_val_t pluralize(el_val_t singular); +el_val_t singularize(el_val_t plural); +el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); +el_val_t irregular_plural(el_val_t word); +el_val_t irregular_singular(el_val_t word); el_val_t es_str_ends(el_val_t s, el_val_t suf); el_val_t es_str_drop_last(el_val_t s, el_val_t n); el_val_t es_str_last_char(el_val_t s); @@ -141,6 +167,14 @@ el_val_t ru_conjugate_2nd(el_val_t stem, el_val_t tense, el_val_t person, el_val el_val_t ru_irregular(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t ru_past_stem(el_val_t verb); el_val_t ru_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t gender); +el_val_t ja_verb_group(el_val_t dict_form); +el_val_t ja_ichidan_stem(el_val_t dict_form); +el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row); +el_val_t ja_conjugate(el_val_t dict_form, el_val_t form); +el_val_t ja_particle(el_val_t gram_case); +el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case); +el_val_t ja_question_particle(void); +el_val_t ja_make_question(el_val_t sentence); el_val_t fi_harmony(el_val_t word); el_val_t fi_suffix(el_val_t base, el_val_t harmony); el_val_t fi_noun_case(el_val_t stem, el_val_t gram_case, el_val_t number, el_val_t harmony); @@ -271,40 +305,6 @@ el_val_t la_decline_5(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_2er(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); -el_val_t ja_verb_group(el_val_t dict_form); -el_val_t ja_ichidan_stem(el_val_t dict_form); -el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row); -el_val_t ja_conjugate(el_val_t dict_form, el_val_t form); -el_val_t ja_particle(el_val_t gram_case); -el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case); -el_val_t ja_question_particle(void); -el_val_t ja_make_question(el_val_t sentence); -el_val_t str_ends(el_val_t s, el_val_t suf); -el_val_t str_last_char(el_val_t s); -el_val_t str_last2(el_val_t s); -el_val_t str_last3(el_val_t s); -el_val_t str_drop_last(el_val_t s, el_val_t n); -el_val_t is_vowel(el_val_t c); -el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix); -el_val_t en_irregular_plural(el_val_t word); -el_val_t en_irregular_singular(el_val_t word); -el_val_t en_irregular_verb(el_val_t base); -el_val_t en_verb_3sg(el_val_t base); -el_val_t en_should_double_final(el_val_t base); -el_val_t en_verb_past(el_val_t base); -el_val_t en_verb_gerund(el_val_t base); -el_val_t en_pluralize_regular(el_val_t singular); -el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); -el_val_t agree_determiner(el_val_t det, el_val_t noun); -el_val_t morph_pluralize(el_val_t noun, el_val_t profile); -el_val_t morph_map_canonical(el_val_t verb, el_val_t code); -el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile); -el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile); -el_val_t pluralize(el_val_t singular); -el_val_t singularize(el_val_t plural); -el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); -el_val_t irregular_plural(el_val_t word); -el_val_t irregular_singular(el_val_t word); el_val_t he_str_ends(el_val_t s, el_val_t suf); el_val_t he_str_len(el_val_t s); el_val_t he_str_drop_last(el_val_t s, el_val_t n); @@ -956,23995 +956,6 @@ el_val_t build_form_from_json(el_val_t semantic_form_json, el_val_t lang_code); el_val_t generate(el_val_t semantic_form_json); el_val_t generate_lang(el_val_t semantic_form_json, el_val_t lang_code); -el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject) { - el_val_t r = native_list_empty(); - r = native_list_append(r, EL_STR("code")); - r = native_list_append(r, code); - r = native_list_append(r, EL_STR("word_order")); - r = native_list_append(r, word_order); - r = native_list_append(r, EL_STR("morph_type")); - r = native_list_append(r, morph_type); - r = native_list_append(r, EL_STR("has_case")); - r = native_list_append(r, has_case); - r = native_list_append(r, EL_STR("has_gender")); - r = native_list_append(r, has_gender); - r = native_list_append(r, EL_STR("script_dir")); - r = native_list_append(r, script_dir); - r = native_list_append(r, EL_STR("agreement")); - r = native_list_append(r, agreement); - r = native_list_append(r, EL_STR("null_subject")); - r = native_list_append(r, null_subject); - return r; - return 0; -} - -el_val_t lang_get(el_val_t profile, el_val_t key) { - el_val_t n = native_list_len(profile); - el_val_t i = 0; - while (i < (n - 1)) { - el_val_t k = native_list_get(profile, i); - if (str_eq(k, key)) { - return native_list_get(profile, (i + 1)); - } - i = (i + 2); - } - return EL_STR(""); - return 0; -} - -el_val_t lang_profile_en(void) { - return lang_profile(EL_STR("en"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_ja(void) { - return lang_profile(EL_STR("ja"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_ar(void) { - return lang_profile(EL_STR("ar"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("rtl"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_zh(void) { - return lang_profile(EL_STR("zh"), EL_STR("SVO"), EL_STR("isolating"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("none"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_de(void) { - return lang_profile(EL_STR("de"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_es(void) { - return lang_profile(EL_STR("es"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_fi(void) { - return lang_profile(EL_STR("fi"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_sw(void) { - return lang_profile(EL_STR("sw"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("noun-class;number"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_hi(void) { - return lang_profile(EL_STR("hi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_ru(void) { - return lang_profile(EL_STR("ru"), EL_STR("free"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_fr(void) { - return lang_profile(EL_STR("fr"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_la(void) { - return lang_profile(EL_STR("la"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_he(void) { - return lang_profile(EL_STR("he"), EL_STR("SVO"), EL_STR("semitic"), EL_STR("true"), EL_STR("false"), EL_STR("rtl"), EL_STR("number;person;gender"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_sa(void) { - return lang_profile(EL_STR("sa"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_got(void) { - return lang_profile(EL_STR("got"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_non(void) { - return lang_profile(EL_STR("non"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_enm(void) { - return lang_profile(EL_STR("enm"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("false"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_pi(void) { - return lang_profile(EL_STR("pi"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_grc(void) { - return lang_profile(EL_STR("grc"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case;aspect"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_ang(void) { - return lang_profile(EL_STR("ang"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_fro(void) { - return lang_profile(EL_STR("fro"), EL_STR("SVO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_goh(void) { - return lang_profile(EL_STR("goh"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_sga(void) { - return lang_profile(EL_STR("sga"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_txb(void) { - return lang_profile(EL_STR("txb"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_peo(void) { - return lang_profile(EL_STR("peo"), EL_STR("SOV"), EL_STR("fusional"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person;case"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_akk(void) { - return lang_profile(EL_STR("akk"), EL_STR("VSO"), EL_STR("fusional"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_uga(void) { - return lang_profile(EL_STR("uga"), EL_STR("VSO"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender;case"), EL_STR("false")); - return 0; -} - -el_val_t lang_profile_egy(void) { - return lang_profile(EL_STR("egy"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_sux(void) { - return lang_profile(EL_STR("sux"), EL_STR("SOV"), EL_STR("agglutinative"), EL_STR("true"), EL_STR("false"), EL_STR("ltr"), EL_STR("number;person"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_gez(void) { - return lang_profile(EL_STR("gez"), EL_STR("SOV"), EL_STR("semitic"), EL_STR("true"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("true")); - return 0; -} - -el_val_t lang_profile_cop(void) { - return lang_profile(EL_STR("cop"), EL_STR("SVO"), EL_STR("agglutinative"), EL_STR("false"), EL_STR("true"), EL_STR("ltr"), EL_STR("number;person;gender"), EL_STR("false")); - return 0; -} - -el_val_t lang_from_code(el_val_t code) { - if (str_eq(code, EL_STR("en"))) { - return lang_profile_en(); - } - if (str_eq(code, EL_STR("ja"))) { - return lang_profile_ja(); - } - if (str_eq(code, EL_STR("ar"))) { - return lang_profile_ar(); - } - if (str_eq(code, EL_STR("zh"))) { - return lang_profile_zh(); - } - if (str_eq(code, EL_STR("de"))) { - return lang_profile_de(); - } - if (str_eq(code, EL_STR("es"))) { - return lang_profile_es(); - } - if (str_eq(code, EL_STR("fi"))) { - return lang_profile_fi(); - } - if (str_eq(code, EL_STR("sw"))) { - return lang_profile_sw(); - } - if (str_eq(code, EL_STR("hi"))) { - return lang_profile_hi(); - } - if (str_eq(code, EL_STR("ru"))) { - return lang_profile_ru(); - } - if (str_eq(code, EL_STR("fr"))) { - return lang_profile_fr(); - } - if (str_eq(code, EL_STR("la"))) { - return lang_profile_la(); - } - if (str_eq(code, EL_STR("he"))) { - return lang_profile_he(); - } - if (str_eq(code, EL_STR("grc"))) { - return lang_profile_grc(); - } - if (str_eq(code, EL_STR("ang"))) { - return lang_profile_ang(); - } - if (str_eq(code, EL_STR("sa"))) { - return lang_profile_sa(); - } - if (str_eq(code, EL_STR("got"))) { - return lang_profile_got(); - } - if (str_eq(code, EL_STR("non"))) { - return lang_profile_non(); - } - if (str_eq(code, EL_STR("enm"))) { - return lang_profile_enm(); - } - if (str_eq(code, EL_STR("pi"))) { - return lang_profile_pi(); - } - if (str_eq(code, EL_STR("fro"))) { - return lang_profile_fro(); - } - if (str_eq(code, EL_STR("goh"))) { - return lang_profile_goh(); - } - if (str_eq(code, EL_STR("sga"))) { - return lang_profile_sga(); - } - if (str_eq(code, EL_STR("txb"))) { - return lang_profile_txb(); - } - if (str_eq(code, EL_STR("peo"))) { - return lang_profile_peo(); - } - if (str_eq(code, EL_STR("akk"))) { - return lang_profile_akk(); - } - if (str_eq(code, EL_STR("uga"))) { - return lang_profile_uga(); - } - if (str_eq(code, EL_STR("egy"))) { - return lang_profile_egy(); - } - if (str_eq(code, EL_STR("sux"))) { - return lang_profile_sux(); - } - if (str_eq(code, EL_STR("gez"))) { - return lang_profile_gez(); - } - if (str_eq(code, EL_STR("cop"))) { - return lang_profile_cop(); - } - return lang_profile_en(); - return 0; -} - -el_val_t lang_default(void) { - return lang_profile_en(); - return 0; -} - -el_val_t lang_is_isolating(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("isolating")); - return 0; -} - -el_val_t lang_is_agglutinative(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("agglutinative")); - return 0; -} - -el_val_t lang_is_fusional(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("fusional")); - return 0; -} - -el_val_t lang_is_polysynthetic(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("morph_type")), EL_STR("polysynthetic")); - return 0; -} - -el_val_t lang_is_rtl(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("script_dir")), EL_STR("rtl")); - return 0; -} - -el_val_t lang_has_null_subject(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("null_subject")), EL_STR("true")); - return 0; -} - -el_val_t lang_has_case(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("has_case")), EL_STR("true")); - return 0; -} - -el_val_t lang_has_gender(el_val_t profile) { - return str_eq(lang_get(profile, EL_STR("has_gender")), EL_STR("true")); - return 0; -} - -el_val_t lang_word_order(el_val_t profile) { - return lang_get(profile, EL_STR("word_order")); - return 0; -} - -el_val_t lang_code(el_val_t profile) { - return lang_get(profile, EL_STR("code")); - return 0; -} - -el_val_t lex_word(el_val_t entry) { - return native_list_get(entry, 0); - return 0; -} - -el_val_t lex_pos(el_val_t entry) { - return native_list_get(entry, 1); - return 0; -} - -el_val_t lex_form(el_val_t entry, el_val_t idx) { - el_val_t n = native_list_len(entry); - el_val_t real_idx = (idx + 2); - if (real_idx >= n) { - return native_list_get(entry, 0); - } - return native_list_get(entry, real_idx); - return 0; -} - -el_val_t lex_class(el_val_t entry) { - el_val_t n = native_list_len(entry); - el_val_t last = (n - 1); - return native_list_get(entry, last); - return 0; -} - -el_val_t make_entry(el_val_t word, el_val_t pos, el_val_t f0, el_val_t f1, el_val_t f2, el_val_t f3, el_val_t f4, el_val_t cls) { - el_val_t r = native_list_empty(); - r = native_list_append(r, word); - r = native_list_append(r, pos); - r = native_list_append(r, f0); - r = native_list_append(r, f1); - r = native_list_append(r, f2); - r = native_list_append(r, f3); - r = native_list_append(r, f4); - r = native_list_append(r, cls); - return r; - return 0; -} - -el_val_t make_entry2(el_val_t word, el_val_t pos, el_val_t f0, el_val_t f1, el_val_t cls) { - el_val_t r = native_list_empty(); - r = native_list_append(r, word); - r = native_list_append(r, pos); - r = native_list_append(r, f0); - r = native_list_append(r, f1); - r = native_list_append(r, cls); - return r; - return 0; -} - -el_val_t make_entry3(el_val_t word, el_val_t pos, el_val_t f0, el_val_t f1, el_val_t f2, el_val_t cls) { - el_val_t r = native_list_empty(); - r = native_list_append(r, word); - r = native_list_append(r, pos); - r = native_list_append(r, f0); - r = native_list_append(r, f1); - r = native_list_append(r, f2); - r = native_list_append(r, cls); - return r; - return 0; -} - -el_val_t make_entry1(el_val_t word, el_val_t pos, el_val_t f0, el_val_t cls) { - el_val_t r = native_list_empty(); - r = native_list_append(r, word); - r = native_list_append(r, pos); - r = native_list_append(r, f0); - r = native_list_append(r, cls); - return r; - return 0; -} - -el_val_t build_vocab(void) { - el_val_t v = native_list_empty(); - v = native_list_append(v, make_entry3(EL_STR("I"), EL_STR("pronoun"), EL_STR("I"), EL_STR("me"), EL_STR("my"), EL_STR("person-first-sg"))); - v = native_list_append(v, make_entry3(EL_STR("you"), EL_STR("pronoun"), EL_STR("you"), EL_STR("you"), EL_STR("your"), EL_STR("person-second"))); - v = native_list_append(v, make_entry3(EL_STR("he"), EL_STR("pronoun"), EL_STR("he"), EL_STR("him"), EL_STR("his"), EL_STR("person-third-sg-m"))); - v = native_list_append(v, make_entry3(EL_STR("she"), EL_STR("pronoun"), EL_STR("she"), EL_STR("her"), EL_STR("her"), EL_STR("person-third-sg-f"))); - v = native_list_append(v, make_entry3(EL_STR("it"), EL_STR("pronoun"), EL_STR("it"), EL_STR("it"), EL_STR("its"), EL_STR("person-third-sg-n"))); - v = native_list_append(v, make_entry3(EL_STR("we"), EL_STR("pronoun"), EL_STR("we"), EL_STR("us"), EL_STR("our"), EL_STR("person-first-pl"))); - v = native_list_append(v, make_entry3(EL_STR("they"), EL_STR("pronoun"), EL_STR("they"), EL_STR("them"), EL_STR("their"), EL_STR("person-third-pl"))); - v = native_list_append(v, make_entry1(EL_STR("a"), EL_STR("determiner"), EL_STR("a"), EL_STR("indefinite"))); - v = native_list_append(v, make_entry1(EL_STR("an"), EL_STR("determiner"), EL_STR("an"), EL_STR("indefinite"))); - v = native_list_append(v, make_entry1(EL_STR("the"), EL_STR("determiner"), EL_STR("the"), EL_STR("definite"))); - v = native_list_append(v, make_entry1(EL_STR("some"), EL_STR("determiner"), EL_STR("some"), EL_STR("indefinite-pl"))); - v = native_list_append(v, make_entry1(EL_STR("this"), EL_STR("determiner"), EL_STR("this"), EL_STR("demonstrative-sg"))); - v = native_list_append(v, make_entry1(EL_STR("that"), EL_STR("determiner"), EL_STR("that"), EL_STR("demonstrative-sg"))); - v = native_list_append(v, make_entry1(EL_STR("these"), EL_STR("determiner"), EL_STR("these"), EL_STR("demonstrative-pl"))); - v = native_list_append(v, make_entry1(EL_STR("those"), EL_STR("determiner"), EL_STR("those"), EL_STR("demonstrative-pl"))); - v = native_list_append(v, make_entry1(EL_STR("in"), EL_STR("preposition"), EL_STR("in"), EL_STR("location"))); - v = native_list_append(v, make_entry1(EL_STR("on"), EL_STR("preposition"), EL_STR("on"), EL_STR("location"))); - v = native_list_append(v, make_entry1(EL_STR("at"), EL_STR("preposition"), EL_STR("at"), EL_STR("location"))); - v = native_list_append(v, make_entry1(EL_STR("to"), EL_STR("preposition"), EL_STR("to"), EL_STR("direction"))); - v = native_list_append(v, make_entry1(EL_STR("for"), EL_STR("preposition"), EL_STR("for"), EL_STR("purpose"))); - v = native_list_append(v, make_entry1(EL_STR("of"), EL_STR("preposition"), EL_STR("of"), EL_STR("relation"))); - v = native_list_append(v, make_entry1(EL_STR("with"), EL_STR("preposition"), EL_STR("with"), EL_STR("accompaniment"))); - v = native_list_append(v, make_entry1(EL_STR("from"), EL_STR("preposition"), EL_STR("from"), EL_STR("source"))); - v = native_list_append(v, make_entry1(EL_STR("by"), EL_STR("preposition"), EL_STR("by"), EL_STR("agent"))); - v = native_list_append(v, make_entry1(EL_STR("into"), EL_STR("preposition"), EL_STR("into"), EL_STR("direction"))); - v = native_list_append(v, make_entry(EL_STR("is"), EL_STR("auxiliary"), EL_STR("be"), EL_STR("is"), EL_STR("was"), EL_STR("been"), EL_STR("being"), EL_STR("copula"))); - v = native_list_append(v, make_entry(EL_STR("are"), EL_STR("auxiliary"), EL_STR("be"), EL_STR("is"), EL_STR("was"), EL_STR("been"), EL_STR("being"), EL_STR("copula"))); - v = native_list_append(v, make_entry(EL_STR("was"), EL_STR("auxiliary"), EL_STR("be"), EL_STR("is"), EL_STR("was"), EL_STR("been"), EL_STR("being"), EL_STR("copula-past"))); - v = native_list_append(v, make_entry(EL_STR("were"), EL_STR("auxiliary"), EL_STR("be"), EL_STR("is"), EL_STR("were"), EL_STR("been"), EL_STR("being"), EL_STR("copula-past"))); - v = native_list_append(v, make_entry(EL_STR("has"), EL_STR("auxiliary"), EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having"), EL_STR("perfect"))); - v = native_list_append(v, make_entry(EL_STR("have"), EL_STR("auxiliary"), EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having"), EL_STR("perfect"))); - v = native_list_append(v, make_entry(EL_STR("had"), EL_STR("auxiliary"), EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having"), EL_STR("perfect-past"))); - v = native_list_append(v, make_entry(EL_STR("will"), EL_STR("auxiliary"), EL_STR("will"), EL_STR("will"), EL_STR("would"), EL_STR("would"), EL_STR("willing"), EL_STR("future"))); - v = native_list_append(v, make_entry(EL_STR("can"), EL_STR("auxiliary"), EL_STR("can"), EL_STR("can"), EL_STR("could"), EL_STR("could"), EL_STR("canning"), EL_STR("modal"))); - v = native_list_append(v, make_entry(EL_STR("could"), EL_STR("auxiliary"), EL_STR("can"), EL_STR("can"), EL_STR("could"), EL_STR("could"), EL_STR("canning"), EL_STR("modal-past"))); - v = native_list_append(v, make_entry(EL_STR("would"), EL_STR("auxiliary"), EL_STR("will"), EL_STR("will"), EL_STR("would"), EL_STR("would"), EL_STR("willing"), EL_STR("modal-cond"))); - v = native_list_append(v, make_entry(EL_STR("do"), EL_STR("auxiliary"), EL_STR("do"), EL_STR("does"), EL_STR("did"), EL_STR("done"), EL_STR("doing"), EL_STR("do-support"))); - v = native_list_append(v, make_entry(EL_STR("does"), EL_STR("auxiliary"), EL_STR("do"), EL_STR("does"), EL_STR("did"), EL_STR("done"), EL_STR("doing"), EL_STR("do-support"))); - v = native_list_append(v, make_entry(EL_STR("did"), EL_STR("auxiliary"), EL_STR("do"), EL_STR("does"), EL_STR("did"), EL_STR("done"), EL_STR("doing"), EL_STR("do-support-past"))); - v = native_list_append(v, make_entry2(EL_STR("cat"), EL_STR("noun"), EL_STR("cat"), EL_STR("cats"), EL_STR("animal"))); - v = native_list_append(v, make_entry2(EL_STR("dog"), EL_STR("noun"), EL_STR("dog"), EL_STR("dogs"), EL_STR("animal"))); - v = native_list_append(v, make_entry2(EL_STR("bird"), EL_STR("noun"), EL_STR("bird"), EL_STR("birds"), EL_STR("animal"))); - v = native_list_append(v, make_entry2(EL_STR("fish"), EL_STR("noun"), EL_STR("fish"), EL_STR("fish"), EL_STR("animal"))); - v = native_list_append(v, make_entry2(EL_STR("horse"), EL_STR("noun"), EL_STR("horse"), EL_STR("horses"), EL_STR("animal"))); - v = native_list_append(v, make_entry2(EL_STR("house"), EL_STR("noun"), EL_STR("house"), EL_STR("houses"), EL_STR("building"))); - v = native_list_append(v, make_entry2(EL_STR("book"), EL_STR("noun"), EL_STR("book"), EL_STR("books"), EL_STR("object"))); - v = native_list_append(v, make_entry2(EL_STR("table"), EL_STR("noun"), EL_STR("table"), EL_STR("tables"), EL_STR("furniture"))); - v = native_list_append(v, make_entry2(EL_STR("chair"), EL_STR("noun"), EL_STR("chair"), EL_STR("chairs"), EL_STR("furniture"))); - v = native_list_append(v, make_entry2(EL_STR("door"), EL_STR("noun"), EL_STR("door"), EL_STR("doors"), EL_STR("structure"))); - v = native_list_append(v, make_entry2(EL_STR("window"), EL_STR("noun"), EL_STR("window"), EL_STR("windows"), EL_STR("structure"))); - v = native_list_append(v, make_entry2(EL_STR("city"), EL_STR("noun"), EL_STR("city"), EL_STR("cities"), EL_STR("place"))); - v = native_list_append(v, make_entry2(EL_STR("park"), EL_STR("noun"), EL_STR("park"), EL_STR("parks"), EL_STR("place"))); - v = native_list_append(v, make_entry2(EL_STR("school"), EL_STR("noun"), EL_STR("school"), EL_STR("schools"), EL_STR("place"))); - v = native_list_append(v, make_entry2(EL_STR("store"), EL_STR("noun"), EL_STR("store"), EL_STR("stores"), EL_STR("place"))); - v = native_list_append(v, make_entry2(EL_STR("road"), EL_STR("noun"), EL_STR("road"), EL_STR("roads"), EL_STR("place"))); - v = native_list_append(v, make_entry2(EL_STR("box"), EL_STR("noun"), EL_STR("box"), EL_STR("boxes"), EL_STR("container"))); - v = native_list_append(v, make_entry2(EL_STR("child"), EL_STR("noun"), EL_STR("child"), EL_STR("children"), EL_STR("person"))); - v = native_list_append(v, make_entry2(EL_STR("person"), EL_STR("noun"), EL_STR("person"), EL_STR("people"), EL_STR("person"))); - v = native_list_append(v, make_entry2(EL_STR("man"), EL_STR("noun"), EL_STR("man"), EL_STR("men"), EL_STR("person"))); - v = native_list_append(v, make_entry2(EL_STR("woman"), EL_STR("noun"), EL_STR("woman"), EL_STR("women"), EL_STR("person"))); - v = native_list_append(v, make_entry2(EL_STR("tree"), EL_STR("noun"), EL_STR("tree"), EL_STR("trees"), EL_STR("plant"))); - v = native_list_append(v, make_entry2(EL_STR("flower"), EL_STR("noun"), EL_STR("flower"), EL_STR("flowers"), EL_STR("plant"))); - v = native_list_append(v, make_entry2(EL_STR("water"), EL_STR("noun"), EL_STR("water"), EL_STR("waters"), EL_STR("substance"))); - v = native_list_append(v, make_entry2(EL_STR("food"), EL_STR("noun"), EL_STR("food"), EL_STR("foods"), EL_STR("substance"))); - v = native_list_append(v, make_entry2(EL_STR("time"), EL_STR("noun"), EL_STR("time"), EL_STR("times"), EL_STR("abstract"))); - v = native_list_append(v, make_entry2(EL_STR("day"), EL_STR("noun"), EL_STR("day"), EL_STR("days"), EL_STR("time"))); - v = native_list_append(v, make_entry2(EL_STR("night"), EL_STR("noun"), EL_STR("night"), EL_STR("nights"), EL_STR("time"))); - v = native_list_append(v, make_entry2(EL_STR("home"), EL_STR("noun"), EL_STR("home"), EL_STR("homes"), EL_STR("place"))); - v = native_list_append(v, make_entry(EL_STR("run"), EL_STR("verb"), EL_STR("run"), EL_STR("runs"), EL_STR("ran"), EL_STR("run"), EL_STR("running"), EL_STR("motion"))); - v = native_list_append(v, make_entry(EL_STR("walk"), EL_STR("verb"), EL_STR("walk"), EL_STR("walks"), EL_STR("walked"), EL_STR("walked"), EL_STR("walking"), EL_STR("motion"))); - v = native_list_append(v, make_entry(EL_STR("go"), EL_STR("verb"), EL_STR("go"), EL_STR("goes"), EL_STR("went"), EL_STR("gone"), EL_STR("going"), EL_STR("motion"))); - v = native_list_append(v, make_entry(EL_STR("come"), EL_STR("verb"), EL_STR("come"), EL_STR("comes"), EL_STR("came"), EL_STR("come"), EL_STR("coming"), EL_STR("motion"))); - v = native_list_append(v, make_entry(EL_STR("see"), EL_STR("verb"), EL_STR("see"), EL_STR("sees"), EL_STR("saw"), EL_STR("seen"), EL_STR("seeing"), EL_STR("perception"))); - v = native_list_append(v, make_entry(EL_STR("hear"), EL_STR("verb"), EL_STR("hear"), EL_STR("hears"), EL_STR("heard"), EL_STR("heard"), EL_STR("hearing"), EL_STR("perception"))); - v = native_list_append(v, make_entry(EL_STR("look"), EL_STR("verb"), EL_STR("look"), EL_STR("looks"), EL_STR("looked"), EL_STR("looked"), EL_STR("looking"), EL_STR("perception"))); - v = native_list_append(v, make_entry(EL_STR("eat"), EL_STR("verb"), EL_STR("eat"), EL_STR("eats"), EL_STR("ate"), EL_STR("eaten"), EL_STR("eating"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("drink"), EL_STR("verb"), EL_STR("drink"), EL_STR("drinks"), EL_STR("drank"), EL_STR("drunk"), EL_STR("drinking"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("sleep"), EL_STR("verb"), EL_STR("sleep"), EL_STR("sleeps"), EL_STR("slept"), EL_STR("slept"), EL_STR("sleeping"), EL_STR("state"))); - v = native_list_append(v, make_entry(EL_STR("sit"), EL_STR("verb"), EL_STR("sit"), EL_STR("sits"), EL_STR("sat"), EL_STR("sat"), EL_STR("sitting"), EL_STR("posture"))); - v = native_list_append(v, make_entry(EL_STR("stand"), EL_STR("verb"), EL_STR("stand"), EL_STR("stands"), EL_STR("stood"), EL_STR("stood"), EL_STR("standing"), EL_STR("posture"))); - v = native_list_append(v, make_entry(EL_STR("give"), EL_STR("verb"), EL_STR("give"), EL_STR("gives"), EL_STR("gave"), EL_STR("given"), EL_STR("giving"), EL_STR("transfer"))); - v = native_list_append(v, make_entry(EL_STR("take"), EL_STR("verb"), EL_STR("take"), EL_STR("takes"), EL_STR("took"), EL_STR("taken"), EL_STR("taking"), EL_STR("transfer"))); - v = native_list_append(v, make_entry(EL_STR("make"), EL_STR("verb"), EL_STR("make"), EL_STR("makes"), EL_STR("made"), EL_STR("made"), EL_STR("making"), EL_STR("creation"))); - v = native_list_append(v, make_entry(EL_STR("put"), EL_STR("verb"), EL_STR("put"), EL_STR("puts"), EL_STR("put"), EL_STR("put"), EL_STR("putting"), EL_STR("placement"))); - v = native_list_append(v, make_entry(EL_STR("find"), EL_STR("verb"), EL_STR("find"), EL_STR("finds"), EL_STR("found"), EL_STR("found"), EL_STR("finding"), EL_STR("discovery"))); - v = native_list_append(v, make_entry(EL_STR("know"), EL_STR("verb"), EL_STR("know"), EL_STR("knows"), EL_STR("knew"), EL_STR("known"), EL_STR("knowing"), EL_STR("cognition"))); - v = native_list_append(v, make_entry(EL_STR("think"), EL_STR("verb"), EL_STR("think"), EL_STR("thinks"), EL_STR("thought"), EL_STR("thought"), EL_STR("thinking"), EL_STR("cognition"))); - v = native_list_append(v, make_entry(EL_STR("say"), EL_STR("verb"), EL_STR("say"), EL_STR("says"), EL_STR("said"), EL_STR("said"), EL_STR("saying"), EL_STR("communication"))); - v = native_list_append(v, make_entry(EL_STR("tell"), EL_STR("verb"), EL_STR("tell"), EL_STR("tells"), EL_STR("told"), EL_STR("told"), EL_STR("telling"), EL_STR("communication"))); - v = native_list_append(v, make_entry(EL_STR("ask"), EL_STR("verb"), EL_STR("ask"), EL_STR("asks"), EL_STR("asked"), EL_STR("asked"), EL_STR("asking"), EL_STR("communication"))); - v = native_list_append(v, make_entry(EL_STR("like"), EL_STR("verb"), EL_STR("like"), EL_STR("likes"), EL_STR("liked"), EL_STR("liked"), EL_STR("liking"), EL_STR("emotion"))); - v = native_list_append(v, make_entry(EL_STR("love"), EL_STR("verb"), EL_STR("love"), EL_STR("loves"), EL_STR("loved"), EL_STR("loved"), EL_STR("loving"), EL_STR("emotion"))); - v = native_list_append(v, make_entry(EL_STR("want"), EL_STR("verb"), EL_STR("want"), EL_STR("wants"), EL_STR("wanted"), EL_STR("wanted"), EL_STR("wanting"), EL_STR("desire"))); - v = native_list_append(v, make_entry(EL_STR("need"), EL_STR("verb"), EL_STR("need"), EL_STR("needs"), EL_STR("needed"), EL_STR("needed"), EL_STR("needing"), EL_STR("desire"))); - v = native_list_append(v, make_entry(EL_STR("have"), EL_STR("verb"), EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having"), EL_STR("possession"))); - v = native_list_append(v, make_entry(EL_STR("hold"), EL_STR("verb"), EL_STR("hold"), EL_STR("holds"), EL_STR("held"), EL_STR("held"), EL_STR("holding"), EL_STR("possession"))); - v = native_list_append(v, make_entry(EL_STR("open"), EL_STR("verb"), EL_STR("open"), EL_STR("opens"), EL_STR("opened"), EL_STR("opened"), EL_STR("opening"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("close"), EL_STR("verb"), EL_STR("close"), EL_STR("closes"), EL_STR("closed"), EL_STR("closed"), EL_STR("closing"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("write"), EL_STR("verb"), EL_STR("write"), EL_STR("writes"), EL_STR("wrote"), EL_STR("written"), EL_STR("writing"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("read"), EL_STR("verb"), EL_STR("read"), EL_STR("reads"), EL_STR("read"), EL_STR("read"), EL_STR("reading"), EL_STR("action"))); - v = native_list_append(v, make_entry(EL_STR("build"), EL_STR("verb"), EL_STR("build"), EL_STR("builds"), EL_STR("built"), EL_STR("built"), EL_STR("building"), EL_STR("creation"))); - v = native_list_append(v, make_entry(EL_STR("live"), EL_STR("verb"), EL_STR("live"), EL_STR("lives"), EL_STR("lived"), EL_STR("lived"), EL_STR("living"), EL_STR("state"))); - v = native_list_append(v, make_entry(EL_STR("work"), EL_STR("verb"), EL_STR("work"), EL_STR("works"), EL_STR("worked"), EL_STR("worked"), EL_STR("working"), EL_STR("activity"))); - v = native_list_append(v, make_entry(EL_STR("play"), EL_STR("verb"), EL_STR("play"), EL_STR("plays"), EL_STR("played"), EL_STR("played"), EL_STR("playing"), EL_STR("activity"))); - v = native_list_append(v, make_entry(EL_STR("help"), EL_STR("verb"), EL_STR("help"), EL_STR("helps"), EL_STR("helped"), EL_STR("helped"), EL_STR("helping"), EL_STR("activity"))); - v = native_list_append(v, make_entry1(EL_STR("big"), EL_STR("adjective"), EL_STR("big"), EL_STR("size"))); - v = native_list_append(v, make_entry1(EL_STR("small"), EL_STR("adjective"), EL_STR("small"), EL_STR("size"))); - v = native_list_append(v, make_entry1(EL_STR("large"), EL_STR("adjective"), EL_STR("large"), EL_STR("size"))); - v = native_list_append(v, make_entry1(EL_STR("little"), EL_STR("adjective"), EL_STR("little"), EL_STR("size"))); - v = native_list_append(v, make_entry1(EL_STR("old"), EL_STR("adjective"), EL_STR("old"), EL_STR("age"))); - v = native_list_append(v, make_entry1(EL_STR("new"), EL_STR("adjective"), EL_STR("new"), EL_STR("age"))); - v = native_list_append(v, make_entry1(EL_STR("young"), EL_STR("adjective"), EL_STR("young"), EL_STR("age"))); - v = native_list_append(v, make_entry1(EL_STR("good"), EL_STR("adjective"), EL_STR("good"), EL_STR("quality"))); - v = native_list_append(v, make_entry1(EL_STR("bad"), EL_STR("adjective"), EL_STR("bad"), EL_STR("quality"))); - v = native_list_append(v, make_entry1(EL_STR("fast"), EL_STR("adjective"), EL_STR("fast"), EL_STR("speed"))); - v = native_list_append(v, make_entry1(EL_STR("slow"), EL_STR("adjective"), EL_STR("slow"), EL_STR("speed"))); - v = native_list_append(v, make_entry1(EL_STR("hot"), EL_STR("adjective"), EL_STR("hot"), EL_STR("temperature"))); - v = native_list_append(v, make_entry1(EL_STR("cold"), EL_STR("adjective"), EL_STR("cold"), EL_STR("temperature"))); - v = native_list_append(v, make_entry1(EL_STR("happy"), EL_STR("adjective"), EL_STR("happy"), EL_STR("emotion"))); - v = native_list_append(v, make_entry1(EL_STR("sad"), EL_STR("adjective"), EL_STR("sad"), EL_STR("emotion"))); - v = native_list_append(v, make_entry1(EL_STR("red"), EL_STR("adjective"), EL_STR("red"), EL_STR("color"))); - v = native_list_append(v, make_entry1(EL_STR("blue"), EL_STR("adjective"), EL_STR("blue"), EL_STR("color"))); - v = native_list_append(v, make_entry1(EL_STR("green"), EL_STR("adjective"), EL_STR("green"), EL_STR("color"))); - v = native_list_append(v, make_entry1(EL_STR("white"), EL_STR("adjective"), EL_STR("white"), EL_STR("color"))); - v = native_list_append(v, make_entry1(EL_STR("black"), EL_STR("adjective"), EL_STR("black"), EL_STR("color"))); - v = native_list_append(v, make_entry1(EL_STR("long"), EL_STR("adjective"), EL_STR("long"), EL_STR("dimension"))); - v = native_list_append(v, make_entry1(EL_STR("short"), EL_STR("adjective"), EL_STR("short"), EL_STR("dimension"))); - v = native_list_append(v, make_entry1(EL_STR("beautiful"), EL_STR("adjective"), EL_STR("beautiful"), EL_STR("appearance"))); - v = native_list_append(v, make_entry1(EL_STR("bright"), EL_STR("adjective"), EL_STR("bright"), EL_STR("appearance"))); - v = native_list_append(v, make_entry1(EL_STR("dark"), EL_STR("adjective"), EL_STR("dark"), EL_STR("appearance"))); - return v; - return 0; -} - -el_val_t get_vocab(void) { - return build_vocab(); - return 0; -} - -el_val_t vocab_lookup(el_val_t word, el_val_t lang_code) { - el_val_t vocab = get_vocab(); - el_val_t n = native_list_len(vocab); - el_val_t i = 0; - while (i < n) { - el_val_t entry = native_list_get(vocab, i); - el_val_t w = native_list_get(entry, 0); - if (str_eq(w, word)) { - if (!str_eq(lang_code, EL_STR(""))) { - if (!str_eq(lang_code, EL_STR("en"))) { - el_val_t empty = native_list_empty(); - return empty; - } - } - return entry; - } - i = (i + 1); - } - el_val_t empty = native_list_empty(); - return empty; - return 0; -} - -el_val_t vocab_lookup_en(el_val_t word) { - return vocab_lookup(word, EL_STR("en")); - return 0; -} - -el_val_t vocab_synonym(el_val_t word, el_val_t lang_register, el_val_t lang_code) { - return word; - return 0; -} - -el_val_t vocab_by_pos(el_val_t pos) { - el_val_t vocab = get_vocab(); - el_val_t n = native_list_len(vocab); - el_val_t result = native_list_empty(); - el_val_t i = 0; - while (i < n) { - el_val_t entry = native_list_get(vocab, i); - el_val_t p = native_list_get(entry, 1); - if (str_eq(p, pos)) { - result = native_list_append(result, entry); - } - i = (i + 1); - } - return result; - return 0; -} - -el_val_t vocab_by_class(el_val_t cls) { - el_val_t vocab = get_vocab(); - el_val_t n = native_list_len(vocab); - el_val_t result = native_list_empty(); - el_val_t i = 0; - while (i < n) { - el_val_t entry = native_list_get(vocab, i); - el_val_t m = native_list_len(entry); - el_val_t c = native_list_get(entry, (m - 1)); - if (str_eq(c, cls)) { - result = native_list_append(result, entry); - } - i = (i + 1); - } - return result; - return 0; -} - -el_val_t entry_found(el_val_t entry) { - el_val_t n = native_list_len(entry); - if (n > 0) { - return 1; - } - return 0; - return 0; -} - -el_val_t entry_word(el_val_t entry) { - return native_list_get(entry, 0); - return 0; -} - -el_val_t entry_pos(el_val_t entry) { - return native_list_get(entry, 1); - return 0; -} - -el_val_t entry_form(el_val_t entry, el_val_t n) { - el_val_t real = (n + 2); - el_val_t total = native_list_len(entry); - if (real >= total) { - return native_list_get(entry, 0); - } - return native_list_get(entry, real); - return 0; -} - -el_val_t es_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t es_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t es_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t es_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t es_str_last3(el_val_t s) { - el_val_t n = str_len(s); - if (n < 3) { - return s; - } - return str_slice(s, (n - 3), n); - return 0; -} - -el_val_t es_verb_class(el_val_t base) { - if (es_str_ends(base, EL_STR("ar"))) { - return EL_STR("ar"); - } - if (es_str_ends(base, EL_STR("er"))) { - return EL_STR("er"); - } - if (es_str_ends(base, EL_STR("ir"))) { - return EL_STR("ir"); - } - return EL_STR("ar"); - return 0; -} - -el_val_t es_stem(el_val_t base) { - return es_str_drop_last(base, 2); - return 0; -} - -el_val_t es_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t es_irregular_present(el_val_t verb, el_val_t person, el_val_t number) { - el_val_t slot = es_slot(person, number); - if (str_eq(verb, EL_STR("ser"))) { - if (slot == 0) { - return EL_STR("soy"); - } - if (slot == 1) { - return EL_STR("eres"); - } - if (slot == 2) { - return EL_STR("es"); - } - if (slot == 3) { - return EL_STR("somos"); - } - if (slot == 4) { - return EL_STR("sois"); - } - return EL_STR("son"); - } - if (str_eq(verb, EL_STR("estar"))) { - if (slot == 0) { - return EL_STR("estoy"); - } - if (slot == 1) { - return EL_STR("estás"); - } - if (slot == 2) { - return EL_STR("está"); - } - if (slot == 3) { - return EL_STR("estamos"); - } - if (slot == 4) { - return EL_STR("estáis"); - } - return EL_STR("están"); - } - if (str_eq(verb, EL_STR("tener"))) { - if (slot == 0) { - return EL_STR("tengo"); - } - if (slot == 1) { - return EL_STR("tienes"); - } - if (slot == 2) { - return EL_STR("tiene"); - } - if (slot == 3) { - return EL_STR("tenemos"); - } - if (slot == 4) { - return EL_STR("tenéis"); - } - return EL_STR("tienen"); - } - if (str_eq(verb, EL_STR("hacer"))) { - if (slot == 0) { - return EL_STR("hago"); - } - if (slot == 1) { - return EL_STR("haces"); - } - if (slot == 2) { - return EL_STR("hace"); - } - if (slot == 3) { - return EL_STR("hacemos"); - } - if (slot == 4) { - return EL_STR("hacéis"); - } - return EL_STR("hacen"); - } - if (str_eq(verb, EL_STR("ir"))) { - if (slot == 0) { - return EL_STR("voy"); - } - if (slot == 1) { - return EL_STR("vas"); - } - if (slot == 2) { - return EL_STR("va"); - } - if (slot == 3) { - return EL_STR("vamos"); - } - if (slot == 4) { - return EL_STR("vais"); - } - return EL_STR("van"); - } - if (str_eq(verb, EL_STR("ver"))) { - if (slot == 0) { - return EL_STR("veo"); - } - if (slot == 1) { - return EL_STR("ves"); - } - if (slot == 2) { - return EL_STR("ve"); - } - if (slot == 3) { - return EL_STR("vemos"); - } - if (slot == 4) { - return EL_STR("veis"); - } - return EL_STR("ven"); - } - if (str_eq(verb, EL_STR("dar"))) { - if (slot == 0) { - return EL_STR("doy"); - } - if (slot == 1) { - return EL_STR("das"); - } - if (slot == 2) { - return EL_STR("da"); - } - if (slot == 3) { - return EL_STR("damos"); - } - if (slot == 4) { - return EL_STR("dais"); - } - return EL_STR("dan"); - } - if (str_eq(verb, EL_STR("saber"))) { - if (slot == 0) { - return EL_STR("sé"); - } - if (slot == 1) { - return EL_STR("sabes"); - } - if (slot == 2) { - return EL_STR("sabe"); - } - if (slot == 3) { - return EL_STR("sabemos"); - } - if (slot == 4) { - return EL_STR("sabéis"); - } - return EL_STR("saben"); - } - if (str_eq(verb, EL_STR("poder"))) { - if (slot == 0) { - return EL_STR("puedo"); - } - if (slot == 1) { - return EL_STR("puedes"); - } - if (slot == 2) { - return EL_STR("puede"); - } - if (slot == 3) { - return EL_STR("podemos"); - } - if (slot == 4) { - return EL_STR("podéis"); - } - return EL_STR("pueden"); - } - if (str_eq(verb, EL_STR("querer"))) { - if (slot == 0) { - return EL_STR("quiero"); - } - if (slot == 1) { - return EL_STR("quieres"); - } - if (slot == 2) { - return EL_STR("quiere"); - } - if (slot == 3) { - return EL_STR("queremos"); - } - if (slot == 4) { - return EL_STR("queréis"); - } - return EL_STR("quieren"); - } - if (str_eq(verb, EL_STR("venir"))) { - if (slot == 0) { - return EL_STR("vengo"); - } - if (slot == 1) { - return EL_STR("vienes"); - } - if (slot == 2) { - return EL_STR("viene"); - } - if (slot == 3) { - return EL_STR("venimos"); - } - if (slot == 4) { - return EL_STR("venís"); - } - return EL_STR("vienen"); - } - if (str_eq(verb, EL_STR("decir"))) { - if (slot == 0) { - return EL_STR("digo"); - } - if (slot == 1) { - return EL_STR("dices"); - } - if (slot == 2) { - return EL_STR("dice"); - } - if (slot == 3) { - return EL_STR("decimos"); - } - if (slot == 4) { - return EL_STR("decís"); - } - return EL_STR("dicen"); - } - if (str_eq(verb, EL_STR("haber"))) { - if (slot == 0) { - return EL_STR("he"); - } - if (slot == 1) { - return EL_STR("has"); - } - if (slot == 2) { - return EL_STR("ha"); - } - if (slot == 3) { - return EL_STR("hemos"); - } - if (slot == 4) { - return EL_STR("habéis"); - } - return EL_STR("han"); - } - return EL_STR(""); - return 0; -} - -el_val_t es_irregular_preterite(el_val_t verb, el_val_t person, el_val_t number) { - el_val_t slot = es_slot(person, number); - if (str_eq(verb, EL_STR("ser"))) { - if (slot == 0) { - return EL_STR("fui"); - } - if (slot == 1) { - return EL_STR("fuiste"); - } - if (slot == 2) { - return EL_STR("fue"); - } - if (slot == 3) { - return EL_STR("fuimos"); - } - if (slot == 4) { - return EL_STR("fuisteis"); - } - return EL_STR("fueron"); - } - if (str_eq(verb, EL_STR("ir"))) { - if (slot == 0) { - return EL_STR("fui"); - } - if (slot == 1) { - return EL_STR("fuiste"); - } - if (slot == 2) { - return EL_STR("fue"); - } - if (slot == 3) { - return EL_STR("fuimos"); - } - if (slot == 4) { - return EL_STR("fuisteis"); - } - return EL_STR("fueron"); - } - if (str_eq(verb, EL_STR("tener"))) { - if (slot == 0) { - return EL_STR("tuve"); - } - if (slot == 1) { - return EL_STR("tuviste"); - } - if (slot == 2) { - return EL_STR("tuvo"); - } - if (slot == 3) { - return EL_STR("tuvimos"); - } - if (slot == 4) { - return EL_STR("tuvisteis"); - } - return EL_STR("tuvieron"); - } - if (str_eq(verb, EL_STR("hacer"))) { - if (slot == 0) { - return EL_STR("hice"); - } - if (slot == 1) { - return EL_STR("hiciste"); - } - if (slot == 2) { - return EL_STR("hizo"); - } - if (slot == 3) { - return EL_STR("hicimos"); - } - if (slot == 4) { - return EL_STR("hicisteis"); - } - return EL_STR("hicieron"); - } - if (str_eq(verb, EL_STR("estar"))) { - if (slot == 0) { - return EL_STR("estuve"); - } - if (slot == 1) { - return EL_STR("estuviste"); - } - if (slot == 2) { - return EL_STR("estuvo"); - } - if (slot == 3) { - return EL_STR("estuvimos"); - } - if (slot == 4) { - return EL_STR("estuvisteis"); - } - return EL_STR("estuvieron"); - } - if (str_eq(verb, EL_STR("dar"))) { - if (slot == 0) { - return EL_STR("di"); - } - if (slot == 1) { - return EL_STR("diste"); - } - if (slot == 2) { - return EL_STR("dio"); - } - if (slot == 3) { - return EL_STR("dimos"); - } - if (slot == 4) { - return EL_STR("disteis"); - } - return EL_STR("dieron"); - } - if (str_eq(verb, EL_STR("saber"))) { - if (slot == 0) { - return EL_STR("supe"); - } - if (slot == 1) { - return EL_STR("supiste"); - } - if (slot == 2) { - return EL_STR("supo"); - } - if (slot == 3) { - return EL_STR("supimos"); - } - if (slot == 4) { - return EL_STR("supisteis"); - } - return EL_STR("supieron"); - } - if (str_eq(verb, EL_STR("poder"))) { - if (slot == 0) { - return EL_STR("pude"); - } - if (slot == 1) { - return EL_STR("pudiste"); - } - if (slot == 2) { - return EL_STR("pudo"); - } - if (slot == 3) { - return EL_STR("pudimos"); - } - if (slot == 4) { - return EL_STR("pudisteis"); - } - return EL_STR("pudieron"); - } - if (str_eq(verb, EL_STR("querer"))) { - if (slot == 0) { - return EL_STR("quise"); - } - if (slot == 1) { - return EL_STR("quisiste"); - } - if (slot == 2) { - return EL_STR("quiso"); - } - if (slot == 3) { - return EL_STR("quisimos"); - } - if (slot == 4) { - return EL_STR("quisisteis"); - } - return EL_STR("quisieron"); - } - if (str_eq(verb, EL_STR("venir"))) { - if (slot == 0) { - return EL_STR("vine"); - } - if (slot == 1) { - return EL_STR("viniste"); - } - if (slot == 2) { - return EL_STR("vino"); - } - if (slot == 3) { - return EL_STR("vinimos"); - } - if (slot == 4) { - return EL_STR("vinisteis"); - } - return EL_STR("vinieron"); - } - if (str_eq(verb, EL_STR("decir"))) { - if (slot == 0) { - return EL_STR("dije"); - } - if (slot == 1) { - return EL_STR("dijiste"); - } - if (slot == 2) { - return EL_STR("dijo"); - } - if (slot == 3) { - return EL_STR("dijimos"); - } - if (slot == 4) { - return EL_STR("dijisteis"); - } - return EL_STR("dijeron"); - } - if (str_eq(verb, EL_STR("haber"))) { - if (slot == 0) { - return EL_STR("hube"); - } - if (slot == 1) { - return EL_STR("hubiste"); - } - if (slot == 2) { - return EL_STR("hubo"); - } - if (slot == 3) { - return EL_STR("hubimos"); - } - if (slot == 4) { - return EL_STR("hubisteis"); - } - return EL_STR("hubieron"); - } - if (str_eq(verb, EL_STR("ver"))) { - if (slot == 0) { - return EL_STR("vi"); - } - if (slot == 1) { - return EL_STR("viste"); - } - if (slot == 2) { - return EL_STR("vio"); - } - if (slot == 3) { - return EL_STR("vimos"); - } - if (slot == 4) { - return EL_STR("visteis"); - } - return EL_STR("vieron"); - } - return EL_STR(""); - return 0; -} - -el_val_t es_irregular_imperfect(el_val_t verb, el_val_t person, el_val_t number) { - el_val_t slot = es_slot(person, number); - if (str_eq(verb, EL_STR("ser"))) { - if (slot == 0) { - return EL_STR("era"); - } - if (slot == 1) { - return EL_STR("eras"); - } - if (slot == 2) { - return EL_STR("era"); - } - if (slot == 3) { - return EL_STR("éramos"); - } - if (slot == 4) { - return EL_STR("erais"); - } - return EL_STR("eran"); - } - if (str_eq(verb, EL_STR("ir"))) { - if (slot == 0) { - return EL_STR("iba"); - } - if (slot == 1) { - return EL_STR("ibas"); - } - if (slot == 2) { - return EL_STR("iba"); - } - if (slot == 3) { - return EL_STR("íbamos"); - } - if (slot == 4) { - return EL_STR("ibais"); - } - return EL_STR("iban"); - } - if (str_eq(verb, EL_STR("ver"))) { - if (slot == 0) { - return EL_STR("veía"); - } - if (slot == 1) { - return EL_STR("veías"); - } - if (slot == 2) { - return EL_STR("veía"); - } - if (slot == 3) { - return EL_STR("veíamos"); - } - if (slot == 4) { - return EL_STR("veíais"); - } - return EL_STR("veían"); - } - return EL_STR(""); - return 0; -} - -el_val_t es_regular_present(el_val_t stem, el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("ar"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("o")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("as")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("a")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("amos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("áis")); - } - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(vclass, EL_STR("er"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("o")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("es")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("emos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("éis")); - } - return el_str_concat(stem, EL_STR("en")); - } - if (slot == 0) { - return el_str_concat(stem, EL_STR("o")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("es")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("imos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ís")); - } - return el_str_concat(stem, EL_STR("en")); - return 0; -} - -el_val_t es_regular_preterite(el_val_t stem, el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("ar"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("é")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("aste")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ó")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("amos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("asteis")); - } - return el_str_concat(stem, EL_STR("aron")); - } - if (slot == 0) { - return el_str_concat(stem, EL_STR("í")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("iste")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ió")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("imos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("isteis")); - } - return el_str_concat(stem, EL_STR("ieron")); - return 0; -} - -el_val_t es_regular_future(el_val_t base, el_val_t slot) { - if (slot == 0) { - return el_str_concat(base, EL_STR("é")); - } - if (slot == 1) { - return el_str_concat(base, EL_STR("ás")); - } - if (slot == 2) { - return el_str_concat(base, EL_STR("á")); - } - if (slot == 3) { - return el_str_concat(base, EL_STR("emos")); - } - if (slot == 4) { - return el_str_concat(base, EL_STR("éis")); - } - return el_str_concat(base, EL_STR("án")); - return 0; -} - -el_val_t es_irregular_future_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("tener"))) { - return EL_STR("tendr"); - } - if (str_eq(verb, EL_STR("hacer"))) { - return EL_STR("har"); - } - if (str_eq(verb, EL_STR("poder"))) { - return EL_STR("podr"); - } - if (str_eq(verb, EL_STR("querer"))) { - return EL_STR("querr"); - } - if (str_eq(verb, EL_STR("venir"))) { - return EL_STR("vendr"); - } - if (str_eq(verb, EL_STR("decir"))) { - return EL_STR("dir"); - } - if (str_eq(verb, EL_STR("haber"))) { - return EL_STR("habr"); - } - if (str_eq(verb, EL_STR("saber"))) { - return EL_STR("sabr"); - } - if (str_eq(verb, EL_STR("salir"))) { - return EL_STR("saldr"); - } - if (str_eq(verb, EL_STR("poner"))) { - return EL_STR("pondr"); - } - return EL_STR(""); - return 0; -} - -el_val_t es_regular_imperfect(el_val_t stem, el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("ar"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("aba")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("abas")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("aba")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ábamos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("abais")); - } - return el_str_concat(stem, EL_STR("aban")); - } - if (slot == 0) { - return el_str_concat(stem, EL_STR("ía")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("ías")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ía")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("íamos")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("íais")); - } - return el_str_concat(stem, EL_STR("ían")); - return 0; -} - -el_val_t es_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = es_slot(person, number); - if (str_eq(tense, EL_STR("present"))) { - el_val_t irreg = es_irregular_present(verb, person, number); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - el_val_t vclass = es_verb_class(verb); - el_val_t stem = es_stem(verb); - return es_regular_present(stem, vclass, slot); - } - if (str_eq(tense, EL_STR("past"))) { - el_val_t irreg = es_irregular_preterite(verb, person, number); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - el_val_t vclass = es_verb_class(verb); - el_val_t stem = es_stem(verb); - return es_regular_preterite(stem, vclass, slot); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t irreg_stem = es_irregular_future_stem(verb); - if (!str_eq(irreg_stem, EL_STR(""))) { - return es_regular_future(irreg_stem, slot); - } - return es_regular_future(verb, slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - el_val_t irreg = es_irregular_imperfect(verb, person, number); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - el_val_t vclass = es_verb_class(verb); - el_val_t stem = es_stem(verb); - return es_regular_imperfect(stem, vclass, slot); - } - return verb; - return 0; -} - -el_val_t es_gender(el_val_t noun) { - if (es_str_ends(noun, EL_STR("ión"))) { - return EL_STR("f"); - } - if (es_str_ends(noun, EL_STR("dad"))) { - return EL_STR("f"); - } - if (es_str_ends(noun, EL_STR("tad"))) { - return EL_STR("f"); - } - if (es_str_ends(noun, EL_STR("umbre"))) { - return EL_STR("f"); - } - if (es_str_ends(noun, EL_STR("sis"))) { - return EL_STR("f"); - } - if (es_str_ends(noun, EL_STR("ema"))) { - return EL_STR("m"); - } - if (es_str_ends(noun, EL_STR("ama"))) { - return EL_STR("m"); - } - if (es_str_ends(noun, EL_STR("aje"))) { - return EL_STR("m"); - } - if (es_str_ends(noun, EL_STR("or"))) { - return EL_STR("m"); - } - if (es_str_ends(noun, EL_STR("o"))) { - return EL_STR("m"); - } - if (es_str_ends(noun, EL_STR("a"))) { - return EL_STR("f"); - } - return EL_STR("unknown"); - return 0; -} - -el_val_t es_invariant_plural(el_val_t noun) { - if (str_eq(noun, EL_STR("lunes"))) { - return EL_STR("lunes"); - } - if (str_eq(noun, EL_STR("martes"))) { - return EL_STR("martes"); - } - if (str_eq(noun, EL_STR("miércoles"))) { - return EL_STR("miércoles"); - } - if (str_eq(noun, EL_STR("jueves"))) { - return EL_STR("jueves"); - } - if (str_eq(noun, EL_STR("viernes"))) { - return EL_STR("viernes"); - } - if (str_eq(noun, EL_STR("crisis"))) { - return EL_STR("crisis"); - } - if (str_eq(noun, EL_STR("tesis"))) { - return EL_STR("tesis"); - } - if (str_eq(noun, EL_STR("análisis"))) { - return EL_STR("análisis"); - } - if (str_eq(noun, EL_STR("dosis"))) { - return EL_STR("dosis"); - } - if (str_eq(noun, EL_STR("virus"))) { - return EL_STR("virus"); - } - return EL_STR(""); - return 0; -} - -el_val_t es_pluralize(el_val_t noun) { - el_val_t inv = es_invariant_plural(noun); - if (!str_eq(inv, EL_STR(""))) { - return inv; - } - el_val_t last = es_str_last_char(noun); - if (str_eq(last, EL_STR("z"))) { - return el_str_concat(es_str_drop_last(noun, 1), EL_STR("ces")); - } - if (str_eq(last, EL_STR("a"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(last, EL_STR("e"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(last, EL_STR("i"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(last, EL_STR("o"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(last, EL_STR("u"))) { - return el_str_concat(noun, EL_STR("s")); - } - return el_str_concat(noun, EL_STR("es")); - return 0; -} - -el_val_t es_starts_with_stressed_a(el_val_t noun) { - el_val_t n = str_len(noun); - if (n == 0) { - return 0; - } - el_val_t c0 = str_slice(noun, 0, 1); - if (str_eq(c0, EL_STR("a"))) { - return 1; - } - if (n >= 2) { - el_val_t c1 = str_slice(noun, 1, 2); - if (str_eq(c0, EL_STR("h"))) { - if (str_eq(c1, EL_STR("a"))) { - return 1; - } - } - } - return 0; - return 0; -} - -el_val_t es_agree_article(el_val_t noun, el_val_t definite, el_val_t number) { - el_val_t gender = es_gender(noun); - el_val_t is_plural = str_eq(number, EL_STR("plural")); - el_val_t is_def = str_eq(definite, EL_STR("true")); - if (is_def) { - if (is_plural) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("las"); - } - return EL_STR("los"); - } - if (str_eq(gender, EL_STR("f"))) { - if (es_starts_with_stressed_a(noun)) { - return EL_STR("el"); - } - return EL_STR("la"); - } - return EL_STR("el"); - } - if (is_plural) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("unas"); - } - return EL_STR("unos"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("una"); - } - return EL_STR("un"); - return 0; -} - -el_val_t fr_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t fr_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t fr_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t fr_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t fr_is_vowel_start(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return 0; - } - el_val_t c = str_slice(s, 0, 1); - if (str_eq(c, EL_STR("a"))) { - return 1; - } - if (str_eq(c, EL_STR("e"))) { - return 1; - } - if (str_eq(c, EL_STR("é"))) { - return 1; - } - if (str_eq(c, EL_STR("è"))) { - return 1; - } - if (str_eq(c, EL_STR("ê"))) { - return 1; - } - if (str_eq(c, EL_STR("i"))) { - return 1; - } - if (str_eq(c, EL_STR("î"))) { - return 1; - } - if (str_eq(c, EL_STR("o"))) { - return 1; - } - if (str_eq(c, EL_STR("ô"))) { - return 1; - } - if (str_eq(c, EL_STR("u"))) { - return 1; - } - if (str_eq(c, EL_STR("û"))) { - return 1; - } - if (str_eq(c, EL_STR("h"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t fr_is_known_irregular(el_val_t verb) { - if (str_eq(verb, EL_STR("être"))) { - return 1; - } - if (str_eq(verb, EL_STR("avoir"))) { - return 1; - } - if (str_eq(verb, EL_STR("aller"))) { - return 1; - } - if (str_eq(verb, EL_STR("faire"))) { - return 1; - } - if (str_eq(verb, EL_STR("pouvoir"))) { - return 1; - } - if (str_eq(verb, EL_STR("vouloir"))) { - return 1; - } - if (str_eq(verb, EL_STR("venir"))) { - return 1; - } - if (str_eq(verb, EL_STR("dire"))) { - return 1; - } - if (str_eq(verb, EL_STR("voir"))) { - return 1; - } - if (str_eq(verb, EL_STR("prendre"))) { - return 1; - } - if (str_eq(verb, EL_STR("mettre"))) { - return 1; - } - if (str_eq(verb, EL_STR("savoir"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t fr_verb_group(el_val_t base) { - if (fr_is_known_irregular(base)) { - return EL_STR("irregular"); - } - if (fr_str_ends(base, EL_STR("er"))) { - return EL_STR("er"); - } - if (fr_str_ends(base, EL_STR("ir"))) { - return EL_STR("ir"); - } - if (fr_str_ends(base, EL_STR("re"))) { - return EL_STR("re"); - } - return EL_STR("er"); - return 0; -} - -el_val_t fr_stem(el_val_t base) { - return fr_str_drop_last(base, 2); - return 0; -} - -el_val_t fr_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t fr_irregular_present(el_val_t verb, el_val_t person, el_val_t number) { - el_val_t slot = fr_slot(person, number); - if (str_eq(verb, EL_STR("être"))) { - if (slot == 0) { - return EL_STR("suis"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("est"); - } - if (slot == 3) { - return EL_STR("sommes"); - } - if (slot == 4) { - return EL_STR("etes"); - } - return EL_STR("sont"); - } - if (str_eq(verb, EL_STR("etre"))) { - if (slot == 0) { - return EL_STR("suis"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("est"); - } - if (slot == 3) { - return EL_STR("sommes"); - } - if (slot == 4) { - return EL_STR("etes"); - } - return EL_STR("sont"); - } - if (str_eq(verb, EL_STR("avoir"))) { - if (slot == 0) { - return EL_STR("ai"); - } - if (slot == 1) { - return EL_STR("as"); - } - if (slot == 2) { - return EL_STR("a"); - } - if (slot == 3) { - return EL_STR("avons"); - } - if (slot == 4) { - return EL_STR("avez"); - } - return EL_STR("ont"); - } - if (str_eq(verb, EL_STR("aller"))) { - if (slot == 0) { - return EL_STR("vais"); - } - if (slot == 1) { - return EL_STR("vas"); - } - if (slot == 2) { - return EL_STR("va"); - } - if (slot == 3) { - return EL_STR("allons"); - } - if (slot == 4) { - return EL_STR("allez"); - } - return EL_STR("vont"); - } - if (str_eq(verb, EL_STR("faire"))) { - if (slot == 0) { - return EL_STR("fais"); - } - if (slot == 1) { - return EL_STR("fais"); - } - if (slot == 2) { - return EL_STR("fait"); - } - if (slot == 3) { - return EL_STR("faisons"); - } - if (slot == 4) { - return EL_STR("faites"); - } - return EL_STR("font"); - } - if (str_eq(verb, EL_STR("pouvoir"))) { - if (slot == 0) { - return EL_STR("peux"); - } - if (slot == 1) { - return EL_STR("peux"); - } - if (slot == 2) { - return EL_STR("peut"); - } - if (slot == 3) { - return EL_STR("pouvons"); - } - if (slot == 4) { - return EL_STR("pouvez"); - } - return EL_STR("peuvent"); - } - if (str_eq(verb, EL_STR("vouloir"))) { - if (slot == 0) { - return EL_STR("veux"); - } - if (slot == 1) { - return EL_STR("veux"); - } - if (slot == 2) { - return EL_STR("veut"); - } - if (slot == 3) { - return EL_STR("voulons"); - } - if (slot == 4) { - return EL_STR("voulez"); - } - return EL_STR("veulent"); - } - if (str_eq(verb, EL_STR("venir"))) { - if (slot == 0) { - return EL_STR("viens"); - } - if (slot == 1) { - return EL_STR("viens"); - } - if (slot == 2) { - return EL_STR("vient"); - } - if (slot == 3) { - return EL_STR("venons"); - } - if (slot == 4) { - return EL_STR("venez"); - } - return EL_STR("viennent"); - } - if (str_eq(verb, EL_STR("dire"))) { - if (slot == 0) { - return EL_STR("dis"); - } - if (slot == 1) { - return EL_STR("dis"); - } - if (slot == 2) { - return EL_STR("dit"); - } - if (slot == 3) { - return EL_STR("disons"); - } - if (slot == 4) { - return EL_STR("dites"); - } - return EL_STR("disent"); - } - if (str_eq(verb, EL_STR("voir"))) { - if (slot == 0) { - return EL_STR("vois"); - } - if (slot == 1) { - return EL_STR("vois"); - } - if (slot == 2) { - return EL_STR("voit"); - } - if (slot == 3) { - return EL_STR("voyons"); - } - if (slot == 4) { - return EL_STR("voyez"); - } - return EL_STR("voient"); - } - if (str_eq(verb, EL_STR("prendre"))) { - if (slot == 0) { - return EL_STR("prends"); - } - if (slot == 1) { - return EL_STR("prends"); - } - if (slot == 2) { - return EL_STR("prend"); - } - if (slot == 3) { - return EL_STR("prenons"); - } - if (slot == 4) { - return EL_STR("prenez"); - } - return EL_STR("prennent"); - } - if (str_eq(verb, EL_STR("mettre"))) { - if (slot == 0) { - return EL_STR("mets"); - } - if (slot == 1) { - return EL_STR("mets"); - } - if (slot == 2) { - return EL_STR("met"); - } - if (slot == 3) { - return EL_STR("mettons"); - } - if (slot == 4) { - return EL_STR("mettez"); - } - return EL_STR("mettent"); - } - if (str_eq(verb, EL_STR("savoir"))) { - if (slot == 0) { - return EL_STR("sais"); - } - if (slot == 1) { - return EL_STR("sais"); - } - if (slot == 2) { - return EL_STR("sait"); - } - if (slot == 3) { - return EL_STR("savons"); - } - if (slot == 4) { - return EL_STR("savez"); - } - return EL_STR("savent"); - } - return EL_STR(""); - return 0; -} - -el_val_t fr_regular_present(el_val_t stem, el_val_t vgroup, el_val_t slot) { - if (str_eq(vgroup, EL_STR("er"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("es")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ez")); - } - return el_str_concat(stem, EL_STR("ent")); - } - if (str_eq(vgroup, EL_STR("ir"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("it")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("issons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("issez")); - } - return el_str_concat(stem, EL_STR("issent")); - } - if (slot == 0) { - return el_str_concat(stem, EL_STR("s")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("s")); - } - if (slot == 2) { - return stem; - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ez")); - } - return el_str_concat(stem, EL_STR("ent")); - return 0; -} - -el_val_t fr_future_stem(el_val_t base, el_val_t vgroup) { - if (str_eq(vgroup, EL_STR("re"))) { - return fr_str_drop_last(base, 1); - } - return base; - return 0; -} - -el_val_t fr_regular_future(el_val_t fstem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(fstem, EL_STR("ai")); - } - if (slot == 1) { - return el_str_concat(fstem, EL_STR("as")); - } - if (slot == 2) { - return el_str_concat(fstem, EL_STR("a")); - } - if (slot == 3) { - return el_str_concat(fstem, EL_STR("ons")); - } - if (slot == 4) { - return el_str_concat(fstem, EL_STR("ez")); - } - return el_str_concat(fstem, EL_STR("ont")); - return 0; -} - -el_val_t fr_irregular_future_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("être"))) { - return EL_STR("ser"); - } - if (str_eq(verb, EL_STR("avoir"))) { - return EL_STR("aur"); - } - if (str_eq(verb, EL_STR("aller"))) { - return EL_STR("ir"); - } - if (str_eq(verb, EL_STR("faire"))) { - return EL_STR("fer"); - } - if (str_eq(verb, EL_STR("pouvoir"))) { - return EL_STR("pourr"); - } - if (str_eq(verb, EL_STR("vouloir"))) { - return EL_STR("voudr"); - } - if (str_eq(verb, EL_STR("venir"))) { - return EL_STR("viendr"); - } - if (str_eq(verb, EL_STR("voir"))) { - return EL_STR("verr"); - } - if (str_eq(verb, EL_STR("savoir"))) { - return EL_STR("saur"); - } - return EL_STR(""); - return 0; -} - -el_val_t fr_imperfect_stem(el_val_t base, el_val_t vgroup) { - if (str_eq(base, EL_STR("être"))) { - return EL_STR("ét"); - } - return fr_stem(base); - return 0; -} - -el_val_t fr_regular_imperfect(el_val_t istem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(istem, EL_STR("ais")); - } - if (slot == 1) { - return el_str_concat(istem, EL_STR("ais")); - } - if (slot == 2) { - return el_str_concat(istem, EL_STR("ait")); - } - if (slot == 3) { - return el_str_concat(istem, EL_STR("ions")); - } - if (slot == 4) { - return el_str_concat(istem, EL_STR("iez")); - } - return el_str_concat(istem, EL_STR("aient")); - return 0; -} - -el_val_t fr_uses_etre(el_val_t verb) { - if (str_eq(verb, EL_STR("aller"))) { - return 1; - } - if (str_eq(verb, EL_STR("venir"))) { - return 1; - } - if (str_eq(verb, EL_STR("partir"))) { - return 1; - } - if (str_eq(verb, EL_STR("arriver"))) { - return 1; - } - if (str_eq(verb, EL_STR("entrer"))) { - return 1; - } - if (str_eq(verb, EL_STR("sortir"))) { - return 1; - } - if (str_eq(verb, EL_STR("naître"))) { - return 1; - } - if (str_eq(verb, EL_STR("mourir"))) { - return 1; - } - if (str_eq(verb, EL_STR("rester"))) { - return 1; - } - if (str_eq(verb, EL_STR("tomber"))) { - return 1; - } - if (str_eq(verb, EL_STR("monter"))) { - return 1; - } - if (str_eq(verb, EL_STR("descendre"))) { - return 1; - } - if (str_eq(verb, EL_STR("rentrer"))) { - return 1; - } - if (str_eq(verb, EL_STR("retourner"))) { - return 1; - } - if (str_eq(verb, EL_STR("passer"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t fr_past_participle(el_val_t verb) { - if (str_eq(verb, EL_STR("être"))) { - return EL_STR("été"); - } - if (str_eq(verb, EL_STR("avoir"))) { - return EL_STR("eu"); - } - if (str_eq(verb, EL_STR("aller"))) { - return EL_STR("allé"); - } - if (str_eq(verb, EL_STR("faire"))) { - return EL_STR("fait"); - } - if (str_eq(verb, EL_STR("pouvoir"))) { - return EL_STR("pu"); - } - if (str_eq(verb, EL_STR("vouloir"))) { - return EL_STR("voulu"); - } - if (str_eq(verb, EL_STR("venir"))) { - return EL_STR("venu"); - } - if (str_eq(verb, EL_STR("dire"))) { - return EL_STR("dit"); - } - if (str_eq(verb, EL_STR("voir"))) { - return EL_STR("vu"); - } - if (str_eq(verb, EL_STR("prendre"))) { - return EL_STR("pris"); - } - if (str_eq(verb, EL_STR("mettre"))) { - return EL_STR("mis"); - } - if (str_eq(verb, EL_STR("savoir"))) { - return EL_STR("su"); - } - if (str_eq(verb, EL_STR("naître"))) { - return EL_STR("né"); - } - if (str_eq(verb, EL_STR("mourir"))) { - return EL_STR("mort"); - } - el_val_t vgroup = fr_verb_group(verb); - if (str_eq(vgroup, EL_STR("er"))) { - return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("é")); - } - if (str_eq(vgroup, EL_STR("ir"))) { - return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("i")); - } - return el_str_concat(fr_str_drop_last(verb, 2), EL_STR("u")); - return 0; -} - -el_val_t fr_avoir_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ai"); - } - if (slot == 1) { - return EL_STR("as"); - } - if (slot == 2) { - return EL_STR("a"); - } - if (slot == 3) { - return EL_STR("avons"); - } - if (slot == 4) { - return EL_STR("avez"); - } - return EL_STR("ont"); - return 0; -} - -el_val_t fr_etre_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("suis"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("est"); - } - if (slot == 3) { - return EL_STR("sommes"); - } - if (slot == 4) { - return EL_STR("êtes"); - } - return EL_STR("sont"); - return 0; -} - -el_val_t fr_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = fr_slot(person, number); - if (str_eq(tense, EL_STR("present"))) { - el_val_t irreg = fr_irregular_present(verb, person, number); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - el_val_t vgroup = fr_verb_group(verb); - el_val_t stem = fr_stem(verb); - return fr_regular_present(stem, vgroup, slot); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t irreg_stem = fr_irregular_future_stem(verb); - if (!str_eq(irreg_stem, EL_STR(""))) { - return fr_regular_future(irreg_stem, slot); - } - el_val_t vgroup = fr_verb_group(verb); - el_val_t fstem = fr_future_stem(verb, vgroup); - return fr_regular_future(fstem, slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - el_val_t vgroup = fr_verb_group(verb); - el_val_t istem = fr_imperfect_stem(verb, vgroup); - return fr_regular_imperfect(istem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - el_val_t pp = fr_past_participle(verb); - if (fr_uses_etre(verb)) { - el_val_t aux = fr_etre_present(slot); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), pp); - } - el_val_t aux = fr_avoir_present(slot); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), pp); - } - return verb; - return 0; -} - -el_val_t fr_gender(el_val_t noun) { - if (fr_str_ends(noun, EL_STR("tion"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("sion"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("xion"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ure"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ette"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ance"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ence"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ité"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("té"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("tié"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ude"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ade"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ée"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ie"))) { - return EL_STR("f"); - } - if (fr_str_ends(noun, EL_STR("ment"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("age"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("isme"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("eau"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("eur"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("er"))) { - return EL_STR("m"); - } - if (fr_str_ends(noun, EL_STR("é"))) { - return EL_STR("m"); - } - return EL_STR("unknown"); - return 0; -} - -el_val_t fr_invariant_plural(el_val_t noun) { - el_val_t last = fr_str_last_char(noun); - if (str_eq(last, EL_STR("s"))) { - return noun; - } - if (str_eq(last, EL_STR("x"))) { - return noun; - } - if (str_eq(last, EL_STR("z"))) { - return noun; - } - return EL_STR(""); - return 0; -} - -el_val_t fr_pluralize(el_val_t noun) { - el_val_t inv = fr_invariant_plural(noun); - if (!str_eq(inv, EL_STR(""))) { - return inv; - } - if (fr_str_ends(noun, EL_STR("eau"))) { - return el_str_concat(noun, EL_STR("x")); - } - if (fr_str_ends(noun, EL_STR("eu"))) { - return el_str_concat(noun, EL_STR("x")); - } - if (fr_str_ends(noun, EL_STR("al"))) { - return el_str_concat(fr_str_drop_last(noun, 2), EL_STR("aux")); - } - if (fr_str_ends(noun, EL_STR("ail"))) { - return el_str_concat(fr_str_drop_last(noun, 3), EL_STR("aux")); - } - return el_str_concat(noun, EL_STR("s")); - return 0; -} - -el_val_t fr_agree_article(el_val_t noun, el_val_t definite, el_val_t number) { - el_val_t gender = fr_gender(noun); - el_val_t is_plural = str_eq(number, EL_STR("plural")); - el_val_t is_def = str_eq(definite, EL_STR("true")); - el_val_t vowel_start = fr_is_vowel_start(noun); - if (is_def) { - if (is_plural) { - return EL_STR("les"); - } - if (vowel_start) { - return EL_STR("l'"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("la"); - } - return EL_STR("le"); - } - if (is_plural) { - return EL_STR("des"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("une"); - } - return EL_STR("un"); - return 0; -} - -el_val_t fr_subject_starts_vowel(el_val_t subject) { - if (str_eq(subject, EL_STR("il"))) { - return 1; - } - if (str_eq(subject, EL_STR("elle"))) { - return 1; - } - if (str_eq(subject, EL_STR("ils"))) { - return 1; - } - if (str_eq(subject, EL_STR("elles"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t fr_verb_ends_vowel(el_val_t verb_form) { - el_val_t last = fr_str_last_char(verb_form); - if (str_eq(last, EL_STR("a"))) { - return 1; - } - if (str_eq(last, EL_STR("e"))) { - return 1; - } - if (str_eq(last, EL_STR("é"))) { - return 1; - } - if (str_eq(last, EL_STR("i"))) { - return 1; - } - if (str_eq(last, EL_STR("o"))) { - return 1; - } - if (str_eq(last, EL_STR("u"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t fr_question_inversion(el_val_t subject, el_val_t verb_form) { - if (str_eq(subject, EL_STR("je"))) { - return el_str_concat(el_str_concat(EL_STR("est-ce que je "), verb_form), EL_STR(" ?")); - } - el_val_t need_t = 0; - if (fr_verb_ends_vowel(verb_form)) { - if (fr_subject_starts_vowel(subject)) { - need_t = 1; - } - } - if (need_t) { - return el_str_concat(el_str_concat(el_str_concat(verb_form, EL_STR("-t-")), subject), EL_STR(" ?")); - } - return el_str_concat(el_str_concat(el_str_concat(verb_form, EL_STR("-")), subject), EL_STR(" ?")); - return 0; -} - -el_val_t de_article_def(el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("die"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("die"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("den"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("der"); - } - return EL_STR("die"); - } - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("der"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("den"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("dem"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("des"); - } - return EL_STR("der"); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("die"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("die"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("der"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("der"); - } - return EL_STR("die"); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("das"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("das"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("dem"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("des"); - } - return EL_STR("das"); - return 0; -} - -el_val_t de_article_indef(el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR(""); - } - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("ein"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("einen"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("einem"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("eines"); - } - return EL_STR("ein"); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("eine"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("eine"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("einer"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("einer"); - } - return EL_STR("eine"); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("ein"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("ein"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("einem"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("eines"); - } - return EL_STR("ein"); - return 0; -} - -el_val_t de_article(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t definite) { - if (str_eq(definite, EL_STR("def"))) { - return de_article_def(gender, gram_case, number); - } - if (str_eq(definite, EL_STR("indef"))) { - return de_article_indef(gender, gram_case, number); - } - return EL_STR(""); - return 0; -} - -el_val_t de_adj_ending(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t article_type) { - if (str_eq(article_type, EL_STR("def"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("en"); - } - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - return EL_STR("en"); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("e"); - } - return EL_STR("en"); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("e"); - } - return EL_STR("en"); - } - if (str_eq(article_type, EL_STR("indef"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("en"); - } - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("er"); - } - return EL_STR("en"); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("e"); - } - return EL_STR("en"); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("es"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("es"); - } - return EL_STR("en"); - } - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("en"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("er"); - } - return EL_STR("e"); - } - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("er"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("en"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("em"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("en"); - } - return EL_STR("er"); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("er"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("er"); - } - return EL_STR("e"); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("es"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("es"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("em"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("en"); - } - return EL_STR("es"); - return 0; -} - -el_val_t de_noun_plural(el_val_t noun, el_val_t gender) { - if (str_eq(noun, EL_STR("Mann"))) { - return EL_STR("Männer"); - } - if (str_eq(noun, EL_STR("Kind"))) { - return EL_STR("Kinder"); - } - if (str_eq(noun, EL_STR("Haus"))) { - return EL_STR("Häuser"); - } - if (str_eq(noun, EL_STR("Buch"))) { - return EL_STR("Bücher"); - } - if (str_eq(noun, EL_STR("Mutter"))) { - return EL_STR("Mütter"); - } - if (str_eq(noun, EL_STR("Vater"))) { - return EL_STR("Väter"); - } - if (str_eq(noun, EL_STR("Bruder"))) { - return EL_STR("Brüder"); - } - if (str_eq(noun, EL_STR("Tochter"))) { - return EL_STR("Töchter"); - } - if (str_eq(noun, EL_STR("Nacht"))) { - return EL_STR("Nächte"); - } - if (str_eq(noun, EL_STR("Stadt"))) { - return EL_STR("Städte"); - } - if (str_eq(noun, EL_STR("Wort"))) { - return EL_STR("Wörter"); - } - if (str_eq(noun, EL_STR("Gott"))) { - return EL_STR("Götter"); - } - if (str_eq(noun, EL_STR("Wald"))) { - return EL_STR("Wälder"); - } - if (str_eq(noun, EL_STR("Band"))) { - return EL_STR("Bände"); - } - if (str_eq(noun, EL_STR("Hund"))) { - return EL_STR("Hunde"); - } - if (str_eq(noun, EL_STR("Baum"))) { - return EL_STR("Bäume"); - } - if (str_eq(noun, EL_STR("Raum"))) { - return EL_STR("Räume"); - } - if (str_eq(noun, EL_STR("Traum"))) { - return EL_STR("Träume"); - } - if (str_eq(noun, EL_STR("Zug"))) { - return EL_STR("Züge"); - } - if (str_eq(noun, EL_STR("Flug"))) { - return EL_STR("Flüge"); - } - if (str_eq(noun, EL_STR("Fuß"))) { - return EL_STR("Füße"); - } - if (str_eq(noun, EL_STR("Gruß"))) { - return EL_STR("Grüße"); - } - if (str_eq(noun, EL_STR("Geist"))) { - return EL_STR("Geister"); - } - if (str_eq(noun, EL_STR("Schwanz"))) { - return EL_STR("Schwänze"); - } - if (str_eq(noun, EL_STR("Stuhl"))) { - return EL_STR("Stühle"); - } - if (str_eq(noun, EL_STR("Stuhl"))) { - return EL_STR("Stühle"); - } - if (str_eq(noun, EL_STR("Sohn"))) { - return EL_STR("Söhne"); - } - if (str_eq(noun, EL_STR("Ton"))) { - return EL_STR("Töne"); - } - if (str_eq(noun, EL_STR("Fluss"))) { - return EL_STR("Flüsse"); - } - if (str_eq(noun, EL_STR("Frau"))) { - return EL_STR("Frauen"); - } - if (str_eq(noun, EL_STR("Straße"))) { - return EL_STR("Straßen"); - } - if (str_eq(noun, EL_STR("Schule"))) { - return EL_STR("Schulen"); - } - if (str_eq(noun, EL_STR("Blume"))) { - return EL_STR("Blumen"); - } - if (str_eq(noun, EL_STR("Katze"))) { - return EL_STR("Katzen"); - } - if (str_eq(noun, EL_STR("Sprache"))) { - return EL_STR("Sprachen"); - } - if (str_eq(noun, EL_STR("Kirche"))) { - return EL_STR("Kirchen"); - } - if (str_eq(noun, EL_STR("Tür"))) { - return EL_STR("Türen"); - } - if (str_eq(noun, EL_STR("Uhr"))) { - return EL_STR("Uhren"); - } - if (str_eq(noun, EL_STR("Zahl"))) { - return EL_STR("Zahlen"); - } - if (str_eq(noun, EL_STR("Wahl"))) { - return EL_STR("Wahlen"); - } - if (str_eq(noun, EL_STR("Bahn"))) { - return EL_STR("Bahnen"); - } - if (str_eq(noun, EL_STR("Zahn"))) { - return EL_STR("Zähne"); - } - if (str_eq(noun, EL_STR("Nase"))) { - return EL_STR("Nasen"); - } - if (str_eq(noun, EL_STR("Maus"))) { - return EL_STR("Mäuse"); - } - if (str_eq(noun, EL_STR("Mädchen"))) { - return EL_STR("Mädchen"); - } - if (str_eq(noun, EL_STR("Messer"))) { - return EL_STR("Messer"); - } - if (str_eq(noun, EL_STR("Fenster"))) { - return EL_STR("Fenster"); - } - if (str_eq(noun, EL_STR("Zimmer"))) { - return EL_STR("Zimmer"); - } - if (str_eq(noun, EL_STR("Wasser"))) { - return EL_STR("Wasser"); - } - if (str_eq(noun, EL_STR("Bett"))) { - return EL_STR("Betten"); - } - if (str_eq(noun, EL_STR("Auto"))) { - return EL_STR("Autos"); - } - if (str_eq(noun, EL_STR("Kino"))) { - return EL_STR("Kinos"); - } - if (str_eq(noun, EL_STR("Radio"))) { - return EL_STR("Radios"); - } - if (str_eq(noun, EL_STR("Foto"))) { - return EL_STR("Fotos"); - } - if (str_eq(noun, EL_STR("Cafe"))) { - return EL_STR("Cafes"); - } - if (str_eq(noun, EL_STR("Zentrum"))) { - return EL_STR("Zentren"); - } - if (str_eq(noun, EL_STR("Museum"))) { - return EL_STR("Museen"); - } - if (str_eq(noun, EL_STR("Gymnasium"))) { - return EL_STR("Gymnasien"); - } - if (str_eq(noun, EL_STR("Studium"))) { - return EL_STR("Studien"); - } - if (str_eq(noun, EL_STR("Datum"))) { - return EL_STR("Daten"); - } - if (str_ends_with(noun, EL_STR("chen"))) { - return noun; - } - if (str_ends_with(noun, EL_STR("lein"))) { - return noun; - } - if (str_ends_with(noun, EL_STR("um"))) { - return el_str_concat(str_drop_last(noun, 2), EL_STR("en")); - } - if (str_ends_with(noun, EL_STR("a"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_ends_with(noun, EL_STR("o"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_ends_with(noun, EL_STR("i"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_ends_with(noun, EL_STR("u"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_ends_with(noun, EL_STR("y"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(gender, EL_STR("f"))) { - if (str_ends_with(noun, EL_STR("e"))) { - return el_str_concat(noun, EL_STR("n")); - } - if (str_ends_with(noun, EL_STR("in"))) { - return el_str_concat(noun, EL_STR("nen")); - } - return el_str_concat(noun, EL_STR("en")); - } - return el_str_concat(noun, EL_STR("e")); - return 0; -} - -el_val_t de_case_ending(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("Herr"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("Herr"); - } - return EL_STR("Herrn"); - } - return EL_STR("Herren"); - } - if (str_eq(noun, EL_STR("Mensch"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("Mensch"); - } - return EL_STR("Menschen"); - } - return EL_STR("Menschen"); - } - if (str_eq(noun, EL_STR("Student"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("Student"); - } - return EL_STR("Studenten"); - } - return EL_STR("Studenten"); - } - if (str_eq(noun, EL_STR("Kollege"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("Kollege"); - } - return EL_STR("Kollegen"); - } - return EL_STR("Kollegen"); - } - if (str_eq(noun, EL_STR("Name"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("Name"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("Namens"); - } - return EL_STR("Namen"); - } - return EL_STR("Namen"); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("gen"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_ends_with(noun, EL_STR("s"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_ends_with(noun, EL_STR("x"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_ends_with(noun, EL_STR("z"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_ends_with(noun, EL_STR("sch"))) { - return el_str_concat(noun, EL_STR("es")); - } - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(gender, EL_STR("n"))) { - if (str_ends_with(noun, EL_STR("s"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_ends_with(noun, EL_STR("x"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_ends_with(noun, EL_STR("z"))) { - return el_str_concat(noun, EL_STR("es")); - } - return el_str_concat(noun, EL_STR("s")); - } - } - return noun; - } - if (str_eq(gram_case, EL_STR("dat"))) { - el_val_t pl = de_noun_plural(noun, gender); - if (str_ends_with(pl, EL_STR("n"))) { - return pl; - } - if (str_ends_with(pl, EL_STR("s"))) { - return pl; - } - return el_str_concat(pl, EL_STR("n")); - } - return de_noun_plural(noun, gender); - return 0; -} - -el_val_t de_conjugate_weak(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("e")); - } - if (str_eq(person, EL_STR("2"))) { - if (str_ends_with(stem, EL_STR("t"))) { - return el_str_concat(stem, EL_STR("est")); - } - if (str_ends_with(stem, EL_STR("d"))) { - return el_str_concat(stem, EL_STR("est")); - } - return el_str_concat(stem, EL_STR("st")); - } - if (str_ends_with(stem, EL_STR("t"))) { - return el_str_concat(stem, EL_STR("et")); - } - if (str_ends_with(stem, EL_STR("d"))) { - return el_str_concat(stem, EL_STR("et")); - } - return el_str_concat(stem, EL_STR("t")); - } - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("en")); - } - if (str_eq(person, EL_STR("2"))) { - if (str_ends_with(stem, EL_STR("t"))) { - return el_str_concat(stem, EL_STR("et")); - } - if (str_ends_with(stem, EL_STR("d"))) { - return el_str_concat(stem, EL_STR("et")); - } - return el_str_concat(stem, EL_STR("t")); - } - return el_str_concat(stem, EL_STR("en")); - } - if (str_eq(tense, EL_STR("past"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("te")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("test")); - } - return el_str_concat(stem, EL_STR("te")); - } - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("ten")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("tet")); - } - return el_str_concat(stem, EL_STR("ten")); - } - return el_str_concat(stem, EL_STR("en")); - return 0; -} - -el_val_t de_irregular_present(el_val_t verb, el_val_t person, el_val_t number) { - if (str_eq(verb, EL_STR("sein"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("bin"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("bist"); - } - return EL_STR("ist"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("sind"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("seid"); - } - return EL_STR("sind"); - } - if (str_eq(verb, EL_STR("haben"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("habe"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("hast"); - } - return EL_STR("hat"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("haben"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("habt"); - } - return EL_STR("haben"); - } - if (str_eq(verb, EL_STR("werden"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("werde"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wirst"); - } - return EL_STR("wird"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("werden"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("werdet"); - } - return EL_STR("werden"); - } - if (str_eq(verb, EL_STR("gehen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("gehe"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("gehst"); - } - return EL_STR("geht"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("gehen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("geht"); - } - return EL_STR("gehen"); - } - if (str_eq(verb, EL_STR("kommen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("komme"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("kommst"); - } - return EL_STR("kommt"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("kommen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("kommt"); - } - return EL_STR("kommen"); - } - if (str_eq(verb, EL_STR("sehen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("sehe"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("siehst"); - } - return EL_STR("sieht"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("sehen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("seht"); - } - return EL_STR("sehen"); - } - if (str_eq(verb, EL_STR("essen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("esse"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("isst"); - } - return EL_STR("isst"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("essen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("esst"); - } - return EL_STR("essen"); - } - if (str_eq(verb, EL_STR("geben"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("gebe"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("gibst"); - } - return EL_STR("gibt"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("geben"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("gebt"); - } - return EL_STR("geben"); - } - if (str_eq(verb, EL_STR("nehmen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("nehme"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("nimmst"); - } - return EL_STR("nimmt"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("nehmen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("nehmt"); - } - return EL_STR("nehmen"); - } - if (str_eq(verb, EL_STR("fahren"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("fahre"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("fährst"); - } - return EL_STR("fährt"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("fahren"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("fahrt"); - } - return EL_STR("fahren"); - } - if (str_eq(verb, EL_STR("laufen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("laufe"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("läufst"); - } - return EL_STR("läuft"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("laufen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("lauft"); - } - return EL_STR("laufen"); - } - if (str_eq(verb, EL_STR("wissen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("weiß"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("weißt"); - } - return EL_STR("weiß"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("wissen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wisst"); - } - return EL_STR("wissen"); - } - if (str_eq(verb, EL_STR("können"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("kann"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("kannst"); - } - return EL_STR("kann"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("können"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("könnt"); - } - return EL_STR("können"); - } - if (str_eq(verb, EL_STR("müssen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("muss"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("musst"); - } - return EL_STR("muss"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("müssen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("müsst"); - } - return EL_STR("müssen"); - } - if (str_eq(verb, EL_STR("wollen"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("will"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("willst"); - } - return EL_STR("will"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("wollen"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wollt"); - } - return EL_STR("wollen"); - } - return EL_STR(""); - return 0; -} - -el_val_t de_strong_past_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("gehen"))) { - return EL_STR("ging"); - } - if (str_eq(verb, EL_STR("kommen"))) { - return EL_STR("kam"); - } - if (str_eq(verb, EL_STR("sehen"))) { - return EL_STR("sah"); - } - if (str_eq(verb, EL_STR("geben"))) { - return EL_STR("gab"); - } - if (str_eq(verb, EL_STR("nehmen"))) { - return EL_STR("nahm"); - } - if (str_eq(verb, EL_STR("fahren"))) { - return EL_STR("fuhr"); - } - if (str_eq(verb, EL_STR("laufen"))) { - return EL_STR("lief"); - } - if (str_eq(verb, EL_STR("schreiben"))) { - return EL_STR("schrieb"); - } - if (str_eq(verb, EL_STR("bleiben"))) { - return EL_STR("blieb"); - } - if (str_eq(verb, EL_STR("steigen"))) { - return EL_STR("stieg"); - } - if (str_eq(verb, EL_STR("lesen"))) { - return EL_STR("las"); - } - if (str_eq(verb, EL_STR("sprechen"))) { - return EL_STR("sprach"); - } - if (str_eq(verb, EL_STR("treffen"))) { - return EL_STR("traf"); - } - if (str_eq(verb, EL_STR("essen"))) { - return EL_STR("aß"); - } - if (str_eq(verb, EL_STR("trinken"))) { - return EL_STR("trank"); - } - if (str_eq(verb, EL_STR("finden"))) { - return EL_STR("fand"); - } - if (str_eq(verb, EL_STR("denken"))) { - return EL_STR("dachte"); - } - if (str_eq(verb, EL_STR("bringen"))) { - return EL_STR("brachte"); - } - if (str_eq(verb, EL_STR("stehen"))) { - return EL_STR("stand"); - } - if (str_eq(verb, EL_STR("liegen"))) { - return EL_STR("lag"); - } - if (str_eq(verb, EL_STR("sitzen"))) { - return EL_STR("saß"); - } - if (str_eq(verb, EL_STR("fallen"))) { - return EL_STR("fiel"); - } - if (str_eq(verb, EL_STR("halten"))) { - return EL_STR("hielt"); - } - if (str_eq(verb, EL_STR("rufen"))) { - return EL_STR("rief"); - } - if (str_eq(verb, EL_STR("tragen"))) { - return EL_STR("trug"); - } - if (str_eq(verb, EL_STR("schlagen"))) { - return EL_STR("schlug"); - } - if (str_eq(verb, EL_STR("ziehen"))) { - return EL_STR("zog"); - } - if (str_eq(verb, EL_STR("wachsen"))) { - return EL_STR("wuchs"); - } - if (str_eq(verb, EL_STR("helfen"))) { - return EL_STR("half"); - } - if (str_eq(verb, EL_STR("werfen"))) { - return EL_STR("warf"); - } - return EL_STR(""); - return 0; -} - -el_val_t de_norm_number(el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("sg"); - } - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("pl"); - } - return number; - return 0; -} - -el_val_t de_norm_person(el_val_t person) { - if (str_eq(person, EL_STR("first"))) { - return EL_STR("1"); - } - if (str_eq(person, EL_STR("second"))) { - return EL_STR("2"); - } - if (str_eq(person, EL_STR("third"))) { - return EL_STR("3"); - } - return person; - return 0; -} - -el_val_t de_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - number = de_norm_number(number); - person = de_norm_person(person); - if (str_eq(tense, EL_STR("future"))) { - el_val_t aux = de_irregular_present(EL_STR("werden"), person, number); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), verb); - } - if (str_eq(verb, EL_STR("sein"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("sein"), person, number); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("war"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("warst"); - } - return EL_STR("war"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("waren"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wart"); - } - return EL_STR("waren"); - } - if (str_eq(verb, EL_STR("haben"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("haben"), person, number); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("hatte"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("hattest"); - } - return EL_STR("hatte"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("hatten"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("hattet"); - } - return EL_STR("hatten"); - } - if (str_eq(verb, EL_STR("wissen"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("wissen"), person, number); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("wusste"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wusstest"); - } - return EL_STR("wusste"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("wussten"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("wusstet"); - } - return EL_STR("wussten"); - } - if (str_eq(verb, EL_STR("können"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("können"), person, number); - } - return de_conjugate_weak(EL_STR("konnt"), EL_STR("past"), person, number); - } - if (str_eq(verb, EL_STR("müssen"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("müssen"), person, number); - } - return de_conjugate_weak(EL_STR("musst"), EL_STR("past"), person, number); - } - if (str_eq(verb, EL_STR("wollen"))) { - if (str_eq(tense, EL_STR("present"))) { - return de_irregular_present(EL_STR("wollen"), person, number); - } - return de_conjugate_weak(EL_STR("wollt"), EL_STR("past"), person, number); - } - if (str_eq(tense, EL_STR("present"))) { - el_val_t irr = de_irregular_present(verb, person, number); - if (!str_eq(irr, EL_STR(""))) { - return irr; - } - el_val_t stem = str_drop_last(verb, 2); - return de_conjugate_weak(stem, EL_STR("present"), person, number); - } - if (str_eq(tense, EL_STR("past"))) { - el_val_t ps = de_strong_past_stem(verb); - if (!str_eq(ps, EL_STR(""))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return ps; - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(ps, EL_STR("st")); - } - return ps; - } - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(ps, EL_STR("en")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(ps, EL_STR("t")); - } - return el_str_concat(ps, EL_STR("en")); - } - el_val_t stem = str_drop_last(verb, 2); - return de_conjugate_weak(stem, EL_STR("past"), person, number); - } - return verb; - return 0; -} - -el_val_t ru_gender(el_val_t noun) { - el_val_t n = str_len(noun); - if (n == 0) { - return EL_STR("m"); - } - el_val_t last = str_slice(noun, (n - 1), n); - if (str_eq(last, EL_STR("о"))) { - return EL_STR("n"); - } - if (str_eq(last, EL_STR("е"))) { - return EL_STR("n"); - } - if (str_eq(last, EL_STR("ё"))) { - return EL_STR("n"); - } - if (str_eq(last, EL_STR("а"))) { - return EL_STR("f"); - } - if (str_eq(last, EL_STR("я"))) { - return EL_STR("f"); - } - if (str_eq(last, EL_STR("ь"))) { - return EL_STR("f"); - } - return EL_STR("m"); - return 0; -} - -el_val_t ru_stem_type(el_val_t noun, el_val_t gender) { - el_val_t n = str_len(noun); - if (n == 0) { - return EL_STR("hard"); - } - el_val_t last = str_slice(noun, (n - 1), n); - if (str_eq(last, EL_STR("ь"))) { - return EL_STR("soft"); - } - if (str_eq(last, EL_STR("й"))) { - return EL_STR("soft"); - } - if (str_eq(last, EL_STR("я"))) { - return EL_STR("soft"); - } - if (str_eq(last, EL_STR("е"))) { - return EL_STR("soft"); - } - if (str_eq(last, EL_STR("ж"))) { - return EL_STR("sibilant"); - } - if (str_eq(last, EL_STR("ш"))) { - return EL_STR("sibilant"); - } - if (str_eq(last, EL_STR("ч"))) { - return EL_STR("sibilant"); - } - if (str_eq(last, EL_STR("щ"))) { - return EL_STR("sibilant"); - } - return EL_STR("hard"); - return 0; -} - -el_val_t ru_noun_case(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("человек"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("человек"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("человека"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("человека"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("человеку"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("человеком"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("человеке"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("люди"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("людей"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("людей"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("людям"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("людьми"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("людях"); - } - return EL_STR("люди"); - } - if (str_eq(noun, EL_STR("ребёнок"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("ребёнок"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("ребёнка"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("ребёнка"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("ребёнку"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("ребёнком"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("ребёнке"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("дети"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("детей"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("детей"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("детям"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("детьми"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("детях"); - } - return EL_STR("дети"); - } - if (str_eq(noun, EL_STR("время"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("время"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("время"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("времени"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("времени"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("временем"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("времени"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("времена"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("времена"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("времён"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("временам"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("временами"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("временах"); - } - return EL_STR("времена"); - } - if (str_eq(noun, EL_STR("имя"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("имя"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("имя"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("имени"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("имени"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("именем"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("имени"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("имена"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("имена"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("имён"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("именам"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("именами"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("именах"); - } - return EL_STR("имена"); - } - if (str_eq(noun, EL_STR("путь"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("путь"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("путь"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("пути"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("пути"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("путём"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("пути"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("пути"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("пути"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("путей"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("путям"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("путями"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("путях"); - } - return EL_STR("пути"); - } - if (str_eq(noun, EL_STR("мать"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("мать"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("мать"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("матери"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("матери"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("матерью"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("матери"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("матери"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("матерей"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("матерей"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("матерям"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("матерями"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("матерях"); - } - return EL_STR("матери"); - } - if (str_eq(noun, EL_STR("дочь"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("дочь"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("дочь"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("дочери"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("дочери"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("дочерью"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("дочери"); - } - } - if (str_eq(gram_case, EL_STR("nom"))) { - return EL_STR("дочери"); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return EL_STR("дочерей"); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return EL_STR("дочерей"); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return EL_STR("дочерям"); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return EL_STR("дочерями"); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return EL_STR("дочерях"); - } - return EL_STR("дочери"); - } - el_val_t stype = ru_stem_type(noun, gender); - return ru_decline_regular(noun, gender, stype, gram_case, number); - return 0; -} - -el_val_t ru_decline_regular(el_val_t noun, el_val_t gender, el_val_t stype, el_val_t gram_case, el_val_t number) { - if (str_eq(gender, EL_STR("m"))) { - return ru_decline_masc(noun, stype, gram_case, number); - } - if (str_eq(gender, EL_STR("f"))) { - return ru_decline_fem(noun, stype, gram_case, number); - } - return ru_decline_neut(noun, stype, gram_case, number); - return 0; -} - -el_val_t ru_decline_masc(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number) { - el_val_t n = str_len(noun); - if (str_eq(stype, EL_STR("soft"))) { - el_val_t last = str_slice(noun, (n - 1), n); - if (str_eq(last, EL_STR("й"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ю")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ем")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ев")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ях")); - } - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(last, EL_STR("ь"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ю")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ём")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ей")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ях")); - } - return el_str_concat(stem, EL_STR("и")); - } - } - el_val_t stem = noun; - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("а")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("у")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ом")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return stem; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ы")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("ы")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ов")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ам")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ами")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ах")); - } - return el_str_concat(stem, EL_STR("ы")); - return 0; -} - -el_val_t ru_decline_fem(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number) { - el_val_t n = str_len(noun); - el_val_t last = str_slice(noun, (n - 1), n); - if (str_eq(last, EL_STR("ь"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ью")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("и")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ей")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ях")); - } - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(last, EL_STR("я"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("ю")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("е")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ей")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ей")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ях")); - } - return el_str_concat(stem, EL_STR("и")); - } - if (str_eq(last, EL_STR("а"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("у")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ы")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("е")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ой")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ы")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("ы")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ам")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ами")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ах")); - } - return el_str_concat(stem, EL_STR("ы")); - } - return noun; - return 0; -} - -el_val_t ru_decline_neut(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number) { - el_val_t n = str_len(noun); - el_val_t last = str_slice(noun, (n - 1), n); - if (str_ends_with(noun, EL_STR("ие"))) { - el_val_t stem = str_drop_last(noun, 2); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ия")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ию")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ием")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ии")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ия")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("ия")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ий")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("иям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("иями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("иях")); - } - return el_str_concat(stem, EL_STR("ия")); - } - if (str_eq(last, EL_STR("е"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ю")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ем")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return noun; - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ей")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ям")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ями")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ях")); - } - return el_str_concat(stem, EL_STR("я")); - } - if (str_eq(last, EL_STR("о"))) { - el_val_t stem = str_drop_last(noun, 1); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("acc"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("а")); - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("у")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ом")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("е")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("а")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("а")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("dat"))) { - return el_str_concat(stem, EL_STR("ам")); - } - if (str_eq(gram_case, EL_STR("ins"))) { - return el_str_concat(stem, EL_STR("ами")); - } - if (str_eq(gram_case, EL_STR("pre"))) { - return el_str_concat(stem, EL_STR("ах")); - } - return el_str_concat(stem, EL_STR("а")); - } - return noun; - return 0; -} - -el_val_t ru_past_agree(el_val_t verb_stem, el_val_t gender, el_val_t number) { - if (str_eq(number, EL_STR("pl"))) { - return el_str_concat(verb_stem, EL_STR("и")); - } - if (str_eq(gender, EL_STR("f"))) { - return el_str_concat(verb_stem, EL_STR("а")); - } - if (str_eq(gender, EL_STR("n"))) { - return el_str_concat(verb_stem, EL_STR("о")); - } - return verb_stem; - return 0; -} - -el_val_t ru_conjugate_1st(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number) { - if (str_eq(tense, EL_STR("present"))) { - el_val_t n = str_len(stem); - el_val_t last = str_slice(stem, (n - 1), n); - el_val_t vowels = 0; - vowels = (((((((((str_eq(last, EL_STR("а")) || str_eq(last, EL_STR("е"))) || str_eq(last, EL_STR("и"))) || str_eq(last, EL_STR("о"))) || str_eq(last, EL_STR("у"))) || str_eq(last, EL_STR("ю"))) || str_eq(last, EL_STR("я"))) || str_eq(last, EL_STR("э"))) || str_eq(last, EL_STR("ё"))) || str_eq(last, EL_STR("ы"))); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - if (vowels) { - return el_str_concat(stem, EL_STR("ю")); - } - return el_str_concat(stem, EL_STR("у")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("ешь")); - } - return el_str_concat(stem, EL_STR("ет")); - } - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("ем")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("ете")); - } - if (vowels) { - return el_str_concat(stem, EL_STR("ют")); - } - return el_str_concat(stem, EL_STR("ут")); - } - return stem; - return 0; -} - -el_val_t ru_conjugate_2nd(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number) { - if (str_eq(tense, EL_STR("present"))) { - el_val_t n = str_len(stem); - el_val_t last = str_slice(stem, (n - 1), n); - el_val_t after_vowel = (((((((((str_eq(last, EL_STR("а")) || str_eq(last, EL_STR("е"))) || str_eq(last, EL_STR("и"))) || str_eq(last, EL_STR("о"))) || str_eq(last, EL_STR("у"))) || str_eq(last, EL_STR("ю"))) || str_eq(last, EL_STR("я"))) || str_eq(last, EL_STR("э"))) || str_eq(last, EL_STR("ё"))) || str_eq(last, EL_STR("ы"))); - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - if (after_vowel) { - return el_str_concat(stem, EL_STR("ю")); - } - return el_str_concat(stem, EL_STR("у")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("ишь")); - } - return el_str_concat(stem, EL_STR("ит")); - } - if (str_eq(person, EL_STR("1"))) { - return el_str_concat(stem, EL_STR("им")); - } - if (str_eq(person, EL_STR("2"))) { - return el_str_concat(stem, EL_STR("ите")); - } - if (after_vowel) { - return el_str_concat(stem, EL_STR("ят")); - } - return el_str_concat(stem, EL_STR("ат")); - } - return stem; - return 0; -} - -el_val_t ru_irregular(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - if (str_eq(verb, EL_STR("быть"))) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR("есть"); - } - if (str_eq(tense, EL_STR("future"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("буду"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("будешь"); - } - return EL_STR("будет"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("будем"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("будете"); - } - return EL_STR("будут"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("идти"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("иду"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("идёшь"); - } - return EL_STR("идёт"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("идём"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("идёте"); - } - return EL_STR("идут"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("ехать"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("еду"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("едешь"); - } - return EL_STR("едет"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("едем"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("едете"); - } - return EL_STR("едут"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("говорить"))) { - if (str_eq(tense, EL_STR("present"))) { - return ru_conjugate_2nd(EL_STR("говор"), EL_STR("present"), person, number); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("знать"))) { - if (str_eq(tense, EL_STR("present"))) { - return ru_conjugate_1st(EL_STR("зна"), EL_STR("present"), person, number); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("видеть"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("вижу"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("видишь"); - } - return EL_STR("видит"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("видим"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("видите"); - } - return EL_STR("видят"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("делать"))) { - if (str_eq(tense, EL_STR("present"))) { - return ru_conjugate_1st(EL_STR("дела"), EL_STR("present"), person, number); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("хотеть"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("хочу"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("хочешь"); - } - return EL_STR("хочет"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("хотим"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("хотите"); - } - return EL_STR("хотят"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("мочь"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("могу"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("можешь"); - } - return EL_STR("может"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("можем"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("можете"); - } - return EL_STR("могут"); - } - return EL_STR(""); - } - if (str_eq(verb, EL_STR("сказать"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("скажу"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("скажешь"); - } - return EL_STR("скажет"); - } - if (str_eq(person, EL_STR("1"))) { - return EL_STR("скажем"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("скажете"); - } - return EL_STR("скажут"); - } - return EL_STR(""); - } - return EL_STR(""); - return 0; -} - -el_val_t ru_past_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("читать"))) { - return EL_STR("чита"); - } - if (str_eq(verb, EL_STR("знать"))) { - return EL_STR("зна"); - } - if (str_eq(verb, EL_STR("делать"))) { - return EL_STR("дела"); - } - if (str_eq(verb, EL_STR("сказать"))) { - return EL_STR("сказа"); - } - if (str_eq(verb, EL_STR("думать"))) { - return EL_STR("дума"); - } - if (str_eq(verb, EL_STR("работать"))) { - return EL_STR("работа"); - } - if (str_eq(verb, EL_STR("писать"))) { - return EL_STR("писа"); - } - if (str_eq(verb, EL_STR("слушать"))) { - return EL_STR("слуша"); - } - if (str_eq(verb, EL_STR("отвечать"))) { - return EL_STR("отвеча"); - } - if (str_eq(verb, EL_STR("говорить"))) { - return EL_STR("говори"); - } - if (str_eq(verb, EL_STR("видеть"))) { - return EL_STR("виде"); - } - if (str_eq(verb, EL_STR("смотреть"))) { - return EL_STR("смотре"); - } - if (str_eq(verb, EL_STR("иметь"))) { - return EL_STR("име"); - } - if (str_eq(verb, EL_STR("хотеть"))) { - return EL_STR("хоте"); - } - if (str_eq(verb, EL_STR("быть"))) { - return EL_STR("бы"); - } - if (str_eq(verb, EL_STR("идти"))) { - return EL_STR("шё"); - } - if (str_eq(verb, EL_STR("ехать"))) { - return EL_STR("еха"); - } - if (str_eq(verb, EL_STR("мочь"))) { - return EL_STR("мо"); - } - if (str_eq(verb, EL_STR("нести"))) { - return EL_STR("нё"); - } - if (str_eq(verb, EL_STR("вести"))) { - return EL_STR("вё"); - } - el_val_t n = str_len(verb); - if (n > 2) { - el_val_t last2 = str_slice(verb, (n - 2), n); - if (str_eq(last2, EL_STR("ть"))) { - return str_drop_last(verb, 2); - } - } - return verb; - return 0; -} - -el_val_t ru_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t gender) { - if (str_eq(verb, EL_STR("byt"))) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR(""); - } - if (str_eq(tense, EL_STR("future"))) { - return EL_STR("budet"); - } - return EL_STR("byl"); - } - if (str_eq(tense, EL_STR("past"))) { - if (str_eq(verb, EL_STR("идти"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("шли"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("шла"); - } - if (str_eq(gender, EL_STR("n"))) { - return EL_STR("шло"); - } - return EL_STR("шёл"); - } - if (str_eq(verb, EL_STR("мочь"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("могли"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("могла"); - } - if (str_eq(gender, EL_STR("n"))) { - return EL_STR("могло"); - } - return EL_STR("мог"); - } - if (str_eq(verb, EL_STR("нести"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("несли"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("несла"); - } - if (str_eq(gender, EL_STR("n"))) { - return EL_STR("несло"); - } - return EL_STR("нёс"); - } - if (str_eq(verb, EL_STR("вести"))) { - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("вели"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("вела"); - } - if (str_eq(gender, EL_STR("n"))) { - return EL_STR("вело"); - } - return EL_STR("вёл"); - } - el_val_t ps = ru_past_stem(verb); - return ru_past_agree(ps, gender, number); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t aux = ru_irregular(EL_STR("быть"), EL_STR("future"), person, number); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), verb); - } - el_val_t irr = ru_irregular(verb, tense, person, number); - if (!str_eq(irr, EL_STR(""))) { - return irr; - } - el_val_t n = str_len(verb); - if (n > 4) { - el_val_t last4 = str_slice(verb, (n - 4), n); - if (str_eq(last4, EL_STR("ить "))) { - } - } - if (str_ends_with(verb, EL_STR("ить"))) { - el_val_t stem = str_drop_last(verb, 3); - return ru_conjugate_2nd(stem, EL_STR("present"), person, number); - } - if (str_ends_with(verb, EL_STR("еть"))) { - el_val_t stem = str_drop_last(verb, 3); - return ru_conjugate_2nd(stem, EL_STR("present"), person, number); - } - if (str_ends_with(verb, EL_STR("ать"))) { - el_val_t stem = str_drop_last(verb, 2); - return ru_conjugate_1st(stem, EL_STR("present"), person, number); - } - if (str_ends_with(verb, EL_STR("ять"))) { - el_val_t stem = str_drop_last(verb, 2); - return ru_conjugate_1st(stem, EL_STR("present"), person, number); - } - if (str_ends_with(verb, EL_STR("овать"))) { - el_val_t stem = el_str_concat(str_drop_last(verb, 5), EL_STR("у")); - return ru_conjugate_1st(stem, EL_STR("present"), person, number); - } - if (str_ends_with(verb, EL_STR("нуть"))) { - el_val_t stem = el_str_concat(str_drop_last(verb, 4), EL_STR("н")); - return ru_conjugate_1st(stem, EL_STR("present"), person, number); - } - return verb; - return 0; -} - -el_val_t fi_harmony(el_val_t word) { - el_val_t n = str_len(word); - el_val_t i = (n - 1); - while (i >= 0) { - el_val_t c = str_slice(word, i, (i + 1)); - if (str_eq(c, EL_STR("a"))) { - return EL_STR("back"); - } - if (str_eq(c, EL_STR("o"))) { - return EL_STR("back"); - } - if (str_eq(c, EL_STR("u"))) { - return EL_STR("back"); - } - if (str_eq(c, EL_STR("ä"))) { - return EL_STR("front"); - } - if (str_eq(c, EL_STR("ö"))) { - return EL_STR("front"); - } - if (str_eq(c, EL_STR("y"))) { - return EL_STR("front"); - } - i = (i - 1); - } - return EL_STR("front"); - return 0; -} - -el_val_t fi_suffix(el_val_t base, el_val_t harmony) { - if (str_eq(harmony, EL_STR("front"))) { - if (str_eq(base, EL_STR("a"))) { - return EL_STR("ä"); - } - if (str_eq(base, EL_STR("ssa"))) { - return EL_STR("ssä"); - } - if (str_eq(base, EL_STR("sta"))) { - return EL_STR("stä"); - } - if (str_eq(base, EL_STR("an"))) { - return EL_STR("än"); - } - if (str_eq(base, EL_STR("aan"))) { - return EL_STR("ään"); - } - if (str_eq(base, EL_STR("lla"))) { - return EL_STR("llä"); - } - if (str_eq(base, EL_STR("lta"))) { - return EL_STR("ltä"); - } - if (str_eq(base, EL_STR("lle"))) { - return EL_STR("lle"); - } - if (str_eq(base, EL_STR("na"))) { - return EL_STR("nä"); - } - if (str_eq(base, EL_STR("ksi"))) { - return EL_STR("ksi"); - } - if (str_eq(base, EL_STR("tta"))) { - return EL_STR("ttä"); - } - if (str_eq(base, EL_STR("ta"))) { - return EL_STR("tä"); - } - if (str_eq(base, EL_STR("ja"))) { - return EL_STR("jä"); - } - if (str_eq(base, EL_STR("oja"))) { - return EL_STR("öjä"); - } - if (str_eq(base, EL_STR("issa"))) { - return EL_STR("issä"); - } - if (str_eq(base, EL_STR("ista"))) { - return EL_STR("istä"); - } - if (str_eq(base, EL_STR("ihin"))) { - return EL_STR("ihin"); - } - if (str_eq(base, EL_STR("illa"))) { - return EL_STR("illä"); - } - if (str_eq(base, EL_STR("ilta"))) { - return EL_STR("iltä"); - } - if (str_eq(base, EL_STR("ille"))) { - return EL_STR("ille"); - } - if (str_eq(base, EL_STR("ina"))) { - return EL_STR("inä"); - } - if (str_eq(base, EL_STR("itta"))) { - return EL_STR("ittä"); - } - if (str_eq(base, EL_STR("ko"))) { - return EL_STR("kö"); - } - if (str_eq(base, EL_STR("pa"))) { - return EL_STR("pä"); - } - if (str_eq(base, EL_STR("va"))) { - return EL_STR("vä"); - } - if (str_eq(base, EL_STR("ma"))) { - return EL_STR("mä"); - } - if (str_eq(base, EL_STR("han"))) { - return EL_STR("hän"); - } - if (str_eq(base, EL_STR("lla"))) { - return EL_STR("llä"); - } - return base; - } - return base; - return 0; -} - -el_val_t fi_noun_case(el_val_t stem, el_val_t gram_case, el_val_t number, el_val_t harmony) { - el_val_t sg = str_eq(number, EL_STR("singular")); - if (str_eq(gram_case, EL_STR("nominative"))) { - if (sg) { - return stem; - } - return el_str_concat(stem, EL_STR("t")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - if (sg) { - return el_str_concat(stem, EL_STR("n")); - } - return el_str_concat(stem, EL_STR("jen")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - if (sg) { - return el_str_concat(stem, EL_STR("n")); - } - return el_str_concat(stem, EL_STR("t")); - } - if (str_eq(gram_case, EL_STR("partitive"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("a"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("ja"), harmony)); - } - if (str_eq(gram_case, EL_STR("inessive"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("ssa"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("issa"), harmony)); - } - if (str_eq(gram_case, EL_STR("elative"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("sta"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("ista"), harmony)); - } - if (str_eq(gram_case, EL_STR("illative"))) { - if (sg) { - el_val_t last = fi_str_last_char(stem); - return el_str_concat(el_str_concat(stem, last), EL_STR("n")); - } - return el_str_concat(stem, fi_suffix(EL_STR("ihin"), harmony)); - } - if (str_eq(gram_case, EL_STR("adessive"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("lla"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("illa"), harmony)); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("lta"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("ilta"), harmony)); - } - if (str_eq(gram_case, EL_STR("allative"))) { - if (sg) { - return el_str_concat(stem, EL_STR("lle")); - } - return el_str_concat(stem, EL_STR("ille")); - } - if (str_eq(gram_case, EL_STR("essive"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("na"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("ina"), harmony)); - } - if (str_eq(gram_case, EL_STR("translative"))) { - if (sg) { - return el_str_concat(stem, EL_STR("ksi")); - } - return el_str_concat(stem, EL_STR("iksi")); - } - if (str_eq(gram_case, EL_STR("instructive"))) { - return el_str_concat(stem, EL_STR("in")); - } - if (str_eq(gram_case, EL_STR("abessive"))) { - if (sg) { - return el_str_concat(stem, fi_suffix(EL_STR("tta"), harmony)); - } - return el_str_concat(stem, fi_suffix(EL_STR("itta"), harmony)); - } - if (str_eq(gram_case, EL_STR("comitative"))) { - return el_str_concat(stem, EL_STR("ineen")); - } - return stem; - return 0; -} - -el_val_t fi_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t harmony = fi_harmony(noun); - if (str_eq(gram_case, EL_STR("nominative"))) { - if (str_eq(number, EL_STR("singular"))) { - return noun; - } - return el_str_concat(noun, EL_STR("t")); - } - return fi_noun_case(noun, gram_case, number, harmony); - return 0; -} - -el_val_t fi_verb_stem(el_val_t dict_form) { - if (str_ends_with(dict_form, EL_STR("da"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("dä"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("lla"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("llä"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("rra"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("nna"))) { - return str_drop_last(dict_form, 2); - } - if (str_ends_with(dict_form, EL_STR("a"))) { - return str_drop_last(dict_form, 1); - } - if (str_ends_with(dict_form, EL_STR("ä"))) { - return str_drop_last(dict_form, 1); - } - return dict_form; - return 0; -} - -el_val_t fi_irregular_verb(el_val_t dict_form) { - el_val_t empty = el_list_empty(); - if (str_eq(dict_form, EL_STR("olla"))) { - el_val_t r = el_list_new(18, EL_STR("olla"), EL_STR("olen"), EL_STR("olet"), EL_STR("on"), EL_STR("olemme"), EL_STR("olette"), EL_STR("ovat"), EL_STR("olin"), EL_STR("olit"), EL_STR("oli"), EL_STR("olimme"), EL_STR("olitte"), EL_STR("olivat"), EL_STR("ole"), EL_STR("olis"), EL_STR("ole"), EL_STR("oleva"), EL_STR("ollut")); - return r; - } - if (str_eq(dict_form, EL_STR("voida"))) { - el_val_t r = el_list_new(18, EL_STR("voida"), EL_STR("voin"), EL_STR("voit"), EL_STR("voi"), EL_STR("voimme"), EL_STR("voitte"), EL_STR("voivat"), EL_STR("voin"), EL_STR("voit"), EL_STR("voi"), EL_STR("voimme"), EL_STR("voitte"), EL_STR("voivat"), EL_STR("voi"), EL_STR("vois"), EL_STR("voi"), EL_STR("voiva"), EL_STR("voinut")); - return r; - } - if (str_eq(dict_form, EL_STR("mennä"))) { - el_val_t r = el_list_new(18, EL_STR("mennä"), EL_STR("menen"), EL_STR("menet"), EL_STR("menee"), EL_STR("menemme"), EL_STR("menette"), EL_STR("menevät"), EL_STR("menin"), EL_STR("menit"), EL_STR("meni"), EL_STR("menimme"), EL_STR("menitte"), EL_STR("menivät"), EL_STR("mene"), EL_STR("menis"), EL_STR("mene"), EL_STR("menevä"), EL_STR("mennyt")); - return r; - } - if (str_eq(dict_form, EL_STR("tulla"))) { - el_val_t r = el_list_new(18, EL_STR("tulla"), EL_STR("tulen"), EL_STR("tulet"), EL_STR("tulee"), EL_STR("tulemme"), EL_STR("tulette"), EL_STR("tulevat"), EL_STR("tulin"), EL_STR("tulit"), EL_STR("tuli"), EL_STR("tulimme"), EL_STR("tulitte"), EL_STR("tulivat"), EL_STR("tule"), EL_STR("tulis"), EL_STR("tule"), EL_STR("tuleva"), EL_STR("tullut")); - return r; - } - if (str_eq(dict_form, EL_STR("tehdä"))) { - el_val_t r = el_list_new(18, EL_STR("tehdä"), EL_STR("teen"), EL_STR("teet"), EL_STR("tekee"), EL_STR("teemme"), EL_STR("teette"), EL_STR("tekevät"), EL_STR("tein"), EL_STR("teit"), EL_STR("teki"), EL_STR("teimme"), EL_STR("teitte"), EL_STR("tekivät"), EL_STR("tee"), EL_STR("tekis"), EL_STR("tee"), EL_STR("tekevä"), EL_STR("tehnyt")); - return r; - } - if (str_eq(dict_form, EL_STR("nähdä"))) { - el_val_t r = el_list_new(18, EL_STR("nähdä"), EL_STR("näen"), EL_STR("näet"), EL_STR("näkee"), EL_STR("näemme"), EL_STR("näette"), EL_STR("näkevät"), EL_STR("näin"), EL_STR("näit"), EL_STR("näki"), EL_STR("näimme"), EL_STR("näitte"), EL_STR("näkivät"), EL_STR("näe"), EL_STR("näkis"), EL_STR("näe"), EL_STR("näkevä"), EL_STR("nähnyt")); - return r; - } - if (str_eq(dict_form, EL_STR("saada"))) { - el_val_t r = el_list_new(18, EL_STR("saada"), EL_STR("saan"), EL_STR("saat"), EL_STR("saa"), EL_STR("saamme"), EL_STR("saatte"), EL_STR("saavat"), EL_STR("sain"), EL_STR("sait"), EL_STR("sai"), EL_STR("saimme"), EL_STR("saitte"), EL_STR("saivat"), EL_STR("saa"), EL_STR("sais"), EL_STR("saa"), EL_STR("saava"), EL_STR("saanut")); - return r; - } - if (str_eq(dict_form, EL_STR("pitää"))) { - el_val_t r = el_list_new(18, EL_STR("pitää"), EL_STR("pidän"), EL_STR("pidät"), EL_STR("pitää"), EL_STR("pidämme"), EL_STR("pidätte"), EL_STR("pitävät"), EL_STR("pidin"), EL_STR("pidit"), EL_STR("piti"), EL_STR("pidimme"), EL_STR("piditte"), EL_STR("pitivät"), EL_STR("pidä"), EL_STR("pitäis"), EL_STR("pidä"), EL_STR("pitävä"), EL_STR("pitänyt")); - return r; - } - if (str_eq(dict_form, EL_STR("tietää"))) { - el_val_t r = el_list_new(18, EL_STR("tietää"), EL_STR("tiedän"), EL_STR("tiedät"), EL_STR("tietää"), EL_STR("tiedämme"), EL_STR("tiedätte"), EL_STR("tietävät"), EL_STR("tiesin"), EL_STR("tiesit"), EL_STR("tiesi"), EL_STR("tiesimme"), EL_STR("tiesitte"), EL_STR("tiesivät"), EL_STR("tiedä"), EL_STR("tietäis"), EL_STR("tiedä"), EL_STR("tietävä"), EL_STR("tiennyt")); - return r; - } - return empty; - return 0; -} - -el_val_t fi_present_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(person, EL_STR("first"))) { - return el_str_concat(stem, EL_STR("n")); - } - if (str_eq(person, EL_STR("second"))) { - return el_str_concat(stem, EL_STR("t")); - } - if (str_eq(person, EL_STR("third"))) { - el_val_t last = fi_str_last_char(stem); - return el_str_concat(stem, last); - } - } - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(person, EL_STR("first"))) { - return el_str_concat(stem, EL_STR("mme")); - } - if (str_eq(person, EL_STR("second"))) { - return el_str_concat(stem, EL_STR("tte")); - } - if (str_eq(person, EL_STR("third"))) { - return el_str_concat(stem, fi_suffix(EL_STR("vat"), harmony)); - } - } - return stem; - return 0; -} - -el_val_t fi_past_stem(el_val_t stem) { - el_val_t last = fi_str_last_char(stem); - if (str_eq(last, EL_STR("a"))) { - return el_str_concat(str_drop_last(stem, 1), EL_STR("oi")); - } - if (str_eq(last, EL_STR("ä"))) { - return el_str_concat(str_drop_last(stem, 1), EL_STR("öi")); - } - return el_str_concat(stem, EL_STR("i")); - return 0; -} - -el_val_t fi_past_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony) { - el_val_t pstem = fi_past_stem(stem); - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(person, EL_STR("first"))) { - return el_str_concat(pstem, EL_STR("n")); - } - if (str_eq(person, EL_STR("second"))) { - return el_str_concat(pstem, EL_STR("t")); - } - if (str_eq(person, EL_STR("third"))) { - return str_drop_last(pstem, 1); - } - } - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(person, EL_STR("first"))) { - return el_str_concat(pstem, EL_STR("mme")); - } - if (str_eq(person, EL_STR("second"))) { - return el_str_concat(pstem, EL_STR("tte")); - } - if (str_eq(person, EL_STR("third"))) { - return el_str_concat(pstem, fi_suffix(EL_STR("vat"), harmony)); - } - } - return pstem; - return 0; -} - -el_val_t fi_neg_aux(el_val_t person, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(person, EL_STR("first"))) { - return EL_STR("en"); - } - if (str_eq(person, EL_STR("second"))) { - return EL_STR("et"); - } - if (str_eq(person, EL_STR("third"))) { - return EL_STR("ei"); - } - } - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(person, EL_STR("first"))) { - return EL_STR("emme"); - } - if (str_eq(person, EL_STR("second"))) { - return EL_STR("ette"); - } - if (str_eq(person, EL_STR("third"))) { - return EL_STR("eivät"); - } - } - return EL_STR("ei"); - return 0; -} - -el_val_t fi_negative(el_val_t verb, el_val_t person, el_val_t number) { - el_val_t irreg = fi_irregular_verb(verb); - el_val_t aux = fi_neg_aux(person, number); - if (native_list_len(irreg) > 0) { - el_val_t neg_stem = native_list_get(irreg, 13); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), neg_stem); - } - el_val_t stem = fi_verb_stem(verb); - return el_str_concat(el_str_concat(aux, EL_STR(" ")), stem); - return 0; -} - -el_val_t fi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t harmony = fi_harmony(verb); - el_val_t irreg = fi_irregular_verb(verb); - if (native_list_len(irreg) > 0) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(person, EL_STR("first"))) { - return native_list_get(irreg, 1); - } - if (str_eq(person, EL_STR("second"))) { - return native_list_get(irreg, 2); - } - if (str_eq(person, EL_STR("third"))) { - return native_list_get(irreg, 3); - } - } - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(person, EL_STR("first"))) { - return native_list_get(irreg, 4); - } - if (str_eq(person, EL_STR("second"))) { - return native_list_get(irreg, 5); - } - if (str_eq(person, EL_STR("third"))) { - return native_list_get(irreg, 6); - } - } - } - if (str_eq(tense, EL_STR("past"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(person, EL_STR("first"))) { - return native_list_get(irreg, 7); - } - if (str_eq(person, EL_STR("second"))) { - return native_list_get(irreg, 8); - } - if (str_eq(person, EL_STR("third"))) { - return native_list_get(irreg, 9); - } - } - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(person, EL_STR("first"))) { - return native_list_get(irreg, 10); - } - if (str_eq(person, EL_STR("second"))) { - return native_list_get(irreg, 11); - } - if (str_eq(person, EL_STR("third"))) { - return native_list_get(irreg, 12); - } - } - } - } - el_val_t stem = fi_verb_stem(verb); - if (str_eq(tense, EL_STR("present"))) { - return fi_present_ending(stem, person, number, harmony); - } - if (str_eq(tense, EL_STR("past"))) { - return fi_past_ending(stem, person, number, harmony); - } - return stem; - return 0; -} - -el_val_t fi_question_suffix(el_val_t harmony) { - if (str_eq(harmony, EL_STR("front"))) { - return EL_STR("kö"); - } - return EL_STR("ko"); - return 0; -} - -el_val_t fi_make_question(el_val_t verb_form, el_val_t harmony) { - return el_str_concat(verb_form, fi_question_suffix(harmony)); - return 0; -} - -el_val_t fi_full_paradigm(el_val_t noun) { - el_val_t harmony = fi_harmony(noun); - el_val_t r = el_list_empty(); - el_val_t cases = el_list_new(15, EL_STR("nominative"), EL_STR("genitive"), EL_STR("accusative"), EL_STR("partitive"), EL_STR("inessive"), EL_STR("elative"), EL_STR("illative"), EL_STR("adessive"), EL_STR("ablative"), EL_STR("allative"), EL_STR("essive"), EL_STR("translative"), EL_STR("instructive"), EL_STR("abessive"), EL_STR("comitative")); - el_val_t n = native_list_len(cases); - el_val_t i = 0; - while (i < n) { - el_val_t c = native_list_get(cases, i); - r = native_list_append(r, c); - if (str_eq(c, EL_STR("instructive"))) { - r = native_list_append(r, EL_STR("")); - } else { - if (str_eq(c, EL_STR("comitative"))) { - r = native_list_append(r, EL_STR("")); - } else { - r = native_list_append(r, fi_noun_case(noun, c, EL_STR("singular"), harmony)); - } - } - r = native_list_append(r, fi_noun_case(noun, c, EL_STR("plural"), harmony)); - i = (i + 1); - } - return r; - return 0; -} - -el_val_t ar_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t ar_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t ar_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t ar_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t ar_slot(el_val_t person, el_val_t gender, el_val_t number) { - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 1; - } - return 0; - } - if (str_eq(gender, EL_STR("f"))) { - return 6; - } - return 5; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 3; - } - return 2; - } - if (str_eq(gender, EL_STR("f"))) { - return 8; - } - return 7; - } - if (str_eq(number, EL_STR("plural"))) { - return 9; - } - return 4; - return 0; -} - -el_val_t ar_perfect_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR(""); - } - if (slot == 1) { - return EL_STR("ت"); - } - if (slot == 2) { - return EL_STR("تَ"); - } - if (slot == 3) { - return EL_STR("تِ"); - } - if (slot == 4) { - return EL_STR("تُ"); - } - if (slot == 5) { - return EL_STR("وا"); - } - if (slot == 6) { - return EL_STR("نَ"); - } - if (slot == 7) { - return EL_STR("تُمْ"); - } - if (slot == 8) { - return EL_STR("تُنَّ"); - } - return EL_STR("نَا"); - return 0; -} - -el_val_t ar_imperfect_prefix(el_val_t slot) { - if (slot == 0) { - return EL_STR("يَ"); - } - if (slot == 1) { - return EL_STR("تَ"); - } - if (slot == 2) { - return EL_STR("تَ"); - } - if (slot == 3) { - return EL_STR("تَ"); - } - if (slot == 4) { - return EL_STR("أَ"); - } - if (slot == 5) { - return EL_STR("يَ"); - } - if (slot == 6) { - return EL_STR("يَ"); - } - if (slot == 7) { - return EL_STR("تَ"); - } - if (slot == 8) { - return EL_STR("تَ"); - } - return EL_STR("نَ"); - return 0; -} - -el_val_t ar_imperfect_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR("ُ"); - } - if (slot == 1) { - return EL_STR("ُ"); - } - if (slot == 2) { - return EL_STR("ُ"); - } - if (slot == 3) { - return EL_STR("ِينَ"); - } - if (slot == 4) { - return EL_STR("ُ"); - } - if (slot == 5) { - return EL_STR("ُونَ"); - } - if (slot == 6) { - return EL_STR("نَ"); - } - if (slot == 7) { - return EL_STR("ُونَ"); - } - if (slot == 8) { - return EL_STR("نَ"); - } - return EL_STR("ُ"); - return 0; -} - -el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return past_base; - } - el_val_t suf = ar_perfect_suffix(slot); - el_val_t stem = ar_str_drop_last(past_base, 1); - return el_str_concat(stem, suf); - } - if (str_eq(tense, EL_STR("present"))) { - el_val_t pre = ar_imperfect_prefix(slot); - el_val_t suf = ar_imperfect_suffix(slot); - el_val_t mid = ar_str_drop_last(present_stem, 1); - return el_str_concat(el_str_concat(pre, mid), suf); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres_3ms = ar_conjugate_form1(past_base, present_stem, EL_STR("present"), 0); - return el_str_concat(EL_STR("سَ"), pres_3ms); - } - return past_base; - return 0; -} - -el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("كَانَ"); - } - if (slot == 1) { - return EL_STR("كَانَتْ"); - } - if (slot == 2) { - return EL_STR("كُنْتَ"); - } - if (slot == 3) { - return EL_STR("كُنْتِ"); - } - if (slot == 4) { - return EL_STR("كُنْتُ"); - } - if (slot == 5) { - return EL_STR("كَانُوا"); - } - if (slot == 6) { - return EL_STR("كُنَّ"); - } - if (slot == 7) { - return EL_STR("كُنْتُمْ"); - } - if (slot == 8) { - return EL_STR("كُنْتُنَّ"); - } - return EL_STR("كُنَّا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يَكُونُ"); - } - if (slot == 1) { - return EL_STR("تَكُونُ"); - } - if (slot == 2) { - return EL_STR("تَكُونُ"); - } - if (slot == 3) { - return EL_STR("تَكُونِينَ"); - } - if (slot == 4) { - return EL_STR("أَكُونُ"); - } - if (slot == 5) { - return EL_STR("يَكُونُونَ"); - } - if (slot == 6) { - return EL_STR("يَكُنَّ"); - } - if (slot == 7) { - return EL_STR("تَكُونُونَ"); - } - if (slot == 8) { - return EL_STR("تَكُنَّ"); - } - return EL_STR("نَكُونُ"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_kaana(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("كَانَ"); - return 0; -} - -el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("قَالَ"); - } - if (slot == 1) { - return EL_STR("قَالَتْ"); - } - if (slot == 2) { - return EL_STR("قُلْتَ"); - } - if (slot == 3) { - return EL_STR("قُلْتِ"); - } - if (slot == 4) { - return EL_STR("قُلْتُ"); - } - if (slot == 5) { - return EL_STR("قَالُوا"); - } - if (slot == 6) { - return EL_STR("قُلْنَ"); - } - if (slot == 7) { - return EL_STR("قُلْتُمْ"); - } - if (slot == 8) { - return EL_STR("قُلْتُنَّ"); - } - return EL_STR("قُلْنَا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يَقُولُ"); - } - if (slot == 1) { - return EL_STR("تَقُولُ"); - } - if (slot == 2) { - return EL_STR("تَقُولُ"); - } - if (slot == 3) { - return EL_STR("تَقُولِينَ"); - } - if (slot == 4) { - return EL_STR("أَقُولُ"); - } - if (slot == 5) { - return EL_STR("يَقُولُونَ"); - } - if (slot == 6) { - return EL_STR("يَقُلْنَ"); - } - if (slot == 7) { - return EL_STR("تَقُولُونَ"); - } - if (slot == 8) { - return EL_STR("تَقُلْنَ"); - } - return EL_STR("نَقُولُ"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_qaala(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("قَالَ"); - return 0; -} - -el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("جَاءَ"); - } - if (slot == 1) { - return EL_STR("جَاءَتْ"); - } - if (slot == 2) { - return EL_STR("جِئْتَ"); - } - if (slot == 3) { - return EL_STR("جِئْتِ"); - } - if (slot == 4) { - return EL_STR("جِئْتُ"); - } - if (slot == 5) { - return EL_STR("جَاءُوا"); - } - if (slot == 6) { - return EL_STR("جِئْنَ"); - } - if (slot == 7) { - return EL_STR("جِئْتُمْ"); - } - if (slot == 8) { - return EL_STR("جِئْتُنَّ"); - } - return EL_STR("جِئْنَا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يَجِيءُ"); - } - if (slot == 1) { - return EL_STR("تَجِيءُ"); - } - if (slot == 2) { - return EL_STR("تَجِيءُ"); - } - if (slot == 3) { - return EL_STR("تَجِيئِينَ"); - } - if (slot == 4) { - return EL_STR("أَجِيءُ"); - } - if (slot == 5) { - return EL_STR("يَجِيئُونَ"); - } - if (slot == 6) { - return EL_STR("يَجِئْنَ"); - } - if (slot == 7) { - return EL_STR("تَجِيئُونَ"); - } - if (slot == 8) { - return EL_STR("تَجِئْنَ"); - } - return EL_STR("نَجِيءُ"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_jaa(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("جَاءَ"); - return 0; -} - -el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("رَأَى"); - } - if (slot == 1) { - return EL_STR("رَأَتْ"); - } - if (slot == 2) { - return EL_STR("رَأَيْتَ"); - } - if (slot == 3) { - return EL_STR("رَأَيْتِ"); - } - if (slot == 4) { - return EL_STR("رَأَيْتُ"); - } - if (slot == 5) { - return EL_STR("رَأَوْا"); - } - if (slot == 6) { - return EL_STR("رَأَيْنَ"); - } - if (slot == 7) { - return EL_STR("رَأَيْتُمْ"); - } - if (slot == 8) { - return EL_STR("رَأَيْتُنَّ"); - } - return EL_STR("رَأَيْنَا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يَرَى"); - } - if (slot == 1) { - return EL_STR("تَرَى"); - } - if (slot == 2) { - return EL_STR("تَرَى"); - } - if (slot == 3) { - return EL_STR("تَرَيْنَ"); - } - if (slot == 4) { - return EL_STR("أَرَى"); - } - if (slot == 5) { - return EL_STR("يَرَوْنَ"); - } - if (slot == 6) { - return EL_STR("يَرَيْنَ"); - } - if (slot == 7) { - return EL_STR("تَرَوْنَ"); - } - if (slot == 8) { - return EL_STR("تَرَيْنَ"); - } - return EL_STR("نَرَى"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_raaa(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("رَأَى"); - return 0; -} - -el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("أَرَادَ"); - } - if (slot == 1) { - return EL_STR("أَرَادَتْ"); - } - if (slot == 2) { - return EL_STR("أَرَدْتَ"); - } - if (slot == 3) { - return EL_STR("أَرَدْتِ"); - } - if (slot == 4) { - return EL_STR("أَرَدْتُ"); - } - if (slot == 5) { - return EL_STR("أَرَادُوا"); - } - if (slot == 6) { - return EL_STR("أَرَدْنَ"); - } - if (slot == 7) { - return EL_STR("أَرَدْتُمْ"); - } - if (slot == 8) { - return EL_STR("أَرَدْتُنَّ"); - } - return EL_STR("أَرَدْنَا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يُرِيدُ"); - } - if (slot == 1) { - return EL_STR("تُرِيدُ"); - } - if (slot == 2) { - return EL_STR("تُرِيدُ"); - } - if (slot == 3) { - return EL_STR("تُرِيدِينَ"); - } - if (slot == 4) { - return EL_STR("أُرِيدُ"); - } - if (slot == 5) { - return EL_STR("يُرِيدُونَ"); - } - if (slot == 6) { - return EL_STR("يُرِدْنَ"); - } - if (slot == 7) { - return EL_STR("تُرِيدُونَ"); - } - if (slot == 8) { - return EL_STR("تُرِدْنَ"); - } - return EL_STR("نُرِيدُ"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_araada(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("أَرَادَ"); - return 0; -} - -el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense) { - if (str_eq(tense, EL_STR("past"))) { - if (slot == 0) { - return EL_STR("اِسْتَطَاعَ"); - } - if (slot == 1) { - return EL_STR("اِسْتَطَاعَتْ"); - } - if (slot == 2) { - return EL_STR("اِسْتَطَعْتَ"); - } - if (slot == 3) { - return EL_STR("اِسْتَطَعْتِ"); - } - if (slot == 4) { - return EL_STR("اِسْتَطَعْتُ"); - } - if (slot == 5) { - return EL_STR("اِسْتَطَاعُوا"); - } - if (slot == 6) { - return EL_STR("اِسْتَطَعْنَ"); - } - if (slot == 7) { - return EL_STR("اِسْتَطَعْتُمْ"); - } - if (slot == 8) { - return EL_STR("اِسْتَطَعْتُنَّ"); - } - return EL_STR("اِسْتَطَعْنَا"); - } - if (str_eq(tense, EL_STR("present"))) { - if (slot == 0) { - return EL_STR("يَسْتَطِيعُ"); - } - if (slot == 1) { - return EL_STR("تَسْتَطِيعُ"); - } - if (slot == 2) { - return EL_STR("تَسْتَطِيعُ"); - } - if (slot == 3) { - return EL_STR("تَسْتَطِيعِينَ"); - } - if (slot == 4) { - return EL_STR("أَسْتَطِيعُ"); - } - if (slot == 5) { - return EL_STR("يَسْتَطِيعُونَ"); - } - if (slot == 6) { - return EL_STR("يَسْتَطِعْنَ"); - } - if (slot == 7) { - return EL_STR("تَسْتَطِيعُونَ"); - } - if (slot == 8) { - return EL_STR("تَسْتَطِعْنَ"); - } - return EL_STR("نَسْتَطِيعُ"); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t pres = ar_irregular_istata(slot, EL_STR("present")); - return el_str_concat(EL_STR("سَ"), pres); - } - return EL_STR("اِسْتَطَاعَ"); - return 0; -} - -el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("كَانَ"))) { - return ar_irregular_kaana(slot, tense); - } - if (str_eq(verb, EL_STR("قَالَ"))) { - return ar_irregular_qaala(slot, tense); - } - if (str_eq(verb, EL_STR("جَاءَ"))) { - return ar_irregular_jaa(slot, tense); - } - if (str_eq(verb, EL_STR("رَأَى"))) { - return ar_irregular_raaa(slot, tense); - } - if (str_eq(verb, EL_STR("أَرَادَ"))) { - return ar_irregular_araada(slot, tense); - } - if (str_eq(verb, EL_STR("اِسْتَطَاعَ"))) { - return ar_irregular_istata(slot, tense); - } - return EL_STR(""); - return 0; -} - -el_val_t ar_present_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("كَتَبَ"))) { - return EL_STR("كْتُبُ"); - } - if (str_eq(verb, EL_STR("ذَهَبَ"))) { - return EL_STR("ذْهَبُ"); - } - if (str_eq(verb, EL_STR("أَكَلَ"))) { - return EL_STR("أْكُلُ"); - } - if (str_eq(verb, EL_STR("شَرِبَ"))) { - return EL_STR("شْرَبُ"); - } - if (str_eq(verb, EL_STR("عَرَفَ"))) { - return EL_STR("عْرِفُ"); - } - if (str_eq(verb, EL_STR("فَعَلَ"))) { - return EL_STR("فْعَلُ"); - } - if (str_eq(verb, EL_STR("أَخَذَ"))) { - return EL_STR("أْخُذُ"); - } - if (str_eq(verb, EL_STR("عَمِلَ"))) { - return EL_STR("عْمَلُ"); - } - if (str_eq(verb, EL_STR("دَرَسَ"))) { - return EL_STR("دْرُسُ"); - } - if (str_eq(verb, EL_STR("فَهِمَ"))) { - return EL_STR("فْهَمُ"); - } - if (str_eq(verb, EL_STR("سَمِعَ"))) { - return EL_STR("سْمَعُ"); - } - if (str_eq(verb, EL_STR("جَلَسَ"))) { - return EL_STR("جْلِسُ"); - } - if (str_eq(verb, EL_STR("فَتَحَ"))) { - return EL_STR("فْتَحُ"); - } - if (str_eq(verb, EL_STR("خَرَجَ"))) { - return EL_STR("خْرُجُ"); - } - if (str_eq(verb, EL_STR("دَخَلَ"))) { - return EL_STR("دْخُلُ"); - } - if (str_eq(verb, EL_STR("وَجَدَ"))) { - return EL_STR("جِدُ"); - } - if (str_eq(verb, EL_STR("صَنَعَ"))) { - return EL_STR("صْنَعُ"); - } - if (str_eq(verb, EL_STR("رَجَعَ"))) { - return EL_STR("رْجِعُ"); - } - if (str_eq(verb, EL_STR("وَقَفَ"))) { - return EL_STR("قِفُ"); - } - if (str_eq(verb, EL_STR("قَرَأَ"))) { - return EL_STR("قْرَأُ"); - } - if (str_eq(verb, EL_STR("كَذَبَ"))) { - return EL_STR("كْذِبُ"); - } - return EL_STR(""); - return 0; -} - -el_val_t ar_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) { - el_val_t slot = ar_slot(person, gender, number); - el_val_t irreg = ar_irregular(verb, tense, slot); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - el_val_t present_stem = ar_present_stem(verb); - if (!str_eq(present_stem, EL_STR(""))) { - return ar_conjugate_form1(verb, present_stem, tense, slot); - } - return verb; - return 0; -} - -el_val_t ar_is_sun_letter(el_val_t c) { - if (str_eq(c, EL_STR("ت"))) { - return 1; - } - if (str_eq(c, EL_STR("ث"))) { - return 1; - } - if (str_eq(c, EL_STR("د"))) { - return 1; - } - if (str_eq(c, EL_STR("ذ"))) { - return 1; - } - if (str_eq(c, EL_STR("ر"))) { - return 1; - } - if (str_eq(c, EL_STR("ز"))) { - return 1; - } - if (str_eq(c, EL_STR("س"))) { - return 1; - } - if (str_eq(c, EL_STR("ش"))) { - return 1; - } - if (str_eq(c, EL_STR("ص"))) { - return 1; - } - if (str_eq(c, EL_STR("ض"))) { - return 1; - } - if (str_eq(c, EL_STR("ط"))) { - return 1; - } - if (str_eq(c, EL_STR("ظ"))) { - return 1; - } - if (str_eq(c, EL_STR("ل"))) { - return 1; - } - if (str_eq(c, EL_STR("ن"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t ar_definite_article(el_val_t noun) { - el_val_t n = ar_str_len(noun); - if (n == 0) { - return noun; - } - el_val_t first = str_slice(noun, 0, 1); - if (ar_is_sun_letter(first)) { - el_val_t shadda = EL_STR("ّ"); - el_val_t rest = str_slice(noun, 1, n); - return el_str_concat(el_str_concat(el_str_concat(EL_STR("ال"), first), shadda), rest); - } - return el_str_concat(EL_STR("ال"), noun); - return 0; -} - -el_val_t ar_case_ending(el_val_t kase, el_val_t definite) { - el_val_t is_def = str_eq(definite, EL_STR("true")); - if (str_eq(kase, EL_STR("nom"))) { - if (is_def) { - return EL_STR("ُ"); - } - return EL_STR("ٌ"); - } - if (str_eq(kase, EL_STR("acc"))) { - if (is_def) { - return EL_STR("َ"); - } - return EL_STR("ً"); - } - if (str_eq(kase, EL_STR("gen"))) { - if (is_def) { - return EL_STR("ِ"); - } - return EL_STR("ٍ"); - } - return EL_STR(""); - return 0; -} - -el_val_t ar_gender(el_val_t noun) { - if (ar_str_ends(noun, EL_STR("ة"))) { - return EL_STR("f"); - } - if (ar_str_ends(noun, EL_STR("ـة"))) { - return EL_STR("f"); - } - return EL_STR("m"); - return 0; -} - -el_val_t ar_masc_pl_ending(el_val_t kase) { - if (str_eq(kase, EL_STR("nom"))) { - return EL_STR("ونَ"); - } - return EL_STR("ينَ"); - return 0; -} - -el_val_t ar_sound_plural(el_val_t noun, el_val_t gender) { - if (str_eq(gender, EL_STR("f"))) { - if (ar_str_ends(noun, EL_STR("ة"))) { - el_val_t base = ar_str_drop_last(noun, 1); - return el_str_concat(base, EL_STR("ات")); - } - return el_str_concat(noun, EL_STR("ات")); - } - return el_str_concat(noun, EL_STR("ون")); - return 0; -} - -el_val_t ar_noun_form(el_val_t noun, el_val_t gender, el_val_t kase, el_val_t number, el_val_t definite) { - el_val_t g = gender; - if (str_eq(g, EL_STR(""))) { - g = ar_gender(noun); - } - el_val_t stem = noun; - if (str_eq(number, EL_STR("plural"))) { - if (str_eq(g, EL_STR("m"))) { - el_val_t pl_suf = ar_masc_pl_ending(kase); - if (str_eq(definite, EL_STR("true"))) { - el_val_t def_stem = ar_definite_article(noun); - return el_str_concat(def_stem, pl_suf); - } - return el_str_concat(noun, pl_suf); - } - el_val_t fem_pl = ar_sound_plural(noun, EL_STR("f")); - el_val_t case_end = ar_case_ending(kase, definite); - if (str_eq(definite, EL_STR("true"))) { - return el_str_concat(ar_definite_article(fem_pl), case_end); - } - return el_str_concat(fem_pl, case_end); - } - el_val_t case_end = ar_case_ending(kase, definite); - if (str_eq(definite, EL_STR("true"))) { - el_val_t def_stem = ar_definite_article(noun); - return el_str_concat(def_stem, case_end); - } - return el_str_concat(noun, case_end); - return 0; -} - -el_val_t ar_verb_form(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - return ar_conjugate(verb, tense, person, EL_STR("m"), number); - return 0; -} - -el_val_t hi_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t hi_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t hi_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t hi_gender(el_val_t noun) { - if (hi_str_ends(noun, EL_STR("ी"))) { - return EL_STR("f"); - } - if (hi_str_ends(noun, EL_STR("ा"))) { - return EL_STR("m"); - } - if (hi_str_ends(noun, EL_STR("न"))) { - return EL_STR("f"); - } - if (hi_str_ends(noun, EL_STR("त"))) { - return EL_STR("f"); - } - if (hi_str_ends(noun, EL_STR("ट"))) { - return EL_STR("f"); - } - if (hi_str_ends(noun, EL_STR("श"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("लड़का"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("लड़की"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("आदमी"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("औरत"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("घर"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("मेज़"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("किताब"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("पानी"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("दूध"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("हाथ"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("आँख"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("बच्चा"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("बच्ची"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("काम"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("बात"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("दिन"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("रात"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("देश"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("भाषा"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("जगह"))) { - return EL_STR("f"); - } - if (str_eq(noun, EL_STR("समय"))) { - return EL_STR("m"); - } - if (str_eq(noun, EL_STR("साल"))) { - return EL_STR("m"); - } - return EL_STR("m"); - return 0; -} - -el_val_t hi_masc_aa_stem(el_val_t noun) { - return hi_str_drop_last(noun, 1); - return 0; -} - -el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number) { - if (hi_str_ends(noun, EL_STR("ा"))) { - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - return el_str_concat(hi_masc_aa_stem(noun), EL_STR("े")); - } - return noun; - return 0; -} - -el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number) { - if (hi_str_ends(noun, EL_STR("ा"))) { - el_val_t stem = hi_masc_aa_stem(noun); - if (str_eq(number, EL_STR("sg"))) { - return el_str_concat(stem, EL_STR("े")); - } - return el_str_concat(stem, EL_STR("ों")); - } - if (hi_str_ends(noun, EL_STR("ी"))) { - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - el_val_t stem = hi_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ियों")); - } - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - return el_str_concat(noun, EL_STR("ों")); - return 0; -} - -el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number) { - if (hi_str_ends(noun, EL_STR("ी"))) { - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - el_val_t stem = hi_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ियाँ")); - } - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - return el_str_concat(noun, EL_STR("ें")); - return 0; -} - -el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number) { - if (hi_str_ends(noun, EL_STR("ी"))) { - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - el_val_t stem = hi_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ियों")); - } - if (str_eq(number, EL_STR("sg"))) { - return noun; - } - return el_str_concat(noun, EL_STR("ों")); - return 0; -} - -el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number) { - if (str_eq(gender, EL_STR("m"))) { - return hi_noun_direct_m(noun, number); - } - if (str_eq(gender, EL_STR("f"))) { - return hi_noun_direct_f(noun, number); - } - return noun; - return 0; -} - -el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number) { - if (str_eq(gender, EL_STR("m"))) { - return hi_noun_oblique_m(noun, number); - } - if (str_eq(gender, EL_STR("f"))) { - return hi_noun_oblique_f(noun, number); - } - return noun; - return 0; -} - -el_val_t hi_postposition(el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR(""); - } - if (str_eq(gram_case, EL_STR("accusative_animate"))) { - return EL_STR("को"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("को"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("का"); - } - if (str_eq(gram_case, EL_STR("locative_in"))) { - return EL_STR("में"); - } - if (str_eq(gram_case, EL_STR("locative_on"))) { - return EL_STR("पर"); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return EL_STR("से"); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return EL_STR("से"); - } - if (str_eq(gram_case, EL_STR("comitative"))) { - return EL_STR("के साथ"); - } - if (str_eq(gram_case, EL_STR("benefactive"))) { - return EL_STR("के लिए"); - } - return EL_STR(""); - return 0; -} - -el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number) { - if (str_eq(possessed_gender, EL_STR("f"))) { - return EL_STR("की"); - } - if (str_eq(possessed_number, EL_STR("pl"))) { - return EL_STR("के"); - } - return EL_STR("का"); - return 0; -} - -el_val_t hi_verb_stem(el_val_t infinitive) { - if (str_eq(infinitive, EL_STR("होना"))) { - return EL_STR("हो"); - } - if (str_eq(infinitive, EL_STR("करना"))) { - return EL_STR("कर"); - } - if (str_eq(infinitive, EL_STR("जाना"))) { - return EL_STR("जा"); - } - if (str_eq(infinitive, EL_STR("आना"))) { - return EL_STR("आ"); - } - if (str_eq(infinitive, EL_STR("देना"))) { - return EL_STR("दे"); - } - if (str_eq(infinitive, EL_STR("लेना"))) { - return EL_STR("ले"); - } - if (str_eq(infinitive, EL_STR("देखना"))) { - return EL_STR("देख"); - } - if (str_eq(infinitive, EL_STR("कहना"))) { - return EL_STR("कह"); - } - if (str_eq(infinitive, EL_STR("जानना"))) { - return EL_STR("जान"); - } - if (str_eq(infinitive, EL_STR("चाहना"))) { - return EL_STR("चाह"); - } - if (str_eq(infinitive, EL_STR("खाना"))) { - return EL_STR("खा"); - } - if (str_eq(infinitive, EL_STR("पीना"))) { - return EL_STR("पी"); - } - if (str_eq(infinitive, EL_STR("सोना"))) { - return EL_STR("सो"); - } - if (str_eq(infinitive, EL_STR("लिखना"))) { - return EL_STR("लिख"); - } - if (str_eq(infinitive, EL_STR("पढ़ना"))) { - return EL_STR("पढ़"); - } - if (str_eq(infinitive, EL_STR("बोलना"))) { - return EL_STR("बोल"); - } - if (str_eq(infinitive, EL_STR("चलना"))) { - return EL_STR("चल"); - } - if (str_eq(infinitive, EL_STR("बैठना"))) { - return EL_STR("बैठ"); - } - if (str_eq(infinitive, EL_STR("उठना"))) { - return EL_STR("उठ"); - } - if (str_eq(infinitive, EL_STR("मिलना"))) { - return EL_STR("मिल"); - } - if (str_eq(infinitive, EL_STR("रहना"))) { - return EL_STR("रह"); - } - if (str_eq(infinitive, EL_STR("सुनना"))) { - return EL_STR("सुन"); - } - if (str_eq(infinitive, EL_STR("समझना"))) { - return EL_STR("समझ"); - } - if (str_eq(infinitive, EL_STR("मानना"))) { - return EL_STR("मान"); - } - if (str_eq(infinitive, EL_STR("बनाना"))) { - return EL_STR("बना"); - } - if (str_eq(infinitive, EL_STR("लाना"))) { - return EL_STR("ला"); - } - if (str_eq(infinitive, EL_STR("भेजना"))) { - return EL_STR("भेज"); - } - if (str_eq(infinitive, EL_STR("खोलना"))) { - return EL_STR("खोल"); - } - if (str_eq(infinitive, EL_STR("बंद करना"))) { - return EL_STR("बंद कर"); - } - if (hi_str_ends(infinitive, EL_STR("ना"))) { - return hi_str_drop_last(infinitive, 1); - } - return infinitive; - return 0; -} - -el_val_t hi_verb_stem_clean(el_val_t infinitive) { - if (str_eq(infinitive, EL_STR("होना"))) { - return EL_STR("हो"); - } - if (str_eq(infinitive, EL_STR("करना"))) { - return EL_STR("कर"); - } - if (str_eq(infinitive, EL_STR("जाना"))) { - return EL_STR("जा"); - } - if (str_eq(infinitive, EL_STR("आना"))) { - return EL_STR("आ"); - } - if (str_eq(infinitive, EL_STR("देना"))) { - return EL_STR("दे"); - } - if (str_eq(infinitive, EL_STR("लेना"))) { - return EL_STR("ले"); - } - if (str_eq(infinitive, EL_STR("देखना"))) { - return EL_STR("देख"); - } - if (str_eq(infinitive, EL_STR("कहना"))) { - return EL_STR("कह"); - } - if (str_eq(infinitive, EL_STR("जानना"))) { - return EL_STR("जान"); - } - if (str_eq(infinitive, EL_STR("चाहना"))) { - return EL_STR("चाह"); - } - if (str_eq(infinitive, EL_STR("खाना"))) { - return EL_STR("खा"); - } - if (str_eq(infinitive, EL_STR("पीना"))) { - return EL_STR("पी"); - } - if (str_eq(infinitive, EL_STR("सोना"))) { - return EL_STR("सो"); - } - if (str_eq(infinitive, EL_STR("लिखना"))) { - return EL_STR("लिख"); - } - if (str_eq(infinitive, EL_STR("पढ़ना"))) { - return EL_STR("पढ़"); - } - if (str_eq(infinitive, EL_STR("बोलना"))) { - return EL_STR("बोल"); - } - if (str_eq(infinitive, EL_STR("चलना"))) { - return EL_STR("चल"); - } - if (str_eq(infinitive, EL_STR("बैठना"))) { - return EL_STR("बैठ"); - } - if (str_eq(infinitive, EL_STR("उठना"))) { - return EL_STR("उठ"); - } - if (str_eq(infinitive, EL_STR("मिलना"))) { - return EL_STR("मिल"); - } - if (str_eq(infinitive, EL_STR("रहना"))) { - return EL_STR("रह"); - } - if (str_eq(infinitive, EL_STR("सुनना"))) { - return EL_STR("सुन"); - } - if (str_eq(infinitive, EL_STR("समझना"))) { - return EL_STR("समझ"); - } - if (str_eq(infinitive, EL_STR("मानना"))) { - return EL_STR("मान"); - } - if (str_eq(infinitive, EL_STR("बनाना"))) { - return EL_STR("बना"); - } - if (str_eq(infinitive, EL_STR("लाना"))) { - return EL_STR("ला"); - } - if (str_eq(infinitive, EL_STR("भेजना"))) { - return EL_STR("भेज"); - } - if (str_eq(infinitive, EL_STR("खोलना"))) { - return EL_STR("खोल"); - } - if (hi_str_ends(infinitive, EL_STR("ना"))) { - return hi_str_drop_last(infinitive, 2); - } - return infinitive; - return 0; -} - -el_val_t hi_present_aspect(el_val_t gender, el_val_t number) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ती"); - } - if (str_eq(number, EL_STR("pl"))) { - return EL_STR("ते"); - } - return EL_STR("ता"); - return 0; -} - -el_val_t hi_aux_present(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("हूँ"); - } - return EL_STR("हैं"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("हो"); - } - return EL_STR("हो"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("है"); - } - return EL_STR("हैं"); - return 0; -} - -el_val_t hi_past_suffix(el_val_t gender, el_val_t number) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("आ"); - } - return EL_STR("ए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ई"); - } - return EL_STR("ईं"); - return 0; -} - -el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number) { - if (str_eq(stem, EL_STR("हो"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("था"); - } - return EL_STR("थे"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("थी"); - } - return EL_STR("थीं"); - } - if (str_eq(stem, EL_STR("जा"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("गया"); - } - return EL_STR("गए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("गई"); - } - return EL_STR("गईं"); - } - if (str_eq(stem, EL_STR("कर"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("किया"); - } - return EL_STR("किए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("की"); - } - return EL_STR("कीं"); - } - if (str_eq(stem, EL_STR("दे"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("दिया"); - } - return EL_STR("दिए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("दी"); - } - return EL_STR("दीं"); - } - if (str_eq(stem, EL_STR("ले"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("लिया"); - } - return EL_STR("लिए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ली"); - } - return EL_STR("लीं"); - } - if (str_eq(stem, EL_STR("आ"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("आया"); - } - return EL_STR("आए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("आई"); - } - return EL_STR("आईं"); - } - if (str_eq(stem, EL_STR("खा"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("खाया"); - } - return EL_STR("खाए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("खाई"); - } - return EL_STR("खाईं"); - } - if (str_eq(stem, EL_STR("पी"))) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("पिया"); - } - return EL_STR("पिए"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("पी"); - } - return EL_STR("पीं"); - } - return EL_STR(""); - return 0; -} - -el_val_t hi_future_suffix(el_val_t person, el_val_t number, el_val_t gender) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ऊँगी"); - } - return EL_STR("ऊँगा"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("एंगी"); - } - return EL_STR("एंगे"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ओगी"); - } - return EL_STR("ओगे"); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("एगी"); - } - return EL_STR("एगा"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("एंगी"); - } - return EL_STR("एंगे"); - return 0; -} - -el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number) { - if (str_eq(tense, EL_STR("present"))) { - return hi_present_aspect(gender, number); - } - if (str_eq(tense, EL_STR("past"))) { - return hi_past_suffix(gender, number); - } - return EL_STR(""); - return 0; -} - -el_val_t hi_hona_present(el_val_t person, el_val_t number) { - return hi_aux_present(person, number); - return 0; -} - -el_val_t hi_hona_past(el_val_t gender, el_val_t number) { - if (str_eq(gender, EL_STR("m"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("था"); - } - return EL_STR("थे"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("थी"); - } - return EL_STR("थीं"); - return 0; -} - -el_val_t hi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) { - el_val_t stem = hi_verb_stem_clean(verb); - if (str_eq(verb, EL_STR("होना"))) { - if (str_eq(tense, EL_STR("present"))) { - return hi_hona_present(person, number); - } - if (str_eq(tense, EL_STR("past"))) { - return hi_hona_past(gender, number); - } - return el_str_concat(EL_STR("हो"), hi_future_suffix(person, number, gender)); - } - if (str_eq(tense, EL_STR("present"))) { - el_val_t aspect = hi_present_aspect(gender, number); - el_val_t aux = hi_aux_present(person, number); - return el_str_concat(el_str_concat(el_str_concat(stem, aspect), EL_STR(" ")), aux); - } - if (str_eq(tense, EL_STR("past"))) { - el_val_t irreg = hi_past_irregular(stem, gender, number); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - return el_str_concat(stem, hi_past_suffix(gender, number)); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(stem, hi_future_suffix(person, number, gender)); - } - return verb; - return 0; -} - -el_val_t hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case) { - el_val_t post = hi_postposition(gram_case); - if (str_eq(post, EL_STR(""))) { - return hi_noun_direct(noun, gender, number); - } - el_val_t oblique = hi_noun_oblique(noun, gender, number); - return el_str_concat(el_str_concat(oblique, EL_STR(" ")), post); - return 0; -} - -el_val_t hi_genitive_phrase(el_val_t possessor, el_val_t possessor_gender, el_val_t possessor_number, el_val_t possessed, el_val_t possessed_gender, el_val_t possessed_number) { - el_val_t obl = hi_noun_oblique(possessor, possessor_gender, possessor_number); - el_val_t gen = hi_agree_genitive(possessed_gender, possessed_number); - el_val_t poss = hi_noun_direct(possessed, possessed_gender, possessed_number); - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(obl, EL_STR(" ")), gen), EL_STR(" ")), poss); - return 0; -} - -el_val_t sw_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t sw_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t sw_str_first_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, 0, 1); - return 0; -} - -el_val_t sw_str_first2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, 0, 2); - return 0; -} - -el_val_t sw_str_first3(el_val_t s) { - el_val_t n = str_len(s); - if (n < 3) { - return s; - } - return str_slice(s, 0, 3); - return 0; -} - -el_val_t sw_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t sw_is_class1_noun(el_val_t noun) { - if (str_eq(noun, EL_STR("mtu"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwanafunzi"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwalimu"))) { - return 1; - } - if (str_eq(noun, EL_STR("mke"))) { - return 1; - } - if (str_eq(noun, EL_STR("mume"))) { - return 1; - } - if (str_eq(noun, EL_STR("mtoto"))) { - return 1; - } - if (str_eq(noun, EL_STR("mgeni"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwana"))) { - return 1; - } - if (str_eq(noun, EL_STR("mkubwa"))) { - return 1; - } - if (str_eq(noun, EL_STR("mdogo"))) { - return 1; - } - if (str_eq(noun, EL_STR("mgonjwa"))) { - return 1; - } - if (str_eq(noun, EL_STR("mfanyakazi"))) { - return 1; - } - if (str_eq(noun, EL_STR("mkulima"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwimbaji"))) { - return 1; - } - if (str_eq(noun, EL_STR("msomaji"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwandishi"))) { - return 1; - } - if (str_eq(noun, EL_STR("mpiganaji"))) { - return 1; - } - if (str_eq(noun, EL_STR("msaidizi"))) { - return 1; - } - if (str_eq(noun, EL_STR("mpishi"))) { - return 1; - } - if (str_eq(noun, EL_STR("mwanasheria"))) { - return 1; - } - if (str_eq(noun, EL_STR("daktari"))) { - return 1; - } - if (str_eq(noun, EL_STR("rafiki"))) { - return 1; - } - if (str_eq(noun, EL_STR("ndugu"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t sw_noun_class(el_val_t noun) { - if (sw_str_ends(noun, EL_STR("ku"))) { - if (str_eq(sw_str_first2(noun), EL_STR("ku"))) { - return EL_STR("15"); - } - } - if (str_eq(sw_str_first2(noun), EL_STR("ku"))) { - return EL_STR("15"); - } - el_val_t p2 = sw_str_first2(noun); - if (str_eq(p2, EL_STR("ku"))) { - return EL_STR("15"); - } - el_val_t p3 = sw_str_first3(noun); - if (str_eq(p3, EL_STR("ki-"))) { - return EL_STR("7"); - } - if (str_eq(p2, EL_STR("ki"))) { - return EL_STR("7"); - } - if (str_eq(p2, EL_STR("ch"))) { - return EL_STR("7"); - } - el_val_t p1 = sw_str_first_char(noun); - if (str_eq(p1, EL_STR("u"))) { - return EL_STR("11"); - } - if (str_eq(p1, EL_STR("w"))) { - return EL_STR("11"); - } - if (str_eq(p2, EL_STR("ji"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("jicho"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("jino"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("bega"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("tunda"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("embe"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("gari"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("bei"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("sauti"))) { - return EL_STR("5"); - } - if (str_eq(noun, EL_STR("thamani"))) { - return EL_STR("5"); - } - if (str_eq(p1, EL_STR("m"))) { - if (sw_is_class1_noun(noun)) { - return EL_STR("1"); - } - return EL_STR("3"); - } - if (str_eq(p2, EL_STR("mw"))) { - if (sw_is_class1_noun(noun)) { - return EL_STR("1"); - } - return EL_STR("3"); - } - if (str_eq(p2, EL_STR("ny"))) { - return EL_STR("9"); - } - if (str_eq(p2, EL_STR("ng"))) { - return EL_STR("9"); - } - if (str_eq(p2, EL_STR("mb"))) { - return EL_STR("9"); - } - if (str_eq(p2, EL_STR("nd"))) { - return EL_STR("9"); - } - if (str_eq(p2, EL_STR("nj"))) { - return EL_STR("9"); - } - if (str_eq(p2, EL_STR("nz"))) { - return EL_STR("9"); - } - if (str_eq(p1, EL_STR("n"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("paka"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("mbwa"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("simba"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("tembo"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("nyoka"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("samaki"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("rafiki"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("daktari"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("serikali"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("hospitali"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("shule"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("kanisa"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("ofisi"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("picha"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("sehemu"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("habari"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("nchi"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("bahari"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("dunia"))) { - return EL_STR("9"); - } - if (str_eq(noun, EL_STR("ardhi"))) { - return EL_STR("9"); - } - return EL_STR("9"); - return 0; -} - -el_val_t sw_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ni"); - } - return EL_STR("tu"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("u"); - } - return EL_STR("m"); - } - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("2"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("4"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("ya"); - } - if (str_eq(noun_class, EL_STR("6"))) { - return EL_STR("ya"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("8"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("zi"); - } - if (str_eq(noun_class, EL_STR("10"))) { - return EL_STR("zi"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("zi"); - } - return EL_STR("zi"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("a"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("u"); - } - if (str_eq(noun_class, EL_STR("4"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("li"); - } - if (str_eq(noun_class, EL_STR("6"))) { - return EL_STR("ya"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("ki"); - } - if (str_eq(noun_class, EL_STR("8"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("10"))) { - return EL_STR("zi"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("u"); - } - if (str_eq(noun_class, EL_STR("15"))) { - return EL_STR("ku"); - } - return EL_STR("a"); - return 0; -} - -el_val_t sw_obj_prefix(el_val_t person, el_val_t number, el_val_t noun_class) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ni"); - } - return EL_STR("tu"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ku"); - } - return EL_STR("wa"); - } - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("2"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("4"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("ya"); - } - if (str_eq(noun_class, EL_STR("6"))) { - return EL_STR("ya"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("8"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("zi"); - } - if (str_eq(noun_class, EL_STR("10"))) { - return EL_STR("zi"); - } - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("m"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("u"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("li"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("ki"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("i"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("u"); - } - if (str_eq(noun_class, EL_STR("15"))) { - return EL_STR("ku"); - } - return EL_STR("m"); - return 0; -} - -el_val_t sw_tense_marker(el_val_t tense) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR("a"); - } - if (str_eq(tense, EL_STR("progressive"))) { - return EL_STR("na"); - } - if (str_eq(tense, EL_STR("past"))) { - return EL_STR("li"); - } - if (str_eq(tense, EL_STR("future"))) { - return EL_STR("ta"); - } - if (str_eq(tense, EL_STR("perfect"))) { - return EL_STR("me"); - } - if (str_eq(tense, EL_STR("subjunctive"))) { - return EL_STR(""); - } - if (str_eq(tense, EL_STR("remote_past"))) { - return EL_STR("li"); - } - return EL_STR("na"); - return 0; -} - -el_val_t sw_verb_final(el_val_t tense, el_val_t negative) { - if (negative) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR("i"); - } - if (str_eq(tense, EL_STR("progressive"))) { - return EL_STR("i"); - } - if (str_eq(tense, EL_STR("subjunctive"))) { - return EL_STR("e"); - } - return EL_STR("a"); - } - if (str_eq(tense, EL_STR("subjunctive"))) { - return EL_STR("e"); - } - return EL_STR("a"); - return 0; -} - -el_val_t sw_neg_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("si"); - } - return EL_STR("hatu"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("hu"); - } - return EL_STR("ham"); - } - el_val_t pos = sw_subj_prefix(person, number, noun_class); - return el_str_concat(EL_STR("ha"), pos); - return 0; -} - -el_val_t sw_verb_stem(el_val_t infinitive) { - if (str_eq(infinitive, EL_STR("kula"))) { - return EL_STR("l"); - } - if (str_eq(infinitive, EL_STR("kuwa"))) { - return EL_STR("wa"); - } - if (str_eq(infinitive, EL_STR("kwenda"))) { - return EL_STR("enda"); - } - if (str_eq(infinitive, EL_STR("kuja"))) { - return EL_STR("ja"); - } - if (str_eq(infinitive, EL_STR("kusoma"))) { - return EL_STR("soma"); - } - if (str_eq(infinitive, EL_STR("kusema"))) { - return EL_STR("sema"); - } - if (str_eq(infinitive, EL_STR("kuona"))) { - return EL_STR("ona"); - } - if (str_eq(infinitive, EL_STR("kufanya"))) { - return EL_STR("fanya"); - } - if (str_eq(infinitive, EL_STR("kutaka"))) { - return EL_STR("taka"); - } - if (str_eq(infinitive, EL_STR("kujua"))) { - return EL_STR("jua"); - } - if (str_eq(infinitive, EL_STR("kupata"))) { - return EL_STR("pata"); - } - if (str_eq(infinitive, EL_STR("kuambia"))) { - return EL_STR("ambia"); - } - if (str_eq(infinitive, EL_STR("kuleta"))) { - return EL_STR("leta"); - } - if (str_eq(infinitive, EL_STR("kuweka"))) { - return EL_STR("weka"); - } - if (str_eq(infinitive, EL_STR("kuingia"))) { - return EL_STR("ingia"); - } - if (str_eq(infinitive, EL_STR("kutoka"))) { - return EL_STR("toka"); - } - if (str_eq(infinitive, EL_STR("kupiga"))) { - return EL_STR("piga"); - } - if (str_eq(infinitive, EL_STR("kuimba"))) { - return EL_STR("imba"); - } - if (str_eq(infinitive, EL_STR("kucheza"))) { - return EL_STR("cheza"); - } - if (str_eq(infinitive, EL_STR("kulala"))) { - return EL_STR("lala"); - } - if (str_eq(infinitive, EL_STR("kuandika"))) { - return EL_STR("andika"); - } - if (str_eq(infinitive, EL_STR("kununua"))) { - return EL_STR("nunua"); - } - if (str_eq(infinitive, EL_STR("kuuza"))) { - return EL_STR("uza"); - } - if (str_eq(infinitive, EL_STR("kupenda"))) { - return EL_STR("penda"); - } - if (str_eq(infinitive, EL_STR("kuchukua"))) { - return EL_STR("chukua"); - } - if (str_eq(infinitive, EL_STR("kulipa"))) { - return EL_STR("lipa"); - } - if (str_eq(infinitive, EL_STR("kusikia"))) { - return EL_STR("sikia"); - } - if (str_eq(infinitive, EL_STR("kuamka"))) { - return EL_STR("amka"); - } - if (str_eq(infinitive, EL_STR("kukaa"))) { - return EL_STR("kaa"); - } - if (str_eq(infinitive, EL_STR("kurudi"))) { - return EL_STR("rudi"); - } - if (str_eq(infinitive, EL_STR("kushinda"))) { - return EL_STR("shinda"); - } - if (str_eq(infinitive, EL_STR("kusaidia"))) { - return EL_STR("saidia"); - } - if (str_eq(infinitive, EL_STR("kuzungumza"))) { - return EL_STR("zungumza"); - } - if (str_eq(infinitive, EL_STR("kupumzika"))) { - return EL_STR("pumzika"); - } - if (str_eq(infinitive, EL_STR("kufika"))) { - return EL_STR("fika"); - } - if (str_eq(infinitive, EL_STR("kuomba"))) { - return EL_STR("omba"); - } - if (str_eq(infinitive, EL_STR("kushukuru"))) { - return EL_STR("shukuru"); - } - if (str_eq(sw_str_first2(infinitive), EL_STR("ku"))) { - return str_slice(infinitive, 2, str_len(infinitive)); - } - if (str_eq(sw_str_first2(infinitive), EL_STR("kw"))) { - return str_slice(infinitive, 2, str_len(infinitive)); - } - return infinitive; - return 0; -} - -el_val_t sw_conjugate(el_val_t verb_stem, el_val_t person, el_val_t number, el_val_t noun_class, el_val_t tense) { - el_val_t subj = sw_subj_prefix(person, number, noun_class); - el_val_t tm = sw_tense_marker(tense); - el_val_t fv = sw_verb_final(tense, 0); - if (str_eq(verb_stem, EL_STR("l"))) { - if (str_eq(tm, EL_STR(""))) { - return el_str_concat(subj, EL_STR("kula")); - } - return el_str_concat(el_str_concat(subj, tm), EL_STR("kula")); - } - if (str_eq(verb_stem, EL_STR("wa"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("ni"); - } - return EL_STR("tu ni"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("u"); - } - return EL_STR("m ni"); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("yuko"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("upo"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("lipo"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("kipo"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("ipo"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("upo"); - } - return EL_STR("yuko"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wako"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("ipo"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("yapo"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("vipo"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("zipo"); - } - return EL_STR("wako"); - } - if (str_eq(tense, EL_STR("progressive"))) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("niko"); - } - return EL_STR("tuko"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("uko"); - } - return EL_STR("mko"); - } - if (str_eq(number, EL_STR("sg"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("yuko"); - } - return el_str_concat(subj, EL_STR("ko")); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wako"); - } - return el_str_concat(subj, EL_STR("ko")); - } - } - el_val_t stem_final = sw_str_last_char(verb_stem); - if (str_eq(fv, EL_STR("a"))) { - if (str_eq(stem_final, EL_STR("a"))) { - if (str_eq(tm, EL_STR(""))) { - return el_str_concat(subj, verb_stem); - } - return el_str_concat(el_str_concat(subj, tm), verb_stem); - } - } - if (str_eq(tm, EL_STR(""))) { - return el_str_concat(el_str_concat(subj, verb_stem), fv); - } - return el_str_concat(el_str_concat(el_str_concat(subj, tm), verb_stem), fv); - return 0; -} - -el_val_t sw_negative(el_val_t verb_stem, el_val_t person, el_val_t number, el_val_t noun_class, el_val_t tense) { - el_val_t neg_subj = sw_neg_subj_prefix(person, number, noun_class); - if (str_eq(verb_stem, EL_STR("l"))) { - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(neg_subj, EL_STR("kukula")); - } - if (str_eq(tense, EL_STR("perfect"))) { - return el_str_concat(neg_subj, EL_STR("jakula")); - } - return el_str_concat(neg_subj, EL_STR("kuli")); - } - if (str_eq(tense, EL_STR("present"))) { - el_val_t fv = sw_verb_final(EL_STR("present"), 1); - el_val_t stem_no_a = verb_stem; - el_val_t slen = str_len(verb_stem); - if (slen > 0) { - el_val_t last = sw_str_last_char(verb_stem); - if (str_eq(last, EL_STR("a"))) { - return el_str_concat(el_str_concat(neg_subj, sw_str_drop_last(verb_stem, 1)), fv); - } - } - return el_str_concat(el_str_concat(neg_subj, verb_stem), fv); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(el_str_concat(el_str_concat(neg_subj, EL_STR("ku")), verb_stem), EL_STR("a")); - } - if (str_eq(tense, EL_STR("future"))) { - el_val_t fv = sw_verb_final(EL_STR("present"), 1); - return el_str_concat(el_str_concat(el_str_concat(neg_subj, EL_STR("ta")), verb_stem), fv); - } - if (str_eq(tense, EL_STR("perfect"))) { - return el_str_concat(el_str_concat(el_str_concat(neg_subj, EL_STR("ja")), verb_stem), EL_STR("a")); - } - if (str_eq(tense, EL_STR("progressive"))) { - el_val_t fv = sw_verb_final(EL_STR("present"), 1); - el_val_t slen = str_len(verb_stem); - if (slen > 0) { - el_val_t last = sw_str_last_char(verb_stem); - if (str_eq(last, EL_STR("a"))) { - return el_str_concat(el_str_concat(neg_subj, sw_str_drop_last(verb_stem, 1)), fv); - } - } - return el_str_concat(el_str_concat(neg_subj, verb_stem), fv); - } - return el_str_concat(el_str_concat(neg_subj, verb_stem), EL_STR("i")); - return 0; -} - -el_val_t sw_noun_plural(el_val_t noun) { - if (str_eq(noun, EL_STR("mtu"))) { - return EL_STR("watu"); - } - if (str_eq(noun, EL_STR("mtoto"))) { - return EL_STR("watoto"); - } - if (str_eq(noun, EL_STR("mke"))) { - return EL_STR("wake"); - } - if (str_eq(noun, EL_STR("mume"))) { - return EL_STR("waume"); - } - if (str_eq(noun, EL_STR("mwana"))) { - return EL_STR("wana"); - } - if (str_eq(noun, EL_STR("mwalimu"))) { - return EL_STR("walimu"); - } - if (str_eq(noun, EL_STR("mgeni"))) { - return EL_STR("wageni"); - } - if (str_eq(noun, EL_STR("mwanafunzi"))) { - return EL_STR("wanafunzi"); - } - if (str_eq(noun, EL_STR("mfanyakazi"))) { - return EL_STR("wafanyakazi"); - } - if (str_eq(noun, EL_STR("mkulima"))) { - return EL_STR("wakulima"); - } - if (str_eq(noun, EL_STR("mgonjwa"))) { - return EL_STR("wagonjwa"); - } - if (str_eq(noun, EL_STR("jicho"))) { - return EL_STR("macho"); - } - if (str_eq(noun, EL_STR("jino"))) { - return EL_STR("meno"); - } - if (str_eq(noun, EL_STR("bega"))) { - return EL_STR("mabega"); - } - if (str_eq(noun, EL_STR("tunda"))) { - return EL_STR("matunda"); - } - if (str_eq(noun, EL_STR("gari"))) { - return EL_STR("magari"); - } - if (str_eq(noun, EL_STR("embe"))) { - return EL_STR("maembe"); - } - if (str_eq(noun, EL_STR("wimbo"))) { - return EL_STR("nyimbo"); - } - if (str_eq(noun, EL_STR("ubao"))) { - return EL_STR("mbao"); - } - if (str_eq(noun, EL_STR("ugonjwa"))) { - return EL_STR("magonjwa"); - } - if (str_eq(noun, EL_STR("uso"))) { - return EL_STR("nyuso"); - } - if (str_eq(noun, EL_STR("ukuta"))) { - return EL_STR("kuta"); - } - if (str_eq(noun, EL_STR("ulimi"))) { - return EL_STR("ndimi"); - } - if (str_eq(noun, EL_STR("upande"))) { - return EL_STR("pande"); - } - if (str_eq(noun, EL_STR("uwezo"))) { - return EL_STR("nguvu"); - } - if (str_eq(noun, EL_STR("paka"))) { - return EL_STR("paka"); - } - if (str_eq(noun, EL_STR("samaki"))) { - return EL_STR("samaki"); - } - if (str_eq(noun, EL_STR("rafiki"))) { - return EL_STR("rafiki"); - } - if (str_eq(noun, EL_STR("daktari"))) { - return EL_STR("madaktari"); - } - if (str_eq(noun, EL_STR("habari"))) { - return EL_STR("habari"); - } - if (str_eq(noun, EL_STR("nchi"))) { - return EL_STR("nchi"); - } - if (str_eq(noun, EL_STR("bahari"))) { - return EL_STR("bahari"); - } - if (str_eq(noun, EL_STR("shule"))) { - return EL_STR("shule"); - } - if (str_eq(noun, EL_STR("hospitali"))) { - return EL_STR("hospitali"); - } - if (str_eq(noun, EL_STR("ofisi"))) { - return EL_STR("ofisi"); - } - if (str_eq(noun, EL_STR("serikali"))) { - return EL_STR("serikali"); - } - if (sw_is_class1_noun(noun)) { - if (str_eq(sw_str_first2(noun), EL_STR("mw"))) { - return el_str_concat(EL_STR("wa"), str_slice(noun, 2, str_len(noun))); - } - if (str_eq(sw_str_first_char(noun), EL_STR("m"))) { - return el_str_concat(EL_STR("wa"), str_slice(noun, 1, str_len(noun))); - } - } - el_val_t p2 = sw_str_first2(noun); - if (str_eq(p2, EL_STR("ki"))) { - return el_str_concat(EL_STR("vi"), str_slice(noun, 2, str_len(noun))); - } - if (str_eq(p2, EL_STR("ch"))) { - return el_str_concat(EL_STR("vy"), str_slice(noun, 2, str_len(noun))); - } - if (str_eq(p2, EL_STR("ji"))) { - return el_str_concat(EL_STR("ma"), str_slice(noun, 2, str_len(noun))); - } - el_val_t p1 = sw_str_first_char(noun); - if (str_eq(p1, EL_STR("u"))) { - return str_slice(noun, 1, str_len(noun)); - } - if (str_eq(p1, EL_STR("m"))) { - if (str_eq(p2, EL_STR("mw"))) { - return el_str_concat(EL_STR("mi"), str_slice(noun, 2, str_len(noun))); - } - return el_str_concat(EL_STR("mi"), str_slice(noun, 1, str_len(noun))); - } - return noun; - return 0; -} - -el_val_t sw_adj_prefix(el_val_t noun_class, el_val_t number) { - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("2"))) { - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("mi"); - } - if (str_eq(noun_class, EL_STR("4"))) { - return EL_STR("mi"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("ma"); - } - if (str_eq(noun_class, EL_STR("6"))) { - return EL_STR("ma"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("8"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("n"); - } - if (str_eq(noun_class, EL_STR("10"))) { - return EL_STR("n"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("n"); - } - return EL_STR("wa"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("m"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("m"); - } - if (str_eq(noun_class, EL_STR("4"))) { - return EL_STR("mi"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("j"); - } - if (str_eq(noun_class, EL_STR("6"))) { - return EL_STR("ma"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("ki"); - } - if (str_eq(noun_class, EL_STR("8"))) { - return EL_STR("vi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("n"); - } - if (str_eq(noun_class, EL_STR("10"))) { - return EL_STR("n"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("mw"); - } - if (str_eq(noun_class, EL_STR("15"))) { - return EL_STR("ku"); - } - return EL_STR(""); - return 0; -} - -el_val_t sw_agree_adj(el_val_t adj_stem, el_val_t noun_class, el_val_t number) { - if (str_eq(adj_stem, EL_STR("nzuri"))) { - return EL_STR("nzuri"); - } - if (str_eq(adj_stem, EL_STR("baya"))) { - return EL_STR("baya"); - } - if (str_eq(adj_stem, EL_STR("safi"))) { - return EL_STR("safi"); - } - if (str_eq(adj_stem, EL_STR("chafu"))) { - return EL_STR("chafu"); - } - if (str_eq(adj_stem, EL_STR("ghali"))) { - return EL_STR("ghali"); - } - if (str_eq(adj_stem, EL_STR("rahisi"))) { - return EL_STR("rahisi"); - } - if (str_eq(adj_stem, EL_STR("mzuri"))) { - return el_str_concat(sw_adj_prefix(noun_class, number), EL_STR("zuri")); - } - el_val_t prefix = sw_adj_prefix(noun_class, number); - if (str_eq(prefix, EL_STR(""))) { - return adj_stem; - } - if (str_eq(prefix, EL_STR("m"))) { - el_val_t first = sw_str_first_char(adj_stem); - if (str_eq(first, EL_STR("a"))) { - return el_str_concat(EL_STR("mw"), adj_stem); - } - if (str_eq(first, EL_STR("e"))) { - return el_str_concat(EL_STR("mw"), adj_stem); - } - if (str_eq(first, EL_STR("i"))) { - return el_str_concat(EL_STR("mw"), adj_stem); - } - if (str_eq(first, EL_STR("o"))) { - return el_str_concat(EL_STR("mw"), adj_stem); - } - if (str_eq(first, EL_STR("u"))) { - return el_str_concat(EL_STR("mw"), adj_stem); - } - return el_str_concat(EL_STR("m"), adj_stem); - } - if (str_eq(prefix, EL_STR("j"))) { - el_val_t first = sw_str_first_char(adj_stem); - if (str_eq(first, EL_STR("a"))) { - return el_str_concat(EL_STR("j"), adj_stem); - } - if (str_eq(first, EL_STR("e"))) { - return el_str_concat(EL_STR("j"), adj_stem); - } - if (str_eq(first, EL_STR("i"))) { - return el_str_concat(EL_STR("j"), adj_stem); - } - if (str_eq(first, EL_STR("o"))) { - return el_str_concat(EL_STR("j"), adj_stem); - } - if (str_eq(first, EL_STR("u"))) { - return el_str_concat(EL_STR("j"), adj_stem); - } - return el_str_concat(EL_STR("l"), adj_stem); - } - return el_str_concat(prefix, adj_stem); - return 0; -} - -el_val_t sw_demonstrative(el_val_t noun_class, el_val_t number, el_val_t proximity) { - if (str_eq(proximity, EL_STR("near"))) { - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("hawa"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("hii"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("haya"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("hivi"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("hizi"); - } - return EL_STR("hawa"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("huyu"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("huu"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("hili"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("hiki"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("hii"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("huu"); - } - if (str_eq(noun_class, EL_STR("15"))) { - return EL_STR("huku"); - } - return EL_STR("hii"); - } - if (str_eq(number, EL_STR("pl"))) { - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("wale"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("ile"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("yale"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("vile"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("zile"); - } - return EL_STR("wale"); - } - if (str_eq(noun_class, EL_STR("1"))) { - return EL_STR("yule"); - } - if (str_eq(noun_class, EL_STR("3"))) { - return EL_STR("ule"); - } - if (str_eq(noun_class, EL_STR("5"))) { - return EL_STR("lile"); - } - if (str_eq(noun_class, EL_STR("7"))) { - return EL_STR("kile"); - } - if (str_eq(noun_class, EL_STR("9"))) { - return EL_STR("ile"); - } - if (str_eq(noun_class, EL_STR("11"))) { - return EL_STR("ule"); - } - if (str_eq(noun_class, EL_STR("15"))) { - return EL_STR("kule"); - } - return EL_STR("ile"); - return 0; -} - -el_val_t sw_copula_present(el_val_t person, el_val_t number, el_val_t use_case) { - if (str_eq(use_case, EL_STR("equative"))) { - if (str_eq(person, EL_STR("1"))) { - return EL_STR("ni"); - } - if (str_eq(person, EL_STR("2"))) { - return EL_STR("ni"); - } - return EL_STR("ni"); - } - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("niko"); - } - return EL_STR("tuko"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("uko"); - } - return EL_STR("mko"); - } - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("yuko"); - } - return EL_STR("wako"); - return 0; -} - -el_val_t sw_copula_neg_present(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("1"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("si"); - } - return EL_STR("si"); - } - if (str_eq(person, EL_STR("2"))) { - if (str_eq(number, EL_STR("sg"))) { - return EL_STR("si"); - } - return EL_STR("si"); - } - return EL_STR("si"); - return 0; -} - -el_val_t la_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t la_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t la_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t la_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t la_str_last3(el_val_t s) { - el_val_t n = str_len(s); - if (n < 3) { - return s; - } - return str_slice(s, (n - 3), n); - return 0; -} - -el_val_t la_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t la_verb_class(el_val_t verb) { - if (la_str_ends(verb, EL_STR("are"))) { - return EL_STR("1"); - } - if (la_str_ends(verb, EL_STR("ire"))) { - return EL_STR("4"); - } - if (la_str_ends(verb, EL_STR("ere"))) { - el_val_t stem = la_str_drop_last(verb, 3); - el_val_t slen = str_len(stem); - if (slen == 0) { - return EL_STR("3"); - } - el_val_t last = str_slice(stem, (slen - 1), slen); - if (str_eq(last, EL_STR("a"))) { - return EL_STR("2"); - } - if (str_eq(last, EL_STR("e"))) { - return EL_STR("2"); - } - if (str_eq(last, EL_STR("i"))) { - return EL_STR("2"); - } - if (str_eq(last, EL_STR("o"))) { - return EL_STR("2"); - } - if (str_eq(last, EL_STR("u"))) { - return EL_STR("2"); - } - return EL_STR("3"); - } - return EL_STR("3"); - return 0; -} - -el_val_t la_stem(el_val_t verb, el_val_t vclass) { - if (str_eq(vclass, EL_STR("1"))) { - return la_str_drop_last(verb, 3); - } - if (str_eq(vclass, EL_STR("2"))) { - return la_str_drop_last(verb, 2); - } - if (str_eq(vclass, EL_STR("3"))) { - return la_str_drop_last(verb, 3); - } - if (str_eq(vclass, EL_STR("4"))) { - return la_str_drop_last(verb, 2); - } - return la_str_drop_last(verb, 3); - return 0; -} - -el_val_t la_perfect_stem(el_val_t verb, el_val_t vclass) { - if (str_eq(vclass, EL_STR("1"))) { - el_val_t pstem = la_str_drop_last(verb, 3); - return el_str_concat(pstem, EL_STR("av")); - } - if (str_eq(vclass, EL_STR("2"))) { - el_val_t pstem = la_str_drop_last(verb, 3); - return el_str_concat(pstem, EL_STR("u")); - } - if (str_eq(vclass, EL_STR("3"))) { - el_val_t pstem = la_str_drop_last(verb, 3); - return pstem; - } - if (str_eq(vclass, EL_STR("4"))) { - el_val_t pstem = la_str_drop_last(verb, 2); - return el_str_concat(pstem, EL_STR("v")); - } - return la_str_drop_last(verb, 3); - return 0; -} - -el_val_t la_perfect_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("i"); - } - if (slot == 1) { - return EL_STR("isti"); - } - if (slot == 2) { - return EL_STR("it"); - } - if (slot == 3) { - return EL_STR("imus"); - } - if (slot == 4) { - return EL_STR("istis"); - } - return EL_STR("erunt"); - return 0; -} - -el_val_t la_present_ending(el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("1"))) { - if (slot == 0) { - return EL_STR("o"); - } - if (slot == 1) { - return EL_STR("as"); - } - if (slot == 2) { - return EL_STR("at"); - } - if (slot == 3) { - return EL_STR("amus"); - } - if (slot == 4) { - return EL_STR("atis"); - } - return EL_STR("ant"); - } - if (str_eq(vclass, EL_STR("2"))) { - if (slot == 0) { - return EL_STR("o"); - } - if (slot == 1) { - return EL_STR("s"); - } - if (slot == 2) { - return EL_STR("t"); - } - if (slot == 3) { - return EL_STR("mus"); - } - if (slot == 4) { - return EL_STR("tis"); - } - return EL_STR("nt"); - } - if (str_eq(vclass, EL_STR("3"))) { - if (slot == 0) { - return EL_STR("o"); - } - if (slot == 1) { - return EL_STR("is"); - } - if (slot == 2) { - return EL_STR("it"); - } - if (slot == 3) { - return EL_STR("imus"); - } - if (slot == 4) { - return EL_STR("itis"); - } - return EL_STR("unt"); - } - if (slot == 0) { - return EL_STR("o"); - } - if (slot == 1) { - return EL_STR("s"); - } - if (slot == 2) { - return EL_STR("t"); - } - if (slot == 3) { - return EL_STR("mus"); - } - if (slot == 4) { - return EL_STR("tis"); - } - return EL_STR("unt"); - return 0; -} - -el_val_t la_present_form(el_val_t stem, el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("1"))) { - if (slot == 0) { - return el_str_concat(la_str_drop_last(stem, 1), EL_STR("o")); - } - return el_str_concat(stem, la_present_ending(vclass, slot)); - } - if (str_eq(vclass, EL_STR("2"))) { - return el_str_concat(stem, la_present_ending(vclass, slot)); - } - if (str_eq(vclass, EL_STR("3"))) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("o")); - } - return el_str_concat(stem, la_present_ending(vclass, slot)); - } - if (slot == 0) { - return el_str_concat(stem, EL_STR("o")); - } - if (slot == 5) { - return el_str_concat(stem, EL_STR("unt")); - } - return el_str_concat(stem, la_present_ending(vclass, slot)); - return 0; -} - -el_val_t la_future_ending_12(el_val_t slot) { - if (slot == 0) { - return EL_STR("bo"); - } - if (slot == 1) { - return EL_STR("bis"); - } - if (slot == 2) { - return EL_STR("bit"); - } - if (slot == 3) { - return EL_STR("bimus"); - } - if (slot == 4) { - return EL_STR("bitis"); - } - return EL_STR("bunt"); - return 0; -} - -el_val_t la_future_ending_34(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("et"); - } - if (slot == 3) { - return EL_STR("emus"); - } - if (slot == 4) { - return EL_STR("etis"); - } - return EL_STR("ent"); - return 0; -} - -el_val_t la_future_form(el_val_t stem, el_val_t vclass, el_val_t slot) { - if (str_eq(vclass, EL_STR("1"))) { - return el_str_concat(stem, la_future_ending_12(slot)); - } - if (str_eq(vclass, EL_STR("2"))) { - return el_str_concat(stem, la_future_ending_12(slot)); - } - if (str_eq(vclass, EL_STR("3"))) { - return el_str_concat(stem, la_future_ending_34(slot)); - } - return el_str_concat(stem, la_future_ending_34(slot)); - return 0; -} - -el_val_t la_esse_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("sum"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("est"); - } - if (slot == 3) { - return EL_STR("sumus"); - } - if (slot == 4) { - return EL_STR("estis"); - } - return EL_STR("sunt"); - return 0; -} - -el_val_t la_esse_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("fui"); - } - if (slot == 1) { - return EL_STR("fuisti"); - } - if (slot == 2) { - return EL_STR("fuit"); - } - if (slot == 3) { - return EL_STR("fuimus"); - } - if (slot == 4) { - return EL_STR("fuistis"); - } - return EL_STR("fuerunt"); - return 0; -} - -el_val_t la_esse_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ero"); - } - if (slot == 1) { - return EL_STR("eris"); - } - if (slot == 2) { - return EL_STR("erit"); - } - if (slot == 3) { - return EL_STR("erimus"); - } - if (slot == 4) { - return EL_STR("eritis"); - } - return EL_STR("erunt"); - return 0; -} - -el_val_t la_ire_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("eo"); - } - if (slot == 1) { - return EL_STR("is"); - } - if (slot == 2) { - return EL_STR("it"); - } - if (slot == 3) { - return EL_STR("imus"); - } - if (slot == 4) { - return EL_STR("itis"); - } - return EL_STR("eunt"); - return 0; -} - -el_val_t la_ire_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("ii"); - } - if (slot == 1) { - return EL_STR("isti"); - } - if (slot == 2) { - return EL_STR("iit"); - } - if (slot == 3) { - return EL_STR("iimus"); - } - if (slot == 4) { - return EL_STR("istis"); - } - return EL_STR("ierunt"); - return 0; -} - -el_val_t la_ire_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ibo"); - } - if (slot == 1) { - return EL_STR("ibis"); - } - if (slot == 2) { - return EL_STR("ibit"); - } - if (slot == 3) { - return EL_STR("ibimus"); - } - if (slot == 4) { - return EL_STR("ibitis"); - } - return EL_STR("ibunt"); - return 0; -} - -el_val_t la_velle_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("volo"); - } - if (slot == 1) { - return EL_STR("vis"); - } - if (slot == 2) { - return EL_STR("vult"); - } - if (slot == 3) { - return EL_STR("volumus"); - } - if (slot == 4) { - return EL_STR("vultis"); - } - return EL_STR("volunt"); - return 0; -} - -el_val_t la_velle_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("volui"); - } - if (slot == 1) { - return EL_STR("voluisti"); - } - if (slot == 2) { - return EL_STR("voluit"); - } - if (slot == 3) { - return EL_STR("voluimus"); - } - if (slot == 4) { - return EL_STR("voluistis"); - } - return EL_STR("voluerunt"); - return 0; -} - -el_val_t la_velle_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("volam"); - } - if (slot == 1) { - return EL_STR("voles"); - } - if (slot == 2) { - return EL_STR("volet"); - } - if (slot == 3) { - return EL_STR("volemus"); - } - if (slot == 4) { - return EL_STR("voletis"); - } - return EL_STR("volent"); - return 0; -} - -el_val_t la_posse_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("possum"); - } - if (slot == 1) { - return EL_STR("potes"); - } - if (slot == 2) { - return EL_STR("potest"); - } - if (slot == 3) { - return EL_STR("possumus"); - } - if (slot == 4) { - return EL_STR("potestis"); - } - return EL_STR("possunt"); - return 0; -} - -el_val_t la_posse_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("potui"); - } - if (slot == 1) { - return EL_STR("potuisti"); - } - if (slot == 2) { - return EL_STR("potuit"); - } - if (slot == 3) { - return EL_STR("potuimus"); - } - if (slot == 4) { - return EL_STR("potuistis"); - } - return EL_STR("potuerunt"); - return 0; -} - -el_val_t la_posse_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("potero"); - } - if (slot == 1) { - return EL_STR("poteris"); - } - if (slot == 2) { - return EL_STR("poterit"); - } - if (slot == 3) { - return EL_STR("poterimus"); - } - if (slot == 4) { - return EL_STR("poteritis"); - } - return EL_STR("poterunt"); - return 0; -} - -el_val_t la_irregular_perfect_stem(el_val_t verb) { - if (str_eq(verb, EL_STR("edere"))) { - return EL_STR("ed"); - } - if (str_eq(verb, EL_STR("dicere"))) { - return EL_STR("dix"); - } - if (str_eq(verb, EL_STR("ducere"))) { - return EL_STR("dux"); - } - if (str_eq(verb, EL_STR("facere"))) { - return EL_STR("fec"); - } - if (str_eq(verb, EL_STR("capere"))) { - return EL_STR("cep"); - } - if (str_eq(verb, EL_STR("venire"))) { - return EL_STR("ven"); - } - if (str_eq(verb, EL_STR("videre"))) { - return EL_STR("vid"); - } - if (str_eq(verb, EL_STR("bibere"))) { - return EL_STR("bib"); - } - if (str_eq(verb, EL_STR("currere"))) { - return EL_STR("cucurr"); - } - if (str_eq(verb, EL_STR("legere"))) { - return EL_STR("leg"); - } - if (str_eq(verb, EL_STR("scribere"))) { - return EL_STR("scrips"); - } - if (str_eq(verb, EL_STR("vivere"))) { - return EL_STR("vix"); - } - if (str_eq(verb, EL_STR("cadere"))) { - return EL_STR("cecid"); - } - if (str_eq(verb, EL_STR("ponere"))) { - return EL_STR("posu"); - } - if (str_eq(verb, EL_STR("querere"))) { - return EL_STR("quaesiv"); - } - return EL_STR(""); - return 0; -} - -el_val_t la_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("esse"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("ire"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("velle"); - } - if (str_eq(verb, EL_STR("can"))) { - return EL_STR("posse"); - } - if (str_eq(verb, EL_STR("eat"))) { - return EL_STR("edere"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("dicere"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("videre"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("facere"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("venire"); - } - if (str_eq(verb, EL_STR("read"))) { - return EL_STR("legere"); - } - if (str_eq(verb, EL_STR("write"))) { - return EL_STR("scribere"); - } - if (str_eq(verb, EL_STR("run"))) { - return EL_STR("currere"); - } - if (str_eq(verb, EL_STR("live"))) { - return EL_STR("vivere"); - } - if (str_eq(verb, EL_STR("love"))) { - return EL_STR("amare"); - } - return verb; - return 0; -} - -el_val_t la_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = la_map_canonical(verb); - el_val_t slot = la_slot(person, number); - if (str_eq(v, EL_STR("esse"))) { - if (str_eq(tense, EL_STR("present"))) { - return la_esse_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return la_esse_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return la_esse_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("ire"))) { - if (str_eq(tense, EL_STR("present"))) { - return la_ire_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return la_ire_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return la_ire_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("velle"))) { - if (str_eq(tense, EL_STR("present"))) { - return la_velle_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return la_velle_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return la_velle_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("posse"))) { - if (str_eq(tense, EL_STR("present"))) { - return la_posse_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return la_posse_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return la_posse_future(slot); - } - return v; - } - el_val_t vclass = la_verb_class(v); - el_val_t stem = la_stem(v, vclass); - if (str_eq(tense, EL_STR("present"))) { - return la_present_form(stem, vclass, slot); - } - if (str_eq(tense, EL_STR("past"))) { - el_val_t irreg_perf = la_irregular_perfect_stem(v); - if (!str_eq(irreg_perf, EL_STR(""))) { - return el_str_concat(irreg_perf, la_perfect_ending(slot)); - } - el_val_t perf_stem = la_perfect_stem(v, vclass); - return el_str_concat(perf_stem, la_perfect_ending(slot)); - } - if (str_eq(tense, EL_STR("future"))) { - return la_future_form(stem, vclass, slot); - } - return v; - return 0; -} - -el_val_t la_declension(el_val_t noun) { - if (la_str_ends(noun, EL_STR("a"))) { - return EL_STR("1"); - } - if (la_str_ends(noun, EL_STR("um"))) { - return EL_STR("2n"); - } - if (la_str_ends(noun, EL_STR("er"))) { - return EL_STR("2m"); - } - if (la_str_ends(noun, EL_STR("us"))) { - if (str_eq(noun, EL_STR("manus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("usus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("fructus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("gradus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("cursus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("sensus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("spiritus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("portus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("domus"))) { - return EL_STR("4"); - } - if (str_eq(noun, EL_STR("impetus"))) { - return EL_STR("4"); - } - return EL_STR("2m"); - } - if (la_str_ends(noun, EL_STR("es"))) { - return EL_STR("5"); - } - if (la_str_ends(noun, EL_STR("is"))) { - return EL_STR("3"); - } - return EL_STR("3"); - return 0; -} - -el_val_t la_decline_1(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ae")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ae")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("am")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("a")); - } - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ae")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("arum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("is")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("as")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("is")); - } - return el_str_concat(stem, EL_STR("ae")); - return 0; -} - -el_val_t la_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("o")); - } - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("orum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("is")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("os")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("is")); - } - return el_str_concat(stem, EL_STR("i")); - return 0; -} - -el_val_t la_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("o")); - } - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("orum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("is")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("is")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t la_decline_3(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t oblique_stem = EL_STR(""); - if (la_str_ends(noun, EL_STR("is"))) { - oblique_stem = la_str_drop_last(noun, 2); - } else { - oblique_stem = noun; - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(oblique_stem, EL_STR("is")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(oblique_stem, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(oblique_stem, EL_STR("em")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(oblique_stem, EL_STR("e")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(oblique_stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(oblique_stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(oblique_stem, EL_STR("ibus")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(oblique_stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(oblique_stem, EL_STR("ibus")); - } - return el_str_concat(oblique_stem, EL_STR("es")); - return 0; -} - -el_val_t la_decline_4(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ui")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("u")); - } - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("uum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ibus")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("us")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ibus")); - } - return el_str_concat(stem, EL_STR("us")); - return 0; -} - -el_val_t la_decline_5(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ei")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ei")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("em")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("e")); - } - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("erum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ebus")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ebus")); - } - return el_str_concat(stem, EL_STR("es")); - return 0; -} - -el_val_t la_decline_2er(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stem = la_str_drop_last(noun, 1); - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ri")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ro")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("rum")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ro")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ri")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("rorum")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ris")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ros")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ris")); - } - return el_str_concat(stem, EL_STR("ri")); - return 0; -} - -el_val_t la_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t decl = la_declension(noun); - if (str_eq(decl, EL_STR("1"))) { - el_val_t stem = la_str_drop_last(noun, 1); - return la_decline_1(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("2m"))) { - el_val_t stem = la_str_drop_last(noun, 2); - return la_decline_2m(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("2n"))) { - el_val_t stem = la_str_drop_last(noun, 2); - return la_decline_2n(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("2er"))) { - return la_decline_2er(noun, gram_case, number); - } - if (str_eq(decl, EL_STR("3"))) { - return la_decline_3(noun, gram_case, number); - } - if (str_eq(decl, EL_STR("4"))) { - el_val_t stem = la_str_drop_last(noun, 2); - return la_decline_4(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("5"))) { - el_val_t stem = la_str_drop_last(noun, 2); - return la_decline_5(stem, gram_case, number); - } - return noun; - return 0; -} - -el_val_t la_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return la_decline(noun, gram_case, number); - return 0; -} - -el_val_t ja_verb_group(el_val_t dict_form) { - if (str_eq(dict_form, EL_STR("する"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("くる"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("くる"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("いる"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("ある"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("だ"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("suru"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("kuru"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("iru"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("aru"))) { - return EL_STR("irregular"); - } - if (str_eq(dict_form, EL_STR("da"))) { - return EL_STR("irregular"); - } - if (str_ends_with(dict_form, EL_STR("る"))) { - return EL_STR("ichidan"); - } - if (str_ends_with(dict_form, EL_STR("eru"))) { - return EL_STR("ichidan"); - } - if (str_ends_with(dict_form, EL_STR("iru"))) { - return EL_STR("ichidan"); - } - return EL_STR("godan"); - return 0; -} - -el_val_t ja_ichidan_stem(el_val_t dict_form) { - if (str_ends_with(dict_form, EL_STR("る"))) { - el_val_t n = str_len(dict_form); - return str_drop_last(dict_form, 1); - } - if (str_ends_with(dict_form, EL_STR("ru"))) { - el_val_t n = str_len(dict_form); - return str_slice(dict_form, 0, (n - 2)); - } - return dict_form; - return 0; -} - -el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row) { - el_val_t n = str_len(dict_form); - if (n == 0) { - return dict_form; - } - if (str_eq(row, EL_STR("i"))) { - if (str_ends_with(dict_form, EL_STR("く"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("き")); - } - if (str_ends_with(dict_form, EL_STR("ぐ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ぎ")); - } - if (str_ends_with(dict_form, EL_STR("す"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("し")); - } - if (str_ends_with(dict_form, EL_STR("つ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ち")); - } - if (str_ends_with(dict_form, EL_STR("ぬ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("に")); - } - if (str_ends_with(dict_form, EL_STR("ぶ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("び")); - } - if (str_ends_with(dict_form, EL_STR("む"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("み")); - } - if (str_ends_with(dict_form, EL_STR("る"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("り")); - } - if (str_ends_with(dict_form, EL_STR("う"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("い")); - } - if (str_ends_with(dict_form, EL_STR("ku"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ki")); - } - if (str_ends_with(dict_form, EL_STR("gu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("gi")); - } - if (str_ends_with(dict_form, EL_STR("su"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("shi")); - } - if (str_ends_with(dict_form, EL_STR("tsu"))) { - return el_str_concat(str_drop_last(dict_form, 3), EL_STR("chi")); - } - if (str_ends_with(dict_form, EL_STR("nu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ni")); - } - if (str_ends_with(dict_form, EL_STR("bu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("bi")); - } - if (str_ends_with(dict_form, EL_STR("mu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("mi")); - } - if (str_ends_with(dict_form, EL_STR("ru"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ri")); - } - if (str_ends_with(dict_form, EL_STR("u"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("i")); - } - return dict_form; - } - if (str_eq(row, EL_STR("a"))) { - if (str_ends_with(dict_form, EL_STR("く"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("か")); - } - if (str_ends_with(dict_form, EL_STR("ぐ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("が")); - } - if (str_ends_with(dict_form, EL_STR("す"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("さ")); - } - if (str_ends_with(dict_form, EL_STR("つ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("た")); - } - if (str_ends_with(dict_form, EL_STR("ぬ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("な")); - } - if (str_ends_with(dict_form, EL_STR("ぶ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ば")); - } - if (str_ends_with(dict_form, EL_STR("む"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ま")); - } - if (str_ends_with(dict_form, EL_STR("る"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ら")); - } - if (str_ends_with(dict_form, EL_STR("う"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("わ")); - } - if (str_ends_with(dict_form, EL_STR("ku"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ka")); - } - if (str_ends_with(dict_form, EL_STR("gu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ga")); - } - if (str_ends_with(dict_form, EL_STR("su"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("sa")); - } - if (str_ends_with(dict_form, EL_STR("tsu"))) { - return el_str_concat(str_drop_last(dict_form, 3), EL_STR("ta")); - } - if (str_ends_with(dict_form, EL_STR("nu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("na")); - } - if (str_ends_with(dict_form, EL_STR("bu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ba")); - } - if (str_ends_with(dict_form, EL_STR("mu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ma")); - } - if (str_ends_with(dict_form, EL_STR("ru"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("ra")); - } - if (str_ends_with(dict_form, EL_STR("u"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("wa")); - } - return dict_form; - } - if (str_eq(row, EL_STR("te"))) { - if (str_ends_with(dict_form, EL_STR("く"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("い")); - } - if (str_ends_with(dict_form, EL_STR("ぐ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("い")); - } - if (str_ends_with(dict_form, EL_STR("す"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("し")); - } - if (str_ends_with(dict_form, EL_STR("つ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("っ")); - } - if (str_ends_with(dict_form, EL_STR("ぬ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ん")); - } - if (str_ends_with(dict_form, EL_STR("ぶ"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ん")); - } - if (str_ends_with(dict_form, EL_STR("む"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("ん")); - } - if (str_ends_with(dict_form, EL_STR("る"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("っ")); - } - if (str_ends_with(dict_form, EL_STR("う"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("っ")); - } - if (str_ends_with(dict_form, EL_STR("ku"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("i")); - } - if (str_ends_with(dict_form, EL_STR("gu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("i")); - } - if (str_ends_with(dict_form, EL_STR("su"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("shi")); - } - if (str_ends_with(dict_form, EL_STR("tsu"))) { - return el_str_concat(str_drop_last(dict_form, 3), EL_STR("tt")); - } - if (str_ends_with(dict_form, EL_STR("nu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n")); - } - if (str_ends_with(dict_form, EL_STR("bu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n")); - } - if (str_ends_with(dict_form, EL_STR("mu"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("n")); - } - if (str_ends_with(dict_form, EL_STR("ru"))) { - return el_str_concat(str_drop_last(dict_form, 2), EL_STR("tt")); - } - if (str_ends_with(dict_form, EL_STR("u"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("tt")); - } - return dict_form; - } - return dict_form; - return 0; -} - -el_val_t ja_conjugate(el_val_t dict_form, el_val_t form) { - el_val_t group = ja_verb_group(dict_form); - if (str_eq(group, EL_STR("irregular"))) { - if (str_eq(dict_form, EL_STR("する"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("する"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("した"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("しない"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("しよう"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("します"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("しました"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("しません"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("して"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("suru"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("suru"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("shita"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("shinai"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("shiyou"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("shimasu"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("shimashita"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("shimasen"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("shite"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("くる"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("くる"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("きた"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("こない"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("こよう"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("きます"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("きました"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("きません"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("きて"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("kuru"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("kuru"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("kita"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("konai"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("koyou"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("kimasu"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("kimashita"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("kimasen"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("kite"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("いる"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("いる"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("いた"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("いない"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("いよう"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("います"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("いました"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("いません"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("いて"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("iru"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("iru"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("ita"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("inai"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("iyou"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("imasu"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("imashita"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("imasen"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("ite"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("ある"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("ある"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("あった"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("ない"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("あろう"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("あります"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("ありました"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("ありません"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("あって"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("aru"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("aru"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("atta"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("nai"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("arou"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("arimasu"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("arimashita"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("arimasen"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("atte"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("だ"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("だ"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("だった"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("ではない"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("だろう"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("です"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("でした"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("ではありません"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("で"); - } - return dict_form; - } - if (str_eq(dict_form, EL_STR("da"))) { - if (str_eq(form, EL_STR("present"))) { - return EL_STR("da"); - } - if (str_eq(form, EL_STR("past"))) { - return EL_STR("datta"); - } - if (str_eq(form, EL_STR("negative"))) { - return EL_STR("dewanai"); - } - if (str_eq(form, EL_STR("volitional"))) { - return EL_STR("darou"); - } - if (str_eq(form, EL_STR("polite"))) { - return EL_STR("desu"); - } - if (str_eq(form, EL_STR("polite-past"))) { - return EL_STR("deshita"); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return EL_STR("dewaarimarsen"); - } - if (str_eq(form, EL_STR("te"))) { - return EL_STR("de"); - } - return dict_form; - } - return dict_form; - } - if (str_eq(group, EL_STR("ichidan"))) { - el_val_t stem = ja_ichidan_stem(dict_form); - if (str_eq(form, EL_STR("present"))) { - return dict_form; - } - if (str_eq(form, EL_STR("past"))) { - return el_str_concat(stem, EL_STR("た")); - } - if (str_eq(form, EL_STR("negative"))) { - return el_str_concat(stem, EL_STR("ない")); - } - if (str_eq(form, EL_STR("volitional"))) { - return el_str_concat(stem, EL_STR("よう")); - } - if (str_eq(form, EL_STR("polite"))) { - return el_str_concat(stem, EL_STR("ます")); - } - if (str_eq(form, EL_STR("polite-past"))) { - return el_str_concat(stem, EL_STR("ました")); - } - if (str_eq(form, EL_STR("polite-neg"))) { - return el_str_concat(stem, EL_STR("ません")); - } - if (str_eq(form, EL_STR("te"))) { - return el_str_concat(stem, EL_STR("て")); - } - return dict_form; - } - if (str_eq(form, EL_STR("present"))) { - return dict_form; - } - if (str_eq(form, EL_STR("polite"))) { - el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i")); - return el_str_concat(istem, EL_STR("ます")); - } - if (str_eq(form, EL_STR("polite-past"))) { - el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i")); - return el_str_concat(istem, EL_STR("ました")); - } - if (str_eq(form, EL_STR("polite-neg"))) { - el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i")); - return el_str_concat(istem, EL_STR("ません")); - } - if (str_eq(form, EL_STR("negative"))) { - el_val_t astem = ja_godan_stem_change(dict_form, EL_STR("a")); - return el_str_concat(astem, EL_STR("ない")); - } - if (str_eq(form, EL_STR("volitional"))) { - if (str_ends_with(dict_form, EL_STR("う"))) { - return el_str_concat(str_drop_last(dict_form, 1), EL_STR("おう")); - } - el_val_t istem = ja_godan_stem_change(dict_form, EL_STR("i")); - return el_str_concat(istem, EL_STR("ろう")); - } - if (str_eq(form, EL_STR("te"))) { - el_val_t tstem = ja_godan_stem_change(dict_form, EL_STR("te")); - if (str_ends_with(dict_form, EL_STR("ぐ"))) { - return el_str_concat(tstem, EL_STR("いで")); - } - if (str_ends_with(dict_form, EL_STR("gu"))) { - return el_str_concat(tstem, EL_STR("ide")); - } - if (str_ends_with(dict_form, EL_STR("ぬ"))) { - return el_str_concat(tstem, EL_STR("んで")); - } - if (str_ends_with(dict_form, EL_STR("ぶ"))) { - return el_str_concat(tstem, EL_STR("んで")); - } - if (str_ends_with(dict_form, EL_STR("む"))) { - return el_str_concat(tstem, EL_STR("んで")); - } - if (str_ends_with(dict_form, EL_STR("nu"))) { - return el_str_concat(tstem, EL_STR("nde")); - } - if (str_ends_with(dict_form, EL_STR("bu"))) { - return el_str_concat(tstem, EL_STR("nde")); - } - if (str_ends_with(dict_form, EL_STR("mu"))) { - return el_str_concat(tstem, EL_STR("nde")); - } - if (str_ends_with(dict_form, EL_STR("す"))) { - return el_str_concat(tstem, EL_STR("して")); - } - if (str_ends_with(dict_form, EL_STR("su"))) { - return el_str_concat(tstem, EL_STR("shite")); - } - if (str_ends_with(dict_form, EL_STR("く"))) { - return el_str_concat(tstem, EL_STR("て")); - } - if (str_ends_with(dict_form, EL_STR("ku"))) { - return el_str_concat(tstem, EL_STR("te")); - } - return el_str_concat(tstem, EL_STR("て")); - } - if (str_eq(form, EL_STR("past"))) { - el_val_t tstem = ja_godan_stem_change(dict_form, EL_STR("te")); - if (str_ends_with(dict_form, EL_STR("ぐ"))) { - return el_str_concat(tstem, EL_STR("いだ")); - } - if (str_ends_with(dict_form, EL_STR("gu"))) { - return el_str_concat(tstem, EL_STR("ida")); - } - if (str_ends_with(dict_form, EL_STR("ぬ"))) { - return el_str_concat(tstem, EL_STR("んだ")); - } - if (str_ends_with(dict_form, EL_STR("ぶ"))) { - return el_str_concat(tstem, EL_STR("んだ")); - } - if (str_ends_with(dict_form, EL_STR("む"))) { - return el_str_concat(tstem, EL_STR("んだ")); - } - if (str_ends_with(dict_form, EL_STR("nu"))) { - return el_str_concat(tstem, EL_STR("nda")); - } - if (str_ends_with(dict_form, EL_STR("bu"))) { - return el_str_concat(tstem, EL_STR("nda")); - } - if (str_ends_with(dict_form, EL_STR("mu"))) { - return el_str_concat(tstem, EL_STR("nda")); - } - if (str_ends_with(dict_form, EL_STR("す"))) { - return el_str_concat(tstem, EL_STR("した")); - } - if (str_ends_with(dict_form, EL_STR("su"))) { - return el_str_concat(tstem, EL_STR("shita")); - } - if (str_ends_with(dict_form, EL_STR("く"))) { - return el_str_concat(tstem, EL_STR("た")); - } - if (str_ends_with(dict_form, EL_STR("ku"))) { - return el_str_concat(tstem, EL_STR("ta")); - } - return el_str_concat(tstem, EL_STR("た")); - } - return dict_form; - return 0; -} - -el_val_t ja_particle(el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("が"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("を"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("に"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("の"); - } - if (str_eq(gram_case, EL_STR("topic"))) { - return EL_STR("は"); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return EL_STR("で"); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return EL_STR("に"); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return EL_STR("から"); - } - if (str_eq(gram_case, EL_STR("direction"))) { - return EL_STR("へ"); - } - if (str_eq(gram_case, EL_STR("comitative"))) { - return EL_STR("と"); - } - return EL_STR(""); - return 0; -} - -el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case) { - el_val_t p = ja_particle(gram_case); - if (str_eq(p, EL_STR(""))) { - return noun; - } - return el_str_concat(noun, p); - return 0; -} - -el_val_t ja_question_particle(void) { - return EL_STR("か"); - return 0; -} - -el_val_t ja_make_question(el_val_t sentence) { - return el_str_concat(sentence, ja_question_particle()); - return 0; -} - -el_val_t str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t str_last3(el_val_t s) { - el_val_t n = str_len(s); - if (n < 3) { - return s; - } - return str_slice(s, (n - 3), n); - return 0; -} - -el_val_t str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t is_vowel(el_val_t c) { - if (str_eq(c, EL_STR("a"))) { - return 1; - } - if (str_eq(c, EL_STR("e"))) { - return 1; - } - if (str_eq(c, EL_STR("i"))) { - return 1; - } - if (str_eq(c, EL_STR("o"))) { - return 1; - } - if (str_eq(c, EL_STR("u"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix) { - if (str_eq(suffix, EL_STR(""))) { - return base; - } - el_val_t suf_start = str_slice(suffix, 0, 1); - el_val_t suf_starts_vowel = is_vowel(suf_start); - if (suf_starts_vowel) { - if (str_ends(base, EL_STR("e"))) { - if (!str_ends(base, EL_STR("ee"))) { - return el_str_concat(str_drop_last(base, 1), suffix); - } - } - } - if (suf_starts_vowel) { - el_val_t n = str_len(base); - if (n >= 3) { - el_val_t c3 = str_slice(base, (n - 3), (n - 2)); - el_val_t c2 = str_slice(base, (n - 2), (n - 1)); - el_val_t c1 = str_slice(base, (n - 1), n); - if (!is_vowel(c3)) { - if (is_vowel(c2)) { - if (!is_vowel(c1)) { - if (!str_eq(c1, EL_STR("w"))) { - if (!str_eq(c1, EL_STR("x"))) { - if (!str_eq(c1, EL_STR("y"))) { - return el_str_concat(el_str_concat(base, c1), suffix); - } - } - } - } - } - } - } - } - return el_str_concat(base, suffix); - return 0; -} - -el_val_t en_irregular_plural(el_val_t word) { - if (str_eq(word, EL_STR("child"))) { - return EL_STR("children"); - } - if (str_eq(word, EL_STR("man"))) { - return EL_STR("men"); - } - if (str_eq(word, EL_STR("woman"))) { - return EL_STR("women"); - } - if (str_eq(word, EL_STR("tooth"))) { - return EL_STR("teeth"); - } - if (str_eq(word, EL_STR("foot"))) { - return EL_STR("feet"); - } - if (str_eq(word, EL_STR("goose"))) { - return EL_STR("geese"); - } - if (str_eq(word, EL_STR("mouse"))) { - return EL_STR("mice"); - } - if (str_eq(word, EL_STR("louse"))) { - return EL_STR("lice"); - } - if (str_eq(word, EL_STR("ox"))) { - return EL_STR("oxen"); - } - if (str_eq(word, EL_STR("person"))) { - return EL_STR("people"); - } - if (str_eq(word, EL_STR("leaf"))) { - return EL_STR("leaves"); - } - if (str_eq(word, EL_STR("loaf"))) { - return EL_STR("loaves"); - } - if (str_eq(word, EL_STR("wolf"))) { - return EL_STR("wolves"); - } - if (str_eq(word, EL_STR("life"))) { - return EL_STR("lives"); - } - if (str_eq(word, EL_STR("knife"))) { - return EL_STR("knives"); - } - if (str_eq(word, EL_STR("wife"))) { - return EL_STR("wives"); - } - if (str_eq(word, EL_STR("half"))) { - return EL_STR("halves"); - } - if (str_eq(word, EL_STR("self"))) { - return EL_STR("selves"); - } - if (str_eq(word, EL_STR("elf"))) { - return EL_STR("elves"); - } - if (str_eq(word, EL_STR("shelf"))) { - return EL_STR("shelves"); - } - if (str_eq(word, EL_STR("fish"))) { - return EL_STR("fish"); - } - if (str_eq(word, EL_STR("sheep"))) { - return EL_STR("sheep"); - } - if (str_eq(word, EL_STR("deer"))) { - return EL_STR("deer"); - } - if (str_eq(word, EL_STR("moose"))) { - return EL_STR("moose"); - } - if (str_eq(word, EL_STR("series"))) { - return EL_STR("series"); - } - if (str_eq(word, EL_STR("species"))) { - return EL_STR("species"); - } - return EL_STR(""); - return 0; -} - -el_val_t en_irregular_singular(el_val_t word) { - if (str_eq(word, EL_STR("children"))) { - return EL_STR("child"); - } - if (str_eq(word, EL_STR("men"))) { - return EL_STR("man"); - } - if (str_eq(word, EL_STR("women"))) { - return EL_STR("woman"); - } - if (str_eq(word, EL_STR("teeth"))) { - return EL_STR("tooth"); - } - if (str_eq(word, EL_STR("feet"))) { - return EL_STR("foot"); - } - if (str_eq(word, EL_STR("geese"))) { - return EL_STR("goose"); - } - if (str_eq(word, EL_STR("mice"))) { - return EL_STR("mouse"); - } - if (str_eq(word, EL_STR("lice"))) { - return EL_STR("louse"); - } - if (str_eq(word, EL_STR("oxen"))) { - return EL_STR("ox"); - } - if (str_eq(word, EL_STR("people"))) { - return EL_STR("person"); - } - if (str_eq(word, EL_STR("leaves"))) { - return EL_STR("leaf"); - } - if (str_eq(word, EL_STR("wolves"))) { - return EL_STR("wolf"); - } - if (str_eq(word, EL_STR("lives"))) { - return EL_STR("life"); - } - if (str_eq(word, EL_STR("knives"))) { - return EL_STR("knife"); - } - if (str_eq(word, EL_STR("wives"))) { - return EL_STR("wife"); - } - if (str_eq(word, EL_STR("halves"))) { - return EL_STR("half"); - } - if (str_eq(word, EL_STR("selves"))) { - return EL_STR("self"); - } - if (str_eq(word, EL_STR("elves"))) { - return EL_STR("elf"); - } - if (str_eq(word, EL_STR("shelves"))) { - return EL_STR("shelf"); - } - if (str_eq(word, EL_STR("fish"))) { - return EL_STR("fish"); - } - if (str_eq(word, EL_STR("sheep"))) { - return EL_STR("sheep"); - } - if (str_eq(word, EL_STR("deer"))) { - return EL_STR("deer"); - } - if (str_eq(word, EL_STR("moose"))) { - return EL_STR("moose"); - } - if (str_eq(word, EL_STR("series"))) { - return EL_STR("series"); - } - if (str_eq(word, EL_STR("species"))) { - return EL_STR("species"); - } - return EL_STR(""); - return 0; -} - -el_val_t en_irregular_verb(el_val_t base) { - el_val_t empty = el_list_empty(); - if (str_eq(base, EL_STR("be"))) { - el_val_t r = el_list_new(5, EL_STR("be"), EL_STR("is"), EL_STR("was"), EL_STR("been"), EL_STR("being")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("have"))) { - el_val_t r = el_list_new(5, EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("do"))) { - el_val_t r = el_list_new(5, EL_STR("do"), EL_STR("does"), EL_STR("did"), EL_STR("done"), EL_STR("doing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("go"))) { - el_val_t r = el_list_new(5, EL_STR("go"), EL_STR("goes"), EL_STR("went"), EL_STR("gone"), EL_STR("going")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("say"))) { - el_val_t r = el_list_new(5, EL_STR("say"), EL_STR("says"), EL_STR("said"), EL_STR("said"), EL_STR("saying")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("make"))) { - el_val_t r = el_list_new(5, EL_STR("make"), EL_STR("makes"), EL_STR("made"), EL_STR("made"), EL_STR("making")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("know"))) { - el_val_t r = el_list_new(5, EL_STR("know"), EL_STR("knows"), EL_STR("knew"), EL_STR("known"), EL_STR("knowing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("take"))) { - el_val_t r = el_list_new(5, EL_STR("take"), EL_STR("takes"), EL_STR("took"), EL_STR("taken"), EL_STR("taking")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("see"))) { - el_val_t r = el_list_new(5, EL_STR("see"), EL_STR("sees"), EL_STR("saw"), EL_STR("seen"), EL_STR("seeing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("come"))) { - el_val_t r = el_list_new(5, EL_STR("come"), EL_STR("comes"), EL_STR("came"), EL_STR("come"), EL_STR("coming")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("think"))) { - el_val_t r = el_list_new(5, EL_STR("think"), EL_STR("thinks"), EL_STR("thought"), EL_STR("thought"), EL_STR("thinking")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("get"))) { - el_val_t r = el_list_new(5, EL_STR("get"), EL_STR("gets"), EL_STR("got"), EL_STR("gotten"), EL_STR("getting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("give"))) { - el_val_t r = el_list_new(5, EL_STR("give"), EL_STR("gives"), EL_STR("gave"), EL_STR("given"), EL_STR("giving")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("find"))) { - el_val_t r = el_list_new(5, EL_STR("find"), EL_STR("finds"), EL_STR("found"), EL_STR("found"), EL_STR("finding")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("tell"))) { - el_val_t r = el_list_new(5, EL_STR("tell"), EL_STR("tells"), EL_STR("told"), EL_STR("told"), EL_STR("telling")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("become"))) { - el_val_t r = el_list_new(5, EL_STR("become"), EL_STR("becomes"), EL_STR("became"), EL_STR("become"), EL_STR("becoming")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("leave"))) { - el_val_t r = el_list_new(5, EL_STR("leave"), EL_STR("leaves"), EL_STR("left"), EL_STR("left"), EL_STR("leaving")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("feel"))) { - el_val_t r = el_list_new(5, EL_STR("feel"), EL_STR("feels"), EL_STR("felt"), EL_STR("felt"), EL_STR("feeling")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("put"))) { - el_val_t r = el_list_new(5, EL_STR("put"), EL_STR("puts"), EL_STR("put"), EL_STR("put"), EL_STR("putting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("bring"))) { - el_val_t r = el_list_new(5, EL_STR("bring"), EL_STR("brings"), EL_STR("brought"), EL_STR("brought"), EL_STR("bringing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("begin"))) { - el_val_t r = el_list_new(5, EL_STR("begin"), EL_STR("begins"), EL_STR("began"), EL_STR("begun"), EL_STR("beginning")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("keep"))) { - el_val_t r = el_list_new(5, EL_STR("keep"), EL_STR("keeps"), EL_STR("kept"), EL_STR("kept"), EL_STR("keeping")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("hold"))) { - el_val_t r = el_list_new(5, EL_STR("hold"), EL_STR("holds"), EL_STR("held"), EL_STR("held"), EL_STR("holding")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("write"))) { - el_val_t r = el_list_new(5, EL_STR("write"), EL_STR("writes"), EL_STR("wrote"), EL_STR("written"), EL_STR("writing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("stand"))) { - el_val_t r = el_list_new(5, EL_STR("stand"), EL_STR("stands"), EL_STR("stood"), EL_STR("stood"), EL_STR("standing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("hear"))) { - el_val_t r = el_list_new(5, EL_STR("hear"), EL_STR("hears"), EL_STR("heard"), EL_STR("heard"), EL_STR("hearing")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("let"))) { - el_val_t r = el_list_new(5, EL_STR("let"), EL_STR("lets"), EL_STR("let"), EL_STR("let"), EL_STR("letting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("run"))) { - el_val_t r = el_list_new(5, EL_STR("run"), EL_STR("runs"), EL_STR("ran"), EL_STR("run"), EL_STR("running")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("meet"))) { - el_val_t r = el_list_new(5, EL_STR("meet"), EL_STR("meets"), EL_STR("met"), EL_STR("met"), EL_STR("meeting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("sit"))) { - el_val_t r = el_list_new(5, EL_STR("sit"), EL_STR("sits"), EL_STR("sat"), EL_STR("sat"), EL_STR("sitting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("send"))) { - el_val_t r = el_list_new(5, EL_STR("send"), EL_STR("sends"), EL_STR("sent"), EL_STR("sent"), EL_STR("sending")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("speak"))) { - el_val_t r = el_list_new(5, EL_STR("speak"), EL_STR("speaks"), EL_STR("spoke"), EL_STR("spoken"), EL_STR("speaking")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("buy"))) { - el_val_t r = el_list_new(5, EL_STR("buy"), EL_STR("buys"), EL_STR("bought"), EL_STR("bought"), EL_STR("buying")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("pay"))) { - el_val_t r = el_list_new(5, EL_STR("pay"), EL_STR("pays"), EL_STR("paid"), EL_STR("paid"), EL_STR("paying")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("read"))) { - el_val_t r = el_list_new(5, EL_STR("read"), EL_STR("reads"), EL_STR("read"), EL_STR("read"), EL_STR("reading")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("win"))) { - el_val_t r = el_list_new(5, EL_STR("win"), EL_STR("wins"), EL_STR("won"), EL_STR("won"), EL_STR("winning")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("eat"))) { - el_val_t r = el_list_new(5, EL_STR("eat"), EL_STR("eats"), EL_STR("ate"), EL_STR("eaten"), EL_STR("eating")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("fall"))) { - el_val_t r = el_list_new(5, EL_STR("fall"), EL_STR("falls"), EL_STR("fell"), EL_STR("fallen"), EL_STR("falling")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("sleep"))) { - el_val_t r = el_list_new(5, EL_STR("sleep"), EL_STR("sleeps"), EL_STR("slept"), EL_STR("slept"), EL_STR("sleeping")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("drive"))) { - el_val_t r = el_list_new(5, EL_STR("drive"), EL_STR("drives"), EL_STR("drove"), EL_STR("driven"), EL_STR("driving")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("build"))) { - el_val_t r = el_list_new(5, EL_STR("build"), EL_STR("builds"), EL_STR("built"), EL_STR("built"), EL_STR("building")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("cut"))) { - el_val_t r = el_list_new(5, EL_STR("cut"), EL_STR("cuts"), EL_STR("cut"), EL_STR("cut"), EL_STR("cutting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("set"))) { - el_val_t r = el_list_new(5, EL_STR("set"), EL_STR("sets"), EL_STR("set"), EL_STR("set"), EL_STR("setting")); - EL_NULL; - return r; - } - if (str_eq(base, EL_STR("hit"))) { - el_val_t r = el_list_new(5, EL_STR("hit"), EL_STR("hits"), EL_STR("hit"), EL_STR("hit"), EL_STR("hitting")); - EL_NULL; - return r; - } - return empty; - return 0; -} - -el_val_t en_verb_3sg(el_val_t base) { - if (str_ends(base, EL_STR("s"))) { - return el_str_concat(base, EL_STR("es")); - } - if (str_ends(base, EL_STR("x"))) { - return el_str_concat(base, EL_STR("es")); - } - if (str_ends(base, EL_STR("z"))) { - return el_str_concat(base, EL_STR("es")); - } - if (str_ends(base, EL_STR("ch"))) { - return el_str_concat(base, EL_STR("es")); - } - if (str_ends(base, EL_STR("sh"))) { - return el_str_concat(base, EL_STR("es")); - } - el_val_t last = str_last_char(base); - if (str_eq(last, EL_STR("y"))) { - el_val_t prev = str_drop_last(base, 1); - el_val_t prev_last = str_last_char(prev); - if (!is_vowel(prev_last)) { - return el_str_concat(prev, EL_STR("ies")); - } - } - return el_str_concat(base, EL_STR("s")); - return 0; -} - -el_val_t en_should_double_final(el_val_t base) { - el_val_t n = str_len(base); - if (n < 3) { - return 0; - } - el_val_t c3 = str_slice(base, (n - 3), (n - 2)); - el_val_t c2 = str_slice(base, (n - 2), (n - 1)); - el_val_t c1 = str_slice(base, (n - 1), n); - if (!is_vowel(c3)) { - if (is_vowel(c2)) { - if (!is_vowel(c1)) { - if (!str_eq(c1, EL_STR("w"))) { - if (!str_eq(c1, EL_STR("x"))) { - if (!str_eq(c1, EL_STR("y"))) { - return 1; - } - } - } - } - } - } - return 0; - return 0; -} - -el_val_t en_verb_past(el_val_t base) { - if (str_ends(base, EL_STR("e"))) { - return el_str_concat(base, EL_STR("d")); - } - el_val_t last = str_last_char(base); - if (str_eq(last, EL_STR("y"))) { - el_val_t prev = str_drop_last(base, 1); - el_val_t prev_last = str_last_char(prev); - if (!is_vowel(prev_last)) { - return el_str_concat(prev, EL_STR("ied")); - } - } - if (en_should_double_final(base)) { - return el_str_concat(el_str_concat(base, last), EL_STR("ed")); - } - return el_str_concat(base, EL_STR("ed")); - return 0; -} - -el_val_t en_verb_gerund(el_val_t base) { - if (str_ends(base, EL_STR("ie"))) { - return el_str_concat(str_drop_last(base, 2), EL_STR("ying")); - } - if (str_ends(base, EL_STR("e"))) { - if (!str_ends(base, EL_STR("ee"))) { - return el_str_concat(str_drop_last(base, 1), EL_STR("ing")); - } - } - el_val_t last = str_last_char(base); - if (en_should_double_final(base)) { - return el_str_concat(el_str_concat(base, last), EL_STR("ing")); - } - return el_str_concat(base, EL_STR("ing")); - return 0; -} - -el_val_t en_pluralize_regular(el_val_t singular) { - if (str_ends(singular, EL_STR("s"))) { - return el_str_concat(singular, EL_STR("es")); - } - if (str_ends(singular, EL_STR("x"))) { - return el_str_concat(singular, EL_STR("es")); - } - if (str_ends(singular, EL_STR("z"))) { - return el_str_concat(singular, EL_STR("es")); - } - if (str_ends(singular, EL_STR("ch"))) { - return el_str_concat(singular, EL_STR("es")); - } - if (str_ends(singular, EL_STR("sh"))) { - return el_str_concat(singular, EL_STR("es")); - } - el_val_t last = str_last_char(singular); - if (str_eq(last, EL_STR("y"))) { - el_val_t prev = str_drop_last(singular, 1); - el_val_t prev_last = str_last_char(prev); - if (!is_vowel(prev_last)) { - return el_str_concat(prev, EL_STR("ies")); - } - } - if (str_ends(singular, EL_STR("fe"))) { - return el_str_concat(str_drop_last(singular, 2), EL_STR("ves")); - } - return el_str_concat(singular, EL_STR("s")); - return 0; -} - -el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t irreg = en_irregular_verb(base); - el_val_t is_irreg = 0; - if (native_list_len(irreg) > 0) { - is_irreg = 1; - } - if (str_eq(base, EL_STR("be"))) { - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("are"); - } - if (str_eq(person, EL_STR("first"))) { - return EL_STR("am"); - } - if (str_eq(person, EL_STR("second"))) { - return EL_STR("are"); - } - return EL_STR("is"); - } - if (str_eq(tense, EL_STR("past"))) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("were"); - } - if (str_eq(person, EL_STR("second"))) { - return EL_STR("were"); - } - return EL_STR("was"); - } - if (str_eq(tense, EL_STR("future"))) { - return EL_STR("will be"); - } - if (str_eq(tense, EL_STR("perfect"))) { - return EL_STR("been"); - } - if (str_eq(tense, EL_STR("progressive"))) { - return EL_STR("being"); - } - return EL_STR("be"); - } - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (is_irreg) { - return native_list_get(irreg, 1); - } - return en_verb_3sg(base); - } - } - return base; - } - if (str_eq(tense, EL_STR("past"))) { - if (is_irreg) { - return native_list_get(irreg, 2); - } - return en_verb_past(base); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(EL_STR("will "), base); - } - if (str_eq(tense, EL_STR("perfect"))) { - if (is_irreg) { - return native_list_get(irreg, 3); - } - return en_verb_past(base); - } - if (str_eq(tense, EL_STR("progressive"))) { - if (is_irreg) { - return native_list_get(irreg, 4); - } - return en_verb_gerund(base); - } - return base; - return 0; -} - -el_val_t agree_determiner(el_val_t det, el_val_t noun) { - if (str_eq(det, EL_STR("a"))) { - el_val_t first = str_slice(noun, 0, 1); - el_val_t fl = str_to_lower(first); - if (is_vowel(fl)) { - return EL_STR("an"); - } - return EL_STR("a"); - } - return det; - return 0; -} - -el_val_t morph_pluralize(el_val_t noun, el_val_t profile) { - el_val_t mtype = lang_get(profile, EL_STR("morph_type")); - el_val_t code = lang_get(profile, EL_STR("code")); - if (str_eq(code, EL_STR("es"))) { - return es_pluralize(noun); - } - if (str_eq(code, EL_STR("fr"))) { - return fr_pluralize(noun); - } - if (str_eq(code, EL_STR("de"))) { - return de_noun_plural(noun, EL_STR("unknown")); - } - if (str_eq(code, EL_STR("ru"))) { - return ru_noun_case(noun, EL_STR("m"), EL_STR("nom"), EL_STR("pl")); - } - if (str_eq(code, EL_STR("ja"))) { - return noun; - } - if (str_eq(code, EL_STR("fi"))) { - return fi_apply_case(noun, EL_STR("nom"), EL_STR("pl")); - } - if (str_eq(code, EL_STR("ar"))) { - return ar_sound_plural(noun, EL_STR("m")); - } - if (str_eq(code, EL_STR("hi"))) { - return hi_noun_direct(noun, hi_gender(noun), EL_STR("pl")); - } - if (str_eq(code, EL_STR("sw"))) { - return sw_noun_plural(noun); - } - if (str_eq(mtype, EL_STR("isolating"))) { - return noun; - } - if (str_eq(mtype, EL_STR("agglutinative"))) { - return noun; - } - if (str_eq(mtype, EL_STR("fusional"))) { - if (str_eq(code, EL_STR("en"))) { - el_val_t irreg = en_irregular_plural(noun); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - return en_pluralize_regular(noun); - } - return noun; - } - return noun; - return 0; -} - -el_val_t morph_map_canonical(el_val_t verb, el_val_t code) { - if (str_eq(verb, EL_STR("be"))) { - if (str_eq(code, EL_STR("es"))) { - return EL_STR("ser"); - } - if (str_eq(code, EL_STR("fr"))) { - return EL_STR("etre"); - } - if (str_eq(code, EL_STR("de"))) { - return EL_STR("sein"); - } - if (str_eq(code, EL_STR("fi"))) { - return EL_STR("olla"); - } - if (str_eq(code, EL_STR("ru"))) { - return EL_STR("byt"); - } - if (str_eq(code, EL_STR("sw"))) { - return EL_STR("kuwa"); - } - } - return verb; - return 0; -} - -el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile) { - el_val_t mtype = lang_get(profile, EL_STR("morph_type")); - el_val_t code = lang_get(profile, EL_STR("code")); - verb = morph_map_canonical(verb, code); - if (str_eq(code, EL_STR("es"))) { - return es_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("fr"))) { - return fr_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("de"))) { - return de_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("ru"))) { - return ru_conjugate(verb, tense, person, number, EL_STR("unknown")); - } - if (str_eq(code, EL_STR("ja"))) { - return ja_conjugate(verb, EL_STR("present")); - } - if (str_eq(code, EL_STR("fi"))) { - return fi_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("ar"))) { - return ar_conjugate(verb, tense, person, EL_STR("m"), number); - } - if (str_eq(code, EL_STR("hi"))) { - return hi_conjugate(verb, tense, person, EL_STR("m"), number); - } - if (str_eq(code, EL_STR("sw"))) { - return sw_conjugate(verb, person, number, EL_STR("1"), tense); - } - if (str_eq(code, EL_STR("la"))) { - return la_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("he"))) { - return he_conjugate(verb, tense, person, EL_STR("m"), number); - } - if (str_eq(code, EL_STR("grc"))) { - return grc_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("ang"))) { - return ang_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("sa"))) { - return sa_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("got"))) { - return got_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("non"))) { - return non_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("enm"))) { - return enm_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("pi"))) { - return pi_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("fro"))) { - return fro_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("goh"))) { - return goh_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("sga"))) { - return sga_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("txb"))) { - return txb_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("peo"))) { - return peo_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("akk"))) { - return akk_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("uga"))) { - return uga_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("egy"))) { - return egy_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("sux"))) { - return sux_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("gez"))) { - return gez_conjugate(verb, tense, person, number); - } - if (str_eq(code, EL_STR("cop"))) { - return cop_conjugate(verb, tense, person, number); - } - if (str_eq(mtype, EL_STR("isolating"))) { - return verb; - } - if (str_eq(mtype, EL_STR("agglutinative"))) { - return verb; - } - if (str_eq(mtype, EL_STR("fusional"))) { - if (str_eq(code, EL_STR("en"))) { - return en_verb_form(verb, tense, person, number); - } - return verb; - } - return verb; - return 0; -} - -el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile) { - el_val_t n = str_len(features); - if (n == 0) { - return word; - } - el_val_t i = 0; - el_val_t running = 1; - while (running) { - if (i >= n) { - running = 0; - } else { - el_val_t c = str_slice(features, i, (i + 1)); - if (str_eq(c, EL_STR(";"))) { - running = 0; - } else { - i = (i + 1); - } - } - } - el_val_t first_feat = str_slice(features, 0, i); - if (str_eq(first_feat, EL_STR("plural"))) { - return morph_pluralize(word, profile); - } - if (i < n) { - el_val_t rest = str_slice(features, (i + 1), n); - el_val_t j = 0; - el_val_t rn = str_len(rest); - el_val_t running2 = 1; - while (running2) { - if (j >= rn) { - running2 = 0; - } else { - el_val_t c = str_slice(rest, j, (j + 1)); - if (str_eq(c, EL_STR(";"))) { - running2 = 0; - } else { - j = (j + 1); - } - } - } - el_val_t person = str_slice(rest, 0, j); - el_val_t number = EL_STR(""); - if (j < rn) { - number = str_slice(rest, (j + 1), rn); - } - return morph_conjugate(word, first_feat, person, number, profile); - } - return morph_conjugate(word, first_feat, EL_STR("third"), EL_STR("singular"), profile); - return 0; -} - -el_val_t pluralize(el_val_t singular) { - return morph_pluralize(singular, lang_default()); - return 0; -} - -el_val_t singularize(el_val_t plural) { - el_val_t irreg = en_irregular_singular(plural); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - if (str_ends(plural, EL_STR("ies"))) { - return el_str_concat(str_drop_last(plural, 3), EL_STR("y")); - } - if (str_ends(plural, EL_STR("ves"))) { - el_val_t stem = str_drop_last(plural, 3); - el_val_t last_stem = str_last_char(stem); - if (str_eq(last_stem, EL_STR("i"))) { - return el_str_concat(stem, EL_STR("fe")); - } - return el_str_concat(stem, EL_STR("f")); - } - if (str_ends(plural, EL_STR("ches"))) { - return str_drop_last(plural, 2); - } - if (str_ends(plural, EL_STR("shes"))) { - return str_drop_last(plural, 2); - } - if (str_ends(plural, EL_STR("xes"))) { - return str_drop_last(plural, 2); - } - if (str_ends(plural, EL_STR("zes"))) { - return str_drop_last(plural, 2); - } - if (str_ends(plural, EL_STR("ses"))) { - return str_drop_last(plural, 2); - } - if (str_ends(plural, EL_STR("s"))) { - return str_drop_last(plural, 1); - } - return plural; - return 0; -} - -el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number) { - return morph_conjugate(base, tense, person, number, lang_default()); - return 0; -} - -el_val_t irregular_plural(el_val_t word) { - return en_irregular_plural(word); - return 0; -} - -el_val_t irregular_singular(el_val_t word) { - return en_irregular_singular(word); - return 0; -} - -el_val_t he_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t he_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t he_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t he_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number) { - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 1; - } - return 0; - } - if (str_eq(gender, EL_STR("f"))) { - return 6; - } - return 5; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 3; - } - return 2; - } - if (str_eq(gender, EL_STR("f"))) { - return 8; - } - return 7; - } - if (str_eq(number, EL_STR("plural"))) { - return 9; - } - return 4; - return 0; -} - -el_val_t he_present_form_code(el_val_t slot) { - if (slot == 0) { - return 0; - } - if (slot == 1) { - return 1; - } - if (slot == 2) { - return 0; - } - if (slot == 3) { - return 1; - } - if (slot == 4) { - return 0; - } - if (slot == 5) { - return 2; - } - if (slot == 6) { - return 3; - } - if (slot == 7) { - return 2; - } - if (slot == 8) { - return 3; - } - return 2; - return 0; -} - -el_val_t he_copula_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("היה"); - } - if (slot == 1) { - return EL_STR("הייתה"); - } - if (slot == 2) { - return EL_STR("היית"); - } - if (slot == 3) { - return EL_STR("הייתה"); - } - if (slot == 4) { - return EL_STR("הייתי"); - } - if (slot == 5) { - return EL_STR("היו"); - } - if (slot == 6) { - return EL_STR("היו"); - } - if (slot == 7) { - return EL_STR("הייתם"); - } - if (slot == 8) { - return EL_STR("הייתן"); - } - return EL_STR("היינו"); - return 0; -} - -el_val_t he_copula_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("יהיה"); - } - if (slot == 1) { - return EL_STR("תהיה"); - } - if (slot == 2) { - return EL_STR("תהיה"); - } - if (slot == 3) { - return EL_STR("תהיי"); - } - if (slot == 4) { - return EL_STR("אהיה"); - } - if (slot == 5) { - return EL_STR("יהיו"); - } - if (slot == 6) { - return EL_STR("יהיו"); - } - if (slot == 7) { - return EL_STR("תהיו"); - } - if (slot == 8) { - return EL_STR("תהיו"); - } - return EL_STR("נהיה"); - return 0; -} - -el_val_t he_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("lihyot"))) { - return 1; - } - if (str_eq(verb, EL_STR("haya"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - if (str_eq(verb, EL_STR("היה"))) { - return 1; - } - if (str_eq(verb, EL_STR("לִהְיוֹת"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR(""); - } - if (str_eq(tense, EL_STR("past"))) { - return he_copula_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_copula_future(slot); - } - return EL_STR(""); - return 0; -} - -el_val_t he_present_lir_ot(el_val_t form) { - if (form == 0) { - return EL_STR("רוֹאֶה"); - } - if (form == 1) { - return EL_STR("רוֹאָה"); - } - if (form == 2) { - return EL_STR("רוֹאִים"); - } - return EL_STR("רוֹאוֹת"); - return 0; -} - -el_val_t he_present_le_exol(el_val_t form) { - if (form == 0) { - return EL_STR("אוֹכֵל"); - } - if (form == 1) { - return EL_STR("אוֹכֶלֶת"); - } - if (form == 2) { - return EL_STR("אוֹכְלִים"); - } - return EL_STR("אוֹכְלוֹת"); - return 0; -} - -el_val_t he_present_ledaber(el_val_t form) { - if (form == 0) { - return EL_STR("מְדַבֵּר"); - } - if (form == 1) { - return EL_STR("מְדַבֶּרֶת"); - } - if (form == 2) { - return EL_STR("מְדַבְּרִים"); - } - return EL_STR("מְדַבְּרוֹת"); - return 0; -} - -el_val_t he_present_lalechet(el_val_t form) { - if (form == 0) { - return EL_STR("הוֹלֵךְ"); - } - if (form == 1) { - return EL_STR("הוֹלֶכֶת"); - } - if (form == 2) { - return EL_STR("הוֹלְכִים"); - } - return EL_STR("הוֹלְכוֹת"); - return 0; -} - -el_val_t he_past_lir_ot(el_val_t slot) { - if (slot == 0) { - return EL_STR("רָאָה"); - } - if (slot == 1) { - return EL_STR("רָאֲתָה"); - } - if (slot == 2) { - return EL_STR("רָאִיתָ"); - } - if (slot == 3) { - return EL_STR("רָאִית"); - } - if (slot == 4) { - return EL_STR("רָאִיתִי"); - } - if (slot == 5) { - return EL_STR("רָאוּ"); - } - if (slot == 6) { - return EL_STR("רָאוּ"); - } - if (slot == 7) { - return EL_STR("רְאִיתֶם"); - } - if (slot == 8) { - return EL_STR("רְאִיתֶן"); - } - return EL_STR("רָאִינוּ"); - return 0; -} - -el_val_t he_past_le_exol(el_val_t slot) { - if (slot == 0) { - return EL_STR("אָכַל"); - } - if (slot == 1) { - return EL_STR("אָכְלָה"); - } - if (slot == 2) { - return EL_STR("אָכַלְתָּ"); - } - if (slot == 3) { - return EL_STR("אָכַלְתְּ"); - } - if (slot == 4) { - return EL_STR("אָכַלְתִּי"); - } - if (slot == 5) { - return EL_STR("אָכְלוּ"); - } - if (slot == 6) { - return EL_STR("אָכְלוּ"); - } - if (slot == 7) { - return EL_STR("אֲכַלְתֶּם"); - } - if (slot == 8) { - return EL_STR("אֲכַלְתֶּן"); - } - return EL_STR("אָכַלְנוּ"); - return 0; -} - -el_val_t he_past_ledaber(el_val_t slot) { - if (slot == 0) { - return EL_STR("דִּבֵּר"); - } - if (slot == 1) { - return EL_STR("דִּבְּרָה"); - } - if (slot == 2) { - return EL_STR("דִּבַּרְתָּ"); - } - if (slot == 3) { - return EL_STR("דִּבַּרְתְּ"); - } - if (slot == 4) { - return EL_STR("דִּבַּרְתִּי"); - } - if (slot == 5) { - return EL_STR("דִּבְּרוּ"); - } - if (slot == 6) { - return EL_STR("דִּבְּרוּ"); - } - if (slot == 7) { - return EL_STR("דִּבַּרְתֶּם"); - } - if (slot == 8) { - return EL_STR("דִּבַּרְתֶּן"); - } - return EL_STR("דִּבַּרְנוּ"); - return 0; -} - -el_val_t he_past_lalechet(el_val_t slot) { - if (slot == 0) { - return EL_STR("הָלַךְ"); - } - if (slot == 1) { - return EL_STR("הָלְכָה"); - } - if (slot == 2) { - return EL_STR("הָלַכְתָּ"); - } - if (slot == 3) { - return EL_STR("הָלַכְתְּ"); - } - if (slot == 4) { - return EL_STR("הָלַכְתִּי"); - } - if (slot == 5) { - return EL_STR("הָלְכוּ"); - } - if (slot == 6) { - return EL_STR("הָלְכוּ"); - } - if (slot == 7) { - return EL_STR("הֲלַכְתֶּם"); - } - if (slot == 8) { - return EL_STR("הֲלַכְתֶּן"); - } - return EL_STR("הָלַכְנוּ"); - return 0; -} - -el_val_t he_future_lir_ot(el_val_t slot) { - if (slot == 0) { - return EL_STR("יִרְאֶה"); - } - if (slot == 1) { - return EL_STR("תִּרְאֶה"); - } - if (slot == 2) { - return EL_STR("תִּרְאֶה"); - } - if (slot == 3) { - return EL_STR("תִּרְאִי"); - } - if (slot == 4) { - return EL_STR("אֶרְאֶה"); - } - if (slot == 5) { - return EL_STR("יִרְאוּ"); - } - if (slot == 6) { - return EL_STR("תִּרְאֶינָה"); - } - if (slot == 7) { - return EL_STR("תִּרְאוּ"); - } - if (slot == 8) { - return EL_STR("תִּרְאֶינָה"); - } - return EL_STR("נִרְאֶה"); - return 0; -} - -el_val_t he_future_le_exol(el_val_t slot) { - if (slot == 0) { - return EL_STR("יֹאכַל"); - } - if (slot == 1) { - return EL_STR("תֹּאכַל"); - } - if (slot == 2) { - return EL_STR("תֹּאכַל"); - } - if (slot == 3) { - return EL_STR("תֹּאכְלִי"); - } - if (slot == 4) { - return EL_STR("אֹכַל"); - } - if (slot == 5) { - return EL_STR("יֹאכְלוּ"); - } - if (slot == 6) { - return EL_STR("תֹּאכַלְנָה"); - } - if (slot == 7) { - return EL_STR("תֹּאכְלוּ"); - } - if (slot == 8) { - return EL_STR("תֹּאכַלְנָה"); - } - return EL_STR("נֹאכַל"); - return 0; -} - -el_val_t he_future_ledaber(el_val_t slot) { - if (slot == 0) { - return EL_STR("יְדַבֵּר"); - } - if (slot == 1) { - return EL_STR("תְּדַבֵּר"); - } - if (slot == 2) { - return EL_STR("תְּדַבֵּר"); - } - if (slot == 3) { - return EL_STR("תְּדַבְּרִי"); - } - if (slot == 4) { - return EL_STR("אֲדַבֵּר"); - } - if (slot == 5) { - return EL_STR("יְדַבְּרוּ"); - } - if (slot == 6) { - return EL_STR("תְּדַבֵּרְנָה"); - } - if (slot == 7) { - return EL_STR("תְּדַבְּרוּ"); - } - if (slot == 8) { - return EL_STR("תְּדַבֵּרְנָה"); - } - return EL_STR("נְדַבֵּר"); - return 0; -} - -el_val_t he_future_lalechet(el_val_t slot) { - if (slot == 0) { - return EL_STR("יֵלֵךְ"); - } - if (slot == 1) { - return EL_STR("תֵּלֵךְ"); - } - if (slot == 2) { - return EL_STR("תֵּלֵךְ"); - } - if (slot == 3) { - return EL_STR("תֵּלְכִי"); - } - if (slot == 4) { - return EL_STR("אֵלֵךְ"); - } - if (slot == 5) { - return EL_STR("יֵלְכוּ"); - } - if (slot == 6) { - return EL_STR("תֵּלַכְנָה"); - } - if (slot == 7) { - return EL_STR("תֵּלְכוּ"); - } - if (slot == 8) { - return EL_STR("תֵּלַכְנָה"); - } - return EL_STR("נֵלֵךְ"); - return 0; -} - -el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("lir'ot"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_lir_ot(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_lir_ot(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_lir_ot(slot); - } - return he_present_lir_ot(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("לִרְאוֹת"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_lir_ot(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_lir_ot(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_lir_ot(slot); - } - return he_present_lir_ot(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("le'exol"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_le_exol(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_le_exol(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_le_exol(slot); - } - return he_present_le_exol(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("לֶאֱכוֹל"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_le_exol(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_le_exol(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_le_exol(slot); - } - return he_present_le_exol(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("ledaber"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_ledaber(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_ledaber(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_ledaber(slot); - } - return he_present_ledaber(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("לְדַבֵּר"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_ledaber(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_ledaber(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_ledaber(slot); - } - return he_present_ledaber(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("lalechet"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_lalechet(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_lalechet(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_lalechet(slot); - } - return he_present_lalechet(he_present_form_code(slot)); - } - if (str_eq(verb, EL_STR("לָלֶכֶת"))) { - if (str_eq(tense, EL_STR("present"))) { - return he_present_lalechet(he_present_form_code(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return he_past_lalechet(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return he_future_lalechet(slot); - } - return he_present_lalechet(he_present_form_code(slot)); - } - return EL_STR(""); - return 0; -} - -el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number) { - el_val_t slot = he_slot(person, gender, number); - if (he_is_copula(verb)) { - return he_conjugate_copula(tense, slot); - } - el_val_t known = he_known_verb(verb, tense, slot); - if (!str_eq(known, EL_STR(""))) { - return known; - } - return verb; - return 0; -} - -el_val_t he_pluralize(el_val_t noun, el_val_t gender) { - if (str_eq(gender, EL_STR("m"))) { - return el_str_concat(noun, EL_STR("ים")); - } - if (he_str_ends(noun, EL_STR("ה"))) { - el_val_t stem = he_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ות")); - } - if (he_str_ends(noun, EL_STR("ת"))) { - el_val_t stem = he_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ות")); - } - if (he_str_ends(noun, EL_STR("a"))) { - el_val_t stem = he_str_drop_last(noun, 1); - return el_str_concat(stem, EL_STR("ot")); - } - if (he_str_ends(noun, EL_STR("et"))) { - el_val_t stem = he_str_drop_last(noun, 2); - return el_str_concat(stem, EL_STR("ot")); - } - return el_str_concat(noun, EL_STR("ות")); - return 0; -} - -el_val_t he_is_hebrew_script(el_val_t noun) { - el_val_t n = str_len(noun); - if (n == 0) { - return 0; - } - el_val_t first = str_slice(noun, 0, 1); - if (str_eq(first, EL_STR("א"))) { - return 1; - } - if (str_eq(first, EL_STR("ב"))) { - return 1; - } - if (str_eq(first, EL_STR("ג"))) { - return 1; - } - if (str_eq(first, EL_STR("ד"))) { - return 1; - } - if (str_eq(first, EL_STR("ה"))) { - return 1; - } - if (str_eq(first, EL_STR("ו"))) { - return 1; - } - if (str_eq(first, EL_STR("ז"))) { - return 1; - } - if (str_eq(first, EL_STR("ח"))) { - return 1; - } - if (str_eq(first, EL_STR("ט"))) { - return 1; - } - if (str_eq(first, EL_STR("י"))) { - return 1; - } - if (str_eq(first, EL_STR("כ"))) { - return 1; - } - if (str_eq(first, EL_STR("ל"))) { - return 1; - } - if (str_eq(first, EL_STR("מ"))) { - return 1; - } - if (str_eq(first, EL_STR("נ"))) { - return 1; - } - if (str_eq(first, EL_STR("ס"))) { - return 1; - } - if (str_eq(first, EL_STR("ע"))) { - return 1; - } - if (str_eq(first, EL_STR("פ"))) { - return 1; - } - if (str_eq(first, EL_STR("צ"))) { - return 1; - } - if (str_eq(first, EL_STR("ק"))) { - return 1; - } - if (str_eq(first, EL_STR("ר"))) { - return 1; - } - if (str_eq(first, EL_STR("ש"))) { - return 1; - } - if (str_eq(first, EL_STR("ת"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t he_definite_prefix(el_val_t noun) { - if (he_is_hebrew_script(noun)) { - return el_str_concat(EL_STR("ה"), noun); - } - return el_str_concat(EL_STR("ha"), noun); - return 0; -} - -el_val_t he_noun_phrase(el_val_t noun, el_val_t number, el_val_t gender, el_val_t definite) { - el_val_t stem = noun; - if (str_eq(number, EL_STR("plural"))) { - stem = he_pluralize(noun, gender); - } - if (str_eq(definite, EL_STR("true"))) { - return he_definite_prefix(stem); - } - return stem; - return 0; -} - -el_val_t he_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("lihyot"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("lir'ot"); - } - if (str_eq(verb, EL_STR("eat"))) { - return EL_STR("le'exol"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("ledaber"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("ledaber"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("lalechet"); - } - return verb; - return 0; -} - -el_val_t grc_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t grc_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t grc_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t grc_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t grc_str_last3(el_val_t s) { - el_val_t n = str_len(s); - if (n < 3) { - return s; - } - return str_slice(s, (n - 3), n); - return 0; -} - -el_val_t grc_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t grc_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("εἰναι"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("ἔχειν"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("λέγειν"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("ὁράω"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("ἔρχεσθαι"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("ἔρχεσθαι"); - } - if (str_eq(verb, EL_STR("know"))) { - return EL_STR("γιγνώσκειν"); - } - if (str_eq(verb, EL_STR("write"))) { - return EL_STR("γράφειν"); - } - if (str_eq(verb, EL_STR("hear"))) { - return EL_STR("ἀκούειν"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("βούλεσθαι"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("ποιεῖν"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("ποιεῖν"); - } - return verb; - return 0; -} - -el_val_t grc_einai_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("εἰμί"); - } - if (slot == 1) { - return EL_STR("εἶ"); - } - if (slot == 2) { - return EL_STR("ἐστί"); - } - if (slot == 3) { - return EL_STR("ἐσμέν"); - } - if (slot == 4) { - return EL_STR("ἐστέ"); - } - return EL_STR("εἰσί"); - return 0; -} - -el_val_t grc_einai_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἦν"); - } - if (slot == 1) { - return EL_STR("ἦσθα"); - } - if (slot == 2) { - return EL_STR("ἦν"); - } - if (slot == 3) { - return EL_STR("ἦμεν"); - } - if (slot == 4) { - return EL_STR("ἦτε"); - } - return EL_STR("ἦσαν"); - return 0; -} - -el_val_t grc_einai_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἔσομαι"); - } - if (slot == 1) { - return EL_STR("ἔσῃ"); - } - if (slot == 2) { - return EL_STR("ἔσται"); - } - if (slot == 3) { - return EL_STR("ἐσόμεθα"); - } - if (slot == 4) { - return EL_STR("ἔσεσθε"); - } - return EL_STR("ἔσονται"); - return 0; -} - -el_val_t grc_echein_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἔχω"); - } - if (slot == 1) { - return EL_STR("ἔχεις"); - } - if (slot == 2) { - return EL_STR("ἔχει"); - } - if (slot == 3) { - return EL_STR("ἔχομεν"); - } - if (slot == 4) { - return EL_STR("ἔχετε"); - } - return EL_STR("ἔχουσι"); - return 0; -} - -el_val_t grc_echein_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("εἶχον"); - } - if (slot == 1) { - return EL_STR("εἶχες"); - } - if (slot == 2) { - return EL_STR("εἶχε"); - } - if (slot == 3) { - return EL_STR("εἴχομεν"); - } - if (slot == 4) { - return EL_STR("εἴχετε"); - } - return EL_STR("εἶχον"); - return 0; -} - -el_val_t grc_echein_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἔσχον"); - } - if (slot == 1) { - return EL_STR("ἔσχες"); - } - if (slot == 2) { - return EL_STR("ἔσχε"); - } - if (slot == 3) { - return EL_STR("ἔσχομεν"); - } - if (slot == 4) { - return EL_STR("ἔσχετε"); - } - return EL_STR("ἔσχον"); - return 0; -} - -el_val_t grc_echein_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἕξω"); - } - if (slot == 1) { - return EL_STR("ἕξεις"); - } - if (slot == 2) { - return EL_STR("ἕξει"); - } - if (slot == 3) { - return EL_STR("ἕξομεν"); - } - if (slot == 4) { - return EL_STR("ἕξετε"); - } - return EL_STR("ἕξουσι"); - return 0; -} - -el_val_t grc_legein_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("λέγω"); - } - if (slot == 1) { - return EL_STR("λέγεις"); - } - if (slot == 2) { - return EL_STR("λέγει"); - } - if (slot == 3) { - return EL_STR("λέγομεν"); - } - if (slot == 4) { - return EL_STR("λέγετε"); - } - return EL_STR("λέγουσι"); - return 0; -} - -el_val_t grc_legein_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἔλεγον"); - } - if (slot == 1) { - return EL_STR("ἔλεγες"); - } - if (slot == 2) { - return EL_STR("ἔλεγε"); - } - if (slot == 3) { - return EL_STR("ἐλέγομεν"); - } - if (slot == 4) { - return EL_STR("ἐλέγετε"); - } - return EL_STR("ἔλεγον"); - return 0; -} - -el_val_t grc_legein_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("εἶπον"); - } - if (slot == 1) { - return EL_STR("εἶπες"); - } - if (slot == 2) { - return EL_STR("εἶπε"); - } - if (slot == 3) { - return EL_STR("εἴπομεν"); - } - if (slot == 4) { - return EL_STR("εἴπετε"); - } - return EL_STR("εἶπον"); - return 0; -} - -el_val_t grc_legein_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("λέξω"); - } - if (slot == 1) { - return EL_STR("λέξεις"); - } - if (slot == 2) { - return EL_STR("λέξει"); - } - if (slot == 3) { - return EL_STR("λέξομεν"); - } - if (slot == 4) { - return EL_STR("λέξετε"); - } - return EL_STR("λέξουσι"); - return 0; -} - -el_val_t grc_horao_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ὁράω"); - } - if (slot == 1) { - return EL_STR("ὁράς"); - } - if (slot == 2) { - return EL_STR("ὁρᾷ"); - } - if (slot == 3) { - return EL_STR("ὁρῶμεν"); - } - if (slot == 4) { - return EL_STR("ὁρᾶτε"); - } - return EL_STR("ὁρῶσι"); - return 0; -} - -el_val_t grc_horao_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἑώρων"); - } - if (slot == 1) { - return EL_STR("ἑώρας"); - } - if (slot == 2) { - return EL_STR("ἑώρα"); - } - if (slot == 3) { - return EL_STR("ἑωρῶμεν"); - } - if (slot == 4) { - return EL_STR("ἑωρᾶτε"); - } - return EL_STR("ἑώρων"); - return 0; -} - -el_val_t grc_horao_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("εἶδον"); - } - if (slot == 1) { - return EL_STR("εἶδες"); - } - if (slot == 2) { - return EL_STR("εἶδε"); - } - if (slot == 3) { - return EL_STR("εἴδομεν"); - } - if (slot == 4) { - return EL_STR("εἴδετε"); - } - return EL_STR("εἶδον"); - return 0; -} - -el_val_t grc_horao_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ὄψομαι"); - } - if (slot == 1) { - return EL_STR("ὄψῃ"); - } - if (slot == 2) { - return EL_STR("ὄψεται"); - } - if (slot == 3) { - return EL_STR("ὀψόμεθα"); - } - if (slot == 4) { - return EL_STR("ὄψεσθε"); - } - return EL_STR("ὄψονται"); - return 0; -} - -el_val_t grc_erchesthai_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἔρχομαι"); - } - if (slot == 1) { - return EL_STR("ἔρχῃ"); - } - if (slot == 2) { - return EL_STR("ἔρχεται"); - } - if (slot == 3) { - return EL_STR("ἐρχόμεθα"); - } - if (slot == 4) { - return EL_STR("ἔρχεσθε"); - } - return EL_STR("ἔρχονται"); - return 0; -} - -el_val_t grc_erchesthai_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἠρχόμην"); - } - if (slot == 1) { - return EL_STR("ἤρχου"); - } - if (slot == 2) { - return EL_STR("ἤρχετο"); - } - if (slot == 3) { - return EL_STR("ἠρχόμεθα"); - } - if (slot == 4) { - return EL_STR("ἤρχεσθε"); - } - return EL_STR("ἤρχοντο"); - return 0; -} - -el_val_t grc_erchesthai_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("ἦλθον"); - } - if (slot == 1) { - return EL_STR("ἦλθες"); - } - if (slot == 2) { - return EL_STR("ἦλθε"); - } - if (slot == 3) { - return EL_STR("ἤλθομεν"); - } - if (slot == 4) { - return EL_STR("ἤλθετε"); - } - return EL_STR("ἦλθον"); - return 0; -} - -el_val_t grc_erchesthai_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("εἶμι"); - } - if (slot == 1) { - return EL_STR("εἶ"); - } - if (slot == 2) { - return EL_STR("εἶσι"); - } - if (slot == 3) { - return EL_STR("ἴμεν"); - } - if (slot == 4) { - return EL_STR("ἴτε"); - } - return EL_STR("ἴασι"); - return 0; -} - -el_val_t grc_thematic_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("ω"); - } - if (slot == 1) { - return EL_STR("εις"); - } - if (slot == 2) { - return EL_STR("ει"); - } - if (slot == 3) { - return EL_STR("ομεν"); - } - if (slot == 4) { - return EL_STR("ετε"); - } - return EL_STR("ουσι"); - return 0; -} - -el_val_t grc_thematic_imperfect_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("ον"); - } - if (slot == 1) { - return EL_STR("ες"); - } - if (slot == 2) { - return EL_STR("ε"); - } - if (slot == 3) { - return EL_STR("ομεν"); - } - if (slot == 4) { - return EL_STR("ετε"); - } - return EL_STR("ον"); - return 0; -} - -el_val_t grc_thematic_future_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("σω"); - } - if (slot == 1) { - return EL_STR("σεις"); - } - if (slot == 2) { - return EL_STR("σει"); - } - if (slot == 3) { - return EL_STR("σομεν"); - } - if (slot == 4) { - return EL_STR("σετε"); - } - return EL_STR("σουσι"); - return 0; -} - -el_val_t grc_weak_aorist_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("σα"); - } - if (slot == 1) { - return EL_STR("σας"); - } - if (slot == 2) { - return EL_STR("σε"); - } - if (slot == 3) { - return EL_STR("σαμεν"); - } - if (slot == 4) { - return EL_STR("σατε"); - } - return EL_STR("σαν"); - return 0; -} - -el_val_t grc_present_stem(el_val_t verb) { - if (grc_str_ends(verb, EL_STR("ειν"))) { - return grc_str_drop_last(verb, 3); - } - if (grc_str_ends(verb, EL_STR("αω"))) { - return grc_str_drop_last(verb, 2); - } - if (grc_str_ends(verb, EL_STR("εω"))) { - return grc_str_drop_last(verb, 2); - } - if (grc_str_ends(verb, EL_STR("ω"))) { - return grc_str_drop_last(verb, 1); - } - return verb; - return 0; -} - -el_val_t grc_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = grc_map_canonical(verb); - el_val_t slot = grc_slot(person, number); - if (str_eq(v, EL_STR("εἰναι"))) { - if (str_eq(tense, EL_STR("present"))) { - return grc_einai_present(slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return grc_einai_imperfect(slot); - } - if (str_eq(tense, EL_STR("aorist"))) { - return grc_einai_imperfect(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return grc_einai_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("ἔχειν"))) { - if (str_eq(tense, EL_STR("present"))) { - return grc_echein_present(slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return grc_echein_imperfect(slot); - } - if (str_eq(tense, EL_STR("aorist"))) { - return grc_echein_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return grc_echein_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("λέγειν"))) { - if (str_eq(tense, EL_STR("present"))) { - return grc_legein_present(slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return grc_legein_imperfect(slot); - } - if (str_eq(tense, EL_STR("aorist"))) { - return grc_legein_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return grc_legein_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("ὁράω"))) { - if (str_eq(tense, EL_STR("present"))) { - return grc_horao_present(slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return grc_horao_imperfect(slot); - } - if (str_eq(tense, EL_STR("aorist"))) { - return grc_horao_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return grc_horao_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("ἔρχεσθαι"))) { - if (str_eq(tense, EL_STR("present"))) { - return grc_erchesthai_present(slot); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return grc_erchesthai_imperfect(slot); - } - if (str_eq(tense, EL_STR("aorist"))) { - return grc_erchesthai_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return grc_erchesthai_future(slot); - } - return v; - } - el_val_t stem = grc_present_stem(v); - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(stem, grc_thematic_present_ending(slot)); - } - if (str_eq(tense, EL_STR("imperfect"))) { - return el_str_concat(el_str_concat(EL_STR("ἐ"), stem), grc_thematic_imperfect_ending(slot)); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(stem, grc_thematic_future_ending(slot)); - } - if (str_eq(tense, EL_STR("aorist"))) { - return el_str_concat(el_str_concat(EL_STR("ἐ"), stem), grc_weak_aorist_ending(slot)); - } - return v; - return 0; -} - -el_val_t grc_declension(el_val_t noun) { - if (grc_str_ends(noun, EL_STR("ος"))) { - return EL_STR("2m"); - } - if (grc_str_ends(noun, EL_STR("ον"))) { - return EL_STR("2n"); - } - if (grc_str_ends(noun, EL_STR("α"))) { - return EL_STR("1a"); - } - if (grc_str_ends(noun, EL_STR("η"))) { - return EL_STR("1e"); - } - return EL_STR("3"); - return 0; -} - -el_val_t grc_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ος")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ου")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ῳ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ον")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("ε")); - } - return el_str_concat(stem, EL_STR("ος")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("οι")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ων")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("οις")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ους")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("οι")); - } - return el_str_concat(stem, EL_STR("οι")); - return 0; -} - -el_val_t grc_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ον")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ου")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ῳ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ον")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("ον")); - } - return el_str_concat(stem, EL_STR("ον")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("α")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ων")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("οις")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("α")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("α")); - } - return el_str_concat(stem, EL_STR("α")); - return 0; -} - -el_val_t grc_decline_1a(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("α")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ας")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ᾳ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("αν")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("α")); - } - return el_str_concat(stem, EL_STR("α")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("αι")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ων")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("αις")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ας")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("αι")); - } - return el_str_concat(stem, EL_STR("αι")); - return 0; -} - -el_val_t grc_decline_1e(el_val_t stem, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("η")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ης")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ῃ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ην")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("η")); - } - return el_str_concat(stem, EL_STR("η")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("αι")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ων")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("αις")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ας")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("αι")); - } - return el_str_concat(stem, EL_STR("αι")); - return 0; -} - -el_val_t grc_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t decl = grc_declension(noun); - if (str_eq(decl, EL_STR("2m"))) { - el_val_t stem = grc_str_drop_last(noun, 2); - return grc_decline_2m(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("2n"))) { - el_val_t stem = grc_str_drop_last(noun, 2); - return grc_decline_2n(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("1a"))) { - el_val_t stem = grc_str_drop_last(noun, 1); - return grc_decline_1a(stem, gram_case, number); - } - if (str_eq(decl, EL_STR("1e"))) { - el_val_t stem = grc_str_drop_last(noun, 1); - return grc_decline_1e(stem, gram_case, number); - } - return noun; - return 0; -} - -el_val_t grc_article_masculine(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("ὁ"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τοῦ"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("τῷ"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τόν"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("ὁ"); - } - return EL_STR("ὁ"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("οἱ"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τῶν"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("τοῖς"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τούς"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("οἱ"); - } - return EL_STR("οἱ"); - return 0; -} - -el_val_t grc_article_feminine(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("ἡ"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τῆς"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("τῇ"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τήν"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("ἡ"); - } - return EL_STR("ἡ"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("αἱ"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τῶν"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("ταῖς"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τάς"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("αἱ"); - } - return EL_STR("αἱ"); - return 0; -} - -el_val_t grc_article_neuter(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("τό"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τοῦ"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("τῷ"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τό"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("τό"); - } - return EL_STR("τό"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("τά"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("τῶν"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("τοῖς"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("τά"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("τά"); - } - return EL_STR("τά"); - return 0; -} - -el_val_t grc_article(el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(gender, EL_STR("masculine"))) { - return grc_article_masculine(gram_case, number); - } - if (str_eq(gender, EL_STR("feminine"))) { - return grc_article_feminine(gram_case, number); - } - return grc_article_neuter(gram_case, number); - return 0; -} - -el_val_t grc_infer_gender(el_val_t noun) { - if (grc_str_ends(noun, EL_STR("ος"))) { - return EL_STR("masculine"); - } - if (grc_str_ends(noun, EL_STR("ον"))) { - return EL_STR("neuter"); - } - if (grc_str_ends(noun, EL_STR("α"))) { - return EL_STR("feminine"); - } - if (grc_str_ends(noun, EL_STR("η"))) { - return EL_STR("feminine"); - } - return EL_STR("masculine"); - return 0; -} - -el_val_t grc_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t declined = grc_decline(noun, gram_case, number); - if (str_eq(definite, EL_STR("true"))) { - el_val_t gender = grc_infer_gender(noun); - el_val_t art = grc_article(gender, gram_case, number); - return el_str_concat(el_str_concat(art, EL_STR(" ")), declined); - } - return declined; - return 0; -} - -el_val_t ang_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t ang_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t ang_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t ang_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t ang_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t ang_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("beon"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("habban"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("gān"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("cuman"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("secgan"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("sēon"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("dōn"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("willan"); - } - if (str_eq(verb, EL_STR("will"))) { - return EL_STR("willan"); - } - if (str_eq(verb, EL_STR("can"))) { - return EL_STR("magan"); - } - if (str_eq(verb, EL_STR("know"))) { - return EL_STR("witan"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("giefan"); - } - if (str_eq(verb, EL_STR("take"))) { - return EL_STR("niman"); - } - if (str_eq(verb, EL_STR("find"))) { - return EL_STR("findan"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("macian"); - } - return verb; - return 0; -} - -el_val_t ang_wesan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("wæs"); - } - if (slot == 1) { - return EL_STR("wǣre"); - } - if (slot == 2) { - return EL_STR("wæs"); - } - if (slot == 3) { - return EL_STR("wǣron"); - } - if (slot == 4) { - return EL_STR("wǣron"); - } - return EL_STR("wǣron"); - return 0; -} - -el_val_t ang_beon_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("bēo"); - } - if (slot == 1) { - return EL_STR("bist"); - } - if (slot == 2) { - return EL_STR("biþ"); - } - if (slot == 3) { - return EL_STR("bēoþ"); - } - if (slot == 4) { - return EL_STR("bēoþ"); - } - return EL_STR("bēoþ"); - return 0; -} - -el_val_t ang_wesan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("eom"); - } - if (slot == 1) { - return EL_STR("eart"); - } - if (slot == 2) { - return EL_STR("is"); - } - if (slot == 3) { - return EL_STR("sind"); - } - if (slot == 4) { - return EL_STR("sind"); - } - return EL_STR("sind"); - return 0; -} - -el_val_t ang_habban_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("hæbbe"); - } - if (slot == 1) { - return EL_STR("hæfst"); - } - if (slot == 2) { - return EL_STR("hæfþ"); - } - if (slot == 3) { - return EL_STR("habbað"); - } - if (slot == 4) { - return EL_STR("habbað"); - } - return EL_STR("habbað"); - return 0; -} - -el_val_t ang_habban_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("hæfde"); - } - if (slot == 1) { - return EL_STR("hæfdest"); - } - if (slot == 2) { - return EL_STR("hæfde"); - } - if (slot == 3) { - return EL_STR("hæfdon"); - } - if (slot == 4) { - return EL_STR("hæfdon"); - } - return EL_STR("hæfdon"); - return 0; -} - -el_val_t ang_gan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gā"); - } - if (slot == 1) { - return EL_STR("gǣst"); - } - if (slot == 2) { - return EL_STR("gǣþ"); - } - if (slot == 3) { - return EL_STR("gāð"); - } - if (slot == 4) { - return EL_STR("gāð"); - } - return EL_STR("gāð"); - return 0; -} - -el_val_t ang_gan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("ēode"); - } - if (slot == 1) { - return EL_STR("ēodest"); - } - if (slot == 2) { - return EL_STR("ēode"); - } - if (slot == 3) { - return EL_STR("ēodon"); - } - if (slot == 4) { - return EL_STR("ēodon"); - } - return EL_STR("ēodon"); - return 0; -} - -el_val_t ang_cuman_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("cume"); - } - if (slot == 1) { - return EL_STR("cymst"); - } - if (slot == 2) { - return EL_STR("cymþ"); - } - if (slot == 3) { - return EL_STR("cumað"); - } - if (slot == 4) { - return EL_STR("cumað"); - } - return EL_STR("cumað"); - return 0; -} - -el_val_t ang_cuman_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("cōm"); - } - if (slot == 1) { - return EL_STR("cōme"); - } - if (slot == 2) { - return EL_STR("cōm"); - } - if (slot == 3) { - return EL_STR("cōmon"); - } - if (slot == 4) { - return EL_STR("cōmon"); - } - return EL_STR("cōmon"); - return 0; -} - -el_val_t ang_secgan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("secge"); - } - if (slot == 1) { - return EL_STR("sagast"); - } - if (slot == 2) { - return EL_STR("sagað"); - } - if (slot == 3) { - return EL_STR("secgað"); - } - if (slot == 4) { - return EL_STR("secgað"); - } - return EL_STR("secgað"); - return 0; -} - -el_val_t ang_secgan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("sægde"); - } - if (slot == 1) { - return EL_STR("sægdest"); - } - if (slot == 2) { - return EL_STR("sægde"); - } - if (slot == 3) { - return EL_STR("sægdon"); - } - if (slot == 4) { - return EL_STR("sægdon"); - } - return EL_STR("sægdon"); - return 0; -} - -el_val_t ang_seon_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("sēo"); - } - if (slot == 1) { - return EL_STR("siehst"); - } - if (slot == 2) { - return EL_STR("siehþ"); - } - if (slot == 3) { - return EL_STR("sēoð"); - } - if (slot == 4) { - return EL_STR("sēoð"); - } - return EL_STR("sēoð"); - return 0; -} - -el_val_t ang_seon_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("seah"); - } - if (slot == 1) { - return EL_STR("sāwe"); - } - if (slot == 2) { - return EL_STR("seah"); - } - if (slot == 3) { - return EL_STR("sāwon"); - } - if (slot == 4) { - return EL_STR("sāwon"); - } - return EL_STR("sāwon"); - return 0; -} - -el_val_t ang_don_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("dō"); - } - if (slot == 1) { - return EL_STR("dēst"); - } - if (slot == 2) { - return EL_STR("dēþ"); - } - if (slot == 3) { - return EL_STR("dōð"); - } - if (slot == 4) { - return EL_STR("dōð"); - } - return EL_STR("dōð"); - return 0; -} - -el_val_t ang_don_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("dyde"); - } - if (slot == 1) { - return EL_STR("dydest"); - } - if (slot == 2) { - return EL_STR("dyde"); - } - if (slot == 3) { - return EL_STR("dydon"); - } - if (slot == 4) { - return EL_STR("dydon"); - } - return EL_STR("dydon"); - return 0; -} - -el_val_t ang_willan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("wille"); - } - if (slot == 1) { - return EL_STR("wilt"); - } - if (slot == 2) { - return EL_STR("wile"); - } - if (slot == 3) { - return EL_STR("willað"); - } - if (slot == 4) { - return EL_STR("willað"); - } - return EL_STR("willað"); - return 0; -} - -el_val_t ang_willan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("wolde"); - } - if (slot == 1) { - return EL_STR("woldest"); - } - if (slot == 2) { - return EL_STR("wolde"); - } - if (slot == 3) { - return EL_STR("woldon"); - } - if (slot == 4) { - return EL_STR("woldon"); - } - return EL_STR("woldon"); - return 0; -} - -el_val_t ang_magan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("mæg"); - } - if (slot == 1) { - return EL_STR("meaht"); - } - if (slot == 2) { - return EL_STR("mæg"); - } - if (slot == 3) { - return EL_STR("magon"); - } - if (slot == 4) { - return EL_STR("magon"); - } - return EL_STR("magon"); - return 0; -} - -el_val_t ang_magan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("meahte"); - } - if (slot == 1) { - return EL_STR("meahtest"); - } - if (slot == 2) { - return EL_STR("meahte"); - } - if (slot == 3) { - return EL_STR("meahton"); - } - if (slot == 4) { - return EL_STR("meahton"); - } - return EL_STR("meahton"); - return 0; -} - -el_val_t ang_witan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("wāt"); - } - if (slot == 1) { - return EL_STR("wāst"); - } - if (slot == 2) { - return EL_STR("wāt"); - } - if (slot == 3) { - return EL_STR("witon"); - } - if (slot == 4) { - return EL_STR("witon"); - } - return EL_STR("witon"); - return 0; -} - -el_val_t ang_witan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("wisse"); - } - if (slot == 1) { - return EL_STR("wissest"); - } - if (slot == 2) { - return EL_STR("wisse"); - } - if (slot == 3) { - return EL_STR("wisson"); - } - if (slot == 4) { - return EL_STR("wisson"); - } - return EL_STR("wisson"); - return 0; -} - -el_val_t ang_weak_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("e"); - } - if (slot == 1) { - return EL_STR("est"); - } - if (slot == 2) { - return EL_STR("eþ"); - } - if (slot == 3) { - return EL_STR("aþ"); - } - if (slot == 4) { - return EL_STR("aþ"); - } - return EL_STR("aþ"); - return 0; -} - -el_val_t ang_weak_past_stem(el_val_t stem) { - el_val_t slen = str_len(stem); - if (slen <= 2) { - return el_str_concat(stem, EL_STR("ede")); - } - return el_str_concat(stem, EL_STR("ode")); - return 0; -} - -el_val_t ang_weak_past(el_val_t stem, el_val_t slot) { - el_val_t pstem = ang_weak_past_stem(stem); - if (slot == 0) { - return pstem; - } - if (slot == 1) { - return el_str_concat(pstem, EL_STR("st")); - } - if (slot == 2) { - return pstem; - } - if (slot == 3) { - return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on")); - } - if (slot == 4) { - return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on")); - } - return el_str_concat(ang_str_drop_last(pstem, 1), EL_STR("on")); - return 0; -} - -el_val_t ang_weak_stem(el_val_t verb) { - if (ang_str_ends(verb, EL_STR("ian"))) { - return ang_str_drop_last(verb, 3); - } - if (ang_str_ends(verb, EL_STR("an"))) { - return ang_str_drop_last(verb, 2); - } - return verb; - return 0; -} - -el_val_t ang_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = ang_map_canonical(verb); - el_val_t slot = ang_slot(person, number); - if (str_eq(v, EL_STR("beon"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_beon_present(slot); - } - return ang_wesan_past(slot); - } - if (str_eq(v, EL_STR("wesan"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_wesan_present(slot); - } - return ang_wesan_past(slot); - } - if (str_eq(v, EL_STR("habban"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_habban_present(slot); - } - return ang_habban_past(slot); - } - if (str_eq(v, EL_STR("gān"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_gan_present(slot); - } - return ang_gan_past(slot); - } - if (str_eq(v, EL_STR("cuman"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_cuman_present(slot); - } - return ang_cuman_past(slot); - } - if (str_eq(v, EL_STR("secgan"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_secgan_present(slot); - } - return ang_secgan_past(slot); - } - if (str_eq(v, EL_STR("sēon"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_seon_present(slot); - } - return ang_seon_past(slot); - } - if (str_eq(v, EL_STR("dōn"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_don_present(slot); - } - return ang_don_past(slot); - } - if (str_eq(v, EL_STR("willan"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_willan_present(slot); - } - return ang_willan_past(slot); - } - if (str_eq(v, EL_STR("magan"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_magan_present(slot); - } - return ang_magan_past(slot); - } - if (str_eq(v, EL_STR("witan"))) { - if (str_eq(tense, EL_STR("present"))) { - return ang_witan_present(slot); - } - return ang_witan_past(slot); - } - el_val_t stem = ang_weak_stem(v); - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(stem, ang_weak_present_ending(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return ang_weak_past(stem, slot); - } - return v; - return 0; -} - -el_val_t ang_declension(el_val_t noun, el_val_t gender) { - if (ang_str_ends(noun, EL_STR("a"))) { - return EL_STR("weak"); - } - if (str_eq(gender, EL_STR("neuter"))) { - return EL_STR("strong_neut"); - } - return EL_STR("strong_masc"); - return 0; -} - -el_val_t ang_decline_strong_masc(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("e")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("as")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("as")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("um")); - } - return el_str_concat(noun, EL_STR("as")); - return 0; -} - -el_val_t ang_decline_strong_neut(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("e")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("um")); - } - return noun; - return 0; -} - -el_val_t ang_decline_weak(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stem = ang_str_drop_last(noun, 1); - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("an")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ena")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("um")); - } - return el_str_concat(stem, EL_STR("an")); - return 0; -} - -el_val_t ang_decline(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t gender) { - el_val_t decl = ang_declension(noun, gender); - if (str_eq(decl, EL_STR("strong_masc"))) { - return ang_decline_strong_masc(noun, gram_case, number); - } - if (str_eq(decl, EL_STR("strong_neut"))) { - return ang_decline_strong_neut(noun, gram_case, number); - } - if (str_eq(decl, EL_STR("weak"))) { - return ang_decline_weak(noun, gram_case, number); - } - return noun; - return 0; -} - -el_val_t ang_article_masculine(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("se"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þone"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þæs"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣm"); - } - return EL_STR("se"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þāra"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣm"); - } - return EL_STR("þā"); - return 0; -} - -el_val_t ang_article_feminine(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("sēo"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þǣre"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣre"); - } - return EL_STR("sēo"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þāra"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣm"); - } - return EL_STR("þā"); - return 0; -} - -el_val_t ang_article_neuter(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("þæt"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þæt"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þæs"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣm"); - } - return EL_STR("þæt"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("þā"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("þāra"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("þǣm"); - } - return EL_STR("þā"); - return 0; -} - -el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(gender, EL_STR("masculine"))) { - return ang_article_masculine(gram_case, number); - } - if (str_eq(gender, EL_STR("feminine"))) { - return ang_article_feminine(gram_case, number); - } - return ang_article_neuter(gram_case, number); - return 0; -} - -el_val_t ang_infer_gender(el_val_t noun) { - if (ang_str_ends(noun, EL_STR("u"))) { - return EL_STR("feminine"); - } - if (ang_str_ends(noun, EL_STR("e"))) { - return EL_STR("feminine"); - } - return EL_STR("masculine"); - return 0; -} - -el_val_t ang_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t gender = ang_infer_gender(noun); - el_val_t declined = ang_decline(noun, gram_case, number, gender); - if (str_eq(definite, EL_STR("true"))) { - el_val_t art = ang_article(gender, gram_case, number); - return el_str_concat(el_str_concat(art, EL_STR(" ")), declined); - } - return declined; - return 0; -} - -el_val_t sa_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t sa_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t sa_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t sa_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("as"); - } - if (str_eq(verb, EL_STR("become"))) { - return EL_STR("bhu"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("gam"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("drs"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("vad"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("vad"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("kr"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("kr"); - } - return verb; - return 0; -} - -el_val_t sa_as_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("asmi"); - } - if (slot == 1) { - return EL_STR("asi"); - } - if (slot == 2) { - return EL_STR("asti"); - } - if (slot == 3) { - return EL_STR("smaḥ"); - } - if (slot == 4) { - return EL_STR("stha"); - } - return EL_STR("santi"); - return 0; -} - -el_val_t sa_as_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("āsam"); - } - if (slot == 1) { - return EL_STR("āsīḥ"); - } - if (slot == 2) { - return EL_STR("āsīt"); - } - if (slot == 3) { - return EL_STR("āsma"); - } - if (slot == 4) { - return EL_STR("āsta"); - } - return EL_STR("āsan"); - return 0; -} - -el_val_t sa_as_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("bhaviṣyāmi"); - } - if (slot == 1) { - return EL_STR("bhaviṣyasi"); - } - if (slot == 2) { - return EL_STR("bhaviṣyati"); - } - if (slot == 3) { - return EL_STR("bhaviṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("bhaviṣyatha"); - } - return EL_STR("bhaviṣyanti"); - return 0; -} - -el_val_t sa_bhu_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("bhavāmi"); - } - if (slot == 1) { - return EL_STR("bhavasi"); - } - if (slot == 2) { - return EL_STR("bhavati"); - } - if (slot == 3) { - return EL_STR("bhavāmaḥ"); - } - if (slot == 4) { - return EL_STR("bhavatha"); - } - return EL_STR("bhavanti"); - return 0; -} - -el_val_t sa_bhu_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("abhavam"); - } - if (slot == 1) { - return EL_STR("abhavaḥ"); - } - if (slot == 2) { - return EL_STR("abhavat"); - } - if (slot == 3) { - return EL_STR("abhavāma"); - } - if (slot == 4) { - return EL_STR("abhavata"); - } - return EL_STR("abhavan"); - return 0; -} - -el_val_t sa_bhu_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("bhaviṣyāmi"); - } - if (slot == 1) { - return EL_STR("bhaviṣyasi"); - } - if (slot == 2) { - return EL_STR("bhaviṣyati"); - } - if (slot == 3) { - return EL_STR("bhaviṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("bhaviṣyatha"); - } - return EL_STR("bhaviṣyanti"); - return 0; -} - -el_val_t sa_gam_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gacchāmi"); - } - if (slot == 1) { - return EL_STR("gacchasi"); - } - if (slot == 2) { - return EL_STR("gacchati"); - } - if (slot == 3) { - return EL_STR("gacchāmaḥ"); - } - if (slot == 4) { - return EL_STR("gacchatha"); - } - return EL_STR("gacchanti"); - return 0; -} - -el_val_t sa_gam_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("agaccham"); - } - if (slot == 1) { - return EL_STR("agacchaḥ"); - } - if (slot == 2) { - return EL_STR("agacchat"); - } - if (slot == 3) { - return EL_STR("agacchāma"); - } - if (slot == 4) { - return EL_STR("agacchata"); - } - return EL_STR("agacchan"); - return 0; -} - -el_val_t sa_gam_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("gamiṣyāmi"); - } - if (slot == 1) { - return EL_STR("gamiṣyasi"); - } - if (slot == 2) { - return EL_STR("gamiṣyati"); - } - if (slot == 3) { - return EL_STR("gamiṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("gamiṣyatha"); - } - return EL_STR("gamiṣyanti"); - return 0; -} - -el_val_t sa_drs_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("paśyāmi"); - } - if (slot == 1) { - return EL_STR("paśyasi"); - } - if (slot == 2) { - return EL_STR("paśyati"); - } - if (slot == 3) { - return EL_STR("paśyāmaḥ"); - } - if (slot == 4) { - return EL_STR("paśyatha"); - } - return EL_STR("paśyanti"); - return 0; -} - -el_val_t sa_drs_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("apaśyam"); - } - if (slot == 1) { - return EL_STR("apaśyaḥ"); - } - if (slot == 2) { - return EL_STR("apaśyat"); - } - if (slot == 3) { - return EL_STR("apaśyāma"); - } - if (slot == 4) { - return EL_STR("apaśyata"); - } - return EL_STR("apaśyan"); - return 0; -} - -el_val_t sa_drs_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("drakṣyāmi"); - } - if (slot == 1) { - return EL_STR("drakṣyasi"); - } - if (slot == 2) { - return EL_STR("drakṣyati"); - } - if (slot == 3) { - return EL_STR("drakṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("drakṣyatha"); - } - return EL_STR("drakṣyanti"); - return 0; -} - -el_val_t sa_vad_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("vadāmi"); - } - if (slot == 1) { - return EL_STR("vadasi"); - } - if (slot == 2) { - return EL_STR("vadati"); - } - if (slot == 3) { - return EL_STR("vadāmaḥ"); - } - if (slot == 4) { - return EL_STR("vadatha"); - } - return EL_STR("vadanti"); - return 0; -} - -el_val_t sa_vad_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("avadam"); - } - if (slot == 1) { - return EL_STR("avadaḥ"); - } - if (slot == 2) { - return EL_STR("avadat"); - } - if (slot == 3) { - return EL_STR("avadāma"); - } - if (slot == 4) { - return EL_STR("avadata"); - } - return EL_STR("avadan"); - return 0; -} - -el_val_t sa_vad_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("vadiṣyāmi"); - } - if (slot == 1) { - return EL_STR("vadiṣyasi"); - } - if (slot == 2) { - return EL_STR("vadiṣyati"); - } - if (slot == 3) { - return EL_STR("vadiṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("vadiṣyatha"); - } - return EL_STR("vadiṣyanti"); - return 0; -} - -el_val_t sa_kr_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("karomi"); - } - if (slot == 1) { - return EL_STR("karoṣi"); - } - if (slot == 2) { - return EL_STR("karoti"); - } - if (slot == 3) { - return EL_STR("kurmaḥ"); - } - if (slot == 4) { - return EL_STR("kurutha"); - } - return EL_STR("kurvanti"); - return 0; -} - -el_val_t sa_kr_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("akaravam"); - } - if (slot == 1) { - return EL_STR("akarodaḥ"); - } - if (slot == 2) { - return EL_STR("akarot"); - } - if (slot == 3) { - return EL_STR("akurma"); - } - if (slot == 4) { - return EL_STR("akuruta"); - } - return EL_STR("akurvan"); - return 0; -} - -el_val_t sa_kr_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("kariṣyāmi"); - } - if (slot == 1) { - return EL_STR("kariṣyasi"); - } - if (slot == 2) { - return EL_STR("kariṣyati"); - } - if (slot == 3) { - return EL_STR("kariṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("kariṣyatha"); - } - return EL_STR("kariṣyanti"); - return 0; -} - -el_val_t sa_class1_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("āmi"); - } - if (slot == 1) { - return EL_STR("asi"); - } - if (slot == 2) { - return EL_STR("ati"); - } - if (slot == 3) { - return EL_STR("āmaḥ"); - } - if (slot == 4) { - return EL_STR("atha"); - } - return EL_STR("anti"); - return 0; -} - -el_val_t sa_class1_past_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("aḥ"); - } - if (slot == 2) { - return EL_STR("at"); - } - if (slot == 3) { - return EL_STR("āma"); - } - if (slot == 4) { - return EL_STR("ata"); - } - return EL_STR("an"); - return 0; -} - -el_val_t sa_class1_future_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("iṣyāmi"); - } - if (slot == 1) { - return EL_STR("iṣyasi"); - } - if (slot == 2) { - return EL_STR("iṣyati"); - } - if (slot == 3) { - return EL_STR("iṣyāmaḥ"); - } - if (slot == 4) { - return EL_STR("iṣyatha"); - } - return EL_STR("iṣyanti"); - return 0; -} - -el_val_t sa_class1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(stem, sa_class1_present_ending(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(el_str_concat(EL_STR("a"), stem), sa_class1_past_ending(slot)); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(stem, sa_class1_future_ending(slot)); - } - return stem; - return 0; -} - -el_val_t sa_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = sa_map_canonical(verb); - el_val_t slot = sa_slot(person, number); - if (str_eq(v, EL_STR("as"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_as_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_as_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_as_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("bhu"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_bhu_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_bhu_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_bhu_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("gam"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_gam_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_gam_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_gam_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("drs"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_drs_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_drs_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_drs_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("vad"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_vad_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_vad_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_vad_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("kr"))) { - if (str_eq(tense, EL_STR("present"))) { - return sa_kr_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sa_kr_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return sa_kr_future(slot); - } - return v; - } - return sa_class1_conjugate(v, tense, slot); - return 0; -} - -el_val_t sa_decline_a_stem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ḥ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("m")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("ena")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("āt")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("sya")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return stem; - } - return stem; - return 0; -} - -el_val_t sa_decline_a_stem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("āḥ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ān")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("aiḥ")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ebhyaḥ")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ebhyaḥ")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ānām")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("eṣu")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("āḥ")); - } - return el_str_concat(stem, EL_STR("āḥ")); - return 0; -} - -el_val_t sa_decline_aa_stem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ī")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("īm")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("yā")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("yai")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("yāḥ")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("yāḥ")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("yām")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("i")); - } - return el_str_concat(stem, EL_STR("ī")); - return 0; -} - -el_val_t sa_decline_aa_stem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("yaḥ")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("īḥ")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("ībhiḥ")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ībhyaḥ")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ībhyaḥ")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("īṇām")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("īṣu")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("yaḥ")); - } - return el_str_concat(stem, EL_STR("yaḥ")); - return 0; -} - -el_val_t sa_stem_type(el_val_t noun) { - if (sa_str_ends(noun, EL_STR("ā"))) { - return EL_STR("aa"); - } - if (sa_str_ends(noun, EL_STR("ī"))) { - return EL_STR("aa"); - } - if (sa_str_ends(noun, EL_STR("aḥ"))) { - return EL_STR("a"); - } - if (sa_str_ends(noun, EL_STR("a"))) { - return EL_STR("a"); - } - return EL_STR("unknown"); - return 0; -} - -el_val_t sa_extract_stem(el_val_t noun, el_val_t stype) { - el_val_t n = str_len(noun); - if (str_eq(stype, EL_STR("a"))) { - if (sa_str_ends(noun, EL_STR("aḥ"))) { - return str_slice(noun, 0, (n - 4)); - } - return str_slice(noun, 0, (n - 1)); - } - if (str_eq(stype, EL_STR("aa"))) { - return str_slice(noun, 0, (n - 2)); - } - return noun; - return 0; -} - -el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stype = sa_stem_type(noun); - if (str_eq(stype, EL_STR("a"))) { - el_val_t stem = sa_extract_stem(noun, EL_STR("a")); - if (str_eq(number, EL_STR("singular"))) { - return sa_decline_a_stem_sg(stem, gram_case); - } - return sa_decline_a_stem_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("aa"))) { - el_val_t stem = sa_extract_stem(noun, EL_STR("aa")); - if (str_eq(number, EL_STR("singular"))) { - return sa_decline_aa_stem_sg(stem, gram_case); - } - return sa_decline_aa_stem_pl(stem, gram_case); - } - return noun; - return 0; -} - -el_val_t sa_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return sa_decline(noun, gram_case, number); - return 0; -} - -el_val_t got_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t got_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t got_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t got_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("wisan"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("haban"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("gaggan"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("saihwan"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("qiþan"); - } - if (str_eq(verb, EL_STR("take"))) { - return EL_STR("niman"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("qiman"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("giban"); - } - if (str_eq(verb, EL_STR("know"))) { - return EL_STR("kunnan"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("wiljan"); - } - return verb; - return 0; -} - -el_val_t got_wisan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("im"); - } - if (slot == 1) { - return EL_STR("is"); - } - if (slot == 2) { - return EL_STR("ist"); - } - if (slot == 3) { - return EL_STR("sijum"); - } - if (slot == 4) { - return EL_STR("sijuþ"); - } - return EL_STR("sind"); - return 0; -} - -el_val_t got_wisan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("was"); - } - if (slot == 1) { - return EL_STR("wast"); - } - if (slot == 2) { - return EL_STR("was"); - } - if (slot == 3) { - return EL_STR("wesum"); - } - if (slot == 4) { - return EL_STR("wesuþ"); - } - return EL_STR("wesun"); - return 0; -} - -el_val_t got_haban_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("haba"); - } - if (slot == 1) { - return EL_STR("habais"); - } - if (slot == 2) { - return EL_STR("habaiþ"); - } - if (slot == 3) { - return EL_STR("habam"); - } - if (slot == 4) { - return EL_STR("habaiþ"); - } - return EL_STR("haband"); - return 0; -} - -el_val_t got_haban_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("habida"); - } - if (slot == 1) { - return EL_STR("habides"); - } - if (slot == 2) { - return EL_STR("habida"); - } - if (slot == 3) { - return EL_STR("habidum"); - } - if (slot == 4) { - return EL_STR("habideþ"); - } - return EL_STR("habidedun"); - return 0; -} - -el_val_t got_gaggan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gagga"); - } - if (slot == 1) { - return EL_STR("gaggis"); - } - if (slot == 2) { - return EL_STR("gaggiþ"); - } - if (slot == 3) { - return EL_STR("gagam"); - } - if (slot == 4) { - return EL_STR("gagiþ"); - } - return EL_STR("gaggand"); - return 0; -} - -el_val_t got_gaggan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("iddja"); - } - if (slot == 1) { - return EL_STR("iddjēs"); - } - if (slot == 2) { - return EL_STR("iddja"); - } - if (slot == 3) { - return EL_STR("iddjēdum"); - } - if (slot == 4) { - return EL_STR("iddjēduþ"); - } - return EL_STR("iddjēdun"); - return 0; -} - -el_val_t got_saihwan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("saihwa"); - } - if (slot == 1) { - return EL_STR("saihwis"); - } - if (slot == 2) { - return EL_STR("saihwiþ"); - } - if (slot == 3) { - return EL_STR("saihwam"); - } - if (slot == 4) { - return EL_STR("saihwiþ"); - } - return EL_STR("saihwand"); - return 0; -} - -el_val_t got_saihwan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("sahw"); - } - if (slot == 1) { - return EL_STR("sahwt"); - } - if (slot == 2) { - return EL_STR("sahw"); - } - if (slot == 3) { - return EL_STR("sehwum"); - } - if (slot == 4) { - return EL_STR("sehwuþ"); - } - return EL_STR("sehwun"); - return 0; -} - -el_val_t got_qithan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("qiþa"); - } - if (slot == 1) { - return EL_STR("qiþis"); - } - if (slot == 2) { - return EL_STR("qiþiþ"); - } - if (slot == 3) { - return EL_STR("qiþam"); - } - if (slot == 4) { - return EL_STR("qiþiþ"); - } - return EL_STR("qiþand"); - return 0; -} - -el_val_t got_qithan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("qaþ"); - } - if (slot == 1) { - return EL_STR("qast"); - } - if (slot == 2) { - return EL_STR("qaþ"); - } - if (slot == 3) { - return EL_STR("qēþum"); - } - if (slot == 4) { - return EL_STR("qēþuþ"); - } - return EL_STR("qēþun"); - return 0; -} - -el_val_t got_niman_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("nima"); - } - if (slot == 1) { - return EL_STR("nimis"); - } - if (slot == 2) { - return EL_STR("nimiþ"); - } - if (slot == 3) { - return EL_STR("nimam"); - } - if (slot == 4) { - return EL_STR("nimiþ"); - } - return EL_STR("nimand"); - return 0; -} - -el_val_t got_niman_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("nam"); - } - if (slot == 1) { - return EL_STR("namt"); - } - if (slot == 2) { - return EL_STR("nam"); - } - if (slot == 3) { - return EL_STR("nēmum"); - } - if (slot == 4) { - return EL_STR("nēmuþ"); - } - return EL_STR("nēmun"); - return 0; -} - -el_val_t got_wk1_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("a"); - } - if (slot == 1) { - return EL_STR("is"); - } - if (slot == 2) { - return EL_STR("iþ"); - } - if (slot == 3) { - return EL_STR("jam"); - } - if (slot == 4) { - return EL_STR("jiþ"); - } - return EL_STR("jand"); - return 0; -} - -el_val_t got_wk1_past_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("ida"); - } - if (slot == 1) { - return EL_STR("ides"); - } - if (slot == 2) { - return EL_STR("ida"); - } - if (slot == 3) { - return EL_STR("idum"); - } - if (slot == 4) { - return EL_STR("ideþ"); - } - return EL_STR("idedun"); - return 0; -} - -el_val_t got_wk1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(stem, got_wk1_present_ending(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(stem, got_wk1_past_ending(slot)); - } - return stem; - return 0; -} - -el_val_t got_wk2_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("o"); - } - if (slot == 1) { - return EL_STR("os"); - } - if (slot == 2) { - return EL_STR("oþ"); - } - if (slot == 3) { - return EL_STR("om"); - } - if (slot == 4) { - return EL_STR("oþ"); - } - return EL_STR("ond"); - return 0; -} - -el_val_t got_wk2_past_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("oda"); - } - if (slot == 1) { - return EL_STR("odes"); - } - if (slot == 2) { - return EL_STR("oda"); - } - if (slot == 3) { - return EL_STR("odum"); - } - if (slot == 4) { - return EL_STR("odeþ"); - } - return EL_STR("odedun"); - return 0; -} - -el_val_t got_wk2_conjugate(el_val_t stem, el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(stem, got_wk2_present_ending(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(stem, got_wk2_past_ending(slot)); - } - return stem; - return 0; -} - -el_val_t got_verb_class(el_val_t verb) { - if (got_str_ends(verb, EL_STR("jan"))) { - return EL_STR("wk1"); - } - if (got_str_ends(verb, EL_STR("on"))) { - return EL_STR("wk2"); - } - return EL_STR("wk1"); - return 0; -} - -el_val_t got_verb_stem(el_val_t verb, el_val_t vclass) { - if (str_eq(vclass, EL_STR("wk1"))) { - return got_str_drop_last(verb, 3); - } - if (str_eq(vclass, EL_STR("wk2"))) { - return got_str_drop_last(verb, 2); - } - return got_str_drop_last(verb, 2); - return 0; -} - -el_val_t got_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = got_map_canonical(verb); - el_val_t slot = got_slot(person, number); - if (str_eq(v, EL_STR("wisan"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_wisan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_wisan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("haban"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_haban_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_haban_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("gaggan"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_gaggan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_gaggan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("saihwan"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_saihwan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_saihwan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("qiþan"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_qithan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_qithan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("niman"))) { - if (str_eq(tense, EL_STR("present"))) { - return got_niman_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return got_niman_past(slot); - } - return v; - } - el_val_t vclass = got_verb_class(v); - el_val_t stem = got_verb_stem(v, vclass); - if (str_eq(vclass, EL_STR("wk1"))) { - return got_wk1_conjugate(stem, tense, slot); - } - if (str_eq(vclass, EL_STR("wk2"))) { - return got_wk2_conjugate(stem, tense, slot); - } - return v; - return 0; -} - -el_val_t got_decline_a_stem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("s")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("is")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("a")); - } - return el_str_concat(stem, EL_STR("s")); - return 0; -} - -el_val_t got_decline_a_stem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("os")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ans")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("am")); - } - return el_str_concat(stem, EL_STR("os")); - return 0; -} - -el_val_t got_decline_o_stem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("os")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ai")); - } - return el_str_concat(stem, EL_STR("o")); - return 0; -} - -el_val_t got_decline_o_stem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("os")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("os")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("om")); - } - return el_str_concat(stem, EL_STR("os")); - return 0; -} - -el_val_t got_decline_n_stem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("an")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ins")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("in")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t got_decline_n_stem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ans")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ans")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ane")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("am")); - } - return el_str_concat(stem, EL_STR("ans")); - return 0; -} - -el_val_t got_stem_type(el_val_t noun) { - if (got_str_ends(noun, EL_STR("o"))) { - return EL_STR("o"); - } - if (got_str_ends(noun, EL_STR("a"))) { - return EL_STR("n"); - } - if (got_str_ends(noun, EL_STR("s"))) { - return EL_STR("a"); - } - return EL_STR("a"); - return 0; -} - -el_val_t got_extract_stem(el_val_t noun, el_val_t stype) { - el_val_t n = str_len(noun); - return str_slice(noun, 0, (n - 1)); - return 0; -} - -el_val_t got_demo_article(el_val_t stype) { - if (str_eq(stype, EL_STR("o"))) { - return EL_STR("þo"); - } - return EL_STR("sa"); - return 0; -} - -el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stype = got_stem_type(noun); - el_val_t stem = got_extract_stem(noun, stype); - if (str_eq(stype, EL_STR("a"))) { - if (str_eq(number, EL_STR("singular"))) { - return got_decline_a_stem_sg(stem, gram_case); - } - return got_decline_a_stem_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("o"))) { - if (str_eq(number, EL_STR("singular"))) { - return got_decline_o_stem_sg(stem, gram_case); - } - return got_decline_o_stem_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("n"))) { - if (str_eq(number, EL_STR("singular"))) { - return got_decline_n_stem_sg(stem, gram_case); - } - return got_decline_n_stem_pl(stem, gram_case); - } - return noun; - return 0; -} - -el_val_t got_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t declined = got_decline(noun, gram_case, number); - if (str_eq(definite, EL_STR("true"))) { - el_val_t stype = got_stem_type(noun); - el_val_t article = got_demo_article(stype); - return el_str_concat(el_str_concat(article, EL_STR(" ")), declined); - } - return declined; - return 0; -} - -el_val_t non_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t non_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t non_last(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t non_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t non_vera_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("em"); - } - if (slot == 1) { - return EL_STR("ert"); - } - if (slot == 2) { - return EL_STR("er"); - } - if (slot == 3) { - return EL_STR("erum"); - } - if (slot == 4) { - return EL_STR("eruð"); - } - return EL_STR("eru"); - return 0; -} - -el_val_t non_vera_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("var"); - } - if (slot == 1) { - return EL_STR("vart"); - } - if (slot == 2) { - return EL_STR("var"); - } - if (slot == 3) { - return EL_STR("vórum"); - } - if (slot == 4) { - return EL_STR("vóruð"); - } - return EL_STR("vóru"); - return 0; -} - -el_val_t non_hafa_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("hefi"); - } - if (slot == 1) { - return EL_STR("hefr"); - } - if (slot == 2) { - return EL_STR("hefr"); - } - if (slot == 3) { - return EL_STR("höfum"); - } - if (slot == 4) { - return EL_STR("hafið"); - } - return EL_STR("hafa"); - return 0; -} - -el_val_t non_hafa_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("hafða"); - } - if (slot == 1) { - return EL_STR("hafðir"); - } - if (slot == 2) { - return EL_STR("hafði"); - } - if (slot == 3) { - return EL_STR("höfðum"); - } - if (slot == 4) { - return EL_STR("höfðuð"); - } - return EL_STR("höfðu"); - return 0; -} - -el_val_t non_ganga_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("geng"); - } - if (slot == 1) { - return EL_STR("gengr"); - } - if (slot == 2) { - return EL_STR("gengr"); - } - if (slot == 3) { - return EL_STR("göngum"); - } - if (slot == 4) { - return EL_STR("gangið"); - } - return EL_STR("ganga"); - return 0; -} - -el_val_t non_ganga_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("gekk"); - } - if (slot == 1) { - return EL_STR("gekkt"); - } - if (slot == 2) { - return EL_STR("gekk"); - } - if (slot == 3) { - return EL_STR("gengum"); - } - if (slot == 4) { - return EL_STR("genguð"); - } - return EL_STR("gengu"); - return 0; -} - -el_val_t non_sja_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("sé"); - } - if (slot == 1) { - return EL_STR("sér"); - } - if (slot == 2) { - return EL_STR("sér"); - } - if (slot == 3) { - return EL_STR("séum"); - } - if (slot == 4) { - return EL_STR("séið"); - } - return EL_STR("sjá"); - return 0; -} - -el_val_t non_sja_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("sá"); - } - if (slot == 1) { - return EL_STR("sást"); - } - if (slot == 2) { - return EL_STR("sá"); - } - if (slot == 3) { - return EL_STR("sám"); - } - if (slot == 4) { - return EL_STR("sáð"); - } - return EL_STR("sáu"); - return 0; -} - -el_val_t non_segja_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("segi"); - } - if (slot == 1) { - return EL_STR("segir"); - } - if (slot == 2) { - return EL_STR("segir"); - } - if (slot == 3) { - return EL_STR("segjum"); - } - if (slot == 4) { - return EL_STR("segið"); - } - return EL_STR("segja"); - return 0; -} - -el_val_t non_segja_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("sagði"); - } - if (slot == 1) { - return EL_STR("sagðir"); - } - if (slot == 2) { - return EL_STR("sagði"); - } - if (slot == 3) { - return EL_STR("sögðum"); - } - if (slot == 4) { - return EL_STR("sögðuð"); - } - return EL_STR("sögðu"); - return 0; -} - -el_val_t non_koma_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("kem"); - } - if (slot == 1) { - return EL_STR("kemr"); - } - if (slot == 2) { - return EL_STR("kemr"); - } - if (slot == 3) { - return EL_STR("komum"); - } - if (slot == 4) { - return EL_STR("komið"); - } - return EL_STR("koma"); - return 0; -} - -el_val_t non_koma_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("kom"); - } - if (slot == 1) { - return EL_STR("komt"); - } - if (slot == 2) { - return EL_STR("kom"); - } - if (slot == 3) { - return EL_STR("komum"); - } - if (slot == 4) { - return EL_STR("komuð"); - } - return EL_STR("komu"); - return 0; -} - -el_val_t non_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("vera"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("hafa"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("ganga"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("sjá"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("segja"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("koma"); - } - return verb; - return 0; -} - -el_val_t non_weak_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("a")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("ar")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ar")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("um")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ið")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t non_weak_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("aði")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("aðir")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("aði")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("uðum")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("uðuð")); - } - return el_str_concat(stem, EL_STR("uðu")); - return 0; -} - -el_val_t non_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = non_map_canonical(verb); - el_val_t slot = non_slot(person, number); - if (str_eq(v, EL_STR("vera"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_vera_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_vera_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("hafa"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_hafa_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_hafa_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("ganga"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_ganga_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_ganga_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("sjá"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_sja_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_sja_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("segja"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_segja_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_segja_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("koma"))) { - if (str_eq(tense, EL_STR("present"))) { - return non_koma_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_koma_past(slot); - } - return v; - } - if (non_str_ends(v, EL_STR("a"))) { - el_val_t stem = non_drop(v, 1); - if (str_eq(tense, EL_STR("present"))) { - return non_weak_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return non_weak_past(stem, slot); - } - return v; - } - return v; - return 0; -} - -el_val_t non_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stem = noun; - if (non_str_ends(noun, EL_STR("r"))) { - stem = non_drop(noun, 1); - } - if (str_eq(noun, EL_STR("armr"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("armr"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("arm"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("arms"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("armi"); - } - return EL_STR("armr"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("armar"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("arma"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("arma"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("örmum"); - } - return EL_STR("armar"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("r")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("s")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("i")); - } - return el_str_concat(stem, EL_STR("r")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ar")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("um")); - } - return el_str_concat(stem, EL_STR("ar")); - return 0; -} - -el_val_t non_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("gör"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("gör"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("görvar"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("görvar"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("görvi"); - } - return EL_STR("gör"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("görvar"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("görvar"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("görva"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("görvum"); - } - return EL_STR("görvar"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("var")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("var")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("vi")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("var")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("var")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("va")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("vum")); - } - return el_str_concat(noun, EL_STR("var")); - return 0; -} - -el_val_t non_decline_neut(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("land"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("land"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("land"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("lands"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("landi"); - } - return EL_STR("land"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("lönd"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("lönd"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("landa"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("löndum"); - } - return EL_STR("lönd"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("s")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("i")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("um")); - } - return noun; - return 0; -} - -el_val_t non_detect_gender(el_val_t noun) { - if (str_eq(noun, EL_STR("land"))) { - return EL_STR("neuter"); - } - if (str_eq(noun, EL_STR("gör"))) { - return EL_STR("feminine"); - } - return EL_STR("masculine"); - return 0; -} - -el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t gender = non_detect_gender(noun); - if (str_eq(gender, EL_STR("masculine"))) { - return non_decline_masc(noun, gram_case, number); - } - if (str_eq(gender, EL_STR("feminine"))) { - return non_decline_fem(noun, gram_case, number); - } - if (str_eq(gender, EL_STR("neuter"))) { - return non_decline_neut(noun, gram_case, number); - } - return noun; - return 0; -} - -el_val_t non_def_suffix_masc(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("inn"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("ins"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("inum"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("inn"); - } - return EL_STR("inn"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("inir"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("ina"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("anna"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("unum"); - } - return EL_STR("inir"); - return 0; -} - -el_val_t non_def_suffix_neut(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("it"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("ins"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("inu"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("it"); - } - return EL_STR("it"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("in"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("in"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("anna"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("unum"); - } - return EL_STR("in"); - return 0; -} - -el_val_t non_def_suffix_fem(el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("in"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("innar"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("inni"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("ina"); - } - return EL_STR("in"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("inar"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("inar"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("anna"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("innar"); - } - return EL_STR("inar"); - return 0; -} - -el_val_t non_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t base = non_decline(noun, gram_case, number); - if (!str_eq(definite, EL_STR("true"))) { - return base; - } - el_val_t gender = non_detect_gender(noun); - if (str_eq(gender, EL_STR("masculine"))) { - return el_str_concat(base, non_def_suffix_masc(gram_case, number)); - } - if (str_eq(gender, EL_STR("neuter"))) { - return el_str_concat(base, non_def_suffix_neut(gram_case, number)); - } - if (str_eq(gender, EL_STR("feminine"))) { - return el_str_concat(base, non_def_suffix_fem(gram_case, number)); - } - return el_str_concat(base, EL_STR("inn")); - return 0; -} - -el_val_t enm_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t enm_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t enm_first_char(el_val_t s) { - if (str_len(s) == 0) { - return EL_STR(""); - } - return str_slice(s, 0, 1); - return 0; -} - -el_val_t enm_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t enm_been_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("art"); - } - if (slot == 2) { - return EL_STR("is"); - } - if (slot == 3) { - return EL_STR("aren"); - } - if (slot == 4) { - return EL_STR("been"); - } - return EL_STR("been"); - return 0; -} - -el_val_t enm_been_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("was"); - } - if (slot == 1) { - return EL_STR("were"); - } - if (slot == 2) { - return EL_STR("was"); - } - if (slot == 3) { - return EL_STR("were"); - } - if (slot == 4) { - return EL_STR("were"); - } - return EL_STR("were"); - return 0; -} - -el_val_t enm_haven_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("have"); - } - if (slot == 1) { - return EL_STR("hast"); - } - if (slot == 2) { - return EL_STR("hath"); - } - if (slot == 3) { - return EL_STR("have"); - } - if (slot == 4) { - return EL_STR("have"); - } - return EL_STR("have"); - return 0; -} - -el_val_t enm_haven_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("hadde"); - } - if (slot == 1) { - return EL_STR("haddest"); - } - if (slot == 2) { - return EL_STR("hadde"); - } - if (slot == 3) { - return EL_STR("hadden"); - } - if (slot == 4) { - return EL_STR("hadden"); - } - return EL_STR("hadden"); - return 0; -} - -el_val_t enm_goon_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("go"); - } - if (slot == 1) { - return EL_STR("goost"); - } - if (slot == 2) { - return EL_STR("gooth"); - } - if (slot == 3) { - return EL_STR("goon"); - } - if (slot == 4) { - return EL_STR("goon"); - } - return EL_STR("goon"); - return 0; -} - -el_val_t enm_goon_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("wente"); - } - if (slot == 1) { - return EL_STR("wentest"); - } - if (slot == 2) { - return EL_STR("wente"); - } - if (slot == 3) { - return EL_STR("wenten"); - } - if (slot == 4) { - return EL_STR("wenten"); - } - return EL_STR("wenten"); - return 0; -} - -el_val_t enm_seen_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("see"); - } - if (slot == 1) { - return EL_STR("seest"); - } - if (slot == 2) { - return EL_STR("seeth"); - } - if (slot == 3) { - return EL_STR("seen"); - } - if (slot == 4) { - return EL_STR("seen"); - } - return EL_STR("seen"); - return 0; -} - -el_val_t enm_seen_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("saugh"); - } - if (slot == 1) { - return EL_STR("sawest"); - } - if (slot == 2) { - return EL_STR("saugh"); - } - if (slot == 3) { - return EL_STR("sawen"); - } - if (slot == 4) { - return EL_STR("sawen"); - } - return EL_STR("sawen"); - return 0; -} - -el_val_t enm_seyen_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("seye"); - } - if (slot == 1) { - return EL_STR("seyst"); - } - if (slot == 2) { - return EL_STR("seith"); - } - if (slot == 3) { - return EL_STR("seyen"); - } - if (slot == 4) { - return EL_STR("seyen"); - } - return EL_STR("seyen"); - return 0; -} - -el_val_t enm_seyen_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("seide"); - } - if (slot == 1) { - return EL_STR("seidest"); - } - if (slot == 2) { - return EL_STR("seide"); - } - if (slot == 3) { - return EL_STR("seiden"); - } - if (slot == 4) { - return EL_STR("seiden"); - } - return EL_STR("seiden"); - return 0; -} - -el_val_t enm_comen_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("come"); - } - if (slot == 1) { - return EL_STR("comest"); - } - if (slot == 2) { - return EL_STR("cometh"); - } - if (slot == 3) { - return EL_STR("comen"); - } - if (slot == 4) { - return EL_STR("comen"); - } - return EL_STR("comen"); - return 0; -} - -el_val_t enm_comen_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("cam"); - } - if (slot == 1) { - return EL_STR("come"); - } - if (slot == 2) { - return EL_STR("cam"); - } - if (slot == 3) { - return EL_STR("comen"); - } - if (slot == 4) { - return EL_STR("comen"); - } - return EL_STR("comen"); - return 0; -} - -el_val_t enm_maken_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("make"); - } - if (slot == 1) { - return EL_STR("makest"); - } - if (slot == 2) { - return EL_STR("maketh"); - } - if (slot == 3) { - return EL_STR("maken"); - } - if (slot == 4) { - return EL_STR("maken"); - } - return EL_STR("maken"); - return 0; -} - -el_val_t enm_maken_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("made"); - } - if (slot == 1) { - return EL_STR("madest"); - } - if (slot == 2) { - return EL_STR("made"); - } - if (slot == 3) { - return EL_STR("maden"); - } - if (slot == 4) { - return EL_STR("maden"); - } - return EL_STR("maden"); - return 0; -} - -el_val_t enm_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("been"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("haven"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("goon"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("seen"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("seyen"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("comen"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("maken"); - } - return verb; - return 0; -} - -el_val_t enm_weak_stem(el_val_t verb) { - if (enm_str_ends(verb, EL_STR("en"))) { - return enm_drop(verb, 2); - } - if (enm_str_ends(verb, EL_STR("e"))) { - return enm_drop(verb, 1); - } - return verb; - return 0; -} - -el_val_t enm_weak_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("est")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("eth")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("en")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("en")); - } - return el_str_concat(stem, EL_STR("en")); - return 0; -} - -el_val_t enm_weak_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("ede")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("edest")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ede")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("eden")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("eden")); - } - return el_str_concat(stem, EL_STR("eden")); - return 0; -} - -el_val_t enm_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = enm_map_canonical(verb); - el_val_t slot = enm_slot(person, number); - if (str_eq(v, EL_STR("been"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_been_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_been_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("haven"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_haven_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_haven_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("goon"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_goon_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_goon_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("seen"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_seen_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_seen_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("seyen"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_seyen_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_seyen_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("comen"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_comen_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_comen_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("maken"))) { - if (str_eq(tense, EL_STR("present"))) { - return enm_maken_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_maken_past(slot); - } - return v; - } - el_val_t stem = enm_weak_stem(v); - if (str_eq(tense, EL_STR("present"))) { - return enm_weak_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return enm_weak_past(stem, slot); - } - return v; - return 0; -} - -el_val_t enm_irregular_plural(el_val_t noun) { - if (str_eq(noun, EL_STR("man"))) { - return EL_STR("men"); - } - if (str_eq(noun, EL_STR("woman"))) { - return EL_STR("wommen"); - } - if (str_eq(noun, EL_STR("child"))) { - return EL_STR("children"); - } - if (str_eq(noun, EL_STR("ox"))) { - return EL_STR("oxen"); - } - if (str_eq(noun, EL_STR("foot"))) { - return EL_STR("feet"); - } - if (str_eq(noun, EL_STR("tooth"))) { - return EL_STR("teeth"); - } - if (str_eq(noun, EL_STR("goose"))) { - return EL_STR("gees"); - } - if (str_eq(noun, EL_STR("mouse"))) { - return EL_STR("mees"); - } - if (str_eq(noun, EL_STR("louse"))) { - return EL_STR("lees"); - } - return EL_STR(""); - return 0; -} - -el_val_t enm_make_plural(el_val_t noun) { - el_val_t irreg = enm_irregular_plural(noun); - if (!str_eq(irreg, EL_STR(""))) { - return irreg; - } - if (enm_str_ends(noun, EL_STR("e"))) { - return el_str_concat(noun, EL_STR("s")); - } - return el_str_concat(noun, EL_STR("es")); - return 0; -} - -el_val_t enm_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("plural"))) { - return enm_make_plural(noun); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("es")); - } - return noun; - return 0; -} - -el_val_t enm_is_vowel_initial(el_val_t s) { - el_val_t c = enm_first_char(s); - if (str_eq(c, EL_STR("a"))) { - return 1; - } - if (str_eq(c, EL_STR("e"))) { - return 1; - } - if (str_eq(c, EL_STR("i"))) { - return 1; - } - if (str_eq(c, EL_STR("o"))) { - return 1; - } - if (str_eq(c, EL_STR("u"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t enm_indef_article(el_val_t noun_phrase) { - if (enm_is_vowel_initial(noun_phrase)) { - return EL_STR("an"); - } - return EL_STR("a"); - return 0; -} - -el_val_t enm_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t form = enm_decline(noun, gram_case, number); - if (str_eq(definite, EL_STR("true"))) { - return el_str_concat(EL_STR("the "), form); - } - if (str_eq(number, EL_STR("plural"))) { - return form; - } - el_val_t art = enm_indef_article(form); - return el_str_concat(el_str_concat(art, EL_STR(" ")), form); - return 0; -} - -el_val_t pi_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t pi_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t pi_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t pi_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t pi_present_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("āmi"); - } - if (slot == 1) { - return EL_STR("asi"); - } - if (slot == 2) { - return EL_STR("ati"); - } - if (slot == 3) { - return EL_STR("āma"); - } - if (slot == 4) { - return EL_STR("atha"); - } - return EL_STR("anti"); - return 0; -} - -el_val_t pi_aorist_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("iṃ"); - } - if (slot == 1) { - return EL_STR("i"); - } - if (slot == 2) { - return EL_STR("i"); - } - if (slot == 3) { - return EL_STR("imhā"); - } - if (slot == 4) { - return EL_STR("ittha"); - } - return EL_STR("iṃsu"); - return 0; -} - -el_val_t pi_future_ending(el_val_t slot) { - if (slot == 0) { - return EL_STR("issāmi"); - } - if (slot == 1) { - return EL_STR("issasi"); - } - if (slot == 2) { - return EL_STR("issati"); - } - if (slot == 3) { - return EL_STR("issāma"); - } - if (slot == 4) { - return EL_STR("issatha"); - } - return EL_STR("issanti"); - return 0; -} - -el_val_t pi_hoti_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("homi"); - } - if (slot == 1) { - return EL_STR("hosi"); - } - if (slot == 2) { - return EL_STR("hoti"); - } - if (slot == 3) { - return EL_STR("homa"); - } - if (slot == 4) { - return EL_STR("hotha"); - } - return EL_STR("honti"); - return 0; -} - -el_val_t pi_atthi_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("amhi"); - } - if (slot == 1) { - return EL_STR("asi"); - } - if (slot == 2) { - return EL_STR("atthi"); - } - if (slot == 3) { - return EL_STR("amha"); - } - if (slot == 4) { - return EL_STR("attha"); - } - return EL_STR("santi"); - return 0; -} - -el_val_t pi_hoti_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("āsiṃ"); - } - if (slot == 1) { - return EL_STR("āsi"); - } - if (slot == 2) { - return EL_STR("āsi"); - } - if (slot == 3) { - return EL_STR("āsimhā"); - } - if (slot == 4) { - return EL_STR("āsittha"); - } - return EL_STR("āsiṃsu"); - return 0; -} - -el_val_t pi_hoti_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("hossāmi"); - } - if (slot == 1) { - return EL_STR("hossasi"); - } - if (slot == 2) { - return EL_STR("hossati"); - } - if (slot == 3) { - return EL_STR("hossāma"); - } - if (slot == 4) { - return EL_STR("hossatha"); - } - return EL_STR("hossanti"); - return 0; -} - -el_val_t pi_gacchati_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gacchāmi"); - } - if (slot == 1) { - return EL_STR("gacchasi"); - } - if (slot == 2) { - return EL_STR("gacchati"); - } - if (slot == 3) { - return EL_STR("gacchāma"); - } - if (slot == 4) { - return EL_STR("gacchatha"); - } - return EL_STR("gacchanti"); - return 0; -} - -el_val_t pi_gacchati_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("agamāsiṃ"); - } - if (slot == 1) { - return EL_STR("agamāsi"); - } - if (slot == 2) { - return EL_STR("agamāsi"); - } - if (slot == 3) { - return EL_STR("agamāsimhā"); - } - if (slot == 4) { - return EL_STR("agamāsittha"); - } - return EL_STR("agamaṃsu"); - return 0; -} - -el_val_t pi_gacchati_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("gamissāmi"); - } - if (slot == 1) { - return EL_STR("gamissasi"); - } - if (slot == 2) { - return EL_STR("gamissati"); - } - if (slot == 3) { - return EL_STR("gamissāma"); - } - if (slot == 4) { - return EL_STR("gamissatha"); - } - return EL_STR("gamissanti"); - return 0; -} - -el_val_t pi_passati_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("passāmi"); - } - if (slot == 1) { - return EL_STR("passasi"); - } - if (slot == 2) { - return EL_STR("passati"); - } - if (slot == 3) { - return EL_STR("passāma"); - } - if (slot == 4) { - return EL_STR("passatha"); - } - return EL_STR("passanti"); - return 0; -} - -el_val_t pi_passati_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("addasāsiṃ"); - } - if (slot == 1) { - return EL_STR("addasāsi"); - } - if (slot == 2) { - return EL_STR("addasāsi"); - } - if (slot == 3) { - return EL_STR("addasāsimhā"); - } - if (slot == 4) { - return EL_STR("addasāsittha"); - } - return EL_STR("addasāsiṃsu"); - return 0; -} - -el_val_t pi_passati_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("dakkhissāmi"); - } - if (slot == 1) { - return EL_STR("dakkhissasi"); - } - if (slot == 2) { - return EL_STR("dakkhissati"); - } - if (slot == 3) { - return EL_STR("dakkhissāma"); - } - if (slot == 4) { - return EL_STR("dakkhissatha"); - } - return EL_STR("dakkhissanti"); - return 0; -} - -el_val_t pi_vadati_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("vadāmi"); - } - if (slot == 1) { - return EL_STR("vadasi"); - } - if (slot == 2) { - return EL_STR("vadati"); - } - if (slot == 3) { - return EL_STR("vadāma"); - } - if (slot == 4) { - return EL_STR("vadatha"); - } - return EL_STR("vadanti"); - return 0; -} - -el_val_t pi_vadati_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("avadāsiṃ"); - } - if (slot == 1) { - return EL_STR("avadāsi"); - } - if (slot == 2) { - return EL_STR("avadāsi"); - } - if (slot == 3) { - return EL_STR("avadāsimhā"); - } - if (slot == 4) { - return EL_STR("avadāsittha"); - } - return EL_STR("avadāsiṃsu"); - return 0; -} - -el_val_t pi_vadati_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("vadissāmi"); - } - if (slot == 1) { - return EL_STR("vadissasi"); - } - if (slot == 2) { - return EL_STR("vadissati"); - } - if (slot == 3) { - return EL_STR("vadissāma"); - } - if (slot == 4) { - return EL_STR("vadissatha"); - } - return EL_STR("vadissanti"); - return 0; -} - -el_val_t pi_karoti_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("karomi"); - } - if (slot == 1) { - return EL_STR("karosi"); - } - if (slot == 2) { - return EL_STR("karoti"); - } - if (slot == 3) { - return EL_STR("karoma"); - } - if (slot == 4) { - return EL_STR("karotha"); - } - return EL_STR("karonti"); - return 0; -} - -el_val_t pi_karoti_aorist(el_val_t slot) { - if (slot == 0) { - return EL_STR("akāsiṃ"); - } - if (slot == 1) { - return EL_STR("akāsi"); - } - if (slot == 2) { - return EL_STR("akāsi"); - } - if (slot == 3) { - return EL_STR("akāsimhā"); - } - if (slot == 4) { - return EL_STR("akāsittha"); - } - return EL_STR("akāsiṃsu"); - return 0; -} - -el_val_t pi_karoti_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("karissāmi"); - } - if (slot == 1) { - return EL_STR("karissasi"); - } - if (slot == 2) { - return EL_STR("karissati"); - } - if (slot == 3) { - return EL_STR("karissāma"); - } - if (slot == 4) { - return EL_STR("karissatha"); - } - return EL_STR("karissanti"); - return 0; -} - -el_val_t pi_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("hoti"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("gacchati"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("passati"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("vadati"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("karoti"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("karoti"); - } - return verb; - return 0; -} - -el_val_t pi_regular_root(el_val_t verb) { - if (pi_str_ends(verb, EL_STR("ati"))) { - return pi_drop(verb, 3); - } - if (pi_str_ends(verb, EL_STR("eti"))) { - return pi_drop(verb, 3); - } - return verb; - return 0; -} - -el_val_t pi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = pi_map_canonical(verb); - el_val_t slot = pi_slot(person, number); - if (str_eq(v, EL_STR("hoti"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_hoti_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_hoti_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_hoti_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("atthi"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_atthi_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_hoti_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_hoti_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("gacchati"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_gacchati_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_gacchati_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_gacchati_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("passati"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_passati_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_passati_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_passati_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("vadati"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_vadati_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_vadati_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_vadati_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("karoti"))) { - if (str_eq(tense, EL_STR("present"))) { - return pi_karoti_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return pi_karoti_aorist(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return pi_karoti_future(slot); - } - return v; - } - el_val_t root = pi_regular_root(v); - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(root, pi_present_ending(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(root, pi_aorist_ending(slot)); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(root, pi_future_ending(slot)); - } - return v; - return 0; -} - -el_val_t pi_decline_a_masc_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ṃ")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("ena")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ssa")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("smiṃ")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return stem; - } - return el_str_concat(stem, EL_STR("o")); - return 0; -} - -el_val_t pi_decline_a_masc_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("ehi")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("esu")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - return el_str_concat(stem, EL_STR("ā")); - return 0; -} - -el_val_t pi_decline_a_fem_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("aṃ")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("āya")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("āyaṃ")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("e")); - } - return el_str_concat(stem, EL_STR("ā")); - return 0; -} - -el_val_t pi_decline_a_fem_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - if (str_eq(gram_case, EL_STR("instrumental"))) { - return el_str_concat(stem, EL_STR("āhi")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ānaṃ")); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return el_str_concat(stem, EL_STR("āsu")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(stem, EL_STR("ā")); - } - return el_str_concat(stem, EL_STR("ā")); - return 0; -} - -el_val_t pi_detect_class(el_val_t noun) { - if (pi_str_ends(noun, EL_STR("o"))) { - return EL_STR("a_masc"); - } - if (pi_str_ends(noun, EL_STR("ā"))) { - return EL_STR("a_fem"); - } - if (pi_str_ends(noun, EL_STR("a"))) { - return EL_STR("a_masc"); - } - return EL_STR("a_masc"); - return 0; -} - -el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t nclass = pi_detect_class(noun); - if (str_eq(nclass, EL_STR("a_masc"))) { - el_val_t stem = noun; - if (pi_str_ends(noun, EL_STR("o"))) { - stem = pi_drop(noun, 1); - } - if (pi_str_ends(noun, EL_STR("a"))) { - stem = pi_drop(noun, 1); - } - if (str_eq(number, EL_STR("singular"))) { - return pi_decline_a_masc_sg(stem, gram_case); - } - return pi_decline_a_masc_pl(stem, gram_case); - } - if (str_eq(nclass, EL_STR("a_fem"))) { - el_val_t stem = noun; - if (pi_str_ends(noun, EL_STR("ā"))) { - stem = pi_drop(noun, 1); - } - if (str_eq(number, EL_STR("singular"))) { - return pi_decline_a_fem_sg(stem, gram_case); - } - return pi_decline_a_fem_pl(stem, gram_case); - } - return noun; - return 0; -} - -el_val_t pi_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return pi_decline(noun, gram_case, number); - return 0; -} - -el_val_t fro_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t fro_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t fro_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t fro_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("estre"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("avoir"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("aler"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("venir"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("faire"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("faire"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("dire"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("veoir"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("vouloir"); - } - if (str_eq(verb, EL_STR("can"))) { - return EL_STR("pooir"); - } - return verb; - return 0; -} - -el_val_t fro_estre_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("sui"); - } - if (slot == 1) { - return EL_STR("es"); - } - if (slot == 2) { - return EL_STR("est"); - } - if (slot == 3) { - return EL_STR("somes"); - } - if (slot == 4) { - return EL_STR("estes"); - } - return EL_STR("sont"); - return 0; -} - -el_val_t fro_estre_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("fui"); - } - if (slot == 1) { - return EL_STR("fus"); - } - if (slot == 2) { - return EL_STR("fu"); - } - if (slot == 3) { - return EL_STR("fumes"); - } - if (slot == 4) { - return EL_STR("fustes"); - } - return EL_STR("furent"); - return 0; -} - -el_val_t fro_estre_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("esterai"); - } - if (slot == 1) { - return EL_STR("esteras"); - } - if (slot == 2) { - return EL_STR("estera"); - } - if (slot == 3) { - return EL_STR("esterons"); - } - if (slot == 4) { - return EL_STR("esterez"); - } - return EL_STR("esteront"); - return 0; -} - -el_val_t fro_avoir_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ai"); - } - if (slot == 1) { - return EL_STR("as"); - } - if (slot == 2) { - return EL_STR("a"); - } - if (slot == 3) { - return EL_STR("avons"); - } - if (slot == 4) { - return EL_STR("avez"); - } - return EL_STR("ont"); - return 0; -} - -el_val_t fro_avoir_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("oi"); - } - if (slot == 1) { - return EL_STR("os"); - } - if (slot == 2) { - return EL_STR("ot"); - } - if (slot == 3) { - return EL_STR("eumes"); - } - if (slot == 4) { - return EL_STR("eustes"); - } - return EL_STR("orent"); - return 0; -} - -el_val_t fro_avoir_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("avrai"); - } - if (slot == 1) { - return EL_STR("avras"); - } - if (slot == 2) { - return EL_STR("avra"); - } - if (slot == 3) { - return EL_STR("avrons"); - } - if (slot == 4) { - return EL_STR("avrez"); - } - return EL_STR("avront"); - return 0; -} - -el_val_t fro_aler_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("vois"); - } - if (slot == 1) { - return EL_STR("vas"); - } - if (slot == 2) { - return EL_STR("va"); - } - if (slot == 3) { - return EL_STR("alons"); - } - if (slot == 4) { - return EL_STR("alez"); - } - return EL_STR("vont"); - return 0; -} - -el_val_t fro_aler_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("alai"); - } - if (slot == 1) { - return EL_STR("alas"); - } - if (slot == 2) { - return EL_STR("ala"); - } - if (slot == 3) { - return EL_STR("alames"); - } - if (slot == 4) { - return EL_STR("alastes"); - } - return EL_STR("alerent"); - return 0; -} - -el_val_t fro_aler_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("irai"); - } - if (slot == 1) { - return EL_STR("iras"); - } - if (slot == 2) { - return EL_STR("ira"); - } - if (slot == 3) { - return EL_STR("irons"); - } - if (slot == 4) { - return EL_STR("irez"); - } - return EL_STR("iront"); - return 0; -} - -el_val_t fro_venir_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("vieng"); - } - if (slot == 1) { - return EL_STR("viens"); - } - if (slot == 2) { - return EL_STR("vient"); - } - if (slot == 3) { - return EL_STR("venons"); - } - if (slot == 4) { - return EL_STR("venez"); - } - return EL_STR("vienent"); - return 0; -} - -el_val_t fro_venir_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("ving"); - } - if (slot == 1) { - return EL_STR("vins"); - } - if (slot == 2) { - return EL_STR("vint"); - } - if (slot == 3) { - return EL_STR("vinsmes"); - } - if (slot == 4) { - return EL_STR("vinstes"); - } - return EL_STR("vindrent"); - return 0; -} - -el_val_t fro_venir_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("venrai"); - } - if (slot == 1) { - return EL_STR("venras"); - } - if (slot == 2) { - return EL_STR("venra"); - } - if (slot == 3) { - return EL_STR("venrons"); - } - if (slot == 4) { - return EL_STR("venrez"); - } - return EL_STR("venront"); - return 0; -} - -el_val_t fro_faire_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("faz"); - } - if (slot == 1) { - return EL_STR("fais"); - } - if (slot == 2) { - return EL_STR("fait"); - } - if (slot == 3) { - return EL_STR("faisons"); - } - if (slot == 4) { - return EL_STR("faites"); - } - return EL_STR("font"); - return 0; -} - -el_val_t fro_faire_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("fis"); - } - if (slot == 1) { - return EL_STR("fis"); - } - if (slot == 2) { - return EL_STR("fist"); - } - if (slot == 3) { - return EL_STR("fimes"); - } - if (slot == 4) { - return EL_STR("fistes"); - } - return EL_STR("firent"); - return 0; -} - -el_val_t fro_faire_future(el_val_t slot) { - if (slot == 0) { - return EL_STR("ferai"); - } - if (slot == 1) { - return EL_STR("feras"); - } - if (slot == 2) { - return EL_STR("fera"); - } - if (slot == 3) { - return EL_STR("ferons"); - } - if (slot == 4) { - return EL_STR("ferez"); - } - return EL_STR("feront"); - return 0; -} - -el_val_t fro_verb_class(el_val_t verb) { - if (fro_str_ends(verb, EL_STR("er"))) { - return EL_STR("1"); - } - if (fro_str_ends(verb, EL_STR("ir"))) { - return EL_STR("2"); - } - if (fro_str_ends(verb, EL_STR("re"))) { - return EL_STR("3"); - } - return EL_STR("1"); - return 0; -} - -el_val_t fro_verb_stem(el_val_t verb, el_val_t vclass) { - return fro_drop(verb, 2); - return 0; -} - -el_val_t fro_conj1_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("es")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("e")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ez")); - } - return el_str_concat(stem, EL_STR("ent")); - return 0; -} - -el_val_t fro_conj1_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("ai")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("as")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("a")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ames")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("astes")); - } - return el_str_concat(stem, EL_STR("erent")); - return 0; -} - -el_val_t fro_conj1_future(el_val_t verb, el_val_t slot) { - el_val_t base = fro_drop(verb, 1); - if (slot == 0) { - return el_str_concat(base, EL_STR("rai")); - } - if (slot == 1) { - return el_str_concat(base, EL_STR("ras")); - } - if (slot == 2) { - return el_str_concat(base, EL_STR("ra")); - } - if (slot == 3) { - return el_str_concat(base, EL_STR("rons")); - } - if (slot == 4) { - return el_str_concat(base, EL_STR("rez")); - } - return el_str_concat(base, EL_STR("ront")); - return 0; -} - -el_val_t fro_conj2_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("it")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("issons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("issiez")); - } - return el_str_concat(stem, EL_STR("issent")); - return 0; -} - -el_val_t fro_conj2_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("it")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("imes")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("istes")); - } - return el_str_concat(stem, EL_STR("irent")); - return 0; -} - -el_val_t fro_conj2_future(el_val_t verb, el_val_t slot) { - el_val_t base = fro_drop(verb, 1); - if (slot == 0) { - return el_str_concat(base, EL_STR("rai")); - } - if (slot == 1) { - return el_str_concat(base, EL_STR("ras")); - } - if (slot == 2) { - return el_str_concat(base, EL_STR("ra")); - } - if (slot == 3) { - return el_str_concat(base, EL_STR("rons")); - } - if (slot == 4) { - return el_str_concat(base, EL_STR("rez")); - } - return el_str_concat(base, EL_STR("ront")); - return 0; -} - -el_val_t fro_conj3_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return stem; - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("s")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("t")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("ons")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ez")); - } - return el_str_concat(stem, EL_STR("ent")); - return 0; -} - -el_val_t fro_conj3_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("is")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("it")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("imes")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("istes")); - } - return el_str_concat(stem, EL_STR("irent")); - return 0; -} - -el_val_t fro_conj3_future(el_val_t verb, el_val_t slot) { - el_val_t base = fro_drop(verb, 2); - if (slot == 0) { - return el_str_concat(base, EL_STR("rai")); - } - if (slot == 1) { - return el_str_concat(base, EL_STR("ras")); - } - if (slot == 2) { - return el_str_concat(base, EL_STR("ra")); - } - if (slot == 3) { - return el_str_concat(base, EL_STR("rons")); - } - if (slot == 4) { - return el_str_concat(base, EL_STR("rez")); - } - return el_str_concat(base, EL_STR("ront")); - return 0; -} - -el_val_t fro_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = fro_map_canonical(verb); - el_val_t slot = fro_slot(person, number); - if (str_eq(v, EL_STR("estre"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_estre_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_estre_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_estre_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("avoir"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_avoir_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_avoir_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_avoir_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("aler"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_aler_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_aler_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_aler_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("venir"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_venir_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_venir_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_venir_future(slot); - } - return v; - } - if (str_eq(v, EL_STR("faire"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_faire_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_faire_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_faire_future(slot); - } - return v; - } - el_val_t vclass = fro_verb_class(v); - el_val_t stem = fro_verb_stem(v, vclass); - if (str_eq(vclass, EL_STR("1"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_conj1_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_conj1_past(stem, slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_conj1_future(v, slot); - } - return v; - } - if (str_eq(vclass, EL_STR("2"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_conj2_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_conj2_past(stem, slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_conj2_future(v, slot); - } - return v; - } - if (str_eq(vclass, EL_STR("3"))) { - if (str_eq(tense, EL_STR("present"))) { - return fro_conj3_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return fro_conj3_past(stem, slot); - } - if (str_eq(tense, EL_STR("future"))) { - return fro_conj3_future(v, slot); - } - return v; - } - return v; - return 0; -} - -el_val_t fro_gender(el_val_t noun) { - if (fro_str_ends(noun, EL_STR("e"))) { - return EL_STR("fem"); - } - return EL_STR("masc"); - return 0; -} - -el_val_t fro_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("s")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - return el_str_concat(noun, EL_STR("s")); - return 0; -} - -el_val_t fro_decline_fem(el_val_t noun, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - return noun; - } - return el_str_concat(noun, EL_STR("s")); - return 0; -} - -el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t gender = fro_gender(noun); - if (str_eq(gender, EL_STR("masc"))) { - return fro_decline_masc(noun, gram_case, number); - } - return fro_decline_fem(noun, number); - return 0; -} - -el_val_t fro_article(el_val_t gender, el_val_t gram_case, el_val_t number) { - if (str_eq(gender, EL_STR("masc"))) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("les"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("li"); - } - return EL_STR("le"); - } - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("les"); - } - return EL_STR("la"); - return 0; -} - -el_val_t fro_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t gender = fro_gender(noun); - el_val_t declined = fro_decline(noun, gram_case, number); - if (str_eq(definite, EL_STR("true"))) { - el_val_t art = fro_article(gender, gram_case, number); - return el_str_concat(el_str_concat(art, EL_STR(" ")), declined); - } - return declined; - return 0; -} - -el_val_t goh_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t goh_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t goh_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t goh_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("wesan"); - } - if (str_eq(verb, EL_STR("have"))) { - return EL_STR("haben"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("gan"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("sehan"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("quethan"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("tuon"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("tuon"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("queman"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("geban"); - } - if (str_eq(verb, EL_STR("know"))) { - return EL_STR("wizzan"); - } - if (str_eq(verb, EL_STR("want"))) { - return EL_STR("wellan"); - } - return verb; - return 0; -} - -el_val_t goh_wesan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("bim"); - } - if (slot == 1) { - return EL_STR("bist"); - } - if (slot == 2) { - return EL_STR("ist"); - } - if (slot == 3) { - return EL_STR("birum"); - } - if (slot == 4) { - return EL_STR("birut"); - } - return EL_STR("sint"); - return 0; -} - -el_val_t goh_wesan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("was"); - } - if (slot == 1) { - return EL_STR("wari"); - } - if (slot == 2) { - return EL_STR("was"); - } - if (slot == 3) { - return EL_STR("warum"); - } - if (slot == 4) { - return EL_STR("warut"); - } - return EL_STR("warun"); - return 0; -} - -el_val_t goh_haben_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("habem"); - } - if (slot == 1) { - return EL_STR("habest"); - } - if (slot == 2) { - return EL_STR("habet"); - } - if (slot == 3) { - return EL_STR("habemes"); - } - if (slot == 4) { - return EL_STR("habet"); - } - return EL_STR("habent"); - return 0; -} - -el_val_t goh_haben_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("habeta"); - } - if (slot == 1) { - return EL_STR("habetos"); - } - if (slot == 2) { - return EL_STR("habeta"); - } - if (slot == 3) { - return EL_STR("habetom"); - } - if (slot == 4) { - return EL_STR("habetot"); - } - return EL_STR("habeton"); - return 0; -} - -el_val_t goh_gan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gan"); - } - if (slot == 1) { - return EL_STR("gest"); - } - if (slot == 2) { - return EL_STR("get"); - } - if (slot == 3) { - return EL_STR("games"); - } - if (slot == 4) { - return EL_STR("gat"); - } - return EL_STR("gant"); - return 0; -} - -el_val_t goh_gan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("giang"); - } - if (slot == 1) { - return EL_STR("giangi"); - } - if (slot == 2) { - return EL_STR("giang"); - } - if (slot == 3) { - return EL_STR("giangum"); - } - if (slot == 4) { - return EL_STR("giangun"); - } - return EL_STR("giangun"); - return 0; -} - -el_val_t goh_sehan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("sihu"); - } - if (slot == 1) { - return EL_STR("sihist"); - } - if (slot == 2) { - return EL_STR("sihit"); - } - if (slot == 3) { - return EL_STR("sehemes"); - } - if (slot == 4) { - return EL_STR("sehet"); - } - return EL_STR("sehent"); - return 0; -} - -el_val_t goh_sehan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("sah"); - } - if (slot == 1) { - return EL_STR("sahi"); - } - if (slot == 2) { - return EL_STR("sah"); - } - if (slot == 3) { - return EL_STR("sahum"); - } - if (slot == 4) { - return EL_STR("sahut"); - } - return EL_STR("sahun"); - return 0; -} - -el_val_t goh_quethan_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("quidu"); - } - if (slot == 1) { - return EL_STR("quidist"); - } - if (slot == 2) { - return EL_STR("quidit"); - } - if (slot == 3) { - return EL_STR("quethumes"); - } - if (slot == 4) { - return EL_STR("quethet"); - } - return EL_STR("quethent"); - return 0; -} - -el_val_t goh_quethan_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("quad"); - } - if (slot == 1) { - return EL_STR("quadi"); - } - if (slot == 2) { - return EL_STR("quad"); - } - if (slot == 3) { - return EL_STR("quadum"); - } - if (slot == 4) { - return EL_STR("quadut"); - } - return EL_STR("quadun"); - return 0; -} - -el_val_t goh_tuon_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("tuom"); - } - if (slot == 1) { - return EL_STR("tuost"); - } - if (slot == 2) { - return EL_STR("tuot"); - } - if (slot == 3) { - return EL_STR("tuomes"); - } - if (slot == 4) { - return EL_STR("tuot"); - } - return EL_STR("tuont"); - return 0; -} - -el_val_t goh_tuon_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("teta"); - } - if (slot == 1) { - return EL_STR("tetos"); - } - if (slot == 2) { - return EL_STR("teta"); - } - if (slot == 3) { - return EL_STR("tetom"); - } - if (slot == 4) { - return EL_STR("tetot"); - } - return EL_STR("teton"); - return 0; -} - -el_val_t goh_weak_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("u")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("ist")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("it")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("emes")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("et")); - } - return el_str_concat(stem, EL_STR("ent")); - return 0; -} - -el_val_t goh_weak_past(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("ta")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("tos")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("ta")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("tom")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("tot")); - } - return el_str_concat(stem, EL_STR("ton")); - return 0; -} - -el_val_t goh_verb_stem(el_val_t verb) { - return goh_drop(verb, 2); - return 0; -} - -el_val_t goh_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = goh_map_canonical(verb); - el_val_t slot = goh_slot(person, number); - if (str_eq(v, EL_STR("wesan"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_wesan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_wesan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("haben"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_haben_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_haben_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("haben"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_haben_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_haben_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("gan"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_gan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_gan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("sehan"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_sehan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_sehan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("quethan"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_quethan_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_quethan_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("tuon"))) { - if (str_eq(tense, EL_STR("present"))) { - return goh_tuon_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_tuon_past(slot); - } - return v; - } - el_val_t stem = goh_verb_stem(v); - if (str_eq(tense, EL_STR("present"))) { - return goh_weak_present(stem, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return goh_weak_past(stem, slot); - } - return v; - return 0; -} - -el_val_t goh_stem_type(el_val_t noun) { - if (goh_str_ends(noun, EL_STR("o"))) { - return EL_STR("masc_n"); - } - if (goh_str_ends(noun, EL_STR("a"))) { - return EL_STR("fem_o"); - } - if (goh_str_ends(noun, EL_STR("t"))) { - return EL_STR("neut_a"); - } - if (goh_str_ends(noun, EL_STR("d"))) { - return EL_STR("neut_a"); - } - if (goh_str_ends(noun, EL_STR("nd"))) { - return EL_STR("neut_a"); - } - return EL_STR("masc_a"); - return 0; -} - -el_val_t goh_extract_stem(el_val_t noun, el_val_t stype) { - if (str_eq(stype, EL_STR("fem_o"))) { - return goh_drop(noun, 1); - } - if (str_eq(stype, EL_STR("masc_n"))) { - return goh_drop(noun, 1); - } - return noun; - return 0; -} - -el_val_t goh_decline_masc_a_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("e")); - } - return stem; - return 0; -} - -el_val_t goh_decline_masc_a_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("um")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t goh_decline_fem_o_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("u")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t goh_decline_fem_o_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ono")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("om")); - } - return el_str_concat(stem, EL_STR("a")); - return 0; -} - -el_val_t goh_decline_neut_a_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("es")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("e")); - } - return stem; - return 0; -} - -el_val_t goh_decline_neut_a_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return stem; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("um")); - } - return stem; - return 0; -} - -el_val_t goh_decline_masc_n_sg(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("o")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("on")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("on")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("on")); - } - return el_str_concat(stem, EL_STR("o")); - return 0; -} - -el_val_t goh_decline_masc_n_pl(el_val_t stem, el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(stem, EL_STR("on")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(stem, EL_STR("on")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(stem, EL_STR("ono")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(stem, EL_STR("om")); - } - return el_str_concat(stem, EL_STR("on")); - return 0; -} - -el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t stype = goh_stem_type(noun); - el_val_t stem = goh_extract_stem(noun, stype); - if (str_eq(stype, EL_STR("masc_a"))) { - if (str_eq(number, EL_STR("singular"))) { - return goh_decline_masc_a_sg(stem, gram_case); - } - return goh_decline_masc_a_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("fem_o"))) { - if (str_eq(number, EL_STR("singular"))) { - return goh_decline_fem_o_sg(stem, gram_case); - } - return goh_decline_fem_o_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("neut_a"))) { - if (str_eq(number, EL_STR("singular"))) { - return goh_decline_neut_a_sg(stem, gram_case); - } - return goh_decline_neut_a_pl(stem, gram_case); - } - if (str_eq(stype, EL_STR("masc_n"))) { - if (str_eq(number, EL_STR("singular"))) { - return goh_decline_masc_n_sg(stem, gram_case); - } - return goh_decline_masc_n_pl(stem, gram_case); - } - return noun; - return 0; -} - -el_val_t goh_demo_article(el_val_t stype, el_val_t number) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("die"); - } - if (str_eq(stype, EL_STR("fem_o"))) { - return EL_STR("diu"); - } - if (str_eq(stype, EL_STR("neut_a"))) { - return EL_STR("daz"); - } - return EL_STR("der"); - return 0; -} - -el_val_t goh_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t stype = goh_stem_type(noun); - el_val_t declined = goh_decline(noun, gram_case, number); - if (str_eq(definite, EL_STR("true"))) { - el_val_t art = goh_demo_article(stype, number); - return el_str_concat(el_str_concat(art, EL_STR(" ")), declined); - } - return declined; - return 0; -} - -el_val_t sga_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t sga_first(el_val_t s) { - if (str_len(s) == 0) { - return EL_STR(""); - } - return str_slice(s, 0, 1); - return 0; -} - -el_val_t sga_rest(el_val_t s) { - el_val_t n = str_len(s); - if (n <= 1) { - return EL_STR(""); - } - return str_slice(s, 1, n); - return 0; -} - -el_val_t sga_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t sga_lenite(el_val_t word) { - el_val_t init = sga_first(word); - el_val_t tail = sga_rest(word); - if (str_eq(init, EL_STR("b"))) { - return el_str_concat(EL_STR("bh"), tail); - } - if (str_eq(init, EL_STR("c"))) { - return el_str_concat(EL_STR("ch"), tail); - } - if (str_eq(init, EL_STR("d"))) { - return el_str_concat(EL_STR("dh"), tail); - } - if (str_eq(init, EL_STR("f"))) { - return el_str_concat(EL_STR("fh"), tail); - } - if (str_eq(init, EL_STR("g"))) { - return el_str_concat(EL_STR("gh"), tail); - } - if (str_eq(init, EL_STR("m"))) { - return el_str_concat(EL_STR("mh"), tail); - } - if (str_eq(init, EL_STR("p"))) { - return el_str_concat(EL_STR("ph"), tail); - } - if (str_eq(init, EL_STR("s"))) { - return el_str_concat(EL_STR("sh"), tail); - } - if (str_eq(init, EL_STR("t"))) { - return el_str_concat(EL_STR("th"), tail); - } - return word; - return 0; -} - -el_val_t sga_copula_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("at"); - } - if (slot == 2) { - return EL_STR("is"); - } - if (slot == 3) { - return EL_STR("am"); - } - if (slot == 4) { - return EL_STR("adib"); - } - return EL_STR("it"); - return 0; -} - -el_val_t sga_bith_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("at"); - } - if (slot == 2) { - return EL_STR("is"); - } - if (slot == 3) { - return EL_STR("am"); - } - if (slot == 4) { - return EL_STR("adib"); - } - return EL_STR("at"); - return 0; -} - -el_val_t sga_bith_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("ba"); - } - if (slot == 1) { - return EL_STR("ba"); - } - if (slot == 2) { - return EL_STR("ba"); - } - if (slot == 3) { - return EL_STR("bámmar"); - } - if (slot == 4) { - return EL_STR("bádaid"); - } - return EL_STR("batar"); - return 0; -} - -el_val_t sga_teit_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("tíagu"); - } - if (slot == 1) { - return EL_STR("téit"); - } - if (slot == 2) { - return EL_STR("téit"); - } - if (slot == 3) { - return EL_STR("tíagmai"); - } - if (slot == 4) { - return EL_STR("tíagid"); - } - return EL_STR("tíagat"); - return 0; -} - -el_val_t sga_teit_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("lod"); - } - if (slot == 1) { - return EL_STR("lod"); - } - if (slot == 2) { - return EL_STR("luid"); - } - if (slot == 3) { - return EL_STR("lodmar"); - } - if (slot == 4) { - return EL_STR("lodaid"); - } - return EL_STR("lotar"); - return 0; -} - -el_val_t sga_gaibid_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("gaibim"); - } - if (slot == 1) { - return EL_STR("gaibi"); - } - if (slot == 2) { - return EL_STR("gaibid"); - } - if (slot == 3) { - return EL_STR("gaibmi"); - } - if (slot == 4) { - return EL_STR("gaibthe"); - } - return EL_STR("gaibid"); - return 0; -} - -el_val_t sga_adci_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ad·ciu"); - } - if (slot == 1) { - return EL_STR("ad·cí"); - } - if (slot == 2) { - return EL_STR("ad·cí"); - } - if (slot == 3) { - return EL_STR("ad·cími"); - } - if (slot == 4) { - return EL_STR("ad·cíthe"); - } - return EL_STR("ad·ciat"); - return 0; -} - -el_val_t sga_asbeir_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("as·biur"); - } - if (slot == 1) { - return EL_STR("as·beir"); - } - if (slot == 2) { - return EL_STR("as·beir"); - } - if (slot == 3) { - return EL_STR("as·beram"); - } - if (slot == 4) { - return EL_STR("as·berid"); - } - return EL_STR("as·berat"); - return 0; -} - -el_val_t sga_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("is"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("téit"); - } - if (str_eq(verb, EL_STR("take"))) { - return EL_STR("gaibid"); - } - if (str_eq(verb, EL_STR("hold"))) { - return EL_STR("gaibid"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("ad·cí"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("as·beir"); - } - return verb; - return 0; -} - -el_val_t sga_ai_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("aim")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("ai")); - } - if (slot == 2) { - return el_str_concat(stem, EL_STR("aid")); - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("am")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("aid")); - } - return el_str_concat(stem, EL_STR("at")); - return 0; -} - -el_val_t sga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = sga_map_canonical(verb); - el_val_t slot = sga_slot(person, number); - if (str_eq(v, EL_STR("is"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_copula_present(slot); - } - return EL_STR("ba"); - } - if (str_eq(v, EL_STR("bith"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_bith_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sga_bith_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("téit"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_teit_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sga_teit_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("gaibid"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_gaibid_present(slot); - } - return EL_STR("gab"); - } - if (str_eq(v, EL_STR("ad·cí"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_adci_present(slot); - } - return v; - } - if (str_eq(v, EL_STR("as·beir"))) { - if (str_eq(tense, EL_STR("present"))) { - return sga_asbeir_present(slot); - } - return v; - } - if (str_ends_with(v, EL_STR("id"))) { - el_val_t stem = sga_drop(v, 2); - if (str_eq(tense, EL_STR("present"))) { - return sga_ai_present(stem, slot); - } - return v; - } - return v; - return 0; -} - -el_val_t sga_decline_ostem(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("fer"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("fer"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("fhir"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("fer"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("fir"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("fiur"); - } - return EL_STR("fer"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("fir"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("firu"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("firu"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("fer"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("feraib"); - } - return EL_STR("fir"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return sga_lenite(noun); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("u")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(noun, EL_STR("u")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("u")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("aib")); - } - return el_str_concat(noun, EL_STR("i")); - return 0; -} - -el_val_t sga_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("ben"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("ben"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("ben"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("bein"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("mná"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("mnáib"); - } - return EL_STR("ben"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("mná"); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return EL_STR("mná"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("mná"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("ban"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("mnáib"); - } - return EL_STR("mná"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("aib")); - } - return noun; - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("vocative"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return noun; - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("aib")); - } - return el_str_concat(noun, EL_STR("a")); - return 0; -} - -el_val_t sga_detect_gender(el_val_t noun) { - if (str_eq(noun, EL_STR("ben"))) { - return EL_STR("feminine"); - } - if (str_eq(noun, EL_STR("mná"))) { - return EL_STR("feminine"); - } - return EL_STR("masculine"); - return 0; -} - -el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t gender = sga_detect_gender(noun); - if (str_eq(gender, EL_STR("masculine"))) { - return sga_decline_ostem(noun, gram_case, number); - } - if (str_eq(gender, EL_STR("feminine"))) { - return sga_decline_astem(noun, gram_case, number); - } - return noun; - return 0; -} - -el_val_t sga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t base = sga_decline(noun, gram_case, number); - if (!str_eq(definite, EL_STR("true"))) { - return base; - } - return el_str_concat(EL_STR("in "), base); - return 0; -} - -el_val_t txb_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t txb_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t txb_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t txb_pres1_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR("au"); - } - if (slot == 1) { - return EL_STR("ät"); - } - if (slot == 2) { - return EL_STR("em"); - } - if (slot == 3) { - return EL_STR("emane"); - } - if (slot == 4) { - return EL_STR("em"); - } - return EL_STR("em"); - return 0; -} - -el_val_t txb_kam_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("kam"); - } - if (slot == 1) { - return EL_STR("käm"); - } - if (slot == 2) { - return EL_STR("käm"); - } - if (slot == 3) { - return EL_STR("kamnäṃ"); - } - if (slot == 4) { - return EL_STR("kamnäṃ"); - } - return EL_STR("kamnäṃ"); - return 0; -} - -el_val_t txb_ya_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("yau"); - } - if (slot == 1) { - return EL_STR("yät"); - } - if (slot == 2) { - return EL_STR("yäm"); - } - if (slot == 3) { - return EL_STR("ymäṃ"); - } - if (slot == 4) { - return EL_STR("ymäṃ"); - } - return EL_STR("yänmäṃ"); - return 0; -} - -el_val_t txb_wes_present(el_val_t slot) { - if (slot == 2) { - return EL_STR("ste"); - } - return EL_STR("wes"); - return 0; -} - -el_val_t txb_lyut_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("lyutau"); - } - if (slot == 1) { - return EL_STR("lyutät"); - } - if (slot == 2) { - return EL_STR("lyutem"); - } - if (slot == 3) { - return EL_STR("lyutemane"); - } - if (slot == 4) { - return EL_STR("lyutem"); - } - return EL_STR("lyutem"); - return 0; -} - -el_val_t txb_wak_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("wakau"); - } - if (slot == 1) { - return EL_STR("wakät"); - } - if (slot == 2) { - return EL_STR("wakem"); - } - if (slot == 3) { - return EL_STR("wakemane"); - } - if (slot == 4) { - return EL_STR("wakem"); - } - return EL_STR("wakem"); - return 0; -} - -el_val_t txb_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("wes"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("käm"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("yä"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("lyut"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("wak"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("wak"); - } - return verb; - return 0; -} - -el_val_t txb_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = txb_map_canonical(verb); - el_val_t slot = txb_slot(person, number); - if (str_eq(v, EL_STR("wes"))) { - if (str_eq(tense, EL_STR("present"))) { - return txb_wes_present(slot); - } - return v; - } - if (str_eq(v, EL_STR("käm"))) { - if (str_eq(tense, EL_STR("present"))) { - return txb_kam_present(slot); - } - return v; - } - if (str_eq(v, EL_STR("yä"))) { - if (str_eq(tense, EL_STR("present"))) { - return txb_ya_present(slot); - } - return v; - } - if (str_eq(v, EL_STR("lyut"))) { - if (str_eq(tense, EL_STR("present"))) { - return txb_lyut_present(slot); - } - return v; - } - if (str_eq(v, EL_STR("wak"))) { - if (str_eq(tense, EL_STR("present"))) { - return txb_wak_present(slot); - } - return v; - } - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(v, txb_pres1_suffix(slot)); - } - return v; - return 0; -} - -el_val_t txb_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("entse")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("ene")); - } - return el_str_concat(noun, EL_STR("e")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("i")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("entwetse")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("ene")); - } - return el_str_concat(noun, EL_STR("i")); - return 0; -} - -el_val_t txb_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("antse")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("ane")); - } - return el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("ä")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("ä")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("antse")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("ane")); - } - return el_str_concat(noun, EL_STR("ä")); - return 0; -} - -el_val_t txb_detect_gender(el_val_t noun) { - return EL_STR("masculine"); - return 0; -} - -el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t gender = txb_detect_gender(noun); - if (str_eq(gender, EL_STR("feminine"))) { - return txb_decline_fem(noun, gram_case, number); - } - return txb_decline_masc(noun, gram_case, number); - return 0; -} - -el_val_t txb_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return txb_decline(noun, gram_case, number); - return 0; -} - -el_val_t peo_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t peo_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t peo_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t peo_present_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR("āmiy"); - } - if (slot == 1) { - return EL_STR("ahiy"); - } - if (slot == 2) { - return EL_STR("atiy"); - } - if (slot == 3) { - return EL_STR("āmahy"); - } - if (slot == 4) { - return EL_STR("ātā"); - } - return EL_STR("antiy"); - return 0; -} - -el_val_t peo_past_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR("am"); - } - if (slot == 1) { - return EL_STR("ā"); - } - if (slot == 2) { - return EL_STR("a"); - } - if (slot == 3) { - return EL_STR("āmā"); - } - if (slot == 4) { - return EL_STR("ātā"); - } - return EL_STR("ā"); - return 0; -} - -el_val_t peo_ah_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("amiy"); - } - if (slot == 1) { - return EL_STR("ahiy"); - } - if (slot == 2) { - return EL_STR("astiy"); - } - if (slot == 3) { - return EL_STR("amahy"); - } - if (slot == 4) { - return EL_STR("astā"); - } - return EL_STR("hatiy"); - return 0; -} - -el_val_t peo_ah_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("āham"); - } - if (slot == 1) { - return EL_STR("āha"); - } - if (slot == 2) { - return EL_STR("āha"); - } - if (slot == 3) { - return EL_STR("āhama"); - } - if (slot == 4) { - return EL_STR("āhata"); - } - return EL_STR("āhan"); - return 0; -} - -el_val_t peo_kar_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("kunāmiy"); - } - if (slot == 1) { - return EL_STR("kunāhiy"); - } - if (slot == 2) { - return EL_STR("kunautiy"); - } - if (slot == 3) { - return EL_STR("kunāmahy"); - } - if (slot == 4) { - return EL_STR("kunātā"); - } - return EL_STR("kunavantiy"); - return 0; -} - -el_val_t peo_kar_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("akunavam"); - } - if (slot == 1) { - return EL_STR("akunavā"); - } - if (slot == 2) { - return EL_STR("akunava"); - } - if (slot == 3) { - return EL_STR("akunavāmā"); - } - if (slot == 4) { - return EL_STR("akunavātā"); - } - return EL_STR("akunavan"); - return 0; -} - -el_val_t peo_xsaya_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("xšāyāmiy"); - } - if (slot == 1) { - return EL_STR("xšāyāhiy"); - } - if (slot == 2) { - return EL_STR("xšāyatiy"); - } - if (slot == 3) { - return EL_STR("xšāyāmahy"); - } - if (slot == 4) { - return EL_STR("xšāyātā"); - } - return EL_STR("xšāyantiy"); - return 0; -} - -el_val_t peo_tar_present(el_val_t slot) { - if (slot == 2) { - return EL_STR("taratiy"); - } - if (slot == 5) { - return EL_STR("tarantiy"); - } - return el_str_concat(EL_STR("tar"), peo_present_suffix(slot)); - return 0; -} - -el_val_t peo_da_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("dāmiy"); - } - if (slot == 1) { - return EL_STR("dāhiy"); - } - if (slot == 2) { - return EL_STR("dātiy"); - } - if (slot == 3) { - return EL_STR("dāmahy"); - } - if (slot == 4) { - return EL_STR("dātā"); - } - return EL_STR("dantiy"); - return 0; -} - -el_val_t peo_da_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("adām"); - } - if (slot == 1) { - return EL_STR("adāā"); - } - if (slot == 2) { - return EL_STR("adā"); - } - if (slot == 3) { - return EL_STR("adāmā"); - } - if (slot == 4) { - return EL_STR("adātā"); - } - return EL_STR("adān"); - return 0; -} - -el_val_t peo_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("ah"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("kar"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("kar"); - } - if (str_eq(verb, EL_STR("rule"))) { - return EL_STR("xšāya"); - } - if (str_eq(verb, EL_STR("cross"))) { - return EL_STR("tar"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("dā"); - } - return verb; - return 0; -} - -el_val_t peo_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = peo_map_canonical(verb); - el_val_t slot = peo_slot(person, number); - if (str_eq(v, EL_STR("ah"))) { - if (str_eq(tense, EL_STR("present"))) { - return peo_ah_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return peo_ah_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("kar"))) { - if (str_eq(tense, EL_STR("present"))) { - return peo_kar_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return peo_kar_past(slot); - } - return v; - } - if (str_eq(v, EL_STR("xšāya"))) { - if (str_eq(tense, EL_STR("present"))) { - return peo_xsaya_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(EL_STR("xšāya"), peo_past_suffix(slot)); - } - return v; - } - if (str_eq(v, EL_STR("tar"))) { - if (str_eq(tense, EL_STR("present"))) { - return peo_tar_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(EL_STR("tar"), peo_past_suffix(slot)); - } - return v; - } - if (str_eq(v, EL_STR("dā"))) { - if (str_eq(tense, EL_STR("present"))) { - return peo_da_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return peo_da_past(slot); - } - return v; - } - if (str_eq(tense, EL_STR("present"))) { - return el_str_concat(v, peo_present_suffix(slot)); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(v, peo_past_suffix(slot)); - } - return v; - return 0; -} - -el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(noun, EL_STR("dahyu"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("dahyāuš"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("dahyum"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("dahyāuš"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("dahyavā"); - } - return EL_STR("dahyāuš"); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return EL_STR("dahyāva"); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return EL_STR("dahyūn"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("dahyūnām"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("dahyubiyā"); - } - return EL_STR("dahyāva"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("āuš")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("am")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("āuš")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("avā")); - } - return el_str_concat(noun, EL_STR("āuš")); - } - if (str_eq(gram_case, EL_STR("nominative"))) { - return el_str_concat(noun, EL_STR("āva")); - } - if (str_eq(gram_case, EL_STR("accusative"))) { - return el_str_concat(noun, EL_STR("ūn")); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return el_str_concat(noun, EL_STR("ūnām")); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return el_str_concat(noun, EL_STR("ubiyā")); - } - return el_str_concat(noun, EL_STR("āva")); - return 0; -} - -el_val_t peo_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - return peo_decline_astem(noun, gram_case, number); - return 0; -} - -el_val_t peo_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return peo_decline(noun, gram_case, number); - return 0; -} - -el_val_t akk_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t akk_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t akk_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t akk_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("plural"))) { - return 4; - } - return 0; - } - if (str_eq(person, EL_STR("second"))) { - return 1; - } - if (str_eq(number, EL_STR("plural"))) { - return 5; - } - return 2; - return 0; -} - -el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number) { - el_val_t base = akk_slot(person, number); - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 3; - } - } - } - return base; - return 0; -} - -el_val_t akk_copula_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("abašši"); - } - if (slot == 1) { - return EL_STR("tabašši"); - } - if (slot == 2) { - return EL_STR("ibašši"); - } - if (slot == 3) { - return EL_STR("ibašši"); - } - if (slot == 4) { - return EL_STR("nibašši"); - } - return EL_STR("ibaššū"); - return 0; -} - -el_val_t akk_copula_stative(el_val_t slot) { - if (slot == 0) { - return EL_STR("bašāku"); - } - if (slot == 1) { - return EL_STR("bašāta"); - } - if (slot == 2) { - return EL_STR("bašī"); - } - if (slot == 3) { - return EL_STR("bašiat"); - } - if (slot == 4) { - return EL_STR("bašānu"); - } - return EL_STR("bašū"); - return 0; -} - -el_val_t akk_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("bašû"))) { - return 1; - } - if (str_eq(verb, EL_STR("bashu"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("stative"))) { - return akk_copula_stative(slot); - } - return akk_copula_present(slot); - return 0; -} - -el_val_t akk_alaku_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("allak"); - } - if (slot == 1) { - return EL_STR("tallak"); - } - if (slot == 2) { - return EL_STR("illak"); - } - if (slot == 3) { - return EL_STR("tallak"); - } - if (slot == 4) { - return EL_STR("nillak"); - } - return EL_STR("illaku"); - return 0; -} - -el_val_t akk_alaku_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ittalak"); - } - if (slot == 1) { - return EL_STR("tattalak"); - } - if (slot == 2) { - return EL_STR("ittalak"); - } - if (slot == 3) { - return EL_STR("tattalak"); - } - if (slot == 4) { - return EL_STR("nittalak"); - } - return EL_STR("ittalku"); - return 0; -} - -el_val_t akk_amaru_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("ammar"); - } - if (slot == 1) { - return EL_STR("tammar"); - } - if (slot == 2) { - return EL_STR("immar"); - } - if (slot == 3) { - return EL_STR("tammar"); - } - if (slot == 4) { - return EL_STR("nimmar"); - } - return EL_STR("immaru"); - return 0; -} - -el_val_t akk_amaru_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("amtamar"); - } - if (slot == 1) { - return EL_STR("tamtamar"); - } - if (slot == 2) { - return EL_STR("imtamar"); - } - if (slot == 3) { - return EL_STR("tamtamar"); - } - if (slot == 4) { - return EL_STR("nimtamar"); - } - return EL_STR("imtamaru"); - return 0; -} - -el_val_t akk_amaru_stative(el_val_t slot) { - if (slot == 0) { - return EL_STR("amrāku"); - } - if (slot == 1) { - return EL_STR("amrāta"); - } - if (slot == 2) { - return EL_STR("amir"); - } - if (slot == 3) { - return EL_STR("amrat"); - } - if (slot == 4) { - return EL_STR("amrānu"); - } - return EL_STR("amrū"); - return 0; -} - -el_val_t akk_qabu_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("aqabbi"); - } - if (slot == 1) { - return EL_STR("taqabbi"); - } - if (slot == 2) { - return EL_STR("iqabbi"); - } - if (slot == 3) { - return EL_STR("taqabbi"); - } - if (slot == 4) { - return EL_STR("niqabbi"); - } - return EL_STR("iqabbû"); - return 0; -} - -el_val_t akk_qabu_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("aqtabi"); - } - if (slot == 1) { - return EL_STR("taqtabi"); - } - if (slot == 2) { - return EL_STR("iqtabi"); - } - if (slot == 3) { - return EL_STR("taqtabi"); - } - if (slot == 4) { - return EL_STR("niqtabi"); - } - return EL_STR("iqtabû"); - return 0; -} - -el_val_t akk_qabu_stative(el_val_t slot) { - if (slot == 0) { - return EL_STR("qabāku"); - } - if (slot == 1) { - return EL_STR("qabāta"); - } - if (slot == 2) { - return EL_STR("qabi"); - } - if (slot == 3) { - return EL_STR("qabiat"); - } - if (slot == 4) { - return EL_STR("qabānu"); - } - return EL_STR("qabû"); - return 0; -} - -el_val_t akk_epesu_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("eppuš"); - } - if (slot == 1) { - return EL_STR("teppuš"); - } - if (slot == 2) { - return EL_STR("ieppuš"); - } - if (slot == 3) { - return EL_STR("teppuš"); - } - if (slot == 4) { - return EL_STR("neppuš"); - } - return EL_STR("ieppušu"); - return 0; -} - -el_val_t akk_epesu_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("iptešu"); - } - if (slot == 1) { - return EL_STR("taptešu"); - } - if (slot == 2) { - return EL_STR("iptešu"); - } - if (slot == 3) { - return EL_STR("taptešu"); - } - if (slot == 4) { - return EL_STR("niptešu"); - } - return EL_STR("iptešū"); - return 0; -} - -el_val_t akk_epesu_stative(el_val_t slot) { - if (slot == 0) { - return EL_STR("epšāku"); - } - if (slot == 1) { - return EL_STR("epšāta"); - } - if (slot == 2) { - return EL_STR("epuš"); - } - if (slot == 3) { - return EL_STR("epšat"); - } - if (slot == 4) { - return EL_STR("epšānu"); - } - return EL_STR("epšū"); - return 0; -} - -el_val_t akk_regular_present(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(EL_STR("a"), stem); - } - if (slot == 1) { - return el_str_concat(EL_STR("ta"), stem); - } - if (slot == 2) { - return el_str_concat(EL_STR("i"), stem); - } - if (slot == 3) { - return el_str_concat(EL_STR("ta"), stem); - } - if (slot == 4) { - return el_str_concat(EL_STR("ni"), stem); - } - return el_str_concat(el_str_concat(EL_STR("i"), stem), EL_STR("u")); - return 0; -} - -el_val_t akk_regular_perfect(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(EL_STR("a"), stem); - } - if (slot == 1) { - return el_str_concat(EL_STR("ta"), stem); - } - if (slot == 2) { - return el_str_concat(EL_STR("i"), stem); - } - if (slot == 3) { - return el_str_concat(EL_STR("ta"), stem); - } - if (slot == 4) { - return el_str_concat(EL_STR("ni"), stem); - } - return el_str_concat(el_str_concat(EL_STR("i"), stem), EL_STR("u")); - return 0; -} - -el_val_t akk_regular_stative(el_val_t stem, el_val_t slot) { - if (slot == 0) { - return el_str_concat(stem, EL_STR("āku")); - } - if (slot == 1) { - return el_str_concat(stem, EL_STR("āta")); - } - if (slot == 2) { - return stem; - } - if (slot == 3) { - return el_str_concat(stem, EL_STR("at")); - } - if (slot == 4) { - return el_str_concat(stem, EL_STR("ānu")); - } - return el_str_concat(stem, EL_STR("ū")); - return 0; -} - -el_val_t akk_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("bašû"))) { - return akk_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("bashu"))) { - return akk_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("alāku"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_alaku_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_alaku_present(slot); - } - return akk_alaku_present(slot); - } - if (str_eq(verb, EL_STR("alaku"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_alaku_perfect(slot); - } - return akk_alaku_present(slot); - } - if (str_eq(verb, EL_STR("amāru"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_amaru_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_amaru_stative(slot); - } - return akk_amaru_present(slot); - } - if (str_eq(verb, EL_STR("amaru"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_amaru_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_amaru_stative(slot); - } - return akk_amaru_present(slot); - } - if (str_eq(verb, EL_STR("qabû"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_qabu_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_qabu_stative(slot); - } - return akk_qabu_present(slot); - } - if (str_eq(verb, EL_STR("qabu"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_qabu_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_qabu_stative(slot); - } - return akk_qabu_present(slot); - } - if (str_eq(verb, EL_STR("epēšu"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_epesu_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_epesu_stative(slot); - } - return akk_epesu_present(slot); - } - if (str_eq(verb, EL_STR("epesu"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return akk_epesu_perfect(slot); - } - if (str_eq(tense, EL_STR("stative"))) { - return akk_epesu_stative(slot); - } - return akk_epesu_present(slot); - } - return EL_STR(""); - return 0; -} - -el_val_t akk_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = akk_slot(person, number); - if (akk_is_copula(verb)) { - return akk_conjugate_copula(tense, slot); - } - el_val_t known = akk_known_verb(verb, tense, slot); - if (!str_eq(known, EL_STR(""))) { - return known; - } - return verb; - return 0; -} - -el_val_t akk_strip_nom(el_val_t noun) { - if (akk_str_ends(noun, EL_STR("um"))) { - return akk_str_drop_last(noun, 2); - } - if (akk_str_ends(noun, EL_STR("tum"))) { - return akk_str_drop_last(noun, 3); - } - return noun; - return 0; -} - -el_val_t akk_is_fem(el_val_t noun) { - if (akk_str_ends(noun, EL_STR("tum"))) { - return 1; - } - if (akk_str_ends(noun, EL_STR("tam"))) { - return 1; - } - if (akk_str_ends(noun, EL_STR("tim"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t akk_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t fem = akk_is_fem(noun); - el_val_t stem = akk_strip_nom(noun); - if (str_eq(number, EL_STR("singular"))) { - if (fem) { - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("tum")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("tam")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("tim")); - } - return el_str_concat(stem, EL_STR("tum")); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("um")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("am")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("im")); - } - return el_str_concat(stem, EL_STR("um")); - } - if (fem) { - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ātum")); - } - return el_str_concat(stem, EL_STR("ātim")); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ūtum")); - } - return el_str_concat(stem, EL_STR("ātim")); - return 0; -} - -el_val_t akk_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return akk_decline(noun, gram_case, number); - return 0; -} - -el_val_t akk_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("bašû"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("alāku"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("amāru"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("qabû"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("qabû"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("epēšu"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("epēšu"); - } - return verb; - return 0; -} - -el_val_t uga_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t uga_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t uga_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t uga_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("plural"))) { - return 4; - } - return 0; - } - if (str_eq(person, EL_STR("second"))) { - return 1; - } - if (str_eq(number, EL_STR("plural"))) { - return 5; - } - return 2; - return 0; -} - -el_val_t uga_slot_g(el_val_t person, el_val_t gender, el_val_t number) { - el_val_t base = uga_slot(person, number); - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 3; - } - } - } - return base; - return 0; -} - -el_val_t uga_kn_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("kāntu"); - } - if (slot == 1) { - return EL_STR("kānta"); - } - if (slot == 2) { - return EL_STR("kāna"); - } - if (slot == 3) { - return EL_STR("kānat"); - } - if (slot == 4) { - return EL_STR("kānnu"); - } - return EL_STR("kānu"); - return 0; -} - -el_val_t uga_kn_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ʼakūnu"); - } - if (slot == 1) { - return EL_STR("takūnu"); - } - if (slot == 2) { - return EL_STR("yakūnu"); - } - if (slot == 3) { - return EL_STR("takūnu"); - } - if (slot == 4) { - return EL_STR("nakūnu"); - } - return EL_STR("yakūnuna"); - return 0; -} - -el_val_t uga_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("kn"))) { - return 1; - } - if (str_eq(verb, EL_STR("kāna"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t uga_conjugate_copula(el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_kn_perfect(slot); - } - return uga_kn_imperfect(slot); - return 0; -} - -el_val_t uga_hlk_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("halaktu"); - } - if (slot == 1) { - return EL_STR("halakta"); - } - if (slot == 2) { - return EL_STR("halaka"); - } - if (slot == 3) { - return EL_STR("halakat"); - } - if (slot == 4) { - return EL_STR("halaknu"); - } - return EL_STR("halaku"); - return 0; -} - -el_val_t uga_hlk_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ʼahluku"); - } - if (slot == 1) { - return EL_STR("tahluku"); - } - if (slot == 2) { - return EL_STR("yahluku"); - } - if (slot == 3) { - return EL_STR("tahluku"); - } - if (slot == 4) { - return EL_STR("nahluku"); - } - return EL_STR("yahlukuna"); - return 0; -} - -el_val_t uga_ray_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("raʼaytu"); - } - if (slot == 1) { - return EL_STR("raʼayta"); - } - if (slot == 2) { - return EL_STR("raʼaya"); - } - if (slot == 3) { - return EL_STR("raʼayat"); - } - if (slot == 4) { - return EL_STR("raʼaynu"); - } - return EL_STR("raʼayu"); - return 0; -} - -el_val_t uga_ray_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ʼarʼā"); - } - if (slot == 1) { - return EL_STR("tarʼā"); - } - if (slot == 2) { - return EL_STR("yarʼā"); - } - if (slot == 3) { - return EL_STR("tarʼā"); - } - if (slot == 4) { - return EL_STR("narʼā"); - } - return EL_STR("yarʼayna"); - return 0; -} - -el_val_t uga_amr_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ʼamartu"); - } - if (slot == 1) { - return EL_STR("ʼamarta"); - } - if (slot == 2) { - return EL_STR("ʼamara"); - } - if (slot == 3) { - return EL_STR("ʼamarat"); - } - if (slot == 4) { - return EL_STR("ʼamarnu"); - } - return EL_STR("ʼamaru"); - return 0; -} - -el_val_t uga_amr_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ʼaʼmuru"); - } - if (slot == 1) { - return EL_STR("taʼmuru"); - } - if (slot == 2) { - return EL_STR("yaʼmuru"); - } - if (slot == 3) { - return EL_STR("taʼmuru"); - } - if (slot == 4) { - return EL_STR("naʼmuru"); - } - return EL_STR("yaʼmuruna"); - return 0; -} - -el_val_t uga_generic_perfect(el_val_t base3sg, el_val_t slot) { - if (slot == 0) { - return el_str_concat(base3sg, EL_STR("tu")); - } - if (slot == 1) { - return el_str_concat(base3sg, EL_STR("ta")); - } - if (slot == 2) { - return base3sg; - } - if (slot == 3) { - return el_str_concat(base3sg, EL_STR("at")); - } - if (slot == 4) { - return el_str_concat(base3sg, EL_STR("nu")); - } - return el_str_concat(base3sg, EL_STR("u")); - return 0; -} - -el_val_t uga_generic_imperfect(el_val_t base3sg, el_val_t slot) { - if (slot == 0) { - return el_str_concat(EL_STR("ʼa"), base3sg); - } - if (slot == 1) { - return el_str_concat(EL_STR("ta"), base3sg); - } - if (slot == 2) { - return el_str_concat(EL_STR("ya"), base3sg); - } - if (slot == 3) { - return el_str_concat(EL_STR("ta"), base3sg); - } - if (slot == 4) { - return el_str_concat(EL_STR("na"), base3sg); - } - return el_str_concat(el_str_concat(EL_STR("ya"), base3sg), EL_STR("una")); - return 0; -} - -el_val_t uga_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("kn"))) { - return uga_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("kāna"))) { - return uga_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("hlk"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_hlk_perfect(slot); - } - return uga_hlk_imperfect(slot); - } - if (str_eq(verb, EL_STR("halaka"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_hlk_perfect(slot); - } - return uga_hlk_imperfect(slot); - } - if (str_eq(verb, EL_STR("rʼy"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_ray_perfect(slot); - } - return uga_ray_imperfect(slot); - } - if (str_eq(verb, EL_STR("raʼaya"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_ray_perfect(slot); - } - return uga_ray_imperfect(slot); - } - if (str_eq(verb, EL_STR("ʼmr"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_amr_perfect(slot); - } - return uga_amr_imperfect(slot); - } - if (str_eq(verb, EL_STR("ʼamara"))) { - if (str_eq(tense, EL_STR("perfect"))) { - return uga_amr_perfect(slot); - } - return uga_amr_imperfect(slot); - } - return EL_STR(""); - return 0; -} - -el_val_t uga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = uga_slot(person, number); - if (uga_is_copula(verb)) { - return uga_conjugate_copula(tense, slot); - } - el_val_t known = uga_known_verb(verb, tense, slot); - if (!str_eq(known, EL_STR(""))) { - return known; - } - return verb; - return 0; -} - -el_val_t uga_strip_nom(el_val_t noun) { - if (uga_str_ends(noun, EL_STR("u"))) { - el_val_t len = uga_str_len(noun); - if (len > 1) { - return uga_str_drop_last(noun, 1); - } - } - if (uga_str_ends(noun, EL_STR("atu"))) { - return uga_str_drop_last(noun, 3); - } - return noun; - return 0; -} - -el_val_t uga_is_fem(el_val_t noun) { - if (uga_str_ends(noun, EL_STR("atu"))) { - return 1; - } - if (uga_str_ends(noun, EL_STR("ata"))) { - return 1; - } - if (uga_str_ends(noun, EL_STR("ati"))) { - return 1; - } - if (uga_str_ends(noun, EL_STR("ātu"))) { - return 1; - } - if (uga_str_ends(noun, EL_STR("āti"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t uga_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t fem = uga_is_fem(noun); - el_val_t stem = uga_strip_nom(noun); - if (str_eq(number, EL_STR("dual"))) { - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("āma")); - } - return el_str_concat(stem, EL_STR("ēma")); - } - if (str_eq(number, EL_STR("plural"))) { - if (fem) { - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ātu")); - } - return el_str_concat(stem, EL_STR("āti")); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("ūma")); - } - return el_str_concat(stem, EL_STR("īma")); - } - if (fem) { - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("atu")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("ata")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("ati")); - } - return el_str_concat(stem, EL_STR("atu")); - } - if (str_eq(gram_case, EL_STR("nom"))) { - return el_str_concat(stem, EL_STR("u")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - return el_str_concat(stem, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("gen"))) { - return el_str_concat(stem, EL_STR("i")); - } - return el_str_concat(stem, EL_STR("u")); - return 0; -} - -el_val_t uga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return uga_decline(noun, gram_case, number); - return 0; -} - -el_val_t uga_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("kn"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("hlk"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("rʼy"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("ʼmr"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("ʼmr"); - } - return verb; - return 0; -} - -el_val_t egy_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t egy_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t egy_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t egy_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t egy_slot(el_val_t person, el_val_t number) { - if (str_eq(number, EL_STR("dual"))) { - return 8; - } - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("plural"))) { - return 5; - } - return 0; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("plural"))) { - return 6; - } - return 1; - } - if (str_eq(number, EL_STR("plural"))) { - return 7; - } - return 3; - return 0; -} - -el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number) { - if (str_eq(number, EL_STR("dual"))) { - return 8; - } - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("plural"))) { - return 5; - } - return 0; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("plural"))) { - return 6; - } - if (str_eq(gender, EL_STR("f"))) { - return 2; - } - return 1; - } - if (str_eq(number, EL_STR("plural"))) { - return 7; - } - if (str_eq(gender, EL_STR("f"))) { - return 4; - } - return 3; - return 0; -} - -el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number) { - el_val_t slot = egy_slot(person, number); - if (slot == 0) { - return EL_STR("=i"); - } - if (slot == 1) { - return EL_STR("=k"); - } - if (slot == 5) { - return EL_STR("=n"); - } - if (slot == 6) { - return EL_STR("=Tn"); - } - if (slot == 7) { - return EL_STR("=sn"); - } - if (slot == 8) { - return EL_STR("=sny"); - } - return EL_STR("=f"); - return 0; -} - -el_val_t egy_suffix_pronoun(el_val_t slot) { - if (slot == 0) { - return EL_STR("=i"); - } - if (slot == 1) { - return EL_STR("=k"); - } - if (slot == 2) { - return EL_STR("=T"); - } - if (slot == 3) { - return EL_STR("=f"); - } - if (slot == 4) { - return EL_STR("=s"); - } - if (slot == 5) { - return EL_STR("=n"); - } - if (slot == 6) { - return EL_STR("=Tn"); - } - if (slot == 7) { - return EL_STR("=sn"); - } - return EL_STR("=sny"); - return 0; -} - -el_val_t egy_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("wnn"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR(""); - } - if (str_eq(tense, EL_STR("past"))) { - return el_str_concat(EL_STR("wnn.n"), egy_suffix_pronoun(slot)); - } - if (str_eq(tense, EL_STR("future"))) { - return el_str_concat(EL_STR("wnn.xr"), egy_suffix_pronoun(slot)); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("wnn"); - } - return EL_STR(""); - return 0; -} - -el_val_t egy_rdi_present(el_val_t slot) { - return el_str_concat(EL_STR("di"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_rdi_past(el_val_t slot) { - return el_str_concat(EL_STR("di.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_rdi_future(el_val_t slot) { - return el_str_concat(EL_STR("di.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_mAA_present(el_val_t slot) { - return el_str_concat(EL_STR("mAA"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_mAA_past(el_val_t slot) { - return el_str_concat(EL_STR("mAA.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_mAA_future(el_val_t slot) { - return el_str_concat(EL_STR("mAA.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Dd_present(el_val_t slot) { - return el_str_concat(EL_STR("Dd"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Dd_past(el_val_t slot) { - return el_str_concat(EL_STR("Dd.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Dd_future(el_val_t slot) { - return el_str_concat(EL_STR("Dd.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Sm_present(el_val_t slot) { - return el_str_concat(EL_STR("Sm"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Sm_past(el_val_t slot) { - return el_str_concat(EL_STR("Sm.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_Sm_future(el_val_t slot) { - return el_str_concat(EL_STR("Sm.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_iri_present(el_val_t slot) { - return el_str_concat(EL_STR("ir"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_iri_past(el_val_t slot) { - return el_str_concat(EL_STR("ir.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_iri_future(el_val_t slot) { - return el_str_concat(EL_STR("ir.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_sdm_present(el_val_t slot) { - return el_str_concat(EL_STR("sdm"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_sdm_past(el_val_t slot) { - return el_str_concat(EL_STR("sdm.n"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_sdm_future(el_val_t slot) { - return el_str_concat(EL_STR("sdm.xr"), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("rdi"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_rdi_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_rdi_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_rdi_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("rdi"); - } - return egy_rdi_present(slot); - } - if (str_eq(verb, EL_STR("di"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_rdi_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_rdi_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_rdi_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("rdi"); - } - return egy_rdi_present(slot); - } - if (str_eq(verb, EL_STR("give"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_rdi_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_rdi_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_rdi_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("rdi"); - } - return egy_rdi_present(slot); - } - if (str_eq(verb, EL_STR("mAA"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_mAA_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_mAA_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_mAA_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("mAA"); - } - return egy_mAA_present(slot); - } - if (str_eq(verb, EL_STR("see"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_mAA_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_mAA_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_mAA_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("mAA"); - } - return egy_mAA_present(slot); - } - if (str_eq(verb, EL_STR("Dd"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_Dd_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_Dd_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_Dd_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("Dd"); - } - return egy_Dd_present(slot); - } - if (str_eq(verb, EL_STR("say"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_Dd_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_Dd_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_Dd_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("Dd"); - } - return egy_Dd_present(slot); - } - if (str_eq(verb, EL_STR("Sm"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_Sm_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_Sm_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_Sm_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("Sm"); - } - return egy_Sm_present(slot); - } - if (str_eq(verb, EL_STR("go"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_Sm_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_Sm_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_Sm_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("Sm"); - } - return egy_Sm_present(slot); - } - if (str_eq(verb, EL_STR("iri"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_iri_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_iri_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_iri_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("iri"); - } - return egy_iri_present(slot); - } - if (str_eq(verb, EL_STR("do"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_iri_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_iri_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_iri_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("iri"); - } - return egy_iri_present(slot); - } - if (str_eq(verb, EL_STR("make"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_iri_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_iri_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_iri_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("iri"); - } - return egy_iri_present(slot); - } - if (str_eq(verb, EL_STR("sdm"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_sdm_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_sdm_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_sdm_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("sdm"); - } - return egy_sdm_present(slot); - } - if (str_eq(verb, EL_STR("hear"))) { - if (str_eq(tense, EL_STR("present"))) { - return egy_sdm_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_sdm_past(slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_sdm_future(slot); - } - if (str_eq(tense, EL_STR("infinitive"))) { - return EL_STR("sdm"); - } - return egy_sdm_present(slot); - } - return EL_STR(""); - return 0; -} - -el_val_t egy_regular_present(el_val_t stem, el_val_t slot) { - return el_str_concat(stem, egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_regular_past(el_val_t stem, el_val_t slot) { - return el_str_concat(el_str_concat(stem, EL_STR(".n")), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_regular_future(el_val_t stem, el_val_t slot) { - return el_str_concat(el_str_concat(stem, EL_STR(".xr")), egy_suffix_pronoun(slot)); - return 0; -} - -el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = egy_slot(person, number); - if (egy_is_copula(verb)) { - return egy_conjugate_copula(tense, slot); - } - el_val_t known = egy_known_verb(verb, tense, slot); - if (!str_eq(known, EL_STR(""))) { - return known; - } - if (str_eq(tense, EL_STR("infinitive"))) { - return verb; - } - if (str_eq(tense, EL_STR("present"))) { - return egy_regular_present(verb, slot); - } - if (str_eq(tense, EL_STR("past"))) { - return egy_regular_past(verb, slot); - } - if (str_eq(tense, EL_STR("future"))) { - return egy_regular_future(verb, slot); - } - return verb; - return 0; -} - -el_val_t egy_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - return noun; - } - if (str_eq(number, EL_STR("dual"))) { - if (egy_str_ends(noun, EL_STR("t"))) { - el_val_t stem = egy_drop(noun, 1); - return el_str_concat(stem, EL_STR("ty")); - } - return el_str_concat(noun, EL_STR("wy")); - } - if (egy_str_ends(noun, EL_STR("t"))) { - return el_str_concat(noun, EL_STR("wt")); - } - return el_str_concat(noun, EL_STR("w")); - return 0; -} - -el_val_t egy_fem(el_val_t noun) { - if (egy_str_ends(noun, EL_STR("t"))) { - return noun; - } - return el_str_concat(noun, EL_STR("t")); - return 0; -} - -el_val_t egy_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return egy_decline(noun, gram_case, number); - return 0; -} - -el_val_t egy_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("wnn"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("rdi"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("mAA"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("Dd"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("Sm"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("iri"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("iri"); - } - if (str_eq(verb, EL_STR("hear"))) { - return EL_STR("sdm"); - } - return verb; - return 0; -} - -el_val_t sux_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t sux_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t sux_str_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t sux_str_last2(el_val_t s) { - el_val_t n = str_len(s); - if (n < 2) { - return s; - } - return str_slice(s, (n - 2), n); - return 0; -} - -el_val_t sux_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t sux_ergative_suffix(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("-en"); - } - return EL_STR("-enden"); - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("-en"); - } - return EL_STR("-enzen"); - } - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("-e"); - } - return EL_STR("-eš"); - return 0; -} - -el_val_t sux_absolutive_suffix(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("-en"); - } - return EL_STR("-enden"); - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("-en"); - } - return EL_STR("-enzen"); - } - return EL_STR(""); - return 0; -} - -el_val_t sux_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("me"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("dug4"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("du"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("igi-bar"); - } - if (str_eq(verb, EL_STR("do"))) { - return EL_STR("ak"); - } - if (str_eq(verb, EL_STR("make"))) { - return EL_STR("ak"); - } - if (str_eq(verb, EL_STR("bring"))) { - return EL_STR("tum2"); - } - if (str_eq(verb, EL_STR("build"))) { - return EL_STR("dù"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("šum2"); - } - if (str_eq(verb, EL_STR("know"))) { - return EL_STR("zu"); - } - if (str_eq(verb, EL_STR("hear"))) { - return EL_STR("ĝeštug2 ĝar"); - } - if (str_eq(verb, EL_STR("love"))) { - return EL_STR("ki-aĝ2"); - } - if (str_eq(verb, EL_STR("sit"))) { - return EL_STR("tuš"); - } - if (str_eq(verb, EL_STR("stand"))) { - return EL_STR("gub"); - } - if (str_eq(verb, EL_STR("come"))) { - return EL_STR("ĝen"); - } - if (str_eq(verb, EL_STR("eat"))) { - return EL_STR("gu7"); - } - if (str_eq(verb, EL_STR("drink"))) { - return EL_STR("naĝ"); - } - if (str_eq(verb, EL_STR("write"))) { - return EL_STR("sar"); - } - return verb; - return 0; -} - -el_val_t sux_personal_suffix(el_val_t slot) { - if (slot == 0) { - return EL_STR("en"); - } - if (slot == 1) { - return EL_STR("en"); - } - if (slot == 2) { - return EL_STR(""); - } - if (slot == 3) { - return EL_STR("enden"); - } - if (slot == 4) { - return EL_STR("enzen"); - } - return EL_STR("eš"); - return 0; -} - -el_val_t sux_me_present(el_val_t slot) { - if (slot == 0) { - return EL_STR("me-en"); - } - if (slot == 1) { - return EL_STR("me-en"); - } - if (slot == 2) { - return EL_STR(""); - } - if (slot == 3) { - return EL_STR("me-en-dè"); - } - if (slot == 4) { - return EL_STR("me-en-zè-en"); - } - return EL_STR("me-eš"); - return 0; -} - -el_val_t sux_me_past(el_val_t slot) { - if (slot == 0) { - return EL_STR("ba-me-en"); - } - if (slot == 1) { - return EL_STR("ba-me-en"); - } - if (slot == 2) { - return EL_STR("ba-me"); - } - if (slot == 3) { - return EL_STR("ba-me-en-dè"); - } - if (slot == 4) { - return EL_STR("ba-me-en-zè-en"); - } - return EL_STR("ba-me-eš"); - return 0; -} - -el_val_t sux_dug4_present(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("e"); - } - return el_str_concat(EL_STR("e-"), suf); - return 0; -} - -el_val_t sux_dug4_past(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("mu-un-dug4"); - } - return el_str_concat(EL_STR("mu-un-dug4-"), suf); - return 0; -} - -el_val_t sux_du_present(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("i-du"); - } - return el_str_concat(EL_STR("i-du-"), suf); - return 0; -} - -el_val_t sux_du_past(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("mu-un-du"); - } - return el_str_concat(EL_STR("mu-un-du-"), suf); - return 0; -} - -el_val_t sux_igibar_present(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("igi i-bar"); - } - return el_str_concat(EL_STR("igi i-bar-"), suf); - return 0; -} - -el_val_t sux_igibar_past(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("igi mu-un-bar"); - } - return el_str_concat(EL_STR("igi mu-un-bar-"), suf); - return 0; -} - -el_val_t sux_ak_present(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("i-ak"); - } - return el_str_concat(EL_STR("i-ak-"), suf); - return 0; -} - -el_val_t sux_ak_past(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("mu-un-ak"); - } - return el_str_concat(EL_STR("mu-un-ak-"), suf); - return 0; -} - -el_val_t sux_tum2_present(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("i-tum2"); - } - return el_str_concat(EL_STR("i-tum2-"), suf); - return 0; -} - -el_val_t sux_tum2_past(el_val_t slot) { - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(suf, EL_STR(""))) { - return EL_STR("mu-un-tum2"); - } - return el_str_concat(EL_STR("mu-un-tum2-"), suf); - return 0; -} - -el_val_t sux_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t v = sux_map_canonical(verb); - el_val_t slot = sux_slot(person, number); - if (str_eq(v, EL_STR("me"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_me_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_me_past(slot); - } - return sux_me_present(slot); - } - if (str_eq(v, EL_STR("dug4"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_dug4_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_dug4_past(slot); - } - return sux_dug4_past(slot); - } - if (str_eq(v, EL_STR("du"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_du_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_du_past(slot); - } - return sux_du_past(slot); - } - if (str_eq(v, EL_STR("igi-bar"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_igibar_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_igibar_past(slot); - } - return sux_igibar_past(slot); - } - if (str_eq(v, EL_STR("ak"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_ak_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_ak_past(slot); - } - return sux_ak_past(slot); - } - if (str_eq(v, EL_STR("tum2"))) { - if (str_eq(tense, EL_STR("present"))) { - return sux_tum2_present(slot); - } - if (str_eq(tense, EL_STR("past"))) { - return sux_tum2_past(slot); - } - return sux_tum2_past(slot); - } - el_val_t suf = sux_personal_suffix(slot); - if (str_eq(tense, EL_STR("present"))) { - if (str_eq(suf, EL_STR(""))) { - return el_str_concat(EL_STR("i-"), v); - } - return el_str_concat(el_str_concat(el_str_concat(EL_STR("i-"), v), EL_STR("-")), suf); - } - if (str_eq(suf, EL_STR(""))) { - return el_str_concat(EL_STR("mu-"), v); - } - return el_str_concat(el_str_concat(el_str_concat(EL_STR("mu-"), v), EL_STR("-")), suf); - return 0; -} - -el_val_t sux_is_animate(el_val_t noun) { - if (sux_str_ends(noun, EL_STR("diĝir"))) { - return 1; - } - if (sux_str_ends(noun, EL_STR("dingir"))) { - return 1; - } - if (str_eq(noun, EL_STR("lugal"))) { - return 1; - } - if (str_eq(noun, EL_STR("nin"))) { - return 1; - } - if (str_eq(noun, EL_STR("en"))) { - return 1; - } - if (str_eq(noun, EL_STR("ensi2"))) { - return 1; - } - if (str_eq(noun, EL_STR("dumu"))) { - return 1; - } - if (str_eq(noun, EL_STR("dam"))) { - return 1; - } - if (str_eq(noun, EL_STR("ama"))) { - return 1; - } - if (str_eq(noun, EL_STR("ad"))) { - return 1; - } - if (str_eq(noun, EL_STR("a2-dam"))) { - return 1; - } - if (str_eq(noun, EL_STR("lu2"))) { - return 1; - } - if (str_eq(noun, EL_STR("munus"))) { - return 1; - } - if (str_eq(noun, EL_STR("ur"))) { - return 1; - } - if (str_eq(noun, EL_STR("saĝ"))) { - return 1; - } - if (str_eq(noun, EL_STR("gudu4"))) { - return 1; - } - if (str_eq(noun, EL_STR("sanga"))) { - return 1; - } - if (str_eq(noun, EL_STR("ugula"))) { - return 1; - } - if (str_eq(noun, EL_STR("dub-sar"))) { - return 1; - } - if (str_eq(noun, EL_STR("nar"))) { - return 1; - } - if (str_eq(noun, EL_STR("sukkal"))) { - return 1; - } - if (sux_str_ends(noun, EL_STR("d-"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t sux_case_suffix(el_val_t gram_case) { - if (str_eq(gram_case, EL_STR("absolutive"))) { - return EL_STR(""); - } - if (str_eq(gram_case, EL_STR("ergative"))) { - return EL_STR("-e"); - } - if (str_eq(gram_case, EL_STR("genitive"))) { - return EL_STR("-ak"); - } - if (str_eq(gram_case, EL_STR("dative"))) { - return EL_STR("-ra"); - } - if (str_eq(gram_case, EL_STR("locative"))) { - return EL_STR("-a"); - } - if (str_eq(gram_case, EL_STR("ablative"))) { - return EL_STR("-ta"); - } - if (str_eq(gram_case, EL_STR("comitative"))) { - return EL_STR("-da"); - } - if (str_eq(gram_case, EL_STR("equative"))) { - return EL_STR("-gin"); - } - if (str_eq(gram_case, EL_STR("terminative"))) { - return EL_STR("-še"); - } - return EL_STR(""); - return 0; -} - -el_val_t sux_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - el_val_t csuf = sux_case_suffix(gram_case); - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gram_case, EL_STR("absolutive"))) { - return noun; - } - el_val_t suf_len = str_len(csuf); - el_val_t bare_suf = str_slice(csuf, 1, suf_len); - return el_str_concat(noun, bare_suf); - } - el_val_t animate = sux_is_animate(noun); - el_val_t plural_stem = EL_STR(""); - if (animate) { - plural_stem = el_str_concat(noun, EL_STR("ene")); - } - if (!animate) { - plural_stem = el_str_concat(noun, EL_STR("a")); - } - if (str_eq(gram_case, EL_STR("absolutive"))) { - return plural_stem; - } - el_val_t suf_len2 = str_len(csuf); - el_val_t bare_suf2 = str_slice(csuf, 1, suf_len2); - return el_str_concat(plural_stem, bare_suf2); - return 0; -} - -el_val_t sux_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return sux_decline(noun, gram_case, number); - return 0; -} - -el_val_t sux_verb_chain(el_val_t agent, el_val_t verb, el_val_t patient, el_val_t tense) { - el_val_t conjugated = sux_conjugate(verb, tense, EL_STR("third"), EL_STR("singular")); - if (str_eq(patient, EL_STR(""))) { - return el_str_concat(el_str_concat(agent, EL_STR(" ")), conjugated); - } - el_val_t agent_erg = el_str_concat(agent, EL_STR("e")); - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(agent_erg, EL_STR(" ")), patient), EL_STR(" ")), conjugated); - return 0; -} - -el_val_t sux_realize_sentence(el_val_t intent, el_val_t agent, el_val_t predicate, el_val_t patient, el_val_t tense) { - if (str_eq(intent, EL_STR("assert"))) { - return sux_verb_chain(agent, predicate, patient, tense); - } - if (str_eq(intent, EL_STR("question"))) { - el_val_t assertion = sux_verb_chain(agent, predicate, patient, tense); - return el_str_concat(assertion, EL_STR("-a")); - } - if (str_eq(intent, EL_STR("describe"))) { - if (str_eq(patient, EL_STR(""))) { - return el_str_concat(el_str_concat(el_str_concat(agent, EL_STR(" ")), predicate), EL_STR("-am3")); - } - return el_str_concat(el_str_concat(el_str_concat(agent, EL_STR(" ")), patient), EL_STR("-am3")); - } - return sux_verb_chain(agent, predicate, patient, tense); - return 0; -} - -el_val_t gez_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t gez_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t gez_str_drop_last(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t gez_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("plural"))) { - return 4; - } - return 0; - } - if (str_eq(person, EL_STR("second"))) { - return 1; - } - if (str_eq(number, EL_STR("plural"))) { - return 5; - } - return 2; - return 0; -} - -el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number) { - el_val_t base = gez_slot(person, number); - if (str_eq(person, EL_STR("third"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return 3; - } - } - } - return base; - return 0; -} - -el_val_t gez_kwn_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ሆንኩ"); - } - if (slot == 1) { - return EL_STR("ሆንከ"); - } - if (slot == 2) { - return EL_STR("ሆነ"); - } - if (slot == 3) { - return EL_STR("ሆነት"); - } - if (slot == 4) { - return EL_STR("ሆንነ"); - } - return EL_STR("ሆኑ"); - return 0; -} - -el_val_t gez_kwn_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("እሆን"); - } - if (slot == 1) { - return EL_STR("ትሆን"); - } - if (slot == 2) { - return EL_STR("ይሆን"); - } - if (slot == 3) { - return EL_STR("ትሆን"); - } - if (slot == 4) { - return EL_STR("ንሆን"); - } - return EL_STR("ይሆኑ"); - return 0; -} - -el_val_t gez_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("kwn"))) { - return 1; - } - if (str_eq(verb, EL_STR("ሆነ"))) { - return 1; - } - if (str_eq(verb, EL_STR("hona"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_kwn_imperfect(slot); - } - return gez_kwn_perfect(slot); - return 0; -} - -el_val_t gez_hlw_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ሀሎኩ"); - } - if (slot == 1) { - return EL_STR("ሀሎከ"); - } - if (slot == 2) { - return EL_STR("ሀሎ"); - } - if (slot == 3) { - return EL_STR("ሀለወት"); - } - if (slot == 4) { - return EL_STR("ሀሎነ"); - } - return EL_STR("ሀሉ"); - return 0; -} - -el_val_t gez_hlw_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("እሀሉ"); - } - if (slot == 1) { - return EL_STR("ትሀሉ"); - } - if (slot == 2) { - return EL_STR("ይሀሉ"); - } - if (slot == 3) { - return EL_STR("ትሀሉ"); - } - if (slot == 4) { - return EL_STR("ንሀሉ"); - } - return EL_STR("ይሀልዉ"); - return 0; -} - -el_val_t gez_hbl_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ሰጠኩ"); - } - if (slot == 1) { - return EL_STR("ሰጠከ"); - } - if (slot == 2) { - return EL_STR("ሰጠ"); - } - if (slot == 3) { - return EL_STR("ሰጠት"); - } - if (slot == 4) { - return EL_STR("ሰጠነ"); - } - return EL_STR("ሰጡ"); - return 0; -} - -el_val_t gez_hbl_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("እሰጥ"); - } - if (slot == 1) { - return EL_STR("ትሰጥ"); - } - if (slot == 2) { - return EL_STR("ይሰጥ"); - } - if (slot == 3) { - return EL_STR("ትሰጥ"); - } - if (slot == 4) { - return EL_STR("ንሰጥ"); - } - return EL_STR("ይሰጡ"); - return 0; -} - -el_val_t gez_ray_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("አየኩ"); - } - if (slot == 1) { - return EL_STR("አየከ"); - } - if (slot == 2) { - return EL_STR("አየ"); - } - if (slot == 3) { - return EL_STR("አየት"); - } - if (slot == 4) { - return EL_STR("አየነ"); - } - return EL_STR("አዩ"); - return 0; -} - -el_val_t gez_ray_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("እያይ"); - } - if (slot == 1) { - return EL_STR("ትያይ"); - } - if (slot == 2) { - return EL_STR("ያይ"); - } - if (slot == 3) { - return EL_STR("ትያይ"); - } - if (slot == 4) { - return EL_STR("ንያይ"); - } - return EL_STR("ያዩ"); - return 0; -} - -el_val_t gez_qwl_perfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("ተናገርኩ"); - } - if (slot == 1) { - return EL_STR("ተናገርከ"); - } - if (slot == 2) { - return EL_STR("ተናገረ"); - } - if (slot == 3) { - return EL_STR("ተናገረት"); - } - if (slot == 4) { - return EL_STR("ተናገርነ"); - } - return EL_STR("ተናገሩ"); - return 0; -} - -el_val_t gez_qwl_imperfect(el_val_t slot) { - if (slot == 0) { - return EL_STR("እናገር"); - } - if (slot == 1) { - return EL_STR("ትናገር"); - } - if (slot == 2) { - return EL_STR("ይናገር"); - } - if (slot == 3) { - return EL_STR("ትናገር"); - } - if (slot == 4) { - return EL_STR("ንናገር"); - } - return EL_STR("ይናገሩ"); - return 0; -} - -el_val_t gez_generic_perfect(el_val_t base3sg, el_val_t slot) { - if (slot == 0) { - return el_str_concat(base3sg, EL_STR("ኩ")); - } - if (slot == 1) { - return el_str_concat(base3sg, EL_STR("ከ")); - } - if (slot == 2) { - return base3sg; - } - if (slot == 3) { - return el_str_concat(base3sg, EL_STR("ት")); - } - if (slot == 4) { - return el_str_concat(base3sg, EL_STR("ነ")); - } - return el_str_concat(base3sg, EL_STR("ኡ")); - return 0; -} - -el_val_t gez_generic_imperfect(el_val_t base3sg, el_val_t slot) { - if (slot == 0) { - return el_str_concat(EL_STR("እ"), base3sg); - } - if (slot == 1) { - return el_str_concat(EL_STR("ት"), base3sg); - } - if (slot == 2) { - return el_str_concat(EL_STR("ይ"), base3sg); - } - if (slot == 3) { - return el_str_concat(EL_STR("ት"), base3sg); - } - if (slot == 4) { - return el_str_concat(EL_STR("ን"), base3sg); - } - return el_str_concat(el_str_concat(EL_STR("ይ"), base3sg), EL_STR("ኡ")); - return 0; -} - -el_val_t gez_known_verb(el_val_t verb, el_val_t tense, el_val_t slot) { - if (str_eq(verb, EL_STR("kwn"))) { - return gez_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("ሆነ"))) { - return gez_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("hona"))) { - return gez_conjugate_copula(tense, slot); - } - if (str_eq(verb, EL_STR("hlw"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hlw_imperfect(slot); - } - return gez_hlw_perfect(slot); - } - if (str_eq(verb, EL_STR("ሀሎ"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hlw_imperfect(slot); - } - return gez_hlw_perfect(slot); - } - if (str_eq(verb, EL_STR("hallo"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hlw_imperfect(slot); - } - return gez_hlw_perfect(slot); - } - if (str_eq(verb, EL_STR("hbl"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hbl_imperfect(slot); - } - return gez_hbl_perfect(slot); - } - if (str_eq(verb, EL_STR("ሰጠ"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hbl_imperfect(slot); - } - return gez_hbl_perfect(slot); - } - if (str_eq(verb, EL_STR("sätta"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_hbl_imperfect(slot); - } - return gez_hbl_perfect(slot); - } - if (str_eq(verb, EL_STR("rʾy"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_ray_imperfect(slot); - } - return gez_ray_perfect(slot); - } - if (str_eq(verb, EL_STR("አየ"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_ray_imperfect(slot); - } - return gez_ray_perfect(slot); - } - if (str_eq(verb, EL_STR("ʾayya"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_ray_imperfect(slot); - } - return gez_ray_perfect(slot); - } - if (str_eq(verb, EL_STR("qwl"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_qwl_imperfect(slot); - } - return gez_qwl_perfect(slot); - } - if (str_eq(verb, EL_STR("ተናገረ"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_qwl_imperfect(slot); - } - return gez_qwl_perfect(slot); - } - if (str_eq(verb, EL_STR("tänagärä"))) { - if (str_eq(tense, EL_STR("imperfect"))) { - return gez_qwl_imperfect(slot); - } - return gez_qwl_perfect(slot); - } - return EL_STR(""); - return 0; -} - -el_val_t gez_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t slot = gez_slot(person, number); - if (gez_is_copula(verb)) { - return gez_conjugate_copula(tense, slot); - } - el_val_t known = gez_known_verb(verb, tense, slot); - if (!str_eq(known, EL_STR(""))) { - return known; - } - return verb; - return 0; -} - -el_val_t gez_is_fidel(el_val_t noun) { - el_val_t n = gez_str_len(noun); - if (n == 0) { - return 0; - } - el_val_t first = str_slice(noun, 0, 1); - if (str_eq(first, EL_STR("ሀ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሁ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሂ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሃ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሄ"))) { - return 1; - } - if (str_eq(first, EL_STR("ህ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሆ"))) { - return 1; - } - if (str_eq(first, EL_STR("ለ"))) { - return 1; - } - if (str_eq(first, EL_STR("መ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሰ"))) { - return 1; - } - if (str_eq(first, EL_STR("ሸ"))) { - return 1; - } - if (str_eq(first, EL_STR("ቀ"))) { - return 1; - } - if (str_eq(first, EL_STR("በ"))) { - return 1; - } - if (str_eq(first, EL_STR("ተ"))) { - return 1; - } - if (str_eq(first, EL_STR("ነ"))) { - return 1; - } - if (str_eq(first, EL_STR("አ"))) { - return 1; - } - if (str_eq(first, EL_STR("እ"))) { - return 1; - } - if (str_eq(first, EL_STR("ከ"))) { - return 1; - } - if (str_eq(first, EL_STR("ወ"))) { - return 1; - } - if (str_eq(first, EL_STR("ዘ"))) { - return 1; - } - if (str_eq(first, EL_STR("የ"))) { - return 1; - } - if (str_eq(first, EL_STR("ደ"))) { - return 1; - } - if (str_eq(first, EL_STR("ገ"))) { - return 1; - } - if (str_eq(first, EL_STR("ጠ"))) { - return 1; - } - if (str_eq(first, EL_STR("ፀ"))) { - return 1; - } - if (str_eq(first, EL_STR("ፈ"))) { - return 1; - } - if (str_eq(first, EL_STR("ፐ"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t gez_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("plural"))) { - if (gez_is_fidel(noun)) { - return el_str_concat(noun, EL_STR("ዎች")); - } - return el_str_concat(noun, EL_STR("āt")); - } - if (str_eq(gram_case, EL_STR("acc"))) { - if (gez_is_fidel(noun)) { - return el_str_concat(noun, EL_STR("ን")); - } - return el_str_concat(noun, EL_STR("a")); - } - return noun; - return 0; -} - -el_val_t gez_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - return gez_decline(noun, gram_case, number); - return 0; -} - -el_val_t gez_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("kwn"); - } - if (str_eq(verb, EL_STR("exist"))) { - return EL_STR("hlw"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("hbl"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("rʾy"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("qwl"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("qwl"); - } - return verb; - return 0; -} - -el_val_t cop_str_ends(el_val_t s, el_val_t suf) { - return str_ends_with(s, suf); - return 0; -} - -el_val_t cop_str_len(el_val_t s) { - return str_len(s); - return 0; -} - -el_val_t cop_drop(el_val_t s, el_val_t n) { - el_val_t len = str_len(s); - if (n >= len) { - return EL_STR(""); - } - return str_slice(s, 0, (len - n)); - return 0; -} - -el_val_t cop_last_char(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return EL_STR(""); - } - return str_slice(s, (n - 1), n); - return 0; -} - -el_val_t cop_slot(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return 0; - } - return 3; - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return 1; - } - return 4; - } - if (str_eq(number, EL_STR("singular"))) { - return 2; - } - return 5; - return 0; -} - -el_val_t cop_subject_prefix(el_val_t person, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("ⲁ"); - } - return EL_STR("ⲛ"); - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("ⲕ"); - } - return EL_STR("ⲧⲉⲧⲉⲛ"); - } - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("ϥ"); - } - return EL_STR("ⲥⲉ"); - return 0; -} - -el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number) { - if (str_eq(person, EL_STR("first"))) { - if (str_eq(number, EL_STR("singular"))) { - return EL_STR("ⲁ"); - } - return EL_STR("ⲛ"); - } - if (str_eq(person, EL_STR("second"))) { - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ⲧⲉ"); - } - return EL_STR("ⲕ"); - } - return EL_STR("ⲧⲉⲧⲉⲛ"); - } - if (str_eq(number, EL_STR("singular"))) { - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ⲥ"); - } - return EL_STR("ϥ"); - } - return EL_STR("ⲥⲉ"); - return 0; -} - -el_val_t cop_copula_particle(el_val_t gender, el_val_t number) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("ⲛⲉ"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ⲧⲉ"); - } - return EL_STR("ⲡⲉ"); - return 0; -} - -el_val_t cop_shwpe_present(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ϣⲟⲟⲡ")); - return 0; -} - -el_val_t cop_shwpe_perfect(el_val_t prefix) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), EL_STR("ϣⲱⲡⲉ")); - return 0; -} - -el_val_t cop_shwpe_future(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁϣⲱⲡⲉ")); - return 0; -} - -el_val_t cop_bwk_present(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲃⲱⲕ")); - return 0; -} - -el_val_t cop_bwk_perfect(el_val_t prefix) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), EL_STR("ⲃⲱⲕ")); - return 0; -} - -el_val_t cop_bwk_future(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁⲃⲱⲕ")); - return 0; -} - -el_val_t cop_nau_present(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁⲩ")); - return 0; -} - -el_val_t cop_nau_perfect(el_val_t prefix) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), EL_STR("ⲛⲁⲩ")); - return 0; -} - -el_val_t cop_nau_future(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁⲛⲁⲩ")); - return 0; -} - -el_val_t cop_jw_present(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ϫⲱ")); - return 0; -} - -el_val_t cop_jw_perfect(el_val_t prefix) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), EL_STR("ϫⲱ")); - return 0; -} - -el_val_t cop_jw_future(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁϫⲱ")); - return 0; -} - -el_val_t cop_di_present(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ϯ")); - return 0; -} - -el_val_t cop_di_perfect(el_val_t prefix) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), EL_STR("ϯ")); - return 0; -} - -el_val_t cop_di_future(el_val_t prefix) { - return el_str_concat(prefix, EL_STR("ⲛⲁϯ")); - return 0; -} - -el_val_t cop_is_copula(el_val_t verb) { - if (str_eq(verb, EL_STR("ϣωπε"))) { - return 1; - } - if (str_eq(verb, EL_STR("shwpe"))) { - return 1; - } - if (str_eq(verb, EL_STR("be"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t cop_known_verb_prefixed(el_val_t verb, el_val_t tense, el_val_t prefix) { - if (str_eq(verb, EL_STR("ϣωπε"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_shwpe_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_shwpe_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_shwpe_future(prefix); - } - return cop_shwpe_present(prefix); - } - if (str_eq(verb, EL_STR("shwpe"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_shwpe_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_shwpe_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_shwpe_future(prefix); - } - return cop_shwpe_present(prefix); - } - if (str_eq(verb, EL_STR("bwk"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_bwk_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_bwk_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_bwk_future(prefix); - } - return cop_bwk_present(prefix); - } - if (str_eq(verb, EL_STR("ⲃⲱⲕ"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_bwk_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_bwk_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_bwk_future(prefix); - } - return cop_bwk_present(prefix); - } - if (str_eq(verb, EL_STR("go"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_bwk_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_bwk_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_bwk_future(prefix); - } - return cop_bwk_present(prefix); - } - if (str_eq(verb, EL_STR("nau"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_nau_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_nau_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_nau_future(prefix); - } - return cop_nau_present(prefix); - } - if (str_eq(verb, EL_STR("ⲛⲁⲩ"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_nau_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_nau_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_nau_future(prefix); - } - return cop_nau_present(prefix); - } - if (str_eq(verb, EL_STR("see"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_nau_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_nau_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_nau_future(prefix); - } - return cop_nau_present(prefix); - } - if (str_eq(verb, EL_STR("jw"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_jw_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_jw_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_jw_future(prefix); - } - return cop_jw_present(prefix); - } - if (str_eq(verb, EL_STR("ϫⲱ"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_jw_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_jw_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_jw_future(prefix); - } - return cop_jw_present(prefix); - } - if (str_eq(verb, EL_STR("say"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_jw_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_jw_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_jw_future(prefix); - } - return cop_jw_present(prefix); - } - if (str_eq(verb, EL_STR("di"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_di_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_di_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_di_future(prefix); - } - return cop_di_present(prefix); - } - if (str_eq(verb, EL_STR("ϯ"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_di_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_di_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_di_future(prefix); - } - return cop_di_present(prefix); - } - if (str_eq(verb, EL_STR("give"))) { - if (str_eq(tense, EL_STR("present"))) { - return cop_di_present(prefix); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_di_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_di_future(prefix); - } - return cop_di_present(prefix); - } - return EL_STR(""); - return 0; -} - -el_val_t cop_regular_present(el_val_t prefix, el_val_t stem) { - return el_str_concat(prefix, stem); - return 0; -} - -el_val_t cop_regular_perfect(el_val_t prefix, el_val_t stem) { - return el_str_concat(el_str_concat(EL_STR("ⲁ"), prefix), stem); - return 0; -} - -el_val_t cop_regular_future(el_val_t prefix, el_val_t stem) { - return el_str_concat(el_str_concat(prefix, EL_STR("ⲛⲁ")), stem); - return 0; -} - -el_val_t cop_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number) { - el_val_t prefix = cop_subject_prefix(person, number); - if (str_eq(verb, EL_STR("be"))) { - if (str_eq(tense, EL_STR("present"))) { - return EL_STR(""); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_shwpe_perfect(prefix); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_shwpe_future(prefix); - } - return EL_STR(""); - } - el_val_t known = cop_known_verb_prefixed(verb, tense, prefix); - if (!str_eq(known, EL_STR(""))) { - return known; - } - if (str_eq(tense, EL_STR("present"))) { - return cop_regular_present(prefix, verb); - } - if (str_eq(tense, EL_STR("past"))) { - return cop_regular_perfect(prefix, verb); - } - if (str_eq(tense, EL_STR("future"))) { - return cop_regular_future(prefix, verb); - } - return verb; - return 0; -} - -el_val_t cop_article(el_val_t gender, el_val_t number, el_val_t definite) { - if (str_eq(definite, EL_STR("true"))) { - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("ⲛ"); - } - if (str_eq(gender, EL_STR("f"))) { - return EL_STR("ⲧ"); - } - return EL_STR("ⲡ"); - } - if (str_eq(number, EL_STR("plural"))) { - return EL_STR("ϩⲉⲛ"); - } - return EL_STR("ⲟⲩ"); - return 0; -} - -el_val_t cop_decline(el_val_t noun, el_val_t gram_case, el_val_t number) { - if (str_eq(number, EL_STR("singular"))) { - return noun; - } - if (cop_str_ends(noun, EL_STR("ⲉ"))) { - el_val_t stem = cop_drop(noun, 1); - return el_str_concat(stem, EL_STR("ⲟⲟⲩⲉ")); - } - return noun; - return 0; -} - -el_val_t cop_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite) { - el_val_t form = cop_decline(noun, gram_case, number); - el_val_t art = cop_article(EL_STR("m"), number, definite); - if (str_eq(definite, EL_STR("true"))) { - return el_str_concat(art, form); - } - if (str_eq(definite, EL_STR("false"))) { - return el_str_concat(art, form); - } - return form; - return 0; -} - -el_val_t cop_noun_phrase_gendered(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite, el_val_t gender) { - el_val_t form = cop_decline(noun, gram_case, number); - el_val_t art = cop_article(gender, number, definite); - if (str_eq(definite, EL_STR("true"))) { - return el_str_concat(art, form); - } - if (str_eq(definite, EL_STR("false"))) { - return el_str_concat(art, form); - } - return form; - return 0; -} - -el_val_t cop_map_canonical(el_val_t verb) { - if (str_eq(verb, EL_STR("be"))) { - return EL_STR("be"); - } - if (str_eq(verb, EL_STR("go"))) { - return EL_STR("bwk"); - } - if (str_eq(verb, EL_STR("see"))) { - return EL_STR("nau"); - } - if (str_eq(verb, EL_STR("say"))) { - return EL_STR("jw"); - } - if (str_eq(verb, EL_STR("speak"))) { - return EL_STR("jw"); - } - if (str_eq(verb, EL_STR("give"))) { - return EL_STR("di"); - } - return verb; - return 0; -} - -el_val_t slots_get(el_val_t slots, el_val_t key) { - el_val_t n = native_list_len(slots); - el_val_t i = 0; - while (i < (n - 1)) { - el_val_t k = native_list_get(slots, i); - if (str_eq(k, key)) { - return native_list_get(slots, (i + 1)); - } - i = (i + 2); - } - return EL_STR(""); - return 0; -} - -el_val_t slots_set(el_val_t slots, el_val_t key, el_val_t val) { - el_val_t n = native_list_len(slots); - el_val_t result = native_list_empty(); - el_val_t found = 0; - el_val_t i = 0; - while (i < (n - 1)) { - el_val_t k = native_list_get(slots, i); - el_val_t v = native_list_get(slots, (i + 1)); - if (str_eq(k, key)) { - result = native_list_append(result, k); - result = native_list_append(result, val); - found = 1; - } else { - result = native_list_append(result, k); - result = native_list_append(result, v); - } - i = (i + 2); - } - if (!found) { - result = native_list_append(result, key); - result = native_list_append(result, val); - } - return result; - return 0; -} - -el_val_t make_slots(el_val_t k0, el_val_t v0) { - el_val_t r = native_list_empty(); - r = native_list_append(r, k0); - r = native_list_append(r, v0); - return r; - return 0; -} - -el_val_t make_slots2(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1) { - el_val_t r = make_slots(k0, v0); - r = native_list_append(r, k1); - r = native_list_append(r, v1); - return r; - return 0; -} - -el_val_t make_slots3(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2) { - el_val_t r = make_slots2(k0, v0, k1, v1); - r = native_list_append(r, k2); - r = native_list_append(r, v2); - return r; - return 0; -} - -el_val_t make_slots4(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3) { - el_val_t r = make_slots3(k0, v0, k1, v1, k2, v2); - r = native_list_append(r, k3); - r = native_list_append(r, v3); - return r; - return 0; -} - -el_val_t make_slots5(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3, el_val_t k4, el_val_t v4) { - el_val_t r = make_slots4(k0, v0, k1, v1, k2, v2, k3, v3); - r = native_list_append(r, k4); - r = native_list_append(r, v4); - return r; - return 0; -} - -el_val_t rule_id(el_val_t rule) { - return native_list_get(rule, 0); - return 0; -} - -el_val_t rule_lhs(el_val_t rule) { - return native_list_get(rule, 1); - return 0; -} - -el_val_t rule_rhs_len(el_val_t rule) { - el_val_t n = native_list_len(rule); - return (n - 2); - return 0; -} - -el_val_t rule_rhs(el_val_t rule, el_val_t idx) { - return native_list_get(rule, (idx + 2)); - return 0; -} - -el_val_t make_rule(el_val_t id, el_val_t lhs, el_val_t r0) { - el_val_t r = native_list_empty(); - r = native_list_append(r, id); - r = native_list_append(r, lhs); - r = native_list_append(r, r0); - return r; - return 0; -} - -el_val_t make_rule2(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1) { - el_val_t r = make_rule(id, lhs, r0); - r = native_list_append(r, r1); - return r; - return 0; -} - -el_val_t make_rule3(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2) { - el_val_t r = make_rule2(id, lhs, r0, r1); - r = native_list_append(r, r2); - return r; - return 0; -} - -el_val_t make_rule4(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2, el_val_t r3) { - el_val_t r = make_rule3(id, lhs, r0, r1, r2); - r = native_list_append(r, r3); - return r; - return 0; -} - -el_val_t build_rules(void) { - el_val_t rules = native_list_empty(); - rules = native_list_append(rules, make_rule2(EL_STR("S-DECL"), EL_STR("S"), EL_STR("NP"), EL_STR("VP"))); - rules = native_list_append(rules, make_rule3(EL_STR("S-QUEST"), EL_STR("S"), EL_STR("Aux"), EL_STR("NP"), EL_STR("VP"))); - rules = native_list_append(rules, make_rule(EL_STR("S-IMP"), EL_STR("S"), EL_STR("VP"))); - rules = native_list_append(rules, make_rule2(EL_STR("NP-DET-N"), EL_STR("NP"), EL_STR("Det"), EL_STR("N"))); - rules = native_list_append(rules, make_rule3(EL_STR("NP-DET-ADJ-N"), EL_STR("NP"), EL_STR("Det"), EL_STR("Adj"), EL_STR("N"))); - rules = native_list_append(rules, make_rule(EL_STR("NP-PRON"), EL_STR("NP"), EL_STR("Pron"))); - rules = native_list_append(rules, make_rule(EL_STR("NP-N"), EL_STR("NP"), EL_STR("N"))); - rules = native_list_append(rules, make_rule(EL_STR("VP-V"), EL_STR("VP"), EL_STR("V"))); - rules = native_list_append(rules, make_rule2(EL_STR("VP-V-NP"), EL_STR("VP"), EL_STR("V"), EL_STR("NP"))); - rules = native_list_append(rules, make_rule2(EL_STR("VP-V-PP"), EL_STR("VP"), EL_STR("V"), EL_STR("PP"))); - rules = native_list_append(rules, make_rule3(EL_STR("VP-V-NP-PP"), EL_STR("VP"), EL_STR("V"), EL_STR("NP"), EL_STR("PP"))); - rules = native_list_append(rules, make_rule2(EL_STR("VP-AUX-V"), EL_STR("VP"), EL_STR("Aux"), EL_STR("V"))); - rules = native_list_append(rules, make_rule3(EL_STR("VP-AUX-V-NP"), EL_STR("VP"), EL_STR("Aux"), EL_STR("V"), EL_STR("NP"))); - rules = native_list_append(rules, make_rule2(EL_STR("PP-P-NP"), EL_STR("PP"), EL_STR("P"), EL_STR("NP"))); - return rules; - return 0; -} - -el_val_t get_rules(void) { - return build_rules(); - return 0; -} - -el_val_t find_rule(el_val_t rule_id_str) { - el_val_t rules = get_rules(); - el_val_t n = native_list_len(rules); - el_val_t i = 0; - while (i < n) { - el_val_t rule = native_list_get(rules, i); - el_val_t id = native_list_get(rule, 0); - if (str_eq(id, rule_id_str)) { - return rule; - } - i = (i + 1); - } - el_val_t empty = native_list_empty(); - return empty; - return 0; -} - -el_val_t make_leaf(el_val_t label, el_val_t word) { - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" ")), word), EL_STR(")")); - return 0; -} - -el_val_t make_node1(el_val_t label, el_val_t child0) { - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(")")); - return 0; -} - -el_val_t make_node2(el_val_t label, el_val_t child0, el_val_t child1) { - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(")")); - return 0; -} - -el_val_t make_node3(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2) { - 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("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(" ")), child2), EL_STR(")")); - return 0; -} - -el_val_t make_node4(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2, el_val_t child3) { - 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("("), label), EL_STR(" _ ")), child0), EL_STR(" ")), child1), EL_STR(" ")), child2), EL_STR(" ")), child3), EL_STR(")")); - return 0; -} - -el_val_t nlg_is_ws(el_val_t c) { - if (str_eq(c, EL_STR(" "))) { - return 1; - } - if (str_eq(c, EL_STR("\t"))) { - return 1; - } - if (str_eq(c, EL_STR("\n"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t skip_ws(el_val_t s, el_val_t pos) { - el_val_t n = str_len(s); - el_val_t i = pos; - el_val_t running = 1; - while (running) { - if (i >= n) { - running = 0; - } else { - el_val_t c = str_slice(s, i, (i + 1)); - if (nlg_is_ws(c)) { - i = (i + 1); - } else { - running = 0; - } - } - } - return i; - return 0; -} - -el_val_t scan_token(el_val_t s, el_val_t start) { - el_val_t n = str_len(s); - el_val_t i = start; - el_val_t running = 1; - while (running) { - if (i >= n) { - running = 0; - } else { - el_val_t c = str_slice(s, i, (i + 1)); - if (nlg_is_ws(c)) { - running = 0; - } else { - if (str_eq(c, EL_STR("("))) { - running = 0; - } else { - if (str_eq(c, EL_STR(")"))) { - running = 0; - } else { - i = (i + 1); - } - } - } - } - } - el_val_t tok = str_slice(s, start, i); - el_val_t result = native_list_empty(); - result = native_list_append(result, tok); - result = native_list_append(result, int_to_str(i)); - return result; - return 0; -} - -el_val_t render_tree(el_val_t tree) { - el_val_t words = native_list_empty(); - el_val_t n = str_len(tree); - el_val_t i = 0; - el_val_t prev_was_open = 0; - while (i < n) { - el_val_t c = str_slice(tree, i, (i + 1)); - if (str_eq(c, EL_STR("("))) { - prev_was_open = 1; - i = (i + 1); - } else { - if (str_eq(c, EL_STR(")"))) { - prev_was_open = 0; - i = (i + 1); - } else { - if (nlg_is_ws(c)) { - i = (i + 1); - } else { - el_val_t tok_info = scan_token(tree, i); - el_val_t tok = native_list_get(tok_info, 0); - el_val_t new_i = str_to_int(native_list_get(tok_info, 1)); - i = new_i; - if (prev_was_open) { - prev_was_open = 0; - } else { - if (!str_eq(tok, EL_STR("_"))) { - words = native_list_append(words, tok); - } - } - } - } - } - } - return str_join(words, EL_STR(" ")); - return 0; -} - -el_val_t gram_word_order(el_val_t profile) { - return lang_word_order(profile); - return 0; -} - -el_val_t gram_order_constituents(el_val_t subj, el_val_t verb, el_val_t obj, el_val_t profile) { - el_val_t order = gram_word_order(profile); - el_val_t parts = native_list_empty(); - if (str_eq(order, EL_STR("SVO"))) { - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(order, EL_STR("SOV"))) { - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(order, EL_STR("VSO"))) { - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(order, EL_STR("VOS"))) { - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(order, EL_STR("OVS"))) { - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(order, EL_STR("OSV"))) { - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - return str_join(parts, EL_STR(" ")); - } - if (!str_eq(subj, EL_STR(""))) { - parts = native_list_append(parts, subj); - } - if (!str_eq(verb, EL_STR(""))) { - parts = native_list_append(parts, verb); - } - if (!str_eq(obj, EL_STR(""))) { - parts = native_list_append(parts, obj); - } - return str_join(parts, EL_STR(" ")); - return 0; -} - -el_val_t gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile) { - if (str_eq(aux, EL_STR(""))) { - return verb; - } - return el_str_concat(el_str_concat(aux, EL_STR(" ")), verb); - return 0; -} - -el_val_t gram_question_strategy(el_val_t profile) { - el_val_t code = lang_get(profile, EL_STR("code")); - if (str_eq(code, EL_STR("en"))) { - return EL_STR("do-support"); - } - if (str_eq(code, EL_STR("ja"))) { - return EL_STR("particle"); - } - if (str_eq(code, EL_STR("zh"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("es"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("fr"))) { - return EL_STR("inversion"); - } - if (str_eq(code, EL_STR("de"))) { - return EL_STR("inversion"); - } - if (str_eq(code, EL_STR("ar"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("hi"))) { - return EL_STR("particle"); - } - if (str_eq(code, EL_STR("ru"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("fi"))) { - return EL_STR("particle"); - } - if (str_eq(code, EL_STR("sw"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("la"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("he"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("grc"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("ang"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("sa"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("got"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("non"))) { - return EL_STR("intonation"); - } - if (str_eq(code, EL_STR("enm"))) { - return EL_STR("do-support"); - } - if (str_eq(code, EL_STR("pi"))) { - return EL_STR("intonation"); - } - return EL_STR("intonation"); - return 0; -} - -el_val_t is_pronoun(el_val_t word) { - if (str_eq(word, EL_STR("I"))) { - return 1; - } - if (str_eq(word, EL_STR("you"))) { - return 1; - } - if (str_eq(word, EL_STR("he"))) { - return 1; - } - if (str_eq(word, EL_STR("she"))) { - return 1; - } - if (str_eq(word, EL_STR("it"))) { - return 1; - } - if (str_eq(word, EL_STR("we"))) { - return 1; - } - if (str_eq(word, EL_STR("they"))) { - return 1; - } - if (str_eq(word, EL_STR("me"))) { - return 1; - } - if (str_eq(word, EL_STR("him"))) { - return 1; - } - if (str_eq(word, EL_STR("her"))) { - return 1; - } - if (str_eq(word, EL_STR("us"))) { - return 1; - } - if (str_eq(word, EL_STR("them"))) { - return 1; - } - return 0; - return 0; -} - -el_val_t build_np(el_val_t referent, el_val_t slots) { - if (is_pronoun(referent)) { - return make_node1(EL_STR("NP"), make_leaf(EL_STR("Pron"), referent)); - } - el_val_t parts = str_split(referent, EL_STR(" ")); - el_val_t np = native_list_len(parts); - if (np == 1) { - return make_node1(EL_STR("NP"), make_leaf(EL_STR("N"), referent)); - } - if (np == 2) { - el_val_t det = native_list_get(parts, 0); - el_val_t noun = native_list_get(parts, 1); - return make_node2(EL_STR("NP"), make_leaf(EL_STR("Det"), det), make_leaf(EL_STR("N"), noun)); - } - if (np == 3) { - el_val_t det = native_list_get(parts, 0); - el_val_t adj = native_list_get(parts, 1); - el_val_t noun = native_list_get(parts, 2); - return make_node3(EL_STR("NP"), make_leaf(EL_STR("Det"), det), make_leaf(EL_STR("Adj"), adj), make_leaf(EL_STR("N"), noun)); - } - return make_node1(EL_STR("NP"), make_leaf(EL_STR("N"), referent)); - return 0; -} - -el_val_t build_pp(el_val_t loc) { - el_val_t parts = str_split(loc, EL_STR(" ")); - el_val_t n = native_list_len(parts); - if (n < 2) { - return make_leaf(EL_STR("PP"), loc); - } - el_val_t prep = native_list_get(parts, 0); - el_val_t np_parts = native_list_empty(); - el_val_t i = 1; - while (i < n) { - np_parts = native_list_append(np_parts, native_list_get(parts, i)); - i = (i + 1); - } - el_val_t np_str = str_join(np_parts, EL_STR(" ")); - el_val_t np_tree = build_np(np_str, native_list_empty()); - return make_node2(EL_STR("PP"), make_leaf(EL_STR("P"), prep), np_tree); - return 0; -} - -el_val_t build_vp_body(el_val_t slots) { - el_val_t verb_surf = slots_get(slots, EL_STR("verb_surf")); - el_val_t patient = slots_get(slots, EL_STR("patient")); - el_val_t loc = slots_get(slots, EL_STR("location")); - if (!str_eq(patient, EL_STR(""))) { - el_val_t obj_np = build_np(patient, slots); - if (!str_eq(loc, EL_STR(""))) { - el_val_t pp = build_pp(loc); - return make_node3(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), obj_np, pp); - } - return make_node2(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), obj_np); - } - if (!str_eq(loc, EL_STR(""))) { - el_val_t pp = build_pp(loc); - return make_node2(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf), pp); - } - return make_node1(EL_STR("VP"), make_leaf(EL_STR("V"), verb_surf)); - return 0; -} - -el_val_t build_vp_from_slots(el_val_t slots) { - el_val_t aux_surf = slots_get(slots, EL_STR("aux_surf")); - if (!str_eq(aux_surf, EL_STR(""))) { - el_val_t verb_surf = slots_get(slots, EL_STR("verb_surf")); - el_val_t patient = slots_get(slots, EL_STR("patient")); - el_val_t loc = slots_get(slots, EL_STR("location")); - if (!str_eq(patient, EL_STR(""))) { - el_val_t obj_np = build_np(patient, slots); - return make_node3(EL_STR("VP"), make_leaf(EL_STR("Aux"), aux_surf), make_leaf(EL_STR("V"), verb_surf), obj_np); - } - return make_node2(EL_STR("VP"), make_leaf(EL_STR("Aux"), aux_surf), make_leaf(EL_STR("V"), verb_surf)); - } - return build_vp_body(slots); - return 0; -} - -el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots) { - el_val_t rule = find_rule(rule_id_str); - el_val_t n = native_list_len(rule); - if (n == 0) { - return make_leaf(EL_STR("ERR"), EL_STR("unknown-rule")); - } - el_val_t lhs = native_list_get(rule, 1); - if (str_eq(rule_id_str, EL_STR("S-DECL"))) { - el_val_t agent = slots_get(slots, EL_STR("agent")); - el_val_t np_tree = build_np(agent, slots); - el_val_t vp_tree = build_vp_from_slots(slots); - return make_node2(EL_STR("S"), np_tree, vp_tree); - } - if (str_eq(rule_id_str, EL_STR("S-QUEST"))) { - el_val_t agent = slots_get(slots, EL_STR("agent")); - el_val_t np_tree = build_np(agent, slots); - el_val_t vp_tree = build_vp_body(slots); - el_val_t aux_surf = slots_get(slots, EL_STR("aux_surf")); - return make_node3(EL_STR("S"), make_leaf(EL_STR("Aux"), aux_surf), np_tree, vp_tree); - } - if (str_eq(rule_id_str, EL_STR("S-IMP"))) { - el_val_t vp_tree = build_vp_from_slots(slots); - return make_node1(EL_STR("S"), vp_tree); - } - return make_leaf(lhs, EL_STR("?")); - return 0; -} - -el_val_t agent_person(el_val_t agent) { - if (str_eq(agent, EL_STR("I"))) { - return EL_STR("first"); - } - if (str_eq(agent, EL_STR("me"))) { - return EL_STR("first"); - } - if (str_eq(agent, EL_STR("we"))) { - return EL_STR("first"); - } - if (str_eq(agent, EL_STR("us"))) { - return EL_STR("first"); - } - if (str_eq(agent, EL_STR("you"))) { - return EL_STR("second"); - } - return EL_STR("third"); - return 0; -} - -el_val_t agent_number(el_val_t agent) { - if (str_eq(agent, EL_STR("I"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("me"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("he"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("him"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("she"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("her"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("it"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("you"))) { - return EL_STR("singular"); - } - if (str_eq(agent, EL_STR("we"))) { - return EL_STR("plural"); - } - if (str_eq(agent, EL_STR("us"))) { - return EL_STR("plural"); - } - if (str_eq(agent, EL_STR("they"))) { - return EL_STR("plural"); - } - if (str_eq(agent, EL_STR("them"))) { - return EL_STR("plural"); - } - return EL_STR("singular"); - return 0; -} - -el_val_t realize_np(el_val_t referent, el_val_t number) { - return referent; - return 0; -} - -el_val_t realize_vp_lang(el_val_t base_verb, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t profile) { - el_val_t empty_aux = EL_STR(""); - if (str_eq(tense, EL_STR("future"))) { - el_val_t code = lang_get(profile, EL_STR("code")); - if (str_eq(code, EL_STR("en"))) { - el_val_t result = native_list_empty(); - result = native_list_append(result, base_verb); - result = native_list_append(result, EL_STR("will")); - return result; - } - el_val_t surf = morph_conjugate(base_verb, tense, person, number, profile); - el_val_t result = native_list_empty(); - result = native_list_append(result, surf); - result = native_list_append(result, empty_aux); - return result; - } - if (str_eq(aspect, EL_STR("progressive"))) { - el_val_t gerund = morph_conjugate(base_verb, EL_STR("progressive"), person, number, profile); - el_val_t be_aux = morph_conjugate(EL_STR("be"), tense, person, number, profile); - el_val_t result = native_list_empty(); - result = native_list_append(result, gerund); - result = native_list_append(result, be_aux); - return result; - } - if (str_eq(aspect, EL_STR("perfect"))) { - el_val_t pp = morph_conjugate(base_verb, EL_STR("perfect"), person, number, profile); - el_val_t have_form = morph_conjugate(EL_STR("have"), tense, person, number, profile); - el_val_t result = native_list_empty(); - result = native_list_append(result, pp); - result = native_list_append(result, have_form); - return result; - } - el_val_t surf = morph_conjugate(base_verb, tense, person, number, profile); - el_val_t result = native_list_empty(); - result = native_list_append(result, surf); - result = native_list_append(result, empty_aux); - return result; - return 0; -} - -el_val_t realize_question_lang(el_val_t predicate, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t agent, el_val_t patient, el_val_t location, el_val_t profile) { - el_val_t strategy = gram_question_strategy(profile); - el_val_t code = lang_get(profile, EL_STR("code")); - if (str_eq(strategy, EL_STR("do-support"))) { - if (str_eq(aspect, EL_STR("progressive"))) { - el_val_t vp_pair = realize_vp_lang(predicate, tense, EL_STR("progressive"), person, number, profile); - el_val_t gerund = native_list_get(vp_pair, 0); - el_val_t be_aux = native_list_get(vp_pair, 1); - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, be_aux); - parts = native_list_append(parts, agent); - parts = native_list_append(parts, gerund); - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(aspect, EL_STR("perfect"))) { - el_val_t vp_pair = realize_vp_lang(predicate, tense, EL_STR("perfect"), person, number, profile); - el_val_t pp = native_list_get(vp_pair, 0); - el_val_t have_aux = native_list_get(vp_pair, 1); - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, have_aux); - parts = native_list_append(parts, agent); - parts = native_list_append(parts, pp); - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(predicate, EL_STR("be"))) { - el_val_t be_form = morph_conjugate(EL_STR("be"), tense, person, number, profile); - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, be_form); - parts = native_list_append(parts, agent); - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - return str_join(parts, EL_STR(" ")); - } - el_val_t do_form = morph_conjugate(EL_STR("do"), tense, person, number, profile); - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, do_form); - parts = native_list_append(parts, agent); - parts = native_list_append(parts, predicate); - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - return str_join(parts, EL_STR(" ")); - } - if (str_eq(strategy, EL_STR("particle"))) { - el_val_t vp_pair = realize_vp_lang(predicate, tense, aspect, person, number, profile); - el_val_t verb_s = native_list_get(vp_pair, 0); - el_val_t aux_s = native_list_get(vp_pair, 1); - el_val_t vp_str = gram_build_vp(verb_s, aux_s, profile); - el_val_t core = gram_order_constituents(agent, vp_str, patient, profile); - el_val_t loc_part = EL_STR(""); - if (!str_eq(location, EL_STR(""))) { - loc_part = el_str_concat(el_str_concat(core, EL_STR(" ")), location); - } else { - loc_part = core; - } - if (str_eq(code, EL_STR("ja"))) { - return el_str_concat(loc_part, EL_STR(" か")); - } - if (str_eq(code, EL_STR("hi"))) { - return el_str_concat(loc_part, EL_STR(" क्या")); - } - if (str_eq(code, EL_STR("fi"))) { - return el_str_concat(loc_part, EL_STR("-ko")); - } - return el_str_concat(loc_part, EL_STR("?")); - } - if (str_eq(strategy, EL_STR("inversion"))) { - el_val_t vp_pair = realize_vp_lang(predicate, tense, aspect, person, number, profile); - el_val_t verb_s = native_list_get(vp_pair, 0); - el_val_t aux_s = native_list_get(vp_pair, 1); - el_val_t parts = native_list_empty(); - if (!str_eq(aux_s, EL_STR(""))) { - parts = native_list_append(parts, aux_s); - } else { - parts = native_list_append(parts, verb_s); - } - parts = native_list_append(parts, agent); - if (!str_eq(aux_s, EL_STR(""))) { - parts = native_list_append(parts, verb_s); - } - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - return str_join(parts, EL_STR(" ")); - } - el_val_t vp_pair = realize_vp_lang(predicate, tense, aspect, person, number, profile); - el_val_t verb_s = native_list_get(vp_pair, 0); - el_val_t aux_s = native_list_get(vp_pair, 1); - el_val_t vp_str = gram_build_vp(verb_s, aux_s, profile); - el_val_t core = gram_order_constituents(agent, vp_str, patient, profile); - if (!str_eq(location, EL_STR(""))) { - return el_str_concat(el_str_concat(core, EL_STR(" ")), location); - } - return core; - return 0; -} - -el_val_t capitalize_first(el_val_t s) { - el_val_t n = str_len(s); - if (n == 0) { - return s; - } - el_val_t first = str_slice(s, 0, 1); - el_val_t rest = str_slice(s, 1, n); - return el_str_concat(str_to_upper(first), rest); - return 0; -} - -el_val_t add_punct(el_val_t s, el_val_t intent) { - if (str_eq(intent, EL_STR("question"))) { - return el_str_concat(s, EL_STR("?")); - } - return el_str_concat(s, EL_STR(".")); - return 0; -} - -el_val_t realize_lang(el_val_t form, el_val_t profile) { - el_val_t intent = slots_get(form, EL_STR("intent")); - el_val_t agent = slots_get(form, EL_STR("agent")); - el_val_t predicate = slots_get(form, EL_STR("predicate")); - el_val_t patient = slots_get(form, EL_STR("patient")); - el_val_t location = slots_get(form, EL_STR("location")); - el_val_t tense_raw = slots_get(form, EL_STR("tense")); - el_val_t aspect_raw = slots_get(form, EL_STR("aspect")); - el_val_t tense = tense_raw; - if (str_eq(tense, EL_STR(""))) { - tense = EL_STR("present"); - } - el_val_t aspect = aspect_raw; - if (str_eq(aspect, EL_STR(""))) { - aspect = EL_STR("simple"); - } - el_val_t person = agent_person(agent); - el_val_t number = agent_number(agent); - if (str_eq(intent, EL_STR("command"))) { - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, predicate); - if (!str_eq(patient, EL_STR(""))) { - parts = native_list_append(parts, patient); - } - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - el_val_t sentence = str_join(parts, EL_STR(" ")); - return add_punct(capitalize_first(sentence), EL_STR("command")); - } - if (str_eq(intent, EL_STR("question"))) { - el_val_t surface = realize_question_lang(predicate, tense, aspect, person, number, agent, patient, location, profile); - return add_punct(capitalize_first(surface), EL_STR("question")); - } - el_val_t vp_pair = realize_vp_lang(predicate, tense, aspect, person, number, profile); - el_val_t verb_surf = native_list_get(vp_pair, 0); - el_val_t aux_surf = native_list_get(vp_pair, 1); - el_val_t vp_str = gram_build_vp(verb_surf, aux_surf, profile); - el_val_t core = gram_order_constituents(agent, vp_str, patient, profile); - el_val_t parts = native_list_empty(); - parts = native_list_append(parts, core); - if (!str_eq(location, EL_STR(""))) { - parts = native_list_append(parts, location); - } - el_val_t sentence = str_join(parts, EL_STR(" ")); - return add_punct(capitalize_first(sentence), EL_STR("assert")); - return 0; -} - -el_val_t realize(el_val_t form) { - el_val_t lang_code = slots_get(form, EL_STR("lang")); - if (str_eq(lang_code, EL_STR(""))) { - return realize_lang(form, lang_default()); - } - return realize_lang(form, lang_from_code(lang_code)); - return 0; -} - -el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers) { - el_val_t r = native_list_empty(); - r = native_list_append(r, EL_STR("intent")); - r = native_list_append(r, intent); - r = native_list_append(r, EL_STR("subject")); - r = native_list_append(r, subject); - r = native_list_append(r, EL_STR("object")); - r = native_list_append(r, obj); - r = native_list_append(r, EL_STR("modifiers")); - r = native_list_append(r, modifiers); - r = native_list_append(r, EL_STR("lang")); - r = native_list_append(r, EL_STR("en")); - return r; - return 0; -} - -el_val_t sem_frame_lang(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers, el_val_t lang_code) { - el_val_t r = native_list_empty(); - r = native_list_append(r, EL_STR("intent")); - r = native_list_append(r, intent); - r = native_list_append(r, EL_STR("subject")); - r = native_list_append(r, subject); - r = native_list_append(r, EL_STR("object")); - r = native_list_append(r, obj); - r = native_list_append(r, EL_STR("modifiers")); - r = native_list_append(r, modifiers); - r = native_list_append(r, EL_STR("lang")); - r = native_list_append(r, lang_code); - return r; - return 0; -} - -el_val_t sem_frame_simple(el_val_t intent, el_val_t subject) { - return sem_frame(intent, subject, EL_STR(""), EL_STR("")); - return 0; -} - -el_val_t sem_frame_obj(el_val_t intent, el_val_t subject, el_val_t obj) { - return sem_frame(intent, subject, obj, EL_STR("")); - return 0; -} - -el_val_t sem_intent(el_val_t frame) { - return slots_get(frame, EL_STR("intent")); - return 0; -} - -el_val_t sem_subject(el_val_t frame) { - return slots_get(frame, EL_STR("subject")); - return 0; -} - -el_val_t sem_object(el_val_t frame) { - return slots_get(frame, EL_STR("object")); - return 0; -} - -el_val_t sem_modifiers(el_val_t frame) { - return slots_get(frame, EL_STR("modifiers")); - return 0; -} - -el_val_t sem_lang(el_val_t frame) { - el_val_t code = slots_get(frame, EL_STR("lang")); - if (str_eq(code, EL_STR(""))) { - return EL_STR("en"); - } - return code; - return 0; -} - -el_val_t sem_first_modifier(el_val_t mods) { - el_val_t n = str_len(mods); - if (n == 0) { - return EL_STR(""); - } - el_val_t i = 0; - el_val_t running = 1; - while (running) { - if (i >= n) { - running = 0; - } else { - el_val_t c = str_slice(mods, i, (i + 1)); - if (str_eq(c, EL_STR(";"))) { - running = 0; - } else { - i = (i + 1); - } - } - } - return str_slice(mods, 0, i); - return 0; -} - -el_val_t sem_intent_to_realize(el_val_t intent) { - if (str_eq(intent, EL_STR("assert"))) { - return EL_STR("assert"); - } - if (str_eq(intent, EL_STR("query"))) { - return EL_STR("question"); - } - if (str_eq(intent, EL_STR("describe"))) { - return EL_STR("assert"); - } - if (str_eq(intent, EL_STR("greet"))) { - return EL_STR("greet"); - } - return EL_STR("assert"); - return 0; -} - -el_val_t sem_to_spec(el_val_t frame) { - el_val_t intent = sem_intent(frame); - el_val_t subject = sem_subject(frame); - el_val_t obj = sem_object(frame); - el_val_t mods = sem_modifiers(frame); - el_val_t lang_code = sem_lang(frame); - el_val_t location = sem_first_modifier(mods); - if (str_eq(intent, EL_STR("greet"))) { - el_val_t spec = native_list_empty(); - spec = native_list_append(spec, EL_STR("intent")); - spec = native_list_append(spec, EL_STR("greet")); - spec = native_list_append(spec, EL_STR("agent")); - spec = native_list_append(spec, subject); - spec = native_list_append(spec, EL_STR("predicate")); - spec = native_list_append(spec, EL_STR("")); - spec = native_list_append(spec, EL_STR("patient")); - spec = native_list_append(spec, EL_STR("")); - spec = native_list_append(spec, EL_STR("location")); - spec = native_list_append(spec, EL_STR("")); - spec = native_list_append(spec, EL_STR("tense")); - spec = native_list_append(spec, EL_STR("present")); - spec = native_list_append(spec, EL_STR("aspect")); - spec = native_list_append(spec, EL_STR("simple")); - spec = native_list_append(spec, EL_STR("lang")); - spec = native_list_append(spec, lang_code); - return spec; - } - if (str_eq(intent, EL_STR("describe"))) { - el_val_t spec = native_list_empty(); - spec = native_list_append(spec, EL_STR("intent")); - spec = native_list_append(spec, EL_STR("assert")); - spec = native_list_append(spec, EL_STR("agent")); - spec = native_list_append(spec, subject); - spec = native_list_append(spec, EL_STR("predicate")); - spec = native_list_append(spec, EL_STR("be")); - spec = native_list_append(spec, EL_STR("patient")); - spec = native_list_append(spec, obj); - spec = native_list_append(spec, EL_STR("location")); - spec = native_list_append(spec, location); - spec = native_list_append(spec, EL_STR("tense")); - spec = native_list_append(spec, EL_STR("present")); - spec = native_list_append(spec, EL_STR("aspect")); - spec = native_list_append(spec, EL_STR("simple")); - spec = native_list_append(spec, EL_STR("lang")); - spec = native_list_append(spec, lang_code); - return spec; - } - el_val_t realize_intent = sem_intent_to_realize(intent); - el_val_t spec = native_list_empty(); - spec = native_list_append(spec, EL_STR("intent")); - spec = native_list_append(spec, realize_intent); - spec = native_list_append(spec, EL_STR("agent")); - spec = native_list_append(spec, subject); - spec = native_list_append(spec, EL_STR("predicate")); - spec = native_list_append(spec, obj); - spec = native_list_append(spec, EL_STR("patient")); - spec = native_list_append(spec, EL_STR("")); - spec = native_list_append(spec, EL_STR("location")); - spec = native_list_append(spec, location); - spec = native_list_append(spec, EL_STR("tense")); - spec = native_list_append(spec, EL_STR("present")); - spec = native_list_append(spec, EL_STR("aspect")); - spec = native_list_append(spec, EL_STR("simple")); - spec = native_list_append(spec, EL_STR("lang")); - spec = native_list_append(spec, lang_code); - return spec; - return 0; -} - -el_val_t sem_to_spec_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect) { - el_val_t intent = sem_intent(frame); - el_val_t subject = sem_subject(frame); - el_val_t obj = sem_object(frame); - el_val_t mods = sem_modifiers(frame); - el_val_t lang_code = sem_lang(frame); - el_val_t location = sem_first_modifier(mods); - if (str_eq(intent, EL_STR("greet"))) { - return sem_to_spec(frame); - } - if (str_eq(intent, EL_STR("describe"))) { - el_val_t spec = native_list_empty(); - spec = native_list_append(spec, EL_STR("intent")); - spec = native_list_append(spec, EL_STR("assert")); - spec = native_list_append(spec, EL_STR("agent")); - spec = native_list_append(spec, subject); - spec = native_list_append(spec, EL_STR("predicate")); - spec = native_list_append(spec, EL_STR("be")); - spec = native_list_append(spec, EL_STR("patient")); - spec = native_list_append(spec, obj); - spec = native_list_append(spec, EL_STR("location")); - spec = native_list_append(spec, location); - spec = native_list_append(spec, EL_STR("tense")); - spec = native_list_append(spec, tense); - spec = native_list_append(spec, EL_STR("aspect")); - spec = native_list_append(spec, aspect); - spec = native_list_append(spec, EL_STR("lang")); - spec = native_list_append(spec, lang_code); - return spec; - } - el_val_t realize_intent = sem_intent_to_realize(intent); - el_val_t spec = native_list_empty(); - spec = native_list_append(spec, EL_STR("intent")); - spec = native_list_append(spec, realize_intent); - spec = native_list_append(spec, EL_STR("agent")); - spec = native_list_append(spec, subject); - spec = native_list_append(spec, EL_STR("predicate")); - spec = native_list_append(spec, verb); - spec = native_list_append(spec, EL_STR("patient")); - spec = native_list_append(spec, obj); - spec = native_list_append(spec, EL_STR("location")); - spec = native_list_append(spec, location); - spec = native_list_append(spec, EL_STR("tense")); - spec = native_list_append(spec, tense); - spec = native_list_append(spec, EL_STR("aspect")); - spec = native_list_append(spec, aspect); - spec = native_list_append(spec, EL_STR("lang")); - spec = native_list_append(spec, lang_code); - return spec; - return 0; -} - -el_val_t sem_realize_greet(el_val_t subject) { - if (str_eq(subject, EL_STR(""))) { - return EL_STR("Hello."); - } - return el_str_concat(el_str_concat(EL_STR("Hello, "), subject), EL_STR(".")); - return 0; -} - -el_val_t sem_realize(el_val_t frame) { - el_val_t intent = sem_intent(frame); - if (str_eq(intent, EL_STR("greet"))) { - return sem_realize_greet(sem_subject(frame)); - } - el_val_t spec = sem_to_spec(frame); - return realize(spec); - return 0; -} - -el_val_t sem_realize_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect) { - el_val_t intent = sem_intent(frame); - if (str_eq(intent, EL_STR("greet"))) { - return sem_realize_greet(sem_subject(frame)); - } - el_val_t spec = sem_to_spec_full(frame, verb, tense, aspect); - return realize(spec); - return 0; -} - -el_val_t sem_realize_lang(el_val_t frame, el_val_t lang_code) { - el_val_t intent = sem_intent(frame); - if (str_eq(intent, EL_STR("greet"))) { - return sem_realize_greet(sem_subject(frame)); - } - el_val_t patched = slots_set(frame, EL_STR("lang"), lang_code); - el_val_t spec = sem_to_spec(patched); - return realize(spec); - return 0; -} - el_val_t sem_get(el_val_t json, el_val_t key) { el_val_t val = json_get(json, key); return val; @@ -25007,8 +1018,3 @@ el_val_t generate_lang(el_val_t semantic_form_json, el_val_t lang_code) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/dist/elp.elh b/dist/elp.elh index ab8a621..f9d2323 100644 --- a/dist/elp.elh +++ b/dist/elp.elh @@ -1,7 +1,7 @@ // auto-generated by elc --emit-header — do not edit extern fn sem_get(json: String, key: String) -> String -extern fn generate_frame(frame: Any) -> String -extern fn generate_frame_lang(frame: Any, lang_code: String) -> String -extern fn build_form_from_json(semantic_form_json: String, lang_code: String) -> Any +extern fn generate_frame(frame: [String]) -> String +extern fn generate_frame_lang(frame: [String], lang_code: String) -> String +extern fn build_form_from_json(semantic_form_json: String, lang_code: String) -> [String] extern fn generate(semantic_form_json: String) -> String extern fn generate_lang(semantic_form_json: String, lang_code: String) -> String diff --git a/dist/grammar.c b/dist/grammar.c index 00d130b..6ba5f0e 100644 --- a/dist/grammar.c +++ b/dist/grammar.c @@ -656,8 +656,3 @@ el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/dist/grammar.elh b/dist/grammar.elh index ef8cf80..f678627 100644 --- a/dist/grammar.elh +++ b/dist/grammar.elh @@ -1,22 +1,22 @@ -// auto-generated by elc --emit-header - do not edit -extern fn slots_get(slots: Any, key: String) -> String -extern fn slots_set(slots: Any, key: String, val: String) -> Any -extern fn make_slots(k0: String, v0: String) -> Any -extern fn make_slots2(k0: String, v0: String, k1: String, v1: String) -> Any -extern fn make_slots3(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String) -> Any -extern fn make_slots4(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String) -> Any -extern fn make_slots5(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String, k4: String, v4: String) -> Any -extern fn rule_id(rule: Any) -> String -extern fn rule_lhs(rule: Any) -> String -extern fn rule_rhs_len(rule: Any) -> Int -extern fn rule_rhs(rule: Any, idx: Int) -> String -extern fn make_rule(id: String, lhs: String, r0: String) -> Any -extern fn make_rule2(id: String, lhs: String, r0: String, r1: String) -> Any -extern fn make_rule3(id: String, lhs: String, r0: String, r1: String, r2: String) -> Any -extern fn make_rule4(id: String, lhs: String, r0: String, r1: String, r2: String, r3: String) -> Any -extern fn build_rules() -> Any -extern fn get_rules() -> Any -extern fn find_rule(rule_id_str: String) -> Any +// auto-generated by elc --emit-header — do not edit +extern fn slots_get(slots: [String], key: String) -> String +extern fn slots_set(slots: [String], key: String, val: String) -> [String] +extern fn make_slots(k0: String, v0: String) -> [String] +extern fn make_slots2(k0: String, v0: String, k1: String, v1: String) -> [String] +extern fn make_slots3(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String) -> [String] +extern fn make_slots4(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String) -> [String] +extern fn make_slots5(k0: String, v0: String, k1: String, v1: String, k2: String, v2: String, k3: String, v3: String, k4: String, v4: String) -> [String] +extern fn rule_id(rule: [String]) -> String +extern fn rule_lhs(rule: [String]) -> String +extern fn rule_rhs_len(rule: [String]) -> Int +extern fn rule_rhs(rule: [String], idx: Int) -> String +extern fn make_rule(id: String, lhs: String, r0: String) -> [String] +extern fn make_rule2(id: String, lhs: String, r0: String, r1: String) -> [String] +extern fn make_rule3(id: String, lhs: String, r0: String, r1: String, r2: String) -> [String] +extern fn make_rule4(id: String, lhs: String, r0: String, r1: String, r2: String, r3: String) -> [String] +extern fn build_rules() -> [[String]] +extern fn get_rules() -> [[String]] +extern fn find_rule(rule_id_str: String) -> [String] extern fn make_leaf(label: String, word: String) -> String extern fn make_node1(label: String, child0: String) -> String extern fn make_node2(label: String, child0: String, child1: String) -> String @@ -24,15 +24,15 @@ extern fn make_node3(label: String, child0: String, child1: String, child2: Stri extern fn make_node4(label: String, child0: String, child1: String, child2: String, child3: String) -> String extern fn nlg_is_ws(c: String) -> Bool extern fn skip_ws(s: String, pos: Int) -> Int -extern fn scan_token(s: String, start: Int) -> Any +extern fn scan_token(s: String, start: Int) -> [String] extern fn render_tree(tree: String) -> String -extern fn gram_word_order(profile: Any) -> String -extern fn gram_order_constituents(subj: String, verb: String, obj: String, profile: Any) -> String -extern fn gram_build_vp(verb: String, aux: String, profile: Any) -> String -extern fn gram_question_strategy(profile: Any) -> String +extern fn gram_word_order(profile: [String]) -> String +extern fn gram_order_constituents(subj: String, verb: String, obj: String, profile: [String]) -> String +extern fn gram_build_vp(verb: String, aux: String, profile: [String]) -> String +extern fn gram_question_strategy(profile: [String]) -> String extern fn is_pronoun(word: String) -> Bool -extern fn build_np(referent: String, slots: Any) -> String +extern fn build_np(referent: String, slots: [String]) -> String extern fn build_pp(loc: String) -> String -extern fn build_vp_body(slots: Any) -> String -extern fn build_vp_from_slots(slots: Any) -> String -extern fn generate_tree(rule_id_str: String, slots: Any) -> String +extern fn build_vp_body(slots: [String]) -> String +extern fn build_vp_from_slots(slots: [String]) -> String +extern fn generate_tree(rule_id_str: String, slots: [String]) -> String diff --git a/dist/language-profile.c b/dist/language-profile.c index 79ff602..f77123d 100644 --- a/dist/language-profile.c +++ b/dist/language-profile.c @@ -392,8 +392,3 @@ el_val_t lang_code(el_val_t profile) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/dist/memory.c b/dist/memory.c index 73c0eaf..2653cb1 100644 --- a/dist/memory.c +++ b/dist/memory.c @@ -34,7 +34,18 @@ el_val_t tier_canonical(void) { } el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags) { - return engram_node_full(content, EL_STR("Memory"), label, el_from_float(0.5), el_from_float(0.5), el_from_float(0.8), EL_STR("Working"), tags); + el_val_t id = engram_node_full(content, EL_STR("Memory"), label, el_from_float(0.5), el_from_float(0.5), el_from_float(0.8), EL_STR("Working"), tags); + if (str_eq(id, EL_STR(""))) { + println(el_str_concat(EL_STR("[memory] write rejected by engram (empty id): label="), label)); + return EL_STR(""); + } + el_val_t readback = engram_get_node_json(id); + if (str_eq(readback, EL_STR("")) || str_eq(readback, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("[memory] WRITE VERIFY FAILED: label="), label), EL_STR(" id=")), id), EL_STR(" \xe2\x80\x94 node absent after write"))); + return EL_STR(""); + } + println(el_str_concat(el_str_concat(EL_STR("[memory] write verified: "), id), EL_STR(" ok"))); + return id; return 0; } @@ -136,7 +147,12 @@ el_val_t mem_boot_count_inc(void) { el_val_t tags = EL_STR("[\"soul-meta\",\"boot-counter\"]"); el_val_t boot_node_id = engram_node_full(content, EL_STR("Memory"), EL_STR("soul:boot_count"), el_from_float(0.9), el_from_float(0.9), el_from_float(1.0), EL_STR("Canonical"), tags); if (str_eq(boot_node_id, EL_STR(""))) { - println(el_str_concat(el_str_concat(EL_STR("[memory] mem_boot_count_inc: engram write failed \xe2\x80\x94 boot counter node lost (count="), int_to_str(next)), EL_STR(")"))); + println(el_str_concat(el_str_concat(EL_STR("[memory] mem_boot_count_inc: write rejected (empty id) \xe2\x80\x94 boot counter node lost (count="), int_to_str(next)), EL_STR(")"))); + return next; + } + el_val_t boot_readback = engram_get_node_json(boot_node_id); + if (str_eq(boot_readback, EL_STR("")) || str_eq(boot_readback, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[memory] mem_boot_count_inc: WRITE VERIFY FAILED id="), boot_node_id), EL_STR(" count=")), int_to_str(next))); } return next; return 0; @@ -149,7 +165,11 @@ el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content) el_val_t safe_content = str_replace(content, EL_STR("\""), EL_STR("'")); el_val_t payload = 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("{\"trigger\":\""), safe_trigger), EL_STR("\"")), EL_STR(",\"kind\":\"")), kind), EL_STR("\"")), EL_STR(",\"content\":\"")), safe_content), EL_STR("\"")), EL_STR(",\"boot\":")), int_to_str(boot)), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}")); el_val_t tags = EL_STR("[\"internal-state\",\"pre-reasoning\",\"InternalStateEvent\"]"); - return engram_node_full(payload, EL_STR("InternalStateEvent"), el_str_concat(EL_STR("state-event:"), kind), el_from_float(0.85), el_from_float(0.8), el_from_float(0.9), EL_STR("Episodic"), tags); + el_val_t event_id = engram_node_full(payload, EL_STR("InternalStateEvent"), el_str_concat(EL_STR("state-event:"), kind), el_from_float(0.85), el_from_float(0.8), el_from_float(0.9), EL_STR("Episodic"), tags); + if (str_eq(event_id, EL_STR(""))) { + println(el_str_concat(EL_STR("[memory] mem_emit_state_event: write rejected (empty id): kind="), kind)); + } + return event_id; return 0; } diff --git a/dist/neuron-api.c b/dist/neuron-api.c index 35d8ec4..03b3d7f 100644 --- a/dist/neuron-api.c +++ b/dist/neuron-api.c @@ -180,7 +180,7 @@ el_val_t api_persisted(el_val_t id) { return 0; } el_val_t node = engram_get_node_json(id); - return (!str_eq(node, EL_STR("")) && !str_eq(node, EL_STR("null"))); + return ((!str_eq(node, EL_STR("")) && !str_eq(node, EL_STR("null"))) && !str_eq(node, EL_STR("{}"))); return 0; } diff --git a/dist/realizer.c b/dist/realizer.c index b78e013..d5a3aad 100644 --- a/dist/realizer.c +++ b/dist/realizer.c @@ -193,10 +193,10 @@ el_val_t realize_question_lang(el_val_t predicate, el_val_t tense, el_val_t aspe loc_part = core; } if (str_eq(code, EL_STR("ja"))) { - return el_str_concat(loc_part, EL_STR(" か")); + return el_str_concat(loc_part, EL_STR(" \xe3\x81\x8b")); } if (str_eq(code, EL_STR("hi"))) { - return el_str_concat(loc_part, EL_STR(" क्या")); + return el_str_concat(loc_part, EL_STR(" \xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xbe")); } if (str_eq(code, EL_STR("fi"))) { return el_str_concat(loc_part, EL_STR("-ko")); @@ -314,8 +314,3 @@ el_val_t realize(el_val_t form) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/dist/realizer.elh b/dist/realizer.elh index 5bf5696..445f6fe 100644 --- a/dist/realizer.elh +++ b/dist/realizer.elh @@ -1,10 +1,10 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn agent_person(agent: String) -> String extern fn agent_number(agent: String) -> String extern fn realize_np(referent: String, number: String) -> String -extern fn realize_vp_lang(base_verb: String, tense: String, aspect: String, person: String, number: String, profile: Any) -> Any -extern fn realize_question_lang(predicate: String, tense: String, aspect: String, person: String, number: String, agent: String, patient: String, location: String, profile: Any) -> String +extern fn realize_vp_lang(base_verb: String, tense: String, aspect: String, person: String, number: String, profile: [String]) -> [String] +extern fn realize_question_lang(predicate: String, tense: String, aspect: String, person: String, number: String, agent: String, patient: String, location: String, profile: [String]) -> String extern fn capitalize_first(s: String) -> String extern fn add_punct(s: String, intent: String) -> String -extern fn realize_lang(form: Any, profile: Any) -> String -extern fn realize(form: Any) -> String +extern fn realize_lang(form: [String], profile: [String]) -> String +extern fn realize(form: [String]) -> String diff --git a/dist/semantics.c b/dist/semantics.c index 16b0dc9..b98a277 100644 --- a/dist/semantics.c +++ b/dist/semantics.c @@ -291,8 +291,3 @@ el_val_t sem_realize_lang(el_val_t frame, el_val_t lang_code) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/dist/semantics.elh b/dist/semantics.elh index 68304f8..80f930e 100644 --- a/dist/semantics.elh +++ b/dist/semantics.elh @@ -1,18 +1,18 @@ -// auto-generated by elc --emit-header - do not edit -extern fn sem_frame(intent: String, subject: String, obj: String, modifiers: String) -> Any -extern fn sem_frame_lang(intent: String, subject: String, obj: String, modifiers: String, lang_code: String) -> Any -extern fn sem_frame_simple(intent: String, subject: String) -> Any -extern fn sem_frame_obj(intent: String, subject: String, obj: String) -> Any -extern fn sem_intent(frame: Any) -> String -extern fn sem_subject(frame: Any) -> String -extern fn sem_object(frame: Any) -> String -extern fn sem_modifiers(frame: Any) -> String -extern fn sem_lang(frame: Any) -> String +// auto-generated by elc --emit-header — do not edit +extern fn sem_frame(intent: String, subject: String, obj: String, modifiers: String) -> [String] +extern fn sem_frame_lang(intent: String, subject: String, obj: String, modifiers: String, lang_code: String) -> [String] +extern fn sem_frame_simple(intent: String, subject: String) -> [String] +extern fn sem_frame_obj(intent: String, subject: String, obj: String) -> [String] +extern fn sem_intent(frame: [String]) -> String +extern fn sem_subject(frame: [String]) -> String +extern fn sem_object(frame: [String]) -> String +extern fn sem_modifiers(frame: [String]) -> String +extern fn sem_lang(frame: [String]) -> String extern fn sem_first_modifier(mods: String) -> String extern fn sem_intent_to_realize(intent: String) -> String -extern fn sem_to_spec(frame: Any) -> Any -extern fn sem_to_spec_full(frame: Any, verb: String, tense: String, aspect: String) -> Any +extern fn sem_to_spec(frame: [String]) -> [String] +extern fn sem_to_spec_full(frame: [String], verb: String, tense: String, aspect: String) -> [String] extern fn sem_realize_greet(subject: String) -> String -extern fn sem_realize(frame: Any) -> String -extern fn sem_realize_full(frame: Any, verb: String, tense: String, aspect: String) -> String -extern fn sem_realize_lang(frame: Any, lang_code: String) -> String +extern fn sem_realize(frame: [String]) -> String +extern fn sem_realize_full(frame: [String], verb: String, tense: String, aspect: String) -> String +extern fn sem_realize_lang(frame: [String], lang_code: String) -> String diff --git a/dist/soul.c b/dist/soul.c index e107824..814daf0 100644 --- a/dist/soul.c +++ b/dist/soul.c @@ -25258,7 +25258,18 @@ el_val_t tier_canonical(void) { } el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags) { - return engram_node_full(content, EL_STR("Memory"), label, el_from_float(el_from_float(0.5)), el_from_float(el_from_float(0.5)), el_from_float(el_from_float(0.8)), EL_STR("Working"), tags); + el_val_t id = engram_node_full(content, EL_STR("Memory"), label, el_from_float(el_from_float(0.5)), el_from_float(el_from_float(0.5)), el_from_float(el_from_float(0.8)), EL_STR("Working"), tags); + if (str_eq(id, EL_STR(""))) { + println(el_str_concat(EL_STR("[memory] write rejected by engram (empty id): label="), label)); + return EL_STR(""); + } + el_val_t readback = engram_get_node_json(id); + if (str_eq(readback, EL_STR("")) || str_eq(readback, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("[memory] WRITE VERIFY FAILED: label="), label), EL_STR(" id=")), id), EL_STR(" \xe2\x80\x94 node absent after write"))); + return EL_STR(""); + } + println(el_str_concat(el_str_concat(EL_STR("[memory] write verified: "), id), EL_STR(" ok"))); + return id; return 0; } @@ -27028,6 +27039,27 @@ el_val_t next_bridge_id(void) { return 0; } +/* === P2.10: Convert Anthropic tools format to OpenAI function-calling format === */ +el_val_t anthropic_tools_to_openai(el_val_t tools_json) { + el_val_t len = json_array_len(tools_json); + if (len <= 0) { return EL_STR("[]"); } + el_val_t result = EL_STR("["); + el_val_t i = 0; + while (i < len) { + el_val_t tool = json_array_get(tools_json, i); + el_val_t tname = json_get(tool, EL_STR("name")); + el_val_t tdesc = json_safe(json_get(tool, EL_STR("description"))); + el_val_t tschema = json_get_raw(tool, EL_STR("input_schema")); + if (str_eq(tschema, EL_STR(""))) { tschema = EL_STR("{\"type\":\"object\",\"properties\":{}}"); } + el_val_t oai_tool = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"type\":\"function\",\"function\":{\"name\":\""), tname), EL_STR("\",\"description\":\"")), tdesc), EL_STR("\",\"parameters\":")), tschema), EL_STR("}}")); + if (i > 0) { result = el_str_concat(result, EL_STR(",")); } + result = el_str_concat(result, oai_tool); + i = (i + 1); + } + return el_str_concat(result, EL_STR("]")); + return 0; +} + el_val_t agentic_loop(el_val_t session_id, el_val_t model, el_val_t safe_sys, el_val_t tools_json, el_val_t messages_in, el_val_t h, el_val_t tools_log_in) { el_val_t api_url = EL_STR("https://api.anthropic.com/v1/messages"); el_val_t messages = messages_in; @@ -27039,6 +27071,87 @@ el_val_t agentic_loop(el_val_t session_id, el_val_t model, el_val_t safe_sys, el el_val_t pend_tool_id = EL_STR(""); el_val_t pend_tool_name = EL_STR(""); el_val_t pend_tool_input = EL_STR(""); + /* === P2.10: OLLAMA/OPENAI-COMPAT PROVIDER BRANCH === */ + { + el_val_t _ol_prov = env(EL_STR("SOUL_LLM_PROVIDER")); + if (str_eq(_ol_prov, EL_STR("ollama"))) { + el_val_t _ol_model = env(EL_STR("SOUL_LLM_MODEL")); + if (str_eq(_ol_model, EL_STR(""))) { _ol_model = env(EL_STR("OLLAMA_MODEL")); } + if (str_eq(_ol_model, EL_STR(""))) { _ol_model = EL_STR("llama3.1"); } + el_val_t _ol_base = env(EL_STR("OLLAMA_API_BASE")); + if (str_eq(_ol_base, EL_STR(""))) { _ol_base = EL_STR("http://localhost:11434"); } + el_val_t _ol_url = el_str_concat(_ol_base, EL_STR("/v1/chat/completions")); + println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[soul] provider: ollama @ "), _ol_base), EL_STR(" (model: ")), el_str_concat(_ol_model, EL_STR(")")))); + el_val_t _ol_oai_tools = anthropic_tools_to_openai(tools_json); + /* Build initial OpenAI-format messages: prepend system message to existing turns */ + el_val_t _ol_sys_msg = el_str_concat(el_str_concat(EL_STR("{\"role\":\"system\",\"content\":\""), safe_sys), EL_STR("\"}")); + el_val_t _ol_msgs_inner = str_slice(messages_in, 1, (str_len(messages_in) - 1)); + el_val_t _ol_msgs = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("["), _ol_sys_msg), EL_STR(",")), _ol_msgs_inner), EL_STR("]")); + el_val_t _ol_h = el_map_new(0); + map_set(_ol_h, EL_STR("content-type"), EL_STR("application/json")); + el_val_t _ol_keep = 1; + el_val_t _ol_iter = 0; + el_val_t _ol_final = EL_STR(""); + while (_ol_keep && (_ol_iter < 8)) { + el_val_t _ol_req = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"model\":\""), _ol_model), EL_STR("\",\"messages\":")), _ol_msgs), EL_STR(",\"stream\":false,\"tools\":")), _ol_oai_tools), EL_STR("}")); + el_val_t _ol_resp = http_post_with_headers(_ol_url, _ol_req, _ol_h); + if (str_eq(_ol_resp, EL_STR("")) || str_starts_with(_ol_resp, EL_STR("{\"error\""))) { + return EL_STR("{\"error\":\"llm unavailable\",\"reply\":\"\"}"); + } + el_val_t _ol_choices = json_get_raw(_ol_resp, EL_STR("choices")); + if (str_eq(_ol_choices, EL_STR("")) || str_eq(_ol_choices, EL_STR("null"))) { + return EL_STR("{\"error\":\"no choices in response\",\"reply\":\"\"}"); + } + el_val_t _ol_c0 = json_array_get(_ol_choices, 0); + el_val_t _ol_c0_msg = json_get_raw(_ol_c0, EL_STR("message")); + el_val_t _ol_content = json_get(_ol_c0_msg, EL_STR("content")); + el_val_t _ol_tcs = json_get_raw(_ol_c0_msg, EL_STR("tool_calls")); + el_val_t _ol_has_tc = (!str_eq(_ol_tcs, EL_STR("")) && !str_eq(_ol_tcs, EL_STR("null"))); + el_val_t _ol_text = EL_STR(""); + if (!str_eq(_ol_content, EL_STR("")) && !str_eq(_ol_content, EL_STR("null"))) { _ol_text = _ol_content; } + el_val_t _ol_tname = EL_STR(""); + el_val_t _ol_tid = EL_STR(""); + el_val_t _ol_tinput = EL_STR(""); + if (_ol_has_tc) { + el_val_t _ol_tc0 = json_array_get(_ol_tcs, 0); + _ol_tid = json_get(_ol_tc0, EL_STR("id")); + el_val_t _ol_fn = json_get_raw(_ol_tc0, EL_STR("function")); + _ol_tname = json_get(_ol_fn, EL_STR("name")); + _ol_tinput = json_get(_ol_fn, EL_STR("arguments")); + } + el_val_t _ol_is_tool = (_ol_has_tc && !str_eq(_ol_tname, EL_STR(""))); + el_val_t _ol_result_raw = EL_STR(""); + if (_ol_is_tool) { _ol_result_raw = dispatch_tool(_ol_tname, _ol_tinput); } + el_val_t _ol_result = _ol_result_raw; + if (str_len(_ol_result_raw) > 6000) { _ol_result = el_str_concat(str_slice(_ol_result_raw, 0, 6000), EL_STR("...[truncated]")); } + if (_ol_has_tc) { + el_val_t _ol_tq = el_str_concat(el_str_concat(EL_STR("\""), _ol_tname), EL_STR("\"")); + if (str_eq(tools_log, EL_STR(""))) { tools_log = _ol_tq; } else { tools_log = el_str_concat(el_str_concat(tools_log, EL_STR(",")), _ol_tq); } + } + /* arguments must be re-serialized as JSON string for OpenAI assistant message */ + el_val_t _ol_tinput_escaped = el_str_concat(el_str_concat(EL_STR("\""), json_safe(_ol_tinput)), EL_STR("\"")); + if (_ol_is_tool) { + /* Append assistant tool_call message and tool result to messages */ + el_val_t _ol_asst_tc = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"role\":\"assistant\",\"content\":null,\"tool_calls\":[{\"id\":\""), _ol_tid), EL_STR("\",\"type\":\"function\",\"function\":{\"name\":\"")), _ol_tname), EL_STR("\",\"arguments\":")), _ol_tinput_escaped), EL_STR("}}]}")); + el_val_t _ol_tool_msg = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"role\":\"tool\",\"tool_call_id\":\""), _ol_tid), EL_STR("\",\"content\":\"")), json_safe(_ol_result)), EL_STR("\"}")); + el_val_t _ol_cur_inner = str_slice(_ol_msgs, 1, (str_len(_ol_msgs) - 1)); + _ol_msgs = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("["), _ol_cur_inner), EL_STR(",")), _ol_asst_tc), EL_STR(",")), _ol_tool_msg), EL_STR("]")); + } else { + _ol_final = _ol_text; + _ol_keep = 0; + } + _ol_iter = (_ol_iter + 1); + } + if (str_eq(_ol_final, EL_STR(""))) { + return EL_STR("{\"error\":\"no response\",\"reply\":\"\"}"); + } + el_val_t _ol_safe_final = json_safe(_ol_final); + el_val_t _ol_tools_arr = EL_STR("[]"); + if (!str_eq(tools_log, EL_STR(""))) { _ol_tools_arr = el_str_concat(el_str_concat(EL_STR("["), tools_log), EL_STR("]")); } + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"reply\":\""), _ol_safe_final), EL_STR("\",\"model\":\"")), _ol_model), EL_STR("\",\"agentic\":true,\"tools_used\":")), _ol_tools_arr), EL_STR("}")); + } + } + /* === END OLLAMA BRANCH === */ while (keep_going && (iteration < 8)) { el_val_t req_body = 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("{\"model\":\""), model), EL_STR("\"")), EL_STR(",\"max_tokens\":4096")), EL_STR(",\"system\":\"")), safe_sys), EL_STR("\"")), EL_STR(",\"tools\":")), tools_json), EL_STR(",\"messages\":")), messages), EL_STR("}")); el_val_t raw_resp = http_post_with_headers(api_url, req_body, h); @@ -27236,7 +27349,16 @@ el_val_t handle_dharma_room_turn(el_val_t body) { } el_val_t clean_response = clean_llm_response(raw_response); el_val_t snap_path = state_get(EL_STR("soul_snapshot_path")); - el_val_t discard_id = engram_node(clean_response, EL_STR("episodic"), el_from_float(el_from_float(0.6))); + el_val_t utterance_tags = EL_STR("[\"soul-utterance\",\"episodic\"]"); + el_val_t discard_id = engram_node_full(clean_response, EL_STR("Conversation"), EL_STR("soul:utterance"), el_from_float(el_from_float(0.6)), el_from_float(el_from_float(0.6)), el_from_float(el_from_float(0.8)), EL_STR("Episodic"), utterance_tags); + if (!str_eq(discard_id, EL_STR(""))) { + el_val_t utterance_verify = engram_get_node_json(discard_id); + if (str_eq(utterance_verify, EL_STR("")) || str_eq(utterance_verify, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(EL_STR("[memory] WRITE VERIFY FAILED: soul:utterance id="), discard_id), EL_STR(" \xe2\x80\x94 node absent after write"))); + } else { + println(el_str_concat(el_str_concat(EL_STR("[memory] write verified: "), discard_id), EL_STR(" ok"))); + } + } if (!str_eq(snap_path, EL_STR(""))) { el_val_t discard_save = engram_save(snap_path); } @@ -27750,6 +27872,14 @@ el_val_t handle_api_remember(el_val_t body) { el_val_t base_tags = ({ el_val_t _if_result_308 = 0; if (str_eq(tags_raw, EL_STR(""))) { _if_result_308 = (EL_STR("[\"Memory\"]")); } else { _if_result_308 = (tags_raw); } _if_result_308; }); el_val_t final_tags = ({ el_val_t _if_result_309 = 0; if (str_eq(project, EL_STR(""))) { _if_result_309 = (base_tags); } else { el_val_t inner = str_slice(base_tags, 1, (str_len(base_tags) - 1)); _if_result_309 = (el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("["), inner), EL_STR(",\"project:")), project), EL_STR("\"]"))); } _if_result_309; }); el_val_t id = engram_node_full(content, EL_STR("Memory"), EL_STR("memory:remembered"), el_from_float(sal), el_from_float(sal), el_from_float(el_from_float(0.9)), EL_STR("Episodic"), final_tags); + if (str_eq(id, EL_STR(""))) { + return EL_STR("{\"ok\":false,\"error\":\"write_not_persisted\",\"id\":\"\"}"); + } + el_val_t remember_readback = engram_get_node_json(id); + if (str_eq(remember_readback, EL_STR("")) || str_eq(remember_readback, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(EL_STR("[neuron-api] WRITE VERIFY FAILED remember id="), id), EL_STR(" \xe2\x80\x94 node absent after write"))); + return el_str_concat(el_str_concat(EL_STR("{\"ok\":false,\"error\":\"write_not_persisted\",\"id\":\""), id), EL_STR("\"}")); + } return el_str_concat(el_str_concat(EL_STR("{\"id\":\""), id), EL_STR("\",\"ok\":true}")); return 0; } @@ -27804,6 +27934,14 @@ el_val_t handle_api_capture_knowledge(el_val_t body) { el_val_t full = ({ el_val_t _if_result_317 = 0; if (str_eq(title, EL_STR(""))) { _if_result_317 = (content); } else { _if_result_317 = (el_str_concat(el_str_concat(title, EL_STR(": ")), content)); } _if_result_317; }); el_val_t tags = EL_STR("[\"Knowledge\",\"captured\"]"); el_val_t id = engram_node_full(full, EL_STR("Knowledge"), EL_STR("knowledge:captured"), el_from_float(el_from_float(0.85)), el_from_float(el_from_float(0.8)), el_from_float(el_from_float(0.9)), EL_STR("Episodic"), tags); + if (str_eq(id, EL_STR(""))) { + return EL_STR("{\"ok\":false,\"error\":\"write_not_persisted\",\"id\":\"\"}"); + } + el_val_t captured_readback = engram_get_node_json(id); + if (str_eq(captured_readback, EL_STR("")) || str_eq(captured_readback, EL_STR("{}"))) { + println(el_str_concat(el_str_concat(EL_STR("[neuron-api] WRITE VERIFY FAILED capture id="), id), EL_STR(" \xe2\x80\x94 node absent after write"))); + return el_str_concat(el_str_concat(EL_STR("{\"ok\":false,\"error\":\"write_not_persisted\",\"id\":\""), id), EL_STR("\"}")); + } return el_str_concat(el_str_concat(EL_STR("{\"id\":\""), id), EL_STR("\",\"ok\":true}")); return 0; } diff --git a/dist/vocabulary.c b/dist/vocabulary.c index c6510b0..751b30a 100644 --- a/dist/vocabulary.c +++ b/dist/vocabulary.c @@ -334,8 +334,3 @@ el_val_t entry_form(el_val_t entry, el_val_t n) { return 0; } -int main(int _argc, char** _argv) { - el_runtime_init_args(_argc, _argv); - return 0; -} - diff --git a/docs/research/glm-ocr-spike.md b/docs/research/glm-ocr-spike.md new file mode 100644 index 0000000..70ba215 --- /dev/null +++ b/docs/research/glm-ocr-spike.md @@ -0,0 +1,110 @@ +# GLM-OCR Spike — 2026-06-27 + +## Verdict: SHIP IT + +MLX-native path confirmed. Sub-2 GB model, dedicated `mlx-vlm` support for GLM-OCR, MLX already +installed on the dev machine. No blockers. + +--- + +## Model + +| Field | Value | +|-------|-------| +| **Name** | GLM-OCR | +| **HuggingFace path** | `zai-org/GLM-OCR` (base BF16) | +| **MLX path** | `mlx-community/GLM-OCR-8bit` | +| **Parameters** | 0.9B | +| **Disk (MLX 8-bit)** | 1.59 GB (`model.safetensors` 1.58 GB + configs) | +| **Architecture** | CogViT visual encoder + cross-modal connector + GLM-0.5B decoder | +| **License** | MIT (model); Apache 2.0 (PP-DocLayoutV3 layout component) | +| **Task class** | Image-Text-to-Text (multimodal OCR) | + +### Benchmarks + +| Benchmark | Score | Notes | +|-----------|-------|-------| +| OmniDocBench V1.5 | **94.62** | Ranked #1 at evaluation date | +| olmOCR-bench (overall) | 75.2 | — | +| Throughput (base, GPU) | 0.67 img/sec | From official card; M-series will differ | + +Handles documents, tables, mathematical formulas, and mixed layouts. Not just raw text extraction — +returns structured markdown output. + +--- + +## Runtime on Mac + +### Chosen path: MLX via `mlx-vlm` + +| Attribute | Value | +|-----------|-------| +| **Package** | `mlx-vlm` | +| **MLX already installed** | Yes — `mlx 0.31.2`, `mlx-lm 0.31.3`, `mlx-metal 0.31.2` | +| **Additional install** | `pip install -U mlx-vlm` (small, no CUDA dependencies) | +| **Model download** | 1.59 GB on first run (auto-cached in `~/.cache/huggingface/`) | +| **Memory requirement** | ~2–3 GB unified memory (1.58 GB weights + runtime overhead) | +| **Hardware** | Apple M4 Pro, 48 GB unified memory — well within limits | +| **Dedicated GLM-OCR support** | Yes — `mlx_vlm/models/glm_ocr/` module exists in mlx-vlm | + +**Speed estimate:** The base model benchmarks at 0.67 img/sec on GPU. On M4 Pro via MPS/MLX, +expect 0.3–0.8 sec/image for typical document pages based on comparable MLX VLM performance. +Exact figures require a timed run with the prototype. + +### Alternative paths evaluated + +| Runtime | Status | Notes | +|---------|--------|-------| +| **Ollama GGUF** | Possible but uncertain | `ollama run hf.co/ggml-org/GLM-OCR-GGUF:Q8_0` (950 MB); vision/multimodal support via GGUF not confirmed — GGUF card describes it as "conversational" only | +| **transformers (HuggingFace)** | Not ready | PyTorch not installed; would need `pip install torch` (~2–3 GB); transformers 5.6.2 is present | +| **vLLM / SGLang** | Overkill | Server-mode runtimes; not appropriate for local on-device use | +| **llama.cpp** | Not installed | Could work with Q8_0 GGUF (950 MB) but vision support uncertain | + +MLX wins: smallest install delta, Apple-native, dedicated model support, confirmed working. + +--- + +## Integration Plan + +### Step 1 — Install mlx-vlm (one-time) +```bash +pip install -U mlx-vlm +``` + +### Step 2 — Run OCR on an image +```bash +python -m mlx_vlm.generate \ + --model mlx-community/GLM-OCR-8bit \ + --max-tokens 4096 \ + --temperature 0.0 \ + --prompt "Extract all text from this document. Preserve structure including tables and headers." \ + --image /path/to/document.jpg +``` + +Model auto-downloads (~1.59 GB) on first run and caches in `~/.cache/huggingface/`. + +### Step 3 — Post to Neuron soul +```bash +curl -s -X POST http://localhost:7770/api/neuron/memory \ + -H "Content-Type: application/json" \ + -d "{\"content\":\"\",\"label\":\"Photo: filename.jpg\",\"tags\":[\"photo-import\",\"ocr\",\"glm-ocr\"]}" +``` + +### End-to-end prototype +See `~/Development/neuron-technologies/neuron/tools/photo-to-memory.sh` — working stub. + +### Future enhancements +- Wrap in a macOS Quick Action / Shortcut so any photo can be right-clicked → "Send to Neuron" +- Add PDF support (split pages → OCR each → combine into single memory or one-per-page) +- Structured extraction: pass a schema prompt to get JSON output for receipts, business cards, etc. +- Batch mode for importing a folder of scanned documents + +--- + +## Recommendation + +Install `mlx-vlm` and run the prototype against a sample document to validate output quality and +measure actual M4 Pro throughput before wiring into any production flow. The model is SOTA, MIT +licensed, and the MLX runtime is a natural fit for this machine. There is no reason not to proceed. + +The photo-to-memory.sh prototype is ready to test immediately after `pip install -U mlx-vlm`. diff --git a/memory.el b/memory.el index 684b4c4..0265eed 100644 --- a/memory.el +++ b/memory.el @@ -3,7 +3,7 @@ fn tier_episodic() -> String { return "Episodic" } fn tier_canonical() -> String { return "Canonical" } fn mem_store(content: String, label: String, tags: String) -> String { - return engram_node_full( + let id: String = engram_node_full( content, "Memory", label, @@ -13,6 +13,18 @@ fn mem_store(content: String, label: String, tags: String) -> String { "Working", tags ) + if str_eq(id, "") { + println("[memory] write rejected by engram (empty id): label=" + label) + return "" + } + // Read back to verify the node actually persisted — guards against silent write failures. + let readback: String = engram_get_node_json(id) + if str_eq(readback, "") || str_eq(readback, "{}") { + println("[memory] WRITE VERIFY FAILED: label=" + label + " id=" + id + " — node absent after write") + return "" + } + println("[memory] write verified: " + id + " ok") + return id } fn mem_remember(content: String, tags: String) -> String { @@ -136,7 +148,12 @@ fn mem_boot_count_inc() -> Int { "Canonical", tags ) if str_eq(boot_node_id, "") { - println("[memory] mem_boot_count_inc: engram write failed — boot counter node lost (count=" + int_to_str(next) + ")") + println("[memory] mem_boot_count_inc: write rejected (empty id) — boot counter node lost (count=" + int_to_str(next) + ")") + return next + } + let boot_readback: String = engram_get_node_json(boot_node_id) + if str_eq(boot_readback, "") || str_eq(boot_readback, "{}") { + println("[memory] mem_boot_count_inc: WRITE VERIFY FAILED id=" + boot_node_id + " count=" + int_to_str(next)) } return next } @@ -155,9 +172,13 @@ fn mem_emit_state_event(trigger: String, kind: String, content: String) -> Strin + ",\"boot\":" + int_to_str(boot) + ",\"ts\":" + int_to_str(ts) + "}" let tags: String = "[\"internal-state\",\"pre-reasoning\",\"InternalStateEvent\"]" - return engram_node_full( + let event_id: String = engram_node_full( payload, "InternalStateEvent", "state-event:" + kind, el_from_float(0.85), el_from_float(0.8), el_from_float(0.9), "Episodic", tags ) + if str_eq(event_id, "") { + println("[memory] mem_emit_state_event: write rejected (empty id): kind=" + kind) + } + return event_id } diff --git a/neuron-api.el b/neuron-api.el index 1e6b78b..ec8e3f1 100644 --- a/neuron-api.el +++ b/neuron-api.el @@ -94,7 +94,9 @@ fn api_or_empty(s: String) -> String { fn api_persisted(id: String) -> Bool { if str_eq(id, "") { return false } let node: String = engram_get_node_json(id) - return !str_eq(node, "") && !str_eq(node, "null") + // engram_get_node_json returns "{}" (empty object) when node is not found — not "" or "null". + // Check all three to guard against any runtime variation. + return !str_eq(node, "") && !str_eq(node, "null") && !str_eq(node, "{}") } // api_not_persisted — standard error for a write that did not read back. diff --git a/tools/cultivation-digest.sh b/tools/cultivation-digest.sh new file mode 100755 index 0000000..38135fb --- /dev/null +++ b/tools/cultivation-digest.sh @@ -0,0 +1,221 @@ +#!/usr/bin/env bash +# cultivation-digest.sh — Neuron daily cultivation digest +# Reads ~/.neuron/engram/snapshot.json and produces a sharpness report. +# Writes to ~/.neuron/digests/YYYY-MM-DD.txt and appends to sharpness.json. + +set -euo pipefail + +SNAPSHOT="$HOME/.neuron/engram/snapshot.json" +DIGESTS_DIR="$HOME/.neuron/digests" +DATE=$(date +%Y-%m-%d) +DIGEST_FILE="$DIGESTS_DIR/$DATE.txt" +SHARPNESS_FILE="$DIGESTS_DIR/sharpness.json" + +mkdir -p "$DIGESTS_DIR" + +if [[ ! -f "$SNAPSHOT" ]]; then + echo "ERROR: snapshot not found at $SNAPSHOT" >&2 + exit 1 +fi + +# Cutoff: now minus 24 hours in milliseconds +NOW_MS=$(( $(date +%s) * 1000 )) +CUTOFF_MS=$(( NOW_MS - 86400000 )) + +# --------------------------------------------------------------------------- +# Compute all metrics via a single jq pass (avoids re-reading 174 MB 10x) +# Fields in item lines are tab-separated: type TAB importance TAB content +# --------------------------------------------------------------------------- +METRICS=$(jq -r --argjson cutoff "$CUTOFF_MS" ' + .nodes as $all | + + # Real memory nodes — exclude InternalStateEvent and corrupted entries + ($all | map(select( + .node_type != "InternalStateEvent" and + (.node_type | test("^[A-Za-z]+$")) + ))) as $real | + + # Created today + ($real | map(select(.created_at > $cutoff))) as $new | + + # Activated today but not created today (reinforced) + ($real | map(select( + (.last_activated // 0) > $cutoff and + .created_at <= $cutoff + ))) as $reinforced | + + # Stats for sharpness (across all real nodes) + ($real | length) as $real_count | + ($real | if length > 0 then (map(.importance) | add / length) else 0 end) as $avg_imp | + ($real | if length > 0 then (map(.confidence // 1) | add / length) else 0 end) as $avg_conf | + + # activation_ratio: reinforced nodes today / total real nodes, capped 0-1 + (($reinforced | length) as $ra | + if $real_count > 0 then ($ra / $real_count | if . > 1 then 1 else . end) else 0 end + ) as $act_ratio | + + # Sharpness score 0-100 + ((($avg_imp * 0.4) + ($avg_conf * 0.3) + ($act_ratio * 0.3)) * 100 | round) as $sharpness | + + # Top new memories (by importance desc, cap 10) + ($new | sort_by(-.importance) | .[0:10]) as $top_new | + + # Top reinforced (by last_activated desc, cap 10) + ($reinforced | sort_by(-.last_activated) | .[0:10]) as $top_reinforced | + + # High-importance nodes (importance > 0.8), across all real nodes + ($real | map(select(.importance > 0.8)) | length) as $high_imp_count | + + # Scalar metrics + "TOTAL_REAL=\($real_count)", + "NEW_COUNT=\($new | length)", + "REINFORCED_COUNT=\($reinforced | length)", + "TOTAL_NODES=\($all | length)", + "AVG_IMP=\($avg_imp)", + "AVG_CONF=\($avg_conf)", + "ACT_RATIO=\($act_ratio)", + "SHARPNESS=\($sharpness)", + "HIGH_IMP=\($high_imp_count)", + + # Item sections — fields separated by tab character (\t) + "---NEW---", + ($top_new[] | [.node_type, (.importance | tostring), (.content[0:120] | gsub("\n";" "))] | join("\t")), + "---REINFORCED---", + ($top_reinforced[] | [(.label[0:80] | gsub("\n";" ")), ("activated \(.activation_count)x total")] | join("\t")) +' "$SNAPSHOT" 2>/dev/null) + +# --------------------------------------------------------------------------- +# Parse scalar metrics +# --------------------------------------------------------------------------- +parse() { printf '%s' "$METRICS" | grep "^$1=" | head -1 | cut -d= -f2-; } + +TOTAL_REAL=$(parse TOTAL_REAL) +NEW_COUNT=$(parse NEW_COUNT) +REINFORCED_COUNT=$(parse REINFORCED_COUNT) +TOTAL_NODES=$(parse TOTAL_NODES) +AVG_IMP=$(parse AVG_IMP) +AVG_CONF=$(parse AVG_CONF) +ACT_RATIO=$(parse ACT_RATIO) +SHARPNESS=$(parse SHARPNESS) +HIGH_IMP=$(parse HIGH_IMP) + +# Format floats to 2dp (use awk, avoiding bc locale issues) +fmt2() { awk "BEGIN{printf \"%.2f\", $1}"; } +fmt4() { awk "BEGIN{printf \"%.4f\", $1}"; } +AVG_IMP_FMT=$(fmt2 "$AVG_IMP") +AVG_CONF_FMT=$(fmt2 "$AVG_CONF") +ACT_RATIO_FMT=$(fmt4 "$ACT_RATIO") +IMP_CONTRIB=$(fmt4 "$(awk "BEGIN{printf \"%.6f\", $AVG_IMP * 0.4}")") +CONF_CONTRIB=$(fmt4 "$(awk "BEGIN{printf \"%.6f\", $AVG_CONF * 0.3}")") +ACT_CONTRIB=$(fmt4 "$(awk "BEGIN{printf \"%.6f\", $ACT_RATIO * 0.3}")") + +# --------------------------------------------------------------------------- +# Sharpness delta (compare to yesterday) +# --------------------------------------------------------------------------- +DELTA_STR="" +if [[ -f "$SHARPNESS_FILE" ]]; then + YESTERDAY=$(date -v-1d +%Y-%m-%d 2>/dev/null || date -d "yesterday" +%Y-%m-%d 2>/dev/null || echo "") + if [[ -n "$YESTERDAY" ]]; then + PREV_SHARPNESS=$(jq -r --arg d "$YESTERDAY" '.[] | select(.date == $d) | .sharpness' "$SHARPNESS_FILE" 2>/dev/null | tail -1) + if [[ -n "$PREV_SHARPNESS" && "$PREV_SHARPNESS" != "null" ]]; then + DELTA=$(( SHARPNESS - PREV_SHARPNESS )) + if (( DELTA > 0 )); then + DELTA_STR=" (up ${DELTA}% from yesterday)" + elif (( DELTA < 0 )); then + DELTA_STR=" (down ${DELTA#-}% from yesterday)" + else + DELTA_STR=" (no change from yesterday)" + fi + fi + fi +fi + +# --------------------------------------------------------------------------- +# Build new-memories section (tab-delimited: type TAB importance TAB content) +# --------------------------------------------------------------------------- +new_section() { + local lines + lines=$(printf '%s\n' "$METRICS" | awk '/^---NEW---/{found=1; next} /^---REINFORCED---/{exit} found{print}') + if [[ -z "$lines" ]]; then + echo " (none)" + return + fi + while IFS=$'\t' read -r ntype importance content; do + [[ -z "$ntype" ]] && continue + imp_fmt=$(awk "BEGIN{printf \"%.1f\", $importance}") + printf " [%-18s] (importance: %s) %s\n" "$ntype" "$imp_fmt" "$content" + done <<< "$lines" +} + +# --------------------------------------------------------------------------- +# Build reinforced section (tab-delimited: label TAB activation-info) +# --------------------------------------------------------------------------- +reinforced_section() { + local lines + lines=$(printf '%s\n' "$METRICS" | awk '/^---REINFORCED---/{found=1; next} found{print}') + if [[ -z "$lines" ]]; then + echo " (none today)" + return + fi + while IFS=$'\t' read -r label acts; do + [[ -z "$label" ]] && continue + printf " \"%s\" — %s\n" "$label" "$acts" + done <<< "$lines" +} + +# --------------------------------------------------------------------------- +# Render full digest +# --------------------------------------------------------------------------- +DIGEST=$(cat <0.8): ${HIGH_IMP} + Nodes created today: ${NEW_COUNT} + Nodes re-activated today: ${REINFORCED_COUNT} + +SHARPNESS FORMULA: + Sharpness = (avg_importance x 0.4) + (avg_confidence x 0.3) + (activation_ratio x 0.3) + avg_importance = ${AVG_IMP_FMT} -> ${AVG_IMP_FMT} x 0.4 = ${IMP_CONTRIB} + avg_confidence = ${AVG_CONF_FMT} -> ${AVG_CONF_FMT} x 0.3 = ${CONF_CONTRIB} + activation_ratio = ${ACT_RATIO_FMT} -> ratio x 0.3 = ${ACT_CONTRIB} + Result: ${SHARPNESS}% + +Generated: $(date) +EOF +) + +# --------------------------------------------------------------------------- +# Write digest file + print to stdout +# --------------------------------------------------------------------------- +printf '%s\n' "$DIGEST" | tee "$DIGEST_FILE" + +# --------------------------------------------------------------------------- +# Append to sharpness.json +# --------------------------------------------------------------------------- +NEW_ENTRY="{\"date\":\"${DATE}\",\"sharpness\":${SHARPNESS},\"node_count\":${TOTAL_NODES},\"real_node_count\":${TOTAL_REAL},\"nodes_added\":${NEW_COUNT},\"nodes_reinforced\":${REINFORCED_COUNT}}" + +if [[ -f "$SHARPNESS_FILE" ]]; then + UPDATED=$(jq --arg d "$DATE" --argjson entry "$NEW_ENTRY" ' + map(select(.date != $d)) + [$entry] + ' "$SHARPNESS_FILE" 2>/dev/null) || UPDATED="[$NEW_ENTRY]" + printf '%s\n' "$UPDATED" > "$SHARPNESS_FILE" +else + printf '[%s]\n' "$NEW_ENTRY" > "$SHARPNESS_FILE" +fi + +echo "" +echo "Digest written to: $DIGEST_FILE" +echo "Sharpness log: $SHARPNESS_FILE" diff --git a/tools/memory-export.sh b/tools/memory-export.sh new file mode 100755 index 0000000..c7e9e9a --- /dev/null +++ b/tools/memory-export.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# memory-export.sh — Export Neuron engram store as a portable encrypted .neuronmem bundle +# +# Usage: +# ./tools/memory-export.sh [output-path] [--passphrase "your passphrase"] +# +# If no passphrase is given, a random one is generated and printed — write it down. +# If no output path is given, defaults to ./neuron-export-.neuronmem + +set -euo pipefail + +# ── Config ───────────────────────────────────────────────────────────────────── +ENGRAM_SNAPSHOT="${HOME}/.neuron/engram/snapshot.json" +SOUL_VERSION="1.1.0" +FORMAT_VERSION="1" + +# ── Parse args ───────────────────────────────────────────────────────────────── +OUTPUT_PATH="" +PASSPHRASE="" +PASSPHRASE_SET=0 + +while [[ $# -gt 0 ]]; do + case "$1" in + --passphrase) + PASSPHRASE="$2" + PASSPHRASE_SET=1 + shift 2 + ;; + --passphrase=*) + PASSPHRASE="${1#*=}" + PASSPHRASE_SET=1 + shift + ;; + -*) + echo "Unknown option: $1" >&2 + echo "Usage: $0 [output-path] [--passphrase \"...\"]" >&2 + exit 1 + ;; + *) + if [[ -z "$OUTPUT_PATH" ]]; then + OUTPUT_PATH="$1" + else + echo "Unexpected argument: $1" >&2 + exit 1 + fi + shift + ;; + esac +done + +# ── Default output path ──────────────────────────────────────────────────────── +TIMESTAMP="$(date -u +"%Y%m%dT%H%M%SZ")" +if [[ -z "$OUTPUT_PATH" ]]; then + OUTPUT_PATH="./neuron-export-${TIMESTAMP}.neuronmem" +fi + +# Ensure .neuronmem extension +if [[ "${OUTPUT_PATH}" != *.neuronmem ]]; then + OUTPUT_PATH="${OUTPUT_PATH%.neuronmem}.neuronmem" +fi + +# ── Validate source ──────────────────────────────────────────────────────────── +if [[ ! -f "$ENGRAM_SNAPSHOT" ]]; then + echo "ERROR: Engram snapshot not found at: $ENGRAM_SNAPSHOT" >&2 + exit 1 +fi + +echo "Neuron Memory Export" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Source: $ENGRAM_SNAPSHOT" +echo "Output: $OUTPUT_PATH" +echo "" + +# ── Generate passphrase if not provided ──────────────────────────────────────── +if [[ $PASSPHRASE_SET -eq 0 ]]; then + PASSPHRASE="$(openssl rand -base64 32)" + echo "⚠ No passphrase provided. Generated passphrase:" + echo "" + echo " ${PASSPHRASE}" + echo "" + echo "⚠ WRITE THIS DOWN. You will need it to import this file." + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" +fi + +# ── Count nodes and edges ────────────────────────────────────────────────────── +echo "Analyzing snapshot..." +NODE_COUNT="$(python3 -c " +import json, sys +with open('${ENGRAM_SNAPSHOT}') as f: + d = json.load(f) +nodes = d.get('nodes', d if isinstance(d, list) else []) +edges = d.get('edges', []) +print(len(nodes) if isinstance(nodes, list) else len(nodes)) +" 2>/dev/null || echo "unknown")" + +echo " Nodes: ${NODE_COUNT}" + +# ── Compute checksum of source file ─────────────────────────────────────────── +echo "Computing checksum..." +CHECKSUM="$(openssl dgst -sha256 "$ENGRAM_SNAPSHOT" | awk '{print $NF}')" +echo " SHA256: ${CHECKSUM:0:16}..." + +# ── Build bundle in temp dir ─────────────────────────────────────────────────── +WORK_DIR="$(mktemp -d)" +BUNDLE_DIR="${WORK_DIR}/neuronmem-v${FORMAT_VERSION}" +mkdir -p "$BUNDLE_DIR" + +echo "Building bundle..." + +# Copy snapshot as nodes.json +cp "$ENGRAM_SNAPSHOT" "${BUNDLE_DIR}/nodes.json" + +# Write metadata.json +ISO_TIMESTAMP="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" +cat > "${BUNDLE_DIR}/metadata.json" << METAEOF +{ + "version": "${FORMAT_VERSION}", + "exported_at": "${ISO_TIMESTAMP}", + "node_count": ${NODE_COUNT}, + "soul_version": "${SOUL_VERSION}", + "sha256": "${CHECKSUM}", + "format": "neuronmem-v1", + "encryption": "aes-256-cbc-pbkdf2", + "source_host": "$(hostname -s 2>/dev/null || echo unknown)" +} +METAEOF + +echo " metadata.json written" +echo " nodes.json copied ($(du -sh "${BUNDLE_DIR}/nodes.json" | cut -f1))" + +# ── Create tar.gz ────────────────────────────────────────────────────────────── +TAR_PATH="${WORK_DIR}/bundle.tar.gz" +echo "Compressing..." +(cd "$WORK_DIR" && tar czf "$TAR_PATH" "neuronmem-v${FORMAT_VERSION}/") +COMPRESSED_SIZE="$(du -sh "$TAR_PATH" | cut -f1)" +echo " Compressed size: ${COMPRESSED_SIZE}" + +# ── Encrypt ──────────────────────────────────────────────────────────────────── +echo "Encrypting (AES-256-CBC, PBKDF2, 600k iterations)..." +openssl enc -aes-256-cbc \ + -pbkdf2 \ + -iter 600000 \ + -salt \ + -in "$TAR_PATH" \ + -out "$OUTPUT_PATH" \ + -pass "pass:${PASSPHRASE}" + +# ── Cleanup ──────────────────────────────────────────────────────────────────── +rm -rf "$WORK_DIR" + +# ── Report ───────────────────────────────────────────────────────────────────── +FINAL_SIZE="$(du -sh "$OUTPUT_PATH" | cut -f1)" +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Export complete." +echo " File: $OUTPUT_PATH" +echo " Size: ${FINAL_SIZE}" +echo " Nodes: ${NODE_COUNT}" +echo " Checksum: ${CHECKSUM:0:32}..." +echo " Timestamp: ${ISO_TIMESTAMP}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" diff --git a/tools/memory-import-refugee.sh b/tools/memory-import-refugee.sh new file mode 100755 index 0000000..49efa66 --- /dev/null +++ b/tools/memory-import-refugee.sh @@ -0,0 +1,427 @@ +#!/usr/bin/env bash +# memory-import-refugee.sh — Import conversation/memory history from external apps into Neuron +# +# Usage: +# ./tools/memory-import-refugee.sh --format chatgpt conversations.json +# ./tools/memory-import-refugee.sh --format screenpipe screenpipe-export.json +# ./tools/memory-import-refugee.sh --format generic data.json[l] +# +# Supported formats: +# chatgpt — ChatGPT conversation export (conversations.json) +# screenpipe — Screenpipe OCR export (frames array) +# generic — Any JSON array or JSONL with content/text fields +# +# The script writes Memory nodes to the Neuron soul via its HTTP API. +# The soul must be running on localhost:7770. + +set -euo pipefail + +# ── Config ───────────────────────────────────────────────────────────────────── +SOUL_HOST="http://localhost:7770" +# Note: POST /api/neuron/memory ignores the label field (soul hardcodes "memory:remembered"). +# We embed the label in the content prefix so it is searchable. +MEMORY_API="${SOUL_HOST}/api/neuron/memory" +SLEEP_MS=100 # ms between API calls (rate limiting) + +# ── Dependency check ─────────────────────────────────────────────────────────── +if ! command -v jq &>/dev/null; then + echo "ERROR: jq is required but not installed." >&2 + echo "" >&2 + echo "Install it with:" >&2 + echo " macOS: brew install jq" >&2 + echo " Ubuntu: sudo apt-get install jq" >&2 + echo " Alpine: apk add jq" >&2 + exit 1 +fi + +# ── Parse args ───────────────────────────────────────────────────────────────── +FORMAT="" +INPUT_FILE="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --format|-f) + FORMAT="$2" + shift 2 + ;; + --format=*|-f=*) + FORMAT="${1#*=}" + shift + ;; + -*) + echo "Unknown option: $1" >&2 + echo "Usage: $0 --format " >&2 + exit 1 + ;; + *) + if [[ -z "$INPUT_FILE" ]]; then + INPUT_FILE="$1" + else + echo "Unexpected argument: $1" >&2 + exit 1 + fi + shift + ;; + esac +done + +if [[ -z "$FORMAT" ]]; then + echo "ERROR: --format is required." >&2 + echo "Usage: $0 --format " >&2 + exit 1 +fi + +if [[ -z "$INPUT_FILE" ]]; then + echo "ERROR: No input file specified." >&2 + echo "Usage: $0 --format " >&2 + exit 1 +fi + +if [[ ! -f "$INPUT_FILE" ]]; then + echo "ERROR: Input file not found: $INPUT_FILE" >&2 + exit 1 +fi + +case "$FORMAT" in + chatgpt|screenpipe|generic) ;; + *) + echo "ERROR: Unknown format: $FORMAT" >&2 + echo "Supported formats: chatgpt, screenpipe, generic" >&2 + exit 1 + ;; +esac + +# ── Soul health check ────────────────────────────────────────────────────────── +HTTP_CODE="$(curl -s -o /dev/null -w "%{http_code}" "${SOUL_HOST}/api/neuron/memory" 2>/dev/null || echo "000")" +if [[ "$HTTP_CODE" == "000" ]]; then + echo "ERROR: Neuron soul is not responding at ${SOUL_HOST}." >&2 + echo " Start the soul service and retry." >&2 + exit 1 +fi + +# ── Counters ─────────────────────────────────────────────────────────────────── +IMPORTED=0 +SKIPPED=0 +ERRORS=0 + +# ── Helper: post one memory node ─────────────────────────────────────────────── +# post_memory CONTENT LABEL TAGS_JSON +# +# Note: the soul's POST /api/neuron/memory API ignores the label field (hardcodes +# it to "memory:remembered"). We embed the label as a prefix in the content so +# the title remains searchable via recall/search. +post_memory() { + local content="$1" + local label="$2" + local tags_json="$3" + + # Skip empty content + if [[ -z "$content" || "$content" == "null" ]]; then + SKIPPED=$((SKIPPED + 1)) + return 0 + fi + + # Embed label in content so it's searchable (the API ignores the label field) + local full_content="[${label}] ${content}" + + local payload + payload="$(jq -n \ + --arg content "$full_content" \ + --arg label "$label" \ + --argjson tags "$tags_json" \ + '{content: $content, label: $label, tags: $tags}')" + + local response + response="$(curl -s -X POST "$MEMORY_API" \ + -H "Content-Type: application/json" \ + -d "$payload" 2>/dev/null)" + + local ok + ok="$(echo "$response" | jq -r '.ok // "false"' 2>/dev/null)" + + if [[ "$ok" == "true" ]]; then + IMPORTED=$((IMPORTED + 1)) + else + ERRORS=$((ERRORS + 1)) + echo " [ERROR] API error for label \"${label:0:60}\": $response" >&2 + fi + + # Rate limit: sleep 100ms + sleep "0.${SLEEP_MS}" +} + +# ── Format: ChatGPT ──────────────────────────────────────────────────────────── +import_chatgpt() { + echo "Format: ChatGPT conversation export" + + # Validate: must be JSON array at top level + local top_type + top_type="$(jq -r 'type' "$INPUT_FILE" 2>/dev/null)" + if [[ "$top_type" != "array" ]]; then + echo "ERROR: ChatGPT export must be a JSON array of conversations." >&2 + exit 1 + fi + + local conv_count + conv_count="$(jq 'length' "$INPUT_FILE")" + echo "Found ${conv_count} conversation(s) to process." + echo "" + + # Count total user messages for progress display + local total_msgs + total_msgs="$(jq '[.[].mapping // {} | to_entries[] | .value.message | select(. != null and .author.role == "user") | .content.parts // [] | .[] | select(type == "string" and length > 0)] | length' "$INPUT_FILE" 2>/dev/null || echo "?")" + echo "Total user messages: ${total_msgs}" + echo "" + + local msg_idx=0 + + # Process each conversation + while IFS= read -r conv_json; do + local title + title="$(echo "$conv_json" | jq -r '.title // "Untitled"')" + + # Truncate label to 100 chars + local label="${title:0:100}" + + # Extract user messages — ChatGPT export uses a mapping dict structure + # Mapping: { uuid: { id, message: { author: { role }, content: { parts: [...] } }, ... } } + # We iterate over mapping values, filter role=user, grab text parts + while IFS= read -r msg_text; do + msg_idx=$((msg_idx + 1)) + echo " Importing ${msg_idx}/${total_msgs}..." + post_memory "$msg_text" "$label" '["chatgpt-import","conversation"]' + done < <(echo "$conv_json" | jq -r ' + .mapping // {} | + to_entries[] | + .value.message | + select(. != null) | + select(.author.role == "user") | + .content.parts // [] | + .[] | + select(type == "string" and length > 0) + ' 2>/dev/null) + + done < <(jq -c '.[]' "$INPUT_FILE") +} + +# ── Format: Screenpipe ───────────────────────────────────────────────────────── +import_screenpipe() { + echo "Format: Screenpipe OCR export" + + # Validate: must have frames array + local top_type + top_type="$(jq -r 'type' "$INPUT_FILE" 2>/dev/null)" + if [[ "$top_type" != "object" ]]; then + echo "ERROR: Screenpipe export must be a JSON object with a 'frames' array." >&2 + exit 1 + fi + + local frame_count + frame_count="$(jq '.frames | length' "$INPUT_FILE" 2>/dev/null || echo "0")" + echo "Found ${frame_count} frame(s) to process." + + if [[ "$frame_count" == "0" ]]; then + echo "No frames found. Nothing to import." + return 0 + fi + + # Group frames by app_name + 5-minute window bucket + # Strategy: process sorted frames, emit a group when app or bucket changes. + # We do this in pure jq with a reduce, emitting groups as newline-delimited JSON. + + local total_groups=0 + local group_idx=0 + + # Collect groups: each group is { app, bucket_ts, texts: [...] } + # Bucket = floor(timestamp_epoch / 300) * 300 seconds + # timestamps may be ISO8601 or epoch — handle both + + # We process in jq and emit one group per line as JSON + while IFS= read -r group_json; do + total_groups=$((total_groups + 1)) + # Just count first + : + done < <(jq -c ' + .frames | + map(select(.text != null and (.text | length) > 0)) | + group_by(.app_name) | + .[] | + . as $app_frames | + ($app_frames[0].app_name) as $app | + # Sort by timestamp within app + (sort_by(.timestamp)) | + # Group into 5-minute buckets + reduce .[] as $f ( + {bucket: null, texts: [], ts: null, groups: []}; + ($f.timestamp // "") as $ts | + # Derive numeric bucket: try epoch directly; for ISO use first 15 chars as bucket key + (if ($ts | test("^[0-9]+$")) then ($ts | tonumber / 300 | floor) + else ($ts[0:15]) + end) as $bucket | + if .bucket == null then + {bucket: $bucket, texts: [$f.text], ts: $ts, groups: .groups} + elif .bucket == $bucket then + {bucket: $bucket, texts: (.texts + [$f.text]), ts: $ts, groups: .groups} + else + {bucket: $bucket, texts: [$f.text], ts: $ts, + groups: (.groups + [{app: $app, ts: .ts, texts: .texts}])} + end + ) | + # flush last bucket + (.groups + [{app: .app_name, ts: .ts, texts: .texts}]) | + .[] | + select(.texts | length > 0) + ' "$INPUT_FILE" 2>/dev/null) + + # Now actually process + while IFS= read -r group_json; do + group_idx=$((group_idx + 1)) + echo " Importing ${group_idx}..." + + local app_name ts_str content label + + app_name="$(echo "$group_json" | jq -r '.app // "unknown"')" + ts_str="$(echo "$group_json" | jq -r '.ts // ""')" + + # Concatenate texts, truncate to 2000 chars + content="$(echo "$group_json" | jq -r '.texts | join(" ")' | cut -c1-2000)" + label="Screenpipe: ${app_name} at ${ts_str:0:16}" + + local tags_json + tags_json="$(jq -n --arg app "$app_name" '["screenpipe-import","screen-capture",$app]')" + + post_memory "$content" "$label" "$tags_json" + + done < <(jq -c ' + .frames | + map(select(.text != null and (.text | length) > 0)) | + group_by(.app_name) | + .[] | + . as $app_frames | + ($app_frames[0].app_name) as $app | + (sort_by(.timestamp)) | + reduce .[] as $f ( + {bucket: null, texts: [], ts: null, app: $app, groups: []}; + ($f.timestamp // "") as $ts | + (if ($ts | test("^[0-9]+$")) then ($ts | tonumber / 300 | floor | tostring) + else ($ts[0:15]) + end) as $bucket | + if .bucket == null then + {bucket: $bucket, texts: [$f.text], ts: $ts, app: $app, groups: .groups} + elif .bucket == $bucket then + {bucket: $bucket, texts: (.texts + [$f.text]), ts: $ts, app: $app, groups: .groups} + else + {bucket: $bucket, texts: [$f.text], ts: $ts, app: $app, + groups: (.groups + [{app: $app, ts: .ts, texts: .texts}])} + end + ) | + (.groups + [{app: .app, ts: .ts, texts: .texts}]) | + .[] | + select(.texts | length > 0) + ' "$INPUT_FILE" 2>/dev/null) +} + +# ── Format: Generic ──────────────────────────────────────────────────────────── +import_generic() { + echo "Format: Generic JSON/JSONL" + + # Detect if JSONL (one JSON object per line) or single JSON array/object + local first_char + first_char="$(head -c1 "$INPUT_FILE" 2>/dev/null)" + + local records_file + records_file="$(mktemp)" + trap 'rm -f "$records_file"' RETURN + + if [[ "$first_char" == "[" ]]; then + # JSON array — explode to one object per line + jq -c '.[]' "$INPUT_FILE" > "$records_file" 2>/dev/null || true + elif [[ "$first_char" == "{" ]]; then + # Single object or JSONL — try JSONL first + # JSONL: each line is valid JSON + # Check if the whole file is one object or multiple lines + local line_count + line_count="$(wc -l < "$INPUT_FILE" | tr -d ' ')" + if [[ "$line_count" -le 1 ]]; then + # Single object: wrap in array and explode + jq -c '[.] | .[]' "$INPUT_FILE" > "$records_file" 2>/dev/null || true + else + # Assume JSONL + cp "$INPUT_FILE" "$records_file" + fi + else + # Try JSONL anyway + cp "$INPUT_FILE" "$records_file" + fi + + local total_records + total_records="$(wc -l < "$records_file" | tr -d ' ')" + echo "Found ${total_records} record(s) to process." + echo "" + + local idx=0 + while IFS= read -r record_json; do + [[ -z "$record_json" ]] && continue + + idx=$((idx + 1)) + echo " Importing ${idx}/${total_records}..." + + # Extract content: prefer 'content', fall back to 'text', then 'body', then 'message' + local content + content="$(echo "$record_json" | jq -r ' + if .content != null and (.content | type) == "string" then .content + elif .text != null and (.text | type) == "string" then .text + elif .body != null and (.body | type) == "string" then .body + elif .message != null and (.message | type) == "string" then .message + else "" + end + ' 2>/dev/null)" + + [[ -z "$content" || "$content" == "null" ]] && { SKIPPED=$((SKIPPED + 1)); continue; } + + # Extract label: prefer 'title', then 'label', then 'name', then first 80 chars of content + local label + label="$(echo "$record_json" | jq -r ' + if .title != null and (.title | type) == "string" then .title + elif .label != null and (.label | type) == "string" then .label + elif .name != null and (.name | type) == "string" then .name + else "" + end + ' 2>/dev/null)" + + if [[ -z "$label" || "$label" == "null" ]]; then + label="${content:0:80}" + fi + label="${label:0:100}" + + post_memory "$content" "$label" '["imported","generic"]' + + done < "$records_file" +} + +# ── Main ─────────────────────────────────────────────────────────────────────── +echo "Neuron Refugee Importer" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Source: $INPUT_FILE" +echo "Format: $FORMAT" +echo "Soul: $SOUL_HOST" +echo "" + +case "$FORMAT" in + chatgpt) import_chatgpt ;; + screenpipe) import_screenpipe ;; + generic) import_generic ;; +esac + +# ── Final report ─────────────────────────────────────────────────────────────── +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Import complete." +echo " Imported: ${IMPORTED}" +echo " Skipped: ${SKIPPED}" +echo " Errors: ${ERRORS}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + +if [[ $ERRORS -gt 0 ]]; then + exit 1 +fi diff --git a/tools/memory-import.sh b/tools/memory-import.sh new file mode 100755 index 0000000..2ee5493 --- /dev/null +++ b/tools/memory-import.sh @@ -0,0 +1,289 @@ +#!/usr/bin/env bash +# memory-import.sh — Import a Neuron .neuronmem bundle onto this device +# +# Usage: +# ./tools/memory-import.sh input.neuronmem [--passphrase "your passphrase"] +# ./tools/memory-import.sh input.neuronmem [--dry-run] # verify only, no changes +# +# The script will: +# 1. Decrypt and unpack the .neuronmem file +# 2. Validate the checksum and version +# 3. Back up the current snapshot.json +# 4. Stop the soul service +# 5. Replace snapshot.json +# 6. Restart the soul service +# 7. Verify the soul came back up + +set -euo pipefail + +# ── Config ───────────────────────────────────────────────────────────────────── +ENGRAM_SNAPSHOT="${HOME}/.neuron/engram/snapshot.json" +SOUL_SERVICE="ai.neurontechnologies.soul" +SOUL_PORT="7770" +SOUL_STARTUP_TIMEOUT=30 # seconds to wait for soul to come back + +# ── Parse args ───────────────────────────────────────────────────────────────── +INPUT_PATH="" +PASSPHRASE="" +PASSPHRASE_SET=0 +DRY_RUN=0 + +while [[ $# -gt 0 ]]; do + case "$1" in + --passphrase) + PASSPHRASE="$2" + PASSPHRASE_SET=1 + shift 2 + ;; + --passphrase=*) + PASSPHRASE="${1#*=}" + PASSPHRASE_SET=1 + shift + ;; + --dry-run) + DRY_RUN=1 + shift + ;; + -*) + echo "Unknown option: $1" >&2 + echo "Usage: $0 input.neuronmem [--passphrase \"...\"] [--dry-run]" >&2 + exit 1 + ;; + *) + if [[ -z "$INPUT_PATH" ]]; then + INPUT_PATH="$1" + else + echo "Unexpected argument: $1" >&2 + exit 1 + fi + shift + ;; + esac +done + +if [[ -z "$INPUT_PATH" ]]; then + echo "ERROR: No input file specified." >&2 + echo "Usage: $0 input.neuronmem [--passphrase \"...\"] [--dry-run]" >&2 + exit 1 +fi + +if [[ ! -f "$INPUT_PATH" ]]; then + echo "ERROR: Input file not found: $INPUT_PATH" >&2 + exit 1 +fi + +echo "Neuron Memory Import" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Source: $INPUT_PATH" +echo "Target: $ENGRAM_SNAPSHOT" +if [[ $DRY_RUN -eq 1 ]]; then + echo "Mode: DRY RUN (no changes will be made)" +fi +echo "" + +# ── Prompt for passphrase if needed ─────────────────────────────────────────── +if [[ $PASSPHRASE_SET -eq 0 ]]; then + read -r -s -p "Enter passphrase: " PASSPHRASE + echo "" + if [[ -z "$PASSPHRASE" ]]; then + echo "ERROR: Passphrase cannot be empty." >&2 + exit 1 + fi +fi + +# ── Decrypt to temp dir ──────────────────────────────────────────────────────── +WORK_DIR="$(mktemp -d)" +CLEANUP() { + rm -rf "$WORK_DIR" +} +trap CLEANUP EXIT + +TAR_PATH="${WORK_DIR}/bundle.tar.gz" + +echo "Decrypting..." +if ! openssl enc -d -aes-256-cbc \ + -pbkdf2 \ + -iter 600000 \ + -in "$INPUT_PATH" \ + -out "$TAR_PATH" \ + -pass "pass:${PASSPHRASE}" 2>/dev/null; then + echo "ERROR: Decryption failed. Wrong passphrase or corrupted file." >&2 + exit 1 +fi +echo " Decrypted successfully." + +# ── Unpack ───────────────────────────────────────────────────────────────────── +echo "Unpacking..." +(cd "$WORK_DIR" && tar xzf "$TAR_PATH") || { + echo "ERROR: Failed to unpack bundle. File may be corrupted." >&2 + exit 1 +} + +# Locate the bundle directory (neuronmem-v1/) +BUNDLE_DIR="" +for d in "${WORK_DIR}"/neuronmem-v*/; do + if [[ -d "$d" ]]; then + BUNDLE_DIR="$d" + break + fi +done + +if [[ -z "$BUNDLE_DIR" ]]; then + echo "ERROR: Bundle directory not found. Invalid .neuronmem file." >&2 + exit 1 +fi + +METADATA_FILE="${BUNDLE_DIR}metadata.json" +NODES_FILE="${BUNDLE_DIR}nodes.json" + +if [[ ! -f "$METADATA_FILE" ]]; then + echo "ERROR: metadata.json missing from bundle." >&2 + exit 1 +fi + +if [[ ! -f "$NODES_FILE" ]]; then + echo "ERROR: nodes.json missing from bundle." >&2 + exit 1 +fi + +# ── Validate metadata ────────────────────────────────────────────────────────── +echo "Validating metadata..." +FORMAT_VERSION="$(python3 -c "import json; d=json.load(open('${METADATA_FILE}')); print(d.get('version','?'))")" +EXPORTED_AT="$(python3 -c "import json; d=json.load(open('${METADATA_FILE}')); print(d.get('exported_at','?'))")" +EXPECTED_COUNT="$(python3 -c "import json; d=json.load(open('${METADATA_FILE}')); print(d.get('node_count','?'))")" +STORED_CHECKSUM="$(python3 -c "import json; d=json.load(open('${METADATA_FILE}')); print(d.get('sha256','?'))")" +SOURCE_HOST="$(python3 -c "import json; d=json.load(open('${METADATA_FILE}')); print(d.get('source_host','?'))")" + +echo " Format version: ${FORMAT_VERSION}" +echo " Exported at: ${EXPORTED_AT}" +echo " Source host: ${SOURCE_HOST}" +echo " Expected nodes: ${EXPECTED_COUNT}" + +if [[ "$FORMAT_VERSION" != "1" ]]; then + echo "ERROR: Unsupported bundle format version: ${FORMAT_VERSION}" >&2 + echo " This tool supports version 1 only." >&2 + exit 1 +fi + +# ── Validate checksum ────────────────────────────────────────────────────────── +echo "Verifying checksum..." +ACTUAL_CHECKSUM="$(openssl dgst -sha256 "$NODES_FILE" | awk '{print $NF}')" + +if [[ "$ACTUAL_CHECKSUM" != "$STORED_CHECKSUM" ]]; then + echo "ERROR: Checksum mismatch!" >&2 + echo " Expected: ${STORED_CHECKSUM}" >&2 + echo " Got: ${ACTUAL_CHECKSUM}" >&2 + echo " The bundle may be corrupted." >&2 + exit 1 +fi +echo " Checksum OK: ${ACTUAL_CHECKSUM:0:16}..." + +# ── Verify node count ────────────────────────────────────────────────────────── +echo "Verifying node count..." +ACTUAL_COUNT="$(python3 -c " +import json +with open('${NODES_FILE}') as f: + d = json.load(f) +nodes = d.get('nodes', d if isinstance(d, list) else []) +print(len(nodes) if isinstance(nodes, list) else len(nodes)) +" 2>/dev/null || echo "unknown")" + +echo " Found ${ACTUAL_COUNT} nodes (expected ${EXPECTED_COUNT})" + +if [[ "$ACTUAL_COUNT" != "$EXPECTED_COUNT" && "$EXPECTED_COUNT" != "unknown" ]]; then + echo "WARNING: Node count mismatch (expected ${EXPECTED_COUNT}, found ${ACTUAL_COUNT})." >&2 + echo " Proceeding anyway — count may differ if nodes were deduplicated." >&2 +fi + +# ── Dry run exit ─────────────────────────────────────────────────────────────── +if [[ $DRY_RUN -eq 1 ]]; then + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "DRY RUN complete. Bundle is valid." + echo " Nodes: ${ACTUAL_COUNT}" + echo " Checksum: verified" + echo " Run without --dry-run to import." + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + exit 0 +fi + +# ── Safety confirmation ──────────────────────────────────────────────────────── +echo "" +echo "WARNING: This will replace your current Neuron memory store." +echo " Current snapshot: $ENGRAM_SNAPSHOT" +echo " A backup will be created before replacing." +echo "" +read -r -p "Type 'yes' to continue: " CONFIRM +if [[ "$CONFIRM" != "yes" ]]; then + echo "Aborted." + exit 0 +fi + +# ── Backup existing snapshot ─────────────────────────────────────────────────── +BACKUP_TIMESTAMP="$(date -u +"%Y%m%dT%H%M%SZ")" +ENGRAM_DIR="$(dirname "$ENGRAM_SNAPSHOT")" +BACKUP_PATH="${HOME}/.neuron/engram-backup-${BACKUP_TIMESTAMP}.tar.gz" + +echo "" +echo "Backing up current snapshot..." +if [[ -f "$ENGRAM_SNAPSHOT" ]]; then + (cd "$HOME/.neuron" && tar czf "$BACKUP_PATH" "$(basename "$ENGRAM_DIR")/snapshot.json" 2>/dev/null) || \ + cp "$ENGRAM_SNAPSHOT" "${ENGRAM_SNAPSHOT}.backup-${BACKUP_TIMESTAMP}" + echo " Backup: $BACKUP_PATH" +else + echo " No existing snapshot to back up." +fi + +# ── Stop soul service ────────────────────────────────────────────────────────── +echo "Stopping soul service (${SOUL_SERVICE})..." +launchctl stop "$SOUL_SERVICE" 2>/dev/null || true +# Also stop engram service if running +launchctl stop "ai.neuron.engram" 2>/dev/null || true +sleep 2 +echo " Soul stopped." + +# ── Replace snapshot.json ────────────────────────────────────────────────────── +echo "Installing new snapshot..." +cp "$NODES_FILE" "$ENGRAM_SNAPSHOT" +echo " snapshot.json replaced ($(du -sh "$ENGRAM_SNAPSHOT" | cut -f1))" + +# ── Restart soul service ─────────────────────────────────────────────────────── +echo "Restarting soul service..." +launchctl start "$SOUL_SERVICE" 2>/dev/null || true +launchctl start "ai.neuron.engram" 2>/dev/null || true + +# ── Wait for soul to come up ─────────────────────────────────────────────────── +echo "Waiting for soul to come up on port ${SOUL_PORT}..." +ELAPSED=0 +SOUL_UP=0 +while [[ $ELAPSED -lt $SOUL_STARTUP_TIMEOUT ]]; do + if curl -sf "http://localhost:${SOUL_PORT}/" > /dev/null 2>&1; then + SOUL_UP=1 + break + fi + # Try a known endpoint that returns any response (even 404 means it's up) + HTTP_CODE="$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:${SOUL_PORT}/api/neuron/memory" 2>/dev/null || echo "000")" + if [[ "$HTTP_CODE" != "000" ]]; then + SOUL_UP=1 + break + fi + sleep 1 + ELAPSED=$((ELAPSED + 1)) +done + +if [[ $SOUL_UP -eq 1 ]]; then + echo " Soul is up (responded in ${ELAPSED}s)." +else + echo " WARNING: Soul did not respond within ${SOUL_STARTUP_TIMEOUT}s." + echo " The service may still be starting. Check: launchctl list | grep soul" +fi + +# ── Final report ─────────────────────────────────────────────────────────────── +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Import complete." +echo " Nodes imported: ${ACTUAL_COUNT}" +echo " Exported at: ${EXPORTED_AT}" +echo " Source host: ${SOURCE_HOST}" +echo " Backup: ${BACKUP_PATH}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" diff --git a/tools/photo-to-memory.sh b/tools/photo-to-memory.sh new file mode 100755 index 0000000..b4c5a03 --- /dev/null +++ b/tools/photo-to-memory.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# photo-to-memory.sh — OCR a document/photo and store the text in Neuron memory +# +# Uses GLM-OCR (0.9B, MIT) via mlx-vlm on Apple Silicon. +# Model auto-downloads ~1.59 GB to ~/.cache/huggingface/ on first run. +# +# Usage: +# ./tools/photo-to-memory.sh [--dry-run] [--prompt "custom prompt"] +# +# Prerequisites: +# pip install -U mlx-vlm +# +# Examples: +# ./tools/photo-to-memory.sh ~/Desktop/receipt.jpg +# ./tools/photo-to-memory.sh ~/Documents/contract.png --dry-run +# ./tools/photo-to-memory.sh scan.jpg --prompt "Extract all text from this receipt" + +set -euo pipefail + +# ── Config ───────────────────────────────────────────────────────────────────── +SOUL_URL="${SOUL_URL:-http://localhost:7770}" +GLM_MODEL="${GLM_MODEL:-mlx-community/GLM-OCR-8bit}" +MAX_TOKENS="${MAX_TOKENS:-4096}" +DEFAULT_PROMPT="Extract all text from this document. Preserve structure including tables, headers, and lists. Output plain text." + +# ── Colours ──────────────────────────────────────────────────────────────────── +RED=$'\033[0;31m'; GREEN=$'\033[0;32m'; YELLOW=$'\033[1;33m' +CYAN=$'\033[0;36m'; BOLD=$'\033[1m'; RESET=$'\033[0m' + +log() { printf "%s%s%s\n" "$CYAN" "$*" "$RESET"; } +ok() { printf "%s✓ %s%s\n" "$GREEN" "$*" "$RESET"; } +warn() { printf "%s⚠ %s%s\n" "$YELLOW" "$*" "$RESET"; } +die() { printf "%s✗ %s%s\n" "$RED" "$*" "$RESET" >&2; exit 1; } + +# ── Parse args ───────────────────────────────────────────────────────────────── +IMAGE_PATH="" +DRY_RUN=0 +CUSTOM_PROMPT="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) DRY_RUN=1; shift ;; + --prompt) CUSTOM_PROMPT="$2"; shift 2 ;; + --model) GLM_MODEL="$2"; shift 2 ;; + --help|-h) + sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + -*) die "Unknown option: $1" ;; + *) + [[ -n "$IMAGE_PATH" ]] && die "Only one image file at a time" + IMAGE_PATH="$1" + shift + ;; + esac +done + +[[ -z "$IMAGE_PATH" ]] && die "Usage: $0 [--dry-run] [--prompt \"...\"]" +[[ -f "$IMAGE_PATH" ]] || die "File not found: $IMAGE_PATH" + +PROMPT="${CUSTOM_PROMPT:-$DEFAULT_PROMPT}" +FILENAME=$(basename "$IMAGE_PATH") +ABS_PATH=$(realpath "$IMAGE_PATH") + +# ── Check runtime ─────────────────────────────────────────────────────────────── +if ! python3 -c "import mlx_vlm" 2>/dev/null; then + warn "mlx-vlm not installed. Installing now..." + pip install -q -U mlx-vlm || die "pip install mlx-vlm failed — run manually: pip install -U mlx-vlm" +fi + +# ── Run GLM-OCR ───────────────────────────────────────────────────────────────── +log "Running GLM-OCR on: $FILENAME" +log "Model: $GLM_MODEL" +[[ "$DRY_RUN" -eq 1 ]] && warn "Dry-run mode — will not post to Neuron" + +# GLM-OCR output goes to stdout; capture it +# First run downloads ~1.59 GB — this is expected and cached thereafter. +OCR_TEXT=$(python3 -m mlx_vlm.generate \ + --model "$GLM_MODEL" \ + --max-tokens "$MAX_TOKENS" \ + --temperature 0.0 \ + --prompt "$PROMPT" \ + --image "$ABS_PATH" \ + 2>/dev/null) || die "GLM-OCR failed. Check that mlx-vlm is installed and the image is readable." + +CHAR_COUNT=${#OCR_TEXT} +log "OCR complete — extracted ${CHAR_COUNT} characters" + +if [[ "$CHAR_COUNT" -lt 5 ]]; then + warn "Very short output — the image may be blank or unreadable" +fi + +# ── Preview ───────────────────────────────────────────────────────────────────── +printf "\n%s--- OCR output preview (first 400 chars) ---%s\n" "$BOLD" "$RESET" +printf "%s\n" "${OCR_TEXT:0:400}" +[[ "$CHAR_COUNT" -gt 400 ]] && printf "%s... [+%d more chars]%s\n" "$YELLOW" $((CHAR_COUNT - 400)) "$RESET" +printf "\n" + +# ── Post to Neuron soul ───────────────────────────────────────────────────────── +if [[ "$DRY_RUN" -eq 1 ]]; then + ok "Dry-run complete — would POST ${CHAR_COUNT} chars to ${SOUL_URL}/api/neuron/memory" + exit 0 +fi + +log "Posting to Neuron soul at ${SOUL_URL} ..." + +PAYLOAD=$(python3 -c " +import json, sys +content = sys.argv[1] +label = sys.argv[2] +tags = ['photo-import', 'ocr', 'glm-ocr'] +print(json.dumps({'content': content, 'label': label, 'tags': tags})) +" "$OCR_TEXT" "Photo: ${FILENAME}") + +HTTP_STATUS=$(curl -s -o /tmp/photo-to-memory-response.json -w "%{http_code}" \ + -X POST "${SOUL_URL}/api/neuron/memory" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD") + +if [[ "$HTTP_STATUS" =~ ^2 ]]; then + NODE_ID=$(python3 -c " +import json, sys +try: + d = json.load(open('/tmp/photo-to-memory-response.json')) + print(d.get('id', d.get('node_id', 'unknown'))) +except Exception: + print('unknown') +") + ok "Memory node created: ${NODE_ID}" + ok "Label: Photo: ${FILENAME}" + ok "Tags: photo-import, ocr, glm-ocr" +else + BODY=$(cat /tmp/photo-to-memory-response.json 2>/dev/null || echo "(no body)") + die "Soul returned HTTP ${HTTP_STATUS}: ${BODY}" +fi