From 23f8ebe76ea3a47d0e02eaef5d86233a90065bdd Mon Sep 17 00:00:00 2001 From: Nikita Frolov Date: Mon, 16 Jan 2012 17:15:08 +0000 Subject: [PATCH] The final fix of noun phrases with cardinal numbers in Russian The support for variation of the noun depending on what cardinal it is used with seems to be complete by now ("one child - two children - five children" - Russian has different plural forms for "a child" when counting). The case agreement in noun phrases that have additional determiners besides numerals ("three little blind mice") is fixed too. --- lib/src/russian/CatRus.gf | 9 +- lib/src/russian/MorphoRus.gf | 356 +++++++++++++++---------------- lib/src/russian/NounRus.gf | 55 ++--- lib/src/russian/NumeralRus.gf | 49 +++-- lib/src/russian/ParadigmsRus.gf | 30 +-- lib/src/russian/PhraseRus.gf | 2 +- lib/src/russian/QuestionRus.gf | 4 +- lib/src/russian/ResRus.gf | 7 +- lib/src/russian/StructuralRus.gf | 22 +- lib/src/russian/SymbolRus.gf | 8 +- lib/src/russian/VerbRus.gf | 12 +- 11 files changed, 283 insertions(+), 271 deletions(-) diff --git a/lib/src/russian/CatRus.gf b/lib/src/russian/CatRus.gf index cf0f76532..f6ee1d358 100644 --- a/lib/src/russian/CatRus.gf +++ b/lib/src/russian/CatRus.gf @@ -58,15 +58,14 @@ concrete CatRus of Cat = CommonX ** open ResRus, Prelude in { -- Gender parameter is due to multiple determiners (Numerals in Russian) -- like "mnogo" -- The determined noun has the case parameter specific for the determiner --- 'q' is for 'quantity', quantity determiners demand genitive for the noun - Det = {s : AdjForm => Str; n: Number; g: PronGen; c: Case; q: Bool} ; - Predet, Quant = {s : AdjForm => Str; g: PronGen; c: Case; q: Bool} ; + Det = {s : AdjForm => Str; n: Number; g: PronGen; c: Case; size: Size} ; + Predet, Quant = {s : AdjForm => Str; g: PronGen; c: Case; size: Size} ; -- Numeral - Num, Numeral, Card = {s : Gender => Animacy => Case => Str ; n : Number} ; - Digits = {s : Str ; n : Number} ; ---- + Num, Numeral, Card = {s : Gender => Animacy => Case => Str ; n : Number ; size: Size} ; + Digits = {s : Str ; n : Number ; size: Size} ; ---- -- Structural -- The conjunction has an inherent number, which is used when conjoining diff --git a/lib/src/russian/MorphoRus.gf b/lib/src/russian/MorphoRus.gf index f82c679b5..d3fed20ef 100644 --- a/lib/src/russian/MorphoRus.gf +++ b/lib/src/russian/MorphoRus.gf @@ -346,18 +346,18 @@ Paradigms: let i = iAfter stem in let o = oAfter stem in { s = table { - NF Sg Nom => stem ; - NF Sg Gen => stem+"а" ; - NF Sg Dat => stem+"у" ; - NF Sg Acc => stem ; - NF Sg Inst => stem+o+"м" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+i ; - NF Pl Gen => stem+case stem of { _+("ш"|"ж"|"ч"|"щ") => "ей"; _ => "ов" } ; - NF Pl Dat => stem+"ам" ; - NF Pl Acc => stem+i ; - NF Pl Inst => stem+"ами" ; - NF Pl (Prepos _) => stem+"ах" }; + NF Sg Nom _ => stem ; + NF Sg Gen _ => stem+"а" ; + NF Sg Dat _ => stem+"у" ; + NF Sg Acc _ => stem ; + NF Sg Inst _ => stem+o+"м" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+i ; + NF Pl Gen _ => stem+case stem of { _+("ш"|"ж"|"ч"|"щ") => "ей"; _ => "ов" } ; + NF Pl Dat _ => stem+"ам" ; + NF Pl Acc _ => stem+i ; + NF Pl Inst _ => stem+"ами" ; + NF Pl (Prepos _) _ => stem+"ах" }; g = Masc; anim = Inanimate }; -- 1. Hard regular neuter inanimate, e.g. pravilo. @@ -367,18 +367,18 @@ Paradigms: oper nRegHardNeut : Str ->CommNoun= \stem -> let o = oAfter stem in { s = table { - NF Sg Nom => stem+o ; - NF Sg Gen => stem+"а" ; - NF Sg Dat => stem+"у" ; - NF Sg Acc => stem+o ; - NF Sg Inst => stem+o+"м" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+case stem of { _+"к" => "и" ; _ => "а" } ; - NF Pl Gen => stem ; - NF Pl Dat => stem+"ам" ; - NF Pl Acc => stem+"а" ; - NF Pl Inst => stem+"ами" ; - NF Pl (Prepos _) => stem+"ах" }; + NF Sg Nom _ => stem+o ; + NF Sg Gen _ => stem+"а" ; + NF Sg Dat _ => stem+"у" ; + NF Sg Acc _ => stem+o ; + NF Sg Inst _ => stem+o+"м" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+case stem of { _+"к" => "и" ; _ => "а" } ; + NF Pl Gen _ => stem ; + NF Pl Dat _ => stem+"ам" ; + NF Pl Acc _ => stem+"а" ; + NF Pl Inst _ => stem+"ами" ; + NF Pl (Prepos _) _ => stem+"ах" }; g = Neut; anim = Inanimate }; -- 1. Hard regular feminine inanimate, e.g. karta. @@ -389,77 +389,77 @@ Paradigms: let i = iAfter stem in let o = oAfter stem in { s = table { - NF Sg Nom => stem+"а" ; - NF Sg Gen => stem+i ; - NF Sg Dat => stem+"е" ; - NF Sg Acc => stem+"у" ; - NF Sg Inst => stem+o+"й" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+i ; - NF Pl Gen => stem ; - NF Pl Dat => stem+"ам" ; - NF Pl Acc => stem+i ; - NF Pl Inst => stem+"ами" ; - NF Pl (Prepos _) => stem+"ах" }; + NF Sg Nom _ => stem+"а" ; + NF Sg Gen _ => stem+i ; + NF Sg Dat _ => stem+"е" ; + NF Sg Acc _ => stem+"у" ; + NF Sg Inst _ => stem+o+"й" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+i ; + NF Pl Gen _ => stem ; + NF Pl Dat _ => stem+"ам" ; + NF Pl Acc _ => stem+i ; + NF Pl Inst _ => stem+"ами" ; + NF Pl (Prepos _) _ => stem+"ах" }; g = Fem; anim = Inanimate }; -- 2. Soft regular masculine inanimate, e.g. vichr' oper nRegSoftMasc : Str ->CommNoun= \stem -> { s = table { - NF Sg Nom => stem+"ь"; - NF Sg Gen => stem+"я" ; - NF Sg Dat => stem+"ю" ; - NF Sg Acc => stem+"ь" ; - NF Sg Inst => stem+"ем" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+"и" ; - NF Pl Gen => stem+"ей" ; - NF Pl Dat => stem+"ям" ; - NF Pl Acc => stem+"и" ; - NF Pl Inst => stem+"ями" ; - NF Pl (Prepos _) => stem+"ях" }; + NF Sg Nom _ => stem+"ь"; + NF Sg Gen _ => stem+"я" ; + NF Sg Dat _ => stem+"ю" ; + NF Sg Acc _ => stem+"ь" ; + NF Sg Inst _ => stem+"ем" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+"и" ; + NF Pl Gen _ => stem+"ей" ; + NF Pl Dat _ => stem+"ям" ; + NF Pl Acc _ => stem+"и" ; + NF Pl Inst _ => stem+"ями" ; + NF Pl (Prepos _) _ => stem+"ях" }; g = Masc; anim = Inanimate }; -- 2. Soft regular neuter inanimate, e.g. more oper nRegSoftNeut : Str ->CommNoun= \stem -> { s = table { - NF Sg Nom => stem+"е"; - NF Sg Gen => stem+"я" ; - NF Sg Dat => stem+"ю" ; - NF Sg Acc => stem+"е" ; - NF Sg Inst => stem+"ем" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+"я" ; - NF Pl Gen => stem+"ей" ; - NF Pl Dat => stem+"ям" ; - NF Pl Acc => stem+"я" ; - NF Pl Inst => stem+"ями" ; - NF Pl (Prepos _) => stem+"ях" }; + NF Sg Nom _ => stem+"е"; + NF Sg Gen _ => stem+"я" ; + NF Sg Dat _ => stem+"ю" ; + NF Sg Acc _ => stem+"е" ; + NF Sg Inst _ => stem+"ем" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+"я" ; + NF Pl Gen _ => stem+"ей" ; + NF Pl Dat _ => stem+"ям" ; + NF Pl Acc _ => stem+"я" ; + NF Pl Inst _ => stem+"ями" ; + NF Pl (Prepos _) _ => stem+"ях" }; g = Neut; anim = Inanimate }; -- 2. Soft regular feminine inanimate, e.g. burya oper nRegSoftFem : Str ->CommNoun= \stem -> { s = table { - NF Sg Nom => stem+"я"; - NF Sg Gen => stem+"и" ; - NF Sg Dat => stem+"е" ; - NF Sg Acc => stem+"ю" ; - NF Sg Inst => stem+"ей" ; - NF Sg (Prepos _) => stem+"е" ; - NF Pl Nom => stem+"и" ; - NF Pl Gen => stem+"ь" ; - NF Pl Dat => stem+"ям" ; - NF Pl Acc => stem+"и" ; - NF Pl Inst => stem+"ями" ; - NF Pl (Prepos _) => stem+"ях" }; + NF Sg Nom _ => stem+"я"; + NF Sg Gen _ => stem+"и" ; + NF Sg Dat _ => stem+"е" ; + NF Sg Acc _ => stem+"ю" ; + NF Sg Inst _ => stem+"ей" ; + NF Sg (Prepos _) _ => stem+"е" ; + NF Pl Nom _ => stem+"и" ; + NF Pl Gen _ => stem+"ь" ; + NF Pl Dat _ => stem+"ям" ; + NF Pl Acc _ => stem+"и" ; + NF Pl Inst _ => stem+"ями" ; + NF Pl (Prepos _) _ => stem+"ях" }; g = Fem; anim = Inanimate }; -- 6. Masc ending in -Vй (V = vowel) oper nDecl6Masc : Str ->CommNoun= \stem -> let n = nRegSoftMasc stem in { s = table { - NF Sg (Nom|Acc) => stem+"й"; - NF Pl Gen => stem+"ев" ; + NF Sg (Nom|Acc) _ => stem+"й"; + NF Pl Gen _ => stem+"ев" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -467,7 +467,7 @@ Paradigms: oper nDecl6Neut : Str ->CommNoun= \stem -> let n = nRegSoftNeut stem in { s = table { - NF Pl Gen => stem+"й" ; + NF Pl Gen _ => stem+"й" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -475,7 +475,7 @@ Paradigms: oper nDecl6Fem : Str ->CommNoun= \stem -> let n = nRegSoftFem stem in { s = table { - NF Pl Gen => stem+"й" ; + NF Pl Gen _ => stem+"й" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -483,7 +483,7 @@ Paradigms: oper nDecl7Masc : Str ->CommNoun= \stem -> let n = nDecl6Masc stem in { s = table { - NF Sg (Prepos _) => stem+"и" ; + NF Sg (Prepos _) _ => stem+"и" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -491,7 +491,7 @@ Paradigms: oper nDecl7Neut : Str ->CommNoun= \stem -> let n = nDecl6Neut stem in { s = table { - NF Sg (Prepos _) => stem+"и" ; + NF Sg (Prepos _) _ => stem+"и" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -499,7 +499,7 @@ Paradigms: oper nDecl7Fem : Str ->CommNoun= \stem -> let n = nDecl6Fem stem in { s = table { - NF Sg (Dat|Prepos _) => stem+"и" ; + NF Sg (Dat|Prepos _) _ => stem+"и" ; sf => n.s!sf }; g = n.g; anim = n.anim }; @@ -508,35 +508,35 @@ Paradigms: oper nDecl8 : Str ->CommNoun= \stem -> let a : Str = case stem of { _+("ч"|"щ"|"ш"|"ж") => "а"; _ => "я" } in { s = table { - NF Sg Nom => stem+"ь"; - NF Sg Gen => stem+"и" ; - NF Sg Dat => stem+"и" ; - NF Sg Acc => stem+"ь" ; - NF Sg Inst => stem+"ью" ; - NF Sg (Prepos _) => stem+"и" ; - NF Pl Nom => stem+"и" ; - NF Pl Gen => stem+"ей" ; - NF Pl Dat => stem+a+"м" ; - NF Pl Acc => stem+"и" ; - NF Pl Inst => stem+a+"ми" ; - NF Pl (Prepos _) => stem+a+"х" }; + NF Sg Nom _ => stem+"ь"; + NF Sg Gen _ => stem+"и" ; + NF Sg Dat _ => stem+"и" ; + NF Sg Acc _ => stem+"ь" ; + NF Sg Inst _ => stem+"ью" ; + NF Sg (Prepos _) _ => stem+"и" ; + NF Pl Nom _ => stem+"и" ; + NF Pl Gen _ => stem+"ей" ; + NF Pl Dat _ => stem+a+"м" ; + NF Pl Acc _ => stem+"и" ; + NF Pl Inst _ => stem+a+"ми" ; + NF Pl (Prepos _) _ => stem+a+"х" }; g = Fem; anim = Inanimate }; -- 9. Neut ending in -мя oper nDecl9 : Str ->CommNoun= \stem -> { s = table { - NF Sg Nom => stem+"мя"; - NF Sg Gen => stem+"мени" ; - NF Sg Dat => stem+"мени" ; - NF Sg Acc => stem+"мя" ; - NF Sg Inst => stem+"менем" ; - NF Sg (Prepos _) => stem+"мени" ; - NF Pl Nom => stem+"мена" ; - NF Pl Gen => stem+"мён" ; - NF Pl Dat => stem+"менам" ; - NF Pl Acc => stem+"мена" ; - NF Pl Inst => stem+"менами" ; - NF Pl (Prepos _) => stem+"менах" }; + NF Sg Nom _ => stem+"мя"; + NF Sg Gen _ => stem+"мени" ; + NF Sg Dat _ => stem+"мени" ; + NF Sg Acc _ => stem+"мя" ; + NF Sg Inst _ => stem+"менем" ; + NF Sg (Prepos _) _ => stem+"мени" ; + NF Pl Nom _ => stem+"мена" ; + NF Pl Gen _ => stem+"мён" ; + NF Pl Dat _ => stem+"менам" ; + NF Pl Acc _ => stem+"мена" ; + NF Pl Inst _ => stem+"менами" ; + NF Pl (Prepos _) _ => stem+"менах" }; g = Fem; anim = Inanimate }; -- 10. Masc in -oнoк @@ -551,8 +551,8 @@ Paradigms: oper nSplitSgPl : CommNoun -> CommNoun -> CommNoun = \x, y -> {s = table { - NF Sg c => x.s!(NF Sg c) ; - NF Pl c => y.s!(NF Pl c) + NF Sg c size => x.s!(NF Sg c size) ; + NF Pl c size => y.s!(NF Pl c size) } ; g = x.g ; anim = y.anim } ; @@ -560,18 +560,18 @@ Paradigms: -- Nouns inflected as adjectives. oper nAdj : Adjective -> Gender ->CommNoun= \a,g -> { s = table { - NF Sg c => a.s!AF c Inanimate (GSg g) ; - NF Pl c => a.s!AF c Inanimate GPl }; + NF Sg c _ => a.s!AF c Inanimate (GSg g) ; + NF Pl c _ => a.s!AF c Inanimate GPl }; g = g; anim = Inanimate } ; -- Makes a noun animate. oper nAnimate : CommNoun -> CommNoun = \n -> { s = table { - NF Sg Acc => case n.g of { - Masc => n.s!(NF Sg Gen); - _ => n.s!(NF Sg Acc) + NF Sg Acc size => case n.g of { + Masc => n.s!(NF Sg Gen size); + _ => n.s!(NF Sg Acc size) }; - NF Pl Acc => n.s!(NF Pl Gen); + NF Pl Acc size => n.s!(NF Pl Gen size); sf => n.s!sf } ; g = n.g ; anim = Animate @@ -582,90 +582,90 @@ oper oper nullEndInAnimateDeclStul: Str -> CommNoun = \brat -> {s = table - { NF Sg Nom => brat ; - NF Sg Gen => brat+"а" ; - NF Sg Dat => brat+"у" ; - NF Sg Acc => brat +"а"; - NF Sg Inst => brat+"ом" ; - NF Sg (Prepos _) => brat+"е" ; - NF Pl Nom => brat+"ья" ; - NF Pl Gen => brat+"ьев" ; - NF Pl Dat => brat+"ьям" ; - NF Pl Acc => brat +"ьев"; - NF Pl Inst => brat+"ьями" ; - NF Pl (Prepos _) => brat+"ьяах" + { NF Sg Nom _ => brat ; + NF Sg Gen _ => brat+"а" ; + NF Sg Dat _ => brat+"у" ; + NF Sg Acc _ => brat +"а"; + NF Sg Inst _ => brat+"ом" ; + NF Sg (Prepos _) _ => brat+"е" ; + NF Pl Nom _ => brat+"ья" ; + NF Pl Gen _ => brat+"ьев" ; + NF Pl Dat _ => brat+"ьям" ; + NF Pl Acc _ => brat +"ьев"; + NF Pl Inst _ => brat+"ьями" ; + NF Pl (Prepos _) _ => brat+"ьяах" } ; g = Masc ; anim = Inanimate } ; oper nullEndAnimateDeclBrat: Str -> CommNoun = \brat -> {s = table - { NF Sg Nom => brat ; - NF Sg Gen => brat+"а" ; - NF Sg Dat => brat+"у" ; - NF Sg Acc => brat +"а"; - NF Sg Inst => brat+"ом" ; - NF Sg (Prepos _) => brat+"е" ; - NF Pl Nom => brat+"ья" ; - NF Pl Gen => brat+"ьев" ; - NF Pl Dat => brat+"ьям" ; - NF Pl Acc => brat +"ьев"; - NF Pl Inst => brat+"ьями" ; - NF Pl (Prepos _) => brat+"ьяах" + { NF Sg Nom _ => brat ; + NF Sg Gen _ => brat+"а" ; + NF Sg Dat _ => brat+"у" ; + NF Sg Acc _ => brat +"а"; + NF Sg Inst _ => brat+"ом" ; + NF Sg (Prepos _) _ => brat+"е" ; + NF Pl Nom _ => brat+"ья" ; + NF Pl Gen _ => brat+"ьев" ; + NF Pl Dat _ => brat+"ьям" ; + NF Pl Acc _ => brat +"ьев"; + NF Pl Inst _ => brat+"ьями" ; + NF Pl (Prepos _) _ => brat+"ьяах" } ; g = Masc ; anim = Animate } ; oper irregPl_StemInAnimateDecl: Str -> CommNoun = \derev -> { s = table - { NF Sg Nom => derev+"о" ; - NF Sg Gen => derev+"а" ; - NF Sg Dat => derev+"у" ; - NF Sg Acc => derev +"о"; - NF Sg Inst => derev+"ом" ; - NF Sg (Prepos _) => derev+"е" ; - NF Pl Nom => derev+"ья" ; - NF Pl Gen => derev+"ьев" ; - NF Pl Dat => derev+"ьям" ; - NF Pl Acc => derev +"ья" ; - NF Pl Inst => derev+"ьями" ; - NF Pl (Prepos _) => derev+"ьяах" + { NF Sg Nom _ => derev+"о" ; + NF Sg Gen _ => derev+"а" ; + NF Sg Dat _ => derev+"у" ; + NF Sg Acc _ => derev +"о"; + NF Sg Inst _ => derev+"ом" ; + NF Sg (Prepos _) _ => derev+"е" ; + NF Pl Nom _ => derev+"ья" ; + NF Pl Gen _ => derev+"ьев" ; + NF Pl Dat _ => derev+"ьям" ; + NF Pl Acc _ => derev +"ья" ; + NF Pl Inst _ => derev+"ьями" ; + NF Pl (Prepos _) _ => derev+"ьяах" } ; g = Masc ; anim = Inanimate } ; oper kg_oEnd_SgDecl: Str -> CommNoun = \mnog -> { s = table { - NF _ Nom => mnog+"о" ; - NF _ Gen => mnog +"их"; - NF _ Dat => mnog+"им" ; - NF _ Acc => mnog+"о" ; - NF _ Inst => mnog+"ими" ; - NF _ (Prepos _) => mnog+"их" + NF _ Nom _ => mnog+"о" ; + NF _ Gen _ => mnog +"их"; + NF _ Dat _ => mnog+"им" ; + NF _ Acc _ => mnog+"о" ; + NF _ Inst _ => mnog+"ими" ; + NF _ (Prepos _) _ => mnog+"их" } ; g = Neut ; anim = Inanimate } ; oper oEnd_PlDecl: Str -> CommNoun = \menshinstv -> { s = table { - NF _ Nom => menshinstv+"а" ; - NF _ Gen => menshinstv; - NF _ Dat => menshinstv+"ам" ; - NF _ Acc => menshinstv+"ва" ; - NF _ Inst => menshinstv+"ами" ; - NF _ (Prepos _) => menshinstv+"вах" + NF _ Nom _ => menshinstv+"а" ; + NF _ Gen _ => menshinstv; + NF _ Dat _ => menshinstv+"ам" ; + NF _ Acc _ => menshinstv+"ва" ; + NF _ Inst _ => menshinstv+"ами" ; + NF _ (Prepos _) _ => menshinstv+"вах" } ; g = Neut ; anim = Inanimate } ; oper oEnd_SgDecl: Str -> CommNoun = \bolshinstv -> {s = table { - NF _ Nom => bolshinstv+"о" ; - NF _ Gen => bolshinstv+"а" ; - NF _ Dat => bolshinstv+"у" ; - NF _ Acc => bolshinstv+"о" ; - NF _ Inst => bolshinstv+"ом" ; - NF _ (Prepos _) => bolshinstv+"е" + NF _ Nom _ => bolshinstv+"о" ; + NF _ Gen _ => bolshinstv+"а" ; + NF _ Dat _ => bolshinstv+"у" ; + NF _ Acc _ => bolshinstv+"о" ; + NF _ Inst _ => bolshinstv+"ом" ; + NF _ (Prepos _) _ => bolshinstv+"е" } ; g = Neut ; anim = Inanimate } ; @@ -677,18 +677,18 @@ oper oEnd_SgDecl: Str -> CommNoun = \bolshinstv -> oper eEnd_Decl: Str -> CommNoun = \vs -> { s = table { - NF Sg Nom => vs+"е" ; - NF Sg Gen => vs+"ех" ; - NF Sg Dat => vs+"ем" ; - NF Sg Acc => vs+"ех" ; - NF Sg Inst => vs+"еми" ; - NF Sg (Prepos _) => vs+"ех" ; - NF Pl Nom => vs+"е" ; - NF Pl Gen => vs +"ех"; - NF Pl Dat => vs+"ем" ; - NF Pl Acc => vs+ "ех" ; - NF Pl Inst => vs+"еми" ; - NF Pl (Prepos _) => vs+"ех" + NF Sg Nom _ => vs+"е" ; + NF Sg Gen _ => vs+"ех" ; + NF Sg Dat _ => vs+"ем" ; + NF Sg Acc _ => vs+"ех" ; + NF Sg Inst _ => vs+"еми" ; + NF Sg (Prepos _) _ => vs+"ех" ; + NF Pl Nom _ => vs+"е" ; + NF Pl Gen _ => vs +"ех"; + NF Pl Dat _ => vs+"ем" ; + NF Pl Acc _ => vs+ "ех" ; + NF Pl Inst _ => vs+"еми" ; + NF Pl (Prepos _) _ => vs+"ех" } ; g = Neut ; anim = Inanimate } ; @@ -803,7 +803,7 @@ oper eEnd_Decl: Str -> CommNoun = \vs -> vseDetPl: Adjective = extAdjFromSubst (eEnd_Decl "вс") ; extAdjFromSubst: CommNoun -> Adjective = \ vse -> - {s = \\af => vse.s ! NF (numAF af) (caseAF af) } ; + {s = \\af => vse.s ! NF (numAF af) (caseAF af) plg } ; oper totDet: Adjective = {s = table { diff --git a/lib/src/russian/NounRus.gf b/lib/src/russian/NounRus.gf index 6350faf46..f865a1157 100644 --- a/lib/src/russian/NounRus.gf +++ b/lib/src/russian/NounRus.gf @@ -6,23 +6,31 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { lin DetCN kazhduj okhotnik = { - s = \\c => case kazhduj.q of { - False => + s = \\c => case kazhduj.size of { + nom => case kazhduj.c of { Nom => kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ - okhotnik.s ! NF kazhduj.n (extCase c) ; + okhotnik.s ! NF kazhduj.n (extCase c) nom ; _ => kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ - okhotnik.s ! NF kazhduj.n kazhduj.c } ; - True => + okhotnik.s ! NF kazhduj.n kazhduj.c nom } ; + sgg => case kazhduj.c of { Nom => kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ - okhotnik.s ! NF kazhduj.n Gen ; + okhotnik.s ! NF Sg Gen sgg; _ => kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ - okhotnik.s ! NF kazhduj.n Gen } + okhotnik.s ! NF Pl kazhduj.c sgg } ; + plg => + case kazhduj.c of { + Nom => + kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ + okhotnik.s ! NF Pl Gen plg ; + _ => + kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ + okhotnik.s ! NF Pl kazhduj.c plg } }; n = kazhduj.n ; p = P3 ; @@ -86,8 +94,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { n = num.n ; g = quant.g; c = quant.c; --- q = notB (isNil (num.s ! Nom ! Masc)) - q = False; + size = quant.size } ; DetQuant quant num = { @@ -95,8 +102,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { n = num.n ; g = quant.g; c = quant.c; --- q = notB (isNil (num.s ! Nom ! Masc)) - q = False; + size = num.size } ; {- DetArtOrd quant num ord = { @@ -116,7 +122,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { -- MassDet = {s = \\_=>[] ; c=Nom; g = PNoGen; n = Sg} ; MassNP okhotnik = { - s = \\c => okhotnik.s ! NF Sg (extCase c) ; + s = \\c => okhotnik.s ! NF Sg (extCase c) nom ; n = Sg ; p = P3 ; pron = False; @@ -146,11 +152,11 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { anim = okhotnik.anim } ; -} - PossPron p = {s = \\af => p.s ! mkPronForm (caseAF af) No (Poss (gennum (genAF af) (numAF af) )); c=Nom; g = PNoGen; q = False} ; + PossPron p = {s = \\af => p.s ! mkPronForm (caseAF af) No (Poss (gennum (genAF af) (numAF af) )); c=Nom; g = PNoGen; size = nom} ; NumCard c = c ; - NumSg = {s = \\_,_,_ => [] ; n = Sg} ; - NumPl = {s = \\_,_,_ => [] ; n = Pl} ; + NumSg = {s = \\_,_,_ => [] ; n = Sg ; size = sgg} ; + NumPl = {s = \\_,_,_ => [] ; n = Pl ; size = plg} ; OrdNumeral numeral = variants {} ; ---- TODO; needed to compile Constructors OrdDigits numeral = variants {} ; ---- TODO; needed to compile Constructors @@ -158,14 +164,14 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { -- {s = \\ af => (uy_j_EndDecl (numeral.s ! caseAF af ! genAF af)).s!af} ; NumNumeral n = n ; - NumDigits n = {s = \\_,_,_ => n.s ; n = n.n} ; + NumDigits n = {s = \\_,_,_ => n.s ; n = n.n ; size = n.size } ; - AdNum adn num = {s = \\c,a,n => adn.s ++ num.s!c!a!n ; n = num.n} ; + AdNum adn num = {s = \\c,a,n => adn.s ++ num.s!c!a!n ; n = num.n ; size = num.size} ; OrdSuperl a = {s = a.s!Posit}; - DefArt = {s = \\_=>[] ; c=Nom; g = PNoGen; q = False }; - IndefArt = { s = \\_=>[] ; c=Nom; g = PNoGen; q = False }; + DefArt = {s = \\_=>[] ; c=Nom; g = PNoGen; size = nom }; + IndefArt = { s = \\_=>[] ; c=Nom; g = PNoGen; size = nom }; UseN noun = noun ; UseN2 noun = noun ; @@ -180,9 +186,9 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { ComplN2 f x = { s = \\nf => case x.pron of { - True => x.s ! (case nf of {NF n c => mkPronForm c No (Poss (gennum f.g n))}) ++ f.s ! nf ; + True => x.s ! (case nf of {NF n c size => mkPronForm c No (Poss (gennum f.g n))}) ++ f.s ! nf ; False => f.s ! nf ++ f.c2.s ++ - x.s ! (case nf of {NF n c => mkPronForm f.c2.c Yes (Poss (gennum f.g n))}) + x.s ! (case nf of {NF n c size => mkPronForm f.c2.c Yes (Poss (gennum f.g n))}) }; g = f.g ; anim = f.anim @@ -220,7 +226,8 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { -- later, in the chapter on verbs. AdjCN ap cn = { - s = \\nf => ap.s ! case nf of {NF n c => AF c cn.anim (gennum cn.g n)} ++ + s = \\nf => ap.s ! case nf of {NF Sg Gen sgg => AF Nom cn.anim GPl ; + NF n c size => AF c cn.anim (gennum cn.g n)} ++ cn.s ! nf ; g = cn.g ; anim = cn.anim @@ -246,14 +253,14 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { } ; RelCN idea x = { - s = \\nf => idea.s ! nf ++ case nf of {NF n c => x.s ! (gennum idea.g n)!c!idea.anim} ; + s = \\nf => idea.s ! nf ++ case nf of {NF n c size => x.s ! (gennum idea.g n)!c!idea.anim} ; g = idea.g ; anim = idea.anim } ; ---- AR 17/12/2008 ApposCN cn s = { - s = \\nf => cn.s ! nf ++ s.s ! (case nf of {NF n c => PF c No NonPoss}) ; + s = \\nf => cn.s ! nf ++ s.s ! (case nf of {NF n c size => PF c No NonPoss}) ; g = cn.g ; anim = cn.anim } ; diff --git a/lib/src/russian/NumeralRus.gf b/lib/src/russian/NumeralRus.gf index 14b17b940..67aaf4ba6 100644 --- a/lib/src/russian/NumeralRus.gf +++ b/lib/src/russian/NumeralRus.gf @@ -11,9 +11,9 @@ lincat Digit = {s : DForm => Gender => Animacy => Case => Str ; size : Size} ; lincat Sub10 = {s : Place => DForm => Gender => Animacy => Case => Str ; size : Size} ; lincat Sub100 = {s : Place => Gender => Animacy => Case => Str ; size : Size} ; lincat Sub1000 = {s : Place => Gender => Animacy => Case => Str ; size : Size} ; -lincat Sub1000000 = {s : Gender => Animacy => Case => Str} ; +lincat Sub1000000 = {s : Gender => Animacy => Case => Str ; size : Size} ; -lin num x = {s = \\ g,a,c => x.s ! g ! a ! c; n = Pl}; ---- n TODO ; Size? AR 18/12/2007 +lin num x = {s = \\ g,a,c => x.s ! g ! a ! c; n = Pl ; size = x.size}; lin n2 = {s = table {unit => \\ g, a, c => @@ -201,7 +201,7 @@ lin pot110 = lin pot111 = {s = \\ p => nadsat "один" ; size = plg} ; --- 11 lin pot1to19 d = - {s = table {_ => d.s ! teen} ; size = plg} ; + {s = table {_ => d.s ! teen} ; size = d.size} ; lin pot0as1 n = {s = table {p => n.s ! p ! unit} ; size = n.size} ; lin pot1 d = @@ -215,11 +215,11 @@ lin pot2 d = lin pot2plus d e = {s = \\ p, g, a, c => d.s ! p ! hund ! g ! a ! c ++ e.s ! indep ! g ! a ! c ; size = e.size} ; lin pot2as3 n = - {s = n.s ! indep} ; + {s = n.s ! indep ; size = n.size} ; lin pot3 n = - {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ; size = n.size} ; lin pot3plus n m = - {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ++ m.s ! indep ! g ! a ! c} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ++ m.s ! indep ! g ! a ! c ; size = m.size} ; --- TODO --- raz/odin @@ -230,36 +230,39 @@ lin pot3plus n m = Dig = TDigit ; lin - IDig d = {s = d.s ; n = d.n} ; + IDig d = {s = d.s ; n = d.n ; size = d.size} ; IIDig d i = { s = d.s ++ i.s ; - n = Pl + n = Pl ; + size = i.size } ; - D_0 = mkDig "0" ; - D_1 = mk3Dig "1" "1" Sg ; ---- - D_2 = mkDig "2" ; - D_3 = mkDig "3" ; - D_4 = mkDig "4" ; - D_5 = mkDig "5" ; - D_6 = mkDig "6" ; - D_7 = mkDig "7" ; - D_8 = mkDig "8" ; - D_9 = mkDig "9" ; + D_0 = mk2Dig "0" plg ; + D_1 = mk4Dig "1" "1" Sg nom ; ---- + D_2 = mk2Dig "2" sgg ; + D_3 = mk2Dig "3" sgg ; + D_4 = mk2Dig "4" sgg ; + D_5 = mk2Dig "5" plg ; + D_6 = mk2Dig "6" plg ; + D_7 = mk2Dig "7" plg ; + D_8 = mk2Dig "8" plg ; + D_9 = mk2Dig "9" plg ; oper - mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ; - mkDig : Str -> TDigit = \c -> mk2Dig c (c + "o") ; + mk3Dig : Str -> Str -> Size -> TDigit = \c,o,size -> mk4Dig c o Pl size ; + mk2Dig : Str -> Size -> TDigit = \c,size -> mk3Dig c (c + "o") size ; - mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> { + mk4Dig : Str -> Str -> Number -> Size -> TDigit = \c,o,n,size -> { s = c ; ---- gender - n = n + n = n ; + size = size } ; TDigit = { n : Number ; - s : Str + s : Str ; + size : Size } ; } diff --git a/lib/src/russian/ParadigmsRus.gf b/lib/src/russian/ParadigmsRus.gf index 755b55b19..c67ad6be3 100644 --- a/lib/src/russian/ParadigmsRus.gf +++ b/lib/src/russian/ParadigmsRus.gf @@ -285,7 +285,7 @@ foreign = Foreign; -- +++ MG_UR: added +++ mkIndeclinableNoun = \s,g, anim -> { - s = table { NF _ _ => s } ; + s = table { NF _ _ _ => s } ; g = g ; anim = anim } ** {lock_N = <>}; @@ -296,19 +296,19 @@ foreign = Foreign; -- +++ MG_UR: added +++ nomPl, genPl, datPl, accPl, instPl, preposPl, g, anim -> { s = table { - NF Sg Nom => nomSg ; - NF Sg Gen => genSg ; - NF Sg Dat => datSg ; - NF Sg Acc => accSg ; - NF Sg Inst => instSg ; - NF Sg (Prepos PrepOther) => preposSg ; - NF Sg (Prepos PrepVNa) => prepos2Sg ; - NF Pl Nom => nomPl ; - NF Pl Gen => genPl ; - NF Pl Dat => datPl ; - NF Pl Acc => accPl ; - NF Pl Inst => instPl ; - NF Pl (Prepos _) => preposPl + NF Sg Nom _ => nomSg ; + NF Sg Gen _ => genSg ; + NF Sg Dat _ => datSg ; + NF Sg Acc _ => accSg ; + NF Sg Inst _ => instSg ; + NF Sg (Prepos PrepOther) _ => preposSg ; + NF Sg (Prepos PrepVNa) _ => prepos2Sg ; + NF Pl Nom _ => nomPl ; + NF Pl Gen _ => genPl ; + NF Pl Dat _ => datPl ; + NF Pl Acc _ => accPl ; + NF Pl Inst _ => instPl ; + NF Pl (Prepos _) _ => preposPl } ; g = g ; anim = anim @@ -370,7 +370,7 @@ foreign = Foreign; -- +++ MG_UR: added +++ } ; Pl => mkProperNamePl ivan anim } ** {lock_PN =<>}; - nounPN n = {s=\\c => n.s! NF Sg c; anim=n.anim; g=n.g; lock_PN=<>}; + nounPN n = {s=\\c => n.s! NF Sg c nom; anim=n.anim; g=n.g; lock_PN=<>}; -- On the top level, it is maybe $CN$ that is used rather than $N$, and -- $NP$ rather than $PN$. diff --git a/lib/src/russian/PhraseRus.gf b/lib/src/russian/PhraseRus.gf index f4e313288..e377335c3 100644 --- a/lib/src/russian/PhraseRus.gf +++ b/lib/src/russian/PhraseRus.gf @@ -17,7 +17,7 @@ concrete PhraseRus of Phrase = CatRus ** open Prelude, ResRus in { UttNP np = {s = np.s ! PF Acc No NonPoss} ; UttVP vp = {s = vp.s ! ClInfinit ! GSg Masc ! P3} ; UttAdv adv = adv ; - UttCN n = {s = n.s ! NF Sg Nom} ; + UttCN n = {s = n.s ! NF Sg Nom nom} ; UttCard n = {s = n.s ! Neut ! Inanimate ! Nom} ; UttAP ap = {s = ap.s ! AF Nom Inanimate (GSg Neut)} ; ---- gennum ? (AR) diff --git a/lib/src/russian/QuestionRus.gf b/lib/src/russian/QuestionRus.gf index 584385962..2af4a2a49 100644 --- a/lib/src/russian/QuestionRus.gf +++ b/lib/src/russian/QuestionRus.gf @@ -36,10 +36,10 @@ concrete QuestionRus of Question = CatRus ** open ResRus, Prelude in { {s = \\pf => case kakoj.c of { Nom => kakoj.s ! AF (extCase pf) okhotnik.anim (gennum okhotnik.g kakoj.n) ++ - okhotnik.s ! NF kakoj.n (extCase pf) ; + okhotnik.s ! NF kakoj.n (extCase pf) nom ; _ => kakoj.s ! AF (extCase pf) okhotnik.anim (gennum okhotnik.g kakoj.n) ++ - okhotnik.s ! NF kakoj.n kakoj.c }; + okhotnik.s ! NF kakoj.n kakoj.c plg }; n = kakoj.n ; p = P3 ; pron = False; diff --git a/lib/src/russian/ResRus.gf b/lib/src/russian/ResRus.gf index e7d2fbc44..4554f6af2 100644 --- a/lib/src/russian/ResRus.gf +++ b/lib/src/russian/ResRus.gf @@ -31,6 +31,7 @@ param -- Anteriority = Simul | Anter ; ClForm = ClIndic RusTense Anteriority | ClCondit | ClInfinit | ClImper; -- "naked infinitive" clauses +-- DetForm = NonNum | Few | Many ; -- A number of Russian nouns have common gender. They can -- denote both males and females: "умница" (a clever person), "инженер" (an engineer). @@ -77,7 +78,7 @@ oper -- For the sake of shorter description these parameters are -- combined in the type SubstForm. param - NForm = NF Number Case ; + NForm = NF Number Case Size ; -- Real parameter types (i.e. ones on which words and phrases depend) @@ -124,7 +125,9 @@ oper p : Person ; g: PronGen ; anim : Animacy ; pron: Bool} ; mkNP : Number -> CommNoun -> NounPhrase = \n,chelovek -> - {s = \\cas => chelovek.s ! NF n (extCase cas) ; + {s = \\cas => chelovek.s ! NF n (extCase cas) (case n of { + Sg => nom ; + Pl => plg }); n = n ; g = PGen chelovek.g ; p = P3 ; pron =False ; anim = chelovek.anim } ; diff --git a/lib/src/russian/StructuralRus.gf b/lib/src/russian/StructuralRus.gf index ef955b1c1..a1bb5f545 100644 --- a/lib/src/russian/StructuralRus.gf +++ b/lib/src/russian/StructuralRus.gf @@ -14,7 +14,7 @@ lin above_Prep = { s = "над" ; c = Inst} ; after_Prep = { s = "после" ; c = Gen }; -- all8mass_Det = vesDet ** {n = Sg; g = PNoGen; c = Nom} ; - all_Predet = vseDetPl ** { g = PNoGen; c = Nom; q = False} ; + all_Predet = vseDetPl ** { g = PNoGen; c = Nom; size = nom} ; almost_AdA = {s= "почти"} ; almost_AdN = {s= "почти"} ; although_Subj = ss "хотя" ; @@ -33,11 +33,11 @@ lin during_Prep = { s = ["в течение"] ; c = Gen}; either7or_DConj = sd2 "либо" [", либо"] ** {n = Sg} ; -- comma is not visible in GUI! - every_Det = kazhdujDet ** {n = Sg ; g = PNoGen; c= Nom; q = False} ; + every_Det = kazhdujDet ** {n = Sg ; g = PNoGen; c= Nom; size = nom} ; everybody_NP = mkNP Pl (UseN ((eEnd_Decl "вс")**{lock_N=<>})) ; everything_NP = UsePron (pronVseInanimate ** {lock_Pron=<>}) ; everywhere_Adv = ss "везде" ; - few_Det = nemnogoSgDet **{lock_Det= <>; n= Sg; g = PNoGen; c = Nom; q = True}; + few_Det = nemnogoSgDet **{lock_Det= <>; n= Sg; g = PNoGen; c = Nom; size = plg}; --- DEPREC first_Ord = (uy_j_EndDecl "перв" ) ** {lock_A = <>}; --AStaruyj for_Prep = { s = "для" ; c = Gen }; from_Prep = { s = "от" ; c = Gen }; @@ -54,19 +54,19 @@ lin in_Prep = { s = "в" ; c = Prepos PrepVNa } ; it_Pron = pronOno ; less_CAdv = {s="менее"; p=""} ; - many_Det = mnogoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; q = True} ; + many_Det = mnogoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; size = plg} ; more_CAdv = {s="более"; p=""} ; - most_Predet = bolshinstvoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; q = True} ; + most_Predet = bolshinstvoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; size = plg} ; -- inanimate, Sg: "большинство телефонов безмолству-ет" -- most8many_Det = bolshinstvoPlDet ** {n = Pl; g = (PGen Neut); c= Gen} ; -- animate, Pl: "большинство учащихся хорошо подготовлен-ы" - much_Det = mnogoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; q = True} ; -- same as previous + much_Det = mnogoSgDet ** {n = Sg; g = (PGen Neut); c= Gen; size = plg} ; -- same as previous must_VV = verbDolzhen ; no_Utt = ss ["Нет"] ; on_Prep = { s = "на" ; c = Prepos PrepVNa }; --- DEPREC one_Quant = odinDet ** {lock_QuantSg = <>; n= Sg; g = PNoGen; c = Nom }; --AStaruyj : - only_Predet = (uy_j_EndDecl "единственн" ) ** {lock_Predet = <>; n= Sg; g = PNoGen; c = Nom; q = False }; + only_Predet = (uy_j_EndDecl "единственн" ) ** {lock_Predet = <>; n= Sg; g = PNoGen; c = Nom; size = nom }; or_Conj = {s1= [] ; s2 = "или" ; n = Sg} ; otherwise_PConj = ss "иначе" ; part_Prep = { s = "" ; c = Nom}; -- missing in Russian @@ -76,17 +76,17 @@ lin she_Pron = pronOna ; so_AdA = ss "так"; somebody_NP = UsePron (pronKtoTo** {lock_Pron = <>}); - someSg_Det = nekotorujDet ** {n = Sg; g = PNoGen; c= Nom; q = False} ; - somePl_Det = nekotorujDet ** {n = Pl; g = PNoGen; c= Nom; q = False} ; + someSg_Det = nekotorujDet ** {n = Sg; g = PNoGen; c= Nom; size = nom} ; + somePl_Det = nekotorujDet ** {n = Pl; g = PNoGen; c= Nom; size = nom} ; something_NP = UsePron (pronChtoTo** {lock_Pron=<> }) ; somewhere_Adv = ss "где-нибудь" ; - that_Quant = totDet ** {n = Sg; g = PNoGen; c= Nom; q = False} ; + that_Quant = totDet ** {n = Sg; g = PNoGen; c= Nom; size = nom} ; there_Adv = ss "там" ; there7to_Adv = ss "туда" ; there7from_Adv = ss "оттуда" ; therefore_PConj = ss "следовательно" ; they_Pron = pronOni; - this_Quant = etotDet ** {n = Sg; g = PNoGen; c= Nom; q = False} ; + this_Quant = etotDet ** {n = Sg; g = PNoGen; c= Nom; size = nom} ; through_Prep = { s = "через" ; c = Acc }; to_Prep = { s = "к" ; c = Dat }; too_AdA = ss "слишком" ; diff --git a/lib/src/russian/SymbolRus.gf b/lib/src/russian/SymbolRus.gf index 9c507f166..4af44b317 100644 --- a/lib/src/russian/SymbolRus.gf +++ b/lib/src/russian/SymbolRus.gf @@ -9,21 +9,21 @@ lin FloatPN i = {s = table {_ => i.s} ; g = Neut; anim = Inanimate } ; NumPN n = {s = table {_ => n.s ! Neut ! Inanimate ! Nom} ; g = Neut; anim = Inanimate } ; - CNIntNP cn i = {s = \\cas => cn.s ! NF Sg (extCase cas) ++ i.s; + CNIntNP cn i = {s = \\cas => cn.s ! NF Sg (extCase cas) nom ++ i.s; n = Sg ; p = P3 ; g = PGen cn.g ; anim = cn.anim ; pron = False } ; - CNNumNP cn n = {s = \\cas => cn.s ! NF Sg (extCase cas) + CNNumNP cn n = {s = \\cas => cn.s ! NF Sg (extCase cas) nom ++ n.s ! cn.g ! cn. anim ! (extCase cas) ; n = Sg ; p = P3 ; g = PGen cn.g ; anim = cn.anim ; pron = False } ; - CNSymbNP d cn ss = {s = \\cas => cn.s ! NF Sg (extCase cas); + CNSymbNP d cn ss = {s = \\cas => cn.s ! NF Sg (extCase cas) nom; n = Sg ; p = P3 ; g = PGen cn.g ; anim = cn.anim ; pron = False } ; SymbS sy = sy ; - SymbNum sy = { s = \\_,_,_=>sy.s; n=Pl }; + SymbNum sy = { s = \\_,_,_=>sy.s; n=Pl ; size = plg }; SymbOrd sy = { s = \\af => sy.s } ; diff --git a/lib/src/russian/VerbRus.gf b/lib/src/russian/VerbRus.gf index 916ad30c6..00cf4123c 100644 --- a/lib/src/russian/VerbRus.gf +++ b/lib/src/russian/VerbRus.gf @@ -87,19 +87,19 @@ concrete VerbRus of Verb = CatRus ** open ResRus, Prelude in { CompCN zloj ={ s= \\clf,gn,p => let num = numGenNum gn ; - zlojsg = zloj.s ! NF Sg Nom ; - zlojpl = zloj.s ! NF Pl Nom + zlojsg = zloj.s ! NF Sg Nom nom ; + zlojpl = zloj.s ! NF Pl Nom plg in case clf of { -- person is ignored ! - ClInfinit => "быть" ++ zloj.s ! NF Sg Inst ; + ClInfinit => "быть" ++ zloj.s ! NF Sg Inst nom ; ClImper => case gn of - { (GSg _) => "будь" ++ zloj.s ! NF Sg Inst ; - GPl => "будьте" ++ zloj.s ! NF Pl Inst + { (GSg _) => "будь" ++ zloj.s ! NF Sg Inst plg ; + GPl => "будьте" ++ zloj.s ! NF Pl Inst plg }; -- infinitive does not save GenNum, -- but indicative does for the sake of adjectival predication ! - ClIndic Present _ => zloj.s ! NF num Nom ; + ClIndic Present _ => zloj.s ! NF num Nom nom ; ClIndic PastRus _ => case gn of { (GSg Fem) => "была" ++ zlojsg ; (GSg Masc) => "был" ++ zlojsg ;