diff --git a/src/hungarian/ResHun.gf b/src/hungarian/ResHun.gf index e3c36cec..1c4baa7d 100644 --- a/src/hungarian/ResHun.gf +++ b/src/hungarian/ResHun.gf @@ -117,7 +117,19 @@ oper -------------------------------------------------------------------------------- -- Verbs - verbEndings : Person*Number => HarmForms = table { + VerbEndings : Type = Person*Number => HarmForms ; + -- TODO: incomplete + endingsDef : VerbEndings = table { + => harm3 "om" "em" "öm" ; + => harm3 "od" "ed" "öd" ; + => harm "ja" "i" ; + => harm "juk" "jük" ; + => harm "játok" "itek" ; + => harm "ják" "ik" + } ; + + -- by EG 2009, needs more special cases + endingsIndef : VerbEndings = table { => harm3 "ok" "ek" "ök" ; => harm1 "sz" ; => harm1 [] ; @@ -126,11 +138,14 @@ oper => harm "nak" "nek" -- TODO allomorphs -anak, -enek } ; - Verb : Type = { - s : VForm => Str ; + BaseVerb : Type = { sc : SubjCase ; -- subject case + } ; + Verb : Type = BaseVerb ** { + s : VForm => Str ; } ; - Verb2 : Type = Verb ** { + Verb2 : Type = BaseVerb ** { + s : ObjDef => VForm => Str ; c2 : Case -- object case } ; Verb3 : Type = Verb2 ** { @@ -140,18 +155,25 @@ oper mkVerb2 : Str -> Verb2 = \sg3 -> vtov2 (mkVerb sg3) ; mkVerb3 : Str -> Verb3 = \sg3 -> v2tov3 (mkVerb2 sg3) ; - vtov2 : Verb -> Verb2 = \v -> v ** {c2 = Acc} ; + vtov2 : Verb -> Verb2 = \v -> v ** { + s = table { + Def => let vDef : Verb = mkVerbReg endingsDef (v.s ! VInf) (v.s ! VFin P3 Sg) + in vDef.s ; + Indef => v.s } ; + c2 = Acc + } ; v2tov3 : Verb2 -> Verb3 = \v -> v ** {c3 = Dat} ; - mkVerb : (sg3 : Str) -> Verb = mkVerbReg "TODO:infinitive" ; -- TODO + mkVerb : (sg3 : Str) -> Verb = mkVerbReg endingsIndef "TODO:infinitive" ; -- TODO - mkVerbReg : (inf, sg3 : Str) -> Verb = \inf,sg3 -> - let h : Harm = getHarm sg3 ; - sg1 : Str = sg3 + verbEndings ! ! h ; - sg2 : Str = sg3 + "sz" ; - pl1 : Str = sg3 + (verbEndings!) ! h ; - pl2 : Str = sg3 + (verbEndings!) ! h; - pl3 : Str = sg3 + (verbEndings!) ! h; + mkVerbReg : VerbEndings -> (inf, stem : Str) -> Verb = \hf,inf,stem -> + let h : Harm = getHarm stem ; + sg1 : Str = stem + hf ! ! h ; + sg2 : Str = stem + hf ! ! h ; + sg3 : Str = stem + hf ! ! h ; + pl1 : Str = stem + hf ! ! h ; + pl2 : Str = stem + hf ! ! h ; + pl3 : Str = stem + hf ! ! h ; in mkVerbFull sg1 sg2 sg3 pl1 pl2 pl3 inf ; mkVerbFull : (x1,_,_,_,_,_,x7 : Str) -> Verb = @@ -202,8 +224,8 @@ oper -- If verb's subject case is Dat and object Nom, verb agrees with obj. s = \\vf => case of { - => vps.s ! agr2vf np.agr ; - _ => vps.s ! vf } ; + => vps.s ! np.objdef ! agr2vf np.agr ; + _ => vps.s ! np.objdef ! vf } ; } ; insertAdv : VerbPhrase -> SS -> VerbPhrase = \vp,adv -> vp ** {adv = adv.s} ;