From f2ac424bfe339b7ca4b29d5e6980a32063c11b83 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Tue, 9 Jun 2026 07:01:11 +0200 Subject: [PATCH] first draft of a Belarusian grammar --- src/belarusian/AdjectiveBel.gf | 12 +- src/belarusian/AdverbBel.gf | 13 ++ src/belarusian/CatBel.gf | 80 +++++++--- src/belarusian/ConjunctionBel.gf | 60 ++++++++ src/belarusian/ConstructionBel.gf | 141 ++++++++++++++++++ src/belarusian/ExtendBel.gf | 239 +++++++++++++++++++++++++++++- src/belarusian/GrammarBel.gf | 11 +- src/belarusian/IdiomBel.gf | 22 +++ src/belarusian/LangBel.gf | 6 +- src/belarusian/NamesBel.gf | 19 +++ src/belarusian/NounBel.gf | 124 +++++++++++++++- src/belarusian/NumeralBel.gf | 65 ++++++++ src/belarusian/ParadigmsBel.gf | 41 +++-- src/belarusian/PhraseBel.gf | 16 +- src/belarusian/QuestionBel.gf | 50 +++++++ src/belarusian/RelativeBel.gf | 11 ++ src/belarusian/ResBel.gf | 119 ++++++++++++++- src/belarusian/SentenceBel.gf | 45 ++++++ src/belarusian/StructuralBel.gf | 114 +++++++++++++- src/belarusian/VerbBel.gf | 138 +++++++++++++++++ 20 files changed, 1274 insertions(+), 52 deletions(-) create mode 100644 src/belarusian/AdverbBel.gf create mode 100644 src/belarusian/ConjunctionBel.gf create mode 100644 src/belarusian/ConstructionBel.gf create mode 100644 src/belarusian/IdiomBel.gf create mode 100644 src/belarusian/NamesBel.gf create mode 100644 src/belarusian/NumeralBel.gf create mode 100644 src/belarusian/QuestionBel.gf create mode 100644 src/belarusian/RelativeBel.gf create mode 100644 src/belarusian/SentenceBel.gf create mode 100644 src/belarusian/VerbBel.gf diff --git a/src/belarusian/AdjectiveBel.gf b/src/belarusian/AdjectiveBel.gf index 1ea6e1a5..81f7c2c7 100644 --- a/src/belarusian/AdjectiveBel.gf +++ b/src/belarusian/AdjectiveBel.gf @@ -1,4 +1,14 @@ -concrete AdjectiveBel of Adjective = CatBel ** { +concrete AdjectiveBel of Adjective = CatBel ** open ResBel in { lin PositA a = a ; + ComparA a np = {s = \\c,gn => "больш" ++ a.s ! c ! gn ++ "за" ++ np.s ! Acc} ; + ComplA2 a np = {s = \\c,gn => a.s ! c ! gn ++ prepNP a.c2 np} ; + ReflA2 a = {s = \\c,gn => a.s ! c ! gn ++ "да сябе"} ; + UseA2 a = a ; + UseComparA a = {s = \\c,gn => "больш" ++ a.s ! c ! gn} ; + CAdvAP cadv ap np = {s = \\c,gn => cadv.s ++ ap.s ! c ! gn ++ cadv.p ++ np.s ! Nom} ; + AdjOrd ord = ord ; + SentAP ap sc = {s = \\c,gn => ap.s ! c ! gn ++ sc.s} ; + AdAP ada ap = {s = \\c,gn => ada.s ++ ap.s ! c ! gn} ; + AdvAP ap adv = {s = \\c,gn => ap.s ! c ! gn ++ adv.s} ; } diff --git a/src/belarusian/AdverbBel.gf b/src/belarusian/AdverbBel.gf new file mode 100644 index 00000000..b1d969f8 --- /dev/null +++ b/src/belarusian/AdverbBel.gf @@ -0,0 +1,13 @@ +concrete AdverbBel of Adverb = CatBel ** open ResBel in { + +lin + PositAdvAdj a = {s = a.s ! Nom ! GSg Neuter} ; + PrepNP prep np = {s = prepNP prep np} ; + ComparAdvAdj cadv a np = {s = cadv.s ++ a.s ! Nom ! GSg Neuter ++ cadv.p ++ np.s ! Nom} ; + ComparAdvAdjS cadv a s = {s = cadv.s ++ a.s ! Nom ! GSg Neuter ++ cadv.p ++ s.s} ; + AdAdv ada adv = {s = ada.s ++ adv.s} ; + PositAdAAdj a = {s = a.s ! Nom ! GSg Neuter} ; + SubjS subj s = {s = subj.s ++ s.s} ; + AdnCAdv cadv = {s = cadv.s} ; + +} diff --git a/src/belarusian/CatBel.gf b/src/belarusian/CatBel.gf index 7dd54c22..6b471ad4 100644 --- a/src/belarusian/CatBel.gf +++ b/src/belarusian/CatBel.gf @@ -1,22 +1,68 @@ -concrete CatBel of Cat = CommonX ** open ResBel in { +concrete CatBel of Cat = CommonX ** open ResBel, (R = ParamX) in { -lincat N = Noun ; -lincat N2 = Noun ** {c2 : Compl} ; -lincat N3 = Noun ** {c2,c3 : Compl} ; -lincat Pron = {s: Case => Str; g: Gender; n : Number; p: Person} ; -lincat V = Verb ; -lincat VV,VS,VQ,VA = Verb ; -lincat V2 = Verb ** {c2 : Compl} ; -lincat V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl} ; -lincat A = Adj ; -lincat A2 = Adj ** {c2 : Compl} ; -lincat Prep = Compl ; -lincat CN = CommonNoun ; -lincat AP = AdjPhrase ; -lincat S = {s : Str} ; +lincat + S = {s : Str} ; + QS = {s : Str} ; + RS = {s : Str} ; + Cl = {s : R.Tense => R.Polarity => Str} ; + ClSlash = {s : R.Tense => R.Polarity => Str; c : Compl} ; + SSlash = {s : Str; c : Compl} ; + Imp = {s : R.Polarity => Number => Str} ; -lincat LN,SN,GN,PN = {s : Str} ; + QCl = {s : R.Tense => R.Polarity => Str} ; + IP = NPhrase ; + IComp = {s : Str} ; + IDet = {s : Case => Gender => Str; n : Number} ; + IQuant = {s : Case => Gender => Number => Str} ; -linref V,VV,V2,V3,V2A,V2S,V2Q,V2V = \v -> v.infinitive ; + RCl = {s : R.Tense => R.Polarity => Str} ; + RP = {s : Str} ; + + VP = VPhrase ; + Comp = {s : Agr => Str} ; + VPSlash = VSlash ; + + N = Noun ; + N2 = Noun ** {c2 : Compl} ; + N3 = Noun ** {c2,c3 : Compl} ; + CN = CommonNoun ; + NP = NPhrase ; + Pron = {s: Case => Str; a: Agr} ; + Det = {s : Case => Gender => Str; n : Number} ; + Predet = {s : Case => Gender => Number => Str} ; + Quant = {s : Case => Gender => Number => Str} ; + Num = {s : Case => Gender => Str; n : Number} ; + Card = {s : Str; n : Number} ; + ACard = {s : Str; n : Number} ; + Ord = Adj ; + DAP = {s : Case => Gender => Str; n : Number} ; + + Numeral = {s : Str} ; + Digits = {s : Str} ; + Decimal = {s : Str} ; + + Conj = {s : Str; n : Number} ; + Subj = {s : Str} ; + Prep = Compl ; + + V = Verb ; + VV,VS,VQ,VA = Verb ; + V2 = Verb ** {c2 : Compl} ; + V3,V2A,V2S,V2Q,V2V = Verb ** {c2,c3 : Compl} ; + A = Adj ; + A2 = Adj ** {c2 : Compl} ; + AP = AdjPhrase ; + + LN = {s : Case => Str; g : Gender; n : Number} ; + PN = {s : Case => Str; g : Gender; n : Number} ; + GN = {s : Str; g : Gender} ; + SN = {s : Str} ; + +linref + V,VV,V2,V3,V2A,V2S,V2Q,V2V = \v -> v.infinitive ; + N,N2,N3 = \n -> n.s ! Nom ! Sg ; + A,A2,AP,Ord = \a -> a.s ! Nom ! GSg Masc ; + NP,IP = \np -> np.s ! Nom ; + S,QS,RS = \s -> s.s ; } diff --git a/src/belarusian/ConjunctionBel.gf b/src/belarusian/ConjunctionBel.gf new file mode 100644 index 00000000..a79a47cd --- /dev/null +++ b/src/belarusian/ConjunctionBel.gf @@ -0,0 +1,60 @@ +concrete ConjunctionBel of Conjunction = CatBel ** open ResBel in { + +lin + ConjS conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ConjRS conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ConjAP conj xs = {s = \\c,gn => xs.s1 ! c ! gn ++ conj.s ++ xs.s2 ! c ! gn} ; + ConjNP conj xs = { + s = \\c => xs.s1 ! c ++ conj.s ++ xs.s2 ! c ; + a = {g=Masc; n=conj.n; p=P3} + } ; + ConjAdv conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ConjAdV conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ConjIAdv conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ConjCN conj xs = { + s = \\c,n => xs.s1 ! c ! n ++ conj.s ++ xs.s2 ! c ! n ; + voc = xs.voc ; + g = xs.g + } ; + ConjDet conj xs = { + s = \\c,g => xs.s1 ! c ! g ++ conj.s ++ xs.s2 ! c ! g ; + n = conj.n + } ; + + BaseS x y = {s1 = x.s; s2 = y.s} ; + ConsS x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + BaseRS x y = {s1 = x.s; s2 = y.s} ; + ConsRS x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + BaseAdv x y = {s1 = x.s; s2 = y.s} ; + ConsAdv x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + BaseAdV x y = {s1 = x.s; s2 = y.s} ; + ConsAdV x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + BaseIAdv x y = {s1 = x.s; s2 = y.s} ; + ConsIAdv x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + BaseNP x y = { + s1 = x.s ; + s2 = y.s + } ; + ConsNP x xs = { + s1 = \\c => x.s ! c ++ "," ++ xs.s1 ! c ; + s2 = xs.s2 + } ; + BaseAP x y = {s1 = x.s; s2 = y.s} ; + ConsAP x xs = {s1 = \\c,gn => x.s ! c ! gn ++ "," ++ xs.s1 ! c ! gn; s2 = xs.s2} ; + BaseCN x y = {s1 = x.s; s2 = y.s; voc = x.voc ++ "," ++ y.voc; g = x.g} ; + ConsCN x xs = {s1 = \\c,n => x.s ! c ! n ++ "," ++ xs.s1 ! c ! n; s2 = xs.s2; voc = x.voc ++ "," ++ xs.voc; g = xs.g} ; + BaseDAP x y = {s1 = x.s; s2 = y.s} ; + ConsDAP x xs = {s1 = \\c,g => x.s ! c ! g ++ "," ++ xs.s1 ! c ! g; s2 = xs.s2} ; + +lincat + [S] = {s1,s2 : Str} ; + [RS] = {s1,s2 : Str} ; + [Adv] = {s1,s2 : Str} ; + [AdV] = {s1,s2 : Str} ; + [IAdv] = {s1,s2 : Str} ; + [NP] = {s1,s2 : Case => Str} ; + [AP] = {s1,s2 : Case => GenNum => Str} ; + [CN] = {s1,s2 : Case => Number => Str; voc : Str; g : Gender} ; + [DAP] = {s1,s2 : Case => Gender => Str} ; + +} diff --git a/src/belarusian/ConstructionBel.gf b/src/belarusian/ConstructionBel.gf new file mode 100644 index 00000000..380a9844 --- /dev/null +++ b/src/belarusian/ConstructionBel.gf @@ -0,0 +1,141 @@ +concrete ConstructionBel of Construction = CatBel ** open ResBel, ParadigmsBel, (R = ParamX) in { + +lincat + Timeunit, Hour, Weekday, Month, Monthday, Year, Language = {s : Str} ; + +oper + adjVP : Adj -> VPhrase = \a -> { + s = \\t,p,agr => copula t p agr ++ a.s ! Nom ! genNum agr.g agr.n ; + inf = "быць" ++ a.s ! Nom ! GSg Masc ; + imp = \\p,_ => neg p ++ "будзь" ++ a.s ! Nom ! GSg Masc + } ; + +lin + hungry_VP = adjVP (mkA "галодны") ; + thirsty_VP = adjVP (mkA "спрагнены") ; + tired_VP = adjVP (mkA "стомлены") ; + scared_VP = adjVP (mkA "спалоханы") ; + ill_VP = adjVP (mkA "хворы") ; + ready_VP = adjVP (mkA "гатовы") ; + has_age_VP card = { + s = \\t,p,a => copula t p a ++ card.s ++ "гадоў" ; + inf = card.s ++ "гадоў" ; + imp = \\p,_ => neg p ++ card.s ++ "гадоў" + } ; + + have_name_Cl np name = {s = \\t,p => np.s ! Gen ++ "імя" ++ name.s ! Nom} ; + married_Cl np spouse = {s = \\t,p => np.s ! Nom ++ copula t p np.a ++ "жанаты" ++ "з" ++ spouse.s ! Instr} ; + what_name_QCl np = {s = \\t,p => "як" ++ "завуць" ++ np.s ! Acc} ; + how_old_QCl np = {s = \\t,p => "колькі гадоў" ++ np.s ! Dat} ; + how_far_QCl np = {s = \\t,p => "як далёка" ++ np.s ! Nom} ; + + weather_adjCl ap = {s = \\t,p => copula t p defaultAgr ++ ap.s ! Nom ! GSg Neuter} ; + is_right_VP = adjVP (mkA "правы") ; + is_wrong_VP = adjVP (mkA "няправы") ; + + n_units_AP card cn a = {s = \\c,gn => card.s ++ cn.s ! Gen ! Pl ++ a.s ! c ! gn} ; + n_units_of_NP card cn np = mkSimpleNP (card.s ++ cn.s ! Gen ! Pl ++ np.s ! Gen) Neuter Sg P3 ; + n_unit_CN card unit cn = nounFromStr (card.s ++ unit.s ! Nom ! Pl ++ cn.s ! Nom ! Sg) cn.g ; + + bottle_of_CN np = nounFromStr ("бутэлька" ++ np.s ! Gen) Fem ; + cup_of_CN np = nounFromStr ("кубак" ++ np.s ! Gen) Masc ; + glass_of_CN np = nounFromStr ("шклянка" ++ np.s ! Gen) Fem ; + few_X_short_of_Y np x y = {s = np.s ! Nom ++ "бракуе" ++ x.s ! Gen ! Pl ++ "да" ++ y.s ! Gen ! Sg} ; + + timeunitAdv card unit = {s = card.s ++ unit.s} ; + timeunitRange c1 c2 unit = {s = c1.s ++ "да" ++ c2.s ++ unit.s} ; + oneHour = {s = "1"} ; twoHour = {s = "2"} ; threeHour = {s = "3"} ; fourHour = {s = "4"} ; + fiveHour = {s = "5"} ; sixHour = {s = "6"} ; sevenHour = {s = "7"} ; eightHour = {s = "8"} ; + nineHour = {s = "9"} ; tenHour = {s = "10"} ; elevenHour = {s = "11"} ; twelveHour = {s = "12"} ; + thirteenHour = {s = "13"} ; fourteenHour = {s = "14"} ; fifteenHour = {s = "15"} ; sixteenHour = {s = "16"} ; + seventeenHour = {s = "17"} ; eighteenHour = {s = "18"} ; nineteenHour = {s = "19"} ; twentyHour = {s = "20"} ; + twentyOneHour = {s = "21"} ; twentyTwoHour = {s = "22"} ; twentyThreeHour = {s = "23"} ; twentyFourHour = {s = "24"} ; + timeHour h = {s = "а" ++ h.s} ; + timeHourMinute h m = {s = "а" ++ h.s ++ ":" ++ m.s} ; + + weekdayPunctualAdv d = {s = "у" ++ d.s} ; + weekdayHabitualAdv d = {s = "па" ++ d.s} ; + weekdayLastAdv d = {s = "мінулай" ++ d.s} ; + weekdayNextAdv d = {s = "наступнай" ++ d.s} ; + monthAdv m = {s = "у" ++ m.s} ; + yearAdv y = {s = "у" ++ y.s} ; + dayMonthAdv d m = {s = d.s ++ m.s} ; + monthYearAdv m y = {s = m.s ++ y.s} ; + dayMonthYearAdv d m y = {s = d.s ++ m.s ++ y.s} ; + intYear i = {s = i.s} ; + intMonthday i = {s = i.s} ; + + InLanguage l = {s = "па-" ++ l.s} ; + weekdayN d = nounFromStr d.s Masc ; + monthN m = nounFromStr m.s Masc ; + weekdayPN d = mkPN d.s ; + monthPN m = mkPN m.s ; + languageNP l = mkSimpleNP l.s Neuter Sg P3 ; + languageCN l = nounFromStr l.s Neuter ; + + second_Timeunit = {s = "секунд"} ; + minute_Timeunit = {s = "хвілін"} ; + hour_Timeunit = {s = "гадзін"} ; + day_Timeunit = {s = "дзён"} ; + week_Timeunit = {s = "тыдняў"} ; + month_Timeunit = {s = "месяцаў"} ; + year_Timeunit = {s = "гадоў"} ; + + monday_Weekday = {s = "панядзелак"} ; + tuesday_Weekday = {s = "аўторак"} ; + wednesday_Weekday = {s = "серада"} ; + thursday_Weekday = {s = "чацвер"} ; + friday_Weekday = {s = "пятніца"} ; + saturday_Weekday = {s = "субота"} ; + sunday_Weekday = {s = "нядзеля"} ; + + january_Month = {s = "студзень"} ; + february_Month = {s = "люты"} ; + march_Month = {s = "сакавік"} ; + april_Month = {s = "красавік"} ; + may_Month = {s = "май"} ; + june_Month = {s = "чэрвень"} ; + july_Month = {s = "ліпень"} ; + august_Month = {s = "жнівень"} ; + september_Month = {s = "верасень"} ; + october_Month = {s = "кастрычнік"} ; + november_Month = {s = "лістапад"} ; + december_Month = {s = "снежань"} ; + + afrikaans_Language = {s = "афрыкаанс"} ; + amharic_Language = {s = "амхарску"} ; + arabic_Language = {s = "арабску"} ; + bulgarian_Language = {s = "балгарску"} ; + catalan_Language = {s = "каталанску"} ; + chinese_Language = {s = "кітайску"} ; + danish_Language = {s = "дацку"} ; + dutch_Language = {s = "нідэрландску"} ; + english_Language = {s = "англійску"} ; + estonian_Language = {s = "эстонску"} ; + finnish_Language = {s = "фінску"} ; + french_Language = {s = "французску"} ; + german_Language = {s = "нямецку"} ; + greek_Language = {s = "грэцку"} ; + hebrew_Language = {s = "іўрыце"} ; + hindi_Language = {s = "хіндзі"} ; + japanese_Language = {s = "японску"} ; + italian_Language = {s = "італьянску"} ; + latin_Language = {s = "лацінску"} ; + latvian_Language = {s = "латышску"} ; + maltese_Language = {s = "мальтыйску"} ; + nepali_Language = {s = "непальску"} ; + norwegian_Language = {s = "нарвежску"} ; + persian_Language = {s = "персідску"} ; + polish_Language = {s = "польску"} ; + punjabi_Language = {s = "панджабі"} ; + romanian_Language = {s = "румынску"} ; + russian_Language = {s = "руску"} ; + sindhi_Language = {s = "сіндхі"} ; + spanish_Language = {s = "іспанску"} ; + swahili_Language = {s = "суахілі"} ; + swedish_Language = {s = "шведску"} ; + thai_Language = {s = "тайску"} ; + turkish_Language = {s = "турэцку"} ; + urdu_Language = {s = "урду"} ; + +} diff --git a/src/belarusian/ExtendBel.gf b/src/belarusian/ExtendBel.gf index ecfc3147..60048722 100644 --- a/src/belarusian/ExtendBel.gf +++ b/src/belarusian/ExtendBel.gf @@ -1,15 +1,244 @@ --# -path=.:../abstract:../common:prelude -concrete ExtendBel of Extend = CatBel ** open ResBel, ParadigmsBel in { +concrete ExtendBel of Extend = CatBel ** open ResBel, (R = ParamX), ParadigmsBel in { + +lincat + VPS = {s : Agr => Str} ; + [VPS] = {s1,s2 : Agr => Str} ; + VPI = {s : Str} ; + [VPI] = {s1,s2 : Str} ; + VPS2 = {s : Agr => Str; c : Compl; post : Str} ; + [VPS2] = {s1,s2 : Agr => Str; c : Compl; post : Str} ; + VPI2 = {s : Str; c : Compl; post : Str} ; + [VPI2] = {s1,s2 : Str; c : Compl; post : Str} ; + [Comp] = {s1,s2 : Agr => Str} ; + [Imp] = {s1,s2 : R.Polarity => Number => Str} ; + RNP = {s : Case => Str} ; + RNPList = {s1,s2 : Case => Str} ; + X = {s : Str} ; lin iFem_Pron = mkPron "я" "мяне" "мне" "мяне" "мне" "мной" Fem Sg P1 ; - youFem_Pron = mkPron "ты" "табе" "табе" "табе" "табе" "табой" Fem Sg P2 ; - weFem_Pron = mkPron "мы" "нас" "нам" "нас" "наc" "намі" Fem Pl P1 ; + youFem_Pron = mkPron "ты" "цябе" "табе" "цябе" "табе" "табой" Fem Sg P2 ; + weFem_Pron = mkPron "мы" "нас" "нам" "нас" "нас" "намі" Fem Pl P1 ; youPlFem_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Fem Pl P2 ; - theyFem_Pron = mkPron "вони" "їх" "їм" "їх" "них" "ними" Fem Pl P3 ; + theyFem_Pron = mkPron "яны" "іх" "ім" "іх" "іх" "імі" Fem Pl P3 ; + theyNeutr_Pron = mkPron "яны" "іх" "ім" "іх" "іх" "імі" Neuter Pl P3 ; youPolFem_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Fem Pl P2 ; youPolPl_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Fem Pl P2 ; youPolPlFem_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Fem Pl P2 ; -} + GenNP np = {s = \\_,_,_ => np.s ! Gen} ; + GenIP ip = {s = \\_,_,_ => ip.s ! Gen} ; + GenRP num cn = {s = cn.s ! Gen ! num.n ++ "якога"} ; + GenModNP num np cn = { + s = \\c => np.s ! Gen ++ cn.s ! c ! num.n ; + a = {g=cn.g; n=num.n; p=P3} + } ; + GenModIP num ip cn = { + s = \\c => ip.s ! Gen ++ cn.s ! c ! num.n ; + a = {g=cn.g; n=num.n; p=P3} + } ; + CompBareCN cn = {s = \\a => cn.s ! Nom ! a.n} ; + PiedPipingQuestSlash ip cl = {s = \\t,p => cl.c.s ++ ip.s ! cl.c.c ++ cl.s ! t ! p} ; + PiedPipingRelSlash rp cl = {s = \\t,p => rp.s ++ cl.s ! t ! p} ; + StrandQuestSlash ip cl = {s = \\t,p => cl.c.s ++ ip.s ! cl.c.c ++ cl.s ! t ! p} ; + StrandRelSlash rp cl = {s = \\t,p => rp.s ++ cl.s ! t ! p} ; + EmptyRelSlash cl = {s = \\t,p => "што" ++ cl.s ! t ! p} ; + + MkVPS temp pol vp = {s = \\a => vp.s ! temp.t ! pol.p ! a} ; + ConjVPS conj xs = {s = \\a => xs.s1 ! a ++ conj.s ++ xs.s2 ! a} ; + PredVPS np vps = {s = np.s ! Nom ++ vps.s ! np.a} ; + SQuestVPS np vps = {s = np.s ! Nom ++ vps.s ! np.a} ; + QuestVPS ip vps = {s = ip.s ! Nom ++ vps.s ! ip.a} ; + RelVPS rp vps = {s = rp.s ++ vps.s ! defaultAgr} ; + BaseVPS x y = {s1 = x.s; s2 = y.s} ; + ConsVPS x xs = {s1 = \\a => x.s ! a ++ "," ++ xs.s1 ! a; s2 = xs.s2} ; + + ExistS temp pol np = {s = copula temp.t pol.p np.a ++ np.s ! Nom} ; + ExistNPQS temp pol np = {s = copula temp.t pol.p np.a ++ np.s ! Nom} ; + ExistIPQS temp pol ip = {s = copula temp.t pol.p ip.a ++ ip.s ! Nom} ; + + MkVPI vp = {s = vp.inf} ; + ConjVPI conj xs = {s = xs.s1 ++ conj.s ++ xs.s2} ; + ComplVPIVV vv vpi = { + s = \\t,p,a => finiteVerb vv t p a ++ vpi.s ; + inf = vv.infinitive ++ vpi.s ; + imp = \\p,n => neg p ++ vv.imperative ! n ++ vpi.s + } ; + BaseVPI x y = {s1 = x.s; s2 = y.s} ; + ConsVPI x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2} ; + + MkVPS2 temp pol vp = {s = \\a => vp.s ! temp.t ! pol.p ! a; c = vp.c; post = vp.post} ; + ConjVPS2 conj xs = {s = \\a => xs.s1 ! a ++ conj.s ++ xs.s2 ! a; c = xs.c; post = xs.post} ; + ComplVPS2 vps np = {s = \\a => vps.s ! a ++ prepNP vps.c np ++ vps.post} ; + ReflVPS2 vps rnp = {s = \\a => vps.s ! a ++ rnp.s ! vps.c.c ++ vps.post} ; + BaseVPS2 x y = {s1 = x.s; s2 = y.s; c = x.c; post = x.post ++ y.post} ; + ConsVPS2 x xs = {s1 = \\a => x.s ! a ++ "," ++ xs.s1 ! a; s2 = xs.s2; c = xs.c; post = x.post ++ xs.post} ; + + MkVPI2 vp = {s = vp.inf; c = vp.c; post = vp.post} ; + ConjVPI2 conj xs = {s = xs.s1 ++ conj.s ++ xs.s2; c = xs.c; post = xs.post} ; + ComplVPI2 vpi np = {s = vpi.s ++ prepNP vpi.c np ++ vpi.post} ; + BaseVPI2 x y = {s1 = x.s; s2 = y.s; c = x.c; post = x.post ++ y.post} ; + ConsVPI2 x xs = {s1 = x.s ++ "," ++ xs.s1; s2 = xs.s2; c = xs.c; post = x.post ++ xs.post} ; + + ConjComp conj xs = {s = \\a => xs.s1 ! a ++ conj.s ++ xs.s2 ! a} ; + BaseComp x y = {s1 = x.s; s2 = y.s} ; + ConsComp x xs = {s1 = \\a => x.s ! a ++ "," ++ xs.s1 ! a; s2 = xs.s2} ; + ConjImp conj xs = {s = \\p,n => xs.s1 ! p ! n ++ conj.s ++ xs.s2 ! p ! n} ; + BaseImp x y = {s1 = x.s; s2 = y.s} ; + ConsImp x xs = {s1 = \\p,n => x.s ! p ! n ++ "," ++ xs.s1 ! p ! n; s2 = xs.s2} ; + + ProDrop pron = pron ; + ICompAP ap = {s = ap.s ! Nom ! GSg Masc} ; + IAdvAdv adv = {s = adv.s} ; + CompIQuant iq = {s = iq.s ! Nom ! Masc ! Sg} ; + PrepCN prep cn = {s = prep.s ++ cn.s ! prep.c ! Sg} ; + + FocusObj np ss = {s = np.s ! Acc ++ ss.s} ; + FocusAdv adv s = {s = adv.s ++ s.s} ; + FocusAdV adv s = {s = adv.s ++ s.s} ; + FocusAP ap np = {s = ap.s ! Nom ! genNum np.a.g np.a.n ++ np.s ! Nom} ; + + PresPartAP vp = adjFromStr vp.inf ; + EmbedPresPart vp = {s = vp.inf} ; + PastPartAP vp = adjFromStr vp.inf ; + PastPartAgentAP vp np = adjFromStr (vp.inf ++ prepNP (mkPrep "кім" instrumental) np) ; + PassVPSlash vp = { + s = \\t,p,a => copula t p a ++ vp.inf ; + inf = "быць" ++ vp.inf ; + imp = \\p,_ => neg p ++ "будзь" ++ vp.inf + } ; + PassAgentVPSlash vp np = addAdvVP (PassVPSlash vp) (prepNP (mkPrep "кім" instrumental) np) ; + NominalizeVPSlashNP vp np = mkSimpleNP (vp.inf ++ prepNP vp.c np) Neuter Sg P3 ; + ProgrVPSlash vp = vp ; + A2VPSlash a = { + s = \\t,p,agr => copula t p agr ++ a.s ! Nom ! genNum agr.g agr.n ; + inf = a.s ! Nom ! GSg Masc ; + c = a.c2 ; + imp = \\p,_ => neg p ++ a.s ! Nom ! GSg Masc ; + post = [] + } ; + N2VPSlash n = { + s = \\t,p,agr => copula t p agr ++ n.s ! Nom ! agr.n ; + inf = n.s ! Nom ! Sg ; + c = n.c2 ; + imp = \\p,_ => neg p ++ n.s ! Nom ! Sg ; + post = [] + } ; + ExistsNP np = {s = \\t,p => copula t p np.a ++ np.s ! Nom} ; + ExistCN cn = {s = \\t,p => copula t p {g=cn.g; n=Sg; p=P3} ++ cn.s ! Nom ! Sg} ; + ExistMassCN cn = ExistCN cn ; + ExistPluralCN cn = {s = \\t,p => copula t p {g=cn.g; n=Pl; p=P3} ++ cn.s ! Nom ! Pl} ; + AdvIsNP adv np = {s = \\t,p => adv.s ++ copula t p np.a ++ np.s ! Nom} ; + AdvIsNPAP adv np ap = {s = \\t,p => adv.s ++ copula t p np.a ++ np.s ! Nom ++ ap.s ! Nom ! genNum np.a.g np.a.n} ; + PurposeVP vp = {s = "каб" ++ vp.inf} ; + ComplBareVS vs s = { + s = \\t,p,a => finiteVerb vs t p a ++ s.s ; + inf = vs.infinitive ++ s.s ; + imp = \\p,n => neg p ++ vs.imperative ! n ++ s.s + } ; + SlashBareV2S v s = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ s.s ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = s.s + } ; + ComplDirectVS vs utt = { + s = \\t,p,a => finiteVerb vs t p a ++ utt.s ; + inf = vs.infinitive ++ utt.s ; + imp = \\p,n => neg p ++ vs.imperative ! n ++ utt.s + } ; + ComplDirectVQ vq utt = { + s = \\t,p,a => finiteVerb vq t p a ++ utt.s ; + inf = vq.infinitive ++ utt.s ; + imp = \\p,n => neg p ++ vq.imperative ! n ++ utt.s + } ; + FrontComplDirectVS np vs utt = {s = \\t,p => utt.s ++ np.s ! Nom ++ finiteVerb vs t p np.a} ; + FrontComplDirectVQ np vq utt = {s = \\t,p => utt.s ++ np.s ! Nom ++ finiteVerb vq t p np.a} ; + PredAPVP ap vp = {s = \\t,p => copula t p defaultAgr ++ ap.s ! Nom ! GSg Neuter ++ vp.inf} ; + AdjAsCN ap = nounFromStr (ap.s ! Nom ! GSg Masc) Masc ; + AdjAsNP ap = mkSimpleNP (ap.s ! Nom ! GSg Masc) Masc Sg P3 ; + PredIAdvVP iadv vp = {s = \\t,p => iadv.s ++ vp.inf} ; + EmbedSSlash ss = {s = ss.s} ; + + ReflRNP vp rnp = { + s = \\t,p,a => vp.s ! t ! p ! a ++ rnp.s ! vp.c.c ++ vp.post ; + inf = vp.inf ++ rnp.s ! vp.c.c ; + imp = \\p,n => vp.imp ! p ! n ++ rnp.s ! vp.c.c ++ vp.post + } ; + ReflPron = {s = caseTable "сябе"} ; + ReflPoss num cn = {s = \\c => "свой" ++ cn.s ! c ! num.n} ; + PredetRNP pred rnp = {s = \\c => pred.s ! c ! Masc ! Sg ++ rnp.s ! c} ; + AdvRNP np prep rnp = {s = \\c => np.s ! c ++ prep.s ++ rnp.s ! prep.c} ; + AdvRVP vp prep rnp = addAdvVP vp (prep.s ++ rnp.s ! prep.c) ; + AdvRAP ap prep rnp = {s = \\c,gn => ap.s ! c ! gn ++ prep.s ++ rnp.s ! prep.c} ; + ReflA2RNP a rnp = {s = \\c,gn => a.s ! c ! gn ++ a.c2.s ++ rnp.s ! a.c2.c} ; + PossPronRNP pron num cn rnp = { + s = \\c => pron.s ! Gen ++ cn.s ! c ! num.n ++ rnp.s ! Gen ; + a = {g=cn.g; n=num.n; p=P3} + } ; + ConjRNP conj xs = {s = \\c => xs.s1 ! c ++ conj.s ++ xs.s2 ! c} ; + Base_rr_RNP x y = {s1 = x.s; s2 = y.s} ; + Base_nr_RNP x y = {s1 = x.s; s2 = y.s} ; + Base_rn_RNP x y = {s1 = x.s; s2 = y.s} ; + Cons_rr_RNP x xs = {s1 = \\c => x.s ! c ++ "," ++ xs.s1 ! c; s2 = xs.s2} ; + Cons_nr_RNP x xs = {s1 = \\c => x.s ! c ++ "," ++ xs.s1 ! c; s2 = xs.s2} ; + ReflPossPron = mkQuant "свой" ; + ComplGenVV vv ant pol vp = { + s = \\t,p,a => finiteVerb vv t p a ++ neg pol.p ++ vp.inf ; + inf = vv.infinitive ++ neg pol.p ++ vp.inf ; + imp = \\p,n => neg p ++ vv.imperative ! n ++ neg pol.p ++ vp.inf + } ; + CompoundN n1 n2 = { + s = \\c,n => n1.s ! Nom ! Sg ++ n2.s ! c ! n ; + voc = n1.voc ++ n2.voc ; + g = n2.g + } ; + CompoundAP n a = {s = \\c,gn => n.s ! Nom ! Sg ++ a.s ! c ! gn} ; + GerundCN vp = nounFromStr vp.inf Neuter ; + GerundNP vp = mkSimpleNP vp.inf Neuter Sg P3 ; + GerundAdv vp = {s = vp.inf} ; + WithoutVP vp = {s = "без" ++ vp.inf} ; + ByVP vp = {s = "праз" ++ vp.inf} ; + InOrderToVP vp = {s = "каб" ++ vp.inf} ; + ApposNP np app = {s = \\c => np.s ! c ++ app.s ! Nom; a = np.a} ; + AdAdV ada adv = {s = ada.s ++ adv.s} ; + UttAdV adv = {s = adv.s} ; + PositAdVAdj a = {s = a.s ! Nom ! GSg Neuter} ; + CompS s = {s = \\_ => s.s} ; + CompQS qs = {s = \\_ => qs.s} ; + CompVP ant pol vp = {s = \\_ => neg pol.p ++ vp.inf} ; + UncontractedNeg = {s = []; p = R.Neg} ; + UttVPShort vp = {s = vp.inf} ; + ComplSlashPartLast vp np = { + s = \\t,p,a => vp.s ! t ! p ! a ++ prepNP vp.c np ++ vp.post ; + inf = vp.inf ++ prepNP vp.c np ; + imp = \\p,n => vp.imp ! p ! n ++ prepNP vp.c np ++ vp.post + } ; + DetNPMasc det = {s = \\c => det.s ! c ! Masc; a = {g=Masc; n=det.n; p=P3}} ; + DetNPFem det = {s = \\c => det.s ! c ! Fem; a = {g=Fem; n=det.n; p=P3}} ; + UseComp_estar comp = UseComp_ser comp ; + UseComp_ser comp = { + s = \\t,p,a => copula t p a ++ comp.s ! a ; + inf = "быць" ++ comp.s ! defaultAgr ; + imp = \\p,_ => neg p ++ "будзь" ++ comp.s ! defaultAgr + } ; + SubjRelNP np rs = {s = \\c => np.s ! c ++ rs.s; a = np.a} ; + UttAccNP np = {s = np.s ! Acc} ; + UttDatNP np = {s = np.s ! Dat} ; + UttAccIP ip = {s = ip.s ! Acc} ; + UttDatIP ip = {s = ip.s ! Dat} ; + UseDAP dap = {s = \\c => dap.s ! c ! Masc; a = {g=Neuter; n=dap.n; p=P3}} ; + UseDAPMasc dap = {s = \\c => dap.s ! c ! Masc; a = {g=Masc; n=dap.n; p=P3}} ; + UseDAPFem dap = {s = \\c => dap.s ! c ! Fem; a = {g=Fem; n=dap.n; p=P3}} ; + CardCNCard card cn = {s = card.s ++ cn.s ! Gen ! Pl; n = Pl} ; + TPastSimple = {s = []; t = R.Past} ; + SubjunctRelCN cn rs = { + s = \\c,n => cn.s ! c ! n ++ rs.s ; + voc = cn.voc ; + g = cn.g + } ; + +} diff --git a/src/belarusian/GrammarBel.gf b/src/belarusian/GrammarBel.gf index 574486de..67041207 100644 --- a/src/belarusian/GrammarBel.gf +++ b/src/belarusian/GrammarBel.gf @@ -3,5 +3,14 @@ concrete GrammarBel of Grammar = PhraseBel, NounBel, AdjectiveBel, - StructuralBel ** { + AdverbBel, + VerbBel, + SentenceBel, + QuestionBel, + RelativeBel, + ConjunctionBel, + NumeralBel, + NamesBel, + StructuralBel, + IdiomBel ** { } diff --git a/src/belarusian/IdiomBel.gf b/src/belarusian/IdiomBel.gf new file mode 100644 index 00000000..ba6e7e28 --- /dev/null +++ b/src/belarusian/IdiomBel.gf @@ -0,0 +1,22 @@ +concrete IdiomBel of Idiom = CatBel ** open ResBel, (R = ParamX), ParadigmsBel in { + +lin + ImpersCl vp = {s = \\t,p => vp.s ! t ! p ! defaultAgr} ; + GenericCl vp = {s = \\t,p => "нехта" ++ vp.s ! t ! p ! defaultAgr} ; + CleftNP np rs = {s = \\_,_ => "гэта" ++ np.s ! Nom ++ rs.s} ; + CleftAdv adv s = {s = \\_,_ => "гэта" ++ adv.s ++ s.s} ; + + ExistNP np = {s = \\t,p => copula t p np.a ++ np.s ! Nom} ; + ExistIP ip = {s = \\t,p => copula t p ip.a ++ ip.s ! Nom} ; + ExistNPAdv np adv = {s = \\t,p => copula t p np.a ++ np.s ! Nom ++ adv.s} ; + ExistIPAdv ip adv = {s = \\t,p => copula t p ip.a ++ ip.s ! Nom ++ adv.s} ; + + ProgrVP vp = vp ; + ImpPl1 vp = {s = "давайце" ++ vp.inf} ; + ImpP3 np vp = {s = "няхай" ++ np.s ! Nom ++ vp.s ! R.Pres ! R.Pos ! np.a} ; + + SelfAdvVP vp = addAdvVP vp "сам" ; + SelfAdVVP vp = addAdVVP "сам" vp ; + SelfNP np = {s = \\c => np.s ! c ++ "сам"; a = np.a} ; + +} diff --git a/src/belarusian/LangBel.gf b/src/belarusian/LangBel.gf index c658c252..1cf2f0f4 100644 --- a/src/belarusian/LangBel.gf +++ b/src/belarusian/LangBel.gf @@ -1,10 +1,12 @@ --# -path=.:../abstract concrete LangBel of Lang = GrammarBel, - LexiconBel + LexiconBel, + ConstructionBel ,DocumentationBel --# notpresent ** { + flags startcat = Phr ; -} \ No newline at end of file +} diff --git a/src/belarusian/NamesBel.gf b/src/belarusian/NamesBel.gf new file mode 100644 index 00000000..bea99751 --- /dev/null +++ b/src/belarusian/NamesBel.gf @@ -0,0 +1,19 @@ +concrete NamesBel of Names = CatBel ** open ResBel, ParadigmsBel in { + +lin + GivenName gn = mkSimpleNP gn.s gn.g Sg P3 ; + MaleSurname sn = mkSimpleNP sn.s Masc Sg P3 ; + FemaleSurname sn = mkSimpleNP sn.s Fem Sg P3 ; + PlSurname sn = mkSimpleNP sn.s Masc Pl P3 ; + FullName gn sn = mkSimpleNP (gn.s ++ sn.s) gn.g Sg P3 ; + + UseLN ln = {s = ln.s; a = {g=ln.g; n=ln.n; p=P3}} ; + PlainLN ln = {s = ln.s; a = {g=ln.g; n=ln.n; p=P3}} ; + InLN ln = {s = "у" ++ ln.s ! Loc} ; + AdjLN ap ln = { + s = \\c => ap.s ! c ! genNum ln.g ln.n ++ ln.s ! c ; + g = ln.g ; + n = ln.n + } ; + +} diff --git a/src/belarusian/NounBel.gf b/src/belarusian/NounBel.gf index 8c208e3e..b475ed52 100644 --- a/src/belarusian/NounBel.gf +++ b/src/belarusian/NounBel.gf @@ -1,4 +1,126 @@ -concrete NounBel of Noun = CatBel ** { +concrete NounBel of Noun = CatBel ** open ResBel, Prelude in { lin UseN n = n ; + + DetCN det cn = { + s = \\c => det.s ! c ! cn.g ++ cn.s ! c ! det.n ; + a = {g=cn.g; n=det.n; p=P3} + } ; + UsePN pn = { + s = pn.s ; + a = {g=pn.g; n=pn.n; p=P3} + } ; + UsePron p = p ; + + PredetNP pred np = { + s = \\c => pred.s ! c ! np.a.g ! np.a.n ++ np.s ! c ; + a = np.a + } ; + PPartNP np v = { + s = \\c => np.s ! c ++ v.participle ! np.a.g ! np.a.n ; + a = np.a + } ; + AdvNP np adv = { + s = \\c => np.s ! c ++ adv.s ; + a = np.a + } ; + ExtAdvNP np adv = { + s = \\c => np.s ! c ++ adv.s ; + a = np.a + } ; + RelNP np rs = { + s = \\c => np.s ! c ++ rs.s ; + a = np.a + } ; + DetNP det = { + s = \\c => det.s ! c ! Masc ; + a = {g=Masc; n=det.n; p=P3} + } ; + + DetQuant q n = { + s = \\c,g => q.s ! c ! g ! n.n ++ n.s ! c ! g ; + n = n.n + } ; + DetQuantOrd q n o = { + s = \\c,g => q.s ! c ! g ! n.n ++ n.s ! c ! g ++ o.s ! c ! genNum g n.n ; + n = n.n + } ; + NumSg = {s = \\_,_ => []; n = Sg} ; + NumPl = {s = \\_,_ => []; n = Pl} ; + NumCard card = {s = \\_,_ => card.s; n = card.n} ; + NumDigits digits = {s = digits.s; n = Pl} ; + NumDecimal dec = {s = dec.s; n = Pl} ; + NumNumeral numeral = {s = numeral.s; n = Pl} ; + AdNum adn card = {s = adn.s ++ card.s; n = card.n} ; + + OrdDigits d = adjFromStr d.s ; + OrdNumeral n = adjFromStr n.s ; + OrdSuperl a = {s = \\c,gn => "най" ++ a.s ! c ! gn} ; + OrdNumeralSuperl n a = {s = \\c,gn => n.s ++ a.s ! c ! gn} ; + + IndefArt = {s = \\_,_,_ => []} ; + DefArt = {s = \\_,_,_ => []} ; + MassNP cn = { + s = \\c => cn.s ! c ! Sg ; + a = {g=cn.g; n=Sg; p=P3} + } ; + PossPron p = {s = \\_,_,_ => p.s ! Gen} ; + + ComplN2 n np = { + s = \\c,num => n.s ! c ! num ++ prepNP n.c2 np ; + voc = n.voc ; + g = n.g + } ; + ComplN3 n np = n ** {c2 = n.c3} ; + UseN2 n = n ; + Use2N3 n = n ** {c2 = n.c2} ; + Use3N3 n = n ** {c2 = n.c3} ; + + AdjCN ap cn = { + s = \\c,num => ap.s ! c ! genNum cn.g num ++ cn.s ! c ! num ; + voc = cn.voc ; + g = cn.g + } ; + RelCN cn rs = { + s = \\c,num => cn.s ! c ! num ++ rs.s ; + voc = cn.voc ; + g = cn.g + } ; + AdvCN cn adv = { + s = \\c,num => cn.s ! c ! num ++ adv.s ; + voc = cn.voc ; + g = cn.g + } ; + SentCN cn sc = { + s = \\c,num => cn.s ! c ! num ++ sc.s ; + voc = cn.voc ; + g = cn.g + } ; + ApposCN cn np = { + s = \\c,num => cn.s ! c ! num ++ np.s ! Nom ; + voc = cn.voc ; + g = cn.g + } ; + PossNP cn np = { + s = \\c,num => cn.s ! c ! num ++ np.s ! Gen ; + voc = cn.voc ; + g = cn.g + } ; + PartNP cn np = { + s = \\c,num => cn.s ! c ! num ++ np.s ! Gen ; + voc = cn.voc ; + g = cn.g + } ; + CountNP det np = { + s = \\c => det.s ! c ! Masc ++ "з" ++ np.s ! Gen ; + a = {g=Masc; n=det.n; p=P3} + } ; + + AdjDAP dap ap = { + s = \\c,g => dap.s ! c ! g ++ ap.s ! c ! genNum g dap.n ; + n = dap.n + } ; + DetDAP det = det ; + + QuantityNP dec mu = mkSimpleNP (dec.s ++ mu.s) Neuter Sg P3 ; } diff --git a/src/belarusian/NumeralBel.gf b/src/belarusian/NumeralBel.gf new file mode 100644 index 00000000..8415897a --- /dev/null +++ b/src/belarusian/NumeralBel.gf @@ -0,0 +1,65 @@ +concrete NumeralBel of Numeral = CatBel ** { + +lincat + Digit, Sub10, Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 = {s : Str} ; + Dig = {s : Str} ; + +lin + num n = n ; + + n2 = {s = "2"} ; + n3 = {s = "3"} ; + n4 = {s = "4"} ; + n5 = {s = "5"} ; + n6 = {s = "6"} ; + n7 = {s = "7"} ; + n8 = {s = "8"} ; + n9 = {s = "9"} ; + + pot01 = {s = "1"} ; + pot0 d = d ; + pot0as1 n = n ; + pot110 = {s = "10"} ; + pot111 = {s = "11"} ; + pot1to19 d = {s = "1" ++ d.s} ; + pot1 d = {s = d.s ++ "0"} ; + pot1plus d n = {s = d.s ++ n.s} ; + pot1as2 n = n ; + pot21 = {s = "100"} ; + pot2 n = {s = n.s ++ "00"} ; + pot2plus n m = {s = n.s ++ "00" ++ m.s} ; + pot2as3 n = n ; + pot31 = {s = "1000"} ; + pot3 n = {s = n.s ++ "000"} ; + pot3plus n m = {s = n.s ++ "000" ++ m.s} ; + pot3as4 n = n ; + pot3decimal d = {s = d.s ++ "тысяч"} ; + pot41 = {s = "1000000"} ; + pot4 n = {s = n.s ++ "000000"} ; + pot4plus n m = {s = n.s ++ "000000" ++ m.s} ; + pot4as5 n = n ; + pot4decimal d = {s = d.s ++ "мільёна"} ; + pot51 = {s = "1000000000"} ; + pot5 n = {s = n.s ++ "000000000"} ; + pot5plus n m = {s = n.s ++ "000000000" ++ m.s} ; + pot5decimal d = {s = d.s ++ "мільярда"} ; + + IDig d = d ; + IIDig d ds = {s = d.s ++ ds.s} ; + + D_0 = {s = "0"} ; + D_1 = {s = "1"} ; + D_2 = {s = "2"} ; + D_3 = {s = "3"} ; + D_4 = {s = "4"} ; + D_5 = {s = "5"} ; + D_6 = {s = "6"} ; + D_7 = {s = "7"} ; + D_8 = {s = "8"} ; + D_9 = {s = "9"} ; + + PosDecimal d = d ; + NegDecimal d = {s = "-" ++ d.s} ; + IFrac d dig = {s = d.s ++ "." ++ dig.s} ; + +} diff --git a/src/belarusian/ParadigmsBel.gf b/src/belarusian/ParadigmsBel.gf index 84c4fa9c..86c448d6 100644 --- a/src/belarusian/ParadigmsBel.gf +++ b/src/belarusian/ParadigmsBel.gf @@ -669,9 +669,7 @@ oper Loc => loc ; Instr => instr } ; - g = g ; - n = n ; - p = p + a = {g=g; n = n; p = p} } ; regV : Str -> V -- infinitive @@ -867,24 +865,37 @@ oper mkInterj : Str -> Interj = \s -> lin Interj {s=s} ; mkMU : Str -> MU = \s -> lin MU {s=s; isPre=False} ; - mkPrep : Str -> Prep = \s -> lin Prep {s=s; c=Acc} ; + nominative : Case = Nom ; + accusative : Case = Acc ; + dative : Case = Dat ; + genitive : Case = Gen ; + locative : Case = Loc ; + instrumental : Case = Instr ; + + mkPrep = overload { + mkPrep : Str -> Prep = \s -> lin Prep {s=s; c=Acc} ; + mkPrep : Case -> Prep = \c -> lin Prep {s=[]; c=c} ; + mkPrep : Str -> Case -> Prep = \s,c -> lin Prep {s=s; c=c} + } ; mkIAdv : Str -> IAdv = \s -> lin IAdv {s=s} ; - mkIP : Str -> IP = \s -> lin IP {s=s} ; - mkIQuant : Str -> IQuant = \s -> lin IQuant {s=s} ; - mkIDet : Str -> IDet = \s -> lin IDet {s=s} ; + mkIP : Str -> IP = \s -> lin IP (mkSimpleNP s Masc Sg P3) ; + mkIQuant : Str -> IQuant = \s -> lin IQuant {s=\\_,_,_ => s} ; + mkIDet : Str -> IDet = \s -> lin IDet {s=\\_,_ => s; n=Sg} ; mkSubj : Str -> Subj = \s -> lin Subj {s=s} ; - mkQuant : Str -> Quant = \s -> lin Quant {s=s} ; - mkPredet : Str -> Predet = \s -> lin Predet {s=s} ; - mkDet : Str -> Det = \s -> lin Det {s=s} ; - mkCard : Str -> Card = \s -> lin Card {s=s} ; - mkConj : Str -> Conj = \s -> lin Conj {s=s} ; + mkQuant : Str -> Quant = \s -> lin Quant {s=\\_,_,_ => s} ; + adjQuant : A -> Quant = \a -> lin Quant {s=\\c,g,n => a.s ! c ! genNum g n} ; + mkPredet : Str -> Predet = \s -> lin Predet {s=\\_,_,_ => s} ; + mkDet : Str -> Det = \s -> lin Det {s=\\_,_ => s; n=Sg} ; + mkCard : Str -> Card = \s -> lin Card {s=s; n=Pl} ; + mkACard : Str -> ACard = \s -> lin ACard {s=s; n=Pl} ; + mkConj : Str -> Conj = \s -> lin Conj {s=s; n=Pl} ; mkPConj : Str -> PConj = \s -> lin PConj {s=s} ; mkVoc : Str -> Voc = \s -> lin Voc {s=s} ; - mkLN : Str -> LN = \s -> lin LN {s=s} ; - mkGN : Str -> GN = \s -> lin GN {s=s} ; + mkLN : Str -> LN = \s -> lin LN {s=caseTable s; g=Neuter; n=Sg} ; + mkGN : Str -> GN = \s -> lin GN {s=s; g=Masc} ; mkSN : Str -> SN = \s -> lin SN {s=s} ; - mkPN : Str -> PN = \s -> lin PN {s=s} ; + mkPN : Str -> PN = \s -> lin PN {s=caseTable s; g=Masc; n=Sg} ; } diff --git a/src/belarusian/PhraseBel.gf b/src/belarusian/PhraseBel.gf index 2f5babb9..1c7b95e5 100644 --- a/src/belarusian/PhraseBel.gf +++ b/src/belarusian/PhraseBel.gf @@ -1,11 +1,25 @@ -concrete PhraseBel of Phrase = CatBel ** { +concrete PhraseBel of Phrase = CatBel ** open ResBel in { lin PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; UttS s = s ; + UttQS qs = qs ; + UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! Sg} ; + UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! Pl} ; + UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! Pl} ; + UttIP ip = {s = ip.s ! Nom} ; + UttIAdv iadv = iadv ; + UttNP np = {s = np.s ! Nom} ; + UttAdv adv = adv ; + UttVP vp = {s = vp.inf} ; + UttCN cn = {s = cn.s ! Nom ! Sg} ; + UttCard card = {s = card.s} ; + UttAP ap = {s = ap.s ! Nom ! GSg Masc} ; UttInterj i = i ; NoPConj = {s = []} ; + PConjConj conj = {s = conj.s} ; NoVoc = {s = []} ; + VocNP np = {s = np.s ! Nom} ; } diff --git a/src/belarusian/QuestionBel.gf b/src/belarusian/QuestionBel.gf new file mode 100644 index 00000000..ed6c86d2 --- /dev/null +++ b/src/belarusian/QuestionBel.gf @@ -0,0 +1,50 @@ +concrete QuestionBel of Question = CatBel ** open ResBel, (R = ParamX) in { + +lincat + QVP = {s : Str} ; + +lin + QuestCl cl = cl ; + QuestVP ip vp = { + s = \\t,p => ip.s ! Nom ++ vp.s ! t ! p ! ip.a + } ; + QuestSlash ip cl = { + s = \\t,p => cl.c.s ++ ip.s ! cl.c.c ++ cl.s ! t ! p + } ; + QuestIAdv iadv cl = { + s = \\t,p => iadv.s ++ cl.s ! t ! p + } ; + QuestIComp icomp np = { + s = \\t,p => icomp.s ++ np.s ! Nom + } ; + + IdetCN idet cn = { + s = \\c => idet.s ! c ! cn.g ++ cn.s ! c ! idet.n ; + a = {g=cn.g; n=idet.n; p=P3} + } ; + IdetIP idet = { + s = \\c => idet.s ! c ! Masc ; + a = {g=Masc; n=idet.n; p=P3} + } ; + AdvIP ip adv = { + s = \\c => ip.s ! c ++ adv.s ; + a = ip.a + } ; + IdetQuant iquant num = { + s = \\c,g => iquant.s ! c ! g ! num.n ++ num.s ! c ! g ; + n = num.n + } ; + + PrepIP prep ip = {s = prepNP prep ip} ; + AdvIAdv iadv adv = {s = iadv.s ++ adv.s} ; + CompIAdv iadv = iadv ; + CompIP ip = {s = ip.s ! Nom} ; + + ComplSlashIP vp ip = {s = vp.s ! R.Pres ! R.Pos ! defaultAgr ++ vp.c.s ++ ip.s ! vp.c.c ++ vp.post} ; + AdvQVP vp iadv = {s = vp.s ! R.Pres ! R.Pos ! defaultAgr ++ iadv.s} ; + AddAdvQVP qvp iadv = {s = qvp.s ++ iadv.s} ; + QuestQVP ip qvp = { + s = \\_,_ => ip.s ! Nom ++ qvp.s + } ; + +} diff --git a/src/belarusian/RelativeBel.gf b/src/belarusian/RelativeBel.gf new file mode 100644 index 00000000..3b2a247d --- /dev/null +++ b/src/belarusian/RelativeBel.gf @@ -0,0 +1,11 @@ +concrete RelativeBel of Relative = CatBel ** open ResBel in { + +lin + RelCl cl = {s = \\t,p => "што" ++ cl.s ! t ! p} ; + RelVP rp vp = {s = \\t,p => rp.s ++ vp.s ! t ! p ! defaultAgr} ; + RelSlash rp cl = {s = \\t,p => rp.s ++ cl.s ! t ! p} ; + + IdRP = {s = "які"} ; + FunRP prep np rp = {s = prepNP prep np ++ rp.s} ; + +} diff --git a/src/belarusian/ResBel.gf b/src/belarusian/ResBel.gf index c1f5c95a..f2ba2dc9 100644 --- a/src/belarusian/ResBel.gf +++ b/src/belarusian/ResBel.gf @@ -1,4 +1,4 @@ -resource ResBel = { +resource ResBel = open (R = ParamX), Prelude in { param Case = Nom | Acc | Dat | Gen | Loc | Instr ; param Number = Sg | Pl ; @@ -166,4 +166,121 @@ oper noPrep : Compl = {s=""; c=Acc} ; oper CommonNoun = Noun ; oper AdjPhrase = Adj ; +oper Agr = {g : Gender ; n : Number ; p : Person} ; +oper defaultAgr : Agr = {g=Masc; n=Sg; p=P3} ; + +oper NPhrase : Type = {s : Case => Str; a : Agr} ; +oper mkNPhrase : (Case => Str) -> Agr -> NPhrase = + \s,a -> {s = s; a = a} ; +oper caseTable : Str -> Case => Str = + \s -> table {Nom => s; Acc => s; Dat => s; Gen => s; Loc => s; Instr => s} ; +oper mkSimpleNP : Str -> Gender -> Number -> Person -> NPhrase = + \s,g,n,p -> mkNPhrase (caseTable s) {g=g; n=n; p=p} ; + +oper nounFromStr : Str -> Gender -> Noun = + \s,g -> { + s = \\_,_ => s ; + voc = s ; + g = g + } ; + +oper adjFromStr : Str -> Adj = + \s -> {s = \\_,_ => s} ; + +oper prepNP : Compl -> NPhrase -> Str = + \prep,np -> prep.s ++ np.s ! prep.c ; + +oper neg : R.Polarity -> Str = + \p -> case p of { + R.Pos => [] ; + R.Neg => "не" + } ; + +oper futureBe : Agr -> Str = + \a -> case of { + => "буду" ; + => "будзеш" ; + => "будзе" ; + => "будзем" ; + => "будзеце" ; + => "будуць" + } ; + +oper pastBe : Agr -> Str = + \a -> case of { + => "быў" ; + => "была" ; + => "было" ; + <_,Pl> => "былі" + } ; + +oper copula : R.Tense -> R.Polarity -> Agr -> Str = + \t,p,a -> case t of { + R.Pres => neg p ; + R.Past => neg p ++ pastBe a ; + R.Fut => neg p ++ futureBe a ; + R.Cond => neg p ++ pastBe a ++ "бы" + } ; + +oper finiteVerb : Verb -> R.Tense -> R.Polarity -> Agr -> Str = + \v,t,p,a -> case t of { + R.Pres => neg p ++ (v.active ! Imperf).pres ! a.p ! a.n ; + R.Past => neg p ++ v.participle ! a.g ! a.n ; + R.Fut => neg p ++ futureBe a ++ v.infinitive ; + R.Cond => neg p ++ v.participle ! a.g ! a.n ++ "бы" + } ; + +oper VPhrase : Type = { + s : R.Tense => R.Polarity => Agr => Str ; + inf : Str ; + imp : R.Polarity => Number => Str +} ; + +oper mkVPhrase : Verb -> VPhrase = + \v -> { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ; + imp = \\p,n => neg p ++ v.imperative ! n + } ; + +oper VSlash : Type = { + s : R.Tense => R.Polarity => Agr => Str ; + inf : Str ; + c : Compl ; + imp : R.Polarity => Number => Str ; + post : Str +} ; + +oper mkVSlash : Verb -> Compl -> VSlash = + \v,c -> { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ; + c = c ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = [] + } ; + +oper addAdvVP : VPhrase -> Str -> VPhrase = + \vp,adv -> { + s = \\t,p,a => vp.s ! t ! p ! a ++ adv ; + inf = vp.inf ++ adv ; + imp = \\p,n => vp.imp ! p ! n ++ adv + } ; + +oper addAdVVP : Str -> VPhrase -> VPhrase = + \adv,vp -> { + s = \\t,p,a => adv ++ vp.s ! t ! p ! a ; + inf = adv ++ vp.inf ; + imp = \\p,n => adv ++ vp.imp ! p ! n + } ; + +oper addAdvSlash : VSlash -> Str -> VSlash = + \vp,adv -> { + s = \\t,p,a => vp.s ! t ! p ! a ; + inf = vp.inf ++ adv ; + c = vp.c ; + imp = \\p,n => vp.imp ! p ! n ; + post = vp.post ++ adv + } ; + } diff --git a/src/belarusian/SentenceBel.gf b/src/belarusian/SentenceBel.gf new file mode 100644 index 00000000..b61fad61 --- /dev/null +++ b/src/belarusian/SentenceBel.gf @@ -0,0 +1,45 @@ +concrete SentenceBel of Sentence = CatBel ** open ResBel, (R = ParamX), Prelude in { + +lin + PredVP np vp = { + s = \\t,p => np.s ! Nom ++ vp.s ! t ! p ! np.a + } ; + PredSCVP sc vp = { + s = \\t,p => sc.s ++ vp.s ! t ! p ! defaultAgr + } ; + + SlashVP np vp = { + s = \\t,p => np.s ! Nom ++ vp.s ! t ! p ! np.a ++ vp.post ; + c = vp.c + } ; + AdvSlash cl adv = { + s = \\t,p => cl.s ! t ! p ++ adv.s ; + c = cl.c + } ; + SlashPrep cl prep = { + s = \\t,p => cl.s ! t ! p ++ prep.s ; + c = prep + } ; + SlashVS np vs ss = { + s = \\t,p => np.s ! Nom ++ finiteVerb vs t p np.a ++ ss.s ; + c = ss.c + } ; + + ImpVP vp = {s = \\p,n => vp.imp ! p ! n} ; + AdvImp adv imp = {s = \\p,n => adv.s ++ imp.s ! p ! n} ; + + EmbedS s = {s = "што" ++ s.s} ; + EmbedQS qs = {s = qs.s} ; + EmbedVP vp = {s = vp.inf} ; + + UseCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! temp.t ! pol.p} ; + UseQCl temp pol cl = {s = temp.s ++ pol.s ++ cl.s ! temp.t ! pol.p} ; + UseRCl temp pol cl = {s = cl.s ! temp.t ! pol.p} ; + UseSlash temp pol cl = {s = cl.s ! temp.t ! pol.p; c = cl.c} ; + + AdvS adv s = {s = adv.s ++ s.s} ; + ExtAdvS adv s = {s = adv.s ++ s.s} ; + SSubjS s1 subj s2 = {s = s1.s ++ subj.s ++ s2.s} ; + RelS s rs = {s = s.s ++ rs.s} ; + +} diff --git a/src/belarusian/StructuralBel.gf b/src/belarusian/StructuralBel.gf index 06b82515..c3ab16ea 100644 --- a/src/belarusian/StructuralBel.gf +++ b/src/belarusian/StructuralBel.gf @@ -1,12 +1,110 @@ concrete StructuralBel of Structural = CatBel ** open ResBel, ParadigmsBel in { + lin + above_Prep = mkPrep "над" instrumental ; + after_Prep = mkPrep "пасля" genitive ; + all_Predet = mkPredet "усе" ; + almost_AdA = mkAdA "амаль" ; + almost_AdN = mkAdN "амаль" ; + although_Subj = mkSubj "хоць" ; + always_AdV = mkAdV "заўсёды" ; + and_Conj = mkConj "і" ; + because_Subj = mkSubj "бо" ; + before_Prep = mkPrep "перад" instrumental ; + behind_Prep = mkPrep "за" instrumental ; + between_Prep = mkPrep "паміж" instrumental ; + both7and_DConj = mkConj "і" ; + but_PConj = mkPConj "але" ; + by8agent_Prep = mkPrep "кім" instrumental ; + by8means_Prep = mkPrep "праз" accusative ; + can8know_VV = mkVV (mkV021 "магчы") ; + can_VV = mkVV (mkV021 "магчы") ; + during_Prep = mkPrep "падчас" genitive ; + either7or_DConj = mkConj "або" ; + every_Det = {s = \\_,_ => "кожны"; n = Sg} ; + everybody_NP = mkSimpleNP "усе" Masc Pl P3 ; + everything_NP = mkSimpleNP "усё" Neuter Sg P3 ; + everywhere_Adv = mkAdv "усюды" ; + few_Det = {s = \\_,_ => "некалькі"; n = Pl} ; + for_Prep = mkPrep "для" genitive ; + from_Prep = mkPrep "ад" genitive ; + i_Pron = mkPron "я" "мяне" "мне" "мяне" "мне" "мной" Masc Sg P1 ; - youSg_Pron = mkPron "ты" "табе" "табе" "табе" "табе" "табой" Masc Sg P2 ; - he_Pron = mkPron "ён" "яго" "яму" "яго" "ім" "ім" Masc Sg P3 ; - she_Pron = mkPron "яна" "яе" "ёй" "яе" "ёй" "ёю" Fem Sg P3 ; - it_Pron = mkPron "яно" "яго" "яму" "яго" "ім" "ім" Neuter Sg P3 ; - we_Pron = mkPron "мы" "нас" "нам" "нас" "наc" "намі" Masc Pl P1 ; - youPl_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Masc Pl P2 ; - youPol_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Masc Pl P2 ; - they_Pron = mkPron "яны" "іх" "їм" "їх" "іх" "імі" Masc Pl P3 ; + youSg_Pron = mkPron "ты" "цябе" "табе" "цябе" "табе" "табой" Masc Sg P2 ; + he_Pron = mkPron "ён" "яго" "яму" "яго" "ім" "ім" Masc Sg P3 ; + she_Pron = mkPron "яна" "яе" "ёй" "яе" "ёй" "ёю" Fem Sg P3 ; + it_Pron = mkPron "яно" "яго" "яму" "яго" "ім" "ім" Neuter Sg P3 ; + we_Pron = mkPron "мы" "нас" "нам" "нас" "нас" "намі" Masc Pl P1 ; + youPl_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Masc Pl P2 ; + youPol_Pron = mkPron "вы" "вас" "вам" "вас" "вас" "вамі" Masc Pl P2 ; + they_Pron = mkPron "яны" "іх" "ім" "іх" "іх" "імі" Masc Pl P3 ; + + here_Adv = mkAdv "тут" ; + here7to_Adv = mkAdv "сюды" ; + here7from_Adv = mkAdv "адсюль" ; + how_IAdv = mkIAdv "як" ; + how8many_IDet = mkIDet "колькі" ; + how8much_IAdv = mkIAdv "колькі" ; + if_Subj = mkSubj "калі" ; + in8front_Prep = mkPrep "перад" instrumental ; + in_Prep = mkPrep "у" locative ; + less_CAdv = {s = "менш"; p = "чым"} ; + many_Det = {s = \\_,_ => "шмат"; n = Pl} ; + more_CAdv = {s = "больш"; p = "чым"} ; + most_Predet = mkPredet "большасць" ; + much_Det = {s = \\_,_ => "шмат"; n = Sg} ; + must_VV = mkVV (mkV "мусіць") ; + no_Utt = {s = "не"} ; + on_Prep = mkPrep "на" locative ; + only_Predet = mkPredet "толькі" ; + or_Conj = mkConj "або" ; + otherwise_PConj = mkPConj "інакш" ; + part_Prep = mkPrep "з" genitive ; + please_Voc = mkVoc "калі ласка" ; + possess_Prep = mkPrep "у" genitive ; + quite_Adv = mkAdA "зусім" ; + so_AdA = mkAdA "так" ; + someSg_Det = {s = \\_,_ => "нейкі"; n = Sg} ; + somePl_Det = {s = \\_,_ => "некаторыя"; n = Pl} ; + somebody_NP = mkSimpleNP "нехта" Masc Sg P3 ; + something_NP = mkSimpleNP "нешта" Neuter Sg P3 ; + somewhere_Adv = mkAdv "недзе" ; + that_Quant = mkQuant "той" ; + that_Subj = mkSubj "што" ; + there_Adv = mkAdv "там" ; + there7to_Adv = mkAdv "туды" ; + there7from_Adv = mkAdv "адтуль" ; + therefore_PConj = mkPConj "таму" ; + this_Quant = mkQuant "гэты" ; + through_Prep = mkPrep "праз" accusative ; + to_Prep = mkPrep "да" genitive ; + too_AdA = mkAdA "занадта" ; + under_Prep = mkPrep "пад" instrumental ; + very_AdA = mkAdA "вельмі" ; + want_VV = mkVV (mkV009 "хацець") ; + whatPl_IP = mkSimpleNP "што" Neuter Pl P3 ; + whatSg_IP = mkSimpleNP "што" Neuter Sg P3 ; + when_IAdv = mkIAdv "калі" ; + when_Subj = mkSubj "калі" ; + where_IAdv = mkIAdv "дзе" ; + which_IQuant = mkIQuant "які" ; + whoPl_IP = mkSimpleNP "хто" Masc Pl P3 ; + whoSg_IP = mkSimpleNP "хто" Masc Sg P3 ; + why_IAdv = mkIAdv "чаму" ; + with_Prep = mkPrep "з" instrumental ; + without_Prep = mkPrep "без" genitive ; + yes_Utt = {s = "так"} ; + + no_Quant = mkQuant "ніякі" ; + not_Predet = mkPredet "не" ; + if_then_Conj = mkConj "калі" ; + at_least_AdN = mkAdN "прынамсі" ; + at_most_AdN = mkAdN "найбольш" ; + nobody_NP = mkSimpleNP "ніхто" Masc Sg P3 ; + nothing_NP = mkSimpleNP "нішто" Neuter Sg P3 ; + except_Prep = mkPrep "акрамя" genitive ; + as_CAdv = {s = "так"; p = "як"} ; + have_V2 = mkV2 (mkV071 "мець") ; + language_title_Utt = {s = "беларуская"} ; + } diff --git a/src/belarusian/VerbBel.gf b/src/belarusian/VerbBel.gf new file mode 100644 index 00000000..d7511151 --- /dev/null +++ b/src/belarusian/VerbBel.gf @@ -0,0 +1,138 @@ +concrete VerbBel of Verb = CatBel ** open ResBel, (R = ParamX), Prelude in { + +lin + UseV v = mkVPhrase v ; + + ComplVV vv vp = { + s = \\t,p,a => finiteVerb vv t p a ++ vp.inf ; + inf = vv.infinitive ++ vp.inf ; + imp = \\p,n => neg p ++ vv.imperative ! n ++ vp.inf + } ; + ComplVS vs s = { + s = \\t,p,a => finiteVerb vs t p a ++ "што" ++ s.s ; + inf = vs.infinitive ++ "што" ++ s.s ; + imp = \\p,n => neg p ++ vs.imperative ! n ++ "што" ++ s.s + } ; + ComplVQ vq qs = { + s = \\t,p,a => finiteVerb vq t p a ++ qs.s ; + inf = vq.infinitive ++ qs.s ; + imp = \\p,n => neg p ++ vq.imperative ! n ++ qs.s + } ; + ComplVA va ap = { + s = \\t,p,a => finiteVerb va t p a ++ ap.s ! Nom ! genNum a.g a.n ; + inf = va.infinitive ++ ap.s ! Nom ! GSg Masc ; + imp = \\p,n => neg p ++ va.imperative ! n ++ ap.s ! Nom ! GPl + } ; + + SlashV2a v = mkVSlash v v.c2 ; + Slash2V3 v np = { + s = \\t,p,a => finiteVerb v t p a ++ prepNP v.c2 np ; + inf = v.infinitive ++ prepNP v.c2 np ; + c = v.c3 ; + imp = \\p,n => neg p ++ v.imperative ! n ++ prepNP v.c2 np ; + post = [] + } ; + Slash3V3 v np = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ prepNP v.c3 np ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = prepNP v.c3 np + } ; + SlashV2V v vp = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ vp.inf ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = vp.inf + } ; + SlashV2S v s = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ "што" ++ s.s ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = "што" ++ s.s + } ; + SlashV2Q v qs = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ qs.s ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = qs.s + } ; + SlashV2A v ap = { + s = \\t,p,a => finiteVerb v t p a ; + inf = v.infinitive ++ ap.s ! Nom ! GSg Masc ; + c = v.c2 ; + imp = \\p,n => neg p ++ v.imperative ! n ; + post = ap.s ! Nom ! GSg Masc + } ; + + ComplSlash vp np = { + s = \\t,p,a => vp.s ! t ! p ! a ++ prepNP vp.c np ++ vp.post ; + inf = vp.inf ++ prepNP vp.c np ; + imp = \\p,n => vp.imp ! p ! n ++ prepNP vp.c np ++ vp.post + } ; + + SlashVV vv vp = { + s = \\t,p,a => finiteVerb vv t p a ++ vp.s ! R.Pres ! R.Pos ! a ; + inf = vv.infinitive ++ vp.inf ; + c = vp.c ; + imp = \\p,n => neg p ++ vv.imperative ! n ++ vp.imp ! R.Pos ! n ; + post = vp.post + } ; + SlashV2VNP v np vp = { + s = \\t,p,a => finiteVerb v t p a ++ prepNP v.c2 np ++ vp.s ! R.Pres ! R.Pos ! a ; + inf = v.infinitive ++ prepNP v.c2 np ++ vp.inf ; + c = vp.c ; + imp = \\p,n => neg p ++ v.imperative ! n ++ prepNP v.c2 np ++ vp.imp ! R.Pos ! n ; + post = vp.post + } ; + + ReflVP vp = { + s = \\t,p,a => vp.s ! t ! p ! a ++ "сябе" ++ vp.post ; + inf = vp.inf ++ "сябе" ; + imp = \\p,n => vp.imp ! p ! n ++ "сябе" ++ vp.post + } ; + UseComp comp = { + s = \\t,p,a => copula t p a ++ comp.s ! a ; + inf = "быць" ++ comp.s ! defaultAgr ; + imp = \\p,_ => neg p ++ "будзь" ++ comp.s ! defaultAgr + } ; + + PassV2 v = { + s = \\t,p,a => copula t p a ++ v.participle ! a.g ! a.n ; + inf = "быць" ++ v.participle ! Masc ! Sg ; + imp = \\p,_ => neg p ++ "будзь" ++ v.participle ! Masc ! Sg + } ; + + AdvVP vp adv = addAdvVP vp adv.s ; + ExtAdvVP vp adv = addAdvVP vp adv.s ; + AdVVP adv vp = addAdVVP adv.s vp ; + AdvVPSlash vp adv = addAdvSlash vp adv.s ; + AdVVPSlash adv vp = { + s = \\t,p,a => adv.s ++ vp.s ! t ! p ! a ; + inf = adv.s ++ vp.inf ; + c = vp.c ; + imp = \\p,n => adv.s ++ vp.imp ! p ! n ; + post = vp.post + } ; + VPSlashPrep vp prep = { + s = \\t,p,a => vp.s ! t ! p ! a ++ prep.s ; + inf = vp.inf ++ prep.s ; + c = prep ; + imp = \\p,n => vp.imp ! p ! n ++ prep.s ; + post = [] + } ; + + CompAP ap = {s = \\a => ap.s ! Nom ! genNum a.g a.n} ; + CompNP np = {s = \\_ => np.s ! Nom} ; + CompAdv adv = {s = \\_ => adv.s} ; + CompCN cn = {s = \\a => cn.s ! Nom ! a.n} ; + UseCopula = { + s = \\t,p,a => copula t p a ; + inf = "быць" ; + imp = \\p,_ => neg p ++ "будзь" + } ; + +}