diff --git a/examples/phrasebook/SentencesRus.gf b/examples/phrasebook/SentencesRus.gf index 67e06d7f1..cdde941e1 100644 --- a/examples/phrasebook/SentencesRus.gf +++ b/examples/phrasebook/SentencesRus.gf @@ -1,9 +1,10 @@ concrete SentencesRus of Sentences = NumeralRus ** SentencesI - [ - NameNN, SHave, SHaveNo, SHaveNoMass, QDoHave, AHaveCurr + NameNN, SHave, SHaveNo, SHaveNoMass, QDoHave, AHaveCurr, + IMale, IFemale, YouFamMale, YouFamFemale, YouPolMale, YouPolFemale ] with (Syntax = SyntaxRus), (Symbolic = SymbolicRus), - (Lexicon = LexiconRus), (Grammar = GrammarRus) ** open Prelude, SyntaxRus, (P = ParadigmsRus) in { + (Lexicon = LexiconRus), (Grammar = GrammarRus) ** open Prelude, SyntaxRus, ExtraRus, (P = ParadigmsRus), (R = ResRus), (M = MorphoRus) in { lin SHave p obj = mkS (mkCl (mkVP have_V3 obj p.name)) ; SHaveNo p obj = mkS (mkCl (mkVP have_not_V3 (mkNP obj) p.name)) ; @@ -12,6 +13,13 @@ concrete SentencesRus of Sentences = NumeralRus ** SentencesI - [ AHaveCurr p curr = mkCl (mkVP have_V3 (mkNP aPl_Det curr) p.name) ; - lin NameNN = mkNP (P.mkN "NN") ; + lin + NameNN = mkNP (P.mkN "NN") ; + IMale = mkPerson (M.pronYa R.Masc) ; + IFemale = mkPerson (M.pronYa R.Fem) ; + YouFamMale = mkPerson (M.pronTu R.Masc) ; + YouFamFemale = mkPerson (M.pronTu R.Fem) ; + YouPolMale = mkPerson (M.pronVu R.Masc) ; + YouPolFemale = mkPerson (M.pronVu R.Fem) ; } \ No newline at end of file diff --git a/examples/phrasebook/WordsRus.gf b/examples/phrasebook/WordsRus.gf index 357e4fcd9..71459f848 100644 --- a/examples/phrasebook/WordsRus.gf +++ b/examples/phrasebook/WordsRus.gf @@ -1,7 +1,7 @@ -- (C) 2009 Aarne Ranta under LGPL concrete WordsRus of Words = SentencesRus ** - open SyntaxRus, (P = ParadigmsRus), (L = LexiconRus), Prelude in { + open SyntaxRus, (P = ParadigmsRus), (L = LexiconRus), ExtraRus, (R = ResRus), Prelude in { flags coding = utf8 ; @@ -71,7 +71,7 @@ flags coding = utf8 ; CitRestaurant cit = - mkCNPlace (mkCN cit (P.mkN "ресторан")) in_Prep to_Prep ; + mkCNPlace (mkCN cit (P.mkN "ресторан")) in_Prep to2_Prep ; -- currencies @@ -127,30 +127,36 @@ flags coding = utf8 ; -- actions - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; +-- AHasAge p num = mkCl p.name (mkNP num L.year_N) ; + AHasAge p num = mkCl (mkVP be_V3 (mkNP num L.year_N) p.name) ; AHasName p name = mkCl (mkVP (P.mkV3 name_is_V "" "" P.nominative P.accusative) name p.name) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 + AHasChildren p num = mkCl (mkVP have_V3 (mkNP num L.child_N) p.name) ; + AHasRoom p num = mkCl (mkVP have2_V3 (mkNP (mkNP a_Det (P.mkN "номер")) - (SyntaxRus.mkAdv for_Prep (mkNP num (P.mkN "человек")))) ; - AHasTable p num = mkCl p.name have_V2 + (SyntaxRus.mkAdv for_Prep (mkNP num (L.man_N)))) p.name) ; + AHasTable p num = mkCl (mkVP have2_V3 (mkNP (mkNP a_Det (P.mkN "стол")) - (SyntaxRus.mkAdv for_Prep (mkNP num (P.mkN "человек")))) ; + (SyntaxRus.mkAdv for_Prep (mkNP num (L.man_N)))) p.name) ; AHungry p = mkCl p.name (P.mkA "голодный") ; AIll p = mkCl p.name (P.mkA "больной") ; AKnow p = mkCl p.name (P.regV P.imperfective P.first "зна" "ю" "знал" "знай" "знать" ) ; ALike p item = mkCl item (P.mkV2 (P.mkV P.imperfective "нравлюсь" "нравишься" "нравится" "нравимся" "нравитесь" "нравятся" "нравился" "нравься" "нравиться") [] P.dative) p.name ; ALive p co = mkCl p.name (mkVP (mkVP (P.regV P.imperfective P.firstE "жив" "у" "жил" "живи" "жить")) (SyntaxRus.mkAdv in_Prep co)) ; ALove p q = mkCl p.name (P.dirV2 (P.regV P.imperfective P.second "люб" "лю" "любил" "люби" "любить" )) q.name ; - AMarried p = mkCl p.name (P.mkA "женатый") ; +-- AMarried p = mkCl p.name (P.mkA "женатый") ; + AMarried p = let status = case p.name.g of { + R.PGen R.Masc => P.mkAdv "женат" ; + _ => P.mkAdv "замужем" + } in mkCl p.name status ; AReady p = mkCl p.name (P.mkA "готовый") ; AScared p = mkCl p.name (P.mkV P.imperfective "боюсь" "боишься" "боится" "боимся" "бойтесь" "боятся" "боялся" "бойся" "бояться") ; ASpeak p lang = mkCl p.name (P.mkV2 (P.regV P.imperfective P.secondA "говор" "ю" "говорил" "говори" "говорить") "на" P.prepositional) lang ; AThirsty p = mkCl p.name want_VV (mkVP (P.regV P.imperfective P.firstE "пь" "ю" "пил" "пей" "пить" )) ; - ATired p = mkCl p.name (P.mkA "уставший") ; + ATired p = mkCl p.name (P.mkA "уставший" R.Rel) ; AUnderstand p = mkCl p.name (P.regV P.imperfective P.first "понима" "ю" "понимал" "понимай" "понимать") ; AWant p obj = mkCl p.name (P.dirV2 (P.regV P.imperfective P.mixed "хо" "чу" "хотел" "хоти" "хотеть")) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (P.mkV P.imperfective "иду" "идёшь" "идёт" "идём" "идёте" "идут" "шёл" "иди" "идти")) place.to) ; + AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (P.mkV P.perfective "пошёл" "пошёл" "пошёл" "пошли" "пошли" "пошли" "пошёл" "пойди" "пойти")) place.to) ; + --AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (P.mkV P.imperfective "иду" "идёшь" "идёт" "идём" "идёте" "идут" "шёл" "иди" "идти")) place.to) ; -- miscellaneous @@ -261,12 +267,9 @@ flags coding = utf8 ; by = SyntaxRus.mkAdv on_Prep (mkNP the_Det n) } ; - far_IAdv = ss "как далеко" ** {lock_IAdv = <>} ; - long_IAdv = ss "как долго" ** {lock_IAdv = <>}; - - mkSuperl : A -> Det = \a -> SyntaxRus.mkDet the_Art (SyntaxRus.mkOrd a) ; - - + far_IAdv = ss "как далеко" ** {lock_IAdv = <>} ; + long_IAdv = ss "как долго" ** {lock_IAdv = <>}; + mkSuperl : A -> Det = \a -> SyntaxRus.mkDet the_Art (SyntaxRus.mkOrd a) ; } diff --git a/lib/src/abstract/Structural.gf b/lib/src/abstract/Structural.gf index 95b4fad53..2a54bbd70 100644 --- a/lib/src/abstract/Structural.gf +++ b/lib/src/abstract/Structural.gf @@ -122,8 +122,6 @@ abstract Structural = Cat ** { as_CAdv : CAdv ; have_V2 : V2 ; - have_V3 : V3 ; - have_not_V3 : V3; fun language_title_Utt : Utt ; diff --git a/lib/src/russian/DictRus.gf b/lib/src/russian/DictRus.gf index c59b6ded4..0d82ee7d8 100644 --- a/lib/src/russian/DictRus.gf +++ b/lib/src/russian/DictRus.gf @@ -39054,7 +39054,7 @@ lin ispanjec_N = mkN "испанец" "испанца" "испанцу" "исп lin ispanist_N = mkN "испанист" "испаниста" "испанисту" "испаниста" "испанистом" "испанисте" "испанистом" "испанисты" "испанистов" "испанистам" "испанистов" "испанистом" "испанистах" Masc Animate ; lin ispanistika_N = mkN "испанистика" "испанистики" "испанистике" "испанистику" "испанистикою" "испанистике" "испанистикою" "испанистики" "испанистикою" "испанистикою" "испанистики" "испанистикою" "испанистикою" Fem Inanimate ; lin ispanija_PN = mkPN "испания" Fem Sg Inanimate ; -lin ispanka_N = mkN "испанка" "испанки" "испанке" "испанку" "испанкою" "испанке" "испанками" "испанки" "испанок" "испанкам" "испанок" "испанками" "испанках" Fem Animate ; +lin ispanka_N = mkN "испанка" "испанки" "испанке" "испанку" "испанкой" "испанке" "испанками" "испанки" "испанок" "испанкам" "испанок" "испанками" "испанках" Fem Animate ; lin ispano_amjerikanskijj_A = mkA "испано-американский" ; lin ispano_indjejjskijj_A = mkA "испано-индейский" ; lin ispano_mavritanskijj_A = mkA "испано-мавританский" ; diff --git a/lib/src/russian/ExtraRus.gf b/lib/src/russian/ExtraRus.gf index d592b6e64..a1fb16e09 100644 --- a/lib/src/russian/ExtraRus.gf +++ b/lib/src/russian/ExtraRus.gf @@ -1,3 +1,16 @@ -concrete ExtraRus of ExtraRusAbs = CatRus ** { -flags coding=utf8 ; +concrete ExtraRus of ExtraRusAbs = CatRus ** + open ResRus, MorphoRus, (P = ParadigmsRus), Prelude, NounRus in { + flags optimize=all ; coding=utf8 ; + +lin + have_V3 = P.mkV3 (P.mkV P.imperfective "" "" "" "" "" "" "был" "будь" "есть") "" "у" Nom Gen; + + have2_V3 = P.mkV3 (P.mkV P.imperfective "есть" "есть" "есть" "есть" "есть" "есть" "был" "будь" "есть") "" "у" Nom Gen; + + have_not_V3 = P.mkV3 (P.mkV P.imperfective "нет" "нет" "нет" "нет" "нет" "нет" "не было" "не будь" "нет") "" "у" Gen Gen; + + be_V3 = P.mkV3 (P.mkV P.imperfective "" "" "" "" "" "" "был" "будь" "") "" "" Nom Dat; + + to2_Prep = { s = "в" ; c = Acc }; + } diff --git a/lib/src/russian/ExtraRusAbs.gf b/lib/src/russian/ExtraRusAbs.gf index e1a9d8e9d..31dfee770 100644 --- a/lib/src/russian/ExtraRusAbs.gf +++ b/lib/src/russian/ExtraRusAbs.gf @@ -1,3 +1,12 @@ -abstract ExtraRusAbs = { +abstract ExtraRusAbs = Cat ** { +fun + + have_V3 : V3 ; + have2_V3 : V3 ; + have_not_V3 : V3; + + be_V3 : V3 ; + + to2_Prep : Prep ; } diff --git a/lib/src/russian/LexiconRus.gf b/lib/src/russian/LexiconRus.gf index ac61cd276..2c682068d 100644 --- a/lib/src/russian/LexiconRus.gf +++ b/lib/src/russian/LexiconRus.gf @@ -1,6 +1,6 @@ --# -path=.:abstract:common concrete LexiconRus of Lexicon = CatRus ** - open ParadigmsRus, Prelude, StructuralRus, MorphoRus in { + open ParadigmsRus, Prelude, StructuralRus, MorphoRus, (E = ExtraRus) in { flags optimize=values ; coding=utf8 ; @@ -57,7 +57,8 @@ lin ceiling_N = mkN "потолок" ; -- vowel change chair_N = mkN "стул" ; -- irregular cheese_N = mkN "сыр" ; - child_N = mkN "ребёнок" "ребёнка" "ребёнку" "ребёнка" "ребёнком" "ребёнке" "ребёнке" "дети" "детей" "детям" "детей" "детьми" "детях" masculine animate ; + child_N = mkNAltPl "ребёнок" "деть" masculine animate; +-- child_N = mkN "ребёнок" "ребёнка" "ребёнку" "ребёнка" "ребёнком" "ребёнке" "ребёнке" "дети" "детей" "детям" "детей" "детьми" "детях" masculine animate ; church_N = mkN "церковь" "церкви" "церкви" "церковь" "церковью" "церкви" "церкви" "церкви" "церквей" "церквям" "церкви" "церквями" "церквях" masculine inanimate ; city_N = mkN "город" ; clean_A = mkA "чистый" "чище"; @@ -185,7 +186,7 @@ lin louse_N = mkN "вошь" "вши" "вши" "вошь" "вошью" "вше" "вше" "вши" "вшей" "вшам" "вшей" "вшами" "вшах" feminine animate ; love_N = mkN "любовь" ; -- vowel change love_V2= dirV2 (regV imperfective second "люб" "лю" "любил" "люби" "любить" ); - man_N = mkN "человек" ; -- null gen pl + man_N = mkNAltPl "человек" "людь" masculine animate ; -- null gen pl married_A2 = mkA2 (mkA "замужем") "за" instructive ; meat_N = mkN "мясо" ; milk_N = mkN "молоко" ; @@ -353,7 +354,7 @@ lin wood_N = mkN "дерево" ; worm_N = mkN "черв" ; write_V2 = dirV2 (regV imperfective first "пиш" "у" "писал" "пиши" "писать" ); - year_N = mkN "год" ; + year_N = mkNAltPl "год" "лето" masculine inanimate ; yellow_A = mkA "жёлтый" ; - young_A = mkA "молодой" "моложе"; + young_A = mkA "молодой" "моложе" ; } diff --git a/lib/src/russian/MorphoRus.gf b/lib/src/russian/MorphoRus.gf index d3fed20ef..9be3a5756 100644 --- a/lib/src/russian/MorphoRus.gf +++ b/lib/src/russian/MorphoRus.gf @@ -16,27 +16,27 @@ flags coding=utf8 ; ----2 Personal (together with possesive) pronouns. -oper pronYa : Pronoun = +oper pronYa : Gender -> Pronoun = \ gen -> let nonPoss = { s = table { Nom => "я" ; Gen => "меня" ; Dat => "мне" ; Acc => "меня" ; Inst => "мной" ; Prepos _ => "мне" } } - in pronYaTu nonPoss "мо" P1 ; + in pronYaTu nonPoss "мо" P1 gen ; -oper pronTu : Pronoun = +oper pronTu : Gender -> Pronoun = \ gen -> let nonPoss = { s = table { Nom => "ты" ; Gen => "тебя" ; Dat => "тебе" ; Acc => "тебя" ; Inst => "тобой" ; Prepos _ => "тебе" } } - in pronYaTu nonPoss "тво" P2 ; + in pronYaTu nonPoss "тво" P2 gen ; -- Pronouns ya, ty, svoj -oper pronYaTu : { s : Case => Str } -> Str -> Person -> Pronoun = - \nonPoss, mo, pers -> +oper pronYaTu : { s : Case => Str } -> Str -> Person -> Gender -> Pronoun = + \nonPoss, mo, pers, gen -> { s = table { PF c _ NonPoss => nonPoss.s!c ; PF c _ (Poss gn) => case of { @@ -64,7 +64,7 @@ oper pronYaTu : { s : Case => Str } -> Str -> Person -> Pronoun = } } ; - g = PNoGen ; n = Sg ; p = pers ; pron = True + g = PGen gen ; n = Sg ; p = pers ; pron = True } ; oper pronNAfterPrep : Pronoun -> Pronoun = \p -> @@ -106,8 +106,8 @@ oper pronOno: Pronoun = g = PGen Neut ; n = Sg ; p = P3 ; pron = True } ; -oper pronMuVu : Str -> Str -> Person -> Pronoun = - \mu,na,pers -> +oper pronMuVu : Str -> Str -> Person -> Gender -> Pronoun = + \mu,na,pers,gen -> { s = table { PF Nom _ NonPoss => mu ; PF Gen _ NonPoss => na + "с" ; @@ -138,12 +138,12 @@ oper pronMuVu : Str -> Str -> Person -> Pronoun = PF Inst _ (Poss GPl) => na + "шими" ; PF (Prepos _) _ (Poss GPl) => na + "ших" }; - g = PNoGen ; n = Pl ; p = pers ; pron = True + g = PGen gen ; n = Pl ; p = pers ; pron = True } ; -oper pronMu: Pronoun = pronMuVu "мы" "на" P1; +oper pronMu: Gender -> Pronoun = \gen -> pronMuVu "мы" "на" P1 gen; -oper pronVu: Pronoun = pronMuVu "вы" "ва" P2; +oper pronVu: Gender -> Pronoun = \gen -> pronMuVu "вы" "ва" P2 gen; oper pronOni: Pronoun = pronNAfterPrep { s = table { @@ -699,15 +699,15 @@ oper eEnd_Decl: Str -> CommNoun = \vs -> ---- Type Adjective only has positive degree while AdjDegr type ---- includes also comparative and superlative forms. -- - kazhdujDet: Adjective = aRegHardStemStress "кажд" ; - samuj : Adjective = aRegHardStemStress "сам" ; + kazhdujDet: Adjective = aRegHard StemStress Rel "кажд" ; + samuj : Adjective = aRegHard StemStress Rel "сам" ; -- lubojDet: Adjective = uy_oj_EndDecl "люб" ; -- drugojDet: Adjective = uy_oj_EndDecl "друг" ; -- glaznoj: Adjective = uy_oj_EndDecl "глазн" ; - kotorujDet: Adjective = aRegHardStemStress "котор"; - nekotorujDet: Adjective = aRegHardStemStress "некотор"; - takoj: Adjective = aRegHardEndStress "так"; + kotorujDet: Adjective = aRegHard StemStress Rel "котор"; + nekotorujDet: Adjective = aRegHard StemStress Rel "некотор"; + takoj: Adjective = aRegHard EndStress Rel "так"; -- kakojNibudDet: Adjective = i_oj_EndDecl "как" "-нибудь"; -- kakojDet: Adjective = i_oj_EndDecl "как" []; -- nikakojDet: Adjective = i_oj_EndDecl "никак" []; @@ -720,23 +720,23 @@ oper eEnd_Decl: Str -> CommNoun = \vs -> - oper aRegHardStemStress : Str -> Adjective = \stem -> aRegHard stem False ; + -- oper aRegHardStemStress : Str -> Adjective = \stem -> aRegHard stem False ; - oper aRegHardEndStress : Str -> Adjective = \stem -> aRegHard stem True; + -- oper aRegHardEndStress : Str -> Adjective = \stem -> aRegHard stem True; -- 1. regular hard adjective -- 3. stem ending with г, к, х -- 4. stem ending with ш, ж, ч, щ -- 5. stem ending with ц - oper aRegHard : Str -> Bool -> Adjective = \stem, endStress -> + oper aRegHard : AdjStress -> AdjType -> Str -> Adjective = \stress, at, stem -> let i = iAfter stem in - let o = case endStress of { - True => "о" ; - False => oAfter stem } in + let o = case stress of { + EndStress => "о" ; + StemStress => oAfter stem } in { s = table { - AF Nom _ (GSg Masc) => stem + case endStress of { - True => "ой"; - False => iAfter stem + "й" } ; + AF Nom _ (GSg Masc) => stem + case stress of { + EndStress => "ой"; + StemStress => iAfter stem + "й" } ; AF Nom _ (GSg Neut) => stem + o+"е"; AF Gen _ (GSg (Masc|Neut)) => stem + o+"го"; AF Dat _ (GSg (Masc|Neut)) => stem + o+"му"; @@ -758,15 +758,31 @@ oper eEnd_Decl: Str -> CommNoun = \vs -> AF Dat _ GPl => stem + i+"м"; AF (Prepos _) _ GPl => stem + i+"х"; - AFShort (GSg Masc) => stem; - AFShort (GSg Fem) => stem + "а"; - AFShort (GSg Neut) => stem + o ; - AFShort GPl => stem + i; + AFShort (GSg Masc) => case at of { + Qual => case stem of { + stem2 + ("н"|"ьн") => stem2 + "ен" ; + _ => stem + } ; + Rel => stem + case stress of { + EndStress => "ой"; + StemStress => iAfter stem + "й" } }; + AFShort (GSg Fem) => case at of { + Qual => stem + "а"; + Rel => stem + "ая" + }; + AFShort (GSg Neut) => case at of { + Qual => stem + o ; + Rel => stem + o+"е" + }; + AFShort GPl => case at of { + Qual => stem + i; + Rel => stem + i+"е" + }; AdvF => stem + o } } ; - oper aRegSoft : Str -> Adjective = \stem -> + oper aRegSoft : AdjType -> Str -> Adjective = \at, stem -> { s = table { AF Nom _ (GSg Masc) => stem + "ий" ; AF Nom _ (GSg Neut) => stem + "ее"; @@ -790,10 +806,22 @@ oper eEnd_Decl: Str -> CommNoun = \vs -> AF Dat _ GPl => stem + "им"; AF (Prepos _) _ GPl => stem + "их"; - AFShort (GSg Masc) => stem; -- FIXME: add e if stem ends in consonant + n - AFShort (GSg Fem) => stem + "я"; - AFShort (GSg Neut) => stem + "е" ; - AFShort GPl => stem + "и" ; + AFShort (GSg Masc) => case at of { + Qual => stem; + Rel => stem + "ий" + }; + AFShort (GSg Fem) => case at of { + Qual => stem + "я"; + Rel => stem + "яя" + }; + AFShort (GSg Neut) => case at of { + Qual => stem + "е" ; + Rel => stem + "ее" + }; + AFShort GPl => case at of { + Qual => stem + "и" ; + Rel => stem + "ие" + }; AdvF => stem + "е" } } ; diff --git a/lib/src/russian/NounRus.gf b/lib/src/russian/NounRus.gf index 354071789..17d2e0b39 100644 --- a/lib/src/russian/NounRus.gf +++ b/lib/src/russian/NounRus.gf @@ -8,24 +8,27 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { DetCN kazhduj okhotnik = { s = \\c => case kazhduj.size of { nom => - kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ + kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g Sg) ++ okhotnik.s ! NF kazhduj.n (extCase c) nom ; + nompl => + kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g Pl) ++ + okhotnik.s ! NF kazhduj.n (extCase c) nompl ; sgg => - case kazhduj.c of { - Nom => - kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ + case c of { + PF Nom _ _ => + kazhduj.s ! AF Nom okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ okhotnik.s ! NF Sg Gen sgg; _ => kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ - okhotnik.s ! NF Pl kazhduj.c sgg } ; + okhotnik.s ! NF Pl (extCase c) sgg } ; plg => - case kazhduj.c of { - Nom => - kazhduj.s ! AF (extCase c) okhotnik.anim (gennum okhotnik.g kazhduj.n) ++ + case c of { + PF Nom _ _ => + kazhduj.s ! AF Nom 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 } + okhotnik.s ! NF Pl (extCase c) plg } }; n = kazhduj.n ; p = P3 ; @@ -151,7 +154,7 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { NumCard c = c ; NumSg = {s = \\_,_,_ => [] ; n = Sg ; size = nom} ; - NumPl = {s = \\_,_,_ => [] ; n = Pl ; size = plg} ; + NumPl = {s = \\_,_,_ => [] ; n = Pl ; size = nompl} ; OrdNumeral numeral = variants {} ; ---- TODO; needed to compile Constructors OrdDigits numeral = variants {} ; ---- TODO; needed to compile Constructors diff --git a/lib/src/russian/NumeralRus.gf b/lib/src/russian/NumeralRus.gf index 67aaf4ba6..b5c45c3b0 100644 --- a/lib/src/russian/NumeralRus.gf +++ b/lib/src/russian/NumeralRus.gf @@ -20,7 +20,8 @@ lin n2 = case of { <(Nom|Acc), Fem, Inanimate > => "две"; <(Nom|Acc), _, Inanimate > => "два"; - <(Nom|Acc), _, Animate > => "двух"; + => "два"; + => "двух"; <(Gen|Prepos _), _, _ > => "двух"; => "двум"; => "двумя" @@ -197,11 +198,11 @@ lin pot01 = lin pot0 d = {s = table {_ => d.s} ; size = d.size} ; lin pot110 = - {s = \\ p => n59 "десять" ; size = plg} ; + {s = \\ p => n59 "десят" ; size = plg} ; lin pot111 = {s = \\ p => nadsat "один" ; size = plg} ; --- 11 lin pot1to19 d = - {s = table {_ => d.s ! teen} ; size = d.size} ; + {s = table {_ => d.s ! teen} ; size = plg} ; lin pot0as1 n = {s = table {p => n.s ! p ! unit} ; size = n.size} ; lin pot1 d = @@ -217,9 +218,9 @@ lin pot2plus d e = lin pot2as3 n = {s = n.s ! indep ; size = n.size} ; lin pot3 n = - {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ; size = n.size} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ; size = plg} ; lin pot3plus n m = - {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ++ m.s ! indep ! g ! a ! c ; size = m.size} ; + {s = \\ g, a, c => n.s ! attr ! Fem ! a ! c ++ mille ! n.size ++ m.s ! indep ! g ! a ! c ; size = plg} ; --- TODO --- raz/odin diff --git a/lib/src/russian/ParadigmsRus.gf b/lib/src/russian/ParadigmsRus.gf index c67ad6be3..1c56a3774 100644 --- a/lib/src/russian/ParadigmsRus.gf +++ b/lib/src/russian/ParadigmsRus.gf @@ -73,6 +73,8 @@ oper mkIndeclinableNoun: Str -> Gender -> Animacy -> N ; + mkNAltPl: Str -> Str -> Gender -> Animacy -> N ; + mkN : overload { -- The regular function captures the variants for some common noun endings. @@ -290,6 +292,17 @@ foreign = Foreign; -- +++ MG_UR: added +++ anim = anim } ** {lock_N = <>}; + mkNAltPl = \s, alt, g, anim -> + let {singular = mkN s ; plural = mkN alt} in { + s = table { NF Sg c size => singular.s ! NF Sg c size; + NF Pl c nom => singular.s ! NF Sg c nom; + NF Pl c nompl => plural.s ! NF Sg c nompl; + NF Pl c sgg => plural.s ! NF Sg c sgg; + NF Pl c plg => plural.s ! NF Pl c plg } ; + g = g ; + anim = anim + } ** {lock_N = <>}; + oper mkWorstN : (nomSg, genSg, datSg, accSg, instSg, preposSg, prepos2Sg, nomPl, genPl, datPl, accPl, instPl, preposPl : Str) -> Gender -> Animacy -> N = \nomSg, genSg, datSg, accSg, instSg, preposSg, prepos2Sg, @@ -362,14 +375,18 @@ foreign = Foreign; -- +++ MG_UR: added +++ mkN3 f p2 p3 = (UseN f) ** {c2 = p2; c3 = p3; lock_N3 = <>} ; - mkPN = \ivan, g, n, anim -> - case n of { - Sg => case g of { - Masc => mkProperNameMasc ivan anim ; - _ => mkProperNameFem ivan anim - } ; - Pl => mkProperNamePl ivan anim - } ** {lock_PN =<>}; + -- mkPN = \ivan, g, n, anim -> + -- case n of { + -- Sg => case g of { + -- Masc => mkProperNameMasc ivan anim ; + -- Fem => mkProperNameFem ivan anim ; + -- _ => mkProperNameMasc ivan anim + -- } ; + -- Pl => mkProperNamePl ivan anim + -- } ** {lock_PN =<>}; + + mkPN ivan g n anim = nounPN (mk1N ivan); + 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 @@ -385,6 +402,7 @@ foreign = Foreign; -- +++ MG_UR: added +++ mkA = overload { mkA : (positive : Str) -> A = mk1A ; + mkA : (positive : Str) -> AdjType -> A = mk1Ab ; mkA : (positive, comparative : Str) -> A = mk2A; } ; @@ -393,14 +411,27 @@ foreign = Foreign; -- +++ MG_UR: added +++ mk2A : Str -> Str -> A = \positive, comparative -> case positive of { - stem+"ый" => mkAdjDeg (aRegHardStemStress stem) comparative ; - stem+"ой" => mkAdjDeg (aRegHardEndStress stem) comparative ; - stem@(_+("г"|"к"|"х"))+"ий" => mkAdjDeg (aRegHardStemStress stem) comparative; - stem@(_+("ш"|"ж"|"ч"|"щ"))+"ий" => mkAdjDeg (aRegHardStemStress stem) comparative; - stem+"ий" => mkAdjDeg (aRegSoft stem) comparative ; - stem => mkAdjDeg (adjInvar stem) comparative + stem+"ый" => mkAdjDeg (aRegHard StemStress Qual stem) comparative ; + stem+"ой" => mkAdjDeg (aRegHard EndStress Qual stem) comparative ; + stem@(_+("г"|"к"|"х"))+"ий" => mkAdjDeg (aRegHard StemStress Qual stem) comparative; + stem@(_+("ш"|"ж"|"ч"|"щ"))+"ий" => mkAdjDeg (aRegHard StemStress Qual stem) comparative; + stem+"ий" => mkAdjDeg (aRegSoft Qual stem) comparative ; + stem => mkAdjDeg (adjInvar stem) comparative } ; + mk1Ab : Str -> AdjType -> A = \positive, at -> + let { stem = Predef.tk 2 positive; + comparative = stem + "ее" + } in case positive of { + stem+"ый" => mkAdjDeg (aRegHard StemStress at stem) comparative ; + stem+"ой" => mkAdjDeg (aRegHard EndStress at stem) comparative ; + stem@(_+("г"|"к"|"х"))+"ий" => mkAdjDeg (aRegHard StemStress at stem) comparative; + stem@(_+("ш"|"ж"|"ч"|"щ"))+"ий" => mkAdjDeg (aRegHard StemStress at stem) comparative; + stem+"ий" => mkAdjDeg (aRegSoft at stem) comparative ; + stem => mkAdjDeg (adjInvar stem) comparative + } ; + + -- khaki, mini, hindi, netto adjInvar : Str -> Adjective = \stem -> { s = \\_ => stem } ; diff --git a/lib/src/russian/ResRus.gf b/lib/src/russian/ResRus.gf index 4554f6af2..ce2631cfe 100644 --- a/lib/src/russian/ResRus.gf +++ b/lib/src/russian/ResRus.gf @@ -102,6 +102,9 @@ oper Pronoun = { s : PronForm => Str ; n : Number ; p : Person ; -- Gender is not morphologically determined for first -- and second person pronouns. +-- NF: but adjectives and verbs in past tense have to agree with gender of the +-- person speaking! + param PronGen = PGen Gender | PNoGen ; -- The following coercion is useful: @@ -349,10 +352,13 @@ oper animAF: AdjForm -> Animacy = \af -> -- -- An adjective phrase may contain a complement, e.g. "моложе Риты". -- Then it is used as postfix in modification, e.g. "человек, моложе Риты". +param + AdjStress = EndStress | StemStress ; + AdjType = Qual | Rel ; +oper IsPostfixAdj = Bool ; - -- Simple adjectives are not postfix: -- Adjective type includes both non-degree adjective classes: @@ -378,7 +384,7 @@ oper animAF: AdjForm -> Animacy = \af -> param DForm = unit | teen | ten | hund ; param Place = attr | indep ; -param Size = nom | sgg | plg ; +param Size = nom | nompl | sgg | plg ; --param Gend = masc | fem | neut ; oper mille : Size => Str = table { nom => "тысяча" ; diff --git a/lib/src/russian/StructuralRus.gf b/lib/src/russian/StructuralRus.gf index a1bb5f545..6a4fc20e8 100644 --- a/lib/src/russian/StructuralRus.gf +++ b/lib/src/russian/StructuralRus.gf @@ -48,7 +48,7 @@ lin how_IAdv = ss "как" ; how8many_IDet = skolkoSgDet ** {n = Pl; g = (PGen Neut); c= Gen}; how8much_IAdv = ss "сколько" ; - i_Pron = pronYa ; + i_Pron = pronYa Masc ; if_Subj = ss "если" ; in8front_Prep = { s = "перед" ; c = Inst}; in_Prep = { s = "в" ; c = Prepos PrepVNa } ; @@ -93,7 +93,7 @@ lin under_Prep = { s = "под" ; c = Inst }; very_AdA = ss "очень" ; want_VV = verbKhotet ; - we_Pron = pronMu ; + we_Pron = pronMu Masc; whatPl_IP = pron2NounPhraseNum pronChto Inanimate Pl; whatSg_IP = pron2NounPhraseNum pronChto Inanimate Sg; when_IAdv = ss "когда" ; @@ -109,10 +109,10 @@ lin why_IAdv = ss "почему" ; with_Prep = { s = "с" ; c = Inst}; without_Prep = { s = "без" ; c = Gen}; - youPl_Pron = pronVu; + youPl_Pron = pronVu Masc; yes_Utt = ss ["Да"] ; - youSg_Pron = pronTu; - youPol_Pron = pronVu; + youSg_Pron = pronTu Masc; + youPol_Pron = pronVu Masc; have_V2= P.dirV2 (P.regV P.imperfective P.first "име" "ю" "имел" "имей" "иметь" ); have_V3 = P.mkV3 (P.mkV P.imperfective "есть" "есть" "есть" "есть" "есть" "есть" "был" "будь" "есть") "" "у" Nom Gen;