diff --git a/src/macedonian/AdverbMkd.gf b/src/macedonian/AdverbMkd.gf index e41b07b0..d57af769 100644 --- a/src/macedonian/AdverbMkd.gf +++ b/src/macedonian/AdverbMkd.gf @@ -6,7 +6,7 @@ concrete AdverbMkd of Adverb = CatMkd ** open Prelude,ResMkd in { lin ComparAdvAdjS c a s = {s = c.s ++ a.s ! Indef ! GSg Masc ++ s.s} ; 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 SubjS s s2 = {s = s.s ++ s2.s} ; } diff --git a/src/macedonian/ExtendMkd.gf b/src/macedonian/ExtendMkd.gf index de76c13a..c3c6bce9 100644 --- a/src/macedonian/ExtendMkd.gf +++ b/src/macedonian/ExtendMkd.gf @@ -1,7 +1,21 @@ --# -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 + GenModNP num np cn = DetCN (DetQuant DefArt num) (PossNP cn np) ; + + EmptyRelSlash slash = RelSlash IdRP slash ; + CompoundN n1 n2 = let comp : Species => Number => Str = \\sp,n => case n1.relType of { @@ -23,6 +37,321 @@ lin 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 of { + => vp.noun_from_verb ; + => vp.noun_from_verb ++ BIND ++ "а" ; + => vp.noun_from_verb ++ BIND ++ "то" ; + => vp.noun_from_verb ++ BIND ++ "та" ; + => vp.noun_from_verb ++ BIND ++ "во" ; + => vp.noun_from_verb ++ BIND ++ "ва" ; + => vp.noun_from_verb ++ BIND ++ "но" ; + => 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 of { + => [] ; + => [] ; + _ => slash.c2.s ++ rnp.s ! agr ! RObj slash.c2.c + } ; + vtype = case of { + => VMedial Acc ; + => 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 ; youFem_Pron = mkPron "ти" "тебе" "те" "тебе" "ти" "тебе" "твој" "твојот" "твоја" "твојата" "твое" "твоето" "твои" "твоите" "ти" (GSg Fem) P2 ; weFem_Pron = we_Pron ; @@ -35,4 +364,3 @@ lin lin TPastSimple = {s = []} ** {t = VPastSimple} ; --# notpresent } - diff --git a/src/macedonian/MorphoMkd.gf b/src/macedonian/MorphoMkd.gf index be9bd351..af72a311 100644 --- a/src/macedonian/MorphoMkd.gf +++ b/src/macedonian/MorphoMkd.gf @@ -919,7 +919,7 @@ mkN028 base = } ; rel = \\_,_ => base_1 ; relType = Pref ; - g = Masc + g = Neuter }; _ => error "Can't apply paradigm mkN028" } ; diff --git a/src/macedonian/NumeralMkd.gf b/src/macedonian/NumeralMkd.gf index e8056a9a..554902c6 100644 --- a/src/macedonian/NumeralMkd.gf +++ b/src/macedonian/NumeralMkd.gf @@ -29,6 +29,10 @@ concrete NumeralMkd of Numeral = CatMkd [Numeral,Digits,Decimal] ** open Prelude lin PosDecimal ds = ds ** {hasDot = False} ; lincat Sub10 = {s : Str; hundred : 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} = \s,n -> {s = s; n = n} ; 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 pot110 = {s = "десет"; n = Pl} ; lin pot111 = {s = "единаесет"; n = Pl} ; + lin pot1to19 d = {s = d.teen; n = Pl} ; 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 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 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 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 => "милијарди"} ; } diff --git a/src/macedonian/ResMkd.gf b/src/macedonian/ResMkd.gf index 14647b8f..80222e08 100644 --- a/src/macedonian/ResMkd.gf +++ b/src/macedonian/ResMkd.gf @@ -319,9 +319,9 @@ mkClause : Str -> Agr -> Verb ** {compl : Agr => Str} -> Order => Tense => Anter Neg => "не" } ; fut = case of { - => <"ке",[]> ; + => <"ќе",[]> ; => <"нема да",[]> ; - => <"ке","ли"> ; + => <"ќе","ли"> ; => <"нема ли да",[]> } ; li = case o of {