diff --git a/src/belarusian/AdjectiveBel.gf b/src/belarusian/AdjectiveBel.gf index 81f7c2c7..f85de896 100644 --- a/src/belarusian/AdjectiveBel.gf +++ b/src/belarusian/AdjectiveBel.gf @@ -1,14 +1,14 @@ concrete AdjectiveBel of Adjective = CatBel ** open ResBel in { lin PositA a = a ; - ComparA a np = {s = \\c,gn => "больш" ++ a.s ! c ! gn ++ "за" ++ np.s ! Acc} ; - ComplA2 a np = {s = \\c,gn => a.s ! c ! gn ++ prepNP a.c2 np} ; - ReflA2 a = {s = \\c,gn => a.s ! c ! gn ++ "да сябе"} ; + ComparA a np = {s = \\c,gn => "больш" ++ a.s ! c ! gn ++ "за" ++ np.s ! Acc; adv = "больш" ++ a.adv ++ "за" ++ np.s ! Acc; post = a.post} ; + ComplA2 a np = {s = \\c,gn => a.s ! c ! gn ++ prepNP a.c2 np; adv = a.adv ++ prepNP a.c2 np; post = a.post} ; + ReflA2 a = {s = \\c,gn => a.s ! c ! gn ++ "да сябе"; adv = a.adv ++ "да сябе"; post = a.post} ; UseA2 a = a ; - UseComparA a = {s = \\c,gn => "больш" ++ a.s ! c ! gn} ; - CAdvAP cadv ap np = {s = \\c,gn => cadv.s ++ ap.s ! c ! gn ++ cadv.p ++ np.s ! Nom} ; + UseComparA a = {s = \\c,gn => "больш" ++ a.s ! c ! gn; adv = "больш" ++ a.adv; post = a.post} ; + CAdvAP cadv ap np = {s = \\c,gn => cadv.s ++ ap.s ! c ! gn ++ cadv.p ++ np.s ! Nom; adv = cadv.s ++ ap.adv ++ cadv.p ++ np.s ! Nom; post = ap.post} ; AdjOrd ord = ord ; - SentAP ap sc = {s = \\c,gn => ap.s ! c ! gn ++ sc.s} ; - AdAP ada ap = {s = \\c,gn => ada.s ++ ap.s ! c ! gn} ; - AdvAP ap adv = {s = \\c,gn => ap.s ! c ! gn ++ adv.s} ; + SentAP ap sc = {s = \\c,gn => ap.s ! c ! gn ++ sc.s; adv = ap.adv ++ sc.s; post = ap.post} ; + AdAP ada ap = {s = \\c,gn => ada.s ++ ap.s ! c ! gn; adv = ada.s ++ ap.adv; post = ap.post} ; + AdvAP ap adv = {s = \\c,gn => ap.s ! c ! gn ++ adv.s; adv = ap.adv ++ adv.s; post = ap.post} ; } diff --git a/src/belarusian/AdverbBel.gf b/src/belarusian/AdverbBel.gf index b1d969f8..e35db6ad 100644 --- a/src/belarusian/AdverbBel.gf +++ b/src/belarusian/AdverbBel.gf @@ -1,12 +1,12 @@ concrete AdverbBel of Adverb = CatBel ** open ResBel in { lin - PositAdvAdj a = {s = a.s ! Nom ! GSg Neuter} ; + PositAdvAdj a = {s = a.adv} ; PrepNP prep np = {s = prepNP prep np} ; - ComparAdvAdj cadv a np = {s = cadv.s ++ a.s ! Nom ! GSg Neuter ++ cadv.p ++ np.s ! Nom} ; - ComparAdvAdjS cadv a s = {s = cadv.s ++ a.s ! Nom ! GSg Neuter ++ cadv.p ++ s.s} ; + ComparAdvAdj cadv a np = {s = cadv.s ++ a.adv ++ cadv.p ++ np.s ! Nom} ; + ComparAdvAdjS cadv a s = {s = cadv.s ++ a.adv ++ cadv.p ++ s.s} ; AdAdv ada adv = {s = ada.s ++ adv.s} ; - PositAdAAdj a = {s = a.s ! Nom ! GSg Neuter} ; + PositAdAAdj a = {s = a.adv} ; SubjS subj s = {s = subj.s ++ s.s} ; AdnCAdv cadv = {s = cadv.s} ; diff --git a/src/belarusian/CatBel.gf b/src/belarusian/CatBel.gf index 6b471ad4..32d7c200 100644 --- a/src/belarusian/CatBel.gf +++ b/src/belarusian/CatBel.gf @@ -27,7 +27,7 @@ lincat N3 = Noun ** {c2,c3 : Compl} ; CN = CommonNoun ; NP = NPhrase ; - Pron = {s: Case => Str; a: Agr} ; + Pron = {s: Case => Str; poss : Case => Gender => Number => Str; a: Agr} ; Det = {s : Case => Gender => Str; n : Number} ; Predet = {s : Case => Gender => Number => Str} ; Quant = {s : Case => Gender => Number => Str} ; @@ -47,8 +47,8 @@ lincat V = Verb ; VV,VS,VQ,VA = Verb ; - V2 = Verb ** {c2 : Compl} ; - V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl} ; + V2 = Verb ** {c2 : Compl; pa : Adj} ; + V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl; pa : Adj} ; A = Adj ; A2 = Adj ** {c2 : Compl} ; AP = AdjPhrase ; diff --git a/src/belarusian/ConjunctionBel.gf b/src/belarusian/ConjunctionBel.gf index a79a47cd..3e401730 100644 --- a/src/belarusian/ConjunctionBel.gf +++ b/src/belarusian/ConjunctionBel.gf @@ -1,9 +1,13 @@ -concrete ConjunctionBel of Conjunction = CatBel ** open ResBel in { +concrete ConjunctionBel of Conjunction = CatBel ** open ResBel, Prelude in { lin ConjS conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; ConjRS conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; - ConjAP conj xs = {s = \\c,gn => xs.s1 ! c ! gn ++ conj.s ++ xs.s2 ! c ! gn} ; + ConjAP conj xs = { + s = \\c,gn => xs.s1 ! c ! gn ++ conj.s ++ xs.s2 ! c ! gn; + adv = xs.adv1 ++ conj.s ++ xs.adv2; + post = False + } ; ConjNP conj xs = { s = \\c => xs.s1 ! c ++ conj.s ++ xs.s2 ! c ; a = {g=Masc; n=conj.n; p=P3} @@ -39,8 +43,13 @@ lin s1 = \\c => x.s ! c ++ "," ++ xs.s1 ! c ; s2 = xs.s2 } ; - BaseAP x y = {s1 = x.s; s2 = y.s} ; - ConsAP x xs = {s1 = \\c,gn => x.s ! c ! gn ++ "," ++ xs.s1 ! c ! gn; s2 = xs.s2} ; + BaseAP x y = {s1 = x.s; s2 = y.s; adv1 = x.adv; adv2 = y.adv} ; + ConsAP x xs = { + s1 = \\c,gn => x.s ! c ! gn ++ "," ++ xs.s1 ! c ! gn; + s2 = xs.s2; + adv1 = x.adv ++ "," ++ xs.adv1; + adv2 = xs.adv2 + } ; BaseCN x y = {s1 = x.s; s2 = y.s; voc = x.voc ++ "," ++ y.voc; g = x.g} ; ConsCN x xs = {s1 = \\c,n => x.s ! c ! n ++ "," ++ xs.s1 ! c ! n; s2 = xs.s2; voc = x.voc ++ "," ++ xs.voc; g = xs.g} ; BaseDAP x y = {s1 = x.s; s2 = y.s} ; @@ -53,7 +62,7 @@ lincat [AdV] = {s1,s2 : Str} ; [IAdv] = {s1,s2 : Str} ; [NP] = {s1,s2 : Case => Str} ; - [AP] = {s1,s2 : Case => GenNum => Str} ; + [AP] = {s1,s2 : Case => GenNum => Str; adv1,adv2 : Str} ; [CN] = {s1,s2 : Case => Number => Str; voc : Str; g : Gender} ; [DAP] = {s1,s2 : Case => Gender => Str} ; diff --git a/src/belarusian/ConstructionBel.gf b/src/belarusian/ConstructionBel.gf index 380a9844..34226f36 100644 --- a/src/belarusian/ConstructionBel.gf +++ b/src/belarusian/ConstructionBel.gf @@ -6,7 +6,7 @@ lincat oper adjVP : Adj -> VPhrase = \a -> { s = \\t,p,agr => copula t p agr ++ a.s ! Nom ! genNum agr.g agr.n ; - inf = "быць" ++ a.s ! Nom ! GSg Masc ; + inf = \\agr => "быць" ++ a.s ! Nom ! genNum agr.g agr.n ; imp = \\p,_ => neg p ++ "будзь" ++ a.s ! Nom ! GSg Masc } ; @@ -19,7 +19,7 @@ lin ready_VP = adjVP (mkA "гатовы") ; has_age_VP card = { s = \\t,p,a => copula t p a ++ card.s ++ "гадоў" ; - inf = card.s ++ "гадоў" ; + inf = \\_ => card.s ++ "гадоў" ; imp = \\p,_ => neg p ++ card.s ++ "гадоў" } ; @@ -33,7 +33,7 @@ lin is_right_VP = adjVP (mkA "правы") ; is_wrong_VP = adjVP (mkA "няправы") ; - n_units_AP card cn a = {s = \\c,gn => card.s ++ cn.s ! Gen ! Pl ++ a.s ! c ! gn} ; + n_units_AP card cn a = {s = \\c,gn => card.s ++ cn.s ! Gen ! Pl ++ a.s ! c ! gn; adv = card.s ++ cn.s ! Gen ! Pl ++ a.adv; post = a.post} ; n_units_of_NP card cn np = mkSimpleNP (card.s ++ cn.s ! Gen ! Pl ++ np.s ! Gen) Neuter Sg P3 ; n_unit_CN card unit cn = nounFromStr (card.s ++ unit.s ! Nom ! Pl ++ cn.s ! Nom ! Sg) cn.g ; diff --git a/src/belarusian/ExtendBel.gf b/src/belarusian/ExtendBel.gf index 60048722..fd9e27cb 100644 --- a/src/belarusian/ExtendBel.gf +++ b/src/belarusian/ExtendBel.gf @@ -1,5 +1,5 @@ --# -path=.:../abstract:../common:prelude -concrete ExtendBel of Extend = CatBel ** open ResBel, (R = ParamX), ParadigmsBel in { +concrete ExtendBel of Extend = CatBel ** open ResBel, (R = ParamX), ParadigmsBel, Prelude in { lincat VPS = {s : Agr => Str} ; @@ -31,11 +31,11 @@ lin GenIP ip = {s = \\_,_,_ => ip.s ! Gen} ; GenRP num cn = {s = cn.s ! Gen ! num.n ++ "якога"} ; GenModNP num np cn = { - s = \\c => np.s ! Gen ++ cn.s ! c ! num.n ; + s = \\c => cn.s ! c ! num.n ++ np.s ! Gen ; a = {g=cn.g; n=num.n; p=P3} } ; GenModIP num ip cn = { - s = \\c => ip.s ! Gen ++ cn.s ! c ! num.n ; + s = \\c => cn.s ! c ! num.n ++ ip.s ! Gen ; a = {g=cn.g; n=num.n; p=P3} } ; @@ -46,7 +46,7 @@ lin StrandRelSlash rp cl = {s = \\t,p => rp.s ++ cl.s ! t ! p} ; EmptyRelSlash cl = {s = \\t,p => "што" ++ cl.s ! t ! p} ; - MkVPS temp pol vp = {s = \\a => vp.s ! temp.t ! pol.p ! a} ; + MkVPS temp pol vp = {s = \\a => vp.s ! anteriorTense temp.t temp.a ! pol.p ! a} ; ConjVPS conj xs = {s = \\a => xs.s1 ! a ++ conj.s ++ xs.s2 ! a} ; PredVPS np vps = {s = np.s ! Nom ++ vps.s ! np.a} ; SQuestVPS np vps = {s = np.s ! Nom ++ vps.s ! np.a} ; @@ -63,13 +63,13 @@ lin ConjVPI conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; ComplVPIVV vv vpi = { s = \\t,p,a => finiteVerb vv t p a ++ vpi.s ; - inf = vv.infinitive ++ vpi.s ; + inf = \\_ => vv.infinitive ++ vpi.s ; imp = \\p,n => neg p ++ vv.imperative ! n ++ vpi.s } ; BaseVPI x y = {s1 = x.s; s2 = y.s} ; ConsVPI x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; - MkVPS2 temp pol vp = {s = \\a => vp.s ! temp.t ! pol.p ! a; c = vp.c; post = vp.post} ; + MkVPS2 temp pol vp = {s = \\a => vp.s ! anteriorTense temp.t temp.a ! pol.p ! a; c = vp.c; post = vp.post} ; ConjVPS2 conj xs = {s = \\a => xs.s1 ! a ++ conj.s ++ xs.s2 ! a; c = xs.c; post = xs.post} ; ComplVPS2 vps np = {s = \\a => vps.s ! a ++ prepNP vps.c np ++ vps.post} ; ReflVPS2 vps rnp = {s = \\a => vps.s ! a ++ rnp.s ! vps.c.c ++ vps.post} ; @@ -100,16 +100,24 @@ lin FocusAdV adv s = {s = adv.s ++ s.s} ; FocusAP ap np = {s = ap.s ! Nom ! genNum np.a.g np.a.n ++ np.s ! Nom} ; - PresPartAP vp = adjFromStr vp.inf ; - EmbedPresPart vp = {s = vp.inf} ; - PastPartAP vp = adjFromStr vp.inf ; - PastPartAgentAP vp np = adjFromStr (vp.inf ++ prepNP (mkPrep "кім" instrumental) np) ; - PassVPSlash vp = { - s = \\t,p,a => copula t p a ++ vp.inf ; - inf = "быць" ++ vp.inf ; - imp = \\p,_ => neg p ++ "будзь" ++ vp.inf + PresPartAP vp = { + s = \\_,gn => relativeNom gn ++ vp.s ! R.Pres ! R.Pos ! agrFromGenNum gn; + adv = vp.inf; + post = True } ; - PassAgentVPSlash vp np = addAdvVP (PassVPSlash vp) (prepNP (mkPrep "кім" instrumental) np) ; + EmbedPresPart vp = {s = vp.inf} ; + PastPartAP vp = vp.pass ; + PastPartAgentAP vp np = { + s = \\c,gn => vp.pass.s ! c ! gn ++ prepNP (mkPrep instrumental) np ; + adv = vp.pass.adv ++ prepNP (mkPrep instrumental) np; + post = False + } ; + PassVPSlash vp = { + s = \\t,p,a => copula t p a ++ vp.pass.s ! Nom ! genNum a.g a.n ; + inf = \\a => "быць" ++ vp.pass.s ! Nom ! genNum a.g a.n ; + imp = \\p,_ => neg p ++ "будзь" ++ vp.pass.s ! Nom ! GSg Masc + } ; + PassAgentVPSlash vp np = addAdvVP (PassVPSlash vp) (prepNP (mkPrep instrumental) np) ; NominalizeVPSlashNP vp np = mkSimpleNP (vp.inf ++ prepNP vp.c np) Neuter Sg P3 ; ProgrVPSlash vp = vp ; A2VPSlash a = { @@ -117,14 +125,18 @@ lin inf = a.s ! Nom ! GSg Masc ; c = a.c2 ; imp = \\p,_ => neg p ++ a.s ! Nom ! GSg Masc ; - post = [] + pass = a ; + post = [] ; + objPost = \\_ => [] } ; N2VPSlash n = { s = \\t,p,agr => copula t p agr ++ n.s ! Nom ! agr.n ; inf = n.s ! Nom ! Sg ; c = n.c2 ; imp = \\p,_ => neg p ++ n.s ! Nom ! Sg ; - post = [] + pass = adjFromStr (n.s ! Nom ! Sg) ; + post = [] ; + objPost = \\_ => [] } ; ExistsNP np = {s = \\t,p => copula t p np.a ++ np.s ! Nom} ; ExistCN cn = {s = \\t,p => copula t p {g=cn.g; n=Sg; p=P3} ++ cn.s ! Nom ! Sg} ; @@ -135,7 +147,7 @@ lin PurposeVP vp = {s = "каб" ++ vp.inf} ; ComplBareVS vs s = { s = \\t,p,a => finiteVerb vs t p a ++ s.s ; - inf = vs.infinitive ++ s.s ; + inf = \\_ => vs.infinitive ++ s.s ; imp = \\p,n => neg p ++ vs.imperative ! n ++ s.s } ; SlashBareV2S v s = { @@ -143,16 +155,18 @@ lin inf = v.infinitive ++ s.s ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = s.s + pass = v.pa ; + post = s.s ; + objPost = \\_ => s.s } ; ComplDirectVS vs utt = { s = \\t,p,a => finiteVerb vs t p a ++ utt.s ; - inf = vs.infinitive ++ utt.s ; + inf = \\_ => vs.infinitive ++ utt.s ; imp = \\p,n => neg p ++ vs.imperative ! n ++ utt.s } ; ComplDirectVQ vq utt = { s = \\t,p,a => finiteVerb vq t p a ++ utt.s ; - inf = vq.infinitive ++ utt.s ; + inf = \\_ => vq.infinitive ++ utt.s ; imp = \\p,n => neg p ++ vq.imperative ! n ++ utt.s } ; FrontComplDirectVS np vs utt = {s = \\t,p => utt.s ++ np.s ! Nom ++ finiteVerb vs t p np.a} ; @@ -165,18 +179,20 @@ lin ReflRNP vp rnp = { s = \\t,p,a => vp.s ! t ! p ! a ++ rnp.s ! vp.c.c ++ vp.post ; - inf = vp.inf ++ rnp.s ! vp.c.c ; + inf = \\_ => vp.inf ++ rnp.s ! vp.c.c ; imp = \\p,n => vp.imp ! p ! n ++ rnp.s ! vp.c.c ++ vp.post } ; ReflPron = {s = caseTable "сябе"} ; - ReflPoss num cn = {s = \\c => "свой" ++ cn.s ! c ! num.n} ; + ReflPoss num cn = {s = \\c => + (mkPossAdj "св").s ! (modifierCase c cn.g num.n) ! genNum cn.g num.n ++ cn.s ! c ! num.n + } ; PredetRNP pred rnp = {s = \\c => pred.s ! c ! Masc ! Sg ++ rnp.s ! c} ; AdvRNP np prep rnp = {s = \\c => np.s ! c ++ prep.s ++ rnp.s ! prep.c} ; AdvRVP vp prep rnp = addAdvVP vp (prep.s ++ rnp.s ! prep.c) ; - AdvRAP ap prep rnp = {s = \\c,gn => ap.s ! c ! gn ++ prep.s ++ rnp.s ! prep.c} ; - ReflA2RNP a rnp = {s = \\c,gn => a.s ! c ! gn ++ a.c2.s ++ rnp.s ! a.c2.c} ; + AdvRAP ap prep rnp = {s = \\c,gn => ap.s ! c ! gn ++ prep.s ++ rnp.s ! prep.c; adv = ap.adv ++ prep.s ++ rnp.s ! prep.c; post = ap.post} ; + ReflA2RNP a rnp = {s = \\c,gn => a.s ! c ! gn ++ a.c2.s ++ rnp.s ! a.c2.c; adv = a.adv ++ a.c2.s ++ rnp.s ! a.c2.c; post = a.post} ; PossPronRNP pron num cn rnp = { - s = \\c => pron.s ! Gen ++ cn.s ! c ! num.n ++ rnp.s ! Gen ; + s = \\c => pron.poss ! c ! cn.g ! num.n ++ cn.s ! c ! num.n ++ rnp.s ! Gen ; a = {g=cn.g; n=num.n; p=P3} } ; ConjRNP conj xs = {s = \\c => xs.s1 ! c ++ conj.s ++ xs.s2 ! c} ; @@ -188,15 +204,15 @@ lin ReflPossPron = mkQuant "свой" ; ComplGenVV vv ant pol vp = { s = \\t,p,a => finiteVerb vv t p a ++ neg pol.p ++ vp.inf ; - inf = vv.infinitive ++ neg pol.p ++ vp.inf ; + inf = \\a => vv.infinitive ++ neg pol.p ++ vp.inf ! a ; imp = \\p,n => neg p ++ vv.imperative ! n ++ neg pol.p ++ vp.inf } ; CompoundN n1 n2 = { - s = \\c,n => n1.s ! Nom ! Sg ++ n2.s ! c ! n ; - voc = n1.voc ++ n2.voc ; + s = \\c,n => n2.s ! c ! n ++ n1.s ! Gen ! Sg ; + voc = n2.voc ++ n1.s ! Gen ! Sg ; g = n2.g } ; - CompoundAP n a = {s = \\c,gn => n.s ! Nom ! Sg ++ a.s ! c ! gn} ; + CompoundAP n a = {s = \\c,gn => n.s ! Nom ! Sg ++ a.s ! c ! gn; adv = n.s ! Nom ! Sg ++ a.adv; post = a.post} ; GerundCN vp = nounFromStr vp.inf Neuter ; GerundNP vp = mkSimpleNP vp.inf Neuter Sg P3 ; GerundAdv vp = {s = vp.inf} ; @@ -206,7 +222,7 @@ lin ApposNP np app = {s = \\c => np.s ! c ++ app.s ! Nom; a = np.a} ; AdAdV ada adv = {s = ada.s ++ adv.s} ; UttAdV adv = {s = adv.s} ; - PositAdVAdj a = {s = a.s ! Nom ! GSg Neuter} ; + PositAdVAdj a = {s = a.adv} ; CompS s = {s = \\_ => s.s} ; CompQS qs = {s = \\_ => qs.s} ; CompVP ant pol vp = {s = \\_ => neg pol.p ++ vp.inf} ; @@ -214,7 +230,7 @@ lin UttVPShort vp = {s = vp.inf} ; ComplSlashPartLast vp np = { s = \\t,p,a => vp.s ! t ! p ! a ++ prepNP vp.c np ++ vp.post ; - inf = vp.inf ++ prepNP vp.c np ; + inf = \\_ => vp.inf ++ prepNP vp.c np ; imp = \\p,n => vp.imp ! p ! n ++ prepNP vp.c np ++ vp.post } ; DetNPMasc det = {s = \\c => det.s ! c ! Masc; a = {g=Masc; n=det.n; p=P3}} ; @@ -222,7 +238,7 @@ lin UseComp_estar comp = UseComp_ser comp ; UseComp_ser comp = { s = \\t,p,a => copula t p a ++ comp.s ! a ; - inf = "быць" ++ comp.s ! defaultAgr ; + inf = \\a => "быць" ++ comp.s ! a ; imp = \\p,_ => neg p ++ "будзь" ++ comp.s ! defaultAgr } ; SubjRelNP np rs = {s = \\c => np.s ! c ++ rs.s; a = np.a} ; diff --git a/src/belarusian/IdiomBel.gf b/src/belarusian/IdiomBel.gf index ba6e7e28..b6824ca7 100644 --- a/src/belarusian/IdiomBel.gf +++ b/src/belarusian/IdiomBel.gf @@ -12,7 +12,7 @@ lin ExistIPAdv ip adv = {s = \\t,p => copula t p ip.a ++ ip.s ! Nom ++ adv.s} ; ProgrVP vp = vp ; - ImpPl1 vp = {s = "давайце" ++ vp.inf} ; + ImpPl1 vp = {s = "давайце" ++ vp.inf ! defaultAgr} ; ImpP3 np vp = {s = "няхай" ++ np.s ! Nom ++ vp.s ! R.Pres ! R.Pos ! np.a} ; SelfAdvVP vp = addAdvVP vp "сам" ; diff --git a/src/belarusian/MorphoBel.gf b/src/belarusian/MorphoBel.gf index e7d9f4a2..d5fe5e6b 100644 --- a/src/belarusian/MorphoBel.gf +++ b/src/belarusian/MorphoBel.gf @@ -1,4 +1,4 @@ -resource MorphoBel = open CatBel, ResBel, Predef in { +resource MorphoBel = open CatBel, ResBel, Predef, Prelude in { oper @@ -29196,7 +29196,8 @@ mkA001 : Str -> A ; mkA001 base = case base of { base_1+"ы" => lin A - { s = table { + { adv = base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"ы" ; GSg Fem => base_1+"ая" ; @@ -29238,7 +29239,8 @@ mkA002 : Str -> A ; mkA002 base = case base of { base_1+"ы" => lin A - { s = table { + { adv = base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"ы" ; GSg Fem => base_1+"ая" ; @@ -29280,7 +29282,8 @@ mkA003 : Str -> A ; mkA003 base = case base of { base_1+"і" => lin A - { s = table { + { adv = base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"і" ; GSg Fem => base_1+"ая" ; @@ -29322,7 +29325,8 @@ mkA004 : Str -> A ; mkA004 base = case base of { base_1 => lin A - { s = table { + { adv = base_1 ; post = False ; + s = table { Nom => table { GSg Masc => base_1 ; GSg Fem => base_1+"яя" ; @@ -29364,7 +29368,8 @@ mkA005 : Str -> A ; mkA005 base = case base of { base_1+"і" => lin A - { s = table { + { adv = base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"і" ; GSg Fem => base_1+"яя" ; @@ -29406,7 +29411,8 @@ mkA006 : Str -> A ; mkA006 base = case base of { base_1+"і" => lin A - { s = table { + { adv = base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"і" ; GSg Fem => base_1+"ая" ; @@ -29448,7 +29454,8 @@ mkA007 : Str -> A ; mkA007 base = case base of { base_1+"ны" => lin A - { s = table { + { adv = base_1+"на" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"ны" ; GSg Fem => base_1+"ая" ; @@ -29490,7 +29497,8 @@ mkA008 : Str -> A ; mkA008 base = case base of { "м"+base_1+"ўк"+base_2@(?+?+?)+"ы" => lin A - { s = table { + { adv = "м"+base_1+"ўк"+base_2+"а" ; post = False ; + s = table { Nom => table { GSg Masc => "м"+base_1+"ўк"+base_2+"ы" ; GSg Fem => "гав"+base_1+"р"+base_2+"ая" ; @@ -29532,7 +29540,8 @@ mkA009 : Str -> A ; mkA009 base = case base of { "невым"+base_1+"ы" => lin A - { s = table { + { adv = "невым"+base_1+"а" ; post = False ; + s = table { Nom => table { GSg Masc => "невым"+base_1+"ы" ; GSg Fem => "ах"+base_1+"ая" ; @@ -29574,7 +29583,8 @@ mkA010 : Str -> A ; mkA010 base = case base of { base_1+"е"+base_2@(?+?+?)+"ы" => lin A - { s = table { + { adv = base_1+"е"+base_2+"а" ; post = False ; + s = table { Nom => table { GSg Masc => base_1+"е"+base_2+"ы" ; GSg Fem => base_1+"я"+base_2+"ая" ; diff --git a/src/belarusian/NounBel.gf b/src/belarusian/NounBel.gf index b475ed52..94db2ac4 100644 --- a/src/belarusian/NounBel.gf +++ b/src/belarusian/NounBel.gf @@ -1,9 +1,18 @@ concrete NounBel of Noun = CatBel ** open ResBel, Prelude in { + +oper superlativeMarker : Case => GenNum => Str = table { + Nom => table {GSg Masc => "самы"; GSg Fem => "самая"; GSg Neuter => "самае"; GPl => "самыя"}; + Acc => table {GSg Masc => "самага"; GSg Fem => "самую"; GSg Neuter => "самае"; GPl => "самых"}; + Dat => table {GSg Masc => "самому"; GSg Fem => "самай"; GSg Neuter => "самому"; GPl => "самым"}; + Gen => table {GSg Masc => "самага"; GSg Fem => "самай"; GSg Neuter => "самага"; GPl => "самых"}; + Loc => table {GSg Masc => "самым"; GSg Fem => "самай"; GSg Neuter => "самым"; GPl => "самых"}; + Instr => table {GSg Masc => "самым"; GSg Fem => "самай"; GSg Neuter => "самым"; GPl => "самымі"} + }; lin UseN n = n ; DetCN det cn = { - s = \\c => det.s ! c ! cn.g ++ cn.s ! c ! det.n ; + s = \\c => det.s ! (modifierCase c cn.g det.n) ! cn.g ++ cn.s ! c ! det.n ; a = {g=cn.g; n=det.n; p=P3} } ; UsePN pn = { @@ -55,8 +64,12 @@ lin OrdDigits d = adjFromStr d.s ; OrdNumeral n = adjFromStr n.s ; - OrdSuperl a = {s = \\c,gn => "най" ++ a.s ! c ! gn} ; - OrdNumeralSuperl n a = {s = \\c,gn => n.s ++ a.s ! c ! gn} ; + OrdSuperl a = { + s = \\c,gn => superlativeMarker ! c ! gn ++ a.s ! c ! gn; + adv = "найбольш" ++ a.adv; + post = False + } ; + OrdNumeralSuperl n a = {s = \\c,gn => n.s ++ a.s ! c ! gn; adv = n.s ++ a.adv; post = False} ; IndefArt = {s = \\_,_,_ => []} ; DefArt = {s = \\_,_,_ => []} ; @@ -64,7 +77,7 @@ lin s = \\c => cn.s ! c ! Sg ; a = {g=cn.g; n=Sg; p=P3} } ; - PossPron p = {s = \\_,_,_ => p.s ! Gen} ; + PossPron p = {s = p.poss} ; ComplN2 n np = { s = \\c,num => n.s ! c ! num ++ prepNP n.c2 np ; @@ -77,7 +90,10 @@ lin Use3N3 n = n ** {c2 = n.c3} ; AdjCN ap cn = { - s = \\c,num => ap.s ! c ! genNum cn.g num ++ cn.s ! c ! num ; + s = \\c,num => case ap.post of { + False => ap.s ! (modifierCase c cn.g num) ! genNum cn.g num ++ cn.s ! c ! num; + True => cn.s ! c ! num ++ SOFT_BIND ++ "," ++ ap.s ! Nom ! genNum cn.g num + } ; voc = cn.voc ; g = cn.g } ; diff --git a/src/belarusian/NumeralBel.gf b/src/belarusian/NumeralBel.gf index 8415897a..d34f2a98 100644 --- a/src/belarusian/NumeralBel.gf +++ b/src/belarusian/NumeralBel.gf @@ -1,51 +1,69 @@ -concrete NumeralBel of Numeral = CatBel ** { +concrete NumeralBel of Numeral = CatBel ** open Prelude in { lincat - Digit, Sub10, Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 = {s : Str} ; + Digit = { + s, fem, teen, ten, hundred : Str ; + form : NumForm + } ; + Sub10, Sub100, Sub1000 = { + s, fem, hundred : Str ; + form : NumForm + } ; + Sub1000000, Sub1000000000, Sub1000000000000 = {s : Str} ; Dig = {s : Str} ; lin num n = n ; - n2 = {s = "2"} ; - n3 = {s = "3"} ; - n4 = {s = "4"} ; - n5 = {s = "5"} ; - n6 = {s = "6"} ; - n7 = {s = "7"} ; - n8 = {s = "8"} ; - n9 = {s = "9"} ; + n2 = mkDigit "два" "дзве" "дванаццаць" "дваццаць" "дзвесце" Few ; + n3 = mkDigit "тры" "тры" "трынаццаць" "трыццаць" "трыста" Few ; + n4 = mkDigit "чатыры" "чатыры" "чатырнаццаць" "сорак" "чатырыста" Few ; + n5 = mkDigit "пяць" "пяць" "пятнаццаць" "пяцьдзясят" "пяцьсот" Many ; + n6 = mkDigit "шэсць" "шэсць" "шаснаццаць" "шэсцьдзясят" "шэсцьсот" Many ; + n7 = mkDigit "сем" "сем" "сямнаццаць" "семдзесят" "семсот" Many ; + n8 = mkDigit "восем" "восем" "васямнаццаць" "восемдзесят" "восемсот" Many ; + n9 = mkDigit "дзевяць" "дзевяць" "дзевятнаццаць" "дзевяноста" "дзевяцьсот" Many ; - pot01 = {s = "1"} ; + pot01 = {s = "адзін"; fem = "адна"; hundred = "сто"; form = One} ; pot0 d = d ; pot0as1 n = n ; - pot110 = {s = "10"} ; - pot111 = {s = "11"} ; - pot1to19 d = {s = "1" ++ d.s} ; - pot1 d = {s = d.s ++ "0"} ; - pot1plus d n = {s = d.s ++ n.s} ; + pot110 = mkNum "дзесяць" Many ; + pot111 = mkNum "адзінаццаць" Many ; + pot1to19 d = mkNum d.teen Many ; + pot1 d = mkNum d.ten Many ; + pot1plus d n = { + s = d.ten ++ n.s ; + fem = d.ten ++ n.fem ; + hundred = [] ; + form = n.form + } ; pot1as2 n = n ; - pot21 = {s = "100"} ; - pot2 n = {s = n.s ++ "00"} ; - pot2plus n m = {s = n.s ++ "00" ++ m.s} ; + pot21 = mkNum "сто" Many ; + pot2 n = mkNum n.hundred Many ; + pot2plus n m = { + s = n.hundred ++ m.s ; + fem = n.hundred ++ m.fem ; + hundred = [] ; + form = m.form + } ; pot2as3 n = n ; - pot31 = {s = "1000"} ; - pot3 n = {s = n.s ++ "000"} ; - pot3plus n m = {s = n.s ++ "000" ++ m.s} ; + pot31 = {s = "тысяча"} ; + pot3 n = {s = n.fem ++ scaleForm n.form "тысяча" "тысячы" "тысяч"} ; + pot3plus n m = {s = (pot3 n).s ++ m.s} ; pot3as4 n = n ; pot3decimal d = {s = d.s ++ "тысяч"} ; - pot41 = {s = "1000000"} ; - pot4 n = {s = n.s ++ "000000"} ; - pot4plus n m = {s = n.s ++ "000000" ++ m.s} ; + pot41 = {s = "мільён"} ; + pot4 n = {s = n.s ++ scaleForm n.form "мільён" "мільёны" "мільёнаў"} ; + pot4plus n m = {s = (pot4 n).s ++ m.s} ; pot4as5 n = n ; pot4decimal d = {s = d.s ++ "мільёна"} ; - pot51 = {s = "1000000000"} ; - pot5 n = {s = n.s ++ "000000000"} ; - pot5plus n m = {s = n.s ++ "000000000" ++ m.s} ; + pot51 = {s = "мільярд"} ; + pot5 n = {s = n.s ++ scaleForm n.form "мільярд" "мільярды" "мільярдаў"} ; + pot5plus n m = {s = (pot5 n).s ++ m.s} ; pot5decimal d = {s = d.s ++ "мільярда"} ; IDig d = d ; - IIDig d ds = {s = d.s ++ ds.s} ; + IIDig d ds = {s = d.s ++ BIND ++ ds.s} ; D_0 = {s = "0"} ; D_1 = {s = "1"} ; @@ -59,7 +77,29 @@ lin D_9 = {s = "9"} ; PosDecimal d = d ; - NegDecimal d = {s = "-" ++ d.s} ; - IFrac d dig = {s = d.s ++ "." ++ dig.s} ; + NegDecimal d = {s = "-" ++ BIND ++ d.s} ; + IFrac d dig = {s = d.s ++ "." ++ BIND ++ dig.s} ; + +oper + mkDigit : (unit, feminine, teen, ten, hundred : Str) -> NumForm -> { + s, fem, teen, ten, hundred : Str ; + form : NumForm + } = \unit,feminine,teen,ten,hundred,form -> { + s = unit ; fem = feminine ; teen = teen ; ten = ten ; + hundred = hundred ; form = form + } ; + + mkNum : Str -> NumForm -> {s, fem, hundred : Str ; form : NumForm} = + \s,form -> {s = s ; fem = s ; hundred = [] ; form = form} ; + + scaleForm : NumForm -> (one, few, many : Str) -> Str = + \form,one,few,many -> case form of { + One => one ; + Few => few ; + Many => many + } ; + +param + NumForm = One | Few | Many ; } diff --git a/src/belarusian/ParadigmsBel.gf b/src/belarusian/ParadigmsBel.gf index 86c448d6..1c20d3c6 100644 --- a/src/belarusian/ParadigmsBel.gf +++ b/src/belarusian/ParadigmsBel.gf @@ -669,9 +669,52 @@ oper Loc => loc ; Instr => instr } ; + poss = \\c,g,n => (possessiveA nom).s ! c ! genNum g n ; a = {g=g; n = n; p = p} } ; + -- Personal pronouns have adjectival possessives in Belarusian. Keeping + -- them in the pronoun record lets PossPron agree with the possessed noun + -- instead of incorrectly using the personal genitive (мяне, цябе, ...). + possessiveA : Str -> A = \pron -> case pron of { + "я" => mkPossAdj "м" ; + "ты" => mkPossAdj "тв" ; + "мы" => mkHardPossAdj "наш" ; + "вы" => mkHardPossAdj "ваш" ; + "ён" => lin A (adjFromStr "яго") ; + "яно" => lin A (adjFromStr "яго") ; + "яна" => lin A (adjFromStr "яе") ; + "яны" => lin A (adjFromStr "іх") ; + _ => lin A (adjFromStr pron) + } ; + + mkPossAdj : Str -> A = \stem -> lin A {adv = stem+"аё"; post = False; s = table { + Nom => table {GSg Masc => stem+"ой"; GSg Fem => stem+"ая"; GSg Neuter => stem+"аё"; GPl => stem+"ае"} ; + Acc => table {GSg Masc => stem+"айго"; GSg Fem => stem+"аю"; GSg Neuter => stem+"аё"; GPl => stem+"аіх"} ; + Dat => table {GSg Masc => stem+"айму"; GSg Fem => stem+"аёй"; GSg Neuter => stem+"айму"; GPl => stem+"аім"} ; + Gen => table {GSg Masc => stem+"айго"; GSg Fem => stem+"аёй"; GSg Neuter => stem+"айго"; GPl => stem+"аіх"} ; + Loc => table {GSg Masc => stem+"аім"; GSg Fem => stem+"аёй"; GSg Neuter => stem+"аім"; GPl => stem+"аіх"} ; + Instr => table {GSg Masc => stem+"аім"; GSg Fem => stem+"аёй"; GSg Neuter => stem+"аім"; GPl => stem+"аімі"} + }} ; + + mkHardPossAdj : Str -> A = \stem -> lin A {adv = stem+"а"; post = False; s = table { + Nom => table {GSg Masc => stem; GSg Fem => stem+"а"; GSg Neuter => stem+"а"; GPl => stem+"ы"} ; + Acc => table {GSg Masc => stem+"ага"; GSg Fem => stem+"у"; GSg Neuter => stem+"а"; GPl => stem+"ых"} ; + Dat => table {GSg Masc => stem+"аму"; GSg Fem => stem+"ай"; GSg Neuter => stem+"аму"; GPl => stem+"ым"} ; + Gen => table {GSg Masc => stem+"ага"; GSg Fem => stem+"ай"; GSg Neuter => stem+"ага"; GPl => stem+"ых"} ; + Loc => table {GSg Masc => stem+"ым"; GSg Fem => stem+"ай"; GSg Neuter => stem+"ым"; GPl => stem+"ых"} ; + Instr => table {GSg Masc => stem+"ым"; GSg Fem => stem+"ай"; GSg Neuter => stem+"ым"; GPl => stem+"ымі"} + }} ; + + mkDemonstrativeA : Str -> A = \stem -> lin A {adv = stem+"ое"; post = False; s = table { + Nom => table {GSg Masc => stem+"ой"; GSg Fem => stem+"ая"; GSg Neuter => stem+"ое"; GPl => stem+"ыя"} ; + Acc => table {GSg Masc => stem+"аго"; GSg Fem => stem+"ую"; GSg Neuter => stem+"ое"; GPl => stem+"ых"} ; + Dat => table {GSg Masc => stem+"аму"; GSg Fem => stem+"ой"; GSg Neuter => stem+"аму"; GPl => stem+"ым"} ; + Gen => table {GSg Masc => stem+"аго"; GSg Fem => stem+"ой"; GSg Neuter => stem+"аго"; GPl => stem+"ых"} ; + Loc => table {GSg Masc => stem+"ым"; GSg Fem => stem+"ой"; GSg Neuter => stem+"ым"; GPl => stem+"ых"} ; + Instr => table {GSg Masc => stem+"ым"; GSg Fem => stem+"ой"; GSg Neuter => stem+"ым"; GPl => stem+"ымі"} + }} ; + regV : Str -> V -- infinitive = \form -> case form of { _ + "агчы" => mkV021 form; @@ -797,6 +840,14 @@ oper mkN : Str -> Str -> N = reg2N -- s;Nom;Sg s;Acc;Pl } ; + -- Use the plural paradigm of a plural-only Belarusian noun even when the + -- language-neutral tree carries NumSg (e.g. English "door" vs. дзверы). + pluralOnlyN : N -> N = \noun -> lin N { + s = \\c,_ => noun.s ! c ! Pl ; + voc = noun.voc ; + g = noun.g + } ; + mkN2 = overload { mkN2 : N -> N2 = \n -> lin N2 (n ** {c2 = noPrep}) ; mkN2 : N -> Prep -> N2 = \n,p -> lin N2 (n ** {c2 = p}) ; @@ -817,34 +868,69 @@ oper mkVQ : V -> VQ = \v -> lin VQ v ; mkVA : V -> VA = \v -> lin VA v ; + -- Productive fallback for passive constructions. Individual lexical + -- entries can override it with mkV2Pass/mkV3Pass when the participle is + -- irregular; importantly, the fallback is still an agreeing adjective, + -- never the infinitive used by the old implementation. + defaultPassiveA : Str -> A = \inf -> case inf of { + stem + "аваць" => regA (stem + "аваны") ; + stem + "яваць" => regA (stem + "яваны") ; + stem + "ваць" => regA (stem + "ваны") ; + stem + "нуць" => regA (stem + "нуты") ; + stem + "аць" => regA (stem + "аны") ; + stem + "яць" => regA (stem + "яны") ; + stem + "іць" => regA (stem + "ены") ; + stem + "ыць" => regA (stem + "аны") ; + stem + "ці" => regA (stem + "ты") ; + stem + "ць" => regA (stem + "ты") ; + _ => lin A (adjFromStr inf) + } ; + mkV2 = overload { - mkV2 : V -> V2 = \v -> lin V2 (v ** {c2 = noPrep}) ; - mkV2 : V -> Prep -> V2 = \v,p -> lin V2 (v ** {c2 = p}) ; + mkV2 : V -> V2 = \v -> lin V2 (v ** {c2 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV2 : V -> Prep -> V2 = \v,p -> lin V2 (v ** {c2 = p; pa = defaultPassiveA v.infinitive}) ; + } ; + + mkV2Pass = overload { + mkV2Pass : V -> A -> V2 = \v,a -> lin V2 (v ** {c2 = noPrep; pa = a}) ; + mkV2Pass : V -> Prep -> A -> V2 = \v,p,a -> lin V2 (v ** {c2 = p; pa = a}) } ; mkV3 = overload { - mkV3 : V -> V3 = \v -> lin V3 (v ** {c2 = noPrep; c3 = noPrep}) ; - mkV3 : V -> Prep -> Prep -> V3 = \v,p1,p2 -> lin V3 (v ** {c2 = p1; c3 = p2}) ; + mkV3 : V -> V3 = \v -> lin V3 (v ** {c2 = noPrep; c3 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV3 : V -> Prep -> Prep -> V3 = \v,p1,p2 -> lin V3 (v ** {c2 = p1; c3 = p2; pa = defaultPassiveA v.infinitive}) ; } ; + mkV3Pass : V -> Prep -> Prep -> A -> V3 = \v,p1,p2,a -> + lin V3 (v ** {c2 = p1; c3 = p2; pa = a}) ; + mkV2A = overload { - mkV2A : V -> V2A = \v -> lin V2A (v ** {c2 = noPrep; c3 = noPrep}) ; - mkV2A : V -> Prep -> Prep -> V2A = \v,p1,p2 -> lin V2A (v ** {c2 = p1; c3 = p2}) ; + mkV2A : V -> V2A = \v -> lin V2A (v ** {c2 = noPrep; c3 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV2A : V -> Prep -> Prep -> V2A = \v,p1,p2 -> lin V2A (v ** {c2 = p1; c3 = p2; pa = defaultPassiveA v.infinitive}) ; } ; mkV2S = overload { - mkV2S : V -> V2S = \v -> lin V2S (v ** {c2 = noPrep; c3 = noPrep}) ; - mkV2S : V -> Prep -> Prep -> V2S = \v,p1,p2 -> lin V2S (v ** {c2 = p1; c3 = p2}) ; + mkV2S : V -> V2S = \v -> lin V2S (v ** {c2 = noPrep; c3 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV2S : V -> Prep -> Prep -> V2S = \v,p1,p2 -> lin V2S (v ** {c2 = p1; c3 = p2; pa = defaultPassiveA v.infinitive}) ; } ; mkV2Q = overload { - mkV2Q : V -> V2Q = \v -> lin V2Q (v ** {c2 = noPrep; c3 = noPrep}) ; - mkV2Q : V -> Prep -> Prep -> V2Q = \v,p1,p2 -> lin V2Q (v ** {c2 = p1; c3 = p2}) ; + mkV2Q : V -> V2Q = \v -> lin V2Q (v ** {c2 = noPrep; c3 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV2Q : V -> Prep -> Prep -> V2Q = \v,p1,p2 -> lin V2Q (v ** {c2 = p1; c3 = p2; pa = defaultPassiveA v.infinitive}) ; } ; mkV2V = overload { - mkV2V : V -> V2V = \v -> lin V2V (v ** {c2 = noPrep; c3 = noPrep}) ; - mkV2V : V -> Prep -> Prep -> V2V = \v,p1,p2 -> lin V2V (v ** {c2 = p1; c3 = p2}) ; + mkV2V : V -> V2V = \v -> lin V2V (v ** {c2 = noPrep; c3 = noPrep; pa = defaultPassiveA v.infinitive}) ; + mkV2V : V -> Prep -> Prep -> V2V = \v,p1,p2 -> lin V2V (v ** {c2 = p1; c3 = p2; pa = defaultPassiveA v.infinitive}) ; + } ; + + mkV2VPass : V -> Prep -> Prep -> A -> V2V = \v,p1,p2,a -> + lin V2V (v ** {c2 = p1; c3 = p2; pa = a}) ; + + postA : A -> Str -> A = \a,s -> lin A { + s = \\c,gn => a.s ! c ! gn ++ s; + adv = a.adv ++ s; + post = a.post } ; mkA = overload { @@ -883,11 +969,29 @@ oper mkIQuant : Str -> IQuant = \s -> lin IQuant {s=\\_,_,_ => s} ; mkIDet : Str -> IDet = \s -> lin IDet {s=\\_,_ => s; n=Sg} ; mkSubj : Str -> Subj = \s -> lin Subj {s=s} ; - mkQuant : Str -> Quant = \s -> lin Quant {s=\\_,_,_ => s} ; + mkQuant = overload { + mkQuant : Str -> Quant = \s -> lin Quant {s=\\_,_,_ => s} ; + mkQuant : A -> Quant = \a -> lin Quant {s=\\c,g,n => a.s ! c ! genNum g n} + } ; adjQuant : A -> Quant = \a -> lin Quant {s=\\c,g,n => a.s ! c ! genNum g n} ; - mkPredet : Str -> Predet = \s -> lin Predet {s=\\_,_,_ => s} ; - mkDet : Str -> Det = \s -> lin Det {s=\\_,_ => s; n=Sg} ; + mkPredet = overload { + mkPredet : Str -> Predet = \s -> lin Predet {s=\\_,_,_ => s} ; + mkPredet : A -> Predet = \a -> lin Predet {s=\\c,g,n => a.s ! c ! genNum g n} + } ; + allPredet : Predet = lin Predet {s = table { + Nom => table {Masc => table {Sg => "увесь"; Pl => "усе"}; Fem => table {Sg => "уся"; Pl => "усе"}; Neuter => table {Sg => "усё"; Pl => "усе"}} ; + Acc => table {Masc => table {Sg => "усяго"; Pl => "усіх"}; Fem => table {Sg => "усю"; Pl => "усіх"}; Neuter => table {Sg => "усё"; Pl => "усіх"}} ; + Dat => table {Fem => table {Sg => "усёй"; Pl => "усім"}; _ => table {Sg => "усяму"; Pl => "усім"}} ; + Gen => table {Fem => table {Sg => "усёй"; Pl => "усіх"}; _ => table {Sg => "усяго"; Pl => "усіх"}} ; + Loc => table {Fem => table {Sg => "усёй"; Pl => "усіх"}; _ => table {Sg => "усім"; Pl => "усіх"}} ; + Instr => table {Fem => table {Sg => "усёй"; Pl => "усімі"}; _ => table {Sg => "усім"; Pl => "усімі"}} + }} ; + mkDet = overload { + mkDet : Str -> Det = \s -> lin Det {s=\\_,_ => s; n=Sg} ; + mkDet : A -> Number -> Det = \a,n -> lin Det {s=\\c,g => a.s ! c ! genNum g n; n=n} + } ; mkCard : Str -> Card = \s -> lin Card {s=s; n=Pl} ; + mkCardSg : Str -> Card = \s -> lin Card {s=s; n=Sg} ; mkACard : Str -> ACard = \s -> lin ACard {s=s; n=Pl} ; mkConj : Str -> Conj = \s -> lin Conj {s=s; n=Pl} ; mkPConj : Str -> PConj = \s -> lin PConj {s=s} ; diff --git a/src/belarusian/PhraseBel.gf b/src/belarusian/PhraseBel.gf index 1c7b95e5..9884c3f2 100644 --- a/src/belarusian/PhraseBel.gf +++ b/src/belarusian/PhraseBel.gf @@ -11,7 +11,7 @@ lin UttIAdv iadv = iadv ; UttNP np = {s = np.s ! Nom} ; UttAdv adv = adv ; - UttVP vp = {s = vp.inf} ; + UttVP vp = {s = vp.inf ! defaultAgr} ; UttCN cn = {s = cn.s ! Nom ! Sg} ; UttCard card = {s = card.s} ; UttAP ap = {s = ap.s ! Nom ! GSg Masc} ; diff --git a/src/belarusian/ResBel.gf b/src/belarusian/ResBel.gf index f2ba2dc9..ef25a53a 100644 --- a/src/belarusian/ResBel.gf +++ b/src/belarusian/ResBel.gf @@ -116,10 +116,22 @@ oper genNum : Gender -> Number -> GenNum = \g,n -> Pl => GPl } ; -oper Adj = {s: Case => GenNum => Str} ; -- 704 +-- Adjectival accusatives coincide with the nominative for inanimate +-- masculine singular and inanimate plural noun phrases. Nouns retain +-- their own accusative paradigm; this selector is for agreeing modifiers. +oper modifierCase : Case -> Gender -> Number -> Case = \c,g,n -> + case of { + => Nom; + => Nom; + _ => c + } ; + +oper Adj = {s: Case => GenNum => Str; adv : Str; post : Bool} ; -- 704 oper mkAdj : (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Adj = \f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24 -> - { s = table { + { adv = f3 ; + post = False ; + s = table { Nom => table { GSg Masc => f1 ; GSg Fem => f2 ; @@ -185,7 +197,19 @@ oper nounFromStr : Str -> Gender -> Noun = } ; oper adjFromStr : Str -> Adj = - \s -> {s = \\_,_ => s} ; + \s -> {s = \\_,_ => s; adv = s; post = False} ; + +oper agrFromGenNum : GenNum -> Agr = \gn -> case gn of { + GSg g => {g=g; n=Sg; p=P3}; + GPl => {g=Masc; n=Pl; p=P3} + } ; + +oper relativeNom : GenNum -> Str = \gn -> case gn of { + GSg Masc => "які"; + GSg Fem => "якая"; + GSg Neuter => "якое"; + GPl => "якія" + } ; oper prepNP : Compl -> NPhrase -> Str = \prep,np -> prep.s ++ np.s ! prep.c ; @@ -222,6 +246,12 @@ oper copula : R.Tense -> R.Polarity -> Agr -> Str = R.Cond => neg p ++ pastBe a ++ "бы" } ; +oper anteriorTense : R.Tense -> R.Anteriority -> R.Tense = \t,a -> + case of { + => R.Past ; + _ => t + } ; + oper finiteVerb : Verb -> R.Tense -> R.Polarity -> Agr -> Str = \v,t,p,a -> case t of { R.Pres => neg p ++ (v.active ! Imperf).pres ! a.p ! a.n ; @@ -232,14 +262,14 @@ oper finiteVerb : Verb -> R.Tense -> R.Polarity -> Agr -> Str = oper VPhrase : Type = { s : R.Tense => R.Polarity => Agr => Str ; - inf : Str ; + inf : Agr => Str ; imp : R.Polarity => Number => Str } ; oper mkVPhrase : Verb -> VPhrase = \v -> { s = \\t,p,a => finiteVerb v t p a ; - inf = v.infinitive ; + inf = \\_ => v.infinitive ; imp = \\p,n => neg p ++ v.imperative ! n } ; @@ -248,29 +278,33 @@ oper VSlash : Type = { inf : Str ; c : Compl ; imp : R.Polarity => Number => Str ; - post : Str + pass : Adj ; + post : Str ; + objPost : Agr => Str } ; -oper mkVSlash : Verb -> Compl -> VSlash = - \v,c -> { +oper mkVSlash : Verb -> Compl -> Adj -> VSlash = + \v,c,pa -> { s = \\t,p,a => finiteVerb v t p a ; inf = v.infinitive ; c = c ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = [] + pass = pa ; + post = [] ; + objPost = \\_ => [] } ; oper addAdvVP : VPhrase -> Str -> VPhrase = \vp,adv -> { s = \\t,p,a => vp.s ! t ! p ! a ++ adv ; - inf = vp.inf ++ adv ; + inf = \\a => vp.inf ! a ++ adv ; imp = \\p,n => vp.imp ! p ! n ++ adv } ; oper addAdVVP : Str -> VPhrase -> VPhrase = \adv,vp -> { s = \\t,p,a => adv ++ vp.s ! t ! p ! a ; - inf = adv ++ vp.inf ; + inf = \\a => adv ++ vp.inf ! a ; imp = \\p,n => adv ++ vp.imp ! p ! n } ; @@ -280,7 +314,9 @@ oper addAdvSlash : VSlash -> Str -> VSlash = inf = vp.inf ++ adv ; c = vp.c ; imp = \\p,n => vp.imp ! p ! n ; - post = vp.post ++ adv + pass = vp.pass ; + post = vp.post ++ adv ; + objPost = \\a => vp.objPost ! a ++ adv } ; } diff --git a/src/belarusian/SentenceBel.gf b/src/belarusian/SentenceBel.gf index b61fad61..6addc2d8 100644 --- a/src/belarusian/SentenceBel.gf +++ b/src/belarusian/SentenceBel.gf @@ -30,12 +30,12 @@ lin EmbedS s = {s = "што" ++ s.s} ; EmbedQS qs = {s = qs.s} ; - EmbedVP vp = {s = vp.inf} ; + EmbedVP vp = {s = vp.inf ! defaultAgr} ; - UseCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! temp.t ! pol.p} ; - UseQCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! temp.t ! pol.p} ; - UseRCl temp pol cl = {s = cl.s ! temp.t ! pol.p} ; - UseSlash temp pol cl = {s = cl.s ! temp.t ! pol.p; c = cl.c} ; + UseCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! anteriorTense temp.t temp.a ! pol.p} ; + UseQCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! anteriorTense temp.t temp.a ! pol.p} ; + UseRCl temp pol cl = {s = cl.s ! anteriorTense temp.t temp.a ! pol.p} ; + UseSlash temp pol cl = {s = cl.s ! anteriorTense temp.t temp.a ! pol.p; c = cl.c} ; AdvS adv s = {s = adv.s ++ s.s} ; ExtAdvS adv s = {s = adv.s ++ s.s} ; diff --git a/src/belarusian/StructuralBel.gf b/src/belarusian/StructuralBel.gf index c3ab16ea..b31c596d 100644 --- a/src/belarusian/StructuralBel.gf +++ b/src/belarusian/StructuralBel.gf @@ -3,7 +3,7 @@ concrete StructuralBel of Structural = CatBel ** open ResBel, ParadigmsBel in { lin above_Prep = mkPrep "над" instrumental ; after_Prep = mkPrep "пасля" genitive ; - all_Predet = mkPredet "усе" ; + all_Predet = allPredet ; almost_AdA = mkAdA "амаль" ; almost_AdN = mkAdN "амаль" ; although_Subj = mkSubj "хоць" ; @@ -15,13 +15,13 @@ lin between_Prep = mkPrep "паміж" instrumental ; both7and_DConj = mkConj "і" ; but_PConj = mkPConj "але" ; - by8agent_Prep = mkPrep "кім" instrumental ; + by8agent_Prep = mkPrep instrumental ; by8means_Prep = mkPrep "праз" accusative ; can8know_VV = mkVV (mkV021 "магчы") ; can_VV = mkVV (mkV021 "магчы") ; during_Prep = mkPrep "падчас" genitive ; either7or_DConj = mkConj "або" ; - every_Det = {s = \\_,_ => "кожны"; n = Sg} ; + every_Det = mkDet (mkA "кожны") Sg ; everybody_NP = mkSimpleNP "усе" Masc Pl P3 ; everything_NP = mkSimpleNP "усё" Neuter Sg P3 ; everywhere_Adv = mkAdv "усюды" ; @@ -69,13 +69,13 @@ lin somebody_NP = mkSimpleNP "нехта" Masc Sg P3 ; something_NP = mkSimpleNP "нешта" Neuter Sg P3 ; somewhere_Adv = mkAdv "недзе" ; - that_Quant = mkQuant "той" ; + that_Quant = mkQuant (mkDemonstrativeA "т") ; that_Subj = mkSubj "што" ; there_Adv = mkAdv "там" ; there7to_Adv = mkAdv "туды" ; there7from_Adv = mkAdv "адтуль" ; therefore_PConj = mkPConj "таму" ; - this_Quant = mkQuant "гэты" ; + this_Quant = mkQuant (mkA "гэты") ; through_Prep = mkPrep "праз" accusative ; to_Prep = mkPrep "да" genitive ; too_AdA = mkAdA "занадта" ; @@ -95,7 +95,7 @@ lin without_Prep = mkPrep "без" genitive ; yes_Utt = {s = "так"} ; - no_Quant = mkQuant "ніякі" ; + no_Quant = mkQuant (mkA "ніякі") ; not_Predet = mkPredet "не" ; if_then_Conj = mkConj "калі" ; at_least_AdN = mkAdN "прынамсі" ; diff --git a/src/belarusian/VerbBel.gf b/src/belarusian/VerbBel.gf index d7511151..9d3e6a03 100644 --- a/src/belarusian/VerbBel.gf +++ b/src/belarusian/VerbBel.gf @@ -4,105 +4,121 @@ lin UseV v = mkVPhrase v ; ComplVV vv vp = { - s = \\t,p,a => finiteVerb vv t p a ++ vp.inf ; - inf = vv.infinitive ++ vp.inf ; - imp = \\p,n => neg p ++ vv.imperative ! n ++ vp.inf + s = \\t,p,a => finiteVerb vv t p a ++ vp.inf ! a ; + inf = \\a => vv.infinitive ++ vp.inf ! a ; + imp = \\p,n => neg p ++ vv.imperative ! n ++ vp.inf ! defaultAgr } ; ComplVS vs s = { s = \\t,p,a => finiteVerb vs t p a ++ "што" ++ s.s ; - inf = vs.infinitive ++ "што" ++ s.s ; + inf = \\_ => vs.infinitive ++ "што" ++ s.s ; imp = \\p,n => neg p ++ vs.imperative ! n ++ "што" ++ s.s } ; ComplVQ vq qs = { s = \\t,p,a => finiteVerb vq t p a ++ qs.s ; - inf = vq.infinitive ++ qs.s ; + inf = \\_ => vq.infinitive ++ qs.s ; imp = \\p,n => neg p ++ vq.imperative ! n ++ qs.s } ; ComplVA va ap = { s = \\t,p,a => finiteVerb va t p a ++ ap.s ! Nom ! genNum a.g a.n ; - inf = va.infinitive ++ ap.s ! Nom ! GSg Masc ; + inf = \\a => va.infinitive ++ ap.s ! Nom ! genNum a.g a.n ; imp = \\p,n => neg p ++ va.imperative ! n ++ ap.s ! Nom ! GPl } ; - SlashV2a v = mkVSlash v v.c2 ; + SlashV2a v = mkVSlash v v.c2 v.pa ; Slash2V3 v np = { s = \\t,p,a => finiteVerb v t p a ++ prepNP v.c2 np ; inf = v.infinitive ++ prepNP v.c2 np ; c = v.c3 ; imp = \\p,n => neg p ++ v.imperative ! n ++ prepNP v.c2 np ; - post = [] + pass = v.pa ; + post = [] ; + objPost = \\_ => [] } ; Slash3V3 v np = { s = \\t,p,a => finiteVerb v t p a ; inf = v.infinitive ++ prepNP v.c3 np ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = prepNP v.c3 np + pass = v.pa ; + post = prepNP v.c3 np ; + objPost = \\_ => prepNP v.c3 np } ; SlashV2V v vp = { s = \\t,p,a => finiteVerb v t p a ; - inf = v.infinitive ++ vp.inf ; + inf = v.infinitive ++ vp.inf ! defaultAgr ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = vp.inf + pass = v.pa ; + post = vp.inf ! defaultAgr ; + objPost = vp.inf } ; SlashV2S v s = { s = \\t,p,a => finiteVerb v t p a ; inf = v.infinitive ++ "што" ++ s.s ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = "што" ++ s.s + pass = v.pa ; + post = "што" ++ s.s ; + objPost = \\_ => "што" ++ s.s } ; SlashV2Q v qs = { s = \\t,p,a => finiteVerb v t p a ; inf = v.infinitive ++ qs.s ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = qs.s + pass = v.pa ; + post = qs.s ; + objPost = \\_ => qs.s } ; SlashV2A v ap = { s = \\t,p,a => finiteVerb v t p a ; inf = v.infinitive ++ ap.s ! Nom ! GSg Masc ; c = v.c2 ; imp = \\p,n => neg p ++ v.imperative ! n ; - post = ap.s ! Nom ! GSg Masc + pass = v.pa ; + post = ap.s ! Instr ! GSg Masc ; + objPost = \\a => ap.s ! Instr ! genNum a.g a.n } ; ComplSlash vp np = { - s = \\t,p,a => vp.s ! t ! p ! a ++ prepNP vp.c np ++ vp.post ; - inf = vp.inf ++ prepNP vp.c np ; - imp = \\p,n => vp.imp ! p ! n ++ prepNP vp.c np ++ vp.post + s = \\t,p,a => vp.s ! t ! p ! a ++ prepNP vp.c np ++ vp.objPost ! np.a ; + inf = \\_ => vp.inf ++ prepNP vp.c np ; + imp = \\p,n => vp.imp ! p ! n ++ prepNP vp.c np ++ vp.objPost ! np.a } ; SlashVV vv vp = { - s = \\t,p,a => finiteVerb vv t p a ++ vp.s ! R.Pres ! R.Pos ! a ; + s = \\t,p,a => finiteVerb vv t p a ++ vp.inf ; inf = vv.infinitive ++ vp.inf ; c = vp.c ; imp = \\p,n => neg p ++ vv.imperative ! n ++ vp.imp ! R.Pos ! n ; - post = vp.post + pass = vp.pass ; + post = vp.post ; + objPost = vp.objPost } ; SlashV2VNP v np vp = { s = \\t,p,a => finiteVerb v t p a ++ prepNP v.c2 np ++ vp.s ! R.Pres ! R.Pos ! a ; inf = v.infinitive ++ prepNP v.c2 np ++ vp.inf ; c = vp.c ; imp = \\p,n => neg p ++ v.imperative ! n ++ prepNP v.c2 np ++ vp.imp ! R.Pos ! n ; - post = vp.post + pass = vp.pass ; + post = vp.post ; + objPost = vp.objPost } ; ReflVP vp = { - s = \\t,p,a => vp.s ! t ! p ! a ++ "сябе" ++ vp.post ; - inf = vp.inf ++ "сябе" ; + s = \\t,p,a => vp.s ! t ! p ! a ++ "сябе" ++ vp.objPost ! a ; + inf = \\a => vp.inf ++ "сябе" ++ vp.objPost ! a ; imp = \\p,n => vp.imp ! p ! n ++ "сябе" ++ vp.post } ; UseComp comp = { s = \\t,p,a => copula t p a ++ comp.s ! a ; - inf = "быць" ++ comp.s ! defaultAgr ; + inf = \\a => "быць" ++ comp.s ! a ; imp = \\p,_ => neg p ++ "будзь" ++ comp.s ! defaultAgr } ; PassV2 v = { s = \\t,p,a => copula t p a ++ v.participle ! a.g ! a.n ; - inf = "быць" ++ v.participle ! Masc ! Sg ; + inf = \\a => "быць" ++ v.participle ! a.g ! a.n ; imp = \\p,_ => neg p ++ "будзь" ++ v.participle ! Masc ! Sg } ; @@ -115,14 +131,18 @@ lin inf = adv.s ++ vp.inf ; c = vp.c ; imp = \\p,n => adv.s ++ vp.imp ! p ! n ; - post = vp.post + pass = vp.pass ; + post = vp.post ; + objPost = vp.objPost } ; VPSlashPrep vp prep = { s = \\t,p,a => vp.s ! t ! p ! a ++ prep.s ; - inf = vp.inf ++ prep.s ; + inf = vp.inf ! defaultAgr ++ prep.s ; c = prep ; imp = \\p,n => vp.imp ! p ! n ++ prep.s ; - post = [] + pass = adjFromStr "выкананы" ; + post = [] ; + objPost = \\_ => [] } ; CompAP ap = {s = \\a => ap.s ! Nom ! genNum a.g a.n} ; @@ -131,7 +151,7 @@ lin CompCN cn = {s = \\a => cn.s ! Nom ! a.n} ; UseCopula = { s = \\t,p,a => copula t p a ; - inf = "быць" ; + inf = \\_ => "быць" ; imp = \\p,_ => neg p ++ "будзь" } ;