additions by Codex

This commit is contained in:
Krasimir Angelov
2026-05-23 07:33:51 +02:00
parent 800e2b0dda
commit 60e38122d0
5 changed files with 360 additions and 7 deletions

View File

@@ -6,7 +6,7 @@ concrete AdverbMkd of Adverb = CatMkd ** open Prelude,ResMkd in {
lin ComparAdvAdjS c a s = {s = c.s lin ComparAdvAdjS c a s = {s = c.s
++ a.s ! Indef ! GSg Masc ++ s.s} ; ++ a.s ! Indef ! GSg Masc ++ s.s} ;
lin PositAdAAdj a = {s = a.s ! Indef ! GSg Masc} ; lin PositAdAAdj a = {s = a.s ! Indef ! GSg Masc} ;
lin PositAdvAdj a = {s = a.s ! Indef ! GSg Masc} ; lin PositAdvAdj a = {s = a.adverb} ;
lin PrepNP p np = {s = p.s ++ np.s ! RPrep} ; lin PrepNP p np = {s = p.s ++ np.s ! RPrep} ;
lin SubjS s s2 = {s = s.s ++ s2.s} ; lin SubjS s s2 = {s = s.s ++ s2.s} ;
} }

View File

@@ -1,7 +1,21 @@
--# -path=.:../abstract:../common:prelude --# -path=.:../abstract:../common:prelude
concrete ExtendMkd of Extend = CatMkd ** open ResMkd, ParadigmsMkd, StructuralMkd in { concrete ExtendMkd of Extend = CatMkd ** open Predef, ResMkd, ParadigmsMkd, StructuralMkd, GrammarMkd, Prelude in {
lincat
VPS = {s : Agr => Str} ;
[VPS] = {s : Agr => Ints 4 => Str} ;
VPI = {s : Agr => Str} ;
[VPI] = {s : Agr => Ints 4 => Str} ;
[Comp] = {s : GenNum => Ints 4 => Str} ;
[Imp] = {s : Polarity => GenNum => Ints 4 => Str} ;
RNP = {s : Agr => Role => Str; a : Agr; isPron : Bool} ;
RNPList = {s : Agr => Ints 4 => Role => Str; a : Agr} ;
lin lin
GenModNP num np cn = DetCN (DetQuant DefArt num) (PossNP cn np) ;
EmptyRelSlash slash = RelSlash IdRP slash ;
CompoundN n1 n2 = CompoundN n1 n2 =
let comp : Species => Number => Str let comp : Species => Number => Str
= \\sp,n => case n1.relType of { = \\sp,n => case n1.relType of {
@@ -23,6 +37,321 @@ lin
g = n2.g g = n2.g
} ; } ;
CompoundAP n a = AdvAP (PositA a) (PrepNP (mkPrep "од") (MassNP (UseN n))) ;
PositAdVAdj a = {s = a.adverb} ;
PresPartAP vp = {
s = \\_,gn => "што" ++
vp.present ! Imperfective ! genNum2num gn ! P3 ++
vp.compl ! {g = gn; p = P3} ;
isPre = False
} ;
PastPartAP vps = {
s = \\_,gn => vps.participle.adjectival ! Perfective ++
vps.compl ! {g = gn; p = P3} ;
isPre = False
} ;
PastPartAgentAP vps np = {
s = \\_,gn => vps.participle.adjectival ! Perfective ++
vps.compl ! {g = gn; p = P3} ++
"од" ++ np.s ! RPrep ;
isPre = False
} ;
PassVPSlash vps = {
present = \\_ => auxBe.present ;
aorist = auxBe.imperfect ;
imperfect = \\_ => auxBe.imperfect ;
imperative = \\_ => auxBe.imperative ;
participle = {aorist = \\_ => auxBe.participle.aorist ;
imperfect = \\_ => auxBe.participle.imperfect ;
perfect = \\_ => nonExist ;
adjectival = \\_ => nonExist ;
adverbial = nonExist} ;
noun_from_verb = nonExist ;
compl = \\agr => vps.participle.adjectival ! Perfective ++ vps.compl ! agr ;
vtype = VNormal
} ;
PassAgentVPSlash vps np = {
present = \\_ => auxBe.present ;
aorist = auxBe.imperfect ;
imperfect = \\_ => auxBe.imperfect ;
imperative = \\_ => auxBe.imperative ;
participle = {aorist = \\_ => auxBe.participle.aorist ;
imperfect = \\_ => auxBe.participle.imperfect ;
perfect = \\_ => nonExist ;
adjectival = \\_ => nonExist ;
adverbial = nonExist} ;
noun_from_verb = nonExist ;
compl = \\agr => vps.participle.adjectival ! Perfective ++ vps.compl ! agr ++
"од" ++ np.s ! RPrep ;
vtype = VNormal
} ;
ProgrVPSlash vps = vps ** {
present = \\_,n,p => vps.present ! Imperfective ! n ! p ;
imperfect = \\_,n,p => vps.imperfect ! Imperfective ! n ! p ;
imperative = \\_,n => vps.imperative ! Imperfective ! n
} ;
GerundCN vp =
let refl : Str = case vp.vtype of {
VNormal => [] ;
VMedial Acc => "се" ;
VMedial Dat => "си"
}
in {
s = \\sp,num => case <sp,num> of {
<Indef,Sg> => vp.noun_from_verb ;
<Indef,Pl> => vp.noun_from_verb ++ BIND ++ "а" ;
<Def Unspecified,Sg> => vp.noun_from_verb ++ BIND ++ "то" ;
<Def Unspecified,Pl> => vp.noun_from_verb ++ BIND ++ "та" ;
<Def Proximal,Sg> => vp.noun_from_verb ++ BIND ++ "во" ;
<Def Proximal,Pl> => vp.noun_from_verb ++ BIND ++ "ва" ;
<Def Distal,Sg> => vp.noun_from_verb ++ BIND ++ "но" ;
<Def Distal,Pl> => vp.noun_from_verb ++ BIND ++ "на"
} ++ refl ++
vp.compl ! {g = GSg Neuter; p = P3} ;
count_form = vp.noun_from_verb ++ BIND ++ "а" ++ refl ++
vp.compl ! {g = GSg Neuter; p = P3} ;
vocative = \\num => vp.noun_from_verb ++ refl ++
vp.compl ! {g = GSg Neuter; p = P3} ;
g = Neuter
} ;
GerundNP vp = MassNP (GerundCN vp) ;
GerundAdv vp =
let refl : Str = case vp.vtype of {
VNormal => [] ;
VMedial Acc => "се" ;
VMedial Dat => "си"
}
in {s = vp.participle.adverbial ++ refl ++
vp.compl ! {g = GSg Neuter; p = P3}} ;
ByVP vp = {s = "со" ++ vp.noun_from_verb ++ BIND ++ "то" ++
vp.compl ! {g = GSg Neuter; p = P3}} ;
WithoutVP vp = {s = "без" ++ vp.noun_from_verb ++ BIND ++ "то" ++
vp.compl ! {g = GSg Neuter; p = P3}} ;
InOrderToVP vp = {s = "за да" ++ vp.present ! Perfective ! Sg ! P3 ++
vp.compl ! {g = GSg Masc; p = P3}} ;
ComplBareVS vs s = vs ** {compl = \\_ => s.s} ;
ComplSlashPartLast = ComplSlash ;
UttVPShort vp = {
s = vp.imperative ! Perfective ! Sg ++ vp.compl ! {g = GSg Masc; p = P2}
} ;
BaseVPS x y = {s = \\a => table {4 => y.s ! a; _ => x.s ! a}} ;
ConsVPS x xs = {
s = \\a => table {
4 => xs.s ! a ! 4 ;
i => x.s ! a ++ linCoord "," ! i ++ xs.s ! a ! i
}
} ;
MkVPS t p vp = {
s = \\agr => t.s ++ p.s ++ mkClause [] agr vp ! Main ! t.t ! t.a ! p.p
} ;
ConjVPS conj vps = {
s = \\agr => linCoord [] ! conj.sep ++
vps.s ! agr ! conj.sep ++ conj.s ++ vps.s ! agr ! 4
} ;
PredVPS np vps = {s = np.s ! RSubj ++ vps.s ! np.a} ;
BaseVPI x y = {s = \\a => table {4 => y.s ! a; _ => x.s ! a}} ;
ConsVPI x xs = {
s = \\a => table {
4 => xs.s ! a ! 4 ;
i => x.s ! a ++ linCoord "," ! i ++ xs.s ! a ! i
}
} ;
MkVPI vp = {
s = \\agr => "да" ++ vp.present ! Perfective ! genNum2num agr.g ! agr.p ++ vp.compl ! agr
} ;
ConjVPI conj vpi = {
s = \\agr => linCoord [] ! conj.sep ++
vpi.s ! agr ! conj.sep ++ conj.s ++ vpi.s ! agr ! 4
} ;
ComplVPIVV vv vpi = vv ** {
compl = \\agr => vpi.s ! agr
} ;
BaseComp x y = {
s = \\gn => table {4 => y.s ! gn; _ => x.s ! gn}
} ;
ConsComp x xs = {
s = \\gn => table {
4 => xs.s ! gn ! 4 ;
i => x.s ! gn ++ linCoord "," ! i ++ xs.s ! gn ! i
}
} ;
ConjComp conj comps = {
s = \\gn => linCoord [] ! conj.sep ++
comps.s ! gn ! conj.sep ++ conj.s ++ comps.s ! gn ! 4
} ;
BaseImp x y = {
s = \\p,gn => table {4 => y.s ! p ! gn; _ => x.s ! p ! gn}
} ;
ConsImp x xs = {
s = \\p,gn => table {
4 => xs.s ! p ! gn ! 4 ;
i => x.s ! p ! gn ++ linCoord "," ! i ++ xs.s ! p ! gn ! i
}
} ;
ConjImp conj imps = {
s = \\p,gn => linCoord [] ! conj.sep ++
imps.s ! p ! gn ! conj.sep ++ conj.s ++ imps.s ! p ! gn ! 4
} ;
ReflRNP slash rnp =
slash ** {
compl = \\agr =>
slash.compl ! agr ++
case <rnp.isPron,slash.c2.c> of {
<True,Acc> => [] ;
<True,Dat> => [] ;
_ => slash.c2.s ++ rnp.s ! agr ! RObj slash.c2.c
} ;
vtype = case <rnp.isPron,slash.c2.c> of {
<True,Acc> => VMedial Acc ;
<True,Dat> => VMedial Dat ;
_ => slash.vtype
}
} ;
ReflPron = {
s = \\_,role => case role of {
RObj Acc => "себе" ;
RObj Dat => "себе" ;
_ => "себе"
} ;
a = {g = GSg Masc; p = P3} ;
isPron = True
} ;
ReflPoss num cn =
let np : NP = DetCN (DetQuant ReflPossPron num) cn
in {
s = \\_,role => np.s ! role ;
a = np.a ;
isPron = False
} ;
PredetRNP pred rnp = rnp ** {
s = \\agr,role => pred.s ++ rnp.s ! agr ! role ;
isPron = False
} ;
AdvRNP np prep rnp = {
s = \\agr,role => np.s ! role ++ prep.s ++ rnp.s ! agr ! RObj prep.c ;
a = np.a ;
isPron = False
} ;
AdvRVP vp prep rnp = vp ** {
compl = \\agr => vp.compl ! agr ++ prep.s ++ rnp.s ! agr ! RObj prep.c
} ;
AdvRAP ap prep rnp = {
s = \\sp,gn => ap.s ! sp ! gn ++ prep.s ++
rnp.s ! {g = gn; p = P3} ! RObj prep.c ;
isPre = False
} ;
ReflA2RNP a2 rnp = {
s = \\sp,gn => a2.s ! sp ! gn ++ a2.c2.s ++
rnp.s ! {g = gn; p = P3} ! RObj a2.c2.c ;
isPre = False
} ;
PossPronRNP pron num cn rnp =
let det : Det = DetQuant (PossPron pron) num ;
n : Number = nnum2num num.n
in {
s = \\_ => det.s ! cn.g ++ cn.s ! det.sp ! n ++
"на" ++ rnp.s ! pron.a ! RObj Acc ;
vocative = det.s ! cn.g ++ cn.vocative ! n ++
"на" ++ rnp.s ! pron.a ! RObj Acc ;
a = {g = genNum cn.g n; p = P3}
} ;
ApposNP np1 np2 = {
s = \\role => np1.s ! role ++ SOFT_BIND ++ "," ++ np2.s ! role ;
vocative = np1.vocative ++ SOFT_BIND ++ "," ++ np2.vocative ;
a = np1.a
} ;
Base_rr_RNP x y = {
s = \\agr => table {4 => y.s ! agr; _ => x.s ! agr} ;
a = y.a
} ;
Base_nr_RNP x y = {
s = \\agr => table {4 => y.s ! agr; _ => x.s} ;
a = y.a
} ;
Base_rn_RNP x y = {
s = \\agr => table {4 => y.s; _ => x.s ! agr} ;
a = y.a
} ;
Cons_rr_RNP x xs = {
s = \\agr => table {
4 => xs.s ! agr ! 4 ;
i => \\role => x.s ! agr ! role ++ linCoord "," ! i ++ xs.s ! agr ! i ! role
} ;
a = xs.a
} ;
Cons_nr_RNP x xs = {
s = \\agr => table {
4 => xs.s ! agr ! 4 ;
i => \\role => x.s ! role ++ linCoord "," ! i ++ xs.s ! agr ! i ! role
} ;
a = xs.a
} ;
ConjRNP conj xs = {
s = \\agr,role => linCoord [] ! conj.sep ++
xs.s ! agr ! conj.sep ! role ++ conj.s ++
xs.s ! agr ! 4 ! role ;
a = xs.a ;
isPron = False
} ;
ReflPossPron = {
s = table {
GSg Masc => "својот" ;
GSg Fem => "својата" ;
GSg Neuter => "своето" ;
GPl => "своите"
} ;
sp = Indef
} ;
UseDAP dap = {
s = \\_ => dap.s ! Neuter ;
vocative = dap.s ! Neuter ;
a = {g = genNum Neuter (nnum2num dap.n); p = P3}
} ;
UseDAPMasc dap = {
s = \\_ => dap.s ! Masc ;
vocative = dap.s ! Masc ;
a = {g = genNum Masc (nnum2num dap.n); p = P3}
} ;
UseDAPFem dap = {
s = \\_ => dap.s ! Fem ;
vocative = dap.s ! Fem ;
a = {g = genNum Fem (nnum2num dap.n); p = P3}
} ;
UseComp_estar = UseComp ;
UseComp_ser = UseComp ;
ProDrop pro = pro ;
iFem_Pron = mkPron "јас" "мене" "ме" "мене" "ми" "мене" "мој" "мојот" "моја" "мојата" "мое" "моето" "мои" "моите" "ми" (GSg Fem) P1 ; iFem_Pron = mkPron "јас" "мене" "ме" "мене" "ми" "мене" "мој" "мојот" "моја" "мојата" "мое" "моето" "мои" "моите" "ми" (GSg Fem) P1 ;
youFem_Pron = mkPron "ти" "тебе" "те" "тебе" "ти" "тебе" "твој" "твојот" "твоја" "твојата" "твое" "твоето" "твои" "твоите" "ти" (GSg Fem) P2 ; youFem_Pron = mkPron "ти" "тебе" "те" "тебе" "ти" "тебе" "твој" "твојот" "твоја" "твојата" "твое" "твоето" "твои" "твоите" "ти" (GSg Fem) P2 ;
weFem_Pron = we_Pron ; weFem_Pron = we_Pron ;
@@ -35,4 +364,3 @@ lin
lin TPastSimple = {s = []} ** {t = VPastSimple} ; --# notpresent lin TPastSimple = {s = []} ** {t = VPastSimple} ; --# notpresent
} }

View File

@@ -919,7 +919,7 @@ mkN028 base =
} ; } ;
rel = \\_,_ => base_1 ; rel = \\_,_ => base_1 ;
relType = Pref ; relType = Pref ;
g = Masc g = Neuter
}; };
_ => error "Can't apply paradigm mkN028" _ => error "Can't apply paradigm mkN028"
} ; } ;

View File

@@ -29,6 +29,10 @@ concrete NumeralMkd of Numeral = CatMkd [Numeral,Digits,Decimal] ** open Prelude
lin PosDecimal ds = ds ** {hasDot = False} ; lin PosDecimal ds = ds ** {hasDot = False} ;
lincat Sub10 = {s : Str; hundred : Str; n : Number} ; lincat Sub10 = {s : Str; hundred : Str; n : Number} ;
lincat Sub100 = {s : Str; n : Number} ; lincat Sub100 = {s : Str; n : Number} ;
lincat Sub1000 = {s : Str; n : Number} ;
lincat Sub1000000 = {s : Str; n : Number} ;
lincat Sub1000000000 = {s : Str; n : Number} ;
lincat Sub1000000000000 = {s : Str; n : Number} ;
oper mkDig : Str -> Number -> {s : Str; n : Number} oper mkDig : Str -> Number -> {s : Str; n : Number}
= \s,n -> {s = s; n = n} ; = \s,n -> {s = s; n = n} ;
oper mkDigit : Str -> Str -> Str -> Str -> {s : Str; teen : Str; oper mkDigit : Str -> Str -> Str -> Str -> {s : Str; teen : Str;
@@ -49,9 +53,30 @@ concrete NumeralMkd of Numeral = CatMkd [Numeral,Digits,Decimal] ** open Prelude
lin pot1 n = {s = n.ten; n = Pl} ; lin pot1 n = {s = n.ten; n = Pl} ;
lin pot110 = {s = "десет"; n = Pl} ; lin pot110 = {s = "десет"; n = Pl} ;
lin pot111 = {s = "единаесет"; n = Pl} ; lin pot111 = {s = "единаесет"; n = Pl} ;
lin pot1to19 d = {s = d.teen; n = Pl} ;
lin pot1as2 n = n ; lin pot1as2 n = n ;
lin pot2 n = {s = n.hundred} ; lin pot1plus d n = {s = d.ten ++ "и" ++ n.s; n = Pl} ;
lin pot2 n = {s = n.hundred; n = Pl} ;
lin pot21 = {s = "сто"; n = Pl} ;
lin pot2plus n m = {s = n.hundred ++ "и" ++ m.s; n = Pl} ;
lin pot2as3 n = n ; lin pot2as3 n = n ;
lin pot31 = {s = "илјада"; n = Pl} ;
lin pot3 n = {s = n.s ++ thousand ! n.n; n = Pl} ;
lin pot3plus n m = {s = n.s ++ thousand ! n.n ++ m.s; n = Pl} ;
lin pot3decimal d = {s = d.s ++ "илјади"; n = Pl} ;
lin pot3as4 n = n ; lin pot3as4 n = n ;
lin pot41 = {s = "милион"; n = Sg} ;
lin pot4 n = {s = n.s ++ million ! n.n; n = Pl} ;
lin pot4plus n m = {s = n.s ++ million ! n.n ++ m.s; n = Pl} ;
lin pot4decimal d = {s = d.s ++ "милиони"; n = Pl} ;
lin pot4as5 n = n ; lin pot4as5 n = n ;
lin pot51 = {s = "милијарда"; n = Sg} ;
lin pot5 n = {s = n.s ++ billion ! n.n; n = Pl} ;
lin pot5plus n m = {s = n.s ++ billion ! n.n ++ m.s; n = Pl} ;
lin pot5decimal d = {s = d.s ++ "милијарди"; n = Pl} ;
oper
thousand : Number => Str = table {Sg => "илјада"; Pl => "илјади"} ;
million : Number => Str = table {Sg => "милион"; Pl => "милиони"} ;
billion : Number => Str = table {Sg => "милијарда"; Pl => "милијарди"} ;
} }

View File

@@ -319,9 +319,9 @@ mkClause : Str -> Agr -> Verb ** {compl : Agr => Str} -> Order => Tense => Anter
Neg => "не" Neg => "не"
} ; } ;
fut = case <p,o> of { fut = case <p,o> of {
<Pos,Main> => <"ке",[]> ; <Pos,Main> => <"ќе",[]> ;
<Neg,Main> => <"нема да",[]> ; <Neg,Main> => <"нема да",[]> ;
<Pos,Quest> => <"ке","ли"> ; <Pos,Quest> => <"ќе","ли"> ;
<Neg,Quest> => <"нема ли да",[]> <Neg,Quest> => <"нема ли да",[]>
} ; } ;
li = case o of { li = case o of {