1
0
forked from GitHub/gf-core

RG and Phrasebook fixes

- added a paradigm for alternative plurals
- fixed usage of alternative plurals in Numerals
- added a distinction between numerals and posessive pronouns
- verb omission and appropriate cases in some uses of to be/to have 
- fixed declination of personal names
- added a gender parameter to pronouns (similar to Polish RG)
- vowel insertion before short adjective suffix
- don't generate short forms for relative adjectives (might need lexicon update)
- minor Phrasebook fixes
This commit is contained in:
Nikita Frolov
2012-12-27 21:04:26 +00:00
parent 1caa2a6d90
commit 9f9c6abb82
13 changed files with 203 additions and 102 deletions

View File

@@ -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) ;
}

View File

@@ -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) ;
}

View File

@@ -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 ;

View File

@@ -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 "испано-мавританский" ;

View File

@@ -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 };
}

View File

@@ -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 ;
}

View File

@@ -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 "молодой" "моложе" ;
}

View File

@@ -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 <c, gn> 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 + "е"
} } ;

View File

@@ -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

View File

@@ -20,7 +20,8 @@ lin n2 =
case <c, g, a> of {
<(Nom|Acc), Fem, Inanimate > => "две";
<(Nom|Acc), _, Inanimate > => "два";
<(Nom|Acc), _, Animate > => "двух";
<Nom , _, Animate > => "два";
<Acc , _, Animate > => "двух";
<(Gen|Prepos _), _, _ > => "двух";
<Dat, _, _ > => "двум";
<Inst, _, _ > => "двумя"
@@ -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

View File

@@ -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 } ;

View File

@@ -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 => "тысяча" ;

View File

@@ -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;