summaryrefslogtreecommitdiff
path: root/next-lib/src
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2008-10-30 18:04:09 +0000
committerkrasimir <krasimir@chalmers.se>2008-10-30 18:04:09 +0000
commit12338243c5198288ba42276b4d76a783c263e7c1 (patch)
tree5c8878a3fdee4f83e898590c50b910131dd120fe /next-lib/src
parent09177428d3319a71df84ce045e1199b6f33efba0 (diff)
bulgarian in next-lib
Diffstat (limited to 'next-lib/src')
-rw-r--r--next-lib/src/bulgarian/AdjectiveBul.gf59
-rw-r--r--next-lib/src/bulgarian/AdverbBul.gf20
-rw-r--r--next-lib/src/bulgarian/AllBul.gf8
-rw-r--r--next-lib/src/bulgarian/AllBulAbs.gf8
-rw-r--r--next-lib/src/bulgarian/CatBul.gf126
-rw-r--r--next-lib/src/bulgarian/ConjunctionBul.gf56
-rw-r--r--next-lib/src/bulgarian/ExtraBul.gf68
-rw-r--r--next-lib/src/bulgarian/ExtraBulAbs.gf33
-rw-r--r--next-lib/src/bulgarian/GrammarBul.gf23
-rw-r--r--next-lib/src/bulgarian/IdiomBul.gf65
-rw-r--r--next-lib/src/bulgarian/LangBul.gf12
-rw-r--r--next-lib/src/bulgarian/LexiconBul.gf380
-rw-r--r--next-lib/src/bulgarian/MorphoBul.gf179
-rw-r--r--next-lib/src/bulgarian/MorphoFunsBul.gf184
-rw-r--r--next-lib/src/bulgarian/NounBul.gf178
-rw-r--r--next-lib/src/bulgarian/NumeralBul.gf134
-rw-r--r--next-lib/src/bulgarian/ParadigmsBul.gf1460
-rw-r--r--next-lib/src/bulgarian/PhraseBul.gf25
-rw-r--r--next-lib/src/bulgarian/QuestionBul.gf63
-rw-r--r--next-lib/src/bulgarian/RelativeBul.gf34
-rw-r--r--next-lib/src/bulgarian/ResBul.gf626
-rw-r--r--next-lib/src/bulgarian/SentenceBul.gf72
-rw-r--r--next-lib/src/bulgarian/StructuralBul.gf122
-rw-r--r--next-lib/src/bulgarian/TextBul.gf13
-rw-r--r--next-lib/src/bulgarian/VerbBul.gf92
25 files changed, 4040 insertions, 0 deletions
diff --git a/next-lib/src/bulgarian/AdjectiveBul.gf b/next-lib/src/bulgarian/AdjectiveBul.gf
new file mode 100644
index 000000000..bb5e8137c
--- /dev/null
+++ b/next-lib/src/bulgarian/AdjectiveBul.gf
@@ -0,0 +1,59 @@
+concrete AdjectiveBul of Adjective = CatBul ** open ResBul, Prelude in {
+ flags coding=cp1251 ;
+
+ lin
+ PositA a = {
+ s = \\aform => a.s ! aform ;
+ adv = a.adv ;
+ isPre = True
+ } ;
+
+ ComparA a np = {
+ s = \\aform => "по" ++ "-" ++ a.s ! aform ++ "от" ++ np.s ! RObj Acc ;
+ adv = "по" ++ "-" ++ a.adv ++ "от" ++ np.s ! RObj Acc ;
+ isPre = True
+ } ;
+ UseComparA a = {
+ s = \\aform => "по" ++ "-" ++ a.s ! aform ;
+ adv = "по" ++ "-" ++ a.adv ;
+ isPre = True
+ } ;
+
+ AdjOrd ord = {
+ s = ord.s ;
+ adv = ord.s ! ASg Neut Indef ;
+ isPre = True
+ } ;
+
+-- $SuperlA$ belongs to determiner syntax in $Noun$.
+
+ ComplA2 a np = {
+ s = \\aform => a.s ! aform ++ a.c2 ++ np.s ! RObj Acc ;
+ adv = a.adv ++ a.c2 ++ np.s ! RObj Acc ;
+ isPre = True
+ } ;
+
+ ReflA2 a = {
+ s = \\aform => a.s ! aform ++ a.c2 ++ ["себе си"] ;
+ adv = a.adv ++ a.c2 ++ ["себе си"] ;
+ isPre = False
+ } ;
+
+ SentAP ap sc = {
+ s = \\a => ap.s ! a ++ sc.s ;
+ adv = ap.adv ++ sc.s ;
+ isPre = False
+ } ;
+
+ AdAP ada ap = {
+ s = \\a => ada.s ++ ap.s ! a ;
+ adv = ada.s ++ ap.adv ;
+ isPre = ap.isPre
+ } ;
+
+ UseA2 a = {
+ s = a.s ;
+ adv = a.adv ;
+ isPre = True
+ } ;
+}
diff --git a/next-lib/src/bulgarian/AdverbBul.gf b/next-lib/src/bulgarian/AdverbBul.gf
new file mode 100644
index 000000000..f886575aa
--- /dev/null
+++ b/next-lib/src/bulgarian/AdverbBul.gf
@@ -0,0 +1,20 @@
+concrete AdverbBul of Adverb = CatBul ** open ResBul, Prelude in {
+ flags coding=cp1251 ;
+
+ lin
+ PositAdvAdj a = {s = a.adv} ;
+ ComparAdvAdj cadv a np = {
+ s = cadv.s ++ "по" ++ "-" ++ a.s ! ASg Neut Indef ++ "от" ++ np.s ! RObj Acc
+ } ;
+ ComparAdvAdjS cadv a s = {
+ s = cadv.s ++ "по" ++ "-" ++ a.s ! ASg Neut Indef ++ "от" ++ "колкото" ++ s.s
+ } ;
+
+ PrepNP prep np = {s = prep.s ++ np.s ! RObj prep.c} ;
+
+ AdAdv = cc2 ;
+
+ SubjS = cc2 ;
+
+ AdnCAdv cadv = {s = cadv.sn ++ "от"} ;
+}
diff --git a/next-lib/src/bulgarian/AllBul.gf b/next-lib/src/bulgarian/AllBul.gf
new file mode 100644
index 000000000..80ad02165
--- /dev/null
+++ b/next-lib/src/bulgarian/AllBul.gf
@@ -0,0 +1,8 @@
+--# -path=.:../abstract:../common:prelude
+
+concrete AllBul of AllBulAbs =
+ LangBul,
+ ExtraBul
+ ** {
+ flags coding=cp1251 ;
+} ;
diff --git a/next-lib/src/bulgarian/AllBulAbs.gf b/next-lib/src/bulgarian/AllBulAbs.gf
new file mode 100644
index 000000000..34156982b
--- /dev/null
+++ b/next-lib/src/bulgarian/AllBulAbs.gf
@@ -0,0 +1,8 @@
+--# -path=.:../abstract:../common:prelude
+
+abstract AllBulAbs =
+ Lang,
+ ExtraBulAbs
+ ** {
+ flags coding=cp1251 ;
+} ;
diff --git a/next-lib/src/bulgarian/CatBul.gf b/next-lib/src/bulgarian/CatBul.gf
new file mode 100644
index 000000000..6c467d3ce
--- /dev/null
+++ b/next-lib/src/bulgarian/CatBul.gf
@@ -0,0 +1,126 @@
+concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+
+ lincat
+
+-- Text, Phrase, Utterance
+
+ Text = {s : Str} ;
+ Phr = {s : Str} ;
+ Utt = {s : Str} ;
+ Voc = {s : Str} ;
+ PConj = {s : Str} ;
+
+-- Tense, Anteriority, Polarity
+
+ Temp = {s : Str ; t : R.Tense ; a : R.Anteriority} ;
+ Tense = {s : Str ; t : R.Tense} ;
+ Ant = {s : Str ; a : R.Anteriority} ;
+ Pol = {s : Str ; p : R.Polarity} ;
+
+-- Tensed/Untensed
+
+ S = {s : Str} ;
+ QS = {s : QForm => Str} ;
+ RS = {s : Agr => Str} ;
+ SC = {s : Str} ;
+ SSlash = {s : Agr => Str ; c2 : Preposition} ;
+
+-- Sentence
+
+ Cl = {s : ResBul.Tense => Anteriority => Polarity => Order => Str} ;
+ ClSlash = {
+ s : Agr => ResBul.Tense => Anteriority => Polarity => Order => Str ;
+ c2 : Preposition
+ } ;
+ Imp = {s : Polarity => GenNum => Str} ;
+
+-- Question
+
+ 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} ;
+ IQuant = {s : GenNum => QForm => Str} ;
+
+-- Relative
+
+ RCl = {s : ResBul.Tense => Anteriority => Polarity => Agr => Str} ;
+ RP = {s : GenNum => Str} ;
+
+-- Verb
+
+ VP = ResBul.VP ;
+ VPSlash = ResBul.VPSlash ;
+
+ Comp = {s : Agr => Str} ;
+ AdV = {s : Str} ; --lock_AdV : {}} ;
+
+-- Adjective
+
+ AP = {s : AForm => Str; adv : Str; isPre : Bool} ;
+
+-- Adjective
+
+ Adv = {s : Str} ;
+ CAdv = {s : Str; sn : Str} ;
+ IAdv = {s : QForm => Str} ;
+ AdA = {s : Str} ;
+
+-- 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} ;
+ Predet = {s : GenNum => Str} ;
+ Ord = {s : AForm => Str} ;
+ Num = {s : DGenderSpecies => Str; n : Number; nonEmpty : Bool} ;
+ Card = {s : DGenderSpecies => Str; n : Number} ;
+ Quant = {s : Bool => AForm => Str; nonEmpty : Bool; spec : Species} ;
+
+-- Numeral
+
+ Numeral = {s : CardOrd => Str; n : Number} ;
+ Digits = {s : CardOrd => Str; n : Number; tail : DTail} ;
+ AdN = {s : Str} ;
+
+-- Structural
+
+ Conj = {s : Str; distr : Bool; conj : Bool; n : Number} ;
+ Subj = {s : Str} ;
+ Prep = {s : Str; c : Case} ;
+
+-- Open lexical classes, e.g. Lexicon
+
+ V, VS, VQ, VA = Verb ;
+ V2, V2A = Verb ** {c2 : Preposition} ;
+ V2V, V2S, V2Q = Verb ** {c2 : Preposition} ; --- AR
+ V3 = Verb ** {c2, c3 : Preposition} ;
+ VV = Verb ;
+
+ 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} ;
+
+
+-- Tense, Anteriority and Polarity functions
+
+ lin
+ PPos = {s = []} ** {p = R.Pos} ;
+ PNeg = {s = []} ** {p = R.Neg} ;
+ TPres = {s = []} ** {t = R.Pres} ;
+ TPast = {s = []} ** {t = R.Past} ; --# notpresent
+ TFut = {s = []} ** {t = R.Fut} ; --# notpresent
+ TCond = {s = []} ** {t = R.Cond} ; --# notpresent
+ ASimul = {s = []} ** {a = R.Simul} ;
+ AAnter = {s = []} ** {a = R.Anter} ; --# notpresent
+}
diff --git a/next-lib/src/bulgarian/ConjunctionBul.gf b/next-lib/src/bulgarian/ConjunctionBul.gf
new file mode 100644
index 000000000..23664cd1f
--- /dev/null
+++ b/next-lib/src/bulgarian/ConjunctionBul.gf
@@ -0,0 +1,56 @@
+concrete ConjunctionBul of Conjunction =
+ CatBul ** open ResBul, Coordination, Prelude in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+ lin
+ ConjS conj ss = {
+ s = (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj;
+ } ;
+
+ ConjAdv conj ss = {
+ s = (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj;
+ } ;
+
+ 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}
+ } ;
+
+ ConjAP conj ss = {
+ s = \\aform => (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj!aform;
+ adv = (linCoordSep [])!conj.distr!conj.conj++ss.adv!conj.distr!conj.conj;
+ isPre = ss.isPre
+ } ;
+
+-- These fun's are generated from the list cat's.
+ BaseS x y = {s = \\d,t=>x.s++linCoord!t++ y.s} ;
+ ConsS x xs = {s = \\d,t=>x.s++(linCoordSep comma)!d!t++xs.s!d!t} ;
+
+ BaseAdv x y = {s = \\d,t=>x.s++linCoord!t++ y.s} ;
+ ConsAdv x xs = {s = \\d,t=>x.s++(linCoordSep comma)!d!t++xs.s!d!t} ;
+
+ BaseNP x y =
+ {s = \\d,t,role=>x.s!role++linCoord!t++y.s!role;
+ a = conjAgr x.a y.a} ;
+ ConsNP x xs =
+ {s = \\d,t,role=>x.s!role++(linCoordSep comma)!d!t++xs.s!d!t!role;
+ a = conjAgr xs.a x.a} ;
+
+ BaseAP x y =
+ {s = \\d,t,aform=>x.s!aform++linCoord!t++y.s!aform;
+ adv= \\d,t =>x.adv ++linCoord!t++y.adv;
+ isPre = andB x.isPre y.isPre} ;
+ ConsAP x xs =
+ {s = \\d,t,aform=>x.s!aform++(linCoordSep comma)!d!t++xs.s!d!t!aform;
+ adv= \\d,t =>x.adv ++(linCoordSep comma)!d!t++xs.adv!d!t;
+ isPre = andB x.isPre xs.isPre} ;
+
+ lincat
+ [S] = {s : Bool => Bool => Str} ;
+ [Adv] = {s : Bool => Bool => Str} ;
+ [NP] = {s : Bool => Bool => Role => Str; a : Agr} ;
+ [AP] = {s : Bool => Bool => AForm => Str; adv : Bool => Bool => Str; isPre : Bool} ;
+}
diff --git a/next-lib/src/bulgarian/ExtraBul.gf b/next-lib/src/bulgarian/ExtraBul.gf
new file mode 100644
index 000000000..1e15a19de
--- /dev/null
+++ b/next-lib/src/bulgarian/ExtraBul.gf
@@ -0,0 +1,68 @@
+concrete ExtraBul of ExtraBulAbs = CatBul **
+ open ResBul, Coordination, Prelude in {
+ flags coding=cp1251 ;
+
+
+ lin
+ PossIndefPron p = {
+ s = \\aform => p.gen ! (indefAForm ! aform) ;
+ spec = Indef
+ } ;
+
+ ReflQuant = {
+ s = \\aform => reflPron ! aform ;
+ spec = Indef
+ } ;
+
+ ReflIndefQuant = {
+ s = \\aform => reflPron ! (indefAForm ! aform) ;
+ spec = Indef
+ } ;
+
+ i8fem_Pron = mkPron "аз" "мен" "ми" "мой" "моя" "моят" "моя" "моята" "мое" "моето" "мои" "моите" (GSg Fem) P1 ;
+ i8neut_Pron = mkPron "аз" "мен" "ми" "мой" "моя" "моят" "моя" "моята" "мое" "моето" "мои" "моите" (GSg Neut) P1 ;
+
+ whatSg8fem_IP = mkIP "каква" "каква" (GSg Fem) ;
+ whatSg8neut_IP = mkIP "какво" "какво" (GSg Neut) ;
+
+ whoSg8fem_IP = mkIP "коя" "кого" (GSg Fem) ;
+ whoSg8neut_IP = mkIP "кое" "кого" (GSg Neut) ;
+
+ youSg8fem_Pron = mkPron "ти" "теб" "ти" "твой" "твоя" "твоят" "твоя" "твоята" "твое" "твоето" "твои" "твоите" (GSg Fem) P2 ;
+ youSg8neut_Pron = mkPron "ти" "теб" "ти" "твой" "твоя" "твоят" "твоя" "твоята" "твое" "твоето" "твои" "твоите" (GSg Neut) P2 ;
+
+ youPol8fem_Pron = mkPron "вие" "вас" "ви" "ваш" "вашия" "вашият" "ваша" "вашата" "ваше" "вашето" "ваши" "вашите" (GSg Fem) P2 ;
+ youPol8neut_Pron = mkPron "вие" "вас" "ви" "ваш" "вашия" "вашият" "ваша" "вашата" "ваше" "вашето" "ваши" "вашите" (GSg Neut) P2 ;
+
+ onePl_Num = {s = table {
+ DMascIndef | DMascPersonalIndef | DFemIndef | DNeutIndef => "едни" ;
+ DMascDef | DMascDefNom | DMascPersonalDef | DMascPersonalDefNom | DFemDef | DNeutDef => "едните"
+ } ;
+ n = Pl;
+ nonEmpty = True
+ } ;
+
+ UttImpSg8fem pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Fem} ;
+ UttImpSg8neut pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Fem} ;
+
+ oper
+ reflPron : AForm => Str =
+ table {
+ ASg Masc Indef => "свой" ;
+ ASg Masc Def => "своя" ;
+ ASgMascDefNom => "своят" ;
+ ASg Fem Indef => "своя" ;
+ ASg Fem Def => "своята" ;
+ ASg Neut Indef => "свое" ;
+ ASg Neut Def => "своето" ;
+ APl Indef => "свои" ;
+ APl Def => "своите"
+ } ;
+
+ indefAForm : AForm => AForm =
+ table {
+ ASg g _ => ASg g Indef ;
+ ASgMascDefNom => ASg Masc Indef ;
+ APl _ => APl Indef
+ } ;
+}
diff --git a/next-lib/src/bulgarian/ExtraBulAbs.gf b/next-lib/src/bulgarian/ExtraBulAbs.gf
new file mode 100644
index 000000000..fe57f33b1
--- /dev/null
+++ b/next-lib/src/bulgarian/ExtraBulAbs.gf
@@ -0,0 +1,33 @@
+abstract ExtraBulAbs = Extra ** {
+ flags coding=cp1251 ;
+
+
+fun
+-- Feminine variants of pronouns (those in $Structural$ are
+-- masculine, which is the default when gender is unknown).
+
+ PossIndefPron : Pron -> Quant ;
+
+ ReflQuant : Quant ;
+ ReflIndefQuant : Quant ;
+
+ i8fem_Pron : Pron ;
+ i8neut_Pron : Pron ;
+
+ whatSg8fem_IP : IP ;
+ whatSg8neut_IP : IP ;
+
+ whoSg8fem_IP : IP ;
+ whoSg8neut_IP : IP ;
+
+ youSg8fem_Pron : Pron ;
+ youSg8neut_Pron : Pron ;
+
+ youPol8fem_Pron : Pron ;
+ youPol8neut_Pron : Pron ;
+
+ onePl_Num : Num ;
+
+ UttImpSg8fem : Pol -> Imp -> Utt;
+ UttImpSg8neut : Pol -> Imp -> Utt;
+}
diff --git a/next-lib/src/bulgarian/GrammarBul.gf b/next-lib/src/bulgarian/GrammarBul.gf
new file mode 100644
index 000000000..21e437b74
--- /dev/null
+++ b/next-lib/src/bulgarian/GrammarBul.gf
@@ -0,0 +1,23 @@
+--# -path=.:../abstract:../common:prelude
+
+concrete GrammarBul of Grammar =
+ NounBul,
+ VerbBul,
+ AdjectiveBul,
+ AdverbBul,
+ NumeralBul,
+ SentenceBul,
+ QuestionBul,
+ RelativeBul,
+ ConjunctionBul,
+ PhraseBul,
+ TextBul,
+ StructuralBul,
+ IdiomBul
+ ** {
+ flags coding=cp1251 ;
+
+
+flags startcat = Phr ; unlexer = text ; lexer = text ;
+
+} ;
diff --git a/next-lib/src/bulgarian/IdiomBul.gf b/next-lib/src/bulgarian/IdiomBul.gf
new file mode 100644
index 000000000..cd22f7908
--- /dev/null
+++ b/next-lib/src/bulgarian/IdiomBul.gf
@@ -0,0 +1,65 @@
+concrete IdiomBul of Idiom = CatBul ** open Prelude, ParadigmsBul, ResBul in {
+ flags coding=cp1251 ;
+
+ flags optimize=all_subs ;
+
+ lin
+ ImpersCl vp = mkClause [] (agrP3 (GSg Neut)) vp ;
+ GenericCl vp = mkClause "някой" (agrP3 (GSg Neut)) vp ;
+
+ CleftNP np rs =
+ mkClause (np.s ! RSubj)
+ {gn=GSg Neut; p=np.a.p}
+ (insertObj (\\_ => thisRP ! np.a.gn ++ rs.s ! np.a) (predV verbBe)) ;
+
+ CleftAdv ad s = {s = \\t,a,p,o => case p of {Pos=>[]; Neg=>"не"} ++ ad.s ++ s.s } ;
+
+ ExistNP np =
+ { s = \\t,a,p,o =>
+ let verb = case p of {
+ Pos => mkV186 "имам" ;
+ Neg => mkV186 "нямам"
+ } ;
+
+ agr=agrP3 (GSg Neut);
+
+ present = verb ! (VPres (numGenNum agr.gn) agr.p) ;
+ aorist = verb ! (VAorist (numGenNum agr.gn) agr.p) ;
+ perfect = verb ! (VPerfect (aform agr.gn Indef (RObj Acc))) ;
+
+ auxPres = auxBe ! VPres (numGenNum agr.gn) agr.p ;
+ auxAorist = auxBe ! VAorist (numGenNum agr.gn) agr.p ;
+ auxCondS = auxWould ! VAorist (numGenNum agr.gn) agr.p ;
+
+ v : {aux1:Str; aux2:Str; main:Str}
+ = case <t,a> of {
+ <Pres,Simul> => {aux1=[]; aux2=[]; main=present} ;
+ <Pres,Anter> => {aux1=[]; aux2=auxPres; main=perfect} ;
+ <Past,Simul> => {aux1=[]; aux2=[]; main=aorist} ;
+ <Past,Anter> => {aux1=[]; aux2=auxAorist; main=perfect} ;
+ <Fut, Simul> => {aux1="ще"; aux2=[]; main=present} ;
+ <Fut, Anter> => {aux1="ще"++auxPres; aux2=[]; main=perfect} ;
+ <Cond,_> => {aux1=auxCondS; aux2=[]; main=perfect}
+ } ;
+
+ in case o of {
+ Main => v.aux1 ++ v.main ++ v.aux2 ++ np.s ! RObj Acc ;
+ Inv => np.s ! RObj Acc ++ v.aux1 ++ v.main ++ v.aux2 ;
+ Quest => v.aux1 ++ v.main ++ "ли" ++ v.aux2 ++ np.s ! RObj Acc
+ }
+ } ;
+
+ ExistIP ip =
+ mkQuestion {s = ip.s ! RSubj}
+ (mkClause "тук" (agrP3 ip.gn) (predV verbBe)) ;
+
+ ProgrVP vp = {
+ s = \\_ => vp.s ! Imperf ;
+ ad = vp.ad ;
+ compl = vp.compl ;
+ vtype = vp.vtype
+ } ;
+
+ ImpPl1 vp = {s = "нека" ++ daComplex vp ! Perf ! {gn = GPl ; p = P1}} ;
+}
+
diff --git a/next-lib/src/bulgarian/LangBul.gf b/next-lib/src/bulgarian/LangBul.gf
new file mode 100644
index 000000000..d92b2533a
--- /dev/null
+++ b/next-lib/src/bulgarian/LangBul.gf
@@ -0,0 +1,12 @@
+--# -path=.:../abstract:../common:src/prelude
+
+concrete LangBul of Lang =
+ GrammarBul,
+ LexiconBul
+ ** {
+ flags coding=cp1251 ;
+
+
+flags startcat = Phr ; unlexer = text ; lexer = text ; erasing = on ; coding = cp1251 ;
+
+} ;
diff --git a/next-lib/src/bulgarian/LexiconBul.gf b/next-lib/src/bulgarian/LexiconBul.gf
new file mode 100644
index 000000000..a02db0153
--- /dev/null
+++ b/next-lib/src/bulgarian/LexiconBul.gf
@@ -0,0 +1,380 @@
+--# -path=.:prelude
+
+concrete LexiconBul of Lexicon = CatBul **
+ open ParadigmsBul, ResBul, Prelude in {
+ flags coding=cp1251 ;
+
+
+flags
+ optimize=values ;
+
+lin
+ airplane_N = mkN007 "самолет" ;
+ answer_V2S = mkV2S (actionV (mkV187 "отговарям") (mkV173 "отговоря")) naP ;
+ apartment_N = mkN007 "апартамент" ;
+ apple_N = mkN041 "ябълка" ;
+ art_N = mkN054 "изкуство" ;
+ ask_V2Q = mkV2Q (stateV (mkV186 "питам")) noPrep ;
+ baby_N = mkN065 "бебе" ;
+ bad_A = mkA076 "лош" ;
+ bank_N = mkN041 "банка" ;
+ beautiful_A = mkA076 "красив" ;
+ become_VA = mkVA (actionV (mkV186 "ставам") (mkV152 "стана")) ;
+ beer_N = mkN041 "бира" ;
+ beg_V2V = mkV2V (stateV (mkV173 "моля")) noPrep zaP ;
+ big_A = mkA081 "голям" ;
+ bike_N = mkN061 "колело" ;
+ bird_N = mkN041 "птица" ;
+ black_A = mkA079 "черен" ;
+ blue_A = mkA086 "син" ;
+ boat_N = mkN007 "кораб" ;
+ book_N = mkN041 "книга" ;
+ boot_N = mkN041 "обувка" ;
+ boss_N = mkN001 "шеф" ;
+ boy_N = mkN065 "момче" ;
+ bread_N = mkN001 "хляб" ;
+ break_V2 = dirV2 (actionV (mkV173 "чупя") (mkV173 "счупя")) ;
+ broad_A = mkA079 "обширен" ;
+ brother_N2 = prepN2 (mkN025 "брат") naP ;
+ brown_A = mkA076 "кафяв" ;
+ butter_N = mkN054 "масло" ;
+ buy_V2 = dirV2 (actionV (mkV186 "купувам") (mkV173 "купя")) ;
+ camera_N = mkN041 "камера" ;
+ cap_N = mkN041 "шапка" ;
+ car_N = mkN041 "кола" ;
+ carpet_N = mkN007 "килим" ;
+ cat_N = mkN041 "котка" ;
+ ceiling_N = mkN007 "таван" ;
+ chair_N = mkN001 "стол" ;
+ cheese_N = mkN066 "сирене" ;
+ child_N = mkN067 "дете" ;
+ church_N = mkN041 "църква" ;
+ city_N = mkN001 "град" ;
+ clean_A = mkA076 "чист" ;
+ clever_A = mkA079 "умен" ;
+ close_V2 = dirV2 (actionV (mkV187 "затварям") (mkV173 "затворя")) ;
+ coat_N = mkN054 "палто" ;
+ cold_A = mkA076 "студен" ;
+ come_V = actionV (mkV186 "идвам") (table { -- special case "дойди", "дойдете" are archaic
+ VImperative Sg => "ела";
+ VImperative Pl => "елате";
+ vform => mkV146a "дойда" ! vform}) ;
+ computer_N = mkN009 "компютър" ;
+ country_N = mkN041 "държава" ;
+ cousin_N = mkN007a "братовчед" ;
+ cow_N = mkN041 "крава" ;
+ die_V = actionV (mkV186 "умирам") (mkV150a "умра") ;
+ dirty_A = mkA079 "мръсен" ;
+ distance_N3 = prepN3 (mkN072 "разстояние") otP doP ;
+ doctor_N = mkN007a "доктор" ;
+ dog_N = mkN065 "куче" ;
+ door_N = mkN041 "врата" ;
+ drink_V2 = dirV2 (stateV (mkV163 "пия")) ;
+ easy_A2V = mkA2V (mkA079 "лесен") zaP ;
+ eat_V2 = dirV2 (stateV (mkV169 "ям")) ;
+ empty_A = mkA079 "празен" ;
+ enemy_N = mkN001 "враг" ;
+ factory_N = mkN041 "фабрика" ;
+ father_N2 = prepN2 (mkN038 "баща") naP ;
+ fear_VS = mkVS (stateV (mkV186 "страхувам")) ;
+ find_V2 = dirV2 (actionV (mkV186 "намирам") (mkV173 "намеря")) ;
+ fish_N = mkN041 "риба" ;
+ floor_N = mkN007 "етаж" ;
+ fridge_N = mkN007 "фризер" ;
+ friend_N = mkN031a "приятел" ;
+ fruit_N = mkN001 "плод" ;
+ fun_AV = mkAV (mkA079 "забавен") ;
+ forget_V2 = dirV2 (actionV (mkV187 "забравям") (mkV173 "забравя")) ;
+ garden_N = mkN041 "градина" ;
+ girl_N = mkN065 "момиче" ;
+ glove_N = mkN041 "ръкавица" ;
+ gold_N = mkN054 "злато" ;
+ good_A = adjAdv (mkA080 "добър") "добре" ;
+ go_V = actionV (mkV186 "отивам") (mkV146 "отида") ;
+ green_A = mkA076 "зелен" ;
+ harbour_N = mkN066 "пристанище" ;
+ hate_V2 = dirV2 (stateV (mkV173 "мразя")) ;
+ hat_N = mkN041 "шапка" ;
+ have_V2 = dirV2 (stateV (mkV186 "имам")) ;
+ hear_V2 = dirV2 (actionV (mkV186 "чувам") (mkV163 "чуя")) ;
+ hill_N = mkN001 "хълм" ;
+ hope_VS = mkVS (medialV (stateV (mkV186 "надявам")) Acc) ;
+ horse_N = mkN035 "кон" ;
+ hot_A = mkA076 "горещ" ;
+ house_N = mkN041 "къща" ;
+ important_A = mkA079 "важен" ;
+ industry_N = mkN047 "индустрия" ;
+ iron_N = mkN057 "желязо" ;
+ king_N = mkN035a "цар" ;
+ know_V2 = dirV2 {
+ s = \\_,vform => case vform of {
+ VPassive aform => (mkA079 "известен").s ! aform ;
+ _ => mkV162 "зная" ! vform
+ } ;
+ vtype = VNormal ;
+ lock_V = <>
+ } ;
+ lake_N = mkN054 "езеро" ;
+ lamp_N = mkN041 "лампа" ;
+ learn_V2 = dirV2 (actionV (mkV176 "уча") (mkV176 "науча")) ;
+ leather_N = mkN041 "кожа" ;
+ leave_V2 = dirV2 (actionV (mkV187 "оставям") (mkV173 "оставя")) ;
+ like_V2 = dirV2 (actionV (mkV186 "харесвам") (mkV186 "харесам")) ;
+ listen_V2 = dirV2 (stateV (mkV186 "слушам")) ;
+ live_V = stateV (mkV160 "живея") ;
+ long_A = mkA080 "дълъг" ;
+ lose_V2 = dirV2 (actionV (mkV173 "губя") (mkV173 "загубя")) ;
+ love_N = mkN049 "любов" ;
+ love_V2 = dirV2 (stateV (mkV186 "обичам")) ;
+ man_N = mkN024 "мъж" ;
+ married_A2 = mkA2 (mkA076 "женен") zaP ;
+ meat_N = mkN054 "месо" ;
+ milk_N = mkN057 "мляко" ;
+ moon_N = mkN041 "луна" ;
+ mother_N2 = prepN2 (mkN041a "майка") naP ;
+ mountain_N = mkN041 "планина" ;
+ music_N = mkN041 "музика" ;
+ narrow_A = mkA084 "тесен" ;
+ new_A = mkA076 "нов" ;
+ newspaper_N = mkN014 "вестник" ;
+ oil_N = mkN065 "олио" ;
+ old_A = mkA076 "стар" ;
+ open_V2 = dirV2 (actionV (mkV187 "отварям") (mkV173 "отворя")) ;
+ paint_V2A = mkV2A (actionV (mkV186 "рисувам") (mkV186 "нарисувам")) noPrep ;
+ paper_N = mkN047 "хартия" ;
+ paris_PN = mkPN "Париж" Masc ;
+ peace_N = mkN040a "мир" ;
+ pen_N = mkN041 "писалка" ;
+ planet_N = mkN041 "планета" ;
+ plastic_N = mkN041 "пластмаса" ;
+ play_V2 = dirV2 (stateV (mkV161 "играя")) ;
+ policeman_N = mkN032a "полицай" ;
+ priest_N = mkN014 "свещеник" ;
+ probable_AS = mkAS (mkA079 "вероятен") ;
+ queen_N = mkN041 "кралица" ;
+ radio_N = mkN054 "радио" ;
+ rain_V0 = mkV0 (stateV (mkV174 "вали")) ;
+ read_V2 = dirV2 (stateV (mkV145 "чета")) ;
+ red_A = mkA076 "червен" ;
+ religion_N = mkN047 "религия" ;
+ restaurant_N = mkN007 "ресторант" ;
+ river_N = mkN041 "река" ;
+ rock_N = mkN041 "скала" ;
+ roof_N = mkN007 "покрив" ;
+ rubber_N = mkN041 "гума" ;
+ run_V = stateV (mkV186 "бягам") ;
+ say_VS = mkVS (actionV (mkV186 "казвам") (mkV156 "кажа")) ;
+ school_N = mkN066 "училище" ;
+ science_N = mkN041 "наука" ;
+ sea_N = mkN065 "море" ;
+ seek_V2 = dirV2 (stateV (mkV173 "търся")) ;
+ see_V2 = dirV2 (actionV (mkV186 "виждам") (mkV181 "видя")) ;
+ sell_V3 = dirV3 (stateV (mkV186 "продавам")) naP ;
+ send_V3 = dirV3 (actionV (mkV186 "пращам") (mkV173 "пратя")) doP ;
+ sheep_N = mkN044 "овца" ;
+ ship_N = mkN007 "кораб" ;
+ shirt_N = mkN041 "риза" ;
+ shoe_N = mkN041 "обувка" ;
+ shop_N = mkN007 "магазин" ;
+ short_A = mkA076 "къс" ;
+ silver_N = mkN054 "сребро" ;
+ sister_N = mkN041a "сестра" ;
+ sleep_V = stateV (mkV182 "спя") ;
+ small_A = mkA080 "малък" ;
+ snake_N = mkN047 "змия" ;
+ sock_N = mkN007 "чорап" ;
+ speak_V2 = dirV2 (stateV (mkV173 "говоря")) ;
+ star_N = mkN041 "звезда" ;
+ steel_N = mkN041 "стомана" ;
+ stone_N = mkN017 "камък" ;
+ stove_N = mkN041 "печка" ;
+ student_N = mkN007a "студент" ;
+ stupid_A = mkA076 "глупав" ;
+ sun_N = mkN066 "слънце" ;
+ switch8off_V2 = dirV2 (actionV (mkV186 "изключвам") (mkV176 "изключа")) ;
+ switch8on_V2 = dirV2 (actionV (mkV186 "включвам") (mkV176 "включа")) ;
+ table_N = mkN041 "маса" ;
+ talk_V3 = mkV3 (stateV (mkV173 "говоря")) naP zaP ;
+ teacher_N = mkN031a "учител" ;
+ teach_V2 = dirV2 (actionV (mkV186 "преподавам") (mkV168 "преподам")) ;
+ television_N = mkN047 "телевизия" ;
+ thick_A = mkA076 "дебел" ;
+ thin_A = mkA080 "тънък" ;
+ train_N = mkN001 "влак" ;
+ travel_V = stateV (mkV186 "пътувам") ;
+ tree_N = mkN061 "дърво" ;
+ ugly_A = mkA076 "глупав" ;
+ understand_V2 = dirV2 (actionV (mkV186 "разбирам") (mkV170 "разбера")) ;
+ university_N = mkN007 "университет" ;
+ village_N = mkN054 "село" ;
+ wait_V2 = prepV2 (stateV (mkV186 "чакам")) zaP ;
+ walk_V = stateV (mkV173 "ходя") ;
+ warm_A = mkA080 "топъл" ;
+ war_N = mkN041 "война" ;
+ watch_V2 = dirV2 (stateV (mkV186 "гледам")) ;
+ water_N = mkN041 "вода" ;
+ white_A = mkA081 "бял" ;
+ window_N = mkN008 "прозорец" ;
+ wine_N = mkN054 "вино" ;
+ win_V2 = dirV2 (actionV (mkV186 "побеждавам") (mkV174 "победя")) ;
+ woman_N = mkN041a "жена" ;
+ wonder_VQ = mkVQ (medialV (actionV (mkV186 "учудвам") (mkV173 "чудя")) Acc) ;
+ wood_N = mkN041 "дървесина" ;
+ write_V2 = dirV2 (stateV (mkV159 "пиша")) ;
+ yellow_A = mkA076 "жълт" ;
+ young_A = mkA076 "млад" ;
+ do_V2 = dirV2 (actionV (mkV173 "правя") (mkV173 "направя")) ;
+ now_Adv = mkAdv "сега" ;
+ already_Adv = mkAdv "вече" ;
+ song_N = mkN050 "песен" ;
+ add_V3 = dirV3 (actionV (mkV186 "събирам") (mkV170 "събера")) sP ;
+ number_N = mkN054 "число" ;
+ put_V2 = prepV2 (actionV (mkV186 "слагам") (mkV176 "сложа")) noPrep ;
+ stop_V = actionV (mkV186 "спирам") (mkV150 "спра") ;
+ jump_V = actionV (mkV186 "скачам") (mkV176 "скоча") ;
+ left_Ord = mkA081 "ляв" ** {nonEmpty=True} ;
+ right_Ord = mkA084 "десен" ** {nonEmpty=True} ;
+ far_Adv = mkAdv "далече" ;
+ correct_A = mkA079 "правилен" ;
+ dry_A = mkA076 "сух" ;
+ dull_A = mkA076 "тъп" ;
+ full_A = mkA079 "пълен" ;
+ heavy_A = mkA080 "тежък" ;
+ near_A = mkA080 "близък" ;
+ rotten_A = mkA076 "прогнил" ;
+ round_A = mkA080 "кръгъл" ;
+ sharp_A = mkA080 "остър" ;
+ smooth_A = mkA080 "гладък" ;
+ straight_A = mkA081 "пряк" ;
+ wet_A = mkA080 "мокър" ; ----
+ wide_A = mkA076 "широк" ;
+ animal_N = mkN062 "животно" ;
+ ashes_N = mkN049 "пепeл" ;
+ back_N = mkN003 "гръб" ;
+ bark_N = mkN028 "лай" ;
+ belly_N = mkN007 "корем" ;
+ blood_N = mkN053 "кръв" ;
+ bone_N = mkN049 "кост" ;
+ breast_N = mkN041 "гърда" ;
+ cloud_N = mkN014 "облак" ;
+ day_N = mkN033 "ден" ;
+ dust_N = mkN001 "прах" ;
+ ear_N = mkN064 "ухо" ;
+ earth_N = mkN047 "земя" ;
+ egg_N = mkN066 "яйце" ;
+ eye_N = mkN063 "око" ;
+ fat_N = mkN041 "мазнина" ;
+ feather_N = mkN038 "баща" ;
+ fingernail_N = mkN034 "нокът" ;
+ fire_N = mkN030 "огън" ;
+ flower_N = mkN068 "цвете" ;
+ fog_N = mkN041 "мъгла" ;
+ foot_N = mkN041 "стъпка" ;
+ forest_N = mkN041 "гора" ;
+ grass_N = mkN041 "трева" ;
+ guts_N = mkN054 "черво" ;
+ hair_N = mkN041 "коса" ;
+ hand_N = mkN045 "ръка" ;
+ head_N = mkN041 "глава" ;
+ heart_N = mkN066 "сърце" ;
+ horn_N = mkN001 "рог" ;
+ husband_N = mkN015 "съпруг" ; -- personal
+ ice_N = mkN001 "лед" ;
+ knee_N = mkN058 "коляно" ;
+ leaf_N = mkN054 "листо" ;
+ leg_N = mkN022 "крак" ;
+ liver_N = mkN001 "дроб" ;
+ louse_N = mkN041 "въшка" ;
+ mouth_N = mkN042 "уста" ;
+ name_N = mkN069 "име" ;
+ neck_N = mkN003 "гръб" ;
+ night_N = mkN049 "нощ" ;
+ nose_N = mkN001 "нос" ;
+ person_N = mkN014 "човек" ;
+ rain_N = mkN001 "дъжд" ;
+ road_N = mkN037 "път" ;
+ root_N = mkN007 "корен" ;
+ rope_N = mkN065 "въже" ;
+ salt_N = mkN049 "сол" ;
+ sand_N = mkN014 "пясък" ;
+ seed_N = mkN069 "семе" ;
+ skin_N = mkN041 "кожа" ;
+ sky_N = mkN070 "небе" ;
+ smoke_N = mkN014 "пушек" ;
+ snow_N = mkN002 "сняг" ;
+ stick_N = mkN041 "пръчка" ;
+ tail_N = mkN041 "опашка" ;
+ tongue_N = mkN014 "език" ;
+ tooth_N = mkN007 "зъб" ;
+ wife_N = mkN041 "съпруга" ;
+ wind_N = mkN004 "вятър" ;
+ wing_N = mkN056 "крило" ;
+ worm_N = mkN032 "червей" ;
+ year_N = mkN041 "година" ;
+ blow_V = stateV (mkV186 "духам") ;
+ breathe_V = dirV2 (stateV (mkV186 "дишам")) ;
+ burn_V = actionV (mkV187 "изгарям") (mkV177 "изгоря") ;
+ dig_V = stateV (mkV161 "копая") ;
+ fall_V = actionV (mkV186 "падам") (mkV152 "падна") ;
+ float_V = stateV (mkV186 "плавам") ;
+ flow_V = stateV (mkV148 "тека") ;
+ fly_V = stateV (mkV177 "летя") ;
+ freeze_V = stateV (mkV186 "замръзвам") ;
+ give_V3 = dirV3 (actionV (mkV186 "давам") (mkV186 "дам")) naP ;
+ laugh_V = medialV (stateV (mkV160 "смея")) Acc ;
+ lie_V = stateV (mkV178 "лежа") ;
+ play_V = stateV (mkV161 "играя") ;
+ sew_V = stateV (mkV163 "шия") ;
+ sing_V = stateV (mkV164 "пея") ;
+ sit_V = stateV (mkV177 "седя") ;
+ smell_V = stateV (mkV159 "мириша") ;
+ spit_V = stateV (mkV163 "плюя") ;
+ stand_V = stateV (mkV180 "стоя") ;
+ swell_V = actionV (mkV186 "надувам") (mkV163 "надуя") ;
+ swim_V = stateV (mkV186 "плувам") ;
+ think_V = stateV (mkV173 "мисля") ;
+ turn_V = actionV (mkV186 "обръщам") (mkV152 "обърна") ;
+ vomit_V = actionV (mkV186 "повръщам") (mkV152 "повърна") ;
+
+ bite_V2 = dirV2 (stateV (mkV154 "хапя")) ;
+ count_V2 = dirV2 (stateV (mkV175 "броя")) ;
+ cut_V2 = dirV2 (stateV (mkV157 "режа")) ;
+ fear_V2 = dirV2 (medialV (stateV (mkV186 "страхувам")) Acc) ;
+ fight_V2 = dirV2 (medialV (stateV (mkV173 "боря")) Acc) ;
+ hit_V2 = dirV2 (actionV (mkV187 "удрям") (mkV173 "ударя")) ;
+ hold_V2 = dirV2 (stateV (mkV179 "държа")) ;
+ hunt_V2 = dirV2 (stateV (mkV174 "ловя")) ;
+ kill_V2 = dirV2 (actionV (mkV186 "убивам") (mkV163 "убия")) ;
+ pull_V2 = dirV2 (stateV (mkV186 "дърпам")) ;
+ push_V2 = dirV2 (stateV (mkV186 "бутам")) ;
+ rub_V2 = dirV2 (stateV (mkV163 "трия")) ;
+ scratch_V2 = dirV2 (actionV (mkV186 "драскам") (mkV152 "драсна")) ;
+ split_V2 = dirV2 (actionV (mkV187 "разделям") (mkV174 "разделя")) ;
+ squeeze_V2 = dirV2 (actionV (mkV186 "стискам") (mkV152 "стисна")) ;
+ stab_V2 = dirV2 (actionV (mkV186 "промушвам") (mkV176 "промуша")) ;
+ suck_V2 = dirV2 (stateV (mkV155 "суча")) ;
+ throw_V2 = dirV2 (actionV (mkV187 "хвърлям") (mkV173 "хвърля")) ;
+ tie_V2 = dirV2 (actionV (mkV186 "връзвам") (mkV156 "вържа")) ;
+ wash_V2 = dirV2 (stateV (mkV163 "мия")) ;
+ wipe_V2 = dirV2 (stateV (mkV159 "бърша")) ;
+
+ grammar_N = mkN041 "граматика" ;
+ language_N = mkN014 "език" ;
+ rule_N = mkN054 "правило" ;
+
+ john_PN = mkPN "Джон" Masc ;
+ question_N = mkN007 "въпрос" ;
+ ready_A = mkA076 "готов" ;
+ reason_N = mkN041 "причина" ;
+ today_Adv = mkAdv "днес" ;
+ uncertain_A = mkA079 "неясен" ;
+
+oper
+ zaP = mkPrep "за" Acc ;
+ naP = mkPrep [] Dat ;
+ otP = mkPrep "от" Acc ;
+ doP = mkPrep "до" Acc ;
+ sP = mkPrep (pre { "с" ;
+ "със" / strs {"с" ; "з" ; "С" ; "З"}
+ }) Acc ;
+} ;
diff --git a/next-lib/src/bulgarian/MorphoBul.gf b/next-lib/src/bulgarian/MorphoBul.gf
new file mode 100644
index 000000000..f59d783c8
--- /dev/null
+++ b/next-lib/src/bulgarian/MorphoBul.gf
@@ -0,0 +1,179 @@
+--# -path=.:../../prelude
+
+--1 A Simple English Resource Morphology
+--
+-- Aarne Ranta 2002 -- 2005
+--
+-- This resource morphology contains definitions needed in the resource
+-- syntax. To build a lexicon, it is better to use $ParadigmsEng$, which
+-- gives a higher-level access to this module.
+
+resource MorphoBul = ResBul ** open
+ Predef,
+ Prelude,
+ CatBul
+ in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all ;
+
+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} ;
+
+ mkQuant : Str -> Str -> Str -> Str -> {s : Bool => AForm => Str; nonEmpty : Bool; spec : Species} = \tozi,tazi,towa,tezi ->
+ { s = \\_ => table {
+ ASg Masc _ => tozi ;
+ ASgMascDefNom => tozi ;
+ ASg Fem _ => tazi ;
+ ASg Neut _ => towa ;
+ APl _ => tezi
+ } ;
+ nonEmpty = True ;
+ spec = Indef
+ } ;
+
+--2 Verbs
+
+ mkVerb : (_,_,_,_,_,_,_,_,_:Str) -> VTable =
+ \cheta,chete,chetoh,chetqh,chel,chetql,cheten,chetqst,cheti ->
+ table {
+ VPres Sg P1 => cheta;
+ VPres Sg P2 => chete + "ш";
+ VPres Sg P3 => chete;
+ VPres Pl P1 => case chete of {
+ _ + ("а"|"я") => chete + "ме";
+ _ => chete + "м"
+ };
+ VPres Pl P2 => chete + "те";
+ VPres Pl P3 => case cheta of {
+ vika + "м" => case chete of {
+ dad + "е" => dad + "ат";
+ vika => vika + "т"
+ };
+ _ => cheta + "т"
+ };
+ VAorist Sg P1 => chetoh;
+ VAorist Sg _ => case chetoh of {
+ chet+"ох" => chete;
+ zova+ "х" => zova
+ };
+ VAorist Pl P1 => chetoh + "ме";
+ VAorist Pl P2 => chetoh + "те";
+ VAorist Pl P3 => chetoh + "а";
+ VImperfect Sg P1 => chetqh;
+ VImperfect Sg _ => case chete of {
+ rabot + "и" => rabot + "eше";
+ _ => chete + "ше"
+ };
+ VImperfect Pl P1 => chetqh + "ме";
+ VImperfect Pl P2 => chetqh + "те";
+ VImperfect Pl P3 => chetqh + "а";
+ VPerfect aform =>let chel1 : Str =
+ case chel of {
+ pas+"ъл" => pas+"л";
+ _ => chel
+ }
+ in (mkAdjective chel
+ (chel+"ия")
+ (chel+"ият")
+ (chel1+"a")
+ (chel1+"ата")
+ (chel1+"о")
+ (chel1+"ото")
+ (ia2e chel1+"и")
+ (ia2e chel1+"ите")).s ! aform ;
+ VPluPerfect aform => regAdjective chetql ! aform ;
+ VPassive aform => regAdjective cheten ! aform ;
+ VPresPart aform => regAdjective chetqst ! aform ;
+ VImperative Sg => cheti;
+ VImperative Pl => case cheti of {
+ chet + "и" => chet + "ете";
+ ela => ela + "те"
+ };
+ VGerund => case chete of {
+ rabot + "и" => rabot + "ейки";
+ _ => chete + "йки"
+ }
+ } ;
+
+
+--2 Nouns
+
+ mkNoun : Str -> Str -> Str -> Str -> DGender -> N = \sg,pl,count,voc,g -> {
+ s = table {
+ NF Sg Indef => sg ;
+ NF Sg Def => case sg of {
+ _+"а"=>sg+"та" ;
+ _+"я"=>sg+"та" ;
+ _+"о"=>sg+"то" ;
+ _+"е"=>sg+"то" ;
+ _+"и"=>sg+"то" ;
+ s+"й"=>s +"я" ;
+ _+("тел"|"ар"|"яр"|"ден"
+ |"път"|"огън"|"сън"
+ |"кон"|"крал"|"цар"
+ |"зет"|"лакът"|"нокът")
+ =>sg +"я" ;
+ _ =>case g of {
+ DFem => sg+"та" ;
+ _ => sg+"а"
+ }
+ } ;
+ NF Pl Indef => pl ;
+ NF Pl Def => case pl of {
+ _+"а"=>pl+"та" ;
+ _+"е"=>pl+"те" ;
+ _+"и"=>pl+"те" ;
+ s+"я"=>s +"та" ;
+ s =>s +"те"
+ } ;
+ NFSgDefNom => case sg of {
+ _+"а"=>sg+"та" ;
+ _+"я"=>sg+"та" ;
+ _+"о"=>sg+"то" ;
+ _+"е"=>sg+"то" ;
+ _+"и"=>sg+"то" ;
+ s+"й"=>s +"ят" ;
+ _+("тел"|"ар"|"яр"|"ден"
+ |"път"|"огън"|"сън"
+ |"кон"|"крал"|"цар"
+ |"зет"|"лакът"|"нокът")
+ =>sg+"ят" ;
+ _ =>case g of {
+ DFem => sg+"та" ;
+ _ => sg+"ът"
+ }
+ } ;
+ NFPlCount => count ;
+ NFVocative => voc
+ } ;
+ g = g ;
+ lock_N = <>
+ } ;
+
+
+--2 Adjectives
+
+ mkAdjective : (_,_,_,_,_,_,_,_,_ : Str) -> A =
+ \dobyr,dobria,dobriat,dobra,dobrata,dobro,dobroto,dobri,dobrite -> {
+ s = table {
+ ASg Masc Indef => dobyr ;
+ ASg Masc Def => dobria ;
+ ASgMascDefNom => dobriat ;
+ ASg Fem Indef => dobra ;
+ ASg Fem Def => dobrata ;
+ ASg Neut Indef => dobro ;
+ ASg Neut Def => dobroto ;
+ APl Indef => dobri ;
+ APl Def => dobrite
+ } ;
+ adv = dobro ;
+ lock_A = <>
+ } ;
+} \ No newline at end of file
diff --git a/next-lib/src/bulgarian/MorphoFunsBul.gf b/next-lib/src/bulgarian/MorphoFunsBul.gf
new file mode 100644
index 000000000..678479d8e
--- /dev/null
+++ b/next-lib/src/bulgarian/MorphoFunsBul.gf
@@ -0,0 +1,184 @@
+--# -path=.:../abstract:../../prelude:../common
+
+resource MorphoFunsBul = open
+ Prelude,
+ CatBul,
+ MorphoBul
+ in {
+ flags coding=cp1251 ;
+
+
+oper
+--2 Adverbs
+
+-- Adverbs are not inflected. Most lexical ones have position
+-- after the verb. Some can be preverbal (e.g. "always").
+
+ mkAdv : Str -> Adv = \x -> ss x ** {lock_Adv = <>} ;
+ mkAdV : Str -> AdV = \x -> ss x ** {lock_AdV = <>} ;
+
+-- Adverbs modifying adjectives and sentences can also be formed.
+
+ mkAdA : Str -> AdA = \x -> ss x ** {lock_AdA = <>} ;
+
+
+--2 Adjectives
+--
+
+ AS, A2S, AV : Type = A ;
+ A2V : Type = A2 ;
+
+ mkA2 : A -> Prep -> A2 ;
+ mkA2 a p = a ** {c2 = p.s ; lock_A2 = <>} ;
+
+ mkAS : A -> AS ;
+ mkAS v = v ** {lock_A = <>} ;
+
+ mkA2S : A -> Prep -> A2S ;
+ mkA2S v p = mkA2 v p ** {lock_A = <>} ;
+
+ mkAV : A -> AV ;
+ mkAV v = v ** {lock_A = <>} ;
+
+ mkA2V : A -> Prep -> A2V ;
+ mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
+
+
+--2 Verbs
+--
+
+ medialV : V -> Case -> V ;
+ medialV v c = {s = v.s; vtype = VMedial c; lock_V=<>} ;
+
+ phrasalV : V -> Case -> V ;
+ phrasalV v c = {s = v.s; vtype = VPhrasal c; lock_V=<>} ;
+
+ actionV : VTable -> VTable -> V ;
+ actionV imperf perf = {
+ s = table {Imperf=>imperf; Perf=>perf};
+ vtype = VNormal;
+ lock_V=<>
+ } ;
+
+ stateV : VTable -> V ;
+ stateV vtable = {
+ s = \\_=>vtable;
+ vtype = VNormal;
+ lock_V=<>
+ } ;
+
+--3 Zero-place verbs
+--
+
+ V0 : Type = V ;
+ mkV0 : V -> V0 ;
+ mkV0 v = v ** {lock_V = <>} ;
+
+
+--3 Two-place verbs
+--
+
+ prepV2 : V -> Prep -> V2 ;
+ prepV2 v p = {s = v.s; c2 = p; vtype = v.vtype; lock_V2 = <>} ;
+
+ dirV2 : V -> V2 ;
+ dirV2 v = prepV2 v noPrep ;
+
+
+--3 Three-place verbs
+--
+-- Three-place (ditransitive) verbs need two prepositions, of which
+-- the first one or both can be absent.
+
+ mkV3 : V -> Prep -> Prep -> V3 ; -- speak, with, about
+ mkV3 v p q = {s = v.s; s1 = v.s1; c2 = p; c3 = q; vtype = v.vtype; lock_V3 = <>} ;
+
+ dirV3 : V -> Prep -> V3 ; -- give,_,to
+ dirV3 v p = mkV3 v noPrep p ;
+
+ dirdirV3 : V -> V3 ; -- give,_,_
+ dirdirV3 v = dirV3 v noPrep ;
+
+
+--3 Other verbs
+--
+
+-- V2S, V2V, V2Q : Type = V2 ;
+
+ mkV2S : V -> Prep -> V2S ;
+ mkV2S v p = prepV2 v p ** {lock_V2S = <>} ;
+
+ mkV2V : V -> Prep -> Prep -> V2V ;
+ mkV2V v p t = prepV2 v p ** {s4 = t ; lock_V2V = <>} ;
+
+ mkV2A : V -> Prep -> V2A ;
+ mkV2A v p = prepV2 v p ** {lock_V2A = <>} ;
+
+ mkV2Q : V -> Prep -> V2Q ;
+ mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ;
+
+ mkVS : V -> VS ;
+ mkVS v = v ** {lock_VS = <>} ;
+
+ mkVV : V -> VV ;
+ mkVV v = v ** {lock_VV = <>} ;
+
+ mkVA : V -> VA ;
+ mkVA v = v ** {lock_VA = <>} ;
+
+ mkV2A : V -> Prep -> V2A ;
+ mkV2A v p = prepV2 v p ** {lock_V2A = <>} ;
+
+ mkVQ : V -> VQ ;
+ mkVQ v = v ** {lock_VQ = <>} ;
+
+ mkV2Q : V -> Prep -> V2Q ;
+ mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ;
+
+
+--2 Nouns
+
+--3 Two-place Nouns
+--
+
+ prepN2 : N -> Prep -> N2 ;
+ prepN2 n p = {s = n.s; g = n.g; c2 = p; lock_N2 = <>} ;
+
+ dirN2 : N -> N2 ;
+ dirN2 n = prepN2 n noPrep ;
+
+
+--3 Three-place Nouns
+--
+
+ prepN3 : N -> Prep -> Prep -> N3 ;
+ prepN3 n p q = {s = n.s; g = n.g; c2 = p; c3 = q; lock_N3 = <>} ;
+
+ dirN3 : N -> Prep -> N3 ;
+ dirN3 n p = prepN3 n noPrep p ;
+
+ dirdirN3 : N -> N3 ;
+ dirdirN3 n = dirN3 n noPrep ;
+
+
+--2 Prepositions
+--
+-- A preposition as used for rection in the lexicon, as well as to
+-- build $PP$s in the resource API, just requires a string.
+
+ mkPrep : Str -> Case -> Prep = \p,c -> {s = p; c = c; lock_Prep = <>} ;
+ noPrep : Prep = mkPrep [] Acc ;
+
+
+--2 Proper Names
+--
+ mkPN : Str -> Gender -> PN ;
+ mkPN s g = {s = s; g = g ; lock_PN = <>} ;
+
+
+--2 IAdv
+--
+
+ mkIAdv : Str -> IAdv ;
+ mkIAdv s = {s = table {QDir=>s;QIndir=>s+"то"}; lock_IAdv = <>} ;
+}
diff --git a/next-lib/src/bulgarian/NounBul.gf b/next-lib/src/bulgarian/NounBul.gf
new file mode 100644
index 000000000..e9206e443
--- /dev/null
+++ b/next-lib/src/bulgarian/NounBul.gf
@@ -0,0 +1,178 @@
+concrete NounBul of Noun = CatBul ** open ResBul, Prelude in {
+ flags optimize=all_subs ; coding=cp1251 ;
+
+ lin
+ DetCN det cn =
+ { s = \\role => let nf = case <det.n,det.spec> of {
+ <Sg,Def> => case role of {
+ RSubj => NFSgDefNom ;
+ RVoc => NFVocative ;
+ _ => NF Sg Def
+ } ;
+ <Sg,Indef> => case role of {
+ RVoc => NFVocative ;
+ _ => NF Sg Indef
+ } ;
+ <Pl,Def> => NF det.n det.spec ;
+ <Pl,Indef> => case cn.g of {
+ DMascPersonal => NF Pl Indef;
+ _ => case det.countable of {
+ True => NFPlCount ;
+ False => NF Pl Indef
+ }
+ }
+ } ;
+ s = det.s ! True ! cn.g ! role ++ cn.s ! nf
+ in case role of {
+ RObj Dat => "на" ++ s;
+ _ => s
+ } ;
+ a = {gn = gennum cn.g det.n; p = P3} ;
+ } ;
+
+ DetNP det =
+ { s = \\role => let s = det.s ! False ! DNeut ! role
+ in case role of {
+ RObj Dat => "на" ++ s;
+ _ => s
+ } ;
+ a = {gn = gennum DNeut det.n; p = P3} ;
+ } ;
+
+ UsePN pn = { s = table {
+ RObj Dat => "на" ++ pn.s;
+ _ => pn.s
+ } ;
+ a = {gn = GSg pn.g; p = P3}
+ } ;
+ UsePron p = {s = p.s; a=p.a} ;
+
+ PredetNP pred np = {
+ s = \\c => pred.s ! np.a.gn ++ np.s ! c ;
+ a = np.a
+ } ;
+
+ PPartNP np v2 = {
+ s = \\c => np.s ! c ++ v2.s ! Perf ! VPassive (aform np.a.gn Indef c) ;
+ a = np.a
+ } ;
+
+ AdvNP np adv = {
+ s = \\c => np.s ! c ++ adv.s ;
+ a = np.a
+ } ;
+
+ 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 ;
+ 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 ;
+ n = num.n ;
+ countable = num.nonEmpty ;
+ spec=Indef
+ } ;
+
+ PossPron p = {
+ s = \\_ => p.gen ;
+ nonEmpty = True ;
+ spec = ResBul.Indef
+ } ;
+
+ NumSg = {s = \\_ => []; n = Sg; nonEmpty = False} ;
+ NumPl = {s = \\_ => []; n = Pl; nonEmpty = False} ;
+
+ NumCard n = n ** {nonEmpty = True} ;
+
+ NumDigits n = {s = \\gspec => n.s ! NCard gspec; n = n.n} ;
+ OrdDigits n = {s = \\aform => n.s ! NOrd aform} ;
+
+ NumNumeral numeral = {s = \\gspec => numeral.s ! NCard gspec; n = numeral.n; nonEmpty = True} ;
+ OrdNumeral numeral = {s = \\aform => numeral.s ! NOrd aform} ;
+
+ AdNum adn num = {s = \\gspec => adn.s ++ num.s ! gspec; n = num.n; nonEmpty = num.nonEmpty} ;
+
+ OrdSuperl a = {s = \\aform => "най" ++ "-" ++ a.s ! aform} ;
+
+ DefArt = {
+ s = table {
+ True => \\_ => [] ;
+ False => table {
+ ASg Masc _ => "той" ;
+ ASgMascDefNom => "той" ;
+ ASg Fem _ => "тя" ;
+ ASg Neut _ => "то" ;
+ APl _ => "те"
+ }
+ } ;
+ nonEmpty = False ;
+ spec = ResBul.Def
+ } ;
+
+ IndefArt = {
+ s = table {
+ True => \\_ => [] ;
+ False => table {
+ ASg Masc _ => "един" ;
+ ASgMascDefNom => "един" ;
+ ASg Fem _ => "една" ;
+ ASg Neut _ => "едно" ;
+ APl _ => "едни"
+ }
+ } ;
+ nonEmpty = False ;
+ spec = ResBul.Indef
+ } ;
+
+ MassNP cn = {
+ s = table {
+ RVoc => cn.s ! NFVocative ;
+ RObj Dat => "на" ++ cn.s ! (NF Sg Indef);
+ _ => cn.s ! (NF Sg Indef)
+ } ;
+ a = {gn = gennum cn.g Sg; p = P3} ;
+ } ;
+
+ 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} ;
+
+ Use2N3 f = {s = f.s ; g=f.g ; c2 = f.c2} ;
+ Use3N3 f = {s = f.s ; g=f.g ; c2 = f.c3} ;
+
+
+ AdjCN ap cn = {
+ s = \\nf => case ap.isPre of {
+ 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
+ } ;
+ RelCN cn rs = {
+ s = \\nf => cn.s ! nf ++ rs.s ! {gn=gennum cn.g (numNForm nf); p=P3} ;
+ g = cn.g
+ } ;
+ AdvCN cn ad = {
+ s = \\nf => cn.s ! nf ++ ad.s ;
+ g = cn.g
+ } ;
+
+ SentCN cn sc = {s = \\nf => cn.s ! nf ++ sc.s; g=DNeut} ;
+
+ ApposCN cn np = {s = \\nf => cn.s ! nf ++ np.s ! RSubj; g=cn.g} ;
+
+ RelNP np rs = {
+ s = \\r => np.s ! r ++ rs.s ! np.a ;
+ a = np.a
+ } ;
+}
diff --git a/next-lib/src/bulgarian/NumeralBul.gf b/next-lib/src/bulgarian/NumeralBul.gf
new file mode 100644
index 000000000..bf89fbe21
--- /dev/null
+++ b/next-lib/src/bulgarian/NumeralBul.gf
@@ -0,0 +1,134 @@
+concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in {
+ flags coding=cp1251 ;
+
+
+lincat
+ Digit = {s : DForm => CardOrd => Str} ;
+ Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
+ Sub100 = {s : CardOrd => Str; n : Number; i : Bool} ;
+ Sub1000 = {s : CardOrd => Str; n : Number; i : Bool} ;
+ Sub1000000 = {s : CardOrd => Str; n : Number} ;
+
+lin num x = x ;
+lin n2 = mkDigit "два" "двама" "две" "втори" "двеста" ;
+lin n3 = mkDigit "три" "трима" "три" "трети" "триста" ;
+lin n4 = mkDigit "четири" "четирима" "четири" "четвърти" "четиристотин" ;
+lin n5 = mkDigit "пет" "петима" "пет" "пети" "петстотин" ;
+lin n6 = mkDigit "шест" "шестима" "шест" "шести" "шестстотин" ;
+lin n7 = mkDigit "седем" "седмина" "седем" "седми" "седемстотин" ;
+lin n8 = mkDigit "осем" "осмина" "осем" "осми" "осемстотин" ;
+lin n9 = mkDigit "девет" "деветима" "девет" "девети" "деветстотин" ;
+
+lin pot01 =
+ {s = table {
+ unit => table {
+ NCard DMascIndef => "един" ;
+ NCard DMascDef => "единия" ;
+ NCard DMascDefNom => "единият" ;
+ NCard DMascPersonalIndef => "един" ;
+ NCard DMascPersonalDef => "единия" ;
+ NCard DMascPersonalDefNom => "единият" ;
+ NCard DFemIndef => "една" ;
+ NCard DFemDef => "едната" ;
+ NCard DNeutIndef => "едно" ;
+ NCard DNeutDef => "едното" ;
+ NOrd aform => case aform of {
+ ASg Masc Indef => "първи" ;
+ ASg Masc Def => "първия" ;
+ ASgMascDefNom => "първият" ;
+ ASg Fem Indef => "първа" ;
+ ASg Fem Def => "първата" ;
+ ASg Neut Indef => "първо" ;
+ ASg Neut Def => "първото" ;
+ APl Indef => "първи" ;
+ APl Def => "първите"
+ }
+ } ;
+ teen => mkCardOrd "единадесет" "единадесетима" "единадесет" "единадесети" ;
+ ten => mkCardOrd "десет" "десетима" "десет" "десети" ;
+ hundred => mkCardOrd "сто" "стотина" "сто" "стотен"
+ }
+ ;n = Sg
+ } ;
+lin pot0 d = d ** {n = Pl} ;
+
+lin pot110 = {s=pot01.s ! ten; n = Pl; i = True} ;
+lin pot111 = {s=pot01.s ! teen; n = Pl; i = True} ;
+lin pot1to19 d = {s = d.s ! teen; n = Pl; i = True} ;
+lin pot0as1 n = {s = n.s ! unit; n = n.n; i = True} ;
+lin pot1 d = {s = d.s ! ten; n = Pl; i = True} ;
+lin pot1plus d e = {
+ s = \\c => d.s ! ten ! NCard DMascIndef ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ;
+
+lin pot1as2 n = n ;
+lin pot2 n = {s = \\c => n.s ! hundred ! c; n = Pl; i = True} ;
+lin pot2plus d e = {
+ s = \\c => d.s ! hundred ! NCard DMascIndef ++ case e.i of {False => []; True => "и"} ++ e.s ! c ;
+ n = Pl ;
+ i = False
+ } ;
+
+lin pot2as3 n = n ;
+lin pot3 n = {
+ s = \\c => case n.n of {
+ Sg => mkCardOrd "хиляда" "хиляда" "хиляда" "хиляден" ! c ;
+ Pl => n.s ! NCard DFemIndef ++ mkCardOrd "хиляди" "хиляди" "хиляди" "хиляден" ! c
+ } ;
+ n = Pl
+ } ;
+lin pot3plus n m = {
+ s = \\c => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard DMascIndef ++ case m.i of {False => []; True => "и"} ++ m.s ! c ;
+ n = Pl
+ } ;
+
+
+-- numerals as sequences of digits
+
+ lincat
+ Dig = TDigit ;
+
+ lin
+ IDig d = d ** {tail = T1} ;
+
+ IIDig d i = {
+ s = \\o => d.s ! NCard DMascIndef ++ commaIf i.tail ++ i.s ! o ;
+ n = Pl ;
+ tail = inc i.tail
+ } ;
+
+ D_0 = mk2Dig "0" "0в" ;
+ D_1 = mk3Dig "1" "1ви" Sg ;
+ D_2 = mk2Dig "2" "2ри" ;
+ D_3 = mkDig "3" ;
+ D_4 = mkDig "4" ;
+ D_5 = mkDig "5" ;
+ D_6 = mkDig "6" ;
+ D_7 = mk2Dig "7" "7ми" ;
+ D_8 = mk2Dig "8" "8ми" ;
+ D_9 = mkDig "9" ;
+
+ oper
+ commaIf : DTail -> Str = \t -> case t of {
+ T3 => "," ;
+ _ => []
+ } ;
+
+ inc : DTail -> DTail = \t -> case t of {
+ T1 => T2 ;
+ T2 => T3 ;
+ T3 => T1
+ } ;
+
+ mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
+ mkDig : Str -> TDigit = \c -> mk2Dig c (c + "ти") ;
+
+ mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
+ s = table {NCard _ => c ; NOrd aform => regAdjective o ! aform} ;
+ n = n
+ } ;
+
+ TDigit = {
+ n : Number ;
+ s : CardOrd => Str
+ } ;
+}
diff --git a/next-lib/src/bulgarian/ParadigmsBul.gf b/next-lib/src/bulgarian/ParadigmsBul.gf
new file mode 100644
index 000000000..a22cc6fe9
--- /dev/null
+++ b/next-lib/src/bulgarian/ParadigmsBul.gf
@@ -0,0 +1,1460 @@
+resource ParadigmsBul = MorphoFunsBul ** open
+ Predef,
+ Prelude,
+ MorphoBul,
+ CatBul
+ in {
+ flags coding=cp1251 ;
+
+oper
+ mkN001 : Str -> N ;
+ mkN001 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"ове")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN002 : Str -> N ;
+ mkN002 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"я"+v1)
+ (v0+"е"+v1+"ове")
+ (v0+"я"+v1+"а")
+ (v0+"-")
+ DMasc ;
+ mkN002a : Str -> N ;
+ mkN002a base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"я"+v1)
+ (v0+"е"+v1+"ове")
+ (v0+"я"+v1+"а")
+ (v0+"-")
+ DMasc ;
+ mkN003 : Str -> N ;
+ mkN003 base = let v0 = tk 3 base;
+ v1 = last (base)
+ in mkNoun (v0+"ръ"+v1)
+ (v0+"ър"+v1+"ове")
+ (v0+"ър"+v1+"а")
+ (v0+"-")
+ DMasc ;
+ mkN004 : Str -> N ;
+ mkN004 base = let v0 = tk 4 base
+ in mkNoun (v0+"ятър")
+ (v0+"етрове")
+ (v0+"ятъра")
+ (v0+"-")
+ DMasc ;
+ mkN005 : Str -> N ;
+ mkN005 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"ове")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN006 : Str -> N ;
+ mkN006 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"ове")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN007 : Str -> N ;
+ mkN007 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN007b : Str -> N ;
+ mkN007b base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"а")
+ (v0+"о")
+ DMasc ;
+ mkN007a : Str -> N ;
+ mkN007a base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"а")
+ (v0+"е")
+ DMascPersonal ;
+ mkN008 : Str -> N ;
+ mkN008 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"е"+v1)
+ (v0+v1+"и")
+ (v0+"е"+v1+"а")
+ (v0+"-")
+ DMasc ;
+ mkN008a : Str -> N ;
+ mkN008a base = let v0 = tk 2 base
+ in mkNoun (v0+"ец")
+ (v0+"ци")
+ (v0+"-")
+ (v0+"ецо")
+ DMasc ;
+ mkN009 : Str -> N ;
+ mkN009 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"ъ"+v1)
+ (v0+v1+"и")
+ (v0+"ъ"+v1+"а")
+ (v0+"-")
+ DMasc ;
+ mkN009a : Str -> N ;
+ mkN009a base = let v0 = tk 2 base
+ in mkNoun (v0+"ър")
+ (v0+"рове")
+ (v0+"ъра")
+ (v0+"-")
+ DMasc ;
+ mkN010 : Str -> N ;
+ mkN010 base = let v0 = tk 2 base
+ in mkNoun (v0+"ър")
+ (v0+"ри")
+ (v0+"ра")
+ (v0+"-")
+ DMasc ;
+ mkN011 : Str -> N ;
+ mkN011 base = let v0 = tk 2 base
+ in mkNoun (v0+"ъм")
+ (v0+"ми")
+ (v0+"ъма")
+ (v0+"-")
+ DMasc ;
+ mkN012 : Str -> N ;
+ mkN012 base = let v0 = tk 3 base
+ in mkNoun (v0+"рък")
+ (v0+"ърци")
+ (v0+"-")
+ (v0+"ърко")
+ DMasc ;
+ mkN013 : Str -> N ;
+ mkN013 base = let v0 = tk 2 base
+ in mkNoun (v0+"ец")
+ (v0+"йци")
+ (v0+"-")
+ (v0+"ецо")
+ DMasc ;
+ mkN014 : Str -> N ;
+ mkN014 base = let v0 = tk 1 base
+ in mkNoun (v0+"к")
+ (v0+"ци")
+ (v0+"ка")
+ (v0+"-")
+ DMasc ;
+ mkN014a : Str -> N ;
+ mkN014a base = let v0 = tk 1 base
+ in mkNoun (v0+"к")
+ (v0+"ци")
+ (v0+"ка")
+ (v0+"ко")
+ DMasc ;
+ mkN015 : Str -> N ;
+ mkN015 base = let v0 = tk 1 base
+ in mkNoun (v0+"г")
+ (v0+"зи")
+ (v0+"га")
+ (v0+"-")
+ DMasc ;
+ mkN016 : Str -> N ;
+ mkN016 base = let v0 = tk 1 base
+ in mkNoun (v0+"х")
+ (v0+"си")
+ (v0+"ха")
+ (v0+"-")
+ DMasc ;
+ mkN017 : Str -> N ;
+ mkN017 base = let v0 = tk 1 base
+ in mkNoun (v0+"к")
+ (v0+"ни")
+ (v0+"ка")
+ (v0+"-")
+ DMasc ;
+ mkN018 : Str -> N ;
+ mkN018 base = let v0 = tk 2 base
+ in mkNoun (v0+"ин")
+ (v0+"и")
+ (v0+"-")
+ (v0+"ино")
+ DMasc ;
+ mkN018a : Str -> N ;
+ mkN018a base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"и"+v1)
+ (v0+"и")
+ (v0+"-")
+ (v0+"-")
+ DMasc ;
+ mkN019 : Str -> N ;
+ mkN019 base = let v0 = tk 2 base
+ in mkNoun (v0+"ък")
+ (v0+"ци")
+ (v0+"-")
+ (v0+"ко")
+ DMasc ;
+ mkN019a : Str -> N ;
+ mkN019a base = let v0 = tk 2 base
+ in mkNoun (v0+"ек")
+ (v0+"йци")
+ (v0+"ека")
+ (v0+"-")
+ DMasc ;
+ mkN020 : Str -> N ;
+ mkN020 base = let v0 = tk 3 base;
+ v1 = last (tk 2 base)
+ in mkNoun (v0+v1+"ец")
+ (v0+"ъ"+v1+"ци")
+ (v0+"-")
+ (v0+v1+"ецо")
+ DMasc ;
+ mkN021 : Str -> N ;
+ mkN021 base = let v0 = tk 3 base
+ in mkNoun (v0+"чин")
+ (v0+"ци")
+ (v0+"-")
+ (v0+"чино")
+ DMasc ;
+ mkN022 : Str -> N ;
+ mkN022 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"а")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN023 : Str -> N ;
+ mkN023 base = let v0 = tk 2 base
+ in mkNoun (v0+"ин")
+ (v0+"а")
+ (v0+"-")
+ (v0+"ине")
+ DMasc ;
+ mkN024a : Str -> N ;
+ mkN024a base = let v0 = tk 1 base
+ in mkNoun (v0+"з")
+ (v0+"зе")
+ (v0+"-")
+ (v0+"же")
+ DMasc ;
+ mkN024 : Str -> N ;
+ mkN024 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"е")
+ (v0+"е")
+ (v0+"о")
+ DMascPersonal ;
+ mkN025 : Str -> N ;
+ mkN025 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"я")
+ (v0+"-")
+ (v0+"е")
+ DMascPersonal ;
+ mkN026 : Str -> N ;
+ mkN026 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"илища")
+ (v0+"а")
+ (v0+"-")
+ DMasc ;
+ mkN027 : Str -> N ;
+ mkN027 base = let v0 = tk 2 base
+ in mkNoun (v0+"ец")
+ (v0+"овце")
+ (v0+"еца")
+ (v0+"-")
+ DMasc ;
+ mkN028 : Str -> N ;
+ mkN028 base = let v0 = tk 1 base
+ in mkNoun (v0+"й")
+ (v0+"еве")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN028a : Str -> N ;
+ mkN028a base = let v0 = tk 1 base
+ in mkNoun (v0+"й")
+ (v0+"йове")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN029 : Str -> N ;
+ mkN029 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"ьове")
+ (v0+"-")
+ (v0+"ко")
+ DMasc ;
+ mkN030 : Str -> N ;
+ mkN030 base = let v0 = tk 2 base
+ in mkNoun (v0+"ън")
+ (v0+"ньове")
+ (v0+"ъня")
+ (v0+"-")
+ DMasc ;
+ mkN031 : Str -> N ;
+ mkN031 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN031a : Str -> N ;
+ mkN031a base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"я")
+ (v0+"ю")
+ DMascPersonal ;
+ mkN032 : Str -> N ;
+ mkN032 base = let v0 = tk 1 base
+ in mkNoun (v0+"й")
+ (v0+"и")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN032a : Str -> N ;
+ mkN032a base = let v0 = tk 1 base
+ in mkNoun (v0+"й")
+ (v0+"и")
+ (v0+"я")
+ (v0+"ю")
+ DMascPersonal ;
+ mkN033 : Str -> N ;
+ mkN033 base = let v0 = tk 2 base
+ in mkNoun (v0+"ен")
+ (v0+"ни")
+ (v0+"ена")
+ (v0+"-")
+ DMasc ;
+ mkN034 : Str -> N ;
+ mkN034 base = let v0 = tk 2 base
+ in mkNoun (v0+"ът")
+ (v0+"ти")
+ (v0+"ътя")
+ (v0+"-")
+ DMasc ;
+ mkN035 : Str -> N ;
+ mkN035 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"е")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN035a : Str -> N ;
+ mkN035a base = let v0 = base
+ in mkNoun (v0)
+ (v0+"е")
+ (v0+"я")
+ (v0+"ю")
+ DMascPersonal ;
+ mkN036 : Str -> N ;
+ mkN036 base = let v0 = tk 1 base
+ in mkNoun (v0+"й")
+ (v0+"ища")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN037 : Str -> N ;
+ mkN037 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"ища")
+ (v0+"я")
+ (v0+"-")
+ DMasc ;
+ mkN038 : Str -> N ;
+ mkN038 base = let v0 = tk 1 base
+ in mkNoun (v0+"а")
+ (v0+"и")
+ (v0+"-")
+ (v0+"а")
+ DMascPersonal ;
+ mkN039 : Str -> N ;
+ mkN039 base = let v0 = tk 1 base
+ in mkNoun (v0+"я")
+ (v0+"и")
+ (v0+"-")
+ (v0+"-")
+ DMasc ;
+ mkN040 : Str -> N ;
+ mkN040 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"овци")
+ (v0+"-")
+ (v0+"о")
+ DMasc ;
+ mkN040a : Str -> N ;
+ mkN040a base = let v0 = base
+ in mkNoun (v0)
+ (v0+"-")
+ (v0+"-")
+ (v0+"-")
+ DMasc ;
+ mkN041 : Str -> N ;
+ mkN041 base = let v0 = tk 1 base
+ in mkNoun (v0+"а")
+ (v0+"и")
+ (v0+"и")
+ (v0+"-")
+ DFem ;
+ mkN041a : Str -> N ;
+ mkN041a base = let v0 = tk 1 base
+ in mkNoun (v0+"а")
+ (v0+"и")
+ (v0+"и")
+ (v0+"о")
+ DFem ;
+ mkN041b : Str -> N ;
+ mkN041b base = let v0 = tk 1 base
+ in mkNoun (v0+"а")
+ (v0+"и")
+ (v0+"и")
+ (v0+"е")
+ DFem ;
+ mkN042 : Str -> N ;
+ mkN042 base = let v0 = base
+ in mkNoun (v0)
+ (v0)
+ (v0)
+ (v0+"-")
+ DFem ;
+ mkN043 : Str -> N ;
+ mkN043 base = let v0 = tk 3 base;
+ v1 = last (tk 1 base)
+ in mkNoun (v0+"я"+v1+"а")
+ (v0+"е"+v1+"и")
+ (v0+"е"+v1+"и")
+ (v0+"-")
+ DFem ;
+ mkN043a : Str -> N ;
+ mkN043a base = let v0 = tk 4 base;
+ v1 = last (tk 2 base)
+ in mkNoun (v0+"я"+v1+"ка")
+ (v0+"е"+v1+"ки")
+ (v0+"е"+v1+"ки")
+ (v0+"-")
+ DFem ;
+ mkN044 : Str -> N ;
+ mkN044 base = let v0 = tk 1 base
+ in mkNoun (v0+"а")
+ (v0+"е")
+ (v0+"е")
+ (v0+"-")
+ DFem ;
+ mkN045 : Str -> N ;
+ mkN045 base = let v0 = tk 2 base
+ in mkNoun (v0+"ка")
+ (v0+"це")
+ (v0+"це")
+ (v0+"-")
+ DFem ;
+ mkN046 : Str -> N ;
+ mkN046 base = let v0 = tk 2 base
+ in mkNoun (v0+"га")
+ (v0+"зе")
+ (v0+"зе")
+ (v0+"-")
+ DFem ;
+ mkN047 : Str -> N ;
+ mkN047 base = let v0 = tk 1 base
+ in mkNoun (v0+"я")
+ (v0+"и")
+ (v0+"и")
+ (v0+"-")
+ DFem ;
+ mkN048 : Str -> N ;
+ mkN048 base = let v0 = tk 1 base
+ in mkNoun (v0+"я")
+ (v0+"е")
+ (v0+"е")
+ (v0+"ьо")
+ DFem ;
+ mkN049 : Str -> N ;
+ mkN049 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"и")
+ (v0+"и")
+ (v0+"-")
+ DFem ;
+ mkN050 : Str -> N ;
+ mkN050 base = let v0 = tk 2 base
+ in mkNoun (v0+"ен")
+ (v0+"ни")
+ (v0+"ни")
+ (v0+"-")
+ DFem ;
+ mkN051 : Str -> N ;
+ mkN051 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkNoun (v0+"ъ"+v1)
+ (v0+v1+"и")
+ (v0+v1+"и")
+ (v0+"-")
+ DFem ;
+ mkN052 : Str -> N ;
+ mkN052 base = let v0 = tk 5 base
+ in mkNoun (v0+"ялост")
+ (v0+"ялости")
+ (v0+"ялости")
+ (v0+"-")
+ DFem ;
+ mkN052a : Str -> N ;
+ mkN052a base = let v0 = tk 6 base
+ in mkNoun (v0+"ярност")
+ (v0+"ярности")
+ (v0+"ярности")
+ (v0+"-")
+ DFem ;
+ mkN053 : Str -> N ;
+ mkN053 base = let v0 = tk 3 base;
+ v1 = last (base)
+ in mkNoun (v0+"ръ"+v1)
+ (v0+"ър"+v1+"и")
+ (v0+"ър"+v1+"и")
+ (v0+"-")
+ DFem ;
+ mkN054 : Str -> N ;
+ mkN054 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"а")
+ (v0+"а")
+ (v0+"о")
+ DNeut ;
+ mkN055 : Str -> N ;
+ mkN055 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"а")
+ (v0+"а")
+ (v0+"о")
+ DNeut ;
+ mkN056 : Str -> N ;
+ mkN056 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"а")
+ (v0+"а")
+ (v0+"о")
+ DNeut ;
+ mkN057 : Str -> N ;
+ mkN057 base = let v0 = tk 3 base;
+ v1 = last (tk 1 base)
+ in mkNoun (v0+"я"+v1+"о")
+ (v0+"е"+v1+"а")
+ (v0+"е"+v1+"а")
+ (v0+"я"+v1+"о")
+ DNeut ;
+ mkN057a : Str -> N ;
+ mkN057a base = let v0 = tk 4 base
+ in mkNoun (v0+"ясто")
+ (v0+"еста")
+ (v0+"еста")
+ (v0+"ясто")
+ DNeut ;
+ mkN058 : Str -> N ;
+ mkN058 base = let v0 = tk 3 base
+ in mkNoun (v0+"яно")
+ (v0+"ена")
+ (v0+"ена")
+ (v0+"яно")
+ DNeut ;
+ mkN059 : Str -> N ;
+ mkN059 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"ене")
+ (v0+"ене")
+ (v0+"о")
+ DNeut ;
+ mkN060 : Str -> N ;
+ mkN060 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"еса")
+ (v0+"еса")
+ (v0+"о")
+ DNeut ;
+ mkN061 : Str -> N ;
+ mkN061 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"а")
+ (v0+"а")
+ (v0+"о")
+ DNeut ;
+ mkN062 : Str -> N ;
+ mkN062 base = let v0 = tk 1 base
+ in mkNoun (v0+"о")
+ (v0+"и")
+ (v0+"и")
+ (v0+"о")
+ DNeut ;
+ mkN063 : Str -> N ;
+ mkN063 base = let v0 = tk 2 base
+ in mkNoun (v0+"ко")
+ (v0+"чи")
+ (v0+"чи")
+ (v0+"ко")
+ DNeut ;
+ mkN064 : Str -> N ;
+ mkN064 base = let v0 = tk 2 base
+ in mkNoun (v0+"хо")
+ (v0+"ши")
+ (v0+"ши")
+ (v0+"хо")
+ DNeut ;
+ mkN065 : Str -> N ;
+ mkN065 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"та")
+ (v0+"та")
+ (v0)
+ DNeut ;
+ mkN066 : Str -> N ;
+ mkN066 base = let v0 = tk 1 base
+ in mkNoun (v0+"е")
+ (v0+"а")
+ (v0+"а")
+ (v0+"е")
+ DNeut ;
+ mkN067 : Str -> N ;
+ mkN067 base = let v0 = tk 2 base
+ in mkNoun (v0+"те")
+ (v0+"ца")
+ (v0+"ца")
+ (v0+"те")
+ DNeut ;
+ mkN068 : Str -> N ;
+ mkN068 base = let v0 = tk 1 base
+ in mkNoun (v0+"е")
+ (v0+"я")
+ (v0+"я")
+ (v0+"е")
+ DNeut ;
+ mkN069 : Str -> N ;
+ mkN069 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"на")
+ (v0+"на")
+ (v0)
+ DNeut ;
+ mkN070 : Str -> N ;
+ mkN070 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"са")
+ (v0+"са")
+ (v0)
+ DNeut ;
+ mkN071 : Str -> N ;
+ mkN071 base = let v0 = tk 1 base
+ in mkNoun (v0+"е")
+ (v0+"ия")
+ (v0+"ия")
+ (v0+"е")
+ DNeut ;
+ mkN072 : Str -> N ;
+ mkN072 base = let v0 = tk 1 base
+ in mkNoun (v0+"е")
+ (v0+"я")
+ (v0+"я")
+ (v0+"е")
+ DNeut ;
+ mkN073 : Str -> N ;
+ mkN073 base = let v0 = base
+ in mkNoun (v0)
+ (v0+"та")
+ (v0+"та")
+ (v0)
+ DNeut ;
+ mkN074 : Str -> N ;
+ mkN074 base = let v0 = tk 1 base
+ in mkNoun (v0+"-")
+ (v0)
+ (v0)
+ (v0+"-")
+ DNeut ;
+ mkN075 : Str -> N ;
+ mkN075 base = let v0 = tk 1 base
+ in mkNoun (v0+"-")
+ (v0)
+ (v0)
+ (v0+"-")
+ DNeut ;
+ mkA076 : Str -> A ;
+ mkA076 base = let v0 = base
+ in mkAdjective (v0)
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"а")
+ (v0+"ата")
+ (v0+"о")
+ (v0+"ото")
+ (v0+"и")
+ (v0+"ите") ;
+ mkA077 : Str -> A ;
+ mkA077 base = let v0 = base
+ in mkAdjective (v0)
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"а")
+ (v0+"ата")
+ (v0+"е")
+ (v0+"ето")
+ (v0+"и")
+ (v0+"ите") ;
+ mkA078 : Str -> A ;
+ mkA078 base = let v0 = tk 1 base
+ in adjAdv (mkAdjective (v0+"и")
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"а")
+ (v0+"ата")
+ (v0+"о")
+ (v0+"ото")
+ (v0+"и")
+ (v0+"ите")) (v0+"и") ;
+ mkA079 : Str -> A ;
+ mkA079 base = let v0 = tk 2 base
+ in mkAdjective (v0+"ен")
+ (v0+"ния")
+ (v0+"ният")
+ (v0+"на")
+ (v0+"ната")
+ (v0+"но")
+ (v0+"ното")
+ (v0+"ни")
+ (v0+"ните") ;
+ mkA080 : Str -> A ;
+ mkA080 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkAdjective (v0+"ъ"+v1)
+ (v0+v1+"ия")
+ (v0+v1+"ият")
+ (v0+v1+"а")
+ (v0+v1+"ата")
+ (v0+v1+"о")
+ (v0+v1+"ото")
+ (v0+v1+"и")
+ (v0+v1+"ите") ;
+ mkA081 : Str -> A ;
+ mkA081 base = let v0 = tk 2 base;
+ v1 = last (base)
+ in mkAdjective (v0+"я"+v1)
+ (v0+"е"+v1+"ия")
+ (v0+"е"+v1+"ият")
+ (v0+"я"+v1+"а")
+ (v0+"я"+v1+"ата")
+ (v0+"я"+v1+"о")
+ (v0+"я"+v1+"ото")
+ (v0+"е"+v1+"и")
+ (v0+"е"+v1+"ите") ;
+ mkA082 : Str -> A ;
+ mkA082 base = let v0 = tk 3 base;
+ v1 = last (base)
+ in mkAdjective (v0+"ръ"+v1)
+ (v0+"ър"+v1+"ия")
+ (v0+"ър"+v1+"ият")
+ (v0+"ър"+v1+"а")
+ (v0+"ър"+v1+"ата")
+ (v0+"ър"+v1+"о")
+ (v0+"ър"+v1+"ото")
+ (v0+"ър"+v1+"и")
+ (v0+"ър"+v1+"ите") ;
+ mkA082a : Str -> A ;
+ mkA082a base = let v0 = tk 5 base
+ in mkAdjective (v0+"ързък")
+ (v0+"ръзкия")
+ (v0+"ръзкият")
+ (v0+"ръзка")
+ (v0+"ръзката")
+ (v0+"ръзко")
+ (v0+"ръзкото")
+ (v0+"ръзки")
+ (v0+"ръзките") ;
+ mkA083 : Str -> A ;
+ mkA083 base = let v0 = tk 4 base;
+ v1 = last (tk 2 base)
+ in mkAdjective (v0+"я"+v1+"ък")
+ (v0+"е"+v1+"кия")
+ (v0+"е"+v1+"кият")
+ (v0+"я"+v1+"ка")
+ (v0+"я"+v1+"ката")
+ (v0+"я"+v1+"ко")
+ (v0+"я"+v1+"кото")
+ (v0+"е"+v1+"ки")
+ (v0+"е"+v1+"ките") ;
+ mkA084 : Str -> A ;
+ mkA084 base = let v0 = tk 4 base;
+ v1 = last (tk 2 base)
+ in mkAdjective (v0+"е"+v1+"ен")
+ (v0+"е"+v1+"ния")
+ (v0+"е"+v1+"ният")
+ (v0+"я"+v1+"на")
+ (v0+"я"+v1+"ната")
+ (v0+"я"+v1+"но")
+ (v0+"я"+v1+"ното")
+ (v0+"е"+v1+"ни")
+ (v0+"е"+v1+"ните") ;
+ mkA084a : Str -> A ;
+ mkA084a base = let v0 = tk 5 base
+ in mkAdjective (v0+"естен")
+ (v0+"естния")
+ (v0+"естният")
+ (v0+"ястна")
+ (v0+"ястната")
+ (v0+"ястно")
+ (v0+"ястнота")
+ (v0+"естни")
+ (v0+"естните") ;
+ mkA085 : Str -> A ;
+ mkA085 base = let v0 = tk 2 base
+ in mkAdjective (v0+"ен")
+ (v0+"йния")
+ (v0+"йният")
+ (v0+"йна")
+ (v0+"йната")
+ (v0+"йно")
+ (v0+"йното")
+ (v0+"йни")
+ (v0+"йните") ;
+ mkA086 : Str -> A ;
+ mkA086 base = let v0 = base
+ in mkAdjective (v0)
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"я")
+ (v0+"ята")
+ (v0+"ьо")
+ (v0+"ьото")
+ (v0+"и")
+ (v0+"ите") ;
+ mkA087 : Str -> A ;
+ mkA087 base = let v0 = tk 1 base
+ in mkAdjective (v0+"и")
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"а")
+ (v0+"ата")
+ (v0+"е")
+ (v0+"ето")
+ (v0+"и")
+ (v0+"ите") ;
+ mkA088 : Str -> A ;
+ mkA088 base = let v0 = tk 1 base
+ in mkAdjective (v0+"и")
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"я")
+ (v0+"ята")
+ (v0+"е")
+ (v0+"ето")
+ (v0+"и")
+ (v0+"ите") ;
+ mkA089 : Str -> A ;
+ mkA089 base = let v0 = tk 1 base
+ in mkAdjective (v0+"-")
+ (v0+"ия")
+ (v0+"ият")
+ (v0+"-")
+ (v0+"ата")
+ (v0+"-")
+ (v0+"ото")
+ (v0+"-")
+ (v0+"ите") ;
+ mkA089a : Str -> A ;
+ mkA089a base = let v0 = base
+ in mkAdjective (v0)
+ (v0)
+ (v0)
+ (v0)
+ (v0)
+ (v0)
+ (v0)
+ (v0)
+ (v0) ;
+ mkV142 : Str -> VTable ;
+ mkV142 base = let v0 = tk 3 base
+ in mkVerb (v0+"съм")
+ (v0+"е")
+ (v0+"бях")
+ (v0+"бях")
+ (v0+"бил")
+ (v0+"бил")
+ (v0+"-")
+ (v0+"-")
+ (v0+"бъди") ;
+ mkV143 : Str -> VTable ;
+ mkV143 base = let v0 = tk 3 base
+ in mkVerb (v0+"ъда")
+ (v0+"ъде")
+ (v0+"их")
+ (v0+"ъдех")
+ (v0+"ил")
+ (v0+"ъдел")
+ (v0+"-")
+ (v0+"ъдещ")
+ (v0+"ъди") ;
+ mkV144 : Str -> VTable ;
+ mkV144 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"-")
+ (v0+"-")
+ (v0+"-") ;
+ mkV145 : Str -> VTable ;
+ mkV145 base = let v0 = tk 2 base;
+ v1 = last (tk 1 base)
+ in mkVerb (v0+v1+"а")
+ (v0+v1+"е")
+ (v0+v1+"ох")
+ (v0+v1+"ях")
+ (v0+"л")
+ (v0+v1+"ял")
+ (v0+v1+"ен")
+ (v0+v1+"ящ")
+ (v0+v1+"и") ;
+ mkV145a : Str -> VTable ;
+ mkV145a base = let v0 = tk 3 base;
+ v1 = last (tk 2 base)
+ in mkVerb (v0+v1+"са")
+ (v0+v1+"се")
+ (v0+v1+"сох")
+ (v0+v1+"сях")
+ (v0+v1+"съл")
+ (v0+v1+"сял")
+ (v0+v1+"сен")
+ (v0+v1+"сящ")
+ (v0+v1+"си") ;
+ mkV145b : Str -> VTable ;
+ mkV145b base = let v0 = tk 2 base
+ in mkVerb (v0+"та")
+ (v0+"те")
+ (v0+"тох")
+ (v0+"тях")
+ (v0+"ъл")
+ (v0+"тял")
+ (v0+"-")
+ (v0+"тящ")
+ (v0+"ти") ;
+ mkV146 : Str -> VTable ;
+ mkV146 base = let v0 = tk 2 base
+ in mkVerb (v0+"да")
+ (v0+"де")
+ (v0+"дох")
+ (v0+"дех")
+ (v0+"шъл")
+ (v0+"дел")
+ (v0+"-")
+ (v0+"-")
+ (v0+"ди") ;
+ mkV146a : Str -> VTable ;
+ mkV146a base = let v0 = tk 3 base
+ in mkVerb (v0+"йда")
+ (v0+"йде")
+ (v0+"йдох")
+ (v0+"йдех")
+ (v0+"шъл")
+ (v0+"йдел")
+ (v0+"-")
+ (v0+"-")
+ (v0+"йди") ;
+ mkV147 : Str -> VTable ;
+ mkV147 base = let v0 = tk 3 base
+ in mkVerb (v0+"яза")
+ (v0+"езе")
+ (v0+"язох")
+ (v0+"езех")
+ (v0+"язъл")
+ (v0+"езел")
+ (v0+"-")
+ (v0+"-")
+ (v0+"ез") ;
+ mkV148 : Str -> VTable ;
+ mkV148 base = let v0 = tk 2 base
+ in mkVerb (v0+"ка")
+ (v0+"че")
+ (v0+"кох")
+ (v0+"чех")
+ (v0+"къл")
+ (v0+"чел")
+ (v0+"чен")
+ (v0+"чащ")
+ (v0+"чи") ;
+ mkV149 : Str -> VTable ;
+ mkV149 base = let v0 = tk 3 base
+ in mkVerb (v0+"ека")
+ (v0+"ече")
+ (v0+"якох")
+ (v0+"ечех")
+ (v0+"якъл")
+ (v0+"ечел")
+ (v0+"ечен")
+ (v0+"-")
+ (v0+"ечи") ;
+ mkV150 : Str -> VTable ;
+ mkV150 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"ян")
+ (v0+"-")
+ (v0+"и") ;
+ mkV150a : Str -> VTable ;
+ mkV150a base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"-")
+ (v0+"-")
+ (v0+"и") ;
+ mkV151 : Str -> VTable ;
+ mkV151 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ах")
+ (v0+"ях")
+ (v0+"ал")
+ (v0+"ял")
+ (v0+"ящ")
+ (v0+"ан")
+ (v0+"и") ;
+ mkV152 : Str -> VTable ;
+ mkV152 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ах")
+ (v0+"ех")
+ (v0+"ал")
+ (v0+"ел")
+ (v0+"ат")
+ (v0+"-")
+ (v0+"и") ;
+ mkV152a : Str -> VTable ;
+ mkV152a base = let v0 = tk 4 base
+ in mkVerb (v0+"ягна")
+ (v0+"егне")
+ (v0+"ягнах")
+ (v0+"ягнех")
+ (v0+"ягнал")
+ (v0+"ягнел")
+ (v0+"ягнат")
+ (v0+"-")
+ (v0+"егни") ;
+ mkV153 : Str -> VTable ;
+ mkV153 base = let v0 = tk 3 base
+ in mkVerb (v0+"яна")
+ (v0+"ене")
+ (v0+"янах")
+ (v0+"енех")
+ (v0+"янал")
+ (v0+"енел")
+ (v0+"янат")
+ (v0+"-")
+ (v0+"ени") ;
+ mkV154 : Str -> VTable ;
+ mkV154 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"е")
+ (v0+"ах")
+ (v0+"ех")
+ (v0+"ал")
+ (v0+"ел")
+ (v0+"ан")
+ (v0+"ещ")
+ (v0+"и") ;
+ mkV155 : Str -> VTable ;
+ mkV155 base = let v0 = tk 2 base
+ in mkVerb (v0+"ча")
+ (v0+"че")
+ (v0+"ках")
+ (v0+"чех")
+ (v0+"кал")
+ (v0+"чел")
+ (v0+"-")
+ (v0+"чещ")
+ (v0+"чи") ;
+ mkV156 : Str -> VTable ;
+ mkV156 base = let v0 = tk 2 base
+ in mkVerb (v0+"жа")
+ (v0+"же")
+ (v0+"зах")
+ (v0+"жех")
+ (v0+"зал")
+ (v0+"жел")
+ (v0+"зан")
+ (v0+"-")
+ (v0+"жи") ;
+ mkV157 : Str -> VTable ;
+ mkV157 base = let v0 = tk 3 base
+ in mkVerb (v0+"ежа")
+ (v0+"еже")
+ (v0+"язах")
+ (v0+"ежех")
+ (v0+"язал")
+ (v0+"ежел")
+ (v0+"язан")
+ (v0+"ежещ")
+ (v0+"ежи") ;
+ mkV158 : Str -> VTable ;
+ mkV158 base = let v0 = tk 2 base
+ in mkVerb (v0+"жа")
+ (v0+"же")
+ (v0+"гах")
+ (v0+"жех")
+ (v0+"гал")
+ (v0+"жел")
+ (v0+"ган")
+ (v0+"жещ")
+ (v0+"жи") ;
+ mkV159 : Str -> VTable ;
+ mkV159 base = let v0 = tk 2 base
+ in mkVerb (v0+"ша")
+ (v0+"ше")
+ (v0+"сах")
+ (v0+"шех")
+ (v0+"сал")
+ (v0+"шел")
+ (v0+"сан")
+ (v0+"шещ")
+ (v0+"ши") ;
+ mkV160 : Str -> VTable ;
+ mkV160 base = let v0 = tk 2 base
+ in mkVerb (v0+"ея")
+ (v0+"ее")
+ (v0+"ях")
+ (v0+"еех")
+ (v0+"ял")
+ (v0+"еел")
+ (v0+"ян")
+ (v0+"еещ")
+ (v0+"ей") ;
+ mkV160a : Str -> VTable ;
+ mkV160a base = let v0 = tk 2 base
+ in mkVerb (v0+"ея")
+ (v0+"ее")
+ (v0+"ах")
+ (v0+"еех")
+ (v0+"ал")
+ (v0+"еел")
+ (v0+"ан")
+ (v0+"еещ")
+ (v0+"ей") ;
+ mkV161 : Str -> VTable ;
+ mkV161 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"е")
+ (v0+"х")
+ (v0+"ех")
+ (v0+"л")
+ (v0+"ел")
+ (v0+"н")
+ (v0+"ещ")
+ (v0+"й") ;
+ mkV161a : Str -> VTable ;
+ mkV161a base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"е")
+ (v0+"х")
+ (v0+"ех")
+ (v0+"л")
+ (v0+"ел")
+ (v0+"т")
+ (v0+"ещ")
+ (v0+"й") ;
+ mkV162 : Str -> VTable ;
+ mkV162 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"е")
+ (v0+"ях")
+ (v0+"ех")
+ (v0+"ял")
+ (v0+"ел")
+ (v0+"-")
+ (v0+"ещ")
+ (v0+"й") ;
+ mkV163 : Str -> VTable ;
+ mkV163 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"е")
+ (v0+"х")
+ (v0+"ех")
+ (v0+"л")
+ (v0+"ел")
+ (v0+"т")
+ (v0+"ещ")
+ (v0+"й") ;
+ mkV164 : Str -> VTable ;
+ mkV164 base = let v0 = tk 2 base
+ in mkVerb (v0+"ея")
+ (v0+"ее")
+ (v0+"ях")
+ (v0+"еех")
+ (v0+"ял")
+ (v0+"еел")
+ (v0+"ят")
+ (v0+"еещ")
+ (v0+"ей") ;
+ mkV165 : Str -> VTable ;
+ mkV165 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"е")
+ (v0+"ох")
+ (v0+"ех")
+ (v0+"-")
+ (v0+"ел")
+ (v0+"-")
+ (v0+"ещ")
+ (v0+"и") ;
+ mkV166 : Str -> VTable ;
+ mkV166 base = let v0 = tk 2 base
+ in mkVerb (v0+"га")
+ (v0+"же")
+ (v0+"жах")
+ (v0+"жех")
+ (v0+"гъл")
+ (v0+"жел")
+ (v0+"-")
+ (v0+"жещ")
+ (v0+"-") ;
+ mkV167 : Str -> VTable ;
+ mkV167 base = let v0 = tk 2 base
+ in mkVerb (v0+"ка")
+ (v0+"че")
+ (v0+"ках")
+ (v0+"чех")
+ (v0+"кал")
+ (v0+"чел")
+ (v0+"кан")
+ (v0+"чещ")
+ (v0+"чи") ;
+ mkV168 : Str -> VTable ;
+ mkV168 base = let v0 = tk 1 base
+ in mkVerb (v0+"м")
+ (v0+"де")
+ (v0+"дох")
+ (v0+"дях")
+ (v0+"л")
+ (v0+"дял")
+ (v0+"ден")
+ (v0+"-")
+ (v0+"й") ;
+ mkV169 : Str -> VTable ;
+ mkV169 base = let v0 = tk 1 base
+ in mkVerb (v0+"м")
+ (v0+"де")
+ (v0+"дох")
+ (v0+"дях")
+ (v0+"л")
+ (v0+"дял")
+ (v0+"ден")
+ (v0+"дещ")
+ (v0+"ж") ;
+ mkV170 : Str -> VTable ;
+ mkV170 base = let v0 = tk 3 base
+ in mkVerb (v0+"ера")
+ (v0+"ере")
+ (v0+"рах")
+ (v0+"ерях")
+ (v0+"рал")
+ (v0+"ерял")
+ (v0+"ран")
+ (v0+"ерящ")
+ (v0+"ери") ;
+ mkV171 : Str -> VTable ;
+ mkV171 base = let v0 = tk 2 base
+ in mkVerb (v0+"ма")
+ (v0+"ме")
+ (v0+"х")
+ (v0+"мех")
+ (v0+"л")
+ (v0+"мел")
+ (v0+"т")
+ (v0+"-")
+ (v0+"ми") ;
+ mkV172 : Str -> VTable ;
+ mkV172 base = let v0 = tk 4 base
+ in mkVerb (v0+"ълна")
+ (v0+"ълне")
+ (v0+"лех")
+ (v0+"ълнех")
+ (v0+"лел")
+ (v0+"ълнел")
+ (v0+"ълнат")
+ (v0+"ълнещ")
+ (v0+"ълни") ;
+ mkV173 : Str -> VTable ;
+ mkV173 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"их")
+ (v0+"ех")
+ (v0+"ил")
+ (v0+"ел")
+ (v0+"ен")
+ (v0+"ещ")
+ (v0+"и") ;
+ mkV174 : Str -> VTable ;
+ mkV174 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"их")
+ (v0+"ях")
+ (v0+"ил")
+ (v0+"ял")
+ (v0+"ен")
+ (v0+"ящ")
+ (v0+"и") ;
+ mkV175 : Str -> VTable ;
+ mkV175 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"их")
+ (v0+"ях")
+ (v0+"ил")
+ (v0+"ял")
+ (v0+"ен")
+ (v0+"ящ")
+ (v0+"й") ;
+ mkV176 : Str -> VTable ;
+ mkV176 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"и")
+ (v0+"их")
+ (v0+"ех")
+ (v0+"ил")
+ (v0+"ел")
+ (v0+"ен")
+ (v0+"ещ")
+ (v0+"и") ;
+ mkV177 : Str -> VTable ;
+ mkV177 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"ян")
+ (v0+"ящ")
+ (v0+"и") ;
+ mkV178 : Str -> VTable ;
+ mkV178 base = let v0 = tk 1 base
+ in mkVerb (v0+"а")
+ (v0+"и")
+ (v0+"ах")
+ (v0+"ех")
+ (v0+"ал")
+ (v0+"ел")
+ (v0+"-")
+ (v0+"ащ")
+ (v0+"и") ;
+ mkV179 : Str -> VTable ;
+ mkV179 base = let v0 = tk 4 base
+ in mkVerb (v0+"ържа")
+ (v0+"ържи")
+ (v0+"ържах")
+ (v0+"ържех")
+ (v0+"ържал")
+ (v0+"ържел")
+ (v0+"ържан")
+ (v0+"ържащ")
+ (v0+"ръж") ;
+ mkV180 : Str -> VTable ;
+ mkV180 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"-")
+ (v0+"ящ")
+ (v0+"й") ;
+ mkV181 : Str -> VTable ;
+ mkV181 base = let v0 = tk 2 base
+ in mkVerb (v0+"дя")
+ (v0+"ди")
+ (v0+"дях")
+ (v0+"дех")
+ (v0+"дял")
+ (v0+"дел")
+ (v0+"дян")
+ (v0+"-")
+ (v0+"ж") ;
+ mkV182 : Str -> VTable ;
+ mkV182 base = let v0 = tk 1 base
+ in mkVerb (v0+"я")
+ (v0+"и")
+ (v0+"ах")
+ (v0+"ях")
+ (v0+"ал")
+ (v0+"ял")
+ (v0+"-")
+ (v0+"ящ")
+ (v0+"и") ;
+ mkV183 : Str -> VTable ;
+ mkV183 base = let v0 = tk 3 base
+ in mkVerb (v0+"ежа")
+ (v0+"ежи")
+ (v0+"язах")
+ (v0+"ежех")
+ (v0+"язал")
+ (v0+"ежел")
+ (v0+"язан")
+ (v0+"ежещ")
+ (v0+"ежи") ;
+ mkV184 : Str -> VTable ;
+ mkV184 base = let v0 = tk 3 base
+ in mkVerb (v0+"еля")
+ (v0+"ели")
+ (v0+"лях")
+ (v0+"елех")
+ (v0+"лял")
+ (v0+"елел")
+ (v0+"лян")
+ (v0+"елещ")
+ (v0+"ели") ;
+ mkV185 : Str -> VTable ;
+ mkV185 base = let v0 = tk 3 base
+ in mkVerb (v0+"оля")
+ (v0+"оли")
+ (v0+"лах")
+ (v0+"олех")
+ (v0+"лал")
+ (v0+"олел")
+ (v0+"лан")
+ (v0+"олещ")
+ (v0+"оли") ;
+ mkV186 : Str -> VTable ;
+ mkV186 base = let v0 = tk 2 base
+ in mkVerb (v0+"ам")
+ (v0+"а")
+ (v0+"ах")
+ (v0+"ах")
+ (v0+"ал")
+ (v0+"ал")
+ (v0+"ан")
+ (v0+"ащ")
+ (v0+"ай") ;
+ mkV187 : Str -> VTable ;
+ mkV187 base = let v0 = tk 2 base
+ in mkVerb (v0+"ям")
+ (v0+"я")
+ (v0+"ях")
+ (v0+"ях")
+ (v0+"ял")
+ (v0+"ял")
+ (v0+"ян")
+ (v0+"ящ")
+ (v0+"яй") ;
+
+ adjAdv : A -> Str -> A =
+ \a,adv -> {s = a.s; adv = adv; lock_A=<>} ;
+} \ No newline at end of file
diff --git a/next-lib/src/bulgarian/PhraseBul.gf b/next-lib/src/bulgarian/PhraseBul.gf
new file mode 100644
index 000000000..0d3524832
--- /dev/null
+++ b/next-lib/src/bulgarian/PhraseBul.gf
@@ -0,0 +1,25 @@
+concrete PhraseBul of Phrase = CatBul ** open Prelude, ResBul in {
+ flags coding=cp1251 ;
+
+
+ lin
+ PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
+
+ UttS s = s ;
+ UttQS qs = {s = qs.s ! QDir} ;
+ UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Masc} ;
+ UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! GPl} ;
+ UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! GPl} ;
+
+ UttIP ip = {s = ip.s ! RSubj ! QDir} ;
+ UttIAdv iadv = {s = iadv.s ! QDir} ;
+ UttNP np = {s = np.s ! RSubj} ;
+ UttVP vp = {s = daComplex vp ! Perf ! agrP3 (GSg Neut)} ;
+ UttAdv adv = adv ;
+
+ NoPConj = {s = []} ;
+ PConjConj conj = {s = conj.s ++ linCoord!conj.conj} ;
+
+ NoVoc = {s = []} ;
+ VocNP np = {s = "," ++ np.s ! RVoc} ;
+}
diff --git a/next-lib/src/bulgarian/QuestionBul.gf b/next-lib/src/bulgarian/QuestionBul.gf
new file mode 100644
index 000000000..1032e6b44
--- /dev/null
+++ b/next-lib/src/bulgarian/QuestionBul.gf
@@ -0,0 +1,63 @@
+concrete QuestionBul of Question = CatBul ** open ResBul, Prelude in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+ lin
+
+ QuestCl cl = {
+ s = \\t,a,p =>
+ let cls = cl.s ! t ! a ! p
+ in table {
+ QDir => cls ! Quest ;
+ QIndir => "ако" ++ cls ! Main
+ } ---- "whether" in ExtEng
+ } ;
+
+ QuestVP ip vp = {
+ s = \\t,a,b,qform =>
+ (mkClause (ip.s ! RSubj ! qform) {gn = ip.gn ; p = P3} vp).s ! t ! a ! b ! Main
+ } ;
+
+ QuestSlash ip slash =
+ mkQuestion {s = \\spec => slash.c2.s ++ ip.s ! (RObj slash.c2.c) ! spec}
+ {s = slash.s ! (agrP3 ip.gn) } ;
+
+ QuestIAdv iadv cl = mkQuestion iadv cl ;
+
+ QuestIComp icomp np =
+ mkQuestion icomp (mkClause (np.s ! RSubj) np.a (predV verbBe)) ;
+
+ PrepIP p ip = {s = \\spec => p.s ++ ip.s ! RSubj ! spec} ;
+
+ AdvIP ip adv = {
+ s = \\role,spec => ip.s ! role ! spec ++ adv.s ;
+ gn = ip.gn
+ } ;
+
+ CompIAdv a = a ;
+
+ IdetCN idet cn = {
+ s = \\_,spec => let nf = case <idet.n, idet.nonEmpty> of {
+ <Pl,True> => NFPlCount ;
+ _ => NF idet.n Indef
+ }
+ in idet.s ! cn.g ! spec ++ cn.s ! nf ;
+ gn = gennum cn.g idet.n
+ } ;
+
+ IdetIP idet = {
+ s = \\_ => idet.s ! DNeut ;
+ gn = gennum DNeut idet.n
+ } ;
+
+ IdetQuant iquant num = {
+ s = \\g,spec => iquant.s ! gennum g num.n ! spec ++
+ num.s ! dgenderSpecies g Indef RSubj ;
+ n = num.n ;
+ nonEmpty = num.nonEmpty
+ } ;
+
+ CompIP ip = {s = ip.s ! RSubj} ;
+}
diff --git a/next-lib/src/bulgarian/RelativeBul.gf b/next-lib/src/bulgarian/RelativeBul.gf
new file mode 100644
index 000000000..19e4f4af3
--- /dev/null
+++ b/next-lib/src/bulgarian/RelativeBul.gf
@@ -0,0 +1,34 @@
+concrete RelativeBul of Relative = CatBul ** open ResBul in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+ lin
+ RelCl cl = {
+ s = \\t,a,p,agr => suchRP ! agr.gn ++ "че" ++ cl.s ! t ! a ! p ! Main ;
+ role = RSubj
+ } ;
+
+ RelVP rp vp = {
+ s = \\t,a,p,agr =>
+ let
+ cl = mkClause (rp.s ! agr.gn) agr vp
+ in
+ cl.s ! t ! a ! p ! Main ;
+ role = RSubj
+ } ;
+
+ RelSlash rp slash = {
+ s = \\t,a,p,agr => slash.c2.s ++ rp.s ! agr.gn ++ slash.s ! agr ! t ! a ! p ! Main ;
+ role = RObj Acc
+ } ;
+
+ FunRP p np rp = {
+ s = \\gn => np.s ! RObj Acc ++ p.s ++ (case p.c of {Acc => []; Dat => "на"}) ++ rp.s ! gn ;
+ } ;
+
+ IdRP = {
+ s = whichRP ;
+ } ;
+}
diff --git a/next-lib/src/bulgarian/ResBul.gf b/next-lib/src/bulgarian/ResBul.gf
new file mode 100644
index 000000000..795b9a746
--- /dev/null
+++ b/next-lib/src/bulgarian/ResBul.gf
@@ -0,0 +1,626 @@
+--# -path=.:../abstract:../common:../../prelude
+
+--1 Bulgarian auxiliary operations.
+
+-- This module contains operations that are needed to make the
+-- resource syntax work. To define everything that is needed to
+-- implement $Test$, it moreover contains regular lexical
+-- patterns needed for $Lex$.
+
+resource ResBul = ParamX ** open Prelude in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all ;
+
+-- Some parameters, such as $Number$, are inherited from $ParamX$.
+
+--2 For $Noun$
+
+-- This is the worst-case $Case$ needed for pronouns.
+
+ param
+ Role = RSubj | RObj Case | RVoc ;
+ Case = Acc | Dat;
+
+ NForm =
+ NF Number Species
+ | NFSgDefNom
+ | NFPlCount
+ | NFVocative
+ ;
+
+ GenNum = GSg Gender | GPl ;
+
+-- Agreement of $NP$ is a record. We'll add $Gender$ later.
+
+ oper
+ Agr = {gn : GenNum ; p : Person} ;
+
+ param
+ Gender = Masc | Fem | Neut ;
+
+ Species = Indef | Def ;
+
+-- The plural never makes a gender distinction.
+
+--2 For $Verb$
+
+ Aspect = Imperf | Perf ;
+
+ VForm =
+ VPres Number Person
+ | VAorist Number Person
+ | VImperfect Number Person
+ | VPerfect AForm
+ | VPluPerfect AForm
+ | VPassive AForm
+ | VPresPart AForm
+ | VImperative Number
+ | VGerund
+ ;
+
+ VType =
+ VNormal
+ | VMedial Case
+ | VPhrasal Case
+ ;
+
+-- The order of sentence is needed already in $VP$.
+
+ Order = Main | Inv | Quest ;
+
+--2 For $Adjective$
+
+ AForm =
+ ASg Gender Species
+ | ASgMascDefNom
+ | APl Species
+ ;
+
+--2 For $Numeral$
+
+ DGender =
+ DMasc
+ | DMascPersonal
+ | DFem
+ | DNeut
+ ;
+
+ DGenderSpecies =
+ DMascIndef
+ | DMascDef
+ | DMascDefNom
+ | DMascPersonalIndef
+ | DMascPersonalDef
+ | DMascPersonalDefNom
+ | DFemIndef
+ | DFemDef
+ | DNeutIndef
+ | DNeutDef
+ ;
+
+ CardOrd = NCard DGenderSpecies | NOrd AForm ;
+ DForm = unit | teen | ten | hundred ;
+
+--2 Transformations between parameter types
+
+ oper
+ agrP3 : GenNum -> Agr = \gn ->
+ {gn = gn; p = P3} ;
+
+ conjGenNum : GenNum -> GenNum -> GenNum = \a,b ->
+ case <a,b> of {
+ <GSg _,GSg g> => GSg g ;
+ _ => GPl
+ } ;
+
+ conjAgr : Agr -> Agr -> Agr = \a,b -> {
+ gn = conjGenNum a.gn b.gn ;
+ p = conjPerson a.p b.p
+ } ;
+
+ gennum : DGender -> Number -> GenNum = \g,n ->
+ case n of {
+ Sg => GSg (case g of {
+ DMasc => Masc ;
+ DMascPersonal => Masc ;
+ DFem => Fem ;
+ DNeut => Neut
+ }) ;
+ Pl => GPl
+ } ;
+
+ numGenNum : GenNum -> Number = \gn ->
+ case gn of {
+ GSg _ => Sg ;
+ GPl => Pl
+ } ;
+
+ aform : GenNum -> Species -> Role -> AForm = \gn,spec,role ->
+ case gn of {
+ GSg g => case <g,spec,role> of {
+ <Masc,Def,RSubj> => ASgMascDefNom ;
+ _ => ASg g spec
+ } ;
+ GPl => APl spec
+ } ;
+
+ dgenderSpecies : DGender -> Species -> Role -> DGenderSpecies =
+ \g,spec,role -> case <g,spec> of {
+ <DMasc,Indef> => DMascIndef ;
+ <DMasc,Def> => case role of {
+ RSubj => DMascDefNom ;
+ _ => DMascDef
+ } ;
+ <DMascPersonal,Indef> => DMascPersonalIndef ;
+ <DMascPersonal,Def> => case role of {
+ RSubj => DMascPersonalDefNom ;
+ _ => DMascPersonalDef
+ } ;
+ <DFem ,Indef> => DFemIndef ;
+ <DFem ,Def> => DFemDef ;
+ <DNeut,Indef> => DNeutIndef ;
+ <DNeut,Def> => DNeutDef
+ } ;
+
+ nform2aform : NForm -> DGender -> AForm
+ = \nf,g -> case nf of {
+ NF n spec => aform (gennum g n) spec (RObj Acc) ;
+ NFSgDefNom => aform (gennum g Sg) Def RSubj ;
+ NFPlCount => APl Indef ;
+ NFVocative => aform (gennum g Sg) Indef (RObj Acc)
+ } ;
+
+ indefNForm : NForm -> NForm
+ = \nf -> case nf of {
+ NF n spec => NF n Indef ;
+ NFSgDefNom => NF Sg Indef ;
+ NFPlCount => NFPlCount ;
+ NFVocative => NFVocative
+ } ;
+
+ numNForm : NForm -> Number
+ = \nf -> case nf of {
+ NF n spec => n ;
+ NFSgDefNom => Sg ;
+ NFPlCount => Pl ;
+ NFVocative => Sg
+ } ;
+
+ oper
+-- For $Verb$.
+ VTable = VForm => Str ;
+
+ Verb : Type = {
+ s : Aspect => VTable ;
+ vtype : VType
+ } ;
+
+ VP : Type = {
+ s : Aspect => VTable ;
+ ad : {isEmpty : Bool; s : Str} ; -- sentential adverb
+ compl : Agr => Str ;
+ vtype : VType
+ } ;
+
+ VPSlash = {
+ s : Aspect => VTable ;
+ ad : {isEmpty : Bool; s : Str} ; -- sentential adverb
+ compl1 : Agr => Str ;
+ compl2 : Agr => Str ;
+ vtype : VType ;
+ c2 : Preposition
+ } ;
+
+ predV : Verb -> VP = \verb -> {
+ s = verb.s ;
+ ad = {isEmpty=True; s=[]} ;
+ compl = \\_ => [] ;
+ vtype = verb.vtype ;
+ } ;
+
+ slashV : Verb -> Preposition -> VPSlash = \verb,prep -> {
+ s = verb.s ;
+ ad = {isEmpty=True; s=[]} ;
+ compl1 = \\_ => [] ;
+ compl2 = \\_ => [] ;
+ vtype = verb.vtype ;
+ c2 = prep ;
+ } ;
+
+ insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
+ s = vp.s ;
+ ad = vp.ad ;
+ compl = \\a => vp.compl ! a ++ obj ! a ;
+ vtype = vp.vtype
+ } ;
+
+ insertSlashObj1 : (Agr => Str) -> VPSlash -> VPSlash = \obj,slash -> {
+ s = slash.s ;
+ ad = slash.ad ;
+ compl1 = \\a => slash.compl1 ! a ++ obj ! a ;
+ compl2 = slash.compl2 ;
+ vtype = slash.vtype ;
+ c2 = slash.c2
+ } ;
+
+ insertSlashObj2 : (Agr => Str) -> VPSlash -> VPSlash = \obj,slash -> {
+ s = slash.s ;
+ ad = slash.ad ;
+ compl1 = slash.compl1 ;
+ compl2 = \\a => slash.compl2 ! a ++ obj ! a ;
+ vtype = slash.vtype ;
+ c2 = slash.c2
+ } ;
+
+ auxBe : VTable =
+ table {
+ VPres Sg P1 => "съм" ;
+ VPres Sg P2 => "си" ;
+ VPres Sg P3 => "е" ;
+ VPres Pl P1 => "сме" ;
+ VPres Pl P2 => "сте" ;
+ VPres Pl P3 => "са" ;
+ VAorist Sg P1 => "бях" ;
+ VAorist Sg _ => "беше" ;
+ VAorist Pl P1 => "бяхме" ;
+ VAorist Pl P2 => "бяхте" ;
+ VAorist Pl P3 => "бяха" ;
+ VImperfect Sg P1 => "бях" ;
+ VImperfect Sg _ => "беше" ;
+ VImperfect Pl P1 => "бяхме" ;
+ VImperfect Pl P2 => "бяхте" ;
+ VImperfect Pl P3 => "бяха" ;
+ VPerfect aform => regAdjective "бил" ! aform ;
+ VPluPerfect aform => regAdjective "бил" ! aform ;
+ VPassive aform => regAdjective "бъден" ! aform ;
+ VPresPart aform => regAdjective "бъдещ" ! aform ;
+ VImperative Sg => "бъди" ;
+ VImperative Pl => "бъдете" ;
+ VGerund => "бидейки"
+ } ;
+
+ auxWould : VTable =
+ table {
+ VPres Sg P1 => "бъда" ;
+ VPres Sg P2 => "бъдеш" ;
+ VPres Sg P3 => "бъде" ;
+ VPres Pl P1 => "бъдем" ;
+ VPres Pl P2 => "бъдете" ;
+ VPres Pl P3 => "бъдат" ;
+ VAorist Sg P1 => "бих" ;
+ VAorist Sg _ => "би" ;
+ VAorist Pl P1 => "бихме" ;
+ VAorist Pl P2 => "бихте" ;
+ VAorist Pl P3 => "биха" ;
+ VImperfect Sg P1 => "бъдех" ;
+ VImperfect Sg _ => "бъдеше" ;
+ VImperfect Pl P1 => "бъдехме" ;
+ VImperfect Pl P2 => "бъдехте" ;
+ VImperfect Pl P3 => "бъдеха" ;
+ VPerfect aform => regAdjective "бил" ! aform ;
+ VPluPerfect aform => regAdjective "бъдел" ! aform ;
+ VPassive aform => regAdjective "бъден" ! aform ;
+ VPresPart aform => regAdjective "бъдещ" ! aform ;
+ VImperative Sg => "бъди" ;
+ VImperative Pl => "бъдете" ;
+ VGerund => "бъдейки"
+ } ;
+
+ verbBe : Verb = {s=\\_=>auxBe ; vtype=VNormal} ;
+ verbWould : Verb = {s=\\_=>auxWould ; vtype=VNormal} ;
+
+ reflClitics : Case => Str = table {Acc => "се"; Dat => "си"} ;
+
+ personalClitics : Case => GenNum => Person => Str =
+ table {
+ Acc => table {
+ GSg g => table {
+ P1 => "ме" ;
+ P2 => "те" ;
+ P3 => case g of {
+ Masc => "го" ;
+ Fem => "я" ;
+ Neut => "го"
+ }
+ } ;
+ GPl => table {
+ P1 => "ни" ;
+ P2 => "ви" ;
+ P3 => "ги"
+ }
+ } ;
+ Dat => table {
+ GSg g => table {
+ P1 => "ми" ;
+ P2 => "ти" ;
+ P3 => case g of {
+ Masc => "му" ;
+ Fem => "й" ;
+ Neut => "му"
+ }
+ } ;
+ GPl => table {
+ P1 => "ни" ;
+ P2 => "ви" ;
+ P3 => "им"
+ }
+ }
+ } ;
+
+ ia2e : Str -> Str = -- to be used when the next syllable has vowel different from "а","ъ","о" or "у"
+ \s -> case s of {
+ x@(_*+_) + "я" + y@(("б"|"в"|"г"|"д"|"ж"|"з"|"к"|"л"|"м"|"н"|"п"|"р"|"с"|"т"|"ф"|"х"|"ц"|"ч"|"ш"|"щ")*)
+ => x+"e"+y;
+ _ => s
+ };
+
+ regAdjective : Str -> AForm => Str =
+ \base ->
+ let base0 : Str
+ = case base of {
+ x+"и" => x;
+ x => x
+ }
+ in table {
+ ASg Masc Indef => base ;
+ ASg Masc Def => (base0+"ия") ;
+ ASgMascDefNom => (base0+"ият") ;
+ ASg Fem Indef => (base0+"a") ;
+ ASg Fem Def => (base0+"ата") ;
+ ASg Neut Indef => (base0+"о") ;
+ ASg Neut Def => (base0+"ото") ;
+ APl Indef => (ia2e base0+"и") ;
+ APl Def => (ia2e base0+"ите")
+ };
+
+-- For $Sentence$.
+
+ Clause : Type = {
+ s : Tense => Anteriority => Polarity => Order => Str
+ } ;
+
+ mkClause : Str -> Agr -> VP -> Clause =
+ \subj,agr,vp -> {
+ s = \\t,a,p,o =>
+ let
+ verb : Bool => Str
+ = \\q => vpTenses vp ! t ! a ! p ! agr ! q ! Perf ;
+ compl = vp.compl ! agr
+ in case o of {
+ Main => subj ++ verb ! False ++ compl ;
+ Inv => verb ! False ++ compl ++ subj ;
+ Quest => subj ++ verb ! True ++ compl
+ }
+ } ;
+
+ vpTenses : VP -> Tense => Anteriority => Polarity => Agr => Bool => Aspect => Str =
+ \verb -> \\t,a,p,agr,q0,asp =>
+ let clitic = case verb.vtype of {
+ VNormal => {s=[]; agr=agr} ;
+ VMedial c => {s=reflClitics ! c; agr=agr} ;
+ VPhrasal c => {s=personalClitics ! c ! agr.gn ! agr.p; agr={gn=GSg Neut; p=P3}}
+ } ;
+
+ present = verb.s ! asp ! (VPres (numGenNum clitic.agr.gn) clitic.agr.p) ;
+ presentImperf = verb.s ! Imperf ! (VPres (numGenNum clitic.agr.gn) clitic.agr.p) ;
+ aorist = verb.s ! asp ! (VAorist (numGenNum clitic.agr.gn) clitic.agr.p) ;
+ perfect = verb.s ! asp ! (VPerfect (aform clitic.agr.gn Indef (RObj Acc))) ;
+
+ auxPres = auxBe ! VPres (numGenNum clitic.agr.gn) clitic.agr.p ;
+ auxAorist = auxBe ! VAorist (numGenNum clitic.agr.gn) clitic.agr.p ;
+ auxCond = auxWould ! VAorist (numGenNum clitic.agr.gn) clitic.agr.p ;
+
+ apc : Str -> Str = \s ->
+ case <numGenNum clitic.agr.gn, clitic.agr.p> of {
+ <Sg, P3> => clitic.s++auxPres++s ;
+ _ => auxPres++s++clitic.s
+ } ;
+
+ li0 = case <verb.ad.isEmpty,q0> of {<False,True> => "ли"; _ => []} ;
+
+ q = case verb.ad.isEmpty of {True => q0; False => False} ;
+ li = case q of {True => "ли"; _ => []} ;
+
+ vf1 : Str -> {s1 : Str; s2 : Str} = \s ->
+ case p of {
+ Pos => case q of {True => {s1=[]; s2="ли"++apc []};
+ False => {s1=apc []; s2=[]}} ;
+ Neg => {s1="не"++apc li; s2=[]}
+ } ;
+
+ vf2 : Str -> {s1 : Str; s2 : Str} = \s ->
+ case p of {
+ Pos => case q of {True => {s1=[]; s2="ли"++s};
+ False => {s1=s; s2=[]}} ;
+ Neg => case verb.vtype of
+ {VNormal => {s1="не"; s2=li} ;
+ _ => {s1="не"++s++li; s2=[]}}
+ } ;
+
+ vf3 : Str -> {s1 : Str; s2 : Str} = \s ->
+ case p of {
+ Pos => {s1="ще"++s; s2=li} ;
+ Neg => {s1="няма"++li++"да"++s; s2=[]}
+ } ;
+
+ vf4 : Str -> {s1 : Str; s2 : Str} = \s ->
+ case p of {
+ Pos => {s1= s++li++clitic.s; s2=[]} ;
+ Neg => {s1="не"++s++li++clitic.s; s2=[]}
+ } ;
+
+ verbs : {aux:{s1:Str; s2:Str}; main:Str} =
+ case <t,a> of {
+ <Pres,Simul> => {aux=vf2 clitic.s; main=presentImperf} ;
+ <Pres,Anter> => {aux=vf1 clitic.s; main=perfect} ;
+ <Past,Simul> => {aux=vf2 clitic.s; main=aorist} ;
+ <Past,Anter> => {aux=vf4 auxAorist; main=perfect} ;
+ <Fut, Simul> => {aux=vf3 clitic.s; main=present} ;
+ <Fut, Anter> => {aux=vf3 (apc []); main=perfect} ;
+ <Cond,_ > => {aux=vf4 auxCond ; main=perfect}
+ }
+
+ in verb.ad.s ++ li0 ++ verbs.aux.s1 ++ verbs.main ++ verbs.aux.s2 ;
+
+ daComplex : VP -> Aspect => Agr => Str =
+ \vp -> \\asp,agr =>
+ let clitic = case vp.vtype of {
+ VNormal => {s=[]; agr=agr} ;
+ VMedial c => {s=reflClitics ! c; agr=agr} ;
+ VPhrasal c => {s=personalClitics ! c ! agr.gn ! agr.p; agr={gn=GSg Neut; p=P3}}
+ }
+ in vp.ad.s ++ "да" ++ clitic.s ++ vp.s ! asp ! VPres (numGenNum clitic.agr.gn) clitic.agr.p ++ vp.compl ! agr ;
+
+-- For $Numeral$.
+
+ mkDigit : Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} =
+ \dva, dvama, dve, vtori, dvesta ->
+ {s = table {
+ unit => mkCardOrd dva dvama dve vtori ;
+ teen => mkCardOrd (dva+"надесет") (dva+"надесетима") (dva+"надесет") (dva+"надесети") ;
+ ten => mkCardOrd (dva+"десет") (dva+"десетима") (dva+"десет") (dva+"десети") ;
+ hundred => let dvesten : Str
+ = case dvesta of {
+ dvest+"а" => dvest+"ен" ;
+ chetiristot+"ин" => chetiristot+"ен"
+ }
+ in mkCardOrd dvesta dvesta dvesta dvesten
+ }
+ } ;
+
+ mkCardOrd : Str -> Str -> Str -> Str -> CardOrd => Str =
+ \dva, dvama, dve, vtori ->
+ table {
+ NCard dg => digitGenderSpecies dva dvama dve ! dg ;
+ NOrd aform => let vtora = init vtori + "а" ;
+ vtoro = init vtori + "о"
+ in case aform of {
+ ASg Masc Indef => vtori ;
+ ASg Masc Def => vtori+"я" ;
+ ASgMascDefNom => vtori+"ят" ;
+ ASg Fem Indef => vtora ;
+ ASg Fem Def => vtora+"та" ;
+ ASg Neut Indef => vtoro ;
+ ASg Neut Def => vtoro+"то" ;
+ APl Indef => vtori ;
+ APl Def => vtori+"те"
+ }
+ } ;
+
+ digitGenderSpecies : Str -> Str -> Str -> DGenderSpecies => Str =
+ \dva, dvama, dve
+ -> let addDef : Str -> Str =
+ \s -> case s of {
+ dves+"та" => dves+"тате" ;
+ dv+"а" => dv+"ата" ;
+ x => x+"те"
+ }
+ in table {
+ DMascIndef => dva ;
+ DMascDef => addDef dva ;
+ DMascDefNom => addDef dva ;
+ DMascPersonalIndef => dvama ;
+ DMascPersonalDef => addDef dvama ;
+ DMascPersonalDefNom => addDef dvama ;
+ DFemIndef => dve ;
+ DFemDef => addDef dve ;
+ DNeutIndef => dve ;
+ DNeutDef => addDef dve
+ } ;
+
+ mkIP : Str -> Str -> GenNum -> {s : Role => QForm => Str ; gn : GenNum} =
+ \koi,kogo,gn -> {
+ s = table {
+ RSubj => table QForm [koi; koi+"то"] ;
+ RObj Acc => table QForm [kogo; kogo+"то"] ;
+ RObj Dat => table QForm ["на" ++ kogo; kogo+"то"] ;
+ RVoc => table QForm [koi; koi+"то"]
+ } ;
+ gn = gn
+ } ;
+
+ mkPron : (az,men,mi,moj,moia,moiat,moia_,moiata,moe,moeto,moi,moite : Str) -> GenNum -> Person -> {s : Role => Str; gen : AForm => Str; a : Agr} =
+ \az,men,mi,moj,moia,moiat,moia_,moiata,moe,moeto,moi,moite,gn,p -> {
+ s = table {
+ RSubj => az ;
+ RObj Acc => men ;
+ RObj Dat => mi ;
+ RVoc => az
+ } ;
+ gen = table {
+ ASg Masc Indef => moj ;
+ ASg Masc Def => moia ;
+ ASgMascDefNom => moiat ;
+ ASg Fem Indef => moia_ ;
+ ASg Fem Def => moiata ;
+ ASg Neut Indef => moe ;
+ ASg Neut Def => moeto ;
+ APl Indef => moi ;
+ APl Def => moite
+ } ;
+ a = {
+ gn = gn ;
+ p = p
+ }
+ } ;
+
+ mkNP : Str -> GenNum -> Person -> {s : Role => Str; a : Agr} =
+ \s,gn,p -> {
+ s = table {
+ RSubj => s ;
+ RObj Acc => s ;
+ RObj Dat => "на" ++ s ;
+ RVoc => s
+ } ;
+ a = {
+ gn = gn ;
+ p = p
+ }
+ } ;
+
+ Preposition : Type = {s : Str; c : Case};
+
+ mkQuestion :
+ {s : QForm => Str} -> Clause ->
+ {s : Tense => Anteriority => Polarity => QForm => Str} = \wh,cl ->
+ {
+ s = \\t,a,p,qform =>
+ let cls = cl.s ! t ! a ! p ;
+ in wh.s ! qform ++ cls ! case qform of {
+ QDir => Inv ;
+ QIndir => Main
+ }
+ } ;
+
+ whichRP : GenNum => Str
+ = table {
+ GSg Masc => "който" ;
+ GSg Fem => "която" ;
+ GSg Neut => "което" ;
+ GPl => "които"
+ } ;
+
+ suchRP : GenNum => Str
+ = table {
+ GSg Masc => "такъв" ;
+ GSg Fem => "такава" ;
+ GSg Neut => "такова" ;
+ GPl => "такива"
+ } ;
+
+ thisRP : GenNum => Str
+ = table {
+ GSg Masc => "този" ;
+ GSg Fem => "тaзи" ;
+ GSg Neut => "това" ;
+ GPl => "тези"
+ } ;
+
+ linCoord : Bool => Str ;
+ linCoord = table {True => "и"; False=>"или"} ;
+
+ linCoordSep : Str -> Bool => Bool => Str ;
+ linCoordSep s = table {True => linCoord; False=> \\_ => s} ;
+}
diff --git a/next-lib/src/bulgarian/SentenceBul.gf b/next-lib/src/bulgarian/SentenceBul.gf
new file mode 100644
index 000000000..9966b538d
--- /dev/null
+++ b/next-lib/src/bulgarian/SentenceBul.gf
@@ -0,0 +1,72 @@
+concrete SentenceBul of Sentence = CatBul ** open Prelude, ResBul in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+ lin
+ PredVP np vp = mkClause (np.s ! (case vp.vtype of {
+ VNormal => RSubj ;
+ VMedial _ => RSubj ;
+ VPhrasal c => RObj c})) np.a vp ;
+
+ PredSCVP sc vp = mkClause sc.s {gn=GSg Masc; p=P3} vp ;
+
+ ImpVP vp = {
+ s = \\p,gn =>
+ let agr = {gn = gn ; p = P2} ;
+ verb = vp.s ! Perf ! VImperative (numGenNum gn) ;
+ compl = vp.compl ! agr ;
+ clitic = case vp.vtype of {
+ VNormal => [] ;
+ VMedial c => reflClitics ! c ;
+ VPhrasal c => personalClitics ! c ! agr.gn ! agr.p
+ } ;
+ in case p of {Pos => vp.ad.s ++ verb ++ clitic ;
+ Neg => "не" ++ vp.ad.s ++ clitic ++ verb} ++ compl ;
+ } ;
+
+ SlashVP np slash = {
+ s = \\agr => (mkClause (np.s ! RSubj) np.a {s = slash.s ;
+ ad = slash.ad ;
+ compl = \\_ => slash.compl1 ! np.a ++ slash.compl2 ! agr ;
+ vtype = slash.vtype}).s ;
+ c2 = slash.c2
+ } ;
+
+ AdvSlash slash adv = {
+ s = \\agr,t,a,b,o => slash.s ! agr ! t ! a ! b ! o ++ adv.s ;
+ c2 = slash.c2
+ } ;
+
+ SlashPrep cl prep = {s = \\_ => cl.s; c2 = prep} ;
+
+ SlashVS np vs slash = {
+ s = \\agr => (mkClause (np.s ! RSubj) np.a
+ (insertObj (\\_ => "че" ++ slash.s ! agr) (predV vs))).s ;
+ c2 = slash.c2
+ } ;
+
+ EmbedS s = {s = "," ++ "че" ++ s.s} ;
+ EmbedQS qs = {s = qs.s ! QIndir} ;
+ EmbedVP vp = {s = daComplex vp ! Perf ! {gn=GSg Masc; p=P1}} ;
+
+ UseCl t p cl = {
+ s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! Main
+ } ;
+ UseQCl t p cl = {
+ s = \\q => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! q
+ } ;
+ UseRCl t p cl = {
+ s = \\agr => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! agr ;
+ role = cl.role
+ } ;
+ UseSlash t p cl = {
+ s = \\agr => t.s ++ p.s ++ cl.s ! agr ! t.t ! t.a ! p.p ! Main ;
+ c2 = cl.c2
+ } ;
+
+ AdvS a s = {s = a.s ++ "," ++ s.s} ;
+
+ RelS s r = {s = s.s ++ "," ++ r.s ! {gn=gennum DNeut Sg; p=P3}} ;
+}
diff --git a/next-lib/src/bulgarian/StructuralBul.gf b/next-lib/src/bulgarian/StructuralBul.gf
new file mode 100644
index 000000000..4ff725d26
--- /dev/null
+++ b/next-lib/src/bulgarian/StructuralBul.gf
@@ -0,0 +1,122 @@
+concrete StructuralBul of Structural = CatBul **
+ open MorphoBul, ParadigmsBul, Prelude in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all ;
+
+ lin
+ above_Prep = mkPrep "над" Acc ;
+ after_Prep = mkPrep "след" Acc ;
+ all_Predet = {s = table GenNum ["всичкия";"всичката";"всичкото";"всичките"]} ;
+ almost_AdA, almost_AdN = ss "почти" ;
+ although_Subj = ss ["въпреки че"] ;
+ always_AdV = ss "винаги" ;
+ and_Conj = {s=[]; conj=True; distr=False; n = Pl} ;
+ because_Subj = ss "защото" ;
+ before_Prep = mkPrep "преди" Acc ;
+ behind_Prep = mkPrep "зад" Acc ;
+ between_Prep = mkPrep "между" Acc ;
+ both7and_DConj = {s=[]; conj=True; distr=True; n = Pl} ;
+ but_PConj = ss "но" ;
+ by8agent_Prep = mkPrep "чрез" Acc ;
+ by8means_Prep = mkPrep "чрез" Acc ;
+ can8know_VV, can_VV = mkVV (stateV (mkV166 "мога")) ;
+ during_Prep = mkPrep ["по време на"] Acc ;
+ either7or_DConj = {s=[]; conj=False; distr=True; n = Sg} ;
+ everybody_NP = mkNP "всеки" (GSg Masc) P3 ;
+ every_Det = mkDeterminerSg "всеки" "всяка" "всяко";
+ everything_NP = mkNP "всичко" (GSg Neut) P3 ;
+ everywhere_Adv = ss "навсякъде" ;
+ few_Det = {s = \\_,_,_ => "няколко"; n = Pl; countable = True; spec = Indef} ;
+--- first_Ord = ss "first" ; DEPRECATED
+ for_Prep = mkPrep "за" Acc ;
+ from_Prep = mkPrep "от" Acc ;
+ he_Pron = mkPron "той" "него" "му" "негов" "неговия" "неговият" "негова" "неговата" "негово" "неговото" "негови" "неговите" (GSg Masc) P3 ;
+ here_Adv = ss "тук" ;
+ here7to_Adv = ss ["до тук"] ;
+ here7from_Adv = ss ["от тук"] ;
+ how_IAdv = mkIAdv "как" ;
+ how8many_IDet = {s = \\_ => table QForm ["колко";"колкото"]; n = Pl; nonEmpty = False} ;
+ if_Subj = ss "ако" ;
+ in8front_Prep = mkPrep "пред" Acc ;
+ i_Pron = mkPron "аз" "мен" "ми" "мой" "моя" "моят" "моя" "моята" "мое" "моето" "мои" "моите" (GSg Masc) P1 ;
+ in_Prep = mkPrep (pre { "в" ;
+ "във" / strs {"в" ; "ф" ; "В" ; "Ф"}
+ }) Acc ;
+ it_Pron = mkPron "то" "него" "му" "негов" "неговия" "неговият" "негова" "неговата" "негово" "неговото" "негови" "неговите" (GSg Neut) P3 ;
+ less_CAdv = {s="не"; sn="по-малко"} ;
+ many_Det = mkDeterminerPl "много" ;
+ more_CAdv = {s=[]; sn="повече"} ;
+ most_Predet = {s = \\_ => "повечето"} ;
+ much_Det = mkDeterminerSg "много" "много" "много";
+ must_VV =
+ mkVV {
+ s = \\_=>table {
+ VPres _ _ => "трябва" ;
+ VAorist _ _ => "трябваше" ;
+ VImperfect _ _ => "трябвало" ;
+ VPerfect _ => "трябвало" ;
+ VPluPerfect _ => "трябвало" ;
+ VPassive _ => "трябвало" ;
+ VPresPart _ => "трябвало" ;
+ VImperative Sg => "трябвай" ;
+ VImperative Pl => "трябвайте" ;
+ VGerund => "трябвайки"
+ } ;
+ vtype=VNormal ;
+ lock_V=<>
+ } ;
+ no_Utt = ss "не" ;
+ on_Prep = mkPrep "на" Acc ;
+---- one_Quant = mkDeterminer Sg "one" ; -- DEPRECATED
+ only_Predet = {s = \\_ => "само"} ;
+ or_Conj = {s=[]; conj=False; distr=False; n = Sg} ;
+ otherwise_PConj = ss "иначе" ;
+ part_Prep = mkPrep "от" Acc ;
+ please_Voc = ss "моля" ;
+ possess_Prep = mkPrep [] Dat ;
+ quite_Adv = ss "доста" ;
+ she_Pron = mkPron "тя" "нея" "и" "неин" "нейния" "нейният" "нейна" "нейната" "нейно" "нейното" "нейни" "нейните" (GSg Fem) P3 ;
+ so_AdA = ss "толкова" ;
+ somebody_NP = mkNP "някой" (GSg Masc) P3 ;
+ someSg_Det = mkDeterminerSg "някой" "някоя" "някое" ;
+ somePl_Det = mkDeterminerPl "някои" ;
+ something_NP = mkNP "нещо" (GSg Neut) P3 ;
+ somewhere_Adv = ss "някъде" ;
+ that_Quant = mkQuant "онзи" "онази" "онова" "онези" ;
+ there_Adv = ss "там" ;
+ there7to_Adv = ss ["до там"] ;
+ there7from_Adv = ss ["от там"] ;
+ therefore_PConj = ss ["така че"] ;
+ they_Pron = mkPron "те" "тях" "им" "техен" "техния" "техният" "тяхна" "тяхната" "тяхно" "тяхното" "техни" "техните" GPl P3 ;
+ this_Quant = mkQuant "този" "тази" "това" "тези" ;
+ through_Prep = mkPrep "през" Acc ;
+ too_AdA = ss "прекалено" ;
+ to_Prep = mkPrep "до" Acc ;
+ under_Prep = mkPrep "под" Acc ;
+ very_AdA = ss "много" ;
+ want_VV = mkVV (stateV (mkV186 "искам")) ;
+ we_Pron = mkPron "ние" "нас" "ни" "наш" "нашия" "нашият" "наша" "нашата" "наше" "нашето" "наши" "нашите" GPl P1 ;
+ whatPl_IP = mkIP "какви" "какви" GPl ;
+ whatSg_IP = mkIP "какъв" "какъв" (GSg Masc) ;
+ when_IAdv = mkIAdv "кога" ;
+ when_Subj = ss "когато" ;
+ where_IAdv = mkIAdv "къде" ;
+ which_IQuant = {s = table GenNum [table QForm ["кой";"който"];
+ table QForm ["коя";"която"];
+ table QForm ["кое";"което"];
+ table QForm ["кои";"които"]]} ;
+ whoSg_IP = mkIP "кой" "кого" (GSg Masc) ;
+ whoPl_IP = mkIP "кои" "кои" GPl ;
+ why_IAdv = mkIAdv "защо" ;
+ without_Prep = mkPrep "без" Acc ;
+ with_Prep = mkPrep (pre { "с" ;
+ "със" / strs {"с" ; "з" ; "С" ; "З"}
+ }) Acc ;
+ yes_Utt = ss "да" ;
+ youSg_Pron = mkPron "ти" "теб" "ти" "твой" "твоя" "твоят" "твоя" "твоята" "твое" "твоето" "твои" "твоите" (GSg Masc) P2 ;
+ youPl_Pron = mkPron "вие" "вас" "ви" "ваш" "вашия" "вашият" "ваша" "вашата" "ваше" "вашето" "ваши" "вашите" GPl P2 ;
+ youPol_Pron = mkPron "вие" "вас" "ви" "ваш" "вашия" "вашият" "ваша" "вашата" "ваше" "вашето" "ваши" "вашите" GPl P2 ;
+}
+
diff --git a/next-lib/src/bulgarian/TextBul.gf b/next-lib/src/bulgarian/TextBul.gf
new file mode 100644
index 000000000..21e624b8e
--- /dev/null
+++ b/next-lib/src/bulgarian/TextBul.gf
@@ -0,0 +1,13 @@
+concrete TextBul of Text = CatBul ** {
+ flags coding=cp1251 ;
+
+
+-- This will work for almost all languages except Spanish.
+
+ lin
+ TEmpty = {s = []} ;
+ TFullStop x xs = {s = x.s ++ "." ++ xs.s} ;
+ TQuestMark x xs = {s = x.s ++ "?" ++ xs.s} ;
+ TExclMark x xs = {s = x.s ++ "!" ++ xs.s} ;
+
+}
diff --git a/next-lib/src/bulgarian/VerbBul.gf b/next-lib/src/bulgarian/VerbBul.gf
new file mode 100644
index 000000000..59d29deb2
--- /dev/null
+++ b/next-lib/src/bulgarian/VerbBul.gf
@@ -0,0 +1,92 @@
+concrete VerbBul of Verb = CatBul ** open Prelude, ResBul, ParadigmsBul in {
+ flags coding=cp1251 ;
+
+
+ flags optimize=all_subs ;
+
+ lin
+ UseV = predV ;
+
+ SlashV2a v = slashV v v.c2 ;
+
+ Slash2V3 v np =
+ insertSlashObj1 (\\_ => v.c2.s ++ np.s ! RObj v.c2.c) (slashV v v.c3) ;
+
+ Slash3V3 v np =
+ insertSlashObj2 (\\_ => v.c3.s ++ np.s ! RObj v.c3.c) (slashV v v.c2) ;
+
+ ComplVV vv vp =
+ insertObj (daComplex vp ! Perf) (predV vv) ;
+
+ ComplVS v s = insertObj (\\_ => "," ++ "че" ++ s.s) (predV v) ;
+ ComplVQ v q = insertObj (\\_ => q.s ! QDir) (predV v) ;
+
+ ComplVA v ap =
+ insertObj (\\agr => ap.s ! aform agr.gn Indef (RObj Acc)) (predV v) ;
+
+
+ SlashV2A v ap =
+ insertSlashObj2 (\\a => ap.s ! aform a.gn Indef (RObj Acc)) (slashV v v.c2) ;
+
+ -- test: I saw a boy to whom she said that they are here
+ SlashV2S v s = insertSlashObj2 (\\_ => "," ++ "че" ++ s.s) (slashV v v.c2) ;
+
+ -- test: I saw a boy whom she asked who is here
+ SlashV2Q v q = insertSlashObj2 (\\_ => q.s ! QDir) (slashV v v.c2) ;
+
+ -- test: I saw a boy whom she begged to walk
+ SlashV2V vv vp =
+ insertSlashObj2 (daComplex vp ! Perf) (slashV vv vv.c2) ;
+
+ -- test: I saw a car whom she wanted to buy
+ SlashVV vv slash = {
+ s = vv.s ;
+ ad = {isEmpty=True; s=[]};
+ compl1 = daComplex {s=slash.s; ad=slash.ad; compl=slash.compl1; vtype=slash.vtype} ! Perf ;
+ compl2 = slash.compl2 ;
+ vtype = vv.vtype ;
+ c2 = slash.c2
+ } ;
+
+ -- test: I saw a car whom she begged me to buy
+ SlashV2VNP vv np slash = {
+ s = vv.s ;
+ ad = {isEmpty=True; s=[]};
+ compl1 = \\agr => vv.c2.s ++ np.s ! RObj vv.c2.c ++
+ daComplex {s=slash.s; ad=slash.ad; compl=slash.compl1; vtype=slash.vtype} ! Perf ! np.a ;
+ compl2 = slash.compl2 ;
+ vtype = vv.vtype ;
+ c2 = slash.c2
+ } ;
+
+ ComplSlash slash np = {
+ s = slash.s ;
+ ad = slash.ad ;
+ compl = \\a => slash.compl1 ! a ++ slash.c2.s ++ np.s ! RObj slash.c2.c ++ slash.compl2 ! np.a ;
+ vtype = slash.vtype
+ } ;
+
+ UseComp comp = insertObj comp.s (predV verbBe) ;
+
+ AdvVP vp adv = insertObj (\\_ => adv.s) vp ;
+
+ AdVVP adv vp = {
+ s = vp.s ;
+ ad = {isEmpty=False; s=vp.ad.s ++ adv.s} ;
+ compl = vp.compl ;
+ vtype = vp.vtype
+ } ;
+
+ ReflVP slash = {
+ s = slash.s ;
+ ad = slash.ad ;
+ compl = \\agr => slash.compl1 ! agr ++ slash.compl2 ! agr ;
+ vtype = VMedial slash.c2.c ;
+ } ;
+
+ PassV2 v = insertObj (\\a => v.s ! Perf ! VPassive (aform a.gn Indef (RObj Acc))) (predV verbBe) ;
+
+ CompAP ap = {s = \\agr => ap.s ! aform agr.gn Indef (RObj Acc)} ;
+ CompNP np = {s = \\_ => np.s ! RObj Acc} ;
+ CompAdv a = {s = \\_ => a.s} ;
+}