extended by Codex

This commit is contained in:
Krasimir Angelov
2026-09-22 16:36:30 +02:00
parent 9e2a83040a
commit 80b370270b
16 changed files with 422 additions and 171 deletions
+8 -8
View File
@@ -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} ;
}
+4 -4
View File
@@ -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} ;
+3 -3
View File
@@ -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 ;
+14 -5
View File
@@ -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} ;
+3 -3
View File
@@ -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 ;
+49 -33
View File
@@ -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} ;
+1 -1
View File
@@ -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 "сам" ;
+21 -11
View File
@@ -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+"ая" ;
+21 -5
View File
@@ -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
} ;
+71 -31
View File
@@ -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 ;
}
+119 -15
View File
@@ -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} ;
+1 -1
View File
@@ -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} ;
+48 -12
View File
@@ -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 <c,g,n> of {
<Acc,Masc,Sg> => Nom;
<Acc,_,Pl> => 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 <t,a> of {
<R.Pres,R.Anter> => 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
} ;
}
+5 -5
View File
@@ -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} ;
+6 -6
View File
@@ -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 "прынамсі" ;
+48 -28
View File
@@ -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 ++ "будзь"
} ;