bulgarian in next-lib

This commit is contained in:
krasimir
2008-10-30 18:04:09 +00:00
parent 09177428d3
commit 12338243c5
25 changed files with 4040 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
concrete AdjectiveBul of Adjective = CatBul ** open ResBul, Prelude in {
flags coding=cp1251 ;
lin
PositA a = {
s = \\aform => a.s ! aform ;
adv = a.adv ;
isPre = True
} ;
ComparA a np = {
s = \\aform => "ïî" ++ "-" ++ a.s ! aform ++ "îò" ++ np.s ! RObj Acc ;
adv = "ïî" ++ "-" ++ a.adv ++ "îò" ++ np.s ! RObj Acc ;
isPre = True
} ;
UseComparA a = {
s = \\aform => "ïî" ++ "-" ++ a.s ! aform ;
adv = "ïî" ++ "-" ++ a.adv ;
isPre = True
} ;
AdjOrd ord = {
s = ord.s ;
adv = ord.s ! ASg Neut Indef ;
isPre = True
} ;
-- $SuperlA$ belongs to determiner syntax in $Noun$.
ComplA2 a np = {
s = \\aform => a.s ! aform ++ a.c2 ++ np.s ! RObj Acc ;
adv = a.adv ++ a.c2 ++ np.s ! RObj Acc ;
isPre = True
} ;
ReflA2 a = {
s = \\aform => a.s ! aform ++ a.c2 ++ ["ñåáå ñè"] ;
adv = a.adv ++ a.c2 ++ ["ñåáå ñè"] ;
isPre = False
} ;
SentAP ap sc = {
s = \\a => ap.s ! a ++ sc.s ;
adv = ap.adv ++ sc.s ;
isPre = False
} ;
AdAP ada ap = {
s = \\a => ada.s ++ ap.s ! a ;
adv = ada.s ++ ap.adv ;
isPre = ap.isPre
} ;
UseA2 a = {
s = a.s ;
adv = a.adv ;
isPre = True
} ;
}

View File

@@ -0,0 +1,20 @@
concrete AdverbBul of Adverb = CatBul ** open ResBul, Prelude in {
flags coding=cp1251 ;
lin
PositAdvAdj a = {s = a.adv} ;
ComparAdvAdj cadv a np = {
s = cadv.s ++ "ïî" ++ "-" ++ a.s ! ASg Neut Indef ++ "îò" ++ np.s ! RObj Acc
} ;
ComparAdvAdjS cadv a s = {
s = cadv.s ++ "ïî" ++ "-" ++ a.s ! ASg Neut Indef ++ "îò" ++ "êîëêîòî" ++ s.s
} ;
PrepNP prep np = {s = prep.s ++ np.s ! RObj prep.c} ;
AdAdv = cc2 ;
SubjS = cc2 ;
AdnCAdv cadv = {s = cadv.sn ++ "îò"} ;
}

View File

@@ -0,0 +1,8 @@
--# -path=.:../abstract:../common:prelude
concrete AllBul of AllBulAbs =
LangBul,
ExtraBul
** {
flags coding=cp1251 ;
} ;

View File

@@ -0,0 +1,8 @@
--# -path=.:../abstract:../common:prelude
abstract AllBulAbs =
Lang,
ExtraBulAbs
** {
flags coding=cp1251 ;
} ;

View File

@@ -0,0 +1,126 @@
concrete CatBul of Cat = open ResBul, Prelude, (R = ParamX) in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lincat
-- Text, Phrase, Utterance
Text = {s : Str} ;
Phr = {s : Str} ;
Utt = {s : Str} ;
Voc = {s : Str} ;
PConj = {s : Str} ;
-- Tense, Anteriority, Polarity
Temp = {s : Str ; t : R.Tense ; a : R.Anteriority} ;
Tense = {s : Str ; t : R.Tense} ;
Ant = {s : Str ; a : R.Anteriority} ;
Pol = {s : Str ; p : R.Polarity} ;
-- Tensed/Untensed
S = {s : Str} ;
QS = {s : QForm => Str} ;
RS = {s : Agr => Str} ;
SC = {s : Str} ;
SSlash = {s : Agr => Str ; c2 : Preposition} ;
-- Sentence
Cl = {s : ResBul.Tense => Anteriority => Polarity => Order => Str} ;
ClSlash = {
s : Agr => ResBul.Tense => Anteriority => Polarity => Order => Str ;
c2 : Preposition
} ;
Imp = {s : Polarity => GenNum => Str} ;
-- Question
QCl = {s : ResBul.Tense => Anteriority => Polarity => QForm => Str} ;
IP = {s : Role => QForm => Str; gn : GenNum} ;
IComp = {s : QForm => Str} ;
IDet = {s : DGender => QForm => Str; n : Number ; nonEmpty : Bool} ;
IQuant = {s : GenNum => QForm => Str} ;
-- Relative
RCl = {s : ResBul.Tense => Anteriority => Polarity => Agr => Str} ;
RP = {s : GenNum => Str} ;
-- Verb
VP = ResBul.VP ;
VPSlash = ResBul.VPSlash ;
Comp = {s : Agr => Str} ;
AdV = {s : Str} ; --lock_AdV : {}} ;
-- Adjective
AP = {s : AForm => Str; adv : Str; isPre : Bool} ;
-- Adjective
Adv = {s : Str} ;
CAdv = {s : Str; sn : Str} ;
IAdv = {s : QForm => Str} ;
AdA = {s : Str} ;
-- Noun
CN = {s : NForm => Str; g : DGender} ;
NP = {s : Role => Str; a : Agr} ;
Pron = {s : Role => Str; gen : AForm => Str; a : Agr} ;
Det = {s : Bool => DGender => Role => Str; n : Number; countable : Bool; spec : Species} ;
Predet = {s : GenNum => Str} ;
Ord = {s : AForm => Str} ;
Num = {s : DGenderSpecies => Str; n : Number; nonEmpty : Bool} ;
Card = {s : DGenderSpecies => Str; n : Number} ;
Quant = {s : Bool => AForm => Str; nonEmpty : Bool; spec : Species} ;
-- Numeral
Numeral = {s : CardOrd => Str; n : Number} ;
Digits = {s : CardOrd => Str; n : Number; tail : DTail} ;
AdN = {s : Str} ;
-- Structural
Conj = {s : Str; distr : Bool; conj : Bool; n : Number} ;
Subj = {s : Str} ;
Prep = {s : Str; c : Case} ;
-- Open lexical classes, e.g. Lexicon
V, VS, VQ, VA = Verb ;
V2, V2A = Verb ** {c2 : Preposition} ;
V2V, V2S, V2Q = Verb ** {c2 : Preposition} ; --- AR
V3 = Verb ** {c2, c3 : Preposition} ;
VV = Verb ;
A = {s : AForm => Str; adv : Str} ;
A2 = {s : AForm => Str; adv : Str; c2 : Str} ;
N = {s : NForm => Str; g : DGender} ;
N2 = {s : NForm => Str; g : DGender} ** {c2 : Preposition} ;
N3 = {s : NForm => Str; g : DGender} ** {c2,c3 : Preposition} ;
PN = {s : Str; g : Gender} ;
-- Tense, Anteriority and Polarity functions
lin
PPos = {s = []} ** {p = R.Pos} ;
PNeg = {s = []} ** {p = R.Neg} ;
TPres = {s = []} ** {t = R.Pres} ;
TPast = {s = []} ** {t = R.Past} ; --# notpresent
TFut = {s = []} ** {t = R.Fut} ; --# notpresent
TCond = {s = []} ** {t = R.Cond} ; --# notpresent
ASimul = {s = []} ** {a = R.Simul} ;
AAnter = {s = []} ** {a = R.Anter} ; --# notpresent
}

View File

@@ -0,0 +1,56 @@
concrete ConjunctionBul of Conjunction =
CatBul ** open ResBul, Coordination, Prelude in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
ConjS conj ss = {
s = (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj;
} ;
ConjAdv conj ss = {
s = (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj;
} ;
ConjNP conj ss = {
s = \\role => (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj!role;
a = {gn = conjGenNum (gennum DMasc conj.n) ss.a.gn; p = ss.a.p}
} ;
ConjAP conj ss = {
s = \\aform => (linCoordSep [])!conj.distr!conj.conj++ss.s!conj.distr!conj.conj!aform;
adv = (linCoordSep [])!conj.distr!conj.conj++ss.adv!conj.distr!conj.conj;
isPre = ss.isPre
} ;
-- These fun's are generated from the list cat's.
BaseS x y = {s = \\d,t=>x.s++linCoord!t++ y.s} ;
ConsS x xs = {s = \\d,t=>x.s++(linCoordSep comma)!d!t++xs.s!d!t} ;
BaseAdv x y = {s = \\d,t=>x.s++linCoord!t++ y.s} ;
ConsAdv x xs = {s = \\d,t=>x.s++(linCoordSep comma)!d!t++xs.s!d!t} ;
BaseNP x y =
{s = \\d,t,role=>x.s!role++linCoord!t++y.s!role;
a = conjAgr x.a y.a} ;
ConsNP x xs =
{s = \\d,t,role=>x.s!role++(linCoordSep comma)!d!t++xs.s!d!t!role;
a = conjAgr xs.a x.a} ;
BaseAP x y =
{s = \\d,t,aform=>x.s!aform++linCoord!t++y.s!aform;
adv= \\d,t =>x.adv ++linCoord!t++y.adv;
isPre = andB x.isPre y.isPre} ;
ConsAP x xs =
{s = \\d,t,aform=>x.s!aform++(linCoordSep comma)!d!t++xs.s!d!t!aform;
adv= \\d,t =>x.adv ++(linCoordSep comma)!d!t++xs.adv!d!t;
isPre = andB x.isPre xs.isPre} ;
lincat
[S] = {s : Bool => Bool => Str} ;
[Adv] = {s : Bool => Bool => Str} ;
[NP] = {s : Bool => Bool => Role => Str; a : Agr} ;
[AP] = {s : Bool => Bool => AForm => Str; adv : Bool => Bool => Str; isPre : Bool} ;
}

View File

@@ -0,0 +1,68 @@
concrete ExtraBul of ExtraBulAbs = CatBul **
open ResBul, Coordination, Prelude in {
flags coding=cp1251 ;
lin
PossIndefPron p = {
s = \\aform => p.gen ! (indefAForm ! aform) ;
spec = Indef
} ;
ReflQuant = {
s = \\aform => reflPron ! aform ;
spec = Indef
} ;
ReflIndefQuant = {
s = \\aform => reflPron ! (indefAForm ! aform) ;
spec = Indef
} ;
i8fem_Pron = mkPron "àç" "ìåí" "ìè" "ìîé" "ìîÿ" "ìîÿò" "ìîÿ" "ìîÿòà" "ìîå" "ìîåòî" "ìîè" "ìîèòå" (GSg Fem) P1 ;
i8neut_Pron = mkPron "àç" "ìåí" "ìè" "ìîé" "ìîÿ" "ìîÿò" "ìîÿ" "ìîÿòà" "ìîå" "ìîåòî" "ìîè" "ìîèòå" (GSg Neut) P1 ;
whatSg8fem_IP = mkIP "êàêâà" "êàêâà" (GSg Fem) ;
whatSg8neut_IP = mkIP "êàêâî" "êàêâî" (GSg Neut) ;
whoSg8fem_IP = mkIP "êîÿ" "êîãî" (GSg Fem) ;
whoSg8neut_IP = mkIP "êîå" "êîãî" (GSg Neut) ;
youSg8fem_Pron = mkPron "òè" "òåá" "òè" "òâîé" "òâîÿ" "òâîÿò" "òâîÿ" "òâîÿòà" "òâîå" "òâîåòî" "òâîè" "òâîèòå" (GSg Fem) P2 ;
youSg8neut_Pron = mkPron "òè" "òåá" "òè" "òâîé" "òâîÿ" "òâîÿò" "òâîÿ" "òâîÿòà" "òâîå" "òâîåòî" "òâîè" "òâîèòå" (GSg Neut) P2 ;
youPol8fem_Pron = mkPron "âèå" "âàñ" "âè" "âàø" "âàøèÿ" "âàøèÿò" "âàøà" "âàøàòà" "âàøå" "âàøåòî" "âàøè" "âàøèòå" (GSg Fem) P2 ;
youPol8neut_Pron = mkPron "âèå" "âàñ" "âè" "âàø" "âàøèÿ" "âàøèÿò" "âàøà" "âàøàòà" "âàøå" "âàøåòî" "âàøè" "âàøèòå" (GSg Neut) P2 ;
onePl_Num = {s = table {
DMascIndef | DMascPersonalIndef | DFemIndef | DNeutIndef => "åäíè" ;
DMascDef | DMascDefNom | DMascPersonalDef | DMascPersonalDefNom | DFemDef | DNeutDef => "åäíèòå"
} ;
n = Pl;
nonEmpty = True
} ;
UttImpSg8fem pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Fem} ;
UttImpSg8neut pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Fem} ;
oper
reflPron : AForm => Str =
table {
ASg Masc Indef => "ñâîé" ;
ASg Masc Def => "ñâîÿ" ;
ASgMascDefNom => "ñâîÿò" ;
ASg Fem Indef => "ñâîÿ" ;
ASg Fem Def => "ñâîÿòà" ;
ASg Neut Indef => "ñâîå" ;
ASg Neut Def => "ñâîåòî" ;
APl Indef => "ñâîè" ;
APl Def => "ñâîèòå"
} ;
indefAForm : AForm => AForm =
table {
ASg g _ => ASg g Indef ;
ASgMascDefNom => ASg Masc Indef ;
APl _ => APl Indef
} ;
}

View File

@@ -0,0 +1,33 @@
abstract ExtraBulAbs = Extra ** {
flags coding=cp1251 ;
fun
-- Feminine variants of pronouns (those in $Structural$ are
-- masculine, which is the default when gender is unknown).
PossIndefPron : Pron -> Quant ;
ReflQuant : Quant ;
ReflIndefQuant : Quant ;
i8fem_Pron : Pron ;
i8neut_Pron : Pron ;
whatSg8fem_IP : IP ;
whatSg8neut_IP : IP ;
whoSg8fem_IP : IP ;
whoSg8neut_IP : IP ;
youSg8fem_Pron : Pron ;
youSg8neut_Pron : Pron ;
youPol8fem_Pron : Pron ;
youPol8neut_Pron : Pron ;
onePl_Num : Num ;
UttImpSg8fem : Pol -> Imp -> Utt;
UttImpSg8neut : Pol -> Imp -> Utt;
}

View File

@@ -0,0 +1,23 @@
--# -path=.:../abstract:../common:prelude
concrete GrammarBul of Grammar =
NounBul,
VerbBul,
AdjectiveBul,
AdverbBul,
NumeralBul,
SentenceBul,
QuestionBul,
RelativeBul,
ConjunctionBul,
PhraseBul,
TextBul,
StructuralBul,
IdiomBul
** {
flags coding=cp1251 ;
flags startcat = Phr ; unlexer = text ; lexer = text ;
} ;

View File

@@ -0,0 +1,65 @@
concrete IdiomBul of Idiom = CatBul ** open Prelude, ParadigmsBul, ResBul in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
ImpersCl vp = mkClause [] (agrP3 (GSg Neut)) vp ;
GenericCl vp = mkClause "íÿêîé" (agrP3 (GSg Neut)) vp ;
CleftNP np rs =
mkClause (np.s ! RSubj)
{gn=GSg Neut; p=np.a.p}
(insertObj (\\_ => thisRP ! np.a.gn ++ rs.s ! np.a) (predV verbBe)) ;
CleftAdv ad s = {s = \\t,a,p,o => case p of {Pos=>[]; Neg=>"íå"} ++ ad.s ++ s.s } ;
ExistNP np =
{ s = \\t,a,p,o =>
let verb = case p of {
Pos => mkV186 "èìàì" ;
Neg => mkV186 "íÿìàì"
} ;
agr=agrP3 (GSg Neut);
present = verb ! (VPres (numGenNum agr.gn) agr.p) ;
aorist = verb ! (VAorist (numGenNum agr.gn) agr.p) ;
perfect = verb ! (VPerfect (aform agr.gn Indef (RObj Acc))) ;
auxPres = auxBe ! VPres (numGenNum agr.gn) agr.p ;
auxAorist = auxBe ! VAorist (numGenNum agr.gn) agr.p ;
auxCondS = auxWould ! VAorist (numGenNum agr.gn) agr.p ;
v : {aux1:Str; aux2:Str; main:Str}
= case <t,a> of {
<Pres,Simul> => {aux1=[]; aux2=[]; main=present} ;
<Pres,Anter> => {aux1=[]; aux2=auxPres; main=perfect} ;
<Past,Simul> => {aux1=[]; aux2=[]; main=aorist} ;
<Past,Anter> => {aux1=[]; aux2=auxAorist; main=perfect} ;
<Fut, Simul> => {aux1="ùå"; aux2=[]; main=present} ;
<Fut, Anter> => {aux1="ùå"++auxPres; aux2=[]; main=perfect} ;
<Cond,_> => {aux1=auxCondS; aux2=[]; main=perfect}
} ;
in case o of {
Main => v.aux1 ++ v.main ++ v.aux2 ++ np.s ! RObj Acc ;
Inv => np.s ! RObj Acc ++ v.aux1 ++ v.main ++ v.aux2 ;
Quest => v.aux1 ++ v.main ++ "ëè" ++ v.aux2 ++ np.s ! RObj Acc
}
} ;
ExistIP ip =
mkQuestion {s = ip.s ! RSubj}
(mkClause "òóê" (agrP3 ip.gn) (predV verbBe)) ;
ProgrVP vp = {
s = \\_ => vp.s ! Imperf ;
ad = vp.ad ;
compl = vp.compl ;
vtype = vp.vtype
} ;
ImpPl1 vp = {s = "íåêà" ++ daComplex vp ! Perf ! {gn = GPl ; p = P1}} ;
}

View File

@@ -0,0 +1,12 @@
--# -path=.:../abstract:../common:src/prelude
concrete LangBul of Lang =
GrammarBul,
LexiconBul
** {
flags coding=cp1251 ;
flags startcat = Phr ; unlexer = text ; lexer = text ; erasing = on ; coding = cp1251 ;
} ;

View File

@@ -0,0 +1,380 @@
--# -path=.:prelude
concrete LexiconBul of Lexicon = CatBul **
open ParadigmsBul, ResBul, Prelude in {
flags coding=cp1251 ;
flags
optimize=values ;
lin
airplane_N = mkN007 "ñàìîëåò" ;
answer_V2S = mkV2S (actionV (mkV187 "îòãîâàðÿì") (mkV173 "îòãîâîðÿ")) naP ;
apartment_N = mkN007 "àïàðòàìåíò" ;
apple_N = mkN041 "ÿáúëêà" ;
art_N = mkN054 "èçêóñòâî" ;
ask_V2Q = mkV2Q (stateV (mkV186 "ïèòàì")) noPrep ;
baby_N = mkN065 "áåáå" ;
bad_A = mkA076 "ëîø" ;
bank_N = mkN041 "áàíêà" ;
beautiful_A = mkA076 "êðàñèâ" ;
become_VA = mkVA (actionV (mkV186 "ñòàâàì") (mkV152 "ñòàíà")) ;
beer_N = mkN041 "áèðà" ;
beg_V2V = mkV2V (stateV (mkV173 "ìîëÿ")) noPrep zaP ;
big_A = mkA081 "ãîëÿì" ;
bike_N = mkN061 "êîëåëî" ;
bird_N = mkN041 "ïòèöà" ;
black_A = mkA079 "÷åðåí" ;
blue_A = mkA086 "ñèí" ;
boat_N = mkN007 "êîðàá" ;
book_N = mkN041 "êíèãà" ;
boot_N = mkN041 "îáóâêà" ;
boss_N = mkN001 "øåô" ;
boy_N = mkN065 "ìîì÷å" ;
bread_N = mkN001 "õëÿá" ;
break_V2 = dirV2 (actionV (mkV173 "÷óïÿ") (mkV173 "ñ÷óïÿ")) ;
broad_A = mkA079 "îáøèðåí" ;
brother_N2 = prepN2 (mkN025 "áðàò") naP ;
brown_A = mkA076 "êàôÿâ" ;
butter_N = mkN054 "ìàñëî" ;
buy_V2 = dirV2 (actionV (mkV186 "êóïóâàì") (mkV173 "êóïÿ")) ;
camera_N = mkN041 "êàìåðà" ;
cap_N = mkN041 "øàïêà" ;
car_N = mkN041 "êîëà" ;
carpet_N = mkN007 "êèëèì" ;
cat_N = mkN041 "êîòêà" ;
ceiling_N = mkN007 "òàâàí" ;
chair_N = mkN001 "ñòîë" ;
cheese_N = mkN066 "ñèðåíå" ;
child_N = mkN067 "äåòå" ;
church_N = mkN041 "öúðêâà" ;
city_N = mkN001 "ãðàä" ;
clean_A = mkA076 "÷èñò" ;
clever_A = mkA079 "óìåí" ;
close_V2 = dirV2 (actionV (mkV187 "çàòâàðÿì") (mkV173 "çàòâîðÿ")) ;
coat_N = mkN054 "ïàëòî" ;
cold_A = mkA076 "ñòóäåí" ;
come_V = actionV (mkV186 "èäâàì") (table { -- special case "äîéäè", "äîéäåòå" are archaic
VImperative Sg => "åëà";
VImperative Pl => "åëàòå";
vform => mkV146a "äîéäà" ! vform}) ;
computer_N = mkN009 "êîìïþòúð" ;
country_N = mkN041 "äúðæàâà" ;
cousin_N = mkN007a "áðàòîâ÷åä" ;
cow_N = mkN041 "êðàâà" ;
die_V = actionV (mkV186 "óìèðàì") (mkV150a "óìðà") ;
dirty_A = mkA079 "ìðúñåí" ;
distance_N3 = prepN3 (mkN072 "ðàçñòîÿíèå") otP doP ;
doctor_N = mkN007a "äîêòîð" ;
dog_N = mkN065 "êó÷å" ;
door_N = mkN041 "âðàòà" ;
drink_V2 = dirV2 (stateV (mkV163 "ïèÿ")) ;
easy_A2V = mkA2V (mkA079 "ëåñåí") zaP ;
eat_V2 = dirV2 (stateV (mkV169 "ÿì")) ;
empty_A = mkA079 "ïðàçåí" ;
enemy_N = mkN001 "âðàã" ;
factory_N = mkN041 "ôàáðèêà" ;
father_N2 = prepN2 (mkN038 "áàùà") naP ;
fear_VS = mkVS (stateV (mkV186 "ñòðàõóâàì")) ;
find_V2 = dirV2 (actionV (mkV186 "íàìèðàì") (mkV173 "íàìåðÿ")) ;
fish_N = mkN041 "ðèáà" ;
floor_N = mkN007 "åòàæ" ;
fridge_N = mkN007 "ôðèçåð" ;
friend_N = mkN031a "ïðèÿòåë" ;
fruit_N = mkN001 "ïëîä" ;
fun_AV = mkAV (mkA079 "çàáàâåí") ;
forget_V2 = dirV2 (actionV (mkV187 "çàáðàâÿì") (mkV173 "çàáðàâÿ")) ;
garden_N = mkN041 "ãðàäèíà" ;
girl_N = mkN065 "ìîìè÷å" ;
glove_N = mkN041 "ðúêàâèöà" ;
gold_N = mkN054 "çëàòî" ;
good_A = adjAdv (mkA080 "äîáúð") "äîáðå" ;
go_V = actionV (mkV186 "îòèâàì") (mkV146 "îòèäà") ;
green_A = mkA076 "çåëåí" ;
harbour_N = mkN066 "ïðèñòàíèùå" ;
hate_V2 = dirV2 (stateV (mkV173 "ìðàçÿ")) ;
hat_N = mkN041 "øàïêà" ;
have_V2 = dirV2 (stateV (mkV186 "èìàì")) ;
hear_V2 = dirV2 (actionV (mkV186 "÷óâàì") (mkV163 "÷óÿ")) ;
hill_N = mkN001 "õúëì" ;
hope_VS = mkVS (medialV (stateV (mkV186 "íàäÿâàì")) Acc) ;
horse_N = mkN035 "êîí" ;
hot_A = mkA076 "ãîðåù" ;
house_N = mkN041 "êúùà" ;
important_A = mkA079 "âàæåí" ;
industry_N = mkN047 "èíäóñòðèÿ" ;
iron_N = mkN057 "æåëÿçî" ;
king_N = mkN035a "öàð" ;
know_V2 = dirV2 {
s = \\_,vform => case vform of {
VPassive aform => (mkA079 "èçâåñòåí").s ! aform ;
_ => mkV162 "çíàÿ" ! vform
} ;
vtype = VNormal ;
lock_V = <>
} ;
lake_N = mkN054 "åçåðî" ;
lamp_N = mkN041 "ëàìïà" ;
learn_V2 = dirV2 (actionV (mkV176 "ó÷à") (mkV176 "íàó÷à")) ;
leather_N = mkN041 "êîæà" ;
leave_V2 = dirV2 (actionV (mkV187 "îñòàâÿì") (mkV173 "îñòàâÿ")) ;
like_V2 = dirV2 (actionV (mkV186 "õàðåñâàì") (mkV186 "õàðåñàì")) ;
listen_V2 = dirV2 (stateV (mkV186 "ñëóøàì")) ;
live_V = stateV (mkV160 "æèâåÿ") ;
long_A = mkA080 "äúëúã" ;
lose_V2 = dirV2 (actionV (mkV173 "ãóáÿ") (mkV173 "çàãóáÿ")) ;
love_N = mkN049 "ëþáîâ" ;
love_V2 = dirV2 (stateV (mkV186 "îáè÷àì")) ;
man_N = mkN024 "ìúæ" ;
married_A2 = mkA2 (mkA076 "æåíåí") zaP ;
meat_N = mkN054 "ìåñî" ;
milk_N = mkN057 "ìëÿêî" ;
moon_N = mkN041 "ëóíà" ;
mother_N2 = prepN2 (mkN041a "ìàéêà") naP ;
mountain_N = mkN041 "ïëàíèíà" ;
music_N = mkN041 "ìóçèêà" ;
narrow_A = mkA084 "òåñåí" ;
new_A = mkA076 "íîâ" ;
newspaper_N = mkN014 "âåñòíèê" ;
oil_N = mkN065 "îëèî" ;
old_A = mkA076 "ñòàð" ;
open_V2 = dirV2 (actionV (mkV187 "îòâàðÿì") (mkV173 "îòâîðÿ")) ;
paint_V2A = mkV2A (actionV (mkV186 "ðèñóâàì") (mkV186 "íàðèñóâàì")) noPrep ;
paper_N = mkN047 "õàðòèÿ" ;
paris_PN = mkPN "Ïàðèæ" Masc ;
peace_N = mkN040a "ìèð" ;
pen_N = mkN041 "ïèñàëêà" ;
planet_N = mkN041 "ïëàíåòà" ;
plastic_N = mkN041 "ïëàñòìàñà" ;
play_V2 = dirV2 (stateV (mkV161 "èãðàÿ")) ;
policeman_N = mkN032a "ïîëèöàé" ;
priest_N = mkN014 "ñâåùåíèê" ;
probable_AS = mkAS (mkA079 "âåðîÿòåí") ;
queen_N = mkN041 "êðàëèöà" ;
radio_N = mkN054 "ðàäèî" ;
rain_V0 = mkV0 (stateV (mkV174 "âàëè")) ;
read_V2 = dirV2 (stateV (mkV145 "÷åòà")) ;
red_A = mkA076 "÷åðâåí" ;
religion_N = mkN047 "ðåëèãèÿ" ;
restaurant_N = mkN007 "ðåñòîðàíò" ;
river_N = mkN041 "ðåêà" ;
rock_N = mkN041 "ñêàëà" ;
roof_N = mkN007 "ïîêðèâ" ;
rubber_N = mkN041 "ãóìà" ;
run_V = stateV (mkV186 "áÿãàì") ;
say_VS = mkVS (actionV (mkV186 "êàçâàì") (mkV156 "êàæà")) ;
school_N = mkN066 "ó÷èëèùå" ;
science_N = mkN041 "íàóêà" ;
sea_N = mkN065 "ìîðå" ;
seek_V2 = dirV2 (stateV (mkV173 "òúðñÿ")) ;
see_V2 = dirV2 (actionV (mkV186 "âèæäàì") (mkV181 "âèäÿ")) ;
sell_V3 = dirV3 (stateV (mkV186 "ïðîäàâàì")) naP ;
send_V3 = dirV3 (actionV (mkV186 "ïðàùàì") (mkV173 "ïðàòÿ")) doP ;
sheep_N = mkN044 "îâöà" ;
ship_N = mkN007 "êîðàá" ;
shirt_N = mkN041 "ðèçà" ;
shoe_N = mkN041 "îáóâêà" ;
shop_N = mkN007 "ìàãàçèí" ;
short_A = mkA076 "êúñ" ;
silver_N = mkN054 "ñðåáðî" ;
sister_N = mkN041a "ñåñòðà" ;
sleep_V = stateV (mkV182 "ñïÿ") ;
small_A = mkA080 "ìàëúê" ;
snake_N = mkN047 "çìèÿ" ;
sock_N = mkN007 "÷îðàï" ;
speak_V2 = dirV2 (stateV (mkV173 "ãîâîðÿ")) ;
star_N = mkN041 "çâåçäà" ;
steel_N = mkN041 "ñòîìàíà" ;
stone_N = mkN017 "êàìúê" ;
stove_N = mkN041 "ïå÷êà" ;
student_N = mkN007a "ñòóäåíò" ;
stupid_A = mkA076 "ãëóïàâ" ;
sun_N = mkN066 "ñëúíöå" ;
switch8off_V2 = dirV2 (actionV (mkV186 "èçêëþ÷âàì") (mkV176 "èçêëþ÷à")) ;
switch8on_V2 = dirV2 (actionV (mkV186 "âêëþ÷âàì") (mkV176 "âêëþ÷à")) ;
table_N = mkN041 "ìàñà" ;
talk_V3 = mkV3 (stateV (mkV173 "ãîâîðÿ")) naP zaP ;
teacher_N = mkN031a "ó÷èòåë" ;
teach_V2 = dirV2 (actionV (mkV186 "ïðåïîäàâàì") (mkV168 "ïðåïîäàì")) ;
television_N = mkN047 "òåëåâèçèÿ" ;
thick_A = mkA076 "äåáåë" ;
thin_A = mkA080 "òúíúê" ;
train_N = mkN001 "âëàê" ;
travel_V = stateV (mkV186 "ïúòóâàì") ;
tree_N = mkN061 "äúðâî" ;
ugly_A = mkA076 "ãëóïàâ" ;
understand_V2 = dirV2 (actionV (mkV186 "ðàçáèðàì") (mkV170 "ðàçáåðà")) ;
university_N = mkN007 "óíèâåðñèòåò" ;
village_N = mkN054 "ñåëî" ;
wait_V2 = prepV2 (stateV (mkV186 "÷àêàì")) zaP ;
walk_V = stateV (mkV173 "õîäÿ") ;
warm_A = mkA080 "òîïúë" ;
war_N = mkN041 "âîéíà" ;
watch_V2 = dirV2 (stateV (mkV186 "ãëåäàì")) ;
water_N = mkN041 "âîäà" ;
white_A = mkA081 "áÿë" ;
window_N = mkN008 "ïðîçîðåö" ;
wine_N = mkN054 "âèíî" ;
win_V2 = dirV2 (actionV (mkV186 "ïîáåæäàâàì") (mkV174 "ïîáåäÿ")) ;
woman_N = mkN041a "æåíà" ;
wonder_VQ = mkVQ (medialV (actionV (mkV186 "ó÷óäâàì") (mkV173 "÷óäÿ")) Acc) ;
wood_N = mkN041 "äúðâåñèíà" ;
write_V2 = dirV2 (stateV (mkV159 "ïèøà")) ;
yellow_A = mkA076 "æúëò" ;
young_A = mkA076 "ìëàä" ;
do_V2 = dirV2 (actionV (mkV173 "ïðàâÿ") (mkV173 "íàïðàâÿ")) ;
now_Adv = mkAdv "ñåãà" ;
already_Adv = mkAdv "âå÷å" ;
song_N = mkN050 "ïåñåí" ;
add_V3 = dirV3 (actionV (mkV186 "ñúáèðàì") (mkV170 "ñúáåðà")) sP ;
number_N = mkN054 "÷èñëî" ;
put_V2 = prepV2 (actionV (mkV186 "ñëàãàì") (mkV176 "ñëîæà")) noPrep ;
stop_V = actionV (mkV186 "ñïèðàì") (mkV150 "ñïðà") ;
jump_V = actionV (mkV186 "ñêà÷àì") (mkV176 "ñêî÷à") ;
left_Ord = mkA081 "ëÿâ" ** {nonEmpty=True} ;
right_Ord = mkA084 "äåñåí" ** {nonEmpty=True} ;
far_Adv = mkAdv "äàëå÷å" ;
correct_A = mkA079 "ïðàâèëåí" ;
dry_A = mkA076 "ñóõ" ;
dull_A = mkA076 "òúï" ;
full_A = mkA079 "ïúëåí" ;
heavy_A = mkA080 "òåæúê" ;
near_A = mkA080 "áëèçúê" ;
rotten_A = mkA076 "ïðîãíèë" ;
round_A = mkA080 "êðúãúë" ;
sharp_A = mkA080 "îñòúð" ;
smooth_A = mkA080 "ãëàäúê" ;
straight_A = mkA081 "ïðÿê" ;
wet_A = mkA080 "ìîêúð" ; ----
wide_A = mkA076 "øèðîê" ;
animal_N = mkN062 "æèâîòíî" ;
ashes_N = mkN049 "ïåïeë" ;
back_N = mkN003 "ãðúá" ;
bark_N = mkN028 "ëàé" ;
belly_N = mkN007 "êîðåì" ;
blood_N = mkN053 "êðúâ" ;
bone_N = mkN049 "êîñò" ;
breast_N = mkN041 "ãúðäà" ;
cloud_N = mkN014 "îáëàê" ;
day_N = mkN033 "äåí" ;
dust_N = mkN001 "ïðàõ" ;
ear_N = mkN064 "óõî" ;
earth_N = mkN047 "çåìÿ" ;
egg_N = mkN066 "ÿéöå" ;
eye_N = mkN063 "îêî" ;
fat_N = mkN041 "ìàçíèíà" ;
feather_N = mkN038 "áàùà" ;
fingernail_N = mkN034 "íîêúò" ;
fire_N = mkN030 "îãúí" ;
flower_N = mkN068 "öâåòå" ;
fog_N = mkN041 "ìúãëà" ;
foot_N = mkN041 "ñòúïêà" ;
forest_N = mkN041 "ãîðà" ;
grass_N = mkN041 "òðåâà" ;
guts_N = mkN054 "÷åðâî" ;
hair_N = mkN041 "êîñà" ;
hand_N = mkN045 "ðúêà" ;
head_N = mkN041 "ãëàâà" ;
heart_N = mkN066 "ñúðöå" ;
horn_N = mkN001 "ðîã" ;
husband_N = mkN015 "ñúïðóã" ; -- personal
ice_N = mkN001 "ëåä" ;
knee_N = mkN058 "êîëÿíî" ;
leaf_N = mkN054 "ëèñòî" ;
leg_N = mkN022 "êðàê" ;
liver_N = mkN001 "äðîá" ;
louse_N = mkN041 "âúøêà" ;
mouth_N = mkN042 "óñòà" ;
name_N = mkN069 "èìå" ;
neck_N = mkN003 "ãðúá" ;
night_N = mkN049 "íîù" ;
nose_N = mkN001 "íîñ" ;
person_N = mkN014 "÷îâåê" ;
rain_N = mkN001 "äúæä" ;
road_N = mkN037 "ïúò" ;
root_N = mkN007 "êîðåí" ;
rope_N = mkN065 "âúæå" ;
salt_N = mkN049 "ñîë" ;
sand_N = mkN014 "ïÿñúê" ;
seed_N = mkN069 "ñåìå" ;
skin_N = mkN041 "êîæà" ;
sky_N = mkN070 "íåáå" ;
smoke_N = mkN014 "ïóøåê" ;
snow_N = mkN002 "ñíÿã" ;
stick_N = mkN041 "ïðú÷êà" ;
tail_N = mkN041 "îïàøêà" ;
tongue_N = mkN014 "åçèê" ;
tooth_N = mkN007 "çúá" ;
wife_N = mkN041 "ñúïðóãà" ;
wind_N = mkN004 "âÿòúð" ;
wing_N = mkN056 "êðèëî" ;
worm_N = mkN032 "÷åðâåé" ;
year_N = mkN041 "ãîäèíà" ;
blow_V = stateV (mkV186 "äóõàì") ;
breathe_V = dirV2 (stateV (mkV186 "äèøàì")) ;
burn_V = actionV (mkV187 "èçãàðÿì") (mkV177 "èçãîðÿ") ;
dig_V = stateV (mkV161 "êîïàÿ") ;
fall_V = actionV (mkV186 "ïàäàì") (mkV152 "ïàäíà") ;
float_V = stateV (mkV186 "ïëàâàì") ;
flow_V = stateV (mkV148 "òåêà") ;
fly_V = stateV (mkV177 "ëåòÿ") ;
freeze_V = stateV (mkV186 "çàìðúçâàì") ;
give_V3 = dirV3 (actionV (mkV186 "äàâàì") (mkV186 "äàì")) naP ;
laugh_V = medialV (stateV (mkV160 "ñìåÿ")) Acc ;
lie_V = stateV (mkV178 "ëåæà") ;
play_V = stateV (mkV161 "èãðàÿ") ;
sew_V = stateV (mkV163 "øèÿ") ;
sing_V = stateV (mkV164 "ïåÿ") ;
sit_V = stateV (mkV177 "ñåäÿ") ;
smell_V = stateV (mkV159 "ìèðèøà") ;
spit_V = stateV (mkV163 "ïëþÿ") ;
stand_V = stateV (mkV180 "ñòîÿ") ;
swell_V = actionV (mkV186 "íàäóâàì") (mkV163 "íàäóÿ") ;
swim_V = stateV (mkV186 "ïëóâàì") ;
think_V = stateV (mkV173 "ìèñëÿ") ;
turn_V = actionV (mkV186 "îáðúùàì") (mkV152 "îáúðíà") ;
vomit_V = actionV (mkV186 "ïîâðúùàì") (mkV152 "ïîâúðíà") ;
bite_V2 = dirV2 (stateV (mkV154 "õàïÿ")) ;
count_V2 = dirV2 (stateV (mkV175 "áðîÿ")) ;
cut_V2 = dirV2 (stateV (mkV157 "ðåæà")) ;
fear_V2 = dirV2 (medialV (stateV (mkV186 "ñòðàõóâàì")) Acc) ;
fight_V2 = dirV2 (medialV (stateV (mkV173 "áîðÿ")) Acc) ;
hit_V2 = dirV2 (actionV (mkV187 "óäðÿì") (mkV173 "óäàðÿ")) ;
hold_V2 = dirV2 (stateV (mkV179 "äúðæà")) ;
hunt_V2 = dirV2 (stateV (mkV174 "ëîâÿ")) ;
kill_V2 = dirV2 (actionV (mkV186 "óáèâàì") (mkV163 "óáèÿ")) ;
pull_V2 = dirV2 (stateV (mkV186 "äúðïàì")) ;
push_V2 = dirV2 (stateV (mkV186 "áóòàì")) ;
rub_V2 = dirV2 (stateV (mkV163 "òðèÿ")) ;
scratch_V2 = dirV2 (actionV (mkV186 "äðàñêàì") (mkV152 "äðàñíà")) ;
split_V2 = dirV2 (actionV (mkV187 "ðàçäåëÿì") (mkV174 "ðàçäåëÿ")) ;
squeeze_V2 = dirV2 (actionV (mkV186 "ñòèñêàì") (mkV152 "ñòèñíà")) ;
stab_V2 = dirV2 (actionV (mkV186 "ïðîìóøâàì") (mkV176 "ïðîìóøà")) ;
suck_V2 = dirV2 (stateV (mkV155 "ñó÷à")) ;
throw_V2 = dirV2 (actionV (mkV187 "õâúðëÿì") (mkV173 "õâúðëÿ")) ;
tie_V2 = dirV2 (actionV (mkV186 "âðúçâàì") (mkV156 "âúðæà")) ;
wash_V2 = dirV2 (stateV (mkV163 "ìèÿ")) ;
wipe_V2 = dirV2 (stateV (mkV159 "áúðøà")) ;
grammar_N = mkN041 "ãðàìàòèêà" ;
language_N = mkN014 "åçèê" ;
rule_N = mkN054 "ïðàâèëî" ;
john_PN = mkPN "Äæîí" Masc ;
question_N = mkN007 "âúïðîñ" ;
ready_A = mkA076 "ãîòîâ" ;
reason_N = mkN041 "ïðè÷èíà" ;
today_Adv = mkAdv "äíåñ" ;
uncertain_A = mkA079 "íåÿñåí" ;
oper
zaP = mkPrep "çà" Acc ;
naP = mkPrep [] Dat ;
otP = mkPrep "îò" Acc ;
doP = mkPrep "äî" Acc ;
sP = mkPrep (pre { "ñ" ;
"ñúñ" / strs {"ñ" ; "ç" ; "Ñ" ; "Ç"}
}) Acc ;
} ;

View File

@@ -0,0 +1,179 @@
--# -path=.:../../prelude
--1 A Simple English Resource Morphology
--
-- Aarne Ranta 2002 -- 2005
--
-- This resource morphology contains definitions needed in the resource
-- syntax. To build a lexicon, it is better to use $ParadigmsEng$, which
-- gives a higher-level access to this module.
resource MorphoBul = ResBul ** open
Predef,
Prelude,
CatBul
in {
flags coding=cp1251 ;
flags optimize=all ;
oper
--2 Determiners
mkDeterminerSg : Str -> Str -> Str -> {s : Bool => DGender => Role => Str; n : Number; countable : Bool ; spec : Species} = \vseki,vsiaka,vsiako ->
{s = \\_,g,_ => table DGender [vseki;vseki;vsiaka;vsiako] ! g; n = Sg; countable = False; spec = Indef} ;
mkDeterminerPl : Str -> {s : Bool => DGender => Role => Str ; n : Number; countable : Bool ; spec : Species} = \vsicki ->
{s = \\_,_,_ => vsicki; sp = \\_,_ => vsicki; n = Pl; countable = False; spec = Indef} ;
mkQuant : Str -> Str -> Str -> Str -> {s : Bool => AForm => Str; nonEmpty : Bool; spec : Species} = \tozi,tazi,towa,tezi ->
{ s = \\_ => table {
ASg Masc _ => tozi ;
ASgMascDefNom => tozi ;
ASg Fem _ => tazi ;
ASg Neut _ => towa ;
APl _ => tezi
} ;
nonEmpty = True ;
spec = Indef
} ;
--2 Verbs
mkVerb : (_,_,_,_,_,_,_,_,_:Str) -> VTable =
\cheta,chete,chetoh,chetqh,chel,chetql,cheten,chetqst,cheti ->
table {
VPres Sg P1 => cheta;
VPres Sg P2 => chete + "ø";
VPres Sg P3 => chete;
VPres Pl P1 => case chete of {
_ + ("à"|"ÿ") => chete + "ìå";
_ => chete + "ì"
};
VPres Pl P2 => chete + "òå";
VPres Pl P3 => case cheta of {
vika + "ì" => case chete of {
dad + "å" => dad + "àò";
vika => vika + "ò"
};
_ => cheta + "ò"
};
VAorist Sg P1 => chetoh;
VAorist Sg _ => case chetoh of {
chet+"îõ" => chete;
zova+ "õ" => zova
};
VAorist Pl P1 => chetoh + "ìå";
VAorist Pl P2 => chetoh + "òå";
VAorist Pl P3 => chetoh + "à";
VImperfect Sg P1 => chetqh;
VImperfect Sg _ => case chete of {
rabot + "è" => rabot + "eøå";
_ => chete + "øå"
};
VImperfect Pl P1 => chetqh + "ìå";
VImperfect Pl P2 => chetqh + "òå";
VImperfect Pl P3 => chetqh + "à";
VPerfect aform =>let chel1 : Str =
case chel of {
pas+"úë" => pas+"ë";
_ => chel
}
in (mkAdjective chel
(chel+"èÿ")
(chel+"èÿò")
(chel1+"a")
(chel1+"àòà")
(chel1+"î")
(chel1+"îòî")
(ia2e chel1+"è")
(ia2e chel1+"èòå")).s ! aform ;
VPluPerfect aform => regAdjective chetql ! aform ;
VPassive aform => regAdjective cheten ! aform ;
VPresPart aform => regAdjective chetqst ! aform ;
VImperative Sg => cheti;
VImperative Pl => case cheti of {
chet + "è" => chet + "åòå";
ela => ela + "òå"
};
VGerund => case chete of {
rabot + "è" => rabot + "åéêè";
_ => chete + "éêè"
}
} ;
--2 Nouns
mkNoun : Str -> Str -> Str -> Str -> DGender -> N = \sg,pl,count,voc,g -> {
s = table {
NF Sg Indef => sg ;
NF Sg Def => case sg of {
_+"à"=>sg+"òà" ;
_+"ÿ"=>sg+"òà" ;
_+"î"=>sg+"òî" ;
_+"å"=>sg+"òî" ;
_+"è"=>sg+"òî" ;
s+"é"=>s +"ÿ" ;
_+("òåë"|"àð"|"ÿð"|"äåí"
|"ïúò"|"îãúí"|"ñúí"
|"êîí"|"êðàë"|"öàð"
|"çåò"|"ëàêúò"|"íîêúò")
=>sg +"ÿ" ;
_ =>case g of {
DFem => sg+"òà" ;
_ => sg+"à"
}
} ;
NF Pl Indef => pl ;
NF Pl Def => case pl of {
_+"à"=>pl+"òà" ;
_+"å"=>pl+"òå" ;
_+"è"=>pl+"òå" ;
s+"ÿ"=>s +"òà" ;
s =>s +"òå"
} ;
NFSgDefNom => case sg of {
_+"à"=>sg+"òà" ;
_+"ÿ"=>sg+"òà" ;
_+"î"=>sg+"òî" ;
_+"å"=>sg+"òî" ;
_+"è"=>sg+"òî" ;
s+"é"=>s +"ÿò" ;
_+("òåë"|"àð"|"ÿð"|"äåí"
|"ïúò"|"îãúí"|"ñúí"
|"êîí"|"êðàë"|"öàð"
|"çåò"|"ëàêúò"|"íîêúò")
=>sg+"ÿò" ;
_ =>case g of {
DFem => sg+"òà" ;
_ => sg+"úò"
}
} ;
NFPlCount => count ;
NFVocative => voc
} ;
g = g ;
lock_N = <>
} ;
--2 Adjectives
mkAdjective : (_,_,_,_,_,_,_,_,_ : Str) -> A =
\dobyr,dobria,dobriat,dobra,dobrata,dobro,dobroto,dobri,dobrite -> {
s = table {
ASg Masc Indef => dobyr ;
ASg Masc Def => dobria ;
ASgMascDefNom => dobriat ;
ASg Fem Indef => dobra ;
ASg Fem Def => dobrata ;
ASg Neut Indef => dobro ;
ASg Neut Def => dobroto ;
APl Indef => dobri ;
APl Def => dobrite
} ;
adv = dobro ;
lock_A = <>
} ;
}

View File

@@ -0,0 +1,184 @@
--# -path=.:../abstract:../../prelude:../common
resource MorphoFunsBul = open
Prelude,
CatBul,
MorphoBul
in {
flags coding=cp1251 ;
oper
--2 Adverbs
-- Adverbs are not inflected. Most lexical ones have position
-- after the verb. Some can be preverbal (e.g. "always").
mkAdv : Str -> Adv = \x -> ss x ** {lock_Adv = <>} ;
mkAdV : Str -> AdV = \x -> ss x ** {lock_AdV = <>} ;
-- Adverbs modifying adjectives and sentences can also be formed.
mkAdA : Str -> AdA = \x -> ss x ** {lock_AdA = <>} ;
--2 Adjectives
--
AS, A2S, AV : Type = A ;
A2V : Type = A2 ;
mkA2 : A -> Prep -> A2 ;
mkA2 a p = a ** {c2 = p.s ; lock_A2 = <>} ;
mkAS : A -> AS ;
mkAS v = v ** {lock_A = <>} ;
mkA2S : A -> Prep -> A2S ;
mkA2S v p = mkA2 v p ** {lock_A = <>} ;
mkAV : A -> AV ;
mkAV v = v ** {lock_A = <>} ;
mkA2V : A -> Prep -> A2V ;
mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
--2 Verbs
--
medialV : V -> Case -> V ;
medialV v c = {s = v.s; vtype = VMedial c; lock_V=<>} ;
phrasalV : V -> Case -> V ;
phrasalV v c = {s = v.s; vtype = VPhrasal c; lock_V=<>} ;
actionV : VTable -> VTable -> V ;
actionV imperf perf = {
s = table {Imperf=>imperf; Perf=>perf};
vtype = VNormal;
lock_V=<>
} ;
stateV : VTable -> V ;
stateV vtable = {
s = \\_=>vtable;
vtype = VNormal;
lock_V=<>
} ;
--3 Zero-place verbs
--
V0 : Type = V ;
mkV0 : V -> V0 ;
mkV0 v = v ** {lock_V = <>} ;
--3 Two-place verbs
--
prepV2 : V -> Prep -> V2 ;
prepV2 v p = {s = v.s; c2 = p; vtype = v.vtype; lock_V2 = <>} ;
dirV2 : V -> V2 ;
dirV2 v = prepV2 v noPrep ;
--3 Three-place verbs
--
-- Three-place (ditransitive) verbs need two prepositions, of which
-- the first one or both can be absent.
mkV3 : V -> Prep -> Prep -> V3 ; -- speak, with, about
mkV3 v p q = {s = v.s; s1 = v.s1; c2 = p; c3 = q; vtype = v.vtype; lock_V3 = <>} ;
dirV3 : V -> Prep -> V3 ; -- give,_,to
dirV3 v p = mkV3 v noPrep p ;
dirdirV3 : V -> V3 ; -- give,_,_
dirdirV3 v = dirV3 v noPrep ;
--3 Other verbs
--
-- V2S, V2V, V2Q : Type = V2 ;
mkV2S : V -> Prep -> V2S ;
mkV2S v p = prepV2 v p ** {lock_V2S = <>} ;
mkV2V : V -> Prep -> Prep -> V2V ;
mkV2V v p t = prepV2 v p ** {s4 = t ; lock_V2V = <>} ;
mkV2A : V -> Prep -> V2A ;
mkV2A v p = prepV2 v p ** {lock_V2A = <>} ;
mkV2Q : V -> Prep -> V2Q ;
mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ;
mkVS : V -> VS ;
mkVS v = v ** {lock_VS = <>} ;
mkVV : V -> VV ;
mkVV v = v ** {lock_VV = <>} ;
mkVA : V -> VA ;
mkVA v = v ** {lock_VA = <>} ;
mkV2A : V -> Prep -> V2A ;
mkV2A v p = prepV2 v p ** {lock_V2A = <>} ;
mkVQ : V -> VQ ;
mkVQ v = v ** {lock_VQ = <>} ;
mkV2Q : V -> Prep -> V2Q ;
mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ;
--2 Nouns
--3 Two-place Nouns
--
prepN2 : N -> Prep -> N2 ;
prepN2 n p = {s = n.s; g = n.g; c2 = p; lock_N2 = <>} ;
dirN2 : N -> N2 ;
dirN2 n = prepN2 n noPrep ;
--3 Three-place Nouns
--
prepN3 : N -> Prep -> Prep -> N3 ;
prepN3 n p q = {s = n.s; g = n.g; c2 = p; c3 = q; lock_N3 = <>} ;
dirN3 : N -> Prep -> N3 ;
dirN3 n p = prepN3 n noPrep p ;
dirdirN3 : N -> N3 ;
dirdirN3 n = dirN3 n noPrep ;
--2 Prepositions
--
-- A preposition as used for rection in the lexicon, as well as to
-- build $PP$s in the resource API, just requires a string.
mkPrep : Str -> Case -> Prep = \p,c -> {s = p; c = c; lock_Prep = <>} ;
noPrep : Prep = mkPrep [] Acc ;
--2 Proper Names
--
mkPN : Str -> Gender -> PN ;
mkPN s g = {s = s; g = g ; lock_PN = <>} ;
--2 IAdv
--
mkIAdv : Str -> IAdv ;
mkIAdv s = {s = table {QDir=>s;QIndir=>s+"ňî"}; lock_IAdv = <>} ;
}

View File

@@ -0,0 +1,178 @@
concrete NounBul of Noun = CatBul ** open ResBul, Prelude in {
flags optimize=all_subs ; coding=cp1251 ;
lin
DetCN det cn =
{ s = \\role => let nf = case <det.n,det.spec> of {
<Sg,Def> => case role of {
RSubj => NFSgDefNom ;
RVoc => NFVocative ;
_ => NF Sg Def
} ;
<Sg,Indef> => case role of {
RVoc => NFVocative ;
_ => NF Sg Indef
} ;
<Pl,Def> => NF det.n det.spec ;
<Pl,Indef> => case cn.g of {
DMascPersonal => NF Pl Indef;
_ => case det.countable of {
True => NFPlCount ;
False => NF Pl Indef
}
}
} ;
s = det.s ! True ! cn.g ! role ++ cn.s ! nf
in case role of {
RObj Dat => "íà" ++ s;
_ => s
} ;
a = {gn = gennum cn.g det.n; p = P3} ;
} ;
DetNP det =
{ s = \\role => let s = det.s ! False ! DNeut ! role
in case role of {
RObj Dat => "íà" ++ s;
_ => s
} ;
a = {gn = gennum DNeut det.n; p = P3} ;
} ;
UsePN pn = { s = table {
RObj Dat => "íà" ++ pn.s;
_ => pn.s
} ;
a = {gn = GSg pn.g; p = P3}
} ;
UsePron p = {s = p.s; a=p.a} ;
PredetNP pred np = {
s = \\c => pred.s ! np.a.gn ++ np.s ! c ;
a = np.a
} ;
PPartNP np v2 = {
s = \\c => np.s ! c ++ v2.s ! Perf ! VPassive (aform np.a.gn Indef c) ;
a = np.a
} ;
AdvNP np adv = {
s = \\c => np.s ! c ++ adv.s ;
a = np.a
} ;
DetQuant quant num = {
s = \\sp,g,c => let sp' = case num.nonEmpty of { True => True ;
False => sp }
in quant.s ! sp' ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++
num.s ! dgenderSpecies g quant.spec c ;
n = num.n ;
countable = num.nonEmpty ;
spec = case num.nonEmpty of {True=>Indef; _=>quant.spec}
} ;
DetQuantOrd = \quant, num, ord -> {
s = \\_,g,c => quant.s ! True ! aform (gennum g num.n) (case c of {RVoc=>Indef; _=>Def}) c ++
num.s ! dgenderSpecies g quant.spec c ++
ord.s ! aform (gennum g num.n) (case num.nonEmpty of {True=>Indef; _=>quant.spec}) c ;
n = num.n ;
countable = num.nonEmpty ;
spec=Indef
} ;
PossPron p = {
s = \\_ => p.gen ;
nonEmpty = True ;
spec = ResBul.Indef
} ;
NumSg = {s = \\_ => []; n = Sg; nonEmpty = False} ;
NumPl = {s = \\_ => []; n = Pl; nonEmpty = False} ;
NumCard n = n ** {nonEmpty = True} ;
NumDigits n = {s = \\gspec => n.s ! NCard gspec; n = n.n} ;
OrdDigits n = {s = \\aform => n.s ! NOrd aform} ;
NumNumeral numeral = {s = \\gspec => numeral.s ! NCard gspec; n = numeral.n; nonEmpty = True} ;
OrdNumeral numeral = {s = \\aform => numeral.s ! NOrd aform} ;
AdNum adn num = {s = \\gspec => adn.s ++ num.s ! gspec; n = num.n; nonEmpty = num.nonEmpty} ;
OrdSuperl a = {s = \\aform => "íàé" ++ "-" ++ a.s ! aform} ;
DefArt = {
s = table {
True => \\_ => [] ;
False => table {
ASg Masc _ => "òîé" ;
ASgMascDefNom => "òîé" ;
ASg Fem _ => "òÿ" ;
ASg Neut _ => "òî" ;
APl _ => "òå"
}
} ;
nonEmpty = False ;
spec = ResBul.Def
} ;
IndefArt = {
s = table {
True => \\_ => [] ;
False => table {
ASg Masc _ => "åäèí" ;
ASgMascDefNom => "åäèí" ;
ASg Fem _ => "åäíà" ;
ASg Neut _ => "åäíî" ;
APl _ => "åäíè"
}
} ;
nonEmpty = False ;
spec = ResBul.Indef
} ;
MassNP cn = {
s = table {
RVoc => cn.s ! NFVocative ;
RObj Dat => "íà" ++ cn.s ! (NF Sg Indef);
_ => cn.s ! (NF Sg Indef)
} ;
a = {gn = gennum cn.g Sg; p = P3} ;
} ;
UseN noun = noun ;
UseN2 noun = noun ;
ComplN2 f x = {s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c; g=f.g} ;
ComplN3 f x = {s = \\nf => f.s ! nf ++ f.c2.s ++ x.s ! RObj f.c2.c; c2 = f.c3; g=f.g} ;
Use2N3 f = {s = f.s ; g=f.g ; c2 = f.c2} ;
Use3N3 f = {s = f.s ; g=f.g ; c2 = f.c3} ;
AdjCN ap cn = {
s = \\nf => case ap.isPre of {
True => (ap.s ! nform2aform nf cn.g) ++ (cn.s ! (indefNForm nf)) ;
False => (cn.s ! nf) ++ (ap.s ! nform2aform (indefNForm nf) cn.g)
} ;
g = cn.g
} ;
RelCN cn rs = {
s = \\nf => cn.s ! nf ++ rs.s ! {gn=gennum cn.g (numNForm nf); p=P3} ;
g = cn.g
} ;
AdvCN cn ad = {
s = \\nf => cn.s ! nf ++ ad.s ;
g = cn.g
} ;
SentCN cn sc = {s = \\nf => cn.s ! nf ++ sc.s; g=DNeut} ;
ApposCN cn np = {s = \\nf => cn.s ! nf ++ np.s ! RSubj; g=cn.g} ;
RelNP np rs = {
s = \\r => np.s ! r ++ rs.s ! np.a ;
a = np.a
} ;
}

View File

@@ -0,0 +1,134 @@
concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in {
flags coding=cp1251 ;
lincat
Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
Sub100 = {s : CardOrd => Str; n : Number; i : Bool} ;
Sub1000 = {s : CardOrd => Str; n : Number; i : Bool} ;
Sub1000000 = {s : CardOrd => Str; n : Number} ;
lin num x = x ;
lin n2 = mkDigit "äâà" "äâàìà" "äâå" "âòîðè" "äâåñòà" ;
lin n3 = mkDigit "òðè" "òðèìà" "òðè" "òðåòè" "òðèñòà" ;
lin n4 = mkDigit "÷åòèðè" "÷åòèðèìà" "÷åòèðè" "÷åòâúðòè" "÷åòèðèñòîòèí" ;
lin n5 = mkDigit "ïåò" "ïåòèìà" "ïåò" "ïåòè" "ïåòñòîòèí" ;
lin n6 = mkDigit "øåñò" "øåñòèìà" "øåñò" "øåñòè" "øåñòñòîòèí" ;
lin n7 = mkDigit "ñåäåì" "ñåäìèíà" "ñåäåì" "ñåäìè" "ñåäåìñòîòèí" ;
lin n8 = mkDigit "îñåì" "îñìèíà" "îñåì" "îñìè" "îñåìñòîòèí" ;
lin n9 = mkDigit "äåâåò" "äåâåòèìà" "äåâåò" "äåâåòè" "äåâåòñòîòèí" ;
lin pot01 =
{s = table {
unit => table {
NCard DMascIndef => "åäèí" ;
NCard DMascDef => "åäèíèÿ" ;
NCard DMascDefNom => "åäèíèÿò" ;
NCard DMascPersonalIndef => "åäèí" ;
NCard DMascPersonalDef => "åäèíèÿ" ;
NCard DMascPersonalDefNom => "åäèíèÿò" ;
NCard DFemIndef => "åäíà" ;
NCard DFemDef => "åäíàòà" ;
NCard DNeutIndef => "åäíî" ;
NCard DNeutDef => "åäíîòî" ;
NOrd aform => case aform of {
ASg Masc Indef => "ïúðâè" ;
ASg Masc Def => "ïúðâèÿ" ;
ASgMascDefNom => "ïúðâèÿò" ;
ASg Fem Indef => "ïúðâà" ;
ASg Fem Def => "ïúðâàòà" ;
ASg Neut Indef => "ïúðâî" ;
ASg Neut Def => "ïúðâîòî" ;
APl Indef => "ïúðâè" ;
APl Def => "ïúðâèòå"
}
} ;
teen => mkCardOrd "åäèíàäåñåò" "åäèíàäåñåòèìà" "åäèíàäåñåò" "åäèíàäåñåòè" ;
ten => mkCardOrd "äåñåò" "äåñåòèìà" "äåñåò" "äåñåòè" ;
hundred => mkCardOrd "ñòî" "ñòîòèíà" "ñòî" "ñòîòåí"
}
;n = Sg
} ;
lin pot0 d = d ** {n = Pl} ;
lin pot110 = {s=pot01.s ! ten; n = Pl; i = True} ;
lin pot111 = {s=pot01.s ! teen; n = Pl; i = True} ;
lin pot1to19 d = {s = d.s ! teen; n = Pl; i = True} ;
lin pot0as1 n = {s = n.s ! unit; n = n.n; i = True} ;
lin pot1 d = {s = d.s ! ten; n = Pl; i = True} ;
lin pot1plus d e = {
s = \\c => d.s ! ten ! NCard DMascIndef ++ "è" ++ e.s ! unit ! c ; n = Pl; i = False} ;
lin pot1as2 n = n ;
lin pot2 n = {s = \\c => n.s ! hundred ! c; n = Pl; i = True} ;
lin pot2plus d e = {
s = \\c => d.s ! hundred ! NCard DMascIndef ++ case e.i of {False => []; True => "è"} ++ e.s ! c ;
n = Pl ;
i = False
} ;
lin pot2as3 n = n ;
lin pot3 n = {
s = \\c => case n.n of {
Sg => mkCardOrd "õèëÿäà" "õèëÿäà" "õèëÿäà" "õèëÿäåí" ! c ;
Pl => n.s ! NCard DFemIndef ++ mkCardOrd "õèëÿäè" "õèëÿäè" "õèëÿäè" "õèëÿäåí" ! c
} ;
n = Pl
} ;
lin pot3plus n m = {
s = \\c => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard DMascIndef ++ case m.i of {False => []; True => "è"} ++ m.s ! c ;
n = Pl
} ;
-- numerals as sequences of digits
lincat
Dig = TDigit ;
lin
IDig d = d ** {tail = T1} ;
IIDig d i = {
s = \\o => d.s ! NCard DMascIndef ++ commaIf i.tail ++ i.s ! o ;
n = Pl ;
tail = inc i.tail
} ;
D_0 = mk2Dig "0" "0â" ;
D_1 = mk3Dig "1" "1âè" Sg ;
D_2 = mk2Dig "2" "2ðè" ;
D_3 = mkDig "3" ;
D_4 = mkDig "4" ;
D_5 = mkDig "5" ;
D_6 = mkDig "6" ;
D_7 = mk2Dig "7" "7ìè" ;
D_8 = mk2Dig "8" "8ìè" ;
D_9 = mkDig "9" ;
oper
commaIf : DTail -> Str = \t -> case t of {
T3 => "," ;
_ => []
} ;
inc : DTail -> DTail = \t -> case t of {
T1 => T2 ;
T2 => T3 ;
T3 => T1
} ;
mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
mkDig : Str -> TDigit = \c -> mk2Dig c (c + "òè") ;
mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
s = table {NCard _ => c ; NOrd aform => regAdjective o ! aform} ;
n = n
} ;
TDigit = {
n : Number ;
s : CardOrd => Str
} ;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
concrete PhraseBul of Phrase = CatBul ** open Prelude, ResBul in {
flags coding=cp1251 ;
lin
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
UttS s = s ;
UttQS qs = {s = qs.s ! QDir} ;
UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! GSg Masc} ;
UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! GPl} ;
UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! GPl} ;
UttIP ip = {s = ip.s ! RSubj ! QDir} ;
UttIAdv iadv = {s = iadv.s ! QDir} ;
UttNP np = {s = np.s ! RSubj} ;
UttVP vp = {s = daComplex vp ! Perf ! agrP3 (GSg Neut)} ;
UttAdv adv = adv ;
NoPConj = {s = []} ;
PConjConj conj = {s = conj.s ++ linCoord!conj.conj} ;
NoVoc = {s = []} ;
VocNP np = {s = "," ++ np.s ! RVoc} ;
}

View File

@@ -0,0 +1,63 @@
concrete QuestionBul of Question = CatBul ** open ResBul, Prelude in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
QuestCl cl = {
s = \\t,a,p =>
let cls = cl.s ! t ! a ! p
in table {
QDir => cls ! Quest ;
QIndir => "àêî" ++ cls ! Main
} ---- "whether" in ExtEng
} ;
QuestVP ip vp = {
s = \\t,a,b,qform =>
(mkClause (ip.s ! RSubj ! qform) {gn = ip.gn ; p = P3} vp).s ! t ! a ! b ! Main
} ;
QuestSlash ip slash =
mkQuestion {s = \\spec => slash.c2.s ++ ip.s ! (RObj slash.c2.c) ! spec}
{s = slash.s ! (agrP3 ip.gn) } ;
QuestIAdv iadv cl = mkQuestion iadv cl ;
QuestIComp icomp np =
mkQuestion icomp (mkClause (np.s ! RSubj) np.a (predV verbBe)) ;
PrepIP p ip = {s = \\spec => p.s ++ ip.s ! RSubj ! spec} ;
AdvIP ip adv = {
s = \\role,spec => ip.s ! role ! spec ++ adv.s ;
gn = ip.gn
} ;
CompIAdv a = a ;
IdetCN idet cn = {
s = \\_,spec => let nf = case <idet.n, idet.nonEmpty> of {
<Pl,True> => NFPlCount ;
_ => NF idet.n Indef
}
in idet.s ! cn.g ! spec ++ cn.s ! nf ;
gn = gennum cn.g idet.n
} ;
IdetIP idet = {
s = \\_ => idet.s ! DNeut ;
gn = gennum DNeut idet.n
} ;
IdetQuant iquant num = {
s = \\g,spec => iquant.s ! gennum g num.n ! spec ++
num.s ! dgenderSpecies g Indef RSubj ;
n = num.n ;
nonEmpty = num.nonEmpty
} ;
CompIP ip = {s = ip.s ! RSubj} ;
}

View File

@@ -0,0 +1,34 @@
concrete RelativeBul of Relative = CatBul ** open ResBul in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
RelCl cl = {
s = \\t,a,p,agr => suchRP ! agr.gn ++ "֌" ++ cl.s ! t ! a ! p ! Main ;
role = RSubj
} ;
RelVP rp vp = {
s = \\t,a,p,agr =>
let
cl = mkClause (rp.s ! agr.gn) agr vp
in
cl.s ! t ! a ! p ! Main ;
role = RSubj
} ;
RelSlash rp slash = {
s = \\t,a,p,agr => slash.c2.s ++ rp.s ! agr.gn ++ slash.s ! agr ! t ! a ! p ! Main ;
role = RObj Acc
} ;
FunRP p np rp = {
s = \\gn => np.s ! RObj Acc ++ p.s ++ (case p.c of {Acc => []; Dat => "íà"}) ++ rp.s ! gn ;
} ;
IdRP = {
s = whichRP ;
} ;
}

View File

@@ -0,0 +1,626 @@
--# -path=.:../abstract:../common:../../prelude
--1 Bulgarian auxiliary operations.
-- This module contains operations that are needed to make the
-- resource syntax work. To define everything that is needed to
-- implement $Test$, it moreover contains regular lexical
-- patterns needed for $Lex$.
resource ResBul = ParamX ** open Prelude in {
flags coding=cp1251 ;
flags optimize=all ;
-- Some parameters, such as $Number$, are inherited from $ParamX$.
--2 For $Noun$
-- This is the worst-case $Case$ needed for pronouns.
param
Role = RSubj | RObj Case | RVoc ;
Case = Acc | Dat;
NForm =
NF Number Species
| NFSgDefNom
| NFPlCount
| NFVocative
;
GenNum = GSg Gender | GPl ;
-- Agreement of $NP$ is a record. We'll add $Gender$ later.
oper
Agr = {gn : GenNum ; p : Person} ;
param
Gender = Masc | Fem | Neut ;
Species = Indef | Def ;
-- The plural never makes a gender distinction.
--2 For $Verb$
Aspect = Imperf | Perf ;
VForm =
VPres Number Person
| VAorist Number Person
| VImperfect Number Person
| VPerfect AForm
| VPluPerfect AForm
| VPassive AForm
| VPresPart AForm
| VImperative Number
| VGerund
;
VType =
VNormal
| VMedial Case
| VPhrasal Case
;
-- The order of sentence is needed already in $VP$.
Order = Main | Inv | Quest ;
--2 For $Adjective$
AForm =
ASg Gender Species
| ASgMascDefNom
| APl Species
;
--2 For $Numeral$
DGender =
DMasc
| DMascPersonal
| DFem
| DNeut
;
DGenderSpecies =
DMascIndef
| DMascDef
| DMascDefNom
| DMascPersonalIndef
| DMascPersonalDef
| DMascPersonalDefNom
| DFemIndef
| DFemDef
| DNeutIndef
| DNeutDef
;
CardOrd = NCard DGenderSpecies | NOrd AForm ;
DForm = unit | teen | ten | hundred ;
--2 Transformations between parameter types
oper
agrP3 : GenNum -> Agr = \gn ->
{gn = gn; p = P3} ;
conjGenNum : GenNum -> GenNum -> GenNum = \a,b ->
case <a,b> of {
<GSg _,GSg g> => GSg g ;
_ => GPl
} ;
conjAgr : Agr -> Agr -> Agr = \a,b -> {
gn = conjGenNum a.gn b.gn ;
p = conjPerson a.p b.p
} ;
gennum : DGender -> Number -> GenNum = \g,n ->
case n of {
Sg => GSg (case g of {
DMasc => Masc ;
DMascPersonal => Masc ;
DFem => Fem ;
DNeut => Neut
}) ;
Pl => GPl
} ;
numGenNum : GenNum -> Number = \gn ->
case gn of {
GSg _ => Sg ;
GPl => Pl
} ;
aform : GenNum -> Species -> Role -> AForm = \gn,spec,role ->
case gn of {
GSg g => case <g,spec,role> of {
<Masc,Def,RSubj> => ASgMascDefNom ;
_ => ASg g spec
} ;
GPl => APl spec
} ;
dgenderSpecies : DGender -> Species -> Role -> DGenderSpecies =
\g,spec,role -> case <g,spec> of {
<DMasc,Indef> => DMascIndef ;
<DMasc,Def> => case role of {
RSubj => DMascDefNom ;
_ => DMascDef
} ;
<DMascPersonal,Indef> => DMascPersonalIndef ;
<DMascPersonal,Def> => case role of {
RSubj => DMascPersonalDefNom ;
_ => DMascPersonalDef
} ;
<DFem ,Indef> => DFemIndef ;
<DFem ,Def> => DFemDef ;
<DNeut,Indef> => DNeutIndef ;
<DNeut,Def> => DNeutDef
} ;
nform2aform : NForm -> DGender -> AForm
= \nf,g -> case nf of {
NF n spec => aform (gennum g n) spec (RObj Acc) ;
NFSgDefNom => aform (gennum g Sg) Def RSubj ;
NFPlCount => APl Indef ;
NFVocative => aform (gennum g Sg) Indef (RObj Acc)
} ;
indefNForm : NForm -> NForm
= \nf -> case nf of {
NF n spec => NF n Indef ;
NFSgDefNom => NF Sg Indef ;
NFPlCount => NFPlCount ;
NFVocative => NFVocative
} ;
numNForm : NForm -> Number
= \nf -> case nf of {
NF n spec => n ;
NFSgDefNom => Sg ;
NFPlCount => Pl ;
NFVocative => Sg
} ;
oper
-- For $Verb$.
VTable = VForm => Str ;
Verb : Type = {
s : Aspect => VTable ;
vtype : VType
} ;
VP : Type = {
s : Aspect => VTable ;
ad : {isEmpty : Bool; s : Str} ; -- sentential adverb
compl : Agr => Str ;
vtype : VType
} ;
VPSlash = {
s : Aspect => VTable ;
ad : {isEmpty : Bool; s : Str} ; -- sentential adverb
compl1 : Agr => Str ;
compl2 : Agr => Str ;
vtype : VType ;
c2 : Preposition
} ;
predV : Verb -> VP = \verb -> {
s = verb.s ;
ad = {isEmpty=True; s=[]} ;
compl = \\_ => [] ;
vtype = verb.vtype ;
} ;
slashV : Verb -> Preposition -> VPSlash = \verb,prep -> {
s = verb.s ;
ad = {isEmpty=True; s=[]} ;
compl1 = \\_ => [] ;
compl2 = \\_ => [] ;
vtype = verb.vtype ;
c2 = prep ;
} ;
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
s = vp.s ;
ad = vp.ad ;
compl = \\a => vp.compl ! a ++ obj ! a ;
vtype = vp.vtype
} ;
insertSlashObj1 : (Agr => Str) -> VPSlash -> VPSlash = \obj,slash -> {
s = slash.s ;
ad = slash.ad ;
compl1 = \\a => slash.compl1 ! a ++ obj ! a ;
compl2 = slash.compl2 ;
vtype = slash.vtype ;
c2 = slash.c2
} ;
insertSlashObj2 : (Agr => Str) -> VPSlash -> VPSlash = \obj,slash -> {
s = slash.s ;
ad = slash.ad ;
compl1 = slash.compl1 ;
compl2 = \\a => slash.compl2 ! a ++ obj ! a ;
vtype = slash.vtype ;
c2 = slash.c2
} ;
auxBe : VTable =
table {
VPres Sg P1 => "ñúì" ;
VPres Sg P2 => "ñè" ;
VPres Sg P3 => "å" ;
VPres Pl P1 => "ñìå" ;
VPres Pl P2 => "ñòå" ;
VPres Pl P3 => "ñà" ;
VAorist Sg P1 => "áÿõ" ;
VAorist Sg _ => "áåøå" ;
VAorist Pl P1 => "áÿõìå" ;
VAorist Pl P2 => "áÿõòå" ;
VAorist Pl P3 => "áÿõà" ;
VImperfect Sg P1 => "áÿõ" ;
VImperfect Sg _ => "áåøå" ;
VImperfect Pl P1 => "áÿõìå" ;
VImperfect Pl P2 => "áÿõòå" ;
VImperfect Pl P3 => "áÿõà" ;
VPerfect aform => regAdjective "áèë" ! aform ;
VPluPerfect aform => regAdjective "áèë" ! aform ;
VPassive aform => regAdjective "áúäåí" ! aform ;
VPresPart aform => regAdjective "áúäåù" ! aform ;
VImperative Sg => "áúäè" ;
VImperative Pl => "áúäåòå" ;
VGerund => "áèäåéêè"
} ;
auxWould : VTable =
table {
VPres Sg P1 => "áúäà" ;
VPres Sg P2 => "áúäåø" ;
VPres Sg P3 => "áúäå" ;
VPres Pl P1 => "áúäåì" ;
VPres Pl P2 => "áúäåòå" ;
VPres Pl P3 => "áúäàò" ;
VAorist Sg P1 => "áèõ" ;
VAorist Sg _ => "áè" ;
VAorist Pl P1 => "áèõìå" ;
VAorist Pl P2 => "áèõòå" ;
VAorist Pl P3 => "áèõà" ;
VImperfect Sg P1 => "áúäåõ" ;
VImperfect Sg _ => "áúäåøå" ;
VImperfect Pl P1 => "áúäåõìå" ;
VImperfect Pl P2 => "áúäåõòå" ;
VImperfect Pl P3 => "áúäåõà" ;
VPerfect aform => regAdjective "áèë" ! aform ;
VPluPerfect aform => regAdjective "áúäåë" ! aform ;
VPassive aform => regAdjective "áúäåí" ! aform ;
VPresPart aform => regAdjective "áúäåù" ! aform ;
VImperative Sg => "áúäè" ;
VImperative Pl => "áúäåòå" ;
VGerund => "áúäåéêè"
} ;
verbBe : Verb = {s=\\_=>auxBe ; vtype=VNormal} ;
verbWould : Verb = {s=\\_=>auxWould ; vtype=VNormal} ;
reflClitics : Case => Str = table {Acc => "ñå"; Dat => "ñè"} ;
personalClitics : Case => GenNum => Person => Str =
table {
Acc => table {
GSg g => table {
P1 => "ìå" ;
P2 => "òå" ;
P3 => case g of {
Masc => "ãî" ;
Fem => "ÿ" ;
Neut => "ãî"
}
} ;
GPl => table {
P1 => "íè" ;
P2 => "âè" ;
P3 => "ãè"
}
} ;
Dat => table {
GSg g => table {
P1 => "ìè" ;
P2 => "òè" ;
P3 => case g of {
Masc => "ìó" ;
Fem => "é" ;
Neut => "ìó"
}
} ;
GPl => table {
P1 => "íè" ;
P2 => "âè" ;
P3 => "èì"
}
}
} ;
ia2e : Str -> Str = -- to be used when the next syllable has vowel different from "à","ú","î" or "ó"
\s -> case s of {
x@(_*+_) + "ÿ" + y@(("á"|"â"|"ã"|"ä"|"æ"|"ç"|"ê"|"ë"|"ì"|"í"|"ï"|"ð"|"ñ"|"ò"|"ô"|"õ"|"ö"|"÷"|"ø"|"ù")*)
=> x+"e"+y;
_ => s
};
regAdjective : Str -> AForm => Str =
\base ->
let base0 : Str
= case base of {
x+"è" => x;
x => x
}
in table {
ASg Masc Indef => base ;
ASg Masc Def => (base0+"èÿ") ;
ASgMascDefNom => (base0+"èÿò") ;
ASg Fem Indef => (base0+"a") ;
ASg Fem Def => (base0+"àòà") ;
ASg Neut Indef => (base0+"î") ;
ASg Neut Def => (base0+"îòî") ;
APl Indef => (ia2e base0+"è") ;
APl Def => (ia2e base0+"èòå")
};
-- For $Sentence$.
Clause : Type = {
s : Tense => Anteriority => Polarity => Order => Str
} ;
mkClause : Str -> Agr -> VP -> Clause =
\subj,agr,vp -> {
s = \\t,a,p,o =>
let
verb : Bool => Str
= \\q => vpTenses vp ! t ! a ! p ! agr ! q ! Perf ;
compl = vp.compl ! agr
in case o of {
Main => subj ++ verb ! False ++ compl ;
Inv => verb ! False ++ compl ++ subj ;
Quest => subj ++ verb ! True ++ compl
}
} ;
vpTenses : VP -> Tense => Anteriority => Polarity => Agr => Bool => Aspect => Str =
\verb -> \\t,a,p,agr,q0,asp =>
let clitic = case verb.vtype of {
VNormal => {s=[]; agr=agr} ;
VMedial c => {s=reflClitics ! c; agr=agr} ;
VPhrasal c => {s=personalClitics ! c ! agr.gn ! agr.p; agr={gn=GSg Neut; p=P3}}
} ;
present = verb.s ! asp ! (VPres (numGenNum clitic.agr.gn) clitic.agr.p) ;
presentImperf = verb.s ! Imperf ! (VPres (numGenNum clitic.agr.gn) clitic.agr.p) ;
aorist = verb.s ! asp ! (VAorist (numGenNum clitic.agr.gn) clitic.agr.p) ;
perfect = verb.s ! asp ! (VPerfect (aform clitic.agr.gn Indef (RObj Acc))) ;
auxPres = auxBe ! VPres (numGenNum clitic.agr.gn) clitic.agr.p ;
auxAorist = auxBe ! VAorist (numGenNum clitic.agr.gn) clitic.agr.p ;
auxCond = auxWould ! VAorist (numGenNum clitic.agr.gn) clitic.agr.p ;
apc : Str -> Str = \s ->
case <numGenNum clitic.agr.gn, clitic.agr.p> of {
<Sg, P3> => clitic.s++auxPres++s ;
_ => auxPres++s++clitic.s
} ;
li0 = case <verb.ad.isEmpty,q0> of {<False,True> => "ëè"; _ => []} ;
q = case verb.ad.isEmpty of {True => q0; False => False} ;
li = case q of {True => "ëè"; _ => []} ;
vf1 : Str -> {s1 : Str; s2 : Str} = \s ->
case p of {
Pos => case q of {True => {s1=[]; s2="ëè"++apc []};
False => {s1=apc []; s2=[]}} ;
Neg => {s1="íå"++apc li; s2=[]}
} ;
vf2 : Str -> {s1 : Str; s2 : Str} = \s ->
case p of {
Pos => case q of {True => {s1=[]; s2="ëè"++s};
False => {s1=s; s2=[]}} ;
Neg => case verb.vtype of
{VNormal => {s1="íå"; s2=li} ;
_ => {s1="íå"++s++li; s2=[]}}
} ;
vf3 : Str -> {s1 : Str; s2 : Str} = \s ->
case p of {
Pos => {s1="ùå"++s; s2=li} ;
Neg => {s1="íÿìà"++li++"äà"++s; s2=[]}
} ;
vf4 : Str -> {s1 : Str; s2 : Str} = \s ->
case p of {
Pos => {s1= s++li++clitic.s; s2=[]} ;
Neg => {s1="íå"++s++li++clitic.s; s2=[]}
} ;
verbs : {aux:{s1:Str; s2:Str}; main:Str} =
case <t,a> of {
<Pres,Simul> => {aux=vf2 clitic.s; main=presentImperf} ;
<Pres,Anter> => {aux=vf1 clitic.s; main=perfect} ;
<Past,Simul> => {aux=vf2 clitic.s; main=aorist} ;
<Past,Anter> => {aux=vf4 auxAorist; main=perfect} ;
<Fut, Simul> => {aux=vf3 clitic.s; main=present} ;
<Fut, Anter> => {aux=vf3 (apc []); main=perfect} ;
<Cond,_ > => {aux=vf4 auxCond ; main=perfect}
}
in verb.ad.s ++ li0 ++ verbs.aux.s1 ++ verbs.main ++ verbs.aux.s2 ;
daComplex : VP -> Aspect => Agr => Str =
\vp -> \\asp,agr =>
let clitic = case vp.vtype of {
VNormal => {s=[]; agr=agr} ;
VMedial c => {s=reflClitics ! c; agr=agr} ;
VPhrasal c => {s=personalClitics ! c ! agr.gn ! agr.p; agr={gn=GSg Neut; p=P3}}
}
in vp.ad.s ++ "äà" ++ clitic.s ++ vp.s ! asp ! VPres (numGenNum clitic.agr.gn) clitic.agr.p ++ vp.compl ! agr ;
-- For $Numeral$.
mkDigit : Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} =
\dva, dvama, dve, vtori, dvesta ->
{s = table {
unit => mkCardOrd dva dvama dve vtori ;
teen => mkCardOrd (dva+"íàäåñåò") (dva+"íàäåñåòèìà") (dva+"íàäåñåò") (dva+"íàäåñåòè") ;
ten => mkCardOrd (dva+"äåñåò") (dva+"äåñåòèìà") (dva+"äåñåò") (dva+"äåñåòè") ;
hundred => let dvesten : Str
= case dvesta of {
dvest+"à" => dvest+"åí" ;
chetiristot+"èí" => chetiristot+"åí"
}
in mkCardOrd dvesta dvesta dvesta dvesten
}
} ;
mkCardOrd : Str -> Str -> Str -> Str -> CardOrd => Str =
\dva, dvama, dve, vtori ->
table {
NCard dg => digitGenderSpecies dva dvama dve ! dg ;
NOrd aform => let vtora = init vtori + "à" ;
vtoro = init vtori + "î"
in case aform of {
ASg Masc Indef => vtori ;
ASg Masc Def => vtori+"ÿ" ;
ASgMascDefNom => vtori+"ÿò" ;
ASg Fem Indef => vtora ;
ASg Fem Def => vtora+"òà" ;
ASg Neut Indef => vtoro ;
ASg Neut Def => vtoro+"òî" ;
APl Indef => vtori ;
APl Def => vtori+"òå"
}
} ;
digitGenderSpecies : Str -> Str -> Str -> DGenderSpecies => Str =
\dva, dvama, dve
-> let addDef : Str -> Str =
\s -> case s of {
dves+"òà" => dves+"òàòå" ;
dv+"à" => dv+"àòà" ;
x => x+"òå"
}
in table {
DMascIndef => dva ;
DMascDef => addDef dva ;
DMascDefNom => addDef dva ;
DMascPersonalIndef => dvama ;
DMascPersonalDef => addDef dvama ;
DMascPersonalDefNom => addDef dvama ;
DFemIndef => dve ;
DFemDef => addDef dve ;
DNeutIndef => dve ;
DNeutDef => addDef dve
} ;
mkIP : Str -> Str -> GenNum -> {s : Role => QForm => Str ; gn : GenNum} =
\koi,kogo,gn -> {
s = table {
RSubj => table QForm [koi; koi+"òî"] ;
RObj Acc => table QForm [kogo; kogo+"òî"] ;
RObj Dat => table QForm ["íà" ++ kogo; kogo+"òî"] ;
RVoc => table QForm [koi; koi+"òî"]
} ;
gn = gn
} ;
mkPron : (az,men,mi,moj,moia,moiat,moia_,moiata,moe,moeto,moi,moite : Str) -> GenNum -> Person -> {s : Role => Str; gen : AForm => Str; a : Agr} =
\az,men,mi,moj,moia,moiat,moia_,moiata,moe,moeto,moi,moite,gn,p -> {
s = table {
RSubj => az ;
RObj Acc => men ;
RObj Dat => mi ;
RVoc => az
} ;
gen = table {
ASg Masc Indef => moj ;
ASg Masc Def => moia ;
ASgMascDefNom => moiat ;
ASg Fem Indef => moia_ ;
ASg Fem Def => moiata ;
ASg Neut Indef => moe ;
ASg Neut Def => moeto ;
APl Indef => moi ;
APl Def => moite
} ;
a = {
gn = gn ;
p = p
}
} ;
mkNP : Str -> GenNum -> Person -> {s : Role => Str; a : Agr} =
\s,gn,p -> {
s = table {
RSubj => s ;
RObj Acc => s ;
RObj Dat => "íà" ++ s ;
RVoc => s
} ;
a = {
gn = gn ;
p = p
}
} ;
Preposition : Type = {s : Str; c : Case};
mkQuestion :
{s : QForm => Str} -> Clause ->
{s : Tense => Anteriority => Polarity => QForm => Str} = \wh,cl ->
{
s = \\t,a,p,qform =>
let cls = cl.s ! t ! a ! p ;
in wh.s ! qform ++ cls ! case qform of {
QDir => Inv ;
QIndir => Main
}
} ;
whichRP : GenNum => Str
= table {
GSg Masc => "êîéòî" ;
GSg Fem => "êîÿòî" ;
GSg Neut => "êîåòî" ;
GPl => "êîèòî"
} ;
suchRP : GenNum => Str
= table {
GSg Masc => "òàêúâ" ;
GSg Fem => "òàêàâà" ;
GSg Neut => "òàêîâà" ;
GPl => "òàêèâà"
} ;
thisRP : GenNum => Str
= table {
GSg Masc => "òîçè" ;
GSg Fem => "òaçè" ;
GSg Neut => "òîâà" ;
GPl => "òåçè"
} ;
linCoord : Bool => Str ;
linCoord = table {True => "è"; False=>"èëè"} ;
linCoordSep : Str -> Bool => Bool => Str ;
linCoordSep s = table {True => linCoord; False=> \\_ => s} ;
}

View File

@@ -0,0 +1,72 @@
concrete SentenceBul of Sentence = CatBul ** open Prelude, ResBul in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
PredVP np vp = mkClause (np.s ! (case vp.vtype of {
VNormal => RSubj ;
VMedial _ => RSubj ;
VPhrasal c => RObj c})) np.a vp ;
PredSCVP sc vp = mkClause sc.s {gn=GSg Masc; p=P3} vp ;
ImpVP vp = {
s = \\p,gn =>
let agr = {gn = gn ; p = P2} ;
verb = vp.s ! Perf ! VImperative (numGenNum gn) ;
compl = vp.compl ! agr ;
clitic = case vp.vtype of {
VNormal => [] ;
VMedial c => reflClitics ! c ;
VPhrasal c => personalClitics ! c ! agr.gn ! agr.p
} ;
in case p of {Pos => vp.ad.s ++ verb ++ clitic ;
Neg => "íå" ++ vp.ad.s ++ clitic ++ verb} ++ compl ;
} ;
SlashVP np slash = {
s = \\agr => (mkClause (np.s ! RSubj) np.a {s = slash.s ;
ad = slash.ad ;
compl = \\_ => slash.compl1 ! np.a ++ slash.compl2 ! agr ;
vtype = slash.vtype}).s ;
c2 = slash.c2
} ;
AdvSlash slash adv = {
s = \\agr,t,a,b,o => slash.s ! agr ! t ! a ! b ! o ++ adv.s ;
c2 = slash.c2
} ;
SlashPrep cl prep = {s = \\_ => cl.s; c2 = prep} ;
SlashVS np vs slash = {
s = \\agr => (mkClause (np.s ! RSubj) np.a
(insertObj (\\_ => "֌" ++ slash.s ! agr) (predV vs))).s ;
c2 = slash.c2
} ;
EmbedS s = {s = "," ++ "֌" ++ s.s} ;
EmbedQS qs = {s = qs.s ! QIndir} ;
EmbedVP vp = {s = daComplex vp ! Perf ! {gn=GSg Masc; p=P1}} ;
UseCl t p cl = {
s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! Main
} ;
UseQCl t p cl = {
s = \\q => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! q
} ;
UseRCl t p cl = {
s = \\agr => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! agr ;
role = cl.role
} ;
UseSlash t p cl = {
s = \\agr => t.s ++ p.s ++ cl.s ! agr ! t.t ! t.a ! p.p ! Main ;
c2 = cl.c2
} ;
AdvS a s = {s = a.s ++ "," ++ s.s} ;
RelS s r = {s = s.s ++ "," ++ r.s ! {gn=gennum DNeut Sg; p=P3}} ;
}

View File

@@ -0,0 +1,122 @@
concrete StructuralBul of Structural = CatBul **
open MorphoBul, ParadigmsBul, Prelude in {
flags coding=cp1251 ;
flags optimize=all ;
lin
above_Prep = mkPrep "íàä" Acc ;
after_Prep = mkPrep "ñëåä" Acc ;
all_Predet = {s = table GenNum ["âñè÷êèÿ";"âñè÷êàòà";"âñè÷êîòî";"âñè÷êèòå"]} ;
almost_AdA, almost_AdN = ss "ïî÷òè" ;
although_Subj = ss ["âúïðåêè ÷å"] ;
always_AdV = ss "âèíàãè" ;
and_Conj = {s=[]; conj=True; distr=False; n = Pl} ;
because_Subj = ss "çàùîòî" ;
before_Prep = mkPrep "ïðåäè" Acc ;
behind_Prep = mkPrep "çàä" Acc ;
between_Prep = mkPrep "ìåæäó" Acc ;
both7and_DConj = {s=[]; conj=True; distr=True; n = Pl} ;
but_PConj = ss "íî" ;
by8agent_Prep = mkPrep "÷ðåç" Acc ;
by8means_Prep = mkPrep "÷ðåç" Acc ;
can8know_VV, can_VV = mkVV (stateV (mkV166 "ìîãà")) ;
during_Prep = mkPrep ["ïî âðåìå íà"] Acc ;
either7or_DConj = {s=[]; conj=False; distr=True; n = Sg} ;
everybody_NP = mkNP "âñåêè" (GSg Masc) P3 ;
every_Det = mkDeterminerSg "âñåêè" "âñÿêà" "âñÿêî";
everything_NP = mkNP "âñè÷êî" (GSg Neut) P3 ;
everywhere_Adv = ss "íàâñÿêúäå" ;
few_Det = {s = \\_,_,_ => "íÿêîëêî"; n = Pl; countable = True; spec = Indef} ;
--- first_Ord = ss "first" ; DEPRECATED
for_Prep = mkPrep "çà" Acc ;
from_Prep = mkPrep "îò" Acc ;
he_Pron = mkPron "òîé" "íåãî" "ìó" "íåãîâ" "íåãîâèÿ" "íåãîâèÿò" "íåãîâà" "íåãîâàòà" "íåãîâî" "íåãîâîòî" "íåãîâè" "íåãîâèòå" (GSg Masc) P3 ;
here_Adv = ss "òóê" ;
here7to_Adv = ss ["äî òóê"] ;
here7from_Adv = ss ["îò òóê"] ;
how_IAdv = mkIAdv "êàê" ;
how8many_IDet = {s = \\_ => table QForm ["êîëêî";"êîëêîòî"]; n = Pl; nonEmpty = False} ;
if_Subj = ss "àêî" ;
in8front_Prep = mkPrep "ïðåä" Acc ;
i_Pron = mkPron "àç" "ìåí" "ìè" "ìîé" "ìîÿ" "ìîÿò" "ìîÿ" "ìîÿòà" "ìîå" "ìîåòî" "ìîè" "ìîèòå" (GSg Masc) P1 ;
in_Prep = mkPrep (pre { "â" ;
"âúâ" / strs {"â" ; "ô" ; "Â" ; "Ô"}
}) Acc ;
it_Pron = mkPron "òî" "íåãî" "ìó" "íåãîâ" "íåãîâèÿ" "íåãîâèÿò" "íåãîâà" "íåãîâàòà" "íåãîâî" "íåãîâîòî" "íåãîâè" "íåãîâèòå" (GSg Neut) P3 ;
less_CAdv = {s="íå"; sn="ïî-ìàëêî"} ;
many_Det = mkDeterminerPl "ìíîãî" ;
more_CAdv = {s=[]; sn="ïîâå÷å"} ;
most_Predet = {s = \\_ => "ïîâå÷åòî"} ;
much_Det = mkDeterminerSg "ìíîãî" "ìíîãî" "ìíîãî";
must_VV =
mkVV {
s = \\_=>table {
VPres _ _ => "òðÿáâà" ;
VAorist _ _ => "òðÿáâàøå" ;
VImperfect _ _ => "òðÿáâàëî" ;
VPerfect _ => "òðÿáâàëî" ;
VPluPerfect _ => "òðÿáâàëî" ;
VPassive _ => "òðÿáâàëî" ;
VPresPart _ => "òðÿáâàëî" ;
VImperative Sg => "òðÿáâàé" ;
VImperative Pl => "òðÿáâàéòå" ;
VGerund => "òðÿáâàéêè"
} ;
vtype=VNormal ;
lock_V=<>
} ;
no_Utt = ss "íå" ;
on_Prep = mkPrep "íà" Acc ;
---- one_Quant = mkDeterminer Sg "one" ; -- DEPRECATED
only_Predet = {s = \\_ => "ñàìî"} ;
or_Conj = {s=[]; conj=False; distr=False; n = Sg} ;
otherwise_PConj = ss "èíà÷å" ;
part_Prep = mkPrep "îò" Acc ;
please_Voc = ss "ìîëÿ" ;
possess_Prep = mkPrep [] Dat ;
quite_Adv = ss "äîñòà" ;
she_Pron = mkPron "òÿ" "íåÿ" "è" "íåèí" "íåéíèÿ" "íåéíèÿò" "íåéíà" "íåéíàòà" "íåéíî" "íåéíîòî" "íåéíè" "íåéíèòå" (GSg Fem) P3 ;
so_AdA = ss "òîëêîâà" ;
somebody_NP = mkNP "íÿêîé" (GSg Masc) P3 ;
someSg_Det = mkDeterminerSg "íÿêîé" "íÿêîÿ" "íÿêîå" ;
somePl_Det = mkDeterminerPl "íÿêîè" ;
something_NP = mkNP "íåùî" (GSg Neut) P3 ;
somewhere_Adv = ss "íÿêúäå" ;
that_Quant = mkQuant "îíçè" "îíàçè" "îíîâà" "îíåçè" ;
there_Adv = ss "òàì" ;
there7to_Adv = ss ["äî òàì"] ;
there7from_Adv = ss ["îò òàì"] ;
therefore_PConj = ss ["òàêà ÷å"] ;
they_Pron = mkPron "òå" "òÿõ" "èì" "òåõåí" "òåõíèÿ" "òåõíèÿò" "òÿõíà" "òÿõíàòà" "òÿõíî" "òÿõíîòî" "òåõíè" "òåõíèòå" GPl P3 ;
this_Quant = mkQuant "òîçè" "òàçè" "òîâà" "òåçè" ;
through_Prep = mkPrep "ïðåç" Acc ;
too_AdA = ss "ïðåêàëåíî" ;
to_Prep = mkPrep "äî" Acc ;
under_Prep = mkPrep "ïîä" Acc ;
very_AdA = ss "ìíîãî" ;
want_VV = mkVV (stateV (mkV186 "èñêàì")) ;
we_Pron = mkPron "íèå" "íàñ" "íè" "íàø" "íàøèÿ" "íàøèÿò" "íàøà" "íàøàòà" "íàøå" "íàøåòî" "íàøè" "íàøèòå" GPl P1 ;
whatPl_IP = mkIP "êàêâè" "êàêâè" GPl ;
whatSg_IP = mkIP "êàêúâ" "êàêúâ" (GSg Masc) ;
when_IAdv = mkIAdv "êîãà" ;
when_Subj = ss "êîãàòî" ;
where_IAdv = mkIAdv "êúäå" ;
which_IQuant = {s = table GenNum [table QForm ["êîé";"êîéòî"];
table QForm ["êîÿ";"êîÿòî"];
table QForm ["êîå";"êîåòî"];
table QForm ["êîè";"êîèòî"]]} ;
whoSg_IP = mkIP "êîé" "êîãî" (GSg Masc) ;
whoPl_IP = mkIP "êîè" "êîè" GPl ;
why_IAdv = mkIAdv "çàùî" ;
without_Prep = mkPrep "áåç" Acc ;
with_Prep = mkPrep (pre { "ñ" ;
"ñúñ" / strs {"ñ" ; "ç" ; "Ñ" ; "Ç"}
}) Acc ;
yes_Utt = ss "äà" ;
youSg_Pron = mkPron "òè" "òåá" "òè" "òâîé" "òâîÿ" "òâîÿò" "òâîÿ" "òâîÿòà" "òâîå" "òâîåòî" "òâîè" "òâîèòå" (GSg Masc) P2 ;
youPl_Pron = mkPron "âèå" "âàñ" "âè" "âàø" "âàøèÿ" "âàøèÿò" "âàøà" "âàøàòà" "âàøå" "âàøåòî" "âàøè" "âàøèòå" GPl P2 ;
youPol_Pron = mkPron "âèå" "âàñ" "âè" "âàø" "âàøèÿ" "âàøèÿò" "âàøà" "âàøàòà" "âàøå" "âàøåòî" "âàøè" "âàøèòå" GPl P2 ;
}

View File

@@ -0,0 +1,13 @@
concrete TextBul of Text = CatBul ** {
flags coding=cp1251 ;
-- This will work for almost all languages except Spanish.
lin
TEmpty = {s = []} ;
TFullStop x xs = {s = x.s ++ "." ++ xs.s} ;
TQuestMark x xs = {s = x.s ++ "?" ++ xs.s} ;
TExclMark x xs = {s = x.s ++ "!" ++ xs.s} ;
}

View File

@@ -0,0 +1,92 @@
concrete VerbBul of Verb = CatBul ** open Prelude, ResBul, ParadigmsBul in {
flags coding=cp1251 ;
flags optimize=all_subs ;
lin
UseV = predV ;
SlashV2a v = slashV v v.c2 ;
Slash2V3 v np =
insertSlashObj1 (\\_ => v.c2.s ++ np.s ! RObj v.c2.c) (slashV v v.c3) ;
Slash3V3 v np =
insertSlashObj2 (\\_ => v.c3.s ++ np.s ! RObj v.c3.c) (slashV v v.c2) ;
ComplVV vv vp =
insertObj (daComplex vp ! Perf) (predV vv) ;
ComplVS v s = insertObj (\\_ => "," ++ "֌" ++ s.s) (predV v) ;
ComplVQ v q = insertObj (\\_ => q.s ! QDir) (predV v) ;
ComplVA v ap =
insertObj (\\agr => ap.s ! aform agr.gn Indef (RObj Acc)) (predV v) ;
SlashV2A v ap =
insertSlashObj2 (\\a => ap.s ! aform a.gn Indef (RObj Acc)) (slashV v v.c2) ;
-- test: I saw a boy to whom she said that they are here
SlashV2S v s = insertSlashObj2 (\\_ => "," ++ "֌" ++ s.s) (slashV v v.c2) ;
-- test: I saw a boy whom she asked who is here
SlashV2Q v q = insertSlashObj2 (\\_ => q.s ! QDir) (slashV v v.c2) ;
-- test: I saw a boy whom she begged to walk
SlashV2V vv vp =
insertSlashObj2 (daComplex vp ! Perf) (slashV vv vv.c2) ;
-- test: I saw a car whom she wanted to buy
SlashVV vv slash = {
s = vv.s ;
ad = {isEmpty=True; s=[]};
compl1 = daComplex {s=slash.s; ad=slash.ad; compl=slash.compl1; vtype=slash.vtype} ! Perf ;
compl2 = slash.compl2 ;
vtype = vv.vtype ;
c2 = slash.c2
} ;
-- test: I saw a car whom she begged me to buy
SlashV2VNP vv np slash = {
s = vv.s ;
ad = {isEmpty=True; s=[]};
compl1 = \\agr => vv.c2.s ++ np.s ! RObj vv.c2.c ++
daComplex {s=slash.s; ad=slash.ad; compl=slash.compl1; vtype=slash.vtype} ! Perf ! np.a ;
compl2 = slash.compl2 ;
vtype = vv.vtype ;
c2 = slash.c2
} ;
ComplSlash slash np = {
s = slash.s ;
ad = slash.ad ;
compl = \\a => slash.compl1 ! a ++ slash.c2.s ++ np.s ! RObj slash.c2.c ++ slash.compl2 ! np.a ;
vtype = slash.vtype
} ;
UseComp comp = insertObj comp.s (predV verbBe) ;
AdvVP vp adv = insertObj (\\_ => adv.s) vp ;
AdVVP adv vp = {
s = vp.s ;
ad = {isEmpty=False; s=vp.ad.s ++ adv.s} ;
compl = vp.compl ;
vtype = vp.vtype
} ;
ReflVP slash = {
s = slash.s ;
ad = slash.ad ;
compl = \\agr => slash.compl1 ! agr ++ slash.compl2 ! agr ;
vtype = VMedial slash.c2.c ;
} ;
PassV2 v = insertObj (\\a => v.s ! Perf ! VPassive (aform a.gn Indef (RObj Acc))) (predV verbBe) ;
CompAP ap = {s = \\agr => ap.s ! aform agr.gn Indef (RObj Acc)} ;
CompNP np = {s = \\_ => np.s ! RObj Acc} ;
CompAdv a = {s = \\_ => a.s} ;
}