diff --git a/lib/resource-1.4/bulgarian/AdjectiveBul.gf b/lib/resource-1.4/bulgarian/AdjectiveBul.gf new file mode 100644 index 000000000..c16067a86 --- /dev/null +++ b/lib/resource-1.4/bulgarian/AdjectiveBul.gf @@ -0,0 +1,36 @@ +concrete AdjectiveBul of Adjective = CatBul ** open ResBul, Prelude in { + lin + PositA a = { + s = \\aform => a.s ! aform ; + isPre = True + } ; + + ComparA a np = { + s = \\aform => "по" ++ "-" ++ a.s ! aform ++ "от" ++ np.s ! RObj Acc ; + isPre = True + } ; + +-- $SuperlA$ belongs to determiner syntax in $Noun$. + + ComplA2 a np = { + s = \\aform => a.s ! aform ++ a.c2 ++ np.s ! RObj Acc ; + isPre = True + } ; + + ReflA2 a = { + s = \\aform => a.s ! aform ++ a.c2 ++ ["себе си"] ; + isPre = False + } ; + + SentAP ap sc = { + s = \\a => ap.s ! a ++ sc.s ; + isPre = False + } ; + + AdAP ada ap = { + s = \\a => ada.s ++ ap.s ! a ; + isPre = ap.isPre + } ; + + UseA2 a = a ; +} diff --git a/lib/resource-1.4/bulgarian/AdverbBul.gf b/lib/resource-1.4/bulgarian/AdverbBul.gf new file mode 100644 index 000000000..d34907e30 --- /dev/null +++ b/lib/resource-1.4/bulgarian/AdverbBul.gf @@ -0,0 +1,18 @@ +concrete AdverbBul of Adverb = CatBul ** open ResBul, Prelude in { + lin + PositAdvAdj a = {s = a.s ! ASg Neut Indef} ; + 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/lib/resource-1.4/bulgarian/Bulgarian.gf b/lib/resource-1.4/bulgarian/Bulgarian.gf new file mode 100644 index 000000000..7fa27a6dd --- /dev/null +++ b/lib/resource-1.4/bulgarian/Bulgarian.gf @@ -0,0 +1,6 @@ +--# -path=.:../abstract:../common:prelude + +concrete Bulgarian of BulgarianAbs = + LangBul, + ExtraBul + ** {} ; diff --git a/lib/resource-1.4/bulgarian/BulgarianAbs.gf b/lib/resource-1.4/bulgarian/BulgarianAbs.gf new file mode 100644 index 000000000..c14c7b0d6 --- /dev/null +++ b/lib/resource-1.4/bulgarian/BulgarianAbs.gf @@ -0,0 +1,6 @@ +--# -path=.:../abstract:../common:prelude + +abstract BulgarianAbs = + Lang, + ExtraBulAbs + ** {} ; diff --git a/lib/resource-1.4/bulgarian/CatBul.gf b/lib/resource-1.4/bulgarian/CatBul.gf new file mode 100644 index 000000000..8d974d72a --- /dev/null +++ b/lib/resource-1.4/bulgarian/CatBul.gf @@ -0,0 +1,131 @@ +concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in { + + 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 + + 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 : GenNum => Str} ; + SC = {s : Str} ; + SSlash = {s : Str ; c2 : Preposition} ; + +-- Sentence + + Cl = {s : ResBul.Tense => Anteriority => Polarity => Order => Str} ; + ClSlash = { + s : 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 => Str; gn : GenNum} ; + IComp = {s1,s2 : Str} ; + IDet = {s : GenNum => Str; n : Number ; nonEmpty : Bool} ; ---- nonEmpty by AR + IQuant = {s : GenNum => Str} ; + +-- Relative + + RCl = {s : ResBul.Tense => Anteriority => Polarity => GenNum => Str} ; + RP = {s : GenNum => Str} ; + +-- Verb + + VP = { + s : ResBul.Tense => Anteriority => Polarity => Agr => Bool => Aspect => Str ; + imp : Polarity => Number => Aspect => Str ; + ad : Bool => Str ; + s2 : Agr => Str ; + subjRole : Role + } ; + + VPSlash = ResBul.VP ** {c2 : Preposition} ; + + Comp = {s : Agr => Str} ; + AdV = {s : Str} ; --lock_AdV : {}} ; + +-- Adjective + + AP = {s : AForm => Str; isPre : Bool} ; + +-- Adjective + + Adv = {s : Str} ; + CAdv = {s : Str; sn : Str} ; + IAdv = {s1,s2 : 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 : DGender => Role => Str ; n : Number; countable : Bool; spec : Species} ; + Predet = {s : GenNum => Str} ; + Ord = {s : AForm => Str; nonEmpty : Bool} ; + Num = {s : DGenderSpecies => Str; n : Number; nonEmpty : Bool} ; + Card = {s : DGenderSpecies => Str; n : Number} ; + Quant = {s : AForm => Str; spec : Species} ; + Art = {s : AForm => Str; spec : Species} ; + +-- Numeral + + Numeral = {s : CardOrd => Str; n : Number} ; + Digits = {s : CardOrd => Str; n : Number; tail : DTail} ; + AdN = {s : Str} ; + +-- Structural + + Conj = {s1,s2 : Str ; 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} ; + A2 = {s : AForm => 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/lib/resource-1.4/bulgarian/ConjunctionBul.gf b/lib/resource-1.4/bulgarian/ConjunctionBul.gf new file mode 100644 index 000000000..dc009dab2 --- /dev/null +++ b/lib/resource-1.4/bulgarian/ConjunctionBul.gf @@ -0,0 +1,39 @@ +concrete ConjunctionBul of Conjunction = + CatBul ** open ResBul, Coordination, Prelude in { + + flags optimize=all_subs ; + + lin + + ConjS = conjunctDistrSS ; + + ConjAdv = conjunctDistrSS ; + + ConjNP conj ss = conjunctDistrTable Role conj ss ** { + a = {gn = conjGenNum (gennum DMasc conj.n) ss.a.gn; p = ss.a.p} + } ; + + ConjAP conj ss = conjunctDistrTable AForm conj ss ** { + isPre = ss.isPre + } ; + +-- These fun's are generated from the list cat's. + + BaseS = twoSS ; + ConsS = consrSS comma ; + + BaseAdv = twoSS ; + ConsAdv = consrSS comma ; + + BaseNP x y = twoTable Role x y ** {a = conjAgr x.a y.a} ; + ConsNP xs x = consrTable Role comma xs x ** {a = conjAgr xs.a x.a} ; + + BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre} ; + ConsAP xs x = consrTable AForm comma xs x ** {isPre = andB xs.isPre x.isPre} ; + + lincat + [S] = {s1,s2 : Str} ; + [Adv] = {s1,s2 : Str} ; + [NP] = {s1,s2 : Role => Str ; a : Agr} ; + [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; +} diff --git a/lib/resource-1.4/bulgarian/ExtraBul.gf b/lib/resource-1.4/bulgarian/ExtraBul.gf new file mode 100644 index 000000000..ebf4b9601 --- /dev/null +++ b/lib/resource-1.4/bulgarian/ExtraBul.gf @@ -0,0 +1,66 @@ +concrete ExtraBul of ExtraBulAbs = CatBul ** + open ResBul, Coordination, Prelude in { + + 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/lib/resource-1.4/bulgarian/ExtraBulAbs.gf b/lib/resource-1.4/bulgarian/ExtraBulAbs.gf new file mode 100644 index 000000000..8e6fdeec4 --- /dev/null +++ b/lib/resource-1.4/bulgarian/ExtraBulAbs.gf @@ -0,0 +1,31 @@ +abstract ExtraBulAbs = Extra ** { + +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/lib/resource-1.4/bulgarian/GrammarBul.gf b/lib/resource-1.4/bulgarian/GrammarBul.gf new file mode 100644 index 000000000..7fb8791be --- /dev/null +++ b/lib/resource-1.4/bulgarian/GrammarBul.gf @@ -0,0 +1,21 @@ +--# -path=.:../abstract:../common:prelude + +concrete GrammarBul of Grammar = + NounBul, + VerbBul, + AdjectiveBul, + AdverbBul, + NumeralBul, + SentenceBul, + QuestionBul, + RelativeBul, + ConjunctionBul, + PhraseBul, + TextBul, + StructuralBul, + IdiomBul + ** { + +flags startcat = Phr ; unlexer = text ; lexer = text ; + +} ; diff --git a/lib/resource-1.4/bulgarian/IdiomBul.gf b/lib/resource-1.4/bulgarian/IdiomBul.gf new file mode 100644 index 000000000..6ec3f00c5 --- /dev/null +++ b/lib/resource-1.4/bulgarian/IdiomBul.gf @@ -0,0 +1,69 @@ +concrete IdiomBul of Idiom = CatBul ** open Prelude, ParadigmsBul, ResBul in { + 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.gn) (predV verbBe)) ; + + CleftAdv ad s = + mkClause (ad.s) + (agrP3 (GSg Neut)) + (insertObj (\\_ => thisRP ! GPl ++ s.s) (predV verbBe)) ; + + 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 of { + => {aux1=[]; aux2=[]; main=present} ; + => {aux1=[]; aux2=auxPres; main=perfect} ; + => {aux1=[]; aux2=[]; main=aorist} ; + => {aux1=[]; aux2=auxAorist; main=perfect} ; + => {aux1="ще"; aux2=[]; main=present} ; + => {aux1="ще"++auxPres; aux2=[]; main=perfect} ; + => {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 (ss (ip.s ! Nom)) + (mkClause "there" (agrP3 ip.n) (predAux auxBe)) ; +-} + ProgrVP vp = { + s = \\t,a,p,agr,q,asp => vp.s ! t ! a ! p ! agr ! q ! Imperf ; + imp = \\p,n,_ => vp.imp ! p ! n ! Imperf ; + ad = vp.ad ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ; + + ImpPl1 vp = {s = let verbs = vp.s ! Pres ! Simul ! Pos ! {gn = GPl ; p = P1} ! False ! Imperf ; + in "нека" ++ vp.s2 ! {gn = GPl ; p = P1} + } ; +} + diff --git a/lib/resource-1.4/bulgarian/LangBul.gf b/lib/resource-1.4/bulgarian/LangBul.gf new file mode 100644 index 000000000..5941644e1 --- /dev/null +++ b/lib/resource-1.4/bulgarian/LangBul.gf @@ -0,0 +1,10 @@ +--# -path=.:../abstract:../common:prelude + +concrete LangBul of Lang = + GrammarBul, + LexiconBul + ** { + +flags startcat = Phr ; unlexer = text ; lexer = text ; + +} ; diff --git a/lib/resource-1.4/bulgarian/LexiconBul.gf b/lib/resource-1.4/bulgarian/LexiconBul.gf new file mode 100644 index 000000000..f29f8be3d --- /dev/null +++ b/lib/resource-1.4/bulgarian/LexiconBul.gf @@ -0,0 +1,368 @@ +--# -path=.:prelude + +concrete LexiconBul of Lexicon = CatBul ** + open ParadigmsBul, ResBul, Prelude in { + +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 (mkV165 "ида") (mkV146a "дойда") ; + 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 = 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 (reflV (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 (stateV (mkV162 "зная")) ; + lake_N = mkN054 "езеро" ; + lamp_N = mkN041 "лампа" ; + learn_V2 = dirV2 (stateV (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 (reflV (actionV (mkV186 "учудвам") (mkV173 "чудя")) Acc) ; + wood_N = mkN041 "дървесина" ; + write_V2 = dirV2 (stateV (mkV159 "пиша")) ; + yellow_A = mkA076 "жълт" ; + young_A = mkA076 "млад" ; + do_V2 = dirV2 (stateV (mkV160a "върша")) ; + 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 "fat" ; + 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 = reflV (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 (reflV (stateV (mkV186 "страхувам")) Acc) ; + fight_V2 = dirV2 (reflV (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/lib/resource-1.4/bulgarian/MorphoBul.gf b/lib/resource-1.4/bulgarian/MorphoBul.gf new file mode 100644 index 000000000..b37cc57fc --- /dev/null +++ b/lib/resource-1.4/bulgarian/MorphoBul.gf @@ -0,0 +1,176 @@ +--# -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 optimize=all ; + +oper +--2 Determiners + + mkDeterminerSg : Str -> Str -> Str -> {s : 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 : DGender => Role => Str ; n : Number; countable : Bool ; spec : Species} = \vsicki -> + {s = \\_,_ => vsicki; n = Pl; countable = False; spec = Indef} ; + + mkQuant : Str -> Str -> Str -> Str -> {s : AForm => Str; spec : Species} = \tozi,tazi,towa,tezi -> { + s = \\aform => case aform of { + ASg Masc _ => tozi ; + ASgMascDefNom => tozi ; + ASg Fem _ => tazi ; + ASg Neut _ => towa ; + APl _ => tezi + }; + 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 + } ; + lock_A = <> + } ; +} \ No newline at end of file diff --git a/lib/resource-1.4/bulgarian/MorphoFunsBul.gf b/lib/resource-1.4/bulgarian/MorphoFunsBul.gf new file mode 100644 index 000000000..ce270e9a2 --- /dev/null +++ b/lib/resource-1.4/bulgarian/MorphoFunsBul.gf @@ -0,0 +1,182 @@ +--# -path=.:../abstract:../../prelude:../common + +resource MorphoFunsBul = open + Prelude, + CatBul, + MorphoBul + in { + +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 +-- + + reflV : V -> Case -> V ; + reflV 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_V2 = <>} ; + + mkV2V : V -> Prep -> Prep -> V2V ; + mkV2V v p t = prepV2 v p ** {s4 = t ; lock_V2 = <>} ; + + mkV2A : V -> Prep -> V2A ; + mkV2A v p = prepV2 v p ** {lock_V2A = <>} ; + + mkV2Q : V -> Prep -> V2Q ; + mkV2Q v p = prepV2 v p ** {lock_V2 = <>} ; + + 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_V2 = <>} ; + + +--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 = {s1 = s; s2 = s + "то"; lock_IAdv = <>} ; +} \ No newline at end of file diff --git a/lib/resource-1.4/bulgarian/NounBul.gf b/lib/resource-1.4/bulgarian/NounBul.gf new file mode 100644 index 000000000..ca8734dfe --- /dev/null +++ b/lib/resource-1.4/bulgarian/NounBul.gf @@ -0,0 +1,177 @@ +concrete NounBul of Noun = CatBul ** open ResBul, Prelude in { + + flags optimize=all_subs ; + + lin + DetCN = detCN ; + + DetNP det = detCN det {s = \\_ => [] ; g = DNeut} ; ---- FIXME AR + + oper + detCN : + {s : DGender => Role => Str ; n : Number; countable : Bool; spec : Species} -> + {s : NForm => Str; g : DGender} -> + {s : Role => Str; a : Agr} + = + \det,cn -> + { s = \\role => let nf = case of { + => case role of { + RSubj => NFSgDefNom ; + RVoc => NFVocative ; + _ => NF Sg Def + } ; + => case role of { + RVoc => NFVocative ; + _ => NF Sg Indef + } ; + => NF det.n det.spec ; + => case cn.g of { + DMascPersonal => NF Pl Indef; + _ => case det.countable of { + True => NFPlCount ; + False => NF Pl Indef + } + } + } ; + s = det.s ! cn.g ! role ++ cn.s ! nf + in case role of { + RObj Dat => "на" ++ s; + _ => s + } ; + a = {gn = gennum cn.g det.n; p = P3} ; + } ; + + lin + UsePN pn = { s = \\role => case role of { + 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 + } ; + + DetQuantOrd, DetArtOrd = \quant, num, ord -> { + s = \\g,c => num.s ! dgenderSpecies g quant.spec c ++ + quant.s ! aform (gennum g num.n) Def c ++ + ord.s ! aform (gennum g num.n) (case num.nonEmpty of {False => quant.spec; _ => Indef}) c ; + n = num.n ; + countable = num.nonEmpty ; + spec=case of { => quant.spec; _ => Indef} + } ; + + DetQuant quant num = { + s = \\g,c => num.s ! dgenderSpecies g quant.spec c ++ + quant.s ! aform (gennum g num.n) Def c ; + n = num.n ; + countable = num.nonEmpty ; + spec=case num.nonEmpty of {False => quant.spec; _ => Indef} ---- FIXME AR + } ; + + DetArtCard quant num = { + s = \\g,c => num.s ! dgenderSpecies g quant.spec c ++ + quant.s ! aform (gennum g num.n) Def c ; + n = num.n ; + countable = True ; + spec= Indef ---- FIXME AR + } ; + + ---- FIXME AR + DetArtPl quant = detCN { + s = \\g,c => quant.s ! aform (gennum g Pl) Def c ; + n = Pl ; + countable = False ; + spec=quant.spec; + } ; + + ---- FIXME AR + DetArtSg quant = detCN { + s = \\g,c => quant.s ! aform (gennum g Sg) Def c ; + n = Sg ; + countable = False ; + spec=quant.spec; + } ; + + PossPron p = { + s = p.gen ; + spec = 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; nonEmpty = True} ; + + NumNumeral numeral = {s = \\gspec => numeral.s ! NCard gspec; n = numeral.n; nonEmpty = True} ; + OrdNumeral numeral = {s = \\aform => numeral.s ! NOrd aform; nonEmpty = True} ; + + AdNum adn num = {s = \\gspec => adn.s ++ num.s ! gspec; n = num.n; nonEmpty = num.nonEmpty} ; + + OrdSuperl a = {s = \\aform => "най" ++ "-" ++ a.s ! aform; nonEmpty = True} ; + + DefArt = { + s = \\_ => [] ; + spec = ResBul.Def + } ; + + IndefArt = { + s = \\_ => [] ; + spec = ResBul.Indef + } ; + + MassNP = detCN { + s = \\_,_ => [] ; + spec = Indef ; + countable = False ; n = Sg ---- FIXME is this correct? AR + } ; + + 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 => preOrPost ap.isPre (ap.s ! nform2aform nf cn.g) (cn.s ! (indefNForm nf)) ; + g = cn.g + } ; + RelCN cn rs = { + s = \\nf => cn.s ! nf ++ rs.s ! gennum cn.g (numNForm nf) ; + 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} ; + +---- FIXME AR + RelNP np rs = { + s = \\r => np.s ! r ++ rs.s ! np.a.gn ; ---- gennum cn.g (numNForm nf) ; + a = np.a + } ; +} diff --git a/lib/resource-1.4/bulgarian/NumeralBul.gf b/lib/resource-1.4/bulgarian/NumeralBul.gf new file mode 100644 index 000000000..d09573b6c --- /dev/null +++ b/lib/resource-1.4/bulgarian/NumeralBul.gf @@ -0,0 +1,132 @@ +concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in { + +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/lib/resource-1.4/bulgarian/ParadigmsBul.gf b/lib/resource-1.4/bulgarian/ParadigmsBul.gf new file mode 100644 index 000000000..985cfa5f1 --- /dev/null +++ b/lib/resource-1.4/bulgarian/ParadigmsBul.gf @@ -0,0 +1,1455 @@ +resource ParadigmsBul = MorphoFunsBul ** open + Predef, + Prelude, + MorphoBul, + CatBul + in { +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 mkAdjective (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+"яй") ; +} \ No newline at end of file diff --git a/lib/resource-1.4/bulgarian/PhraseBul.gf b/lib/resource-1.4/bulgarian/PhraseBul.gf new file mode 100644 index 000000000..0dd9e283a --- /dev/null +++ b/lib/resource-1.4/bulgarian/PhraseBul.gf @@ -0,0 +1,26 @@ +concrete PhraseBul of Phrase = CatBul ** open Prelude, ResBul in { + + 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} ; + UttIAdv iadv = {s = iadv.s1} ; + UttNP np = {s = np.s ! RSubj} ; + UttVP vp = {s = vp.ad ! False ++ + "да" ++ + vp.s ! Pres ! Simul ! Pos ! agrP3 (GSg Neut) ! False ! Perf ++ + vp.s2 ! agrP3 (GSg Neut)} ; + UttAdv adv = adv ; + + NoPConj = {s = []} ; + PConjConj conj = {s = conj.s2} ; ---- AR + + NoVoc = {s = []} ; + VocNP np = {s = "," ++ np.s ! RVoc} ; +} diff --git a/lib/resource-1.4/bulgarian/QuestionBul.gf b/lib/resource-1.4/bulgarian/QuestionBul.gf new file mode 100644 index 000000000..d4cb9bc6a --- /dev/null +++ b/lib/resource-1.4/bulgarian/QuestionBul.gf @@ -0,0 +1,64 @@ +concrete QuestionBul of Question = CatBul ** open ResBul, Prelude in { + + 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 = + let cl = mkClause (ip.s ! RSubj) {gn = ip.gn ; p = P3} vp + in {s = \\t,a,b,_ => cl.s ! t ! a ! b ! Main} ; + + QuestSlash ip slash = + mkQuestion {s1 = slash.c2.s ++ ip.s ! (RObj slash.c2.c); s2 = slash.c2.s ++ ip.s ! (RObj slash.c2.c)} slash ; + + QuestIAdv iadv cl = mkQuestion iadv cl ; + + QuestIComp icomp np = + mkQuestion icomp (mkClause (np.s ! RSubj) np.a (predV verbBe)) ; + + PrepIP p ip = {s1 = p.s ++ ip.s ! RSubj; s2 = p.s ++ ip.s ! RSubj} ; + + AdvIP ip adv = { + s = \\c => ip.s ! c ++ adv.s ; + gn = ip.gn + } ; + + CompIAdv a = a ; + +---- FIXME: the rest of this module guessed by AR + + IdetCN idet cn = { + s = \\c => let nf = case of { + => NFPlCount ; + _ => NF idet.n Indef + } + in idet.s ! gennum cn.g idet.n ++ + cn.s ! nf ; + gn = gennum cn.g idet.n + } ; + + IdetIP idet = let g = DNeut in { + s = \\c => idet.s ! gennum g idet.n ; + gn = gennum g idet.n + } ; + + IdetQuant iquant num = { + s = \\gn => iquant.s ! gn ++ + num.s ! dgenderSpecies (genGenNum gn) Indef RSubj ; + n = num.n ; + nonEmpty = num.nonEmpty + } ; + + ---- what should there be in s1,s2 ? AR + CompIP ip = {s1 = ip.s ! RSubj ; s2 = []} ; + +} diff --git a/lib/resource-1.4/bulgarian/RelativeBul.gf b/lib/resource-1.4/bulgarian/RelativeBul.gf new file mode 100644 index 000000000..65cf43fde --- /dev/null +++ b/lib/resource-1.4/bulgarian/RelativeBul.gf @@ -0,0 +1,32 @@ +concrete RelativeBul of Relative = CatBul ** open ResBul in { + + flags optimize=all_subs ; + + lin + RelCl cl = { + s = \\t,a,p,gn => suchRP ! gn ++ "че" ++ cl.s ! t ! a ! p ! Main ; + role = RSubj + } ; + + RelVP rp vp = { + s = \\t,a,p,gn => + let + cl = mkClause (rp.s ! gn) {gn=gn; p=P3} vp + in + cl.s ! t ! a ! p ! Main ; + role = RSubj + } ; + + RelSlash rp slash = { + s = \\t,a,p,gn => slash.c2.s ++ (rp.s ! gn) ++ slash.s ! t ! a ! p ! Main ; + role = RObj Acc + } ; + + FunRP p np rp = { + s = \\gn => np.s ! RObj Acc ++ p.s ++ rp.s ! gn ; + } ; + + IdRP = { + s = whichRP ; + } ; +} diff --git a/lib/resource-1.4/bulgarian/ResBul.gf b/lib/resource-1.4/bulgarian/ResBul.gf new file mode 100644 index 000000000..52b871842 --- /dev/null +++ b/lib/resource-1.4/bulgarian/ResBul.gf @@ -0,0 +1,583 @@ +--# -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 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 of { + => 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 + } ; + + + ---- FIXME: added by AR, used in QuestionBul and StructuralBul + genGenNum : GenNum -> DGender = \g -> case g of { + GSg Masc => DMasc ; + GSg Fem => DFem ; + GSg Neut => DNeut ; + _ => DNeut ---- + } ; + + + aform : GenNum -> Species -> Role -> AForm = \gn,spec,role -> + case gn of { + GSg g => case of { + => ASgMascDefNom ; + _ => ASg g spec + } ; + GPl => APl spec + } ; + + dgenderSpecies : DGender -> Species -> Role -> DGenderSpecies = + \g,spec,role -> case of { + => DMascIndef ; + => case role of { + RSubj => DMascDefNom ; + _ => DMascDef + } ; + => DMascPersonalIndef ; + => case role of { + RSubj => DMascPersonalDefNom ; + _ => DMascPersonalDef + } ; + => DFemIndef ; + => DFemDef ; + => DNeutIndef ; + => DNeutDef + } ; + + 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 : Tense => Anteriority => Polarity => Agr => Bool => Aspect => Str ; + imp : Polarity => Number => Aspect => Str ; + ad : Bool => Str ; -- sentential adverb + s2 : Agr => Str ; + subjRole : Role + } ; + + predV : Verb -> VP = + \verb -> + { s = \\t,a,p,agr,q,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 of { + => clitic.s++s++auxPres ; + _ => auxPres++s++clitic.s + } ; + + li = case q of {True => "ли"; False => []} ; + + 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 of { + => {aux=vf2 clitic.s; main=presentImperf} ; + => {aux=vf1 clitic.s; main=perfect} ; + => {aux=vf2 clitic.s; main=aorist} ; + => {aux=vf4 auxAorist; main=perfect} ; + => {aux=vf3 clitic.s; main=present} ; + => {aux=vf3 (apc []); main=perfect} ; + => {aux=vf4 auxCond ; main=perfect} + } + + in verbs.aux.s1 ++ verbs.main ++ verbs.aux.s2 ; + imp = \\p,n,asp => + case p of { + Pos => verb.s ! asp ! VImperative n ; + Neg => "не" ++ verb.s ! Imperf ! VImperative n + } ; + ad = \\_ => [] ; + s2 = \\_ => [] ; + subjRole = case verb.vtype of { + VNormal => RSubj ; + VMedial _ => RSubj ; + VPhrasal c => RObj c + } + } ; + + insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> { + s = vp.s ; + imp = vp.imp ; + ad = vp.ad ; + s2 = \\a => vp.s2 ! a ++ obj ! a ; + subjRole = vp.subjRole + } ; + + 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 -> table { + ASg Masc Indef => base ; + ASg Masc Def => (base+"ия") ; + ASgMascDefNom => (base+"ият") ; + ASg Fem Indef => (base+"a") ; + ASg Fem Def => (base+"ата") ; + ASg Neut Indef => (base+"о") ; + ASg Neut Def => (base+"ото") ; + APl Indef => (ia2e base+"и") ; + APl Def => (ia2e base+"ите") + }; + +-- 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 => vp.ad ! q ++ vp.s ! t ! a ! p ! agr ! q ! Perf ; + compl = vp.s2 ! agr + in case o of { + Main => subj ++ verb ! False ++ compl ; + Inv => verb ! False ++ compl ++ subj ; + Quest => subj ++ verb ! True ++ compl + } + } ; + +-- 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 => Str ; gn : GenNum} = + \koi,kogo,gn -> { + s = table { + RSubj => koi ; + RObj Acc => kogo ; + RObj Dat => "на" ++ kogo ; + RVoc => 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 : + {s1,s2 : Str} -> Clause -> + {s : Tense => Anteriority => Polarity => QForm => Str} = \wh,cl -> + { + s = \\t,a,p => + let cls = cl.s ! t ! a ! p ; + in table { + QDir => wh.s1 ++ cls ! Inv ; + QIndir => wh.s2 ++ cls ! 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 => "тези" + } ; +} diff --git a/lib/resource-1.4/bulgarian/SentenceBul.gf b/lib/resource-1.4/bulgarian/SentenceBul.gf new file mode 100644 index 000000000..9700cd2bb --- /dev/null +++ b/lib/resource-1.4/bulgarian/SentenceBul.gf @@ -0,0 +1,60 @@ +concrete SentenceBul of Sentence = CatBul ** open Prelude, ResBul in { + + flags optimize=all_subs ; + + lin + PredVP np vp = mkClause (np.s ! vp.subjRole) 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.imp ! p ! numGenNum gn ! Perf ; + compl = vp.s2 ! agr + in + verb ++ compl + } ; + + SlashVP np vp = + mkClause (np.s ! RSubj) np.a vp ** {c2 = vp.c2} ; + + AdvSlash slash adv = { + s = \\t,a,b,o => slash.s ! t ! a ! b ! o ++ adv.s ; + c2 = slash.c2 + } ; + + SlashPrep cl prep = cl ** {c2 = prep} ; + + SlashVS np vs slash = + mkClause (np.s ! RSubj) np.a + (insertObj (\\_ => "че" ++ slash.s) (predV vs)) ** + {c2 = slash.c2} ; + + EmbedS s = {s = "," ++ "че" ++ s.s} ; + EmbedQS qs = {s = qs.s ! QIndir} ; + EmbedVP vp = {s = vp.ad ! False ++ "да" ++ vp.s ! Pres ! Simul ! Pos ! {gn=GSg Masc; p=P1} ! False ! Perf} ; + + UseCl t a p cl = { + s = t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! Main + } ; + UseQCl t a p cl = { + s = \\q => t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! q + } ; + UseRCl t a p cl = { + s = \\r => t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! r ; + role = cl.role + } ; + UseSlash t a p cl = { + s = t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! Main ; + c2 = cl.c2 + } ; + + AdvS a s = {s = a.s ++ "," ++ s.s} ; + +---- FIXME: guessed by AR +-- test: she walks , which is good + + RelS s r = {s = s.s ++ "," ++ r.s ! gennum DNeut Sg} ; + +} diff --git a/lib/resource-1.4/bulgarian/StructuralBul.gf b/lib/resource-1.4/bulgarian/StructuralBul.gf new file mode 100644 index 000000000..1a0444c0c --- /dev/null +++ b/lib/resource-1.4/bulgarian/StructuralBul.gf @@ -0,0 +1,117 @@ +concrete StructuralBul of Structural = CatBul ** + open MorphoBul, ParadigmsBul, Prelude in { + + 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 = {s1 = [] ; s2 = "и" ; n = Pl} ; + because_Subj = ss "защото" ; + before_Prep = mkPrep "преди" Acc ; + behind_Prep = mkPrep "зад" Acc ; + between_Prep = mkPrep "между" Acc ; + both7and_DConj = sd2 "и" "и" ** {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 = sd2 "или" "или" ** {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 = \\_ => "колко"; n = Pl ; nonEmpty = False} ; ---- AR nonEmpty + 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 aform => regAdjective "трябвал" ! aform ; + VPluPerfect aform => regAdjective "трябвал" ! aform ; + VPassive aform => regAdjective "трябвал" ! aform ; + VPresPart aform => regAdjective "трябвал" ! aform ; + 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 = {s1 = [] ; s2 = "или" ; 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 "този" "тaзи" "това" "тези" ; + 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 ["кой";"коя";"кое";"кои"]} ; ---- FIXME AR + 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/lib/resource-1.4/bulgarian/TextBul.gf b/lib/resource-1.4/bulgarian/TextBul.gf new file mode 100644 index 000000000..f3aa46909 --- /dev/null +++ b/lib/resource-1.4/bulgarian/TextBul.gf @@ -0,0 +1,11 @@ +concrete TextBul of Text = CatBul ** { + +-- 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/lib/resource-1.4/bulgarian/VerbBul.gf b/lib/resource-1.4/bulgarian/VerbBul.gf new file mode 100644 index 000000000..fafd918f5 --- /dev/null +++ b/lib/resource-1.4/bulgarian/VerbBul.gf @@ -0,0 +1,121 @@ +concrete VerbBul of Verb = CatBul ** open Prelude, ResBul, ParadigmsBul in { + + flags optimize=all_subs ; + + lin + UseV = predV ; + + SlashV2a v = predV v ** {c2 = v.c2} ; + + Slash2V3 v np = + insertObj (\\_ => v.c2.s ++ np.s ! RObj v.c2.c) (predV v) ** {c2 = v.c3} ; + + Slash3V3 v np = + insertObj (\\_ => v.c3.s ++ np.s ! RObj v.c2.c) (predV v) ** {c2 = v.c2} ; + + ComplVV vv vp = { + s = \\t,a,p,agr,q,asp => + let + vv_verb = (predV vv).s ! t ! a ! p ! agr ! q ! asp ; + vp_verb = vp.s ! Pres ! Simul ! Pos ! agr ! False ! Perf ; + in vv_verb ++ vp.ad ! False ++ "да" ++ vp_verb ; + imp = vp.imp ; + ad = \\_ => [] ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ; + + ComplVS v s = insertObj (\\_ => "," ++ "че" ++ s.s) (predV v) ; + ComplVQ v q = insertObj (\\_ => q.s ! QIndir) (predV v) ; + + ComplVA v ap = + insertObj (\\agr => ap.s ! aform agr.gn Indef (RObj Acc)) (predV v) ; + + + SlashV2A v ap = + insertObj (\\a => v.c2.s ++ ap.s ! aform a.gn Indef (RObj Acc)) + (predV v) ** {c2 = v.c2} ; ---- FIXME: agreement with obj.a + + + SlashV2A v ap = + insertObj (\\a => v.c2.s ++ ap.s ! aform a.gn Indef (RObj Acc)) + (predV v) ** {c2 = v.c2} ; ---- FIXME: agreement with obj.a + + + ---- AR guessed these five, copying from Compl(VS,VQ,VV) + + -- test: I saw a boy to whom she said that they are here + SlashV2S v s = insertObj (\\_ => "," ++ "че" ++ s.s) (predV v) ** {c2 = v.c2} ; + + -- test: I saw a boy whom she asked who is here + SlashV2Q v q = insertObj (\\_ => q.s ! QIndir) (predV v) ** {c2 = v.c2} ; + + -- test: I saw a boy whom she begged to walk + SlashV2V vv vp = { + s = \\t,a,p,agr,q,asp => + let + vv_verb = (predV vv).s ! t ! a ! p ! agr ! q ! asp ; + vp_verb = vp.s ! Pres ! Simul ! Pos ! agr ! False ! Perf ; + in vv_verb ++ vp.ad ! False ++ "да" ++ vp_verb ; + imp = vp.imp ; + ad = \\_ => [] ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ** {c2 = vv.c2} ; + + -- test: I saw a car whom she wanted to buy + SlashVV vv vp = { + s = \\t,a,p,agr,q,asp => + let + vv_verb = (predV vv).s ! t ! a ! p ! agr ! q ! asp ; + vp_verb = vp.s ! Pres ! Simul ! Pos ! agr ! False ! Perf ; + in vv_verb ++ vp.ad ! False ++ "да" ++ vp_verb ; + imp = vp.imp ; + ad = \\_ => [] ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ** {c2 = vp.c2} ; + + -- test: I saw a car whom she begged me to buy + SlashV2VNP vv np vp = + insertObj (\\_ => vv.c2.s ++ np.s ! RObj vv.c2.c) { + s = \\t,a,p,agr,q,asp => + let + vv_verb = (predV vv).s ! t ! a ! p ! agr ! q ! asp ; + vp_verb = vp.s ! Pres ! Simul ! Pos ! agr ! False ! Perf ; + in vv_verb ++ vp.ad ! False ++ "да" ++ vp_verb ; + imp = vp.imp ; + ad = \\_ => [] ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ** {c2 = vp.c2} ; + +---- END guesses by AR + + ComplSlash vp np = insertObj (\\_ => vp.c2.s ++ np.s ! RObj vp.c2.c) vp ; + + UseComp comp = insertObj comp.s (predV verbBe) ; + + AdvVP vp adv = insertObj (\\_ => adv.s) vp ; + + AdVVP adv vp = { + s = \\t,a,p,agr,q,asp => vp.s ! t ! a ! p ! agr ! False ! asp ; + imp = vp.imp ; + ad = \\q => vp.ad ! q ++ adv.s ++ case q of {True => "ли"; False => []} ; + s2 = vp.s2 ; + subjRole = vp.subjRole + } ; + +---- ReflV2 v = predV (reflV (v ** {lock_V=<>}) v.c2.c) ; + +---- FIXME: AR cannot do this +---- ReflVP : VPSlash -> VP + + PassV2 v = insertObj (\\a => v.s ! Perf ! VPassive (aform a.gn Indef (RObj Acc))) (predV verbWould) ; + +---- UseVS, UseVQ = \vv -> {s = vv.s; c2 = noPrep; vtype = vv.vtype} ; -- no "to" + + CompAP ap = {s = \\agr => ap.s ! aform agr.gn Indef (RObj Acc)} ; + CompNP np = {s = \\_ => np.s ! RObj Acc} ; + CompAdv a = {s = \\_ => a.s} ; +} diff --git a/lib/resource-1.4/restest.gfs b/lib/resource-1.4/restest.gfs index 23a1daa14..f00a61a3d 100644 --- a/lib/resource-1.4/restest.gfs +++ b/lib/resource-1.4/restest.gfs @@ -1,152 +1,153 @@ -! date >echo treebank.txt -dc %ttb pt #1 | tb | af treebank.txt -%ttb PositA warm_A -%ttb ComparA warm_A (UsePron i_Pron) -%ttb ComplA2 married_A2 (UsePron she_Pron) -%ttb ReflA2 married_A2 -%ttb PositA (UseA2 married_A2) -%ttb SentAP (PositA good_A) (EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseComp (CompAdv here_Adv))))) -%ttb AdAP very_AdA (PositA warm_A) -%ttb PositAdvAdj warm_A -%ttb PrepNP in_Prep (DetArtSg DefArt (UseN house_N)) -%ttb ComparAdvAdj more_CAdv warm_A (UsePN john_PN) -%ttb ComparAdvAdjS more_CAdv warm_A (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV run_V))) -%ttb SubjS when_Subj (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) -%ttb AdNum (AdnCAdv more_CAdv) (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))) -%ttb ConjS and_Conj (BaseS (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV walk_V))) (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) -%ttb ConjAP and_Conj (BaseAP (PositA cold_A) (PositA warm_A)) -%ttb ConjNP or_Conj (BaseNP (UsePron she_Pron) (UsePron we_Pron)) -%ttb ConjAdv or_Conj (BaseAdv here_Adv there_Adv) -%ttb DConjS either7or_DConj (BaseS (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV walk_V))) (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) -%ttb DConjAP both7and_DConj (BaseAP (PositA warm_A) (PositA cold_A)) -%ttb DConjNP either7or_DConj (BaseNP (UsePron he_Pron) (UsePron she_Pron)) -%ttb DConjAdv both7and_DConj (BaseAdv here_Adv there_Adv) -%ttb ImpersCl (UseComp (CompAP (PositA hot_A))) -%ttb GenericCl (UseV sleep_V) -%ttb CleftNP (UsePron i_Pron) (UseRCl TPast ASimul PPos (RelVP IdRP (ComplSlash (SlashV2a do_V2) (UsePron it_Pron)))) -%ttb CleftAdv here_Adv (UseCl TPast ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) -%ttb ExistNP (DetArtSg IndefArt (UseN house_N)) -%ttb ExistIP (IdetCN (IdetQuant which_IQuant NumPl) (UseN house_N)) -%ttb PredVP (UsePron i_Pron) (ProgrVP (UseV sleep_V)) -%ttb ImpPl1 (UseV go_V) -%ttb DetArtSg DefArt (UseN man_N) -%ttb UsePN john_PN -%ttb UsePron he_Pron -%ttb PredetNP only_Predet (DetArtSg DefArt (UseN man_N)) -%ttb PPartNP (DetArtSg DefArt (UseN man_N)) see_V2 -%ttb AdvNP (UsePN paris_PN) today_Adv -%ttb RelNP (UsePN paris_PN) (UseRCl TPres ASimul PPos (RelVP IdRP (UseComp (CompAdv here_Adv)))) -%ttb DetNP (DetQuant this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) -%ttb DetCN (DetQuantOrd this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (OrdSuperl good_A)) (UseN man_N) -%ttb DetCN (DetQuant this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) (UseN man_N) -%ttb DetCN (DetQuant this_Quant NumPl) (UseN man_N) -%ttb DetCN (DetQuant this_Quant NumSg) (UseN man_N) -%ttb NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))) -%ttb NumCard (NumDigits (IIDig D_5 (IDig D_1))) -%ttb NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot1plus n5 pot01))))) -%ttb NumCard (AdNum almost_AdN (NumDigits (IIDig D_5 (IDig D_1)))) -%ttb OrdDigits (IIDig D_5 (IDig D_1)) -%ttb OrdNumeral (num (pot2as3 (pot1as2 (pot1plus n5 pot01)))) -%ttb OrdSuperl warm_A -%ttb DetCN (DetArtOrd DefArt (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (OrdSuperl good_A)) (UseN man_N) -%ttb DetCN (DetArtCard DefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (UseN man_N) -%ttb DetCN (DetArtCard IndefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 pot01)))))) (UseN man_N) -%ttb DetCN (DetArtCard DefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 pot01)))))) (UseN man_N) -%ttb DetArtSg DefArt (UseN man_N) -%ttb DetArtPl DefArt (UseN man_N) -%ttb MassNP (UseN beer_N) -%ttb DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN house_N) -%ttb UseN house_N -%ttb ComplN2 mother_N2 (DetArtSg DefArt (UseN king_N)) -%ttb ComplN2 (ComplN3 distance_N3 (DetCN (DetQuant this_Quant NumSg) (UseN city_N))) (UsePN paris_PN) -%ttb UseN2 mother_N2 -%ttb ComplN2 (Use2N3 distance_N3) (DetCN (DetQuant this_Quant NumSg) (UseN city_N)) -%ttb ComplN2 (Use3N3 distance_N3) (UsePN paris_PN) -%ttb UseN2 (Use2N3 distance_N3) -%ttb AdjCN (PositA big_A) (UseN house_N) -%ttb RelCN (UseN house_N) (UseRCl TPast ASimul PPos (RelSlash IdRP (SlashVP (UsePN john_PN) (SlashV2a buy_V2)))) -%ttb AdvCN (UseN house_N) (PrepNP on_Prep (DetArtSg DefArt (UseN hill_N))) -%ttb SentCN (UseN question_N) (EmbedQS (UseQCl TPres ASimul PPos (QuestIAdv where_IAdv (PredVP (UsePron she_Pron) (UseV sleep_V))))) -%ttb ApposCN (UseN city_N) (UsePN paris_PN) -%ttb num (pot2as3 (pot1as2 (pot0as1 (pot0 n6)))) -%ttb num (pot2as3 (pot1as2 (pot0as1 pot01))) -%ttb num (pot2as3 (pot1as2 (pot1 n6))) -%ttb num (pot2as3 (pot1as2 pot110)) -%ttb num (pot2as3 (pot1as2 pot111)) -%ttb num (pot2as3 (pot1as2 (pot1to19 n6))) -%ttb num (pot2as3 (pot1as2 (pot1 n6))) -%ttb num (pot2as3 (pot1as2 (pot1plus n6 (pot0 n5)))) -%ttb num (pot2as3 (pot2 (pot0 n4))) -%ttb num (pot2as3 (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7)))) -%ttb num (pot3 (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7)))) -%ttb num (pot3plus (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7))) (pot1as2 (pot1plus n8 (pot0 n9)))) -%ttb IDig D_8 -%ttb IIDig D_8 (IIDig D_0 (IIDig D_0 (IIDig D_1 (IIDig D_7 (IIDig D_8 (IDig D_9)))))) -%ttb PhrUtt but_PConj (UttImpSg PPos (ImpVP (AdvVP (UseV come_V) here_Adv))) (VocNP (DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN friend_N))) -%ttb PhrUtt NoPConj (UttS (UseCl TPres ASimul PPos (PredVP (UsePN john_PN) (UseV walk_V)))) NoVoc -%ttb UttQS (UseQCl TPres ASimul PPos (QuestCl (PredVP (UsePron it_Pron) (UseComp (CompAP (PositA good_A)))))) -%ttb UttImpSg PNeg (ImpVP (ReflVP (SlashV2a love_V2))) -%ttb UttImpPl PNeg (ImpVP (ReflVP (SlashV2a love_V2))) -%ttb UttImpPol PNeg (ImpVP (UseV sleep_V)) -%ttb UttIP whoPl_IP -%ttb UttIP whoSg_IP -%ttb UttIAdv why_IAdv -%ttb UttNP (DetCN (DetQuant this_Quant NumSg) (UseN man_N)) -%ttb UttAdv here_Adv -%ttb UttVP (UseV sleep_V) -%ttb VocNP (DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN friend_N)) -%ttb QuestCl (PredVP (UsePN john_PN) (UseV walk_V)) -%ttb QuestVP whoSg_IP (UseV walk_V) -%ttb QuestSlash whoSg_IP (SlashVP (UsePN john_PN) (SlashV2a love_V2)) -%ttb QuestIAdv why_IAdv (PredVP (UsePN john_PN) (UseV walk_V)) -%ttb QuestIComp (CompIAdv where_IAdv) (UsePN john_PN) -%ttb IdetCN (IdetQuant which_IQuant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) (UseN song_N) -%ttb IdetIP (IdetQuant which_IQuant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) -%ttb AdvIP whoSg_IP (PrepNP in_Prep (UsePN paris_PN)) -%ttb IdetIP (IdetQuant which_IQuant NumSg) -%ttb PrepIP with_Prep whoSg_IP -%ttb QuestIComp (CompIAdv where_IAdv) (UsePron it_Pron) -%ttb QuestIComp (CompIP whoSg_IP) (UsePron it_Pron) -%ttb ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelCl (PredVP (UsePN john_PN) (ComplSlash (SlashV2a love_V2) (UsePron she_Pron))))))) -%ttb ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelVP IdRP (ComplSlash (SlashV2a love_V2) (UsePN john_PN)))))) -%ttb ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePN john_PN) (SlashV2a love_V2)))))) -%ttb ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelSlash (FunRP possess_Prep (DetArtSg DefArt (UseN2 mother_N2)) IdRP) (SlashVP (UsePN john_PN) (SlashV2a love_V2)))))) -%ttb PredVP (UsePN john_PN) (UseV walk_V) -%ttb PredSCVP (EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV go_V)))) (UseComp (CompAP (PositA good_A))) -%ttb RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron he_Pron) (SlashV2a see_V2)))) -%ttb RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (AdvSlash (SlashVP (UsePron he_Pron) (SlashV2a see_V2)) today_Adv))) -%ttb RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashPrep (PredVP (UsePron he_Pron) (UseV walk_V)) with_Prep))) -%ttb RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVS (UsePron she_Pron) say_VS (UseSlash TPres ASimul PPos (SlashVP (UsePron he_Pron) (SlashV2a love_V2)))))) -%ttb ImpVP (ReflVP (SlashV2a love_V2)) -%ttb EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV go_V))) -%ttb EmbedQS (UseQCl TPres ASimul PPos (QuestVP whoSg_IP (UseV go_V))) -%ttb EmbedVP (UseV go_V) -%ttb UseCl TCond AAnter PNeg (PredVP (UsePN john_PN) (UseV walk_V)) -%ttb UseQCl TCond AAnter PNeg (QuestCl (PredVP (UsePN john_PN) (UseV walk_V))) -%ttb RelCN (UseN girl_N) (UseRCl TCond AAnter PNeg (RelVP IdRP (UseV walk_V))) -%ttb RelCN (UseN girl_N) (UseRCl TCond AAnter PNeg (RelSlash IdRP (SlashPrep (PredVP (UsePron i_Pron) (UseV walk_V)) with_Prep))) -%ttb RelS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) (UseRCl TPres ASimul PPos (RelVP IdRP (UseComp (CompAP (PositA good_A))))) -%ttb TEmpty -%ttb TFullStop (PhrUtt NoPConj (UttS (UseCl TPres ASimul PPos (PredVP (UsePN john_PN) (UseV walk_V)))) NoVoc) TEmpty -%ttb TQuestMark (PhrUtt NoPConj (UttQS (UseQCl TPres ASimul PPos (QuestCl (PredVP (UsePron they_Pron) (UseComp (CompAdv here_Adv)))))) NoVoc) TEmpty -%ttb TExclMark (PhrUtt NoPConj (ImpPl1 (UseV go_V)) NoVoc) TEmpty -%ttb PredVP (UsePron i_Pron) (UseV sleep_V) -%ttb PredVP (UsePron i_Pron) (ComplVV want_VV (UseV run_V)) -%ttb PredVP (UsePron i_Pron) (ComplVS say_VS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) -%ttb PredVP (UsePron i_Pron) (ComplVQ wonder_VQ (UseQCl TPres ASimul PPos (QuestVP whoSg_IP (UseV run_V)))) -%ttb PredVP (UsePron they_Pron) (ComplVA become_VA (PositA red_A)) -%ttb PredVP (UsePron i_Pron) (ComplSlash (Slash3V3 give_V3 (UsePron he_Pron)) (UsePron it_Pron)) -%ttb PredVP (UsePron i_Pron) (ComplSlash (SlashV2V beg_V2V (UseV go_V)) (UsePron she_Pron)) -%ttb PredVP (UsePron i_Pron) (ComplSlash (SlashV2S answer_V2S (UseCl TPres ASimul PPos (PredVP (UsePron it_Pron) (UseComp (CompAP (PositA good_A)))))) (UsePron he_Pron)) -%ttb PredVP (UsePron i_Pron) (ComplSlash (SlashV2Q ask_V2Q (UseQCl TPast ASimul PPos (QuestVP whoSg_IP (UseV come_V)))) (UsePron he_Pron)) -%ttb PredVP (UsePron i_Pron) (ComplSlash (SlashV2A paint_V2A (PositA red_A)) (UsePron it_Pron)) -%ttb RelCN (UseN car_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron i_Pron) (SlashVV want_VV (SlashV2a buy_V2))))) -%ttb RelCN (UseN car_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron they_Pron) (SlashV2VNP beg_V2V (UsePron i_Pron) (SlashV2a buy_V2))))) -%ttb PredVP (UsePron he_Pron) (ReflVP (SlashV2a love_V2)) -%ttb PredVP (DetNP (DetQuant this_Quant NumSg)) (UseComp (CompAP (PositA warm_A))) -%ttb PredVP (UsePron we_Pron) (PassV2 love_V2) -%ttb PredVP (UsePron we_Pron) (AdvVP (UseV sleep_V) here_Adv) -%ttb PredVP (UsePron we_Pron) (AdVVP always_AdV (UseV sleep_V)) -%ttb PredVP (UsePron we_Pron) (UseComp (CompAP (PositA small_A))) -%ttb PredVP (UsePron i_Pron) (UseComp (CompNP (DetArtSg IndefArt (UseN man_N)))) -%ttb PredVP (UsePron i_Pron) (UseComp (CompAdv here_Adv)) +i english/LangEng.gf +i finnish/LangFin.gf + +l PositA warm_A +l ComparA warm_A (UsePron i_Pron) +l ComplA2 married_A2 (UsePron she_Pron) +l ReflA2 married_A2 +l PositA (UseA2 married_A2) +l SentAP (PositA good_A) (EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseComp (CompAdv here_Adv))))) +l AdAP very_AdA (PositA warm_A) +l PositAdvAdj warm_A +l PrepNP in_Prep (DetArtSg DefArt (UseN house_N)) +l ComparAdvAdj more_CAdv warm_A (UsePN john_PN) +l ComparAdvAdjS more_CAdv warm_A (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV run_V))) +l SubjS when_Subj (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) +l AdNum (AdnCAdv more_CAdv) (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))) +l ConjS and_Conj (BaseS (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV walk_V))) (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) +l ConjAP and_Conj (BaseAP (PositA cold_A) (PositA warm_A)) +l ConjNP or_Conj (BaseNP (UsePron she_Pron) (UsePron we_Pron)) +l ConjAdv or_Conj (BaseAdv here_Adv there_Adv) +l DConjS either7or_DConj (BaseS (UseCl TPres ASimul PPos (PredVP (UsePron he_Pron) (UseV walk_V))) (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) +l DConjAP both7and_DConj (BaseAP (PositA warm_A) (PositA cold_A)) +l DConjNP either7or_DConj (BaseNP (UsePron he_Pron) (UsePron she_Pron)) +l DConjAdv both7and_DConj (BaseAdv here_Adv there_Adv) +l ImpersCl (UseComp (CompAP (PositA hot_A))) +l GenericCl (UseV sleep_V) +l CleftNP (UsePron i_Pron) (UseRCl TPast ASimul PPos (RelVP IdRP (ComplSlash (SlashV2a do_V2) (UsePron it_Pron)))) +l CleftAdv here_Adv (UseCl TPast ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) +l ExistNP (DetArtSg IndefArt (UseN house_N)) +l ExistIP (IdetCN (IdetQuant which_IQuant NumPl) (UseN house_N)) +l PredVP (UsePron i_Pron) (ProgrVP (UseV sleep_V)) +l ImpPl1 (UseV go_V) +l DetArtSg DefArt (UseN man_N) +l UsePN john_PN +l UsePron he_Pron +l PredetNP only_Predet (DetArtSg DefArt (UseN man_N)) +l PPartNP (DetArtSg DefArt (UseN man_N)) see_V2 +l AdvNP (UsePN paris_PN) today_Adv +l RelNP (UsePN paris_PN) (UseRCl TPres ASimul PPos (RelVP IdRP (UseComp (CompAdv here_Adv)))) +l DetNP (DetQuant this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) +l DetCN (DetQuantOrd this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (OrdSuperl good_A)) (UseN man_N) +l DetCN (DetQuant this_Quant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) (UseN man_N) +l DetCN (DetQuant this_Quant NumPl) (UseN man_N) +l DetCN (DetQuant this_Quant NumSg) (UseN man_N) +l NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))) +l NumCard (NumDigits (IIDig D_5 (IDig D_1))) +l NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot1plus n5 pot01))))) +l NumCard (AdNum almost_AdN (NumDigits (IIDig D_5 (IDig D_1)))) +l OrdDigits (IIDig D_5 (IDig D_1)) +l OrdNumeral (num (pot2as3 (pot1as2 (pot1plus n5 pot01)))) +l OrdSuperl warm_A +l DetCN (DetArtOrd DefArt (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (OrdSuperl good_A)) (UseN man_N) +l DetCN (DetArtCard DefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5))))))) (UseN man_N) +l DetCN (DetArtCard IndefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 pot01)))))) (UseN man_N) +l DetCN (DetArtCard DefArt (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 pot01)))))) (UseN man_N) +l DetArtSg DefArt (UseN man_N) +l DetArtPl DefArt (UseN man_N) +l MassNP (UseN beer_N) +l DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN house_N) +l UseN house_N +l ComplN2 mother_N2 (DetArtSg DefArt (UseN king_N)) +l ComplN2 (ComplN3 distance_N3 (DetCN (DetQuant this_Quant NumSg) (UseN city_N))) (UsePN paris_PN) +l UseN2 mother_N2 +l ComplN2 (Use2N3 distance_N3) (DetCN (DetQuant this_Quant NumSg) (UseN city_N)) +l ComplN2 (Use3N3 distance_N3) (UsePN paris_PN) +l UseN2 (Use2N3 distance_N3) +l AdjCN (PositA big_A) (UseN house_N) +l RelCN (UseN house_N) (UseRCl TPast ASimul PPos (RelSlash IdRP (SlashVP (UsePN john_PN) (SlashV2a buy_V2)))) +l AdvCN (UseN house_N) (PrepNP on_Prep (DetArtSg DefArt (UseN hill_N))) +l SentCN (UseN question_N) (EmbedQS (UseQCl TPres ASimul PPos (QuestIAdv where_IAdv (PredVP (UsePron she_Pron) (UseV sleep_V))))) +l ApposCN (UseN city_N) (UsePN paris_PN) +l num (pot2as3 (pot1as2 (pot0as1 (pot0 n6)))) +l num (pot2as3 (pot1as2 (pot0as1 pot01))) +l num (pot2as3 (pot1as2 (pot1 n6))) +l num (pot2as3 (pot1as2 pot110)) +l num (pot2as3 (pot1as2 pot111)) +l num (pot2as3 (pot1as2 (pot1to19 n6))) +l num (pot2as3 (pot1as2 (pot1 n6))) +l num (pot2as3 (pot1as2 (pot1plus n6 (pot0 n5)))) +l num (pot2as3 (pot2 (pot0 n4))) +l num (pot2as3 (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7)))) +l num (pot3 (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7)))) +l num (pot3plus (pot2plus (pot0 n4) (pot1plus n6 (pot0 n7))) (pot1as2 (pot1plus n8 (pot0 n9)))) +l IDig D_8 +l IIDig D_8 (IIDig D_0 (IIDig D_0 (IIDig D_1 (IIDig D_7 (IIDig D_8 (IDig D_9)))))) +l PhrUtt but_PConj (UttImpSg PPos (ImpVP (AdvVP (UseV come_V) here_Adv))) (VocNP (DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN friend_N))) +l PhrUtt NoPConj (UttS (UseCl TPres ASimul PPos (PredVP (UsePN john_PN) (UseV walk_V)))) NoVoc +l UttQS (UseQCl TPres ASimul PPos (QuestCl (PredVP (UsePron it_Pron) (UseComp (CompAP (PositA good_A)))))) +l UttImpSg PNeg (ImpVP (ReflVP (SlashV2a love_V2))) +l UttImpPl PNeg (ImpVP (ReflVP (SlashV2a love_V2))) +l UttImpPol PNeg (ImpVP (UseV sleep_V)) +l UttIP whoPl_IP +l UttIP whoSg_IP +l UttIAdv why_IAdv +l UttNP (DetCN (DetQuant this_Quant NumSg) (UseN man_N)) +l UttAdv here_Adv +l UttVP (UseV sleep_V) +l VocNP (DetCN (DetQuant (PossPron i_Pron) NumSg) (UseN friend_N)) +l QuestCl (PredVP (UsePN john_PN) (UseV walk_V)) +l QuestVP whoSg_IP (UseV walk_V) +l QuestSlash whoSg_IP (SlashVP (UsePN john_PN) (SlashV2a love_V2)) +l QuestIAdv why_IAdv (PredVP (UsePN john_PN) (UseV walk_V)) +l QuestIComp (CompIAdv where_IAdv) (UsePN john_PN) +l IdetCN (IdetQuant which_IQuant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) (UseN song_N) +l IdetIP (IdetQuant which_IQuant (NumCard (NumNumeral (num (pot2as3 (pot1as2 (pot0as1 (pot0 n5)))))))) +l AdvIP whoSg_IP (PrepNP in_Prep (UsePN paris_PN)) +l IdetIP (IdetQuant which_IQuant NumSg) +l PrepIP with_Prep whoSg_IP +l QuestIComp (CompIAdv where_IAdv) (UsePron it_Pron) +l QuestIComp (CompIP whoSg_IP) (UsePron it_Pron) +l ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelCl (PredVP (UsePN john_PN) (ComplSlash (SlashV2a love_V2) (UsePron she_Pron))))))) +l ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelVP IdRP (ComplSlash (SlashV2a love_V2) (UsePN john_PN)))))) +l ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePN john_PN) (SlashV2a love_V2)))))) +l ExistNP (DetArtSg IndefArt (RelCN (UseN woman_N) (UseRCl TPres ASimul PPos (RelSlash (FunRP possess_Prep (DetArtSg DefArt (UseN2 mother_N2)) IdRP) (SlashVP (UsePN john_PN) (SlashV2a love_V2)))))) +l PredVP (UsePN john_PN) (UseV walk_V) +l PredSCVP (EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV go_V)))) (UseComp (CompAP (PositA good_A))) +l RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron he_Pron) (SlashV2a see_V2)))) +l RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (AdvSlash (SlashVP (UsePron he_Pron) (SlashV2a see_V2)) today_Adv))) +l RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashPrep (PredVP (UsePron he_Pron) (UseV walk_V)) with_Prep))) +l RelCN (UseN girl_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVS (UsePron she_Pron) say_VS (UseSlash TPres ASimul PPos (SlashVP (UsePron he_Pron) (SlashV2a love_V2)))))) +l ImpVP (ReflVP (SlashV2a love_V2)) +l EmbedS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV go_V))) +l EmbedQS (UseQCl TPres ASimul PPos (QuestVP whoSg_IP (UseV go_V))) +l EmbedVP (UseV go_V) +l UseCl TCond AAnter PNeg (PredVP (UsePN john_PN) (UseV walk_V)) +l UseQCl TCond AAnter PNeg (QuestCl (PredVP (UsePN john_PN) (UseV walk_V))) +l RelCN (UseN girl_N) (UseRCl TCond AAnter PNeg (RelVP IdRP (UseV walk_V))) +l RelCN (UseN girl_N) (UseRCl TCond AAnter PNeg (RelSlash IdRP (SlashPrep (PredVP (UsePron i_Pron) (UseV walk_V)) with_Prep))) +l RelS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV sleep_V))) (UseRCl TPres ASimul PPos (RelVP IdRP (UseComp (CompAP (PositA good_A))))) +l TEmpty +l TFullStop (PhrUtt NoPConj (UttS (UseCl TPres ASimul PPos (PredVP (UsePN john_PN) (UseV walk_V)))) NoVoc) TEmpty +l TQuestMark (PhrUtt NoPConj (UttQS (UseQCl TPres ASimul PPos (QuestCl (PredVP (UsePron they_Pron) (UseComp (CompAdv here_Adv)))))) NoVoc) TEmpty +l TExclMark (PhrUtt NoPConj (ImpPl1 (UseV go_V)) NoVoc) TEmpty +l PredVP (UsePron i_Pron) (UseV sleep_V) +l PredVP (UsePron i_Pron) (ComplVV want_VV (UseV run_V)) +l PredVP (UsePron i_Pron) (ComplVS say_VS (UseCl TPres ASimul PPos (PredVP (UsePron she_Pron) (UseV run_V)))) +l PredVP (UsePron i_Pron) (ComplVQ wonder_VQ (UseQCl TPres ASimul PPos (QuestVP whoSg_IP (UseV run_V)))) +l PredVP (UsePron they_Pron) (ComplVA become_VA (PositA red_A)) +l PredVP (UsePron i_Pron) (ComplSlash (Slash3V3 give_V3 (UsePron he_Pron)) (UsePron it_Pron)) +l PredVP (UsePron i_Pron) (ComplSlash (SlashV2V beg_V2V (UseV go_V)) (UsePron she_Pron)) +l PredVP (UsePron i_Pron) (ComplSlash (SlashV2S answer_V2S (UseCl TPres ASimul PPos (PredVP (UsePron it_Pron) (UseComp (CompAP (PositA good_A)))))) (UsePron he_Pron)) +l PredVP (UsePron i_Pron) (ComplSlash (SlashV2Q ask_V2Q (UseQCl TPast ASimul PPos (QuestVP whoSg_IP (UseV come_V)))) (UsePron he_Pron)) +l PredVP (UsePron i_Pron) (ComplSlash (SlashV2A paint_V2A (PositA red_A)) (UsePron it_Pron)) +l RelCN (UseN car_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron i_Pron) (SlashVV want_VV (SlashV2a buy_V2))))) +l RelCN (UseN car_N) (UseRCl TPres ASimul PPos (RelSlash IdRP (SlashVP (UsePron they_Pron) (SlashV2VNP beg_V2V (UsePron i_Pron) (SlashV2a buy_V2))))) +l PredVP (UsePron he_Pron) (ReflVP (SlashV2a love_V2)) +l PredVP (DetNP (DetQuant this_Quant NumSg)) (UseComp (CompAP (PositA warm_A))) +l PredVP (UsePron we_Pron) (PassV2 love_V2) +l PredVP (UsePron we_Pron) (AdvVP (UseV sleep_V) here_Adv) +l PredVP (UsePron we_Pron) (AdVVP always_AdV (UseV sleep_V)) +l PredVP (UsePron we_Pron) (UseComp (CompAP (PositA small_A))) +l PredVP (UsePron i_Pron) (UseComp (CompNP (DetArtSg IndefArt (UseN man_N)))) +l PredVP (UsePron i_Pron) (UseComp (CompAdv here_Adv))