diff --git a/next-lib/src/bulgarian/CatBul.gf b/next-lib/src/bulgarian/CatBul.gf index 6888dd511..c089bcbc1 100644 --- a/next-lib/src/bulgarian/CatBul.gf +++ b/next-lib/src/bulgarian/CatBul.gf @@ -1,9 +1,7 @@ -concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in { - flags coding=cp1251 ; - - - flags optimize=all_subs ; +concrete CatBul of Cat = CatSlavic with (ResSlavic = ResBul) ** open Prelude, (R = ParamX) in { + flags + coding=cp1251; optimize=all_subs; lincat @@ -44,7 +42,7 @@ concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in { QCl = {s : ResBul.Tense => Anteriority => Polarity => QForm => Str} ; IP = {s : Role => QForm => Str; gn : GenNum} ; IComp = {s : QForm => Str} ; - IDet = {s : DGender => QForm => Str; n : Number ; nonEmpty : Bool} ; + IDet = {s : Gender => Animacy => QForm => Str; n : Number ; nonEmpty : Bool} ; IQuant = {s : GenNum => QForm => Str} ; -- Relative @@ -73,10 +71,9 @@ concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in { -- Noun - CN = {s : NForm => Str; g : DGender} ; NP = {s : Role => Str; a : Agr} ; Pron = {s : Role => Str; gen : AForm => Str; a : Agr} ; - Det = {s : Bool => DGender => Role => Str; n : Number; countable : Bool; spec : Species} ; + Det = {s : Bool => Gender => Animacy => Role => Str; n : Number; countable : Bool; spec : Species} ; Predet = {s : GenNum => Str} ; Ord = {s : AForm => Str} ; Num = {s : DGenderSpecies => Str; n : Number; nonEmpty : Bool} ; @@ -106,9 +103,6 @@ concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in { A = {s : AForm => Str; adv : Str} ; A2 = {s : AForm => Str; adv : Str; c2 : Str} ; - N = {s : NForm => Str; g : DGender} ; - N2 = {s : NForm => Str; g : DGender} ** {c2 : Preposition} ; - N3 = {s : NForm => Str; g : DGender} ** {c2,c3 : Preposition} ; PN = {s : Str; g : Gender} ; diff --git a/next-lib/src/bulgarian/ConjunctionBul.gf b/next-lib/src/bulgarian/ConjunctionBul.gf index 23664cd1f..8a1523a02 100644 --- a/next-lib/src/bulgarian/ConjunctionBul.gf +++ b/next-lib/src/bulgarian/ConjunctionBul.gf @@ -16,7 +16,7 @@ concrete ConjunctionBul of Conjunction = ConjNP conj ss = { s = \\role => (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj!role; - a = {gn = conjGenNum (gennum DMasc conj.n) ss.a.gn; p = ss.a.p} + a = {gn = conjGenNum (gennum Masc conj.n) ss.a.gn; p = ss.a.p} } ; ConjAP conj ss = { diff --git a/next-lib/src/bulgarian/DiffBul.gf b/next-lib/src/bulgarian/DiffBul.gf new file mode 100644 index 000000000..6d94154a5 --- /dev/null +++ b/next-lib/src/bulgarian/DiffBul.gf @@ -0,0 +1,15 @@ +instance DiffBul of DiffSlavic = open CommonSlavic, Prelude in { + + param + Case = Acc | Dat ; + + Species = Indef | Def ; + + NForm = + NF Number Species + | NFSgDefNom + | NFPlCount + | NFVocative + ; + +} \ No newline at end of file diff --git a/next-lib/src/bulgarian/LangBul.gf b/next-lib/src/bulgarian/LangBul.gf index d92b2533a..f0a0bd4f0 100644 --- a/next-lib/src/bulgarian/LangBul.gf +++ b/next-lib/src/bulgarian/LangBul.gf @@ -1,4 +1,4 @@ ---# -path=.:../abstract:../common:src/prelude +--# -path=.:../abstract:../common:../slavic concrete LangBul of Lang = GrammarBul, diff --git a/next-lib/src/bulgarian/MorphoBul.gf b/next-lib/src/bulgarian/MorphoBul.gf index f59d783c8..b2359fac2 100644 --- a/next-lib/src/bulgarian/MorphoBul.gf +++ b/next-lib/src/bulgarian/MorphoBul.gf @@ -21,10 +21,10 @@ resource MorphoBul = ResBul ** open oper --2 Determiners - mkDeterminerSg : Str -> Str -> Str -> {s : Bool => DGender => Role => Str; n : Number; countable : Bool ; spec : Species} = \vseki,vsiaka,vsiako -> - {s = \\_,g,_ => table DGender [vseki;vseki;vsiaka;vsiako] ! g; n = Sg; countable = False; spec = Indef} ; - mkDeterminerPl : Str -> {s : Bool => DGender => Role => Str ; n : Number; countable : Bool ; spec : Species} = \vsicki -> - {s = \\_,_,_ => vsicki; sp = \\_,_ => vsicki; n = Pl; countable = False; spec = Indef} ; + mkDeterminerSg : Str -> Str -> Str -> {s : Bool => Gender => Animacy => Role => Str; n : Number; countable : Bool ; spec : Species} = \vseki,vsiaka,vsiako -> + {s = \\_,g,_,_ => table Gender [vseki;vsiaka;vsiako] ! g; n = Sg; countable = False; spec = Indef} ; + mkDeterminerPl : Str -> {s : Bool => Gender => Animacy => Role => Str ; n : Number; countable : Bool ; spec : Species} = \vsicki -> + {s = \\_,_,_,_ => vsicki; sp = \\_,_ => vsicki; n = Pl; countable = False; spec = Indef} ; mkQuant : Str -> Str -> Str -> Str -> {s : Bool => AForm => Str; nonEmpty : Bool; spec : Species} = \tozi,tazi,towa,tezi -> { s = \\_ => table { @@ -105,7 +105,7 @@ oper --2 Nouns - mkNoun : Str -> Str -> Str -> Str -> DGender -> N = \sg,pl,count,voc,g -> { + mkNoun : Str -> Str -> Str -> Str -> Gender -> Animacy -> N = \sg,pl,count,voc,g,anim -> { s = table { NF Sg Indef => sg ; NF Sg Def => case sg of { @@ -154,6 +154,7 @@ oper NFVocative => voc } ; g = g ; + anim = anim ; lock_N = <> } ; diff --git a/next-lib/src/bulgarian/MorphoFunsBul.gf b/next-lib/src/bulgarian/MorphoFunsBul.gf index 678479d8e..04962bdac 100644 --- a/next-lib/src/bulgarian/MorphoFunsBul.gf +++ b/next-lib/src/bulgarian/MorphoFunsBul.gf @@ -142,7 +142,7 @@ oper -- prepN2 : N -> Prep -> N2 ; - prepN2 n p = {s = n.s; g = n.g; c2 = p; lock_N2 = <>} ; + prepN2 n p = {s = n.s; g = n.g; anim=n.anim ; c2 = p; lock_N2 = <>} ; dirN2 : N -> N2 ; dirN2 n = prepN2 n noPrep ; @@ -152,7 +152,7 @@ oper -- prepN3 : N -> Prep -> Prep -> N3 ; - prepN3 n p q = {s = n.s; g = n.g; c2 = p; c3 = q; lock_N3 = <>} ; + prepN3 n p q = {s = n.s; g = n.g; anim=n.anim ; c2 = p; c3 = q; lock_N3 = <>} ; dirN3 : N -> Prep -> N3 ; dirN3 n p = prepN3 n noPrep p ; @@ -160,6 +160,13 @@ oper dirdirN3 : N -> N3 ; dirdirN3 n = dirN3 n noPrep ; + compoundN = overload { + compoundN : Str -> N -> N + = \s,n -> {s = \\nform => s ++ n.s ! nform ; g=n.g ; anim=n.anim ; lock_N = <>} ; + compoundN : N -> Str -> N + = \n,s -> {s = \\nform => s ++ n.s ! nform ; g=n.g ; anim=n.anim ; lock_N = <>} ; + } ; + --2 Prepositions -- diff --git a/next-lib/src/bulgarian/NounBul.gf b/next-lib/src/bulgarian/NounBul.gf index e9206e443..89aa34e69 100644 --- a/next-lib/src/bulgarian/NounBul.gf +++ b/next-lib/src/bulgarian/NounBul.gf @@ -22,7 +22,7 @@ concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { } } } ; - s = det.s ! True ! cn.g ! role ++ cn.s ! nf + s = det.s ! True ! cn.g ! cn.anim ! role ++ cn.s ! nf in case role of { RObj Dat => "на" ++ s; _ => s @@ -31,12 +31,12 @@ concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { } ; DetNP det = - { s = \\role => let s = det.s ! False ! DNeut ! role + { s = \\role => let s = det.s ! False ! Neut ! Inanimate ! role in case role of { RObj Dat => "на" ++ s; _ => s } ; - a = {gn = gennum DNeut det.n; p = P3} ; + a = {gn = gennum Neut det.n; p = P3} ; } ; UsePN pn = { s = table { @@ -63,19 +63,19 @@ concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { } ; DetQuant quant num = { - s = \\sp,g,c => let sp' = case num.nonEmpty of { True => True ; - False => sp } - in quant.s ! sp' ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++ - num.s ! dgenderSpecies g quant.spec c ; + s = \\sp,g,anim,c => let sp' = case num.nonEmpty of { True => True ; + False => sp } + in quant.s ! sp' ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++ + num.s ! dgenderSpecies g anim quant.spec c ; n = num.n ; countable = num.nonEmpty ; spec = case num.nonEmpty of {True=>Indef; _=>quant.spec} } ; DetQuantOrd = \quant, num, ord -> { - s = \\_,g,c => quant.s ! True ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++ - num.s ! dgenderSpecies g quant.spec c ++ - ord.s ! aform (gennum g num.n) (case num.nonEmpty of {True=>Indef; _=>quant.spec}) c ; + s = \\_,g,anim,c => quant.s ! True ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++ + num.s ! dgenderSpecies g anim quant.spec c ++ + ord.s ! aform (gennum g num.n) (case num.nonEmpty of {True=>Indef; _=>quant.spec}) c ; n = num.n ; countable = num.nonEmpty ; spec=Indef @@ -144,11 +144,21 @@ concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { UseN noun = noun ; UseN2 noun = noun ; - ComplN2 f x = {s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c; g=f.g} ; - ComplN3 f x = {s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c; c2 = f.c3; g=f.g} ; + ComplN2 f x = { + s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c ; + g=f.g ; + anim = f.anim + } ; - Use2N3 f = {s = f.s ; g=f.g ; c2 = f.c2} ; - Use3N3 f = {s = f.s ; g=f.g ; c2 = f.c3} ; + ComplN3 f x = { + s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c ; + c2 = f.c3 ; + g=f.g ; + anim = f.anim + } ; + + Use2N3 f = {s = f.s ; g=f.g ; anim=f.anim ; c2 = f.c2} ; + Use3N3 f = {s = f.s ; g=f.g ; anim=f.anim ; c2 = f.c3} ; AdjCN ap cn = { @@ -156,20 +166,27 @@ concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { True => (ap.s ! nform2aform nf cn.g) ++ (cn.s ! (indefNForm nf)) ; False => (cn.s ! nf) ++ (ap.s ! nform2aform (indefNForm nf) cn.g) } ; - g = cn.g + g = cn.g ; + anim = cn.anim } ; RelCN cn rs = { s = \\nf => cn.s ! nf ++ rs.s ! {gn=gennum cn.g (numNForm nf); p=P3} ; - g = cn.g + g = cn.g ; + anim = cn.anim } ; AdvCN cn ad = { s = \\nf => cn.s ! nf ++ ad.s ; - g = cn.g + g = cn.g ; + anim = cn.anim } ; - SentCN cn sc = {s = \\nf => cn.s ! nf ++ sc.s; g=DNeut} ; + SentCN cn sc = {s = \\nf => cn.s ! nf ++ sc.s; g=Neut; anim=Inanimate} ; - ApposCN cn np = {s = \\nf => cn.s ! nf ++ np.s ! RSubj; g=cn.g} ; + ApposCN cn np = { + s = \\nf => cn.s ! nf ++ np.s ! RSubj; + g=cn.g ; + anim = cn.anim + } ; RelNP np rs = { s = \\r => np.s ! r ++ rs.s ! np.a ; diff --git a/next-lib/src/bulgarian/ParadigmsBul.gf b/next-lib/src/bulgarian/ParadigmsBul.gf index a22cc6fe9..d1635f295 100644 --- a/next-lib/src/bulgarian/ParadigmsBul.gf +++ b/next-lib/src/bulgarian/ParadigmsBul.gf @@ -13,7 +13,8 @@ oper (v0+"ове") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN002 : Str -> N ; mkN002 base = let v0 = tk 2 base; v1 = last (base) @@ -21,7 +22,8 @@ oper (v0+"е"+v1+"ове") (v0+"я"+v1+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN002a : Str -> N ; mkN002a base = let v0 = tk 2 base; v1 = last (base) @@ -29,7 +31,8 @@ oper (v0+"е"+v1+"ове") (v0+"я"+v1+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN003 : Str -> N ; mkN003 base = let v0 = tk 3 base; v1 = last (base) @@ -37,49 +40,56 @@ oper (v0+"ър"+v1+"ове") (v0+"ър"+v1+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN004 : Str -> N ; mkN004 base = let v0 = tk 4 base in mkNoun (v0+"ятър") (v0+"етрове") (v0+"ятъра") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN005 : Str -> N ; mkN005 base = let v0 = base in mkNoun (v0) (v0+"ове") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN006 : Str -> N ; mkN006 base = let v0 = base in mkNoun (v0) (v0+"ове") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN007 : Str -> N ; mkN007 base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN007b : Str -> N ; mkN007b base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"а") (v0+"о") - DMasc ; + Masc + Inanimate ; mkN007a : Str -> N ; mkN007a base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"а") (v0+"е") - DMascPersonal ; + Masc + Animate ; mkN008 : Str -> N ; mkN008 base = let v0 = tk 2 base; v1 = last (base) @@ -87,14 +97,16 @@ oper (v0+v1+"и") (v0+"е"+v1+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN008a : Str -> N ; mkN008a base = let v0 = tk 2 base in mkNoun (v0+"ец") (v0+"ци") (v0+"-") (v0+"ецо") - DMasc ; + Masc + Inanimate ; mkN009 : Str -> N ; mkN009 base = let v0 = tk 2 base; v1 = last (base) @@ -102,84 +114,96 @@ oper (v0+v1+"и") (v0+"ъ"+v1+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN009a : Str -> N ; mkN009a base = let v0 = tk 2 base in mkNoun (v0+"ър") (v0+"рове") (v0+"ъра") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN010 : Str -> N ; mkN010 base = let v0 = tk 2 base in mkNoun (v0+"ър") (v0+"ри") (v0+"ра") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN011 : Str -> N ; mkN011 base = let v0 = tk 2 base in mkNoun (v0+"ъм") (v0+"ми") (v0+"ъма") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN012 : Str -> N ; mkN012 base = let v0 = tk 3 base in mkNoun (v0+"рък") (v0+"ърци") (v0+"-") (v0+"ърко") - DMasc ; + Masc + Inanimate ; mkN013 : Str -> N ; mkN013 base = let v0 = tk 2 base in mkNoun (v0+"ец") (v0+"йци") (v0+"-") (v0+"ецо") - DMasc ; + Masc + Inanimate ; mkN014 : Str -> N ; mkN014 base = let v0 = tk 1 base in mkNoun (v0+"к") (v0+"ци") (v0+"ка") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN014a : Str -> N ; mkN014a base = let v0 = tk 1 base in mkNoun (v0+"к") (v0+"ци") (v0+"ка") (v0+"ко") - DMasc ; + Masc + Inanimate ; mkN015 : Str -> N ; mkN015 base = let v0 = tk 1 base in mkNoun (v0+"г") (v0+"зи") (v0+"га") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN016 : Str -> N ; mkN016 base = let v0 = tk 1 base in mkNoun (v0+"х") (v0+"си") (v0+"ха") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN017 : Str -> N ; mkN017 base = let v0 = tk 1 base in mkNoun (v0+"к") (v0+"ни") (v0+"ка") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN018 : Str -> N ; mkN018 base = let v0 = tk 2 base in mkNoun (v0+"ин") (v0+"и") (v0+"-") (v0+"ино") - DMasc ; + Masc + Inanimate ; mkN018a : Str -> N ; mkN018a base = let v0 = tk 2 base; v1 = last (base) @@ -187,21 +211,24 @@ oper (v0+"и") (v0+"-") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN019 : Str -> N ; mkN019 base = let v0 = tk 2 base in mkNoun (v0+"ък") (v0+"ци") (v0+"-") (v0+"ко") - DMasc ; + Masc + Inanimate ; mkN019a : Str -> N ; mkN019a base = let v0 = tk 2 base in mkNoun (v0+"ек") (v0+"йци") (v0+"ека") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN020 : Str -> N ; mkN020 base = let v0 = tk 3 base; v1 = last (tk 2 base) @@ -209,217 +236,248 @@ oper (v0+"ъ"+v1+"ци") (v0+"-") (v0+v1+"ецо") - DMasc ; + Masc + Inanimate ; mkN021 : Str -> N ; mkN021 base = let v0 = tk 3 base in mkNoun (v0+"чин") (v0+"ци") (v0+"-") (v0+"чино") - DMasc ; + Masc + Inanimate ; mkN022 : Str -> N ; mkN022 base = let v0 = base in mkNoun (v0) (v0+"а") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN023 : Str -> N ; mkN023 base = let v0 = tk 2 base in mkNoun (v0+"ин") (v0+"а") (v0+"-") (v0+"ине") - DMasc ; + Masc + Inanimate ; mkN024a : Str -> N ; mkN024a base = let v0 = tk 1 base in mkNoun (v0+"з") (v0+"зе") (v0+"-") (v0+"же") - DMasc ; + Masc + Inanimate ; mkN024 : Str -> N ; mkN024 base = let v0 = base in mkNoun (v0) (v0+"е") (v0+"е") (v0+"о") - DMascPersonal ; + Masc + Animate ; mkN025 : Str -> N ; mkN025 base = let v0 = base in mkNoun (v0) (v0+"я") (v0+"-") (v0+"е") - DMascPersonal ; + Masc + Animate ; mkN026 : Str -> N ; mkN026 base = let v0 = base in mkNoun (v0) (v0+"илища") (v0+"а") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN027 : Str -> N ; mkN027 base = let v0 = tk 2 base in mkNoun (v0+"ец") (v0+"овце") (v0+"еца") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN028 : Str -> N ; mkN028 base = let v0 = tk 1 base in mkNoun (v0+"й") (v0+"еве") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN028a : Str -> N ; mkN028a base = let v0 = tk 1 base in mkNoun (v0+"й") (v0+"йове") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN029 : Str -> N ; mkN029 base = let v0 = base in mkNoun (v0) (v0+"ьове") (v0+"-") (v0+"ко") - DMasc ; + Masc + Inanimate ; mkN030 : Str -> N ; mkN030 base = let v0 = tk 2 base in mkNoun (v0+"ън") (v0+"ньове") (v0+"ъня") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN031 : Str -> N ; mkN031 base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN031a : Str -> N ; mkN031a base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"я") (v0+"ю") - DMascPersonal ; + Masc + Animate ; mkN032 : Str -> N ; mkN032 base = let v0 = tk 1 base in mkNoun (v0+"й") (v0+"и") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN032a : Str -> N ; mkN032a base = let v0 = tk 1 base in mkNoun (v0+"й") (v0+"и") (v0+"я") (v0+"ю") - DMascPersonal ; + Masc + Animate ; mkN033 : Str -> N ; mkN033 base = let v0 = tk 2 base in mkNoun (v0+"ен") (v0+"ни") (v0+"ена") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN034 : Str -> N ; mkN034 base = let v0 = tk 2 base in mkNoun (v0+"ът") (v0+"ти") (v0+"ътя") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN035 : Str -> N ; mkN035 base = let v0 = base in mkNoun (v0) (v0+"е") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN035a : Str -> N ; mkN035a base = let v0 = base in mkNoun (v0) (v0+"е") (v0+"я") (v0+"ю") - DMascPersonal ; + Masc + Animate ; mkN036 : Str -> N ; mkN036 base = let v0 = tk 1 base in mkNoun (v0+"й") (v0+"ища") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN037 : Str -> N ; mkN037 base = let v0 = base in mkNoun (v0) (v0+"ища") (v0+"я") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN038 : Str -> N ; mkN038 base = let v0 = tk 1 base in mkNoun (v0+"а") (v0+"и") (v0+"-") (v0+"а") - DMascPersonal ; + Masc + Animate ; mkN039 : Str -> N ; mkN039 base = let v0 = tk 1 base in mkNoun (v0+"я") (v0+"и") (v0+"-") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN040 : Str -> N ; mkN040 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"овци") (v0+"-") (v0+"о") - DMasc ; + Masc + Inanimate ; mkN040a : Str -> N ; mkN040a base = let v0 = base in mkNoun (v0) (v0+"-") (v0+"-") (v0+"-") - DMasc ; + Masc + Inanimate ; mkN041 : Str -> N ; mkN041 base = let v0 = tk 1 base in mkNoun (v0+"а") (v0+"и") (v0+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN041a : Str -> N ; mkN041a base = let v0 = tk 1 base in mkNoun (v0+"а") (v0+"и") (v0+"и") (v0+"о") - DFem ; + Fem + Inanimate ; mkN041b : Str -> N ; mkN041b base = let v0 = tk 1 base in mkNoun (v0+"а") (v0+"и") (v0+"и") (v0+"е") - DFem ; + Fem + Inanimate ; mkN042 : Str -> N ; mkN042 base = let v0 = base in mkNoun (v0) (v0) (v0) (v0+"-") - DFem ; + Fem + Inanimate ; mkN043 : Str -> N ; mkN043 base = let v0 = tk 3 base; v1 = last (tk 1 base) @@ -427,7 +485,8 @@ oper (v0+"е"+v1+"и") (v0+"е"+v1+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN043a : Str -> N ; mkN043a base = let v0 = tk 4 base; v1 = last (tk 2 base) @@ -435,56 +494,64 @@ oper (v0+"е"+v1+"ки") (v0+"е"+v1+"ки") (v0+"-") - DFem ; + Fem + Inanimate ; mkN044 : Str -> N ; mkN044 base = let v0 = tk 1 base in mkNoun (v0+"а") (v0+"е") (v0+"е") (v0+"-") - DFem ; + Fem + Inanimate ; mkN045 : Str -> N ; mkN045 base = let v0 = tk 2 base in mkNoun (v0+"ка") (v0+"це") (v0+"це") (v0+"-") - DFem ; + Fem + Inanimate ; mkN046 : Str -> N ; mkN046 base = let v0 = tk 2 base in mkNoun (v0+"га") (v0+"зе") (v0+"зе") (v0+"-") - DFem ; + Fem + Inanimate ; mkN047 : Str -> N ; mkN047 base = let v0 = tk 1 base in mkNoun (v0+"я") (v0+"и") (v0+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN048 : Str -> N ; mkN048 base = let v0 = tk 1 base in mkNoun (v0+"я") (v0+"е") (v0+"е") (v0+"ьо") - DFem ; + Fem + Inanimate ; mkN049 : Str -> N ; mkN049 base = let v0 = base in mkNoun (v0) (v0+"и") (v0+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN050 : Str -> N ; mkN050 base = let v0 = tk 2 base in mkNoun (v0+"ен") (v0+"ни") (v0+"ни") (v0+"-") - DFem ; + Fem + Inanimate ; mkN051 : Str -> N ; mkN051 base = let v0 = tk 2 base; v1 = last (base) @@ -492,21 +559,24 @@ oper (v0+v1+"и") (v0+v1+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN052 : Str -> N ; mkN052 base = let v0 = tk 5 base in mkNoun (v0+"ялост") (v0+"ялости") (v0+"ялости") (v0+"-") - DFem ; + Fem + Inanimate ; mkN052a : Str -> N ; mkN052a base = let v0 = tk 6 base in mkNoun (v0+"ярност") (v0+"ярности") (v0+"ярности") (v0+"-") - DFem ; + Fem + Inanimate ; mkN053 : Str -> N ; mkN053 base = let v0 = tk 3 base; v1 = last (base) @@ -514,28 +584,32 @@ oper (v0+"ър"+v1+"и") (v0+"ър"+v1+"и") (v0+"-") - DFem ; + Fem + Inanimate ; mkN054 : Str -> N ; mkN054 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"а") (v0+"а") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN055 : Str -> N ; mkN055 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"а") (v0+"а") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN056 : Str -> N ; mkN056 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"а") (v0+"а") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN057 : Str -> N ; mkN057 base = let v0 = tk 3 base; v1 = last (tk 1 base) @@ -543,140 +617,160 @@ oper (v0+"е"+v1+"а") (v0+"е"+v1+"а") (v0+"я"+v1+"о") - DNeut ; + Neut + Inanimate ; mkN057a : Str -> N ; mkN057a base = let v0 = tk 4 base in mkNoun (v0+"ясто") (v0+"еста") (v0+"еста") (v0+"ясто") - DNeut ; + Neut + Inanimate ; mkN058 : Str -> N ; mkN058 base = let v0 = tk 3 base in mkNoun (v0+"яно") (v0+"ена") (v0+"ена") (v0+"яно") - DNeut ; + Neut + Inanimate ; mkN059 : Str -> N ; mkN059 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"ене") (v0+"ене") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN060 : Str -> N ; mkN060 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"еса") (v0+"еса") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN061 : Str -> N ; mkN061 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"а") (v0+"а") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN062 : Str -> N ; mkN062 base = let v0 = tk 1 base in mkNoun (v0+"о") (v0+"и") (v0+"и") (v0+"о") - DNeut ; + Neut + Inanimate ; mkN063 : Str -> N ; mkN063 base = let v0 = tk 2 base in mkNoun (v0+"ко") (v0+"чи") (v0+"чи") (v0+"ко") - DNeut ; + Neut + Inanimate ; mkN064 : Str -> N ; mkN064 base = let v0 = tk 2 base in mkNoun (v0+"хо") (v0+"ши") (v0+"ши") (v0+"хо") - DNeut ; + Neut + Inanimate ; mkN065 : Str -> N ; mkN065 base = let v0 = base in mkNoun (v0) (v0+"та") (v0+"та") (v0) - DNeut ; + Neut + Inanimate ; mkN066 : Str -> N ; mkN066 base = let v0 = tk 1 base in mkNoun (v0+"е") (v0+"а") (v0+"а") (v0+"е") - DNeut ; + Neut + Inanimate ; mkN067 : Str -> N ; mkN067 base = let v0 = tk 2 base in mkNoun (v0+"те") (v0+"ца") (v0+"ца") (v0+"те") - DNeut ; + Neut + Inanimate ; mkN068 : Str -> N ; mkN068 base = let v0 = tk 1 base in mkNoun (v0+"е") (v0+"я") (v0+"я") (v0+"е") - DNeut ; + Neut + Inanimate ; mkN069 : Str -> N ; mkN069 base = let v0 = base in mkNoun (v0) (v0+"на") (v0+"на") (v0) - DNeut ; + Neut + Inanimate ; mkN070 : Str -> N ; mkN070 base = let v0 = base in mkNoun (v0) (v0+"са") (v0+"са") (v0) - DNeut ; + Neut + Inanimate ; mkN071 : Str -> N ; mkN071 base = let v0 = tk 1 base in mkNoun (v0+"е") (v0+"ия") (v0+"ия") (v0+"е") - DNeut ; + Neut + Inanimate ; mkN072 : Str -> N ; mkN072 base = let v0 = tk 1 base in mkNoun (v0+"е") (v0+"я") (v0+"я") (v0+"е") - DNeut ; + Neut + Inanimate ; mkN073 : Str -> N ; mkN073 base = let v0 = base in mkNoun (v0) (v0+"та") (v0+"та") (v0) - DNeut ; + Neut + Inanimate ; mkN074 : Str -> N ; mkN074 base = let v0 = tk 1 base in mkNoun (v0+"-") (v0) (v0) (v0+"-") - DNeut ; + Neut + Inanimate ; mkN075 : Str -> N ; mkN075 base = let v0 = tk 1 base in mkNoun (v0+"-") (v0) (v0) (v0+"-") - DNeut ; + Neut + Inanimate ; mkA076 : Str -> A ; mkA076 base = let v0 = base in mkAdjective (v0) diff --git a/next-lib/src/bulgarian/QuestionBul.gf b/next-lib/src/bulgarian/QuestionBul.gf index 9a02bf333..33781a46b 100644 --- a/next-lib/src/bulgarian/QuestionBul.gf +++ b/next-lib/src/bulgarian/QuestionBul.gf @@ -41,20 +41,20 @@ concrete QuestionBul of Question = CatBul ** open ResBul, Prelude in { IdetCN idet cn = { s = \\_,qform => let nf = case of { => NFPlCount ; - _ => NF idet.n Indef + _ => NF idet.n Indef } - in idet.s ! cn.g ! qform ++ cn.s ! nf ; + in idet.s ! cn.g ! cn.anim ! qform ++ cn.s ! nf ; gn = gennum cn.g idet.n } ; IdetIP idet = { - s = \\_ => idet.s ! DNeut ; - gn = gennum DNeut idet.n + s = \\_ => idet.s ! Neut ! Inanimate ; + gn = gennum Neut idet.n } ; IdetQuant iquant num = { - s = \\g,qform => iquant.s ! gennum g num.n ! qform ++ - num.s ! dgenderSpecies g Indef RSubj ; + s = \\g,anim,qform => iquant.s ! gennum g num.n ! qform ++ + num.s ! dgenderSpecies g anim Indef RSubj ; n = num.n ; nonEmpty = num.nonEmpty } ; diff --git a/next-lib/src/bulgarian/ResBul.gf b/next-lib/src/bulgarian/ResBul.gf index 3e18065d9..263a8dbb2 100644 --- a/next-lib/src/bulgarian/ResBul.gf +++ b/next-lib/src/bulgarian/ResBul.gf @@ -7,11 +7,11 @@ -- implement $Test$, it moreover contains regular lexical -- patterns needed for $Lex$. -resource ResBul = ParamX ** open Prelude in { - flags coding=cp1251 ; +instance ResBul of ResSlavic = ParamX, DiffBul, CommonSlavic ** open Prelude in { + flags + coding=cp1251 ; optimize=all ; - flags optimize=all ; -- Some parameters, such as $Number$, are inherited from $ParamX$. @@ -21,14 +21,6 @@ resource ResBul = ParamX ** open Prelude in { param Role = RSubj | RObj Case | RVoc ; - Case = Acc | Dat; - - NForm = - NF Number Species - | NFSgDefNom - | NFPlCount - | NFVocative - ; GenNum = GSg Gender | GPl ; @@ -37,11 +29,7 @@ resource ResBul = ParamX ** open Prelude in { oper Agr = {gn : GenNum ; p : Person} ; - param - Gender = Masc | Fem | Neut ; - - Species = Indef | Def ; - + param -- The plural never makes a gender distinction. --2 For $Verb$ @@ -79,13 +67,6 @@ resource ResBul = ParamX ** open Prelude in { ; --2 For $Numeral$ - - DGender = - DMasc - | DMascPersonal - | DFem - | DNeut - ; DGenderSpecies = DMascIndef @@ -120,14 +101,9 @@ resource ResBul = ParamX ** open Prelude in { p = conjPerson a.p b.p } ; - gennum : DGender -> Number -> GenNum = \g,n -> + gennum : Gender -> Number -> GenNum = \g,n -> case n of { - Sg => GSg (case g of { - DMasc => Masc ; - DMascPersonal => Masc ; - DFem => Fem ; - DNeut => Neut - }) ; + Sg => GSg g ; Pl => GPl } ; @@ -146,25 +122,30 @@ resource ResBul = ParamX ** open Prelude in { GPl => APl spec } ; - dgenderSpecies : DGender -> Species -> Role -> DGenderSpecies = - \g,spec,role -> case of { - => DMascIndef ; - => case role of { - RSubj => DMascDefNom ; - _ => DMascDef - } ; - => DMascPersonalIndef ; - => case role of { - RSubj => DMascPersonalDefNom ; - _ => DMascPersonalDef - } ; - => DFemIndef ; - => DFemDef ; - => DNeutIndef ; - => DNeutDef + dgenderSpecies : Gender -> Animacy -> Species -> Role -> DGenderSpecies = + \g,anim,spec,role -> + case of { + => case anim of { + Inanimate => DMascIndef ; + Animate => DMascPersonalIndef + } ; + => case anim of { + Inanimate => case role of { + RSubj => DMascDefNom ; + _ => DMascDef + } ; + Animate => case role of { + RSubj => DMascPersonalDefNom ; + _ => DMascPersonalDef + } + } ; + => DFemIndef ; + => DFemDef ; + => DNeutIndef ; + => DNeutDef } ; - nform2aform : NForm -> DGender -> AForm + nform2aform : NForm -> Gender -> AForm = \nf,g -> case nf of { NF n spec => aform (gennum g n) spec (RObj Acc) ; NFSgDefNom => aform (gennum g Sg) Def RSubj ; diff --git a/next-lib/src/bulgarian/SentenceBul.gf b/next-lib/src/bulgarian/SentenceBul.gf index 9966b538d..7c4ae219f 100644 --- a/next-lib/src/bulgarian/SentenceBul.gf +++ b/next-lib/src/bulgarian/SentenceBul.gf @@ -68,5 +68,5 @@ concrete SentenceBul of Sentence = CatBul ** open Prelude, ResBul in { AdvS a s = {s = a.s ++ "," ++ s.s} ; - RelS s r = {s = s.s ++ "," ++ r.s ! {gn=gennum DNeut Sg; p=P3}} ; + RelS s r = {s = s.s ++ "," ++ r.s ! {gn=gennum Neut Sg; p=P3}} ; } diff --git a/next-lib/src/bulgarian/StructuralBul.gf b/next-lib/src/bulgarian/StructuralBul.gf index 4ff725d26..b01b4e6f4 100644 --- a/next-lib/src/bulgarian/StructuralBul.gf +++ b/next-lib/src/bulgarian/StructuralBul.gf @@ -28,7 +28,7 @@ concrete StructuralBul of Structural = CatBul ** every_Det = mkDeterminerSg "всеки" "всяка" "всяко"; everything_NP = mkNP "всичко" (GSg Neut) P3 ; everywhere_Adv = ss "навсякъде" ; - few_Det = {s = \\_,_,_ => "няколко"; n = Pl; countable = True; spec = Indef} ; + few_Det = {s = \\_,_,_,_ => "няколко"; n = Pl; countable = True; spec = Indef} ; --- first_Ord = ss "first" ; DEPRECATED for_Prep = mkPrep "за" Acc ; from_Prep = mkPrep "от" Acc ; @@ -37,7 +37,7 @@ concrete StructuralBul of Structural = CatBul ** here7to_Adv = ss ["до тук"] ; here7from_Adv = ss ["от тук"] ; how_IAdv = mkIAdv "как" ; - how8many_IDet = {s = \\_ => table QForm ["колко";"колкото"]; n = Pl; nonEmpty = False} ; + how8many_IDet = {s = \\_,_ => table QForm ["колко";"колкото"]; n = Pl; nonEmpty = False} ; if_Subj = ss "ако" ; in8front_Prep = mkPrep "пред" Acc ; i_Pron = mkPron "аз" "мен" "ми" "мой" "моя" "моят" "моя" "моята" "мое" "моето" "мои" "моите" (GSg Masc) P1 ; diff --git a/next-lib/src/russian/CatRus.gf b/next-lib/src/russian/CatRus.gf index 8b364388e..97c7522ee 100644 --- a/next-lib/src/russian/CatRus.gf +++ b/next-lib/src/russian/CatRus.gf @@ -1,6 +1,6 @@ --# -path=.:../abstract:../common:../../prelude -concrete CatRus of Cat = CommonX ** open ResRus, Prelude in { +concrete CatRus of Cat = CommonX ** CatSlavic with (ResSlavic = ResRus) ** open ResRus, Prelude, (R = ParamX) in { flags optimize=all_subs ; coding=utf8 ; @@ -44,7 +44,6 @@ concrete CatRus of Cat = CommonX ** open ResRus, Prelude in { -- Noun - CN = {s : NForm => Str; g : Gender; anim : Animacy} ; NP = { s : PronForm => Str ; n : Number ; p : Person ; g: PronGen ; anim : Animacy ; pron: Bool} ; Pron = { s : PronForm => Str ; n : Number ; p : Person ; @@ -89,9 +88,6 @@ concrete CatRus of Cat = CommonX ** open ResRus, Prelude in { A2 = A ** Complement ; -- Substantives moreover have an inherent gender. - N = {s : NForm => Str; g : Gender; anim : Animacy} ; - N2 = {s : NForm => Str; g : Gender; anim : Animacy} ** Complement ; - N3 = {s : NForm => Str; g : Gender; anim : Animacy} ** Complement ** {s3 : Str; c2: Case} ; PN = {s : Case => Str ; g : Gender ; anim : Animacy} ; diff --git a/next-lib/src/russian/DiffRus.gf b/next-lib/src/russian/DiffRus.gf new file mode 100644 index 000000000..a29690e86 --- /dev/null +++ b/next-lib/src/russian/DiffRus.gf @@ -0,0 +1,9 @@ +instance DiffRus of DiffSlavic = open CommonSlavic, Prelude in { + + param + PrepKind = PrepOther | PrepVNa; + Case = Nom | Gen | Dat | Acc | Inst | Prepos PrepKind ; + + NForm = NF Number Case ; + +} \ No newline at end of file diff --git a/next-lib/src/russian/LangRus.gf b/next-lib/src/russian/LangRus.gf index c3126dcfe..00a515c58 100644 --- a/next-lib/src/russian/LangRus.gf +++ b/next-lib/src/russian/LangRus.gf @@ -1,4 +1,4 @@ ---# -path=.:../abstract:../common:prelude +--# -path=.:../abstract:../common:../slavic:prelude concrete LangRus of Lang = GrammarRus, diff --git a/next-lib/src/russian/NounRus.gf b/next-lib/src/russian/NounRus.gf index 834f140c1..2e86d33ab 100644 --- a/next-lib/src/russian/NounRus.gf +++ b/next-lib/src/russian/NounRus.gf @@ -166,8 +166,8 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { ComplN2 f x = { s = \\nf => case x.pron of { True => x.s ! (case nf of {NF n c => mkPronForm c No (Poss (gNum f.g n))}) ++ f.s ! nf ; - False => f.s ! nf ++ f.s2 ++ - x.s ! (case nf of {NF n c => mkPronForm f.c Yes (Poss (gNum f.g n))}) + False => f.s ! nf ++ f.c2.s ++ + x.s ! (case nf of {NF n c => mkPronForm f.c2.c Yes (Poss (gNum f.g n))}) }; g = f.g ; anim = f.anim @@ -177,11 +177,10 @@ concrete NounRus of Noun = CatRus ** open ResRus, Prelude, MorphoRus in { -- There application starts by filling the first place. ComplN3 f x = { - s = \\nf => f.s ! nf ++ f.s2 ++ x.s ! (PF f.c Yes NonPoss) ; + s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! (PF f.c2.c Yes NonPoss) ; g = f.g ; anim = f.anim ; - s2 = f.s3 ; - c = f.c2 + c2 = f.c3 ; } ; diff --git a/next-lib/src/russian/ParadigmsRus.gf b/next-lib/src/russian/ParadigmsRus.gf index 677a92639..17171cfdf 100644 --- a/next-lib/src/russian/ParadigmsRus.gf +++ b/next-lib/src/russian/ParadigmsRus.gf @@ -352,11 +352,11 @@ foreign = Foreign; -- +++ MG_UR: added +++ mkN2 : N -> Prep -> N2 = mkFun; } ; - mkFun : N -> Prep -> N2 = \f,p -> (UseN f) ** {s2 = p.s ; c = p.c}** {lock_N2 = <>} ; + mkFun : N -> Prep -> N2 = \f,p -> UseN f ** {c2 = p ; lock_N2 = <>} ; nullPrep : Prep = {s = []; c= Gen; lock_Prep=<>} ; - mkN3 f p r = (UseN f) ** {s2 = p.s ; c=p.c; s3=r.s ; c2=r.c; lock_N3 = <>} ; + mkN3 f p2 p3 = (UseN f) ** {c2 = p2; c3 = p3; lock_N3 = <>} ; mkPN = \ivan, g, anim -> diff --git a/next-lib/src/russian/ResRus.gf b/next-lib/src/russian/ResRus.gf index 9203f0bd7..78e6cb81f 100644 --- a/next-lib/src/russian/ResRus.gf +++ b/next-lib/src/russian/ResRus.gf @@ -7,7 +7,7 @@ -- implement $Test$, it moreover contains regular lexical -- patterns needed for $Lex$. -resource ResRus = ParamX ** open Prelude in { +instance ResRus of ResSlavic = ParamX, DiffRus, CommonSlavic ** open Prelude in { flags coding=utf8 ; optimize=all ; @@ -18,10 +18,6 @@ flags coding=utf8 ; optimize=all ; -- Some parameters, such as $Number$, are inherited from $ParamX$. param - Gender = Masc | Fem | Neut ; - Case = Nom | Gen | Dat | Acc | Inst | Prepos PrepKind ; - PrepKind = PrepOther | PrepVNa; - Animacy = Animate | Inanimate ; Voice = Act | Pass ; Aspect = Imperfective | Perfective ; RusTense = Present | PastRus | Future ; diff --git a/next-lib/src/slavic/CatSlavic.gf b/next-lib/src/slavic/CatSlavic.gf new file mode 100644 index 000000000..f757a6044 --- /dev/null +++ b/next-lib/src/slavic/CatSlavic.gf @@ -0,0 +1,9 @@ +incomplete concrete CatSlavic of Cat = open Prelude, CommonSlavic, ResSlavic in { + +lincat + CN = {s : NForm => Str; g : Gender; anim : Animacy} ; + + N = {s : NForm => Str; g : Gender; anim : Animacy} ; + N2 = {s : NForm => Str; g : Gender; anim : Animacy} ** {c2 : Preposition} ; + N3 = {s : NForm => Str; g : Gender; anim : Animacy} ** {c2,c3 : Preposition} ; +} \ No newline at end of file diff --git a/next-lib/src/slavic/CommonSlavic.gf b/next-lib/src/slavic/CommonSlavic.gf new file mode 100644 index 000000000..d65c3d090 --- /dev/null +++ b/next-lib/src/slavic/CommonSlavic.gf @@ -0,0 +1,6 @@ +resource CommonSlavic = ParamX ** open Prelude in { + +param + Gender = Masc | Fem | Neut ; + Animacy = Animate | Inanimate ; +} diff --git a/next-lib/src/slavic/DiffSlavic.gf b/next-lib/src/slavic/DiffSlavic.gf new file mode 100644 index 000000000..77728ad1b --- /dev/null +++ b/next-lib/src/slavic/DiffSlavic.gf @@ -0,0 +1,5 @@ +interface DiffSlavic = open Prelude in { + + param NForm ; + +} \ No newline at end of file diff --git a/next-lib/src/slavic/ResSlavic.gf b/next-lib/src/slavic/ResSlavic.gf new file mode 100644 index 000000000..1f86fbde5 --- /dev/null +++ b/next-lib/src/slavic/ResSlavic.gf @@ -0,0 +1,6 @@ +interface ResSlavic = DiffSlavic ** open CommonSlavic, Prelude in { + +oper + Preposition : Type = {s : Str; c : Case}; + +}