diff --git a/src/russian/CatRus.gf b/src/russian/CatRus.gf index f8abc8dc7..581e5230f 100644 --- a/src/russian/CatRus.gf +++ b/src/russian/CatRus.gf @@ -37,19 +37,9 @@ lincat CN = ResRus.Noun ; NP = ResRus.NounPhrase ; - VP = { - adv : AgrTable ; -- modals are in position of adverbials ones numgen gets fixed - verb : ResRus.VerbForms ; - dep : Str ; -- dependent infinitives and such - compl : ComplTable - } ; - VPSlash = { - adv : AgrTable ; -- modals are in position of adverbials ones numgen gets fixed - verb : ResRus.VerbForms ; - dep : Str ; -- dependent infinitives and such - compl : ComplTable ; - c : ComplementCase - } ; ---- + VP = ResRus.VP ; + + VPSlash = ResRus.VPSlash ; AP = ResRus.Adjective ** {isPost : Bool} ; @@ -142,7 +132,13 @@ linref VP = \s -> s.adv ! Ag (GSg Neut) P3 ++ (verbInf s.verb) ++ s.dep ++ s.compl ! Pos ! Ag (GSg Neut) P3 ; Comp = \s -> copula.inf ++ s.s ! Ag (GSg Neut) P3 ++ s.adv ; IComp = \s -> s.s ! Ag (GSg Neut) P3 ++ s.adv ++ copula.inf; - VPSlash = \s -> s.adv ! Ag (GSg Neut) P3 ++ (verbInf s.verb) ++ s.dep ++ s.compl ! Pos ! Ag (GSg Neut) P3 ++ s.c.s ; + VPSlash = \s -> let vp : VP + = {verb = s.verb ; + adv = s.adv ; + dep = s.dep ; + compl = \\p, a => s.compl1 ! p ! a ++ s.c.s ++ s.compl2 ! p ! a + } + in vp.adv ! Ag (GSg Neut) P3 ++ (verbInf vp.verb) ++ vp.dep ++ vp.compl ! Pos ! Ag (GSg Neut) P3 ; Cl = \s -> s.subj ++ s.adv ++ (verbInf s.verb) ++ s.dep ++ s.compl ! Pos ; ClSlash = \s -> s.subj ++ s.adv ++ (verbInf s.verb) ++ s.dep ++ s.compl ! Pos ; QCl = \s -> s.subj ++ s.adv ++ (verbInf s.verb) ++ s.dep ++ s.compl ! Pos ; diff --git a/src/russian/ExtendRus.gf b/src/russian/ExtendRus.gf index 8ebc302bd..f7aad0eef 100644 --- a/src/russian/ExtendRus.gf +++ b/src/russian/ExtendRus.gf @@ -145,12 +145,14 @@ lin vps.adv ! (genNumAgrP3 gn) ++ shortPastPassPart vps.verb gn ++ vps.dep - ++ vps.compl ! Pos ! (genNumAgrP3 gn) ; + ++ vps.compl1 ! Pos ! (genNumAgrP3 gn) + ++ vps.compl2 ! Pos ! (genNumAgrP3 gn); short=\\a => vps.adv ! a ++ shortPastPassPart vps.verb (agrGenNum a) ++ vps.dep - ++ vps.compl ! Pos ! a + ++ vps.compl1 ! Pos ! a + ++ vps.compl2 ! Pos ! a ++ vps.c.s ; -- isPost = False ; preferShort=PreferFull @@ -163,13 +165,15 @@ lin ++ shortPastPassPart vps.verb gn ++ vps.dep ++ applyPolPrep Pos vps.c np - ++ vps.compl ! Pos ! (genNumAgrP3 gn) ; + ++ vps.compl1 ! Pos ! (genNumAgrP3 gn) + ++ vps.compl2 ! Pos ! (genNumAgrP3 gn); short=\\a => vps.adv ! a ++ shortPastPassPart vps.verb (agrGenNum a) ++ vps.dep ++ applyPolPrep Pos vps.c np - ++ vps.compl ! Pos ! a ; + ++ vps.compl1 ! Pos ! a + ++ vps.compl2 ! Pos ! a ; isPost = False ; preferShort=PreferFull } ; @@ -178,10 +182,11 @@ lin PassVPSlash vps = case vps.verb.asp of { Perfective => vps ** { verb=copulaEll ; - compl=\\p,a => shortPastPassPart vps.verb (agrGenNum a) ++ vps.compl ! p ! a ++ vps.c.s + compl=\\p,a => shortPastPassPart vps.verb (agrGenNum a) ++ vps.compl1 ! p ! a ++ vps.compl2 ! p ! a ++ vps.c.s } ; Imperfective => vps ** { verb=(passivate vps.verb); + compl=\\p,a => shortPastPassPart vps.verb (agrGenNum a) ++ vps.compl1 ! p ! a ++ vps.compl2 ! p ! a ++ vps.c.s } }; @@ -192,11 +197,11 @@ lin PassAgentVPSlash vps np = case vps.verb.asp of { Perfective => vps ** { verb=copulaEll ; - compl=\\p,a => shortPastPassPart vps.verb (agrGenNum a) ++ vps.c.s ++ vps.compl ! p ! a ++ np.s ! Ins + compl=\\p,a => shortPastPassPart vps.verb (agrGenNum a) ++ vps.c.s ++ vps.compl1 ! p ! a ++ vps.compl2 ! p ! a ++ np.s ! Ins } ; Imperfective => vps ** { verb=(passivate vps.verb); - compl=\\p,a => vps.compl ! p ! a ++ np.s ! Ins + compl=\\p,a => vps.compl1 ! p ! a ++ vps.compl2 ! p ! a ++ np.s ! Ins } }; diff --git a/src/russian/ExtraRus.gf b/src/russian/ExtraRus.gf index 8175c4165..82ef563b1 100644 --- a/src/russian/ExtraRus.gf +++ b/src/russian/ExtraRus.gf @@ -144,7 +144,8 @@ lin ++ verbRefl vps.verb ++ case temp.t of {Cond => "бы" ; _ => []} ++ vps.dep - ++ vps.compl ! pol.p ! Ag (GSg Neut) P3 + ++ vps.compl1 ! pol.p ! Ag (GSg Neut) P3 + ++ vps.compl2 ! pol.p ! Ag (GSg Neut) P3 ++ vps.c.s ) } ; @@ -157,7 +158,8 @@ lin ++ verbRefl vps.verb ++ case temp.t of {Cond => "бы" ; _ => []} ++ vps.dep - ++ vps.compl ! pol.p ! Ag (GSg Neut) P3 + ++ vps.compl1 ! pol.p ! Ag (GSg Neut) P3 + ++ vps.compl2 ! pol.p ! Ag (GSg Neut) P3 ++ vps.c.s ++ endComma } ; diff --git a/src/russian/ResRus.gf b/src/russian/ResRus.gf index be87cce77..43f4825b4 100644 --- a/src/russian/ResRus.gf +++ b/src/russian/ResRus.gf @@ -599,6 +599,70 @@ oper -- we can store the sya-schema and 'BIND++' as necessary. oper + VP : Type = { + adv : AgrTable ; -- modals are in position of adverbials ones numgen gets fixed + verb : ResRus.VerbForms ; + dep : Str ; -- dependent infinitives and such + compl : ComplTable + } ; + + VPSlash = { + adv : AgrTable ; -- modals are in position of adverbials ones numgen gets fixed + verb : VerbForms ; + dep : Str ; -- dependent infinitives and such + compl1 : ComplTable ; + compl2 : ComplTable ; + c : ComplementCase ; + } ; ---- + + slashV : VerbForms -> ComplementCase -> VPSlash = \verb,c -> { + verb = verb ; + adv = \\a => []; + compl1 = \\_,a => [] ; + compl2 = \\_,a => [] ; + dep = [] ; + c = c ; + } ; + + insertSlashObjA : Adjective -> ComplementCase -> VPSlash -> VPSlash = \ap,c,slash -> { + verb = slash.verb ; + adv = slash.adv ; + compl1 = slash.compl1 ; + compl2 = \\p,a => case p of { + Pos => case ap.preferShort of { + PreferFull => slash.compl2 ! p ! a ++ ap.s ! agrGenNum a ! Animate ! slash.c.c ; + PrefShort => slash.compl2 ! p ! a ++ ap.short ! a + } ; + Neg => case ap.preferShort of { + PreferFull => case neggen slash.c of { + False => slash.compl2 ! p ! a ++ ap.s ! agrGenNum a ! Animate ! slash.c.c ; + True => slash.compl2 ! p ! a ++ ap.s ! agrGenNum a ! Animate ! Gen + } ; + PrefShort => slash.compl2 ! p ! a ++ ap.short ! a + } + } ; + c = {s="" ; c=Acc ; neggen=True ; hasPrep=False}; + dep = slash.dep ; + } ; + + insertSlashObj1 : (Polarity => Agr => Str) -> ComplementCase -> VPSlash -> VPSlash = \obj,c,slash -> { + verb = slash.verb ; + adv = slash.adv; + compl1 =\\p,a => slash.compl1 ! p ! a ++ obj ! p ! a; + compl2 = slash.compl2 ; + c = slash.c ; + dep = slash.dep ; + } ; + + insertSlashObj2 : (Polarity => Agr => Str) -> ComplementCase -> VPSlash -> VPSlash = \obj,c,slash -> { + verb = slash.verb ; + adv = slash.adv; + compl1 = slash.compl1 ; + compl2 =\\p,a => slash.compl2 ! p ! a ++ obj ! p ! a; + c = slash.c ; + dep = slash.dep ; + } ; + guessVerbForms : Aspect -> Transitivity -> Str -> Str -> Str -> VerbForms = \asp,tran,inf,sg1,sg3 -> diff --git a/src/russian/SentenceRus.gf b/src/russian/SentenceRus.gf index 32a9ba7c8..295deb1ad 100644 --- a/src/russian/SentenceRus.gf +++ b/src/russian/SentenceRus.gf @@ -41,7 +41,7 @@ lin adv=vps.adv ! np.a ; -- ?? verb=vps.verb ; dep=vps.dep ; - compl=\\p => vps.compl ! p ! np.a ; -- ?? + compl=\\p => vps.compl1 ! p ! np.a ++ vps.compl2 ! p ! np.a; -- ?? a=np.a ; c=vps.c } ; diff --git a/src/russian/VerbRus.gf b/src/russian/VerbRus.gf index e37732f72..b4cf72a66 100644 --- a/src/russian/VerbRus.gf +++ b/src/russian/VerbRus.gf @@ -53,81 +53,39 @@ lin } ; -- : V2 -> VPSlash ; -- love (it) - SlashV2a v2 = { - adv=\\a=>[] ; - verb=v2 ; - dep=[] ; - compl=\\_,_ => [] ; - c=v2.c - } ; + SlashV2a v2 = slashV v2 v2.c ; -- : V3 -> NP -> VPSlash ; -- give it (to her) - Slash2V3 v3 np = { - adv=\\a=>[] ; - verb=v3 ; - dep=[] ; - compl=\\p,a => applyPolPrep p v3.c np ; - c=v3.c2 - } ; + Slash2V3 v3 np = insertSlashObj1 (\\p,_ => applyPolPrep p v3.c np) v3.c (slashV v3 v3.c) ; -- : V3 -> NP -> VPSlash ; -- give (it) to her - Slash3V3 v3 np = { - adv=\\a=>[] ; - verb=v3 ; - dep=[] ; - compl=\\p,a => applyPolPrep p v3.c2 np ; - c=v3.c - } ; + Slash3V3 v3 np = insertSlashObj2 (\\p,_ => applyPolPrep p v3.c2 np) v3.c2 (slashV v3 v3.c2) ; -- : V2V -> VP -> VPSlash ; -- beg (her) to go - SlashV2V v2v vp = vp ** { - verb=v2v ; - dep=verbInf vp.verb ; - c=v2v.c - } ; + SlashV2V v2v vp = insertSlashObj2 (\\_,a => verbInf vp.verb) v2v.c (slashV v2v v2v.c) ; -- : V2S -> S -> VPSlash ; -- answer (to him) that it is good - SlashV2S v2s s = { - adv=\\a=>[] ; - verb=v2s ; - dep=[] ; - compl=\\_,a=> embedInCommas ("что" ++ s.s ! Ind) ; - c=v2s.c - } ; + SlashV2S v2s s = insertSlashObj2 (\\_,a=> embedInCommas ("что" ++ s.s ! Ind)) v2s.c (slashV v2s v2s.c) ; + -- : V2Q -> QS -> VPSlash ; -- ask (him) who came - SlashV2Q v2q qs = { - adv=\\a=>[] ; - verb=v2q ; - dep=[] ; - compl=\\_,a=>qs.s ! QDir; - c=v2q.c - } ; + SlashV2Q v2q qs = insertSlashObj2 (\\_,_=> qs.s ! QDir) v2q.c (slashV v2q v2q.c); -- : V2A -> AP -> VPSlash ; -- paint (it) red - SlashV2A v2a ap = { - adv=\\a=>[] ; - verb=v2a ; - dep=[] ; - compl=table { - Pos => case ap.preferShort of { - PreferFull => \\a => ap.s ! agrGenNum a ! Animate ! v2a.c.c ; - PrefShort => ap.short - } ; - Neg => case ap.preferShort of { - PreferFull => case neggen v2a.c of { - False => \\a => ap.s ! agrGenNum a ! Animate ! v2a.c.c ; - True => \\a => ap.s ! agrGenNum a ! Animate ! Gen - } ; - PrefShort => ap.short - } - } ; - c={s="" ; c=Acc ; neggen=True ; hasPrep=False} - } ; + SlashV2A v2a ap = insertSlashObjA ap v2a.c (slashV v2a v2a.c) ; - -- : VPSlash -> NP -> VP ; -- love it - ComplSlash vps np = vps ** { - compl=\\p,a => applyPolPrep p vps.c np ++ vps.compl ! p ! a - } ; + -- : VPSlash -> NP -> VP ; -- love it + ComplSlash vps np = + let arg : {obj,acc,dat : Str} + = case vps.c.c of { + Dat => {obj=[]; acc=np.s ! Acc; dat=[] } ; + Acc => {obj=[]; acc=[]; dat=np.s ! Dat} ; + c => {obj=np.s ! c; acc=[]; dat=[] } + } + in {verb = vps.verb ; + adv = vps.adv ; + dep = vps.dep ; + compl = \\p,a => vps.compl1 ! p ! a ++ arg.acc ++ arg.dat ++ arg.obj ++ vps.compl2 ! p ! a ; + } ; -- : VV -> VPSlash -> VPSlash ; -- want to buy SlashVV vv vps = vps ** { @@ -149,7 +107,7 @@ lin -- : VPSlash -> VP ; -- love himself ReflVP vps = vps ** { - compl=\\p,a => vps.compl ! p ! a ++ vps.c.s ++ sebya.s ! vps.c.c + compl=\\p,a => vps.compl1 ! p ! a ++ vps.c.s ++ vps.compl2 ! p ! a ++ sebya.s ! vps.c.c } ; -- : Comp -> VP ; -- be warm @@ -180,7 +138,8 @@ lin AdVVPSlash adv vps = vps ** {adv=\\a=>adv.s ++ vps.adv ! a} ; -- : VP -> Prep -> VPSlash ; -- live in (it) - VPSlashPrep vp prep = vp ** {c=prep} ; + VPSlashPrep vp prep = vp ** {c = prep ; compl1 = vp.compl ; compl2 = \\_,_ => []; dep=[]} ; + -- : AP -> Comp ; -- (be) small CompAP ap = case ap.preferShort of { PreferFull => {s=\\a=>ap.s ! agrGenNum a ! Inanimate ! Ins ; adv=[] ; cop=InsCopula} ;