#include #include #include "el_runtime.h" 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 lang_get(el_val_t profile, el_val_t key); el_val_t lang_profile_en(void); el_val_t lang_profile_ja(void); el_val_t lang_profile_ar(void); el_val_t lang_profile_zh(void); el_val_t lang_profile_de(void); el_val_t lang_profile_es(void); el_val_t lang_profile_fi(void); el_val_t lang_profile_sw(void); el_val_t lang_profile_hi(void); el_val_t lang_profile_ru(void); el_val_t lang_profile_fr(void); el_val_t lang_profile_la(void); el_val_t lang_profile_he(void); el_val_t lang_profile_sa(void); el_val_t lang_profile_got(void); el_val_t lang_profile_non(void); el_val_t lang_profile_enm(void); el_val_t lang_profile_pi(void); el_val_t lang_profile_grc(void); el_val_t lang_profile_ang(void); el_val_t lang_profile_fro(void); el_val_t lang_profile_goh(void); el_val_t lang_profile_sga(void); el_val_t lang_profile_txb(void); el_val_t lang_profile_peo(void); el_val_t lang_profile_akk(void); el_val_t lang_profile_uga(void); el_val_t lang_profile_egy(void); el_val_t lang_profile_sux(void); el_val_t lang_profile_gez(void); el_val_t lang_profile_cop(void); el_val_t lang_from_code(el_val_t code); el_val_t lang_default(void); el_val_t lang_is_isolating(el_val_t profile); el_val_t lang_is_agglutinative(el_val_t profile); el_val_t lang_is_fusional(el_val_t profile); el_val_t lang_is_polysynthetic(el_val_t profile); el_val_t lang_is_rtl(el_val_t profile); el_val_t lang_has_null_subject(el_val_t profile); el_val_t lang_has_case(el_val_t profile); el_val_t lang_has_gender(el_val_t profile); el_val_t lang_word_order(el_val_t profile); el_val_t lang_code(el_val_t profile); el_val_t lex_word(el_val_t entry); el_val_t lex_pos(el_val_t entry); el_val_t lex_form(el_val_t entry, el_val_t idx); el_val_t lex_class(el_val_t entry); 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 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 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 make_entry1(el_val_t word, el_val_t pos, el_val_t f0, el_val_t cls); el_val_t build_vocab(void); el_val_t get_vocab(void); el_val_t vocab_lookup(el_val_t word, el_val_t lang_code); el_val_t vocab_lookup_en(el_val_t word); el_val_t vocab_synonym(el_val_t word, el_val_t lang_register, el_val_t lang_code); el_val_t vocab_by_pos(el_val_t pos); el_val_t vocab_by_class(el_val_t cls); 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 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); el_val_t es_str_last2(el_val_t s); el_val_t es_str_last3(el_val_t s); el_val_t es_verb_class(el_val_t base); el_val_t es_stem(el_val_t base); el_val_t es_slot(el_val_t person, el_val_t number); el_val_t es_irregular_present(el_val_t verb, el_val_t person, el_val_t number); el_val_t es_irregular_preterite(el_val_t verb, el_val_t person, el_val_t number); el_val_t es_irregular_imperfect(el_val_t verb, el_val_t person, el_val_t number); el_val_t es_regular_present(el_val_t stem, el_val_t vclass, el_val_t slot); el_val_t es_regular_preterite(el_val_t stem, el_val_t vclass, el_val_t slot); el_val_t es_regular_future(el_val_t base, el_val_t slot); el_val_t es_irregular_future_stem(el_val_t verb); el_val_t es_regular_imperfect(el_val_t stem, el_val_t vclass, el_val_t slot); el_val_t es_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t es_gender(el_val_t noun); el_val_t es_invariant_plural(el_val_t noun); el_val_t es_pluralize(el_val_t noun); el_val_t es_starts_with_stressed_a(el_val_t noun); el_val_t es_agree_article(el_val_t noun, el_val_t definite, el_val_t number); el_val_t fr_str_ends(el_val_t s, el_val_t suf); el_val_t fr_str_drop_last(el_val_t s, el_val_t n); el_val_t fr_str_last_char(el_val_t s); el_val_t fr_str_last2(el_val_t s); el_val_t fr_is_vowel_start(el_val_t s); el_val_t fr_is_known_irregular(el_val_t verb); el_val_t fr_verb_group(el_val_t base); el_val_t fr_stem(el_val_t base); el_val_t fr_slot(el_val_t person, el_val_t number); el_val_t fr_irregular_present(el_val_t verb, el_val_t person, el_val_t number); el_val_t fr_regular_present(el_val_t stem, el_val_t vgroup, el_val_t slot); el_val_t fr_future_stem(el_val_t base, el_val_t vgroup); el_val_t fr_regular_future(el_val_t fstem, el_val_t slot); el_val_t fr_irregular_future_stem(el_val_t verb); el_val_t fr_imperfect_stem(el_val_t base, el_val_t vgroup); el_val_t fr_regular_imperfect(el_val_t istem, el_val_t slot); el_val_t fr_uses_etre(el_val_t verb); el_val_t fr_past_participle(el_val_t verb); el_val_t fr_avoir_present(el_val_t slot); el_val_t fr_etre_present(el_val_t slot); el_val_t fr_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t fr_gender(el_val_t noun); el_val_t fr_invariant_plural(el_val_t noun); el_val_t fr_pluralize(el_val_t noun); el_val_t fr_agree_article(el_val_t noun, el_val_t definite, el_val_t number); el_val_t fr_subject_starts_vowel(el_val_t subject); el_val_t fr_verb_ends_vowel(el_val_t verb_form); el_val_t fr_question_inversion(el_val_t subject, el_val_t verb_form); el_val_t de_article_def(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t de_article_indef(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t de_article(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t de_adj_ending(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t article_type); el_val_t de_noun_plural(el_val_t noun, el_val_t gender); el_val_t de_case_ending(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t de_conjugate_weak(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); el_val_t de_irregular_present(el_val_t verb, el_val_t person, el_val_t number); el_val_t de_strong_past_stem(el_val_t verb); el_val_t de_norm_number(el_val_t number); el_val_t de_norm_person(el_val_t person); el_val_t de_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t ru_gender(el_val_t noun); el_val_t ru_stem_type(el_val_t noun, el_val_t gender); el_val_t ru_noun_case(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number); 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); 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 ru_decline_fem(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number); 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 ru_past_agree(el_val_t verb_stem, el_val_t gender, el_val_t number); el_val_t ru_conjugate_1st(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); el_val_t ru_conjugate_2nd(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); 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 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); el_val_t fi_str_last_char(el_val_t s); el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t fi_verb_stem(el_val_t dict_form); el_val_t fi_irregular_verb(el_val_t dict_form); el_val_t fi_present_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony); el_val_t fi_past_stem(el_val_t stem); 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 fi_neg_aux(el_val_t person, el_val_t number); el_val_t fi_negative(el_val_t verb, el_val_t person, el_val_t number); el_val_t fi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t fi_question_suffix(el_val_t harmony); el_val_t fi_make_question(el_val_t verb_form, el_val_t harmony); el_val_t fi_full_paradigm(el_val_t noun); el_val_t ar_str_ends(el_val_t s, el_val_t suf); el_val_t ar_str_len(el_val_t s); el_val_t ar_str_drop_last(el_val_t s, el_val_t n); el_val_t ar_str_last_char(el_val_t s); el_val_t ar_slot(el_val_t person, el_val_t gender, el_val_t number); el_val_t ar_perfect_suffix(el_val_t slot); el_val_t ar_imperfect_prefix(el_val_t slot); el_val_t ar_imperfect_suffix(el_val_t slot); el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot); el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense); el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense); el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense); el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense); el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense); el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense); el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t ar_present_stem(el_val_t verb); 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 ar_is_sun_letter(el_val_t c); el_val_t ar_definite_article(el_val_t noun); el_val_t ar_case_ending(el_val_t kase, el_val_t definite); el_val_t ar_gender(el_val_t noun); el_val_t ar_masc_pl_ending(el_val_t kase); el_val_t ar_sound_plural(el_val_t noun, el_val_t gender); 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 ar_verb_form(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t hi_str_ends(el_val_t s, el_val_t suf); el_val_t hi_str_drop_last(el_val_t s, el_val_t n); el_val_t hi_str_last_char(el_val_t s); el_val_t hi_gender(el_val_t noun); el_val_t hi_masc_aa_stem(el_val_t noun); el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number); el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number); el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number); el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number); el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number); el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number); el_val_t hi_postposition(el_val_t gram_case); el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number); el_val_t hi_verb_stem(el_val_t infinitive); el_val_t hi_verb_stem_clean(el_val_t infinitive); el_val_t hi_present_aspect(el_val_t gender, el_val_t number); el_val_t hi_aux_present(el_val_t person, el_val_t number); el_val_t hi_past_suffix(el_val_t gender, el_val_t number); el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number); el_val_t hi_future_suffix(el_val_t person, el_val_t number, el_val_t gender); el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number); el_val_t hi_hona_present(el_val_t person, el_val_t number); el_val_t hi_hona_past(el_val_t gender, el_val_t number); 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 hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case); 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 sw_str_ends(el_val_t s, el_val_t suf); el_val_t sw_str_drop_last(el_val_t s, el_val_t n); el_val_t sw_str_first_char(el_val_t s); el_val_t sw_str_first2(el_val_t s); el_val_t sw_str_first3(el_val_t s); el_val_t sw_str_last_char(el_val_t s); el_val_t sw_is_class1_noun(el_val_t noun); el_val_t sw_noun_class(el_val_t noun); el_val_t sw_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class); el_val_t sw_obj_prefix(el_val_t person, el_val_t number, el_val_t noun_class); el_val_t sw_tense_marker(el_val_t tense); el_val_t sw_verb_final(el_val_t tense, el_val_t negative); el_val_t sw_neg_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class); el_val_t sw_verb_stem(el_val_t infinitive); 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 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 sw_noun_plural(el_val_t noun); el_val_t sw_adj_prefix(el_val_t noun_class, el_val_t number); el_val_t sw_agree_adj(el_val_t adj_stem, el_val_t noun_class, el_val_t number); el_val_t sw_demonstrative(el_val_t noun_class, el_val_t number, el_val_t proximity); el_val_t sw_copula_present(el_val_t person, el_val_t number, el_val_t use_case); el_val_t sw_copula_neg_present(el_val_t person, el_val_t number); el_val_t la_str_ends(el_val_t s, el_val_t suf); el_val_t la_str_drop_last(el_val_t s, el_val_t n); el_val_t la_str_last_char(el_val_t s); el_val_t la_str_last2(el_val_t s); el_val_t la_str_last3(el_val_t s); el_val_t la_slot(el_val_t person, el_val_t number); el_val_t la_verb_class(el_val_t verb); el_val_t la_stem(el_val_t verb, el_val_t vclass); el_val_t la_perfect_stem(el_val_t verb, el_val_t vclass); el_val_t la_perfect_ending(el_val_t slot); el_val_t la_present_ending(el_val_t vclass, el_val_t slot); el_val_t la_present_form(el_val_t stem, el_val_t vclass, el_val_t slot); el_val_t la_future_ending_12(el_val_t slot); el_val_t la_future_ending_34(el_val_t slot); el_val_t la_future_form(el_val_t stem, el_val_t vclass, el_val_t slot); el_val_t la_esse_present(el_val_t slot); el_val_t la_esse_past(el_val_t slot); el_val_t la_esse_future(el_val_t slot); el_val_t la_ire_present(el_val_t slot); el_val_t la_ire_past(el_val_t slot); el_val_t la_ire_future(el_val_t slot); el_val_t la_velle_present(el_val_t slot); el_val_t la_velle_past(el_val_t slot); el_val_t la_velle_future(el_val_t slot); el_val_t la_posse_present(el_val_t slot); el_val_t la_posse_past(el_val_t slot); el_val_t la_posse_future(el_val_t slot); el_val_t la_irregular_perfect_stem(el_val_t verb); el_val_t la_map_canonical(el_val_t verb); el_val_t la_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t la_declension(el_val_t noun); el_val_t la_decline_1(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_3(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_decline_4(el_val_t stem, el_val_t gram_case, el_val_t number); 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); el_val_t he_str_last_char(el_val_t s); el_val_t he_slot(el_val_t person, el_val_t gender, el_val_t number); el_val_t he_present_form_code(el_val_t slot); el_val_t he_copula_past(el_val_t slot); el_val_t he_copula_future(el_val_t slot); el_val_t he_is_copula(el_val_t verb); el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t he_present_lir_ot(el_val_t form); el_val_t he_present_le_exol(el_val_t form); el_val_t he_present_ledaber(el_val_t form); el_val_t he_present_lalechet(el_val_t form); el_val_t he_past_lir_ot(el_val_t slot); el_val_t he_past_le_exol(el_val_t slot); el_val_t he_past_ledaber(el_val_t slot); el_val_t he_past_lalechet(el_val_t slot); el_val_t he_future_lir_ot(el_val_t slot); el_val_t he_future_le_exol(el_val_t slot); el_val_t he_future_ledaber(el_val_t slot); el_val_t he_future_lalechet(el_val_t slot); el_val_t he_known_verb(el_val_t verb, el_val_t tense, el_val_t slot); 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 he_pluralize(el_val_t noun, el_val_t gender); el_val_t he_is_hebrew_script(el_val_t noun); el_val_t he_definite_prefix(el_val_t noun); 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 he_map_canonical(el_val_t verb); el_val_t grc_str_ends(el_val_t s, el_val_t suf); el_val_t grc_str_drop_last(el_val_t s, el_val_t n); el_val_t grc_str_last_char(el_val_t s); el_val_t grc_str_last2(el_val_t s); el_val_t grc_str_last3(el_val_t s); el_val_t grc_slot(el_val_t person, el_val_t number); el_val_t grc_map_canonical(el_val_t verb); el_val_t grc_einai_present(el_val_t slot); el_val_t grc_einai_imperfect(el_val_t slot); el_val_t grc_einai_future(el_val_t slot); el_val_t grc_echein_present(el_val_t slot); el_val_t grc_echein_imperfect(el_val_t slot); el_val_t grc_echein_aorist(el_val_t slot); el_val_t grc_echein_future(el_val_t slot); el_val_t grc_legein_present(el_val_t slot); el_val_t grc_legein_imperfect(el_val_t slot); el_val_t grc_legein_aorist(el_val_t slot); el_val_t grc_legein_future(el_val_t slot); el_val_t grc_horao_present(el_val_t slot); el_val_t grc_horao_imperfect(el_val_t slot); el_val_t grc_horao_aorist(el_val_t slot); el_val_t grc_horao_future(el_val_t slot); el_val_t grc_erchesthai_present(el_val_t slot); el_val_t grc_erchesthai_imperfect(el_val_t slot); el_val_t grc_erchesthai_aorist(el_val_t slot); el_val_t grc_erchesthai_future(el_val_t slot); el_val_t grc_thematic_present_ending(el_val_t slot); el_val_t grc_thematic_imperfect_ending(el_val_t slot); el_val_t grc_thematic_future_ending(el_val_t slot); el_val_t grc_weak_aorist_ending(el_val_t slot); el_val_t grc_present_stem(el_val_t verb); el_val_t grc_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t grc_declension(el_val_t noun); el_val_t grc_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_1a(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_1e(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t grc_article_masculine(el_val_t gram_case, el_val_t number); el_val_t grc_article_feminine(el_val_t gram_case, el_val_t number); el_val_t grc_article_neuter(el_val_t gram_case, el_val_t number); el_val_t grc_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t grc_infer_gender(el_val_t noun); 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 ang_str_ends(el_val_t s, el_val_t suf); el_val_t ang_str_drop_last(el_val_t s, el_val_t n); el_val_t ang_str_last_char(el_val_t s); el_val_t ang_str_last2(el_val_t s); el_val_t ang_slot(el_val_t person, el_val_t number); el_val_t ang_map_canonical(el_val_t verb); el_val_t ang_wesan_past(el_val_t slot); el_val_t ang_beon_present(el_val_t slot); el_val_t ang_wesan_present(el_val_t slot); el_val_t ang_habban_present(el_val_t slot); el_val_t ang_habban_past(el_val_t slot); el_val_t ang_gan_present(el_val_t slot); el_val_t ang_gan_past(el_val_t slot); el_val_t ang_cuman_present(el_val_t slot); el_val_t ang_cuman_past(el_val_t slot); el_val_t ang_secgan_present(el_val_t slot); el_val_t ang_secgan_past(el_val_t slot); el_val_t ang_seon_present(el_val_t slot); el_val_t ang_seon_past(el_val_t slot); el_val_t ang_don_present(el_val_t slot); el_val_t ang_don_past(el_val_t slot); el_val_t ang_willan_present(el_val_t slot); el_val_t ang_willan_past(el_val_t slot); el_val_t ang_magan_present(el_val_t slot); el_val_t ang_magan_past(el_val_t slot); el_val_t ang_witan_present(el_val_t slot); el_val_t ang_witan_past(el_val_t slot); el_val_t ang_weak_present_ending(el_val_t slot); el_val_t ang_weak_past_stem(el_val_t stem); el_val_t ang_weak_past(el_val_t stem, el_val_t slot); el_val_t ang_weak_stem(el_val_t verb); el_val_t ang_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t ang_declension(el_val_t noun, el_val_t gender); el_val_t ang_decline_strong_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t ang_decline_strong_neut(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t ang_decline_weak(el_val_t noun, el_val_t gram_case, el_val_t number); 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 ang_article_masculine(el_val_t gram_case, el_val_t number); el_val_t ang_article_feminine(el_val_t gram_case, el_val_t number); el_val_t ang_article_neuter(el_val_t gram_case, el_val_t number); el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t ang_infer_gender(el_val_t noun); 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 sa_str_ends(el_val_t s, el_val_t suf); el_val_t sa_str_drop_last(el_val_t s, el_val_t n); el_val_t sa_slot(el_val_t person, el_val_t number); el_val_t sa_map_canonical(el_val_t verb); el_val_t sa_as_present(el_val_t slot); el_val_t sa_as_past(el_val_t slot); el_val_t sa_as_future(el_val_t slot); el_val_t sa_bhu_present(el_val_t slot); el_val_t sa_bhu_past(el_val_t slot); el_val_t sa_bhu_future(el_val_t slot); el_val_t sa_gam_present(el_val_t slot); el_val_t sa_gam_past(el_val_t slot); el_val_t sa_gam_future(el_val_t slot); el_val_t sa_drs_present(el_val_t slot); el_val_t sa_drs_past(el_val_t slot); el_val_t sa_drs_future(el_val_t slot); el_val_t sa_vad_present(el_val_t slot); el_val_t sa_vad_past(el_val_t slot); el_val_t sa_vad_future(el_val_t slot); el_val_t sa_kr_present(el_val_t slot); el_val_t sa_kr_past(el_val_t slot); el_val_t sa_kr_future(el_val_t slot); el_val_t sa_class1_present_ending(el_val_t slot); el_val_t sa_class1_past_ending(el_val_t slot); el_val_t sa_class1_future_ending(el_val_t slot); el_val_t sa_class1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot); el_val_t sa_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t sa_decline_a_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_a_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_aa_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_aa_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t sa_stem_type(el_val_t noun); el_val_t sa_extract_stem(el_val_t noun, el_val_t stype); el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sa_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t got_str_ends(el_val_t s, el_val_t suf); el_val_t got_str_drop_last(el_val_t s, el_val_t n); el_val_t got_slot(el_val_t person, el_val_t number); el_val_t got_map_canonical(el_val_t verb); el_val_t got_wisan_present(el_val_t slot); el_val_t got_wisan_past(el_val_t slot); el_val_t got_haban_present(el_val_t slot); el_val_t got_haban_past(el_val_t slot); el_val_t got_gaggan_present(el_val_t slot); el_val_t got_gaggan_past(el_val_t slot); el_val_t got_saihwan_present(el_val_t slot); el_val_t got_saihwan_past(el_val_t slot); el_val_t got_qithan_present(el_val_t slot); el_val_t got_qithan_past(el_val_t slot); el_val_t got_niman_present(el_val_t slot); el_val_t got_niman_past(el_val_t slot); el_val_t got_wk1_present_ending(el_val_t slot); el_val_t got_wk1_past_ending(el_val_t slot); el_val_t got_wk1_conjugate(el_val_t stem, el_val_t tense, el_val_t slot); el_val_t got_wk2_present_ending(el_val_t slot); el_val_t got_wk2_past_ending(el_val_t slot); el_val_t got_wk2_conjugate(el_val_t stem, el_val_t tense, el_val_t slot); el_val_t got_verb_class(el_val_t verb); el_val_t got_verb_stem(el_val_t verb, el_val_t vclass); el_val_t got_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t got_decline_a_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t got_decline_a_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_decline_o_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t got_decline_o_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_decline_n_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t got_decline_n_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_stem_type(el_val_t noun); el_val_t got_extract_stem(el_val_t noun, el_val_t stype); el_val_t got_demo_article(el_val_t stype); el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number); 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 non_str_ends(el_val_t s, el_val_t suf); el_val_t non_drop(el_val_t s, el_val_t n); el_val_t non_last(el_val_t s); el_val_t non_slot(el_val_t person, el_val_t number); el_val_t non_vera_present(el_val_t slot); el_val_t non_vera_past(el_val_t slot); el_val_t non_hafa_present(el_val_t slot); el_val_t non_hafa_past(el_val_t slot); el_val_t non_ganga_present(el_val_t slot); el_val_t non_ganga_past(el_val_t slot); el_val_t non_sja_present(el_val_t slot); el_val_t non_sja_past(el_val_t slot); el_val_t non_segja_present(el_val_t slot); el_val_t non_segja_past(el_val_t slot); el_val_t non_koma_present(el_val_t slot); el_val_t non_koma_past(el_val_t slot); el_val_t non_map_canonical(el_val_t verb); el_val_t non_weak_present(el_val_t stem, el_val_t slot); el_val_t non_weak_past(el_val_t stem, el_val_t slot); el_val_t non_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t non_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_decline_neut(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_detect_gender(el_val_t noun); el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_masc(el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_neut(el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_fem(el_val_t gram_case, el_val_t number); 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 enm_str_ends(el_val_t s, el_val_t suf); el_val_t enm_drop(el_val_t s, el_val_t n); el_val_t enm_first_char(el_val_t s); el_val_t enm_slot(el_val_t person, el_val_t number); el_val_t enm_been_present(el_val_t slot); el_val_t enm_been_past(el_val_t slot); el_val_t enm_haven_present(el_val_t slot); el_val_t enm_haven_past(el_val_t slot); el_val_t enm_goon_present(el_val_t slot); el_val_t enm_goon_past(el_val_t slot); el_val_t enm_seen_present(el_val_t slot); el_val_t enm_seen_past(el_val_t slot); el_val_t enm_seyen_present(el_val_t slot); el_val_t enm_seyen_past(el_val_t slot); el_val_t enm_comen_present(el_val_t slot); el_val_t enm_comen_past(el_val_t slot); el_val_t enm_maken_present(el_val_t slot); el_val_t enm_maken_past(el_val_t slot); el_val_t enm_map_canonical(el_val_t verb); el_val_t enm_weak_stem(el_val_t verb); el_val_t enm_weak_present(el_val_t stem, el_val_t slot); el_val_t enm_weak_past(el_val_t stem, el_val_t slot); el_val_t enm_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t enm_irregular_plural(el_val_t noun); el_val_t enm_make_plural(el_val_t noun); el_val_t enm_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t enm_is_vowel_initial(el_val_t s); el_val_t enm_indef_article(el_val_t noun_phrase); 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 pi_str_ends(el_val_t s, el_val_t suf); el_val_t pi_drop(el_val_t s, el_val_t n); el_val_t pi_last_char(el_val_t s); el_val_t pi_slot(el_val_t person, el_val_t number); el_val_t pi_present_ending(el_val_t slot); el_val_t pi_aorist_ending(el_val_t slot); el_val_t pi_future_ending(el_val_t slot); el_val_t pi_hoti_present(el_val_t slot); el_val_t pi_atthi_present(el_val_t slot); el_val_t pi_hoti_aorist(el_val_t slot); el_val_t pi_hoti_future(el_val_t slot); el_val_t pi_gacchati_present(el_val_t slot); el_val_t pi_gacchati_aorist(el_val_t slot); el_val_t pi_gacchati_future(el_val_t slot); el_val_t pi_passati_present(el_val_t slot); el_val_t pi_passati_aorist(el_val_t slot); el_val_t pi_passati_future(el_val_t slot); el_val_t pi_vadati_present(el_val_t slot); el_val_t pi_vadati_aorist(el_val_t slot); el_val_t pi_vadati_future(el_val_t slot); el_val_t pi_karoti_present(el_val_t slot); el_val_t pi_karoti_aorist(el_val_t slot); el_val_t pi_karoti_future(el_val_t slot); el_val_t pi_map_canonical(el_val_t verb); el_val_t pi_regular_root(el_val_t verb); el_val_t pi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t pi_decline_a_masc_sg(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_masc_pl(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_fem_sg(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_fem_pl(el_val_t stem, el_val_t gram_case); el_val_t pi_detect_class(el_val_t noun); el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t pi_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t fro_str_ends(el_val_t s, el_val_t suf); el_val_t fro_drop(el_val_t s, el_val_t n); el_val_t fro_slot(el_val_t person, el_val_t number); el_val_t fro_map_canonical(el_val_t verb); el_val_t fro_estre_present(el_val_t slot); el_val_t fro_estre_past(el_val_t slot); el_val_t fro_estre_future(el_val_t slot); el_val_t fro_avoir_present(el_val_t slot); el_val_t fro_avoir_past(el_val_t slot); el_val_t fro_avoir_future(el_val_t slot); el_val_t fro_aler_present(el_val_t slot); el_val_t fro_aler_past(el_val_t slot); el_val_t fro_aler_future(el_val_t slot); el_val_t fro_venir_present(el_val_t slot); el_val_t fro_venir_past(el_val_t slot); el_val_t fro_venir_future(el_val_t slot); el_val_t fro_faire_present(el_val_t slot); el_val_t fro_faire_past(el_val_t slot); el_val_t fro_faire_future(el_val_t slot); el_val_t fro_verb_class(el_val_t verb); el_val_t fro_verb_stem(el_val_t verb, el_val_t vclass); el_val_t fro_conj1_present(el_val_t stem, el_val_t slot); el_val_t fro_conj1_past(el_val_t stem, el_val_t slot); el_val_t fro_conj1_future(el_val_t verb, el_val_t slot); el_val_t fro_conj2_present(el_val_t stem, el_val_t slot); el_val_t fro_conj2_past(el_val_t stem, el_val_t slot); el_val_t fro_conj2_future(el_val_t verb, el_val_t slot); el_val_t fro_conj3_present(el_val_t stem, el_val_t slot); el_val_t fro_conj3_past(el_val_t stem, el_val_t slot); el_val_t fro_conj3_future(el_val_t verb, el_val_t slot); el_val_t fro_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t fro_gender(el_val_t noun); el_val_t fro_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t fro_decline_fem(el_val_t noun, el_val_t number); el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t fro_article(el_val_t gender, el_val_t gram_case, el_val_t number); 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 goh_str_ends(el_val_t s, el_val_t suf); el_val_t goh_drop(el_val_t s, el_val_t n); el_val_t goh_slot(el_val_t person, el_val_t number); el_val_t goh_map_canonical(el_val_t verb); el_val_t goh_wesan_present(el_val_t slot); el_val_t goh_wesan_past(el_val_t slot); el_val_t goh_haben_present(el_val_t slot); el_val_t goh_haben_past(el_val_t slot); el_val_t goh_gan_present(el_val_t slot); el_val_t goh_gan_past(el_val_t slot); el_val_t goh_sehan_present(el_val_t slot); el_val_t goh_sehan_past(el_val_t slot); el_val_t goh_quethan_present(el_val_t slot); el_val_t goh_quethan_past(el_val_t slot); el_val_t goh_tuon_present(el_val_t slot); el_val_t goh_tuon_past(el_val_t slot); el_val_t goh_weak_present(el_val_t stem, el_val_t slot); el_val_t goh_weak_past(el_val_t stem, el_val_t slot); el_val_t goh_verb_stem(el_val_t verb); el_val_t goh_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t goh_stem_type(el_val_t noun); el_val_t goh_extract_stem(el_val_t noun, el_val_t stype); el_val_t goh_decline_masc_a_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_masc_a_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_fem_o_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_fem_o_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_neut_a_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_neut_a_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_masc_n_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_masc_n_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t goh_demo_article(el_val_t stype, el_val_t number); 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 sga_drop(el_val_t s, el_val_t n); el_val_t sga_first(el_val_t s); el_val_t sga_rest(el_val_t s); el_val_t sga_slot(el_val_t person, el_val_t number); el_val_t sga_lenite(el_val_t word); el_val_t sga_copula_present(el_val_t slot); el_val_t sga_bith_present(el_val_t slot); el_val_t sga_bith_past(el_val_t slot); el_val_t sga_teit_present(el_val_t slot); el_val_t sga_teit_past(el_val_t slot); el_val_t sga_gaibid_present(el_val_t slot); el_val_t sga_adci_present(el_val_t slot); el_val_t sga_asbeir_present(el_val_t slot); el_val_t sga_map_canonical(el_val_t verb); el_val_t sga_ai_present(el_val_t stem, el_val_t slot); el_val_t sga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t sga_decline_ostem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sga_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sga_detect_gender(el_val_t noun); el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number); 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 txb_drop(el_val_t s, el_val_t n); el_val_t txb_ends(el_val_t s, el_val_t suf); el_val_t txb_slot(el_val_t person, el_val_t number); el_val_t txb_pres1_suffix(el_val_t slot); el_val_t txb_kam_present(el_val_t slot); el_val_t txb_ya_present(el_val_t slot); el_val_t txb_wes_present(el_val_t slot); el_val_t txb_lyut_present(el_val_t slot); el_val_t txb_wak_present(el_val_t slot); el_val_t txb_map_canonical(el_val_t verb); el_val_t txb_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t txb_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_detect_gender(el_val_t noun); el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t peo_drop(el_val_t s, el_val_t n); el_val_t peo_ends(el_val_t s, el_val_t suf); el_val_t peo_slot(el_val_t person, el_val_t number); el_val_t peo_present_suffix(el_val_t slot); el_val_t peo_past_suffix(el_val_t slot); el_val_t peo_ah_present(el_val_t slot); el_val_t peo_ah_past(el_val_t slot); el_val_t peo_kar_present(el_val_t slot); el_val_t peo_kar_past(el_val_t slot); el_val_t peo_xsaya_present(el_val_t slot); el_val_t peo_tar_present(el_val_t slot); el_val_t peo_da_present(el_val_t slot); el_val_t peo_da_past(el_val_t slot); el_val_t peo_map_canonical(el_val_t verb); el_val_t peo_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t peo_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t peo_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t akk_str_ends(el_val_t s, el_val_t suf); el_val_t akk_str_len(el_val_t s); el_val_t akk_str_drop_last(el_val_t s, el_val_t n); el_val_t akk_slot(el_val_t person, el_val_t number); el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t akk_copula_present(el_val_t slot); el_val_t akk_copula_stative(el_val_t slot); el_val_t akk_is_copula(el_val_t verb); el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t akk_alaku_present(el_val_t slot); el_val_t akk_alaku_perfect(el_val_t slot); el_val_t akk_amaru_present(el_val_t slot); el_val_t akk_amaru_perfect(el_val_t slot); el_val_t akk_amaru_stative(el_val_t slot); el_val_t akk_qabu_present(el_val_t slot); el_val_t akk_qabu_perfect(el_val_t slot); el_val_t akk_qabu_stative(el_val_t slot); el_val_t akk_epesu_present(el_val_t slot); el_val_t akk_epesu_perfect(el_val_t slot); el_val_t akk_epesu_stative(el_val_t slot); el_val_t akk_regular_present(el_val_t stem, el_val_t slot); el_val_t akk_regular_perfect(el_val_t stem, el_val_t slot); el_val_t akk_regular_stative(el_val_t stem, el_val_t slot); el_val_t akk_known_verb(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t akk_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t akk_strip_nom(el_val_t noun); el_val_t akk_is_fem(el_val_t noun); el_val_t akk_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t akk_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t akk_map_canonical(el_val_t verb); el_val_t uga_str_ends(el_val_t s, el_val_t suf); el_val_t uga_str_len(el_val_t s); el_val_t uga_str_drop_last(el_val_t s, el_val_t n); el_val_t uga_slot(el_val_t person, el_val_t number); el_val_t uga_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t uga_kn_perfect(el_val_t slot); el_val_t uga_kn_imperfect(el_val_t slot); el_val_t uga_is_copula(el_val_t verb); el_val_t uga_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t uga_hlk_perfect(el_val_t slot); el_val_t uga_hlk_imperfect(el_val_t slot); el_val_t uga_ray_perfect(el_val_t slot); el_val_t uga_ray_imperfect(el_val_t slot); el_val_t uga_amr_perfect(el_val_t slot); el_val_t uga_amr_imperfect(el_val_t slot); el_val_t uga_generic_perfect(el_val_t base3sg, el_val_t slot); el_val_t uga_generic_imperfect(el_val_t base3sg, el_val_t slot); el_val_t uga_known_verb(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t uga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t uga_strip_nom(el_val_t noun); el_val_t uga_is_fem(el_val_t noun); el_val_t uga_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t uga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t uga_map_canonical(el_val_t verb); el_val_t egy_str_ends(el_val_t s, el_val_t suf); el_val_t egy_str_len(el_val_t s); el_val_t egy_drop(el_val_t s, el_val_t n); el_val_t egy_last_char(el_val_t s); el_val_t egy_slot(el_val_t person, el_val_t number); el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number); el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number); el_val_t egy_suffix_pronoun(el_val_t slot); el_val_t egy_is_copula(el_val_t verb); el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t egy_rdi_present(el_val_t slot); el_val_t egy_rdi_past(el_val_t slot); el_val_t egy_rdi_future(el_val_t slot); el_val_t egy_mAA_present(el_val_t slot); el_val_t egy_mAA_past(el_val_t slot); el_val_t egy_mAA_future(el_val_t slot); el_val_t egy_Dd_present(el_val_t slot); el_val_t egy_Dd_past(el_val_t slot); el_val_t egy_Dd_future(el_val_t slot); el_val_t egy_Sm_present(el_val_t slot); el_val_t egy_Sm_past(el_val_t slot); el_val_t egy_Sm_future(el_val_t slot); el_val_t egy_iri_present(el_val_t slot); el_val_t egy_iri_past(el_val_t slot); el_val_t egy_iri_future(el_val_t slot); el_val_t egy_sdm_present(el_val_t slot); el_val_t egy_sdm_past(el_val_t slot); el_val_t egy_sdm_future(el_val_t slot); el_val_t egy_known_verb(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t egy_regular_present(el_val_t stem, el_val_t slot); el_val_t egy_regular_past(el_val_t stem, el_val_t slot); el_val_t egy_regular_future(el_val_t stem, el_val_t slot); el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t egy_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t egy_fem(el_val_t noun); el_val_t egy_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t egy_map_canonical(el_val_t verb); el_val_t sux_str_ends(el_val_t s, el_val_t suf); el_val_t sux_str_drop_last(el_val_t s, el_val_t n); el_val_t sux_str_last_char(el_val_t s); el_val_t sux_str_last2(el_val_t s); el_val_t sux_slot(el_val_t person, el_val_t number); el_val_t sux_ergative_suffix(el_val_t person, el_val_t number); el_val_t sux_absolutive_suffix(el_val_t person, el_val_t number); el_val_t sux_map_canonical(el_val_t verb); el_val_t sux_personal_suffix(el_val_t slot); el_val_t sux_me_present(el_val_t slot); el_val_t sux_me_past(el_val_t slot); el_val_t sux_dug4_present(el_val_t slot); el_val_t sux_dug4_past(el_val_t slot); el_val_t sux_du_present(el_val_t slot); el_val_t sux_du_past(el_val_t slot); el_val_t sux_igibar_present(el_val_t slot); el_val_t sux_igibar_past(el_val_t slot); el_val_t sux_ak_present(el_val_t slot); el_val_t sux_ak_past(el_val_t slot); el_val_t sux_tum2_present(el_val_t slot); el_val_t sux_tum2_past(el_val_t slot); el_val_t sux_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t sux_is_animate(el_val_t noun); el_val_t sux_case_suffix(el_val_t gram_case); el_val_t sux_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sux_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); 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 sux_realize_sentence(el_val_t intent, el_val_t agent, el_val_t predicate, el_val_t patient, el_val_t tense); el_val_t gez_str_ends(el_val_t s, el_val_t suf); el_val_t gez_str_len(el_val_t s); el_val_t gez_str_drop_last(el_val_t s, el_val_t n); el_val_t gez_slot(el_val_t person, el_val_t number); el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t gez_kwn_perfect(el_val_t slot); el_val_t gez_kwn_imperfect(el_val_t slot); el_val_t gez_is_copula(el_val_t verb); el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t gez_hlw_perfect(el_val_t slot); el_val_t gez_hlw_imperfect(el_val_t slot); el_val_t gez_hbl_perfect(el_val_t slot); el_val_t gez_hbl_imperfect(el_val_t slot); el_val_t gez_ray_perfect(el_val_t slot); el_val_t gez_ray_imperfect(el_val_t slot); el_val_t gez_qwl_perfect(el_val_t slot); el_val_t gez_qwl_imperfect(el_val_t slot); el_val_t gez_generic_perfect(el_val_t base3sg, el_val_t slot); el_val_t gez_generic_imperfect(el_val_t base3sg, el_val_t slot); el_val_t gez_known_verb(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t gez_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t gez_is_fidel(el_val_t noun); el_val_t gez_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t gez_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t gez_map_canonical(el_val_t verb); el_val_t cop_str_ends(el_val_t s, el_val_t suf); el_val_t cop_str_len(el_val_t s); el_val_t cop_drop(el_val_t s, el_val_t n); el_val_t cop_last_char(el_val_t s); el_val_t cop_slot(el_val_t person, el_val_t number); el_val_t cop_subject_prefix(el_val_t person, el_val_t number); el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number); el_val_t cop_copula_particle(el_val_t gender, el_val_t number); el_val_t cop_shwpe_present(el_val_t prefix); el_val_t cop_shwpe_perfect(el_val_t prefix); el_val_t cop_shwpe_future(el_val_t prefix); el_val_t cop_bwk_present(el_val_t prefix); el_val_t cop_bwk_perfect(el_val_t prefix); el_val_t cop_bwk_future(el_val_t prefix); el_val_t cop_nau_present(el_val_t prefix); el_val_t cop_nau_perfect(el_val_t prefix); el_val_t cop_nau_future(el_val_t prefix); el_val_t cop_jw_present(el_val_t prefix); el_val_t cop_jw_perfect(el_val_t prefix); el_val_t cop_jw_future(el_val_t prefix); el_val_t cop_di_present(el_val_t prefix); el_val_t cop_di_perfect(el_val_t prefix); el_val_t cop_di_future(el_val_t prefix); el_val_t cop_is_copula(el_val_t verb); el_val_t cop_known_verb_prefixed(el_val_t verb, el_val_t tense, el_val_t prefix); el_val_t cop_regular_present(el_val_t prefix, el_val_t stem); el_val_t cop_regular_perfect(el_val_t prefix, el_val_t stem); el_val_t cop_regular_future(el_val_t prefix, el_val_t stem); el_val_t cop_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t cop_article(el_val_t gender, el_val_t number, el_val_t definite); el_val_t cop_decline(el_val_t noun, el_val_t gram_case, el_val_t number); 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 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 cop_map_canonical(el_val_t verb); el_val_t slots_get(el_val_t slots, el_val_t key); el_val_t slots_set(el_val_t slots, el_val_t key, el_val_t val); el_val_t make_slots(el_val_t k0, el_val_t v0); el_val_t make_slots2(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1); 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 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 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 rule_id(el_val_t rule); el_val_t rule_lhs(el_val_t rule); el_val_t rule_rhs_len(el_val_t rule); el_val_t rule_rhs(el_val_t rule, el_val_t idx); el_val_t make_rule(el_val_t id, el_val_t lhs, el_val_t r0); el_val_t make_rule2(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1); 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 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 build_rules(void); el_val_t get_rules(void); el_val_t find_rule(el_val_t rule_id_str); el_val_t make_leaf(el_val_t label, el_val_t word); el_val_t make_node1(el_val_t label, el_val_t child0); el_val_t make_node2(el_val_t label, el_val_t child0, el_val_t child1); el_val_t make_node3(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2); 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); el_val_t nlg_is_ws(el_val_t c); el_val_t skip_ws(el_val_t s, el_val_t pos); el_val_t scan_token(el_val_t s, el_val_t start); el_val_t render_tree(el_val_t tree); el_val_t gram_word_order(el_val_t profile); 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 gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile); el_val_t gram_question_strategy(el_val_t profile); el_val_t is_pronoun(el_val_t word); el_val_t build_np(el_val_t referent, el_val_t slots); el_val_t build_pp(el_val_t loc); el_val_t build_vp_body(el_val_t slots); el_val_t build_vp_from_slots(el_val_t slots); el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots); el_val_t agent_person(el_val_t agent); el_val_t agent_number(el_val_t agent); el_val_t realize_np(el_val_t referent, el_val_t number); 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 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 capitalize_first(el_val_t s); el_val_t add_punct(el_val_t s, el_val_t intent); el_val_t realize_lang(el_val_t form, el_val_t profile); el_val_t realize(el_val_t form); el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers); 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 sem_frame_simple(el_val_t intent, el_val_t subject); el_val_t sem_frame_obj(el_val_t intent, el_val_t subject, el_val_t obj); el_val_t sem_intent(el_val_t frame); el_val_t sem_subject(el_val_t frame); el_val_t sem_object(el_val_t frame); el_val_t sem_modifiers(el_val_t frame); el_val_t sem_lang(el_val_t frame); el_val_t sem_first_modifier(el_val_t mods); el_val_t sem_intent_to_realize(el_val_t intent); el_val_t sem_to_spec(el_val_t frame); 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 sem_realize_greet(el_val_t subject); el_val_t sem_realize(el_val_t frame); 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 sem_realize_lang(el_val_t frame, el_val_t lang_code); el_val_t sem_get(el_val_t json, el_val_t key); el_val_t generate_frame(el_val_t frame); el_val_t generate_frame_lang(el_val_t frame, el_val_t lang_code); 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 elp_extract_topic(el_val_t msg); el_val_t elp_detect_predicate(el_val_t msg); el_val_t elp_parse(el_val_t msg); el_val_t handle_elp_chat(el_val_t body); 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; return 0; } el_val_t generate_frame(el_val_t frame) { return sem_realize(frame); return 0; } el_val_t generate_frame_lang(el_val_t frame, el_val_t lang_code) { return sem_realize_lang(frame, lang_code); return 0; } el_val_t build_form_from_json(el_val_t semantic_form_json, el_val_t lang_code) { el_val_t intent = sem_get(semantic_form_json, EL_STR("intent")); el_val_t agent = sem_get(semantic_form_json, EL_STR("agent")); el_val_t predicate = sem_get(semantic_form_json, EL_STR("predicate")); el_val_t patient = sem_get(semantic_form_json, EL_STR("patient")); el_val_t location = sem_get(semantic_form_json, EL_STR("location")); el_val_t tense = sem_get(semantic_form_json, EL_STR("tense")); el_val_t aspect = sem_get(semantic_form_json, EL_STR("aspect")); el_val_t form = native_list_empty(); form = native_list_append(form, EL_STR("intent")); form = native_list_append(form, intent); form = native_list_append(form, EL_STR("agent")); form = native_list_append(form, agent); form = native_list_append(form, EL_STR("predicate")); form = native_list_append(form, predicate); form = native_list_append(form, EL_STR("patient")); form = native_list_append(form, patient); form = native_list_append(form, EL_STR("location")); form = native_list_append(form, location); form = native_list_append(form, EL_STR("tense")); form = native_list_append(form, tense); form = native_list_append(form, EL_STR("aspect")); form = native_list_append(form, aspect); form = native_list_append(form, EL_STR("lang")); form = native_list_append(form, lang_code); return form; return 0; } el_val_t generate(el_val_t semantic_form_json) { el_val_t lang_in_json = sem_get(semantic_form_json, EL_STR("lang")); el_val_t lang_code = lang_in_json; if (str_eq(lang_code, EL_STR(""))) { lang_code = EL_STR("en"); } el_val_t form = build_form_from_json(semantic_form_json, lang_code); return realize(form); return 0; } el_val_t generate_lang(el_val_t semantic_form_json, el_val_t lang_code) { el_val_t form = build_form_from_json(semantic_form_json, lang_code); return realize(form); return 0; } el_val_t elp_extract_topic(el_val_t msg) { el_val_t m1 = ({ el_val_t _if_result_1 = 0; if (str_starts_with(msg, EL_STR("What is "))) { _if_result_1 = (str_slice(msg, 8, str_len(msg))); } else { _if_result_1 = (msg); } _if_result_1; }); el_val_t m2 = ({ el_val_t _if_result_2 = 0; if (str_starts_with(m1, EL_STR("What are "))) { _if_result_2 = (str_slice(m1, 9, str_len(m1))); } else { _if_result_2 = (m1); } _if_result_2; }); el_val_t m3 = ({ el_val_t _if_result_3 = 0; if (str_starts_with(m2, EL_STR("Tell me about "))) { _if_result_3 = (str_slice(m2, 14, str_len(m2))); } else { _if_result_3 = (m2); } _if_result_3; }); el_val_t m4 = ({ el_val_t _if_result_4 = 0; if (str_starts_with(m3, EL_STR("Who is "))) { _if_result_4 = (str_slice(m3, 7, str_len(m3))); } else { _if_result_4 = (m3); } _if_result_4; }); el_val_t m5 = ({ el_val_t _if_result_5 = 0; if (str_starts_with(m4, EL_STR("Who are "))) { _if_result_5 = (str_slice(m4, 8, str_len(m4))); } else { _if_result_5 = (m4); } _if_result_5; }); el_val_t m6 = ({ el_val_t _if_result_6 = 0; if (str_starts_with(m5, EL_STR("How do you "))) { _if_result_6 = (str_slice(m5, 11, str_len(m5))); } else { _if_result_6 = (m5); } _if_result_6; }); el_val_t m7 = ({ el_val_t _if_result_7 = 0; if (str_starts_with(m6, EL_STR("Why "))) { _if_result_7 = (str_slice(m6, 4, str_len(m6))); } else { _if_result_7 = (m6); } _if_result_7; }); el_val_t m8 = ({ el_val_t _if_result_8 = 0; if (str_starts_with(m7, EL_STR("Explain "))) { _if_result_8 = (str_slice(m7, 8, str_len(m7))); } else { _if_result_8 = (m7); } _if_result_8; }); el_val_t last = (str_len(m8) - 1); el_val_t trail = str_slice(m8, last, str_len(m8)); el_val_t clean = ({ el_val_t _if_result_9 = 0; if (((str_eq(trail, EL_STR("?")) || str_eq(trail, EL_STR("."))) || str_eq(trail, EL_STR("!")))) { _if_result_9 = (str_slice(m8, 0, last)); } else { _if_result_9 = (m8); } _if_result_9; }); return clean; return 0; } el_val_t elp_detect_predicate(el_val_t msg) { if ((str_starts_with(msg, EL_STR("What is ")) || str_starts_with(msg, EL_STR("What are "))) || str_starts_with(msg, EL_STR("Tell me about "))) { return EL_STR("tell"); } if (str_starts_with(msg, EL_STR("Who is ")) || str_starts_with(msg, EL_STR("Who are "))) { return EL_STR("identify"); } if (str_starts_with(msg, EL_STR("Why ")) || str_starts_with(msg, EL_STR("Explain "))) { return EL_STR("explain"); } if (str_starts_with(msg, EL_STR("How do you feel")) || str_starts_with(msg, EL_STR("Do you "))) { return EL_STR("express"); } if (str_starts_with(msg, EL_STR("Remember ")) || str_starts_with(msg, EL_STR("Store "))) { return EL_STR("store"); } return EL_STR("tell"); return 0; } el_val_t elp_parse(el_val_t msg) { el_val_t predicate = elp_detect_predicate(msg); el_val_t topic = elp_extract_topic(msg); el_val_t safe_topic = str_replace(topic, EL_STR("\""), EL_STR("'")); return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"predicate\":\""), predicate), EL_STR("\",\"args\":[\"")), safe_topic), EL_STR("\"],\"modifiers\":[],\"context\":{}}")); return 0; } el_val_t handle_elp_chat(el_val_t body) { el_val_t message = json_get(body, EL_STR("message")); if (str_eq(message, EL_STR(""))) { return EL_STR("{\"error\":\"message required\",\"response\":\"\"}"); } el_val_t frame = elp_parse(message); el_val_t predicate = elp_detect_predicate(message); el_val_t topic = elp_extract_topic(message); el_val_t from_topic = engram_activate_json(topic, 10); el_val_t topic_ok = (!str_eq(from_topic, EL_STR("")) && !str_eq(from_topic, EL_STR("[]"))); el_val_t candidates = ({ el_val_t _if_result_10 = 0; if (topic_ok) { _if_result_10 = (from_topic); } else { el_val_t from_msg = engram_activate_json(message, 10); el_val_t msg_ok = (!str_eq(from_msg, EL_STR("")) && !str_eq(from_msg, EL_STR("[]"))); _if_result_10 = (({ el_val_t _if_result_11 = 0; if (msg_ok) { _if_result_11 = (from_msg); } else { _if_result_11 = (engram_scan_nodes_json(5, 0)); } _if_result_11; })); } _if_result_10; }); el_val_t total = json_array_len(candidates); el_val_t fi = 0; el_val_t kept_count = 0; el_val_t kept_json = EL_STR(""); while (fi < total) { el_val_t n = json_array_get(candidates, fi); el_val_t sal_str = json_get(n, EL_STR("salience")); el_val_t imp_str = json_get(n, EL_STR("importance")); el_val_t sal_ok = ((!str_eq(sal_str, EL_STR("0")) && !str_eq(sal_str, EL_STR("0.0"))) && !str_eq(sal_str, EL_STR(""))); el_val_t imp_ok = ((!str_eq(imp_str, EL_STR("0")) && !str_eq(imp_str, EL_STR("0.0"))) && !str_eq(imp_str, EL_STR(""))); el_val_t keep_it = ((sal_ok || imp_ok) || (kept_count == 0)); if (keep_it && (kept_count < 3)) { el_val_t sep = ({ el_val_t _if_result_12 = 0; if (str_eq(kept_json, EL_STR(""))) { _if_result_12 = (EL_STR("")); } else { _if_result_12 = (EL_STR(",")); } _if_result_12; }); kept_json = el_str_concat(el_str_concat(kept_json, sep), n); kept_count = (kept_count + 1); } fi = (fi + 1); } el_val_t frame_nodes = ({ el_val_t _if_result_13 = 0; if (str_eq(kept_json, EL_STR(""))) { _if_result_13 = (EL_STR("[]")); } else { _if_result_13 = (el_str_concat(el_str_concat(EL_STR("["), kept_json), EL_STR("]"))); } _if_result_13; }); el_val_t fn_total = json_array_len(frame_nodes); el_val_t fn_i = 0; el_val_t topic_lower = str_to_lower(topic); el_val_t found_node = EL_STR(""); while (fn_i < fn_total) { el_val_t candidate = json_array_get(frame_nodes, fn_i); el_val_t cand_content = json_get(candidate, EL_STR("content")); el_val_t cand_lower = str_to_lower(cand_content); el_val_t matches = str_contains(cand_lower, topic_lower); if (matches && str_eq(found_node, EL_STR(""))) { found_node = candidate; } fn_i = (fn_i + 1); } el_val_t top_node = ({ el_val_t _if_result_14 = 0; if (str_eq(found_node, EL_STR(""))) { _if_result_14 = (json_array_get(frame_nodes, 0)); } else { _if_result_14 = (found_node); } _if_result_14; }); el_val_t top_raw = json_get(top_node, EL_STR("content")); el_val_t patient_raw = ({ el_val_t _if_result_15 = 0; if (str_eq(top_raw, EL_STR(""))) { _if_result_15 = (topic); } else { _if_result_15 = (({ el_val_t _if_result_16 = 0; if ((str_len(top_raw) > 200)) { _if_result_16 = (str_slice(top_raw, 0, 200)); } else { _if_result_16 = (top_raw); } _if_result_16; })); } _if_result_15; }); el_val_t patient_safe = str_replace(str_replace(patient_raw, EL_STR("\""), EL_STR("'")), EL_STR("\n"), EL_STR(" ")); el_val_t intent_val = ({ el_val_t _if_result_17 = 0; if (str_eq(predicate, EL_STR("store"))) { _if_result_17 = (EL_STR("command")); } else { _if_result_17 = (EL_STR("assert")); } _if_result_17; }); el_val_t gen_form = 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("{\"intent\":\""), intent_val), EL_STR("\"")), EL_STR(",\"agent\":\"I\"")), EL_STR(",\"predicate\":\"")), predicate), EL_STR("\"")), EL_STR(",\"patient\":\"")), patient_safe), EL_STR("\"")), EL_STR(",\"tense\":\"present\",\"aspect\":\"simple\",\"lang\":\"en\"}")); el_val_t realized = generate(gen_form); el_val_t response = ({ el_val_t _if_result_18 = 0; if (str_eq(realized, EL_STR(""))) { _if_result_18 = (({ el_val_t _if_result_19 = 0; if (str_eq(patient_safe, EL_STR(""))) { _if_result_19 = (EL_STR("Nothing in the engram matched that query.")); } else { _if_result_19 = (patient_safe); } _if_result_19; })); } else { _if_result_18 = (realized); } _if_result_18; }); el_val_t safe_resp = str_replace(str_replace(response, EL_STR("\""), EL_STR("'")), EL_STR("\r"), EL_STR("")); return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"response\":\""), safe_resp), EL_STR("\",\"model\":\"elp-native\",\"frame\":")), frame), EL_STR(",\"nodes\":")), frame_nodes), EL_STR("}")); return 0; } int main(int _argc, char** _argv) { el_runtime_init_args(_argc, _argv); return 0; }