diff --git a/src/hungarian/LexiconHun.gf b/src/hungarian/LexiconHun.gf index cd6d9d54a..86ae37814 100644 --- a/src/hungarian/LexiconHun.gf +++ b/src/hungarian/LexiconHun.gf @@ -37,7 +37,7 @@ lin black_A = mkA "fekete" ; lin blood_N = mkN "vér" "vért"; -- lin blow_V = mkV "" ; lin blue_A = mkA "kék" ; -lin boat_N = mkN "hajó" "hajót" ; +lin boat_N = mkN "hajó" "hajót" "hajók" "hajója" ; -- lin bone_N = mkN "" ; -- lin boot_N = mkN "" ; -- lin boss_N = mkN "" ; @@ -130,7 +130,7 @@ lin fish_N = mkN "hal" "halat" ; -- lin float_V = mkV "" ; lin floor_N = mkN "padló" "padlót" ; -- lin flow_V = mkV "" ; -lin flower_N = mkN "virág" "virágot" ; +lin flower_N = mkN "virág" "virágot" "virágok" "virága" ; lin fly_V = mkV "repül" ; lin fog_N = mkN "köd" "ködöt"; -- TODO ködöket lin foot_N = leg_N ; --same as leg, to specify "lábfej" @@ -285,7 +285,7 @@ lin restaurant_N = mkN "étterem" "éttermet"; lin river_N = mkN "folyó" "folyót" ; lin road_N = mkN "út" "utat" ; lin rock_N = mkN "szikla" "sziklát"; -lin roof_N = mkN "plafon" "plafont" ; +lin roof_N = mkN "plafon" "plafont" "plafonok" "plafonja" ; lin root_N = mkN "gyökér" "gyökeret"; lin rope_N = mkN "kötél" "kötelet"; -- lin rotten_A = mkA "" ; diff --git a/src/hungarian/NounMorphoHun.gf b/src/hungarian/NounMorphoHun.gf index 0692d3e57..1f7bcd0b4 100644 --- a/src/hungarian/NounMorphoHun.gf +++ b/src/hungarian/NounMorphoHun.gf @@ -116,25 +116,47 @@ oper -- Examples: "hajó, hajója, zseni, zsenije, kestyű, kestyűje" dHajó : (nom : Str) -> (acc : Str) -> Noun = \hajó,hajót -> let nHajó = mkNoun hajó ; - hajój = hajó + "j" ; in nHajó ** { s = \\nc => case nc of { - -- All plural forms and Sg Acc use the "tolla" stem - PlStem | PlAcc | SgAccStem => nHajó.s ! nc ; + PossdSg_PossrPl1 => hajó ; - PossdSg_PossrPl1 => hajój + harm "u" "ü" ! nHajó.h ; - - PossdSg_PossrP3 => hajój ; + PossdSg_PossrP3 => hajó + "j" ; -- The plural morpheme before possessive suffixes: hajói PossdPl => hajó + "i" ; - -- The rest of the forms are formed with the regular constructor, - -- using "toll" as the stem. + -- The rest of the forms are formed with the regular constructor _ => nHajó.s ! nc } } ; + -- Unexpected j after consonant + dPlafon : (nom : Str) -> (acc : Str) -> Noun = \plafon,plafont -> + let nPlafon = mkNoun plafon ; + h = nPlafon.h ; + in nPlafon ** { + s = \\nc => case nc of { + PossdSg_PossrPl1 => plafon + harm "u" "ü" ! h ; + PossdSg_PossrP3 => plafon + "j" ; + PossdPl => plafon + harm "jai" "jei" ! h ; + + -- The rest of the forms are formed with the regular constructor + _ => nPlafon.s ! nc + } + } ; + + -- Opposite to dHajó: regular paradigm puts j, but these words don't have it. + dVirág : (nom : Str) -> (acc : Str) -> Noun = \virág,virágot -> + let nVirág = mkNoun virág ; + h = nVirág.h ; + in nVirág ** { + s = \\nc => case nc of { + PossdSg_PossrPl1 => virág + harm "u" "ü" ! h ; + PossdSg_PossrP3 => virág ; + PossdPl => virág + harm "a" "e" ! h + "i" ; + _ => nVirág.s ! nc } + } ; + -- Handles many possesive forms dToll : (nom : Str) -> (acc : Str) -> Noun = \toll,tollat -> let tolla = init tollat ; @@ -218,55 +240,67 @@ oper -- All regNoun* are /smart paradigms/: they take one or a couple of forms, -- and decides which (non-smart) paradigm is the most likely to match. -regNounNomAccPl : (nomsg, accsg, nompl : Str) -> Noun = \nsg,asg,npl -> - case of { - <_ + ("u"|"ú"|"ü"|"ű"|"ó"), -- falu, falut, falvak ; szó, szót, szavak - _ + ("u"|"ú"|"ü"|"ű"|"ó") + "t", - _ + "v" + #v + "k"> => dFalu nsg npl ; + regNoun4 : (nomsg, accsg, nompl, possdSg_possrP3sg : Str) -> Noun = + \nsg,asg,npl,possd -> case possd of { + _ + #v + "j" + ("a"|"e") => dHajó nsg asg ; + _ + #c + "j" + ("a"|"e") => dPlafon nsg asg ; - -- Fall back to 2-argument smart paradigm - _ => regNounNomAcc nsg asg - } ; + _ + #c + ("a"|"e") => dVirág nsg asg ; -regNounNomAcc : (nom : Str) -> (acc : Str) -> Noun = \n,a -> - case of { - -- Stem 1: Sg Nom - -- Stem 2: Everything else - -- alma, almát - <_ + "a", _ + "át"> - |<_ + "e" ,_ + "ét"> => dAlma n a ; + -- Fall back to 3-argument smart paradigm + _ => regNounNomAccPl nsg asg npl + } ; - -- Stem 1: Sg Nom - -- Stem 2: Sg Gen, Sg Sup, Pl * - <_ + #shortv + #c, -- majom, majmot - _ + #c + #shortv + "t"> => dMajom n a ; + regNounNomAccPl : (nomsg, accsg, nompl : Str) -> Noun = \nsg,asg,npl -> + case of { + <_ + ("u"|"ú"|"ü"|"ű"|"ó"), -- falu, falut, falvak ; szó, szót, szavak + _ + ("u"|"ú"|"ü"|"ű"|"ó") + "t", + _ + "v" + #v + "k"> => dFalu nsg npl ; - -- Stem 1: Sg Nom - -- Stem 2: Sg Sup - -- Stem 3: Sg Gen, Pl * - <_ + "ó", -- ló, lovat - _ + "o" + #c + #v + "t"> + -- Fall back to 2-argument smart paradigm + _ => regNounNomAcc nsg asg + } ; - |<_ + "ó", -- tó, tavat - _ + "a" + #c + #v + "t"> + regNounNomAcc : (nom : Str) -> (acc : Str) -> Noun = \n,a -> + case of { - |<_ + "ő", -- kő, követ - _ + "ö" + #c + #v + "t"> + -- Stem 1: Sg Nom + -- Stem 2: Everything else + -- alma, almát + <_ + "a", _ + "át"> + |<_ + "e" ,_ + "ét"> => dAlma n a ; - |<_ + "ű", -- fű, füvet - _ + "ü" + #c + #v + "t"> + -- Stem 1: Sg Nom + -- Stem 2: Sg Gen, Sg Sup, Pl * + <_ + #shortv + #c, -- majom, majmot + _ + #c + #shortv + "t"> => dMajom n a ; - |<_ + "é", -- lé, levet - _ + "e" + #c + #v + "t"> => dLó n a ; + -- Stem 1: Sg Nom + -- Stem 2: Sg Sup + -- Stem 3: Sg Gen, Pl * + <_ + "ó", -- ló, lovat + _ + "o" + #c + #v + "t"> - -- Stem 1: Sg Nom, Sg * - [Gen] - -- Stem 2: Sg Gen, Pl * - <_ + "á" + #c, _ + "a" + #c + "at"> - |<_ + "é" + #c,_ + "e" + #c + ("et"|"at")> => dMadár n a ; + |<_ + "ó", -- tó, tavat + _ + "a" + #c + #v + "t"> - _ => dToll n a - } ; + |<_ + "ő", -- kő, követ + _ + "ö" + #c + #v + "t"> + + |<_ + "ű", -- fű, füvet + _ + "ü" + #c + #v + "t"> + + |<_ + "é", -- lé, levet + _ + "e" + #c + #v + "t"> => dLó n a ; + + -- Stem 1: Sg Nom, Sg * - [Gen] + -- Stem 2: Sg Gen, Pl * + <_ + "á" + #c, _ + "a" + #c + "at"> + |<_ + "é" + #c,_ + "e" + #c + ("et"|"at")> => dMadár n a ; + + _ => dToll n a + } ; -- 1-argument smart paradigm -- Here we guess the genitive form and give it to appropriate 2-arg paradigm diff --git a/src/hungarian/ParadigmsHun.gf b/src/hungarian/ParadigmsHun.gf index 57c5101b3..543288e30 100644 --- a/src/hungarian/ParadigmsHun.gf +++ b/src/hungarian/ParadigmsHun.gf @@ -18,9 +18,11 @@ oper --2 Nouns mkN : overload { - mkN : (sgnom : Str) -> N ; -- Predictable nouns from singular nominative. Accusative vowel is o for back harmony. No stem lowering (TODO better explanation/examples) - mkN : (sgnom, sggen : Str) -> N ; -- Singular nominative and accusative. Takes care of cases like … TODO example - mkN : (sgnom, sggen, plnom : Str) -> N ; -- Singular nominative, singular accusative, plural nominative, e.g. `mkN "falu" "falut" "falvak"` + mkN : (sgnom : Str) -> N ; -- Predictable nouns from singular nominative. Accusative vowel is o/ö, no stem lowering. Use: `mkN "nap"` for nap, napot. + mkN : (sgnom, sggen : Str) -> N ; -- Singular nominative and accusative. Use: `mkN "név" "nevet"` + mkN : (sgnom, sggen, plnom : Str) -> N ; -- Singular nominative, singular accusative, plural nominative. Use: `mkN "falu" "falut" "falvak"` + mkN : (sgnom, sggen, plnom, sgnom_possdSg3 : Str) -> N ; -- Singular nominative, singular accusative, plural nominative, singular nominative possessed by 3rd person singular. Use: `mkN "virág" "virágot" "virágok" "virága"` (would give "virágja" otherwise) + mkN : (férfi : Str) -> (harm : Harmony) -> (ak : Str) -> N ; -- Noun with unpredictable vowel harmony and plural allomorph } ; @@ -130,6 +132,9 @@ oper mkN : Str -> Str -> Str -> N = \n,a,pln-> lin N (regNounNomAccPl n a pln) ; + mkN : (x1,_,_,x4 : Str) -> N = + \n,a,pln,possd -> lin N (regNoun4 n a pln possd) ; + mkN : Str -> Harmony -> N = \s,h -> lin N (mkNounHarm h (pluralAllomorph s) s) ;