48ecd83421
- Fix wrong ELP import paths in soul.el, elp-input.el, studio.el (../foundation/elp/src → ../foundation/el/elp/src) - Add missing import "morphology.el" to all 29 language morphology modules - Recompile all affected dist/*.c with correct cross-module declarations - Add dist/elp-c-decls.h: C-level master forward declarations for ELP package (enables elb --force-include to resolve undeclared cross-module calls)
1277 lines
43 KiB
C
1277 lines
43 KiB
C
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#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 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 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;
|
|
}
|
|
|