1
0
forked from GitHub/gf-core

Add and pass all Foods languages, except Jpn

This commit is contained in:
John J. Camilleri
2021-02-16 22:41:28 +01:00
parent 312cfeb69d
commit d5cf00f711
28 changed files with 1861 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
--# -coding=latin1
resource CharactersGla = {
--Character classes
oper
vowel : pattern Str = #("a"|"e"|"i"|"o"|"u"|"à"|"è"|"ì"|"ò"|"ù") ;
vowelCap : pattern Str = #("A"|"E"|"I"|"O"|"U"|"À"|"É"|"Ì"|"Ò"|"Ù") ;
consonant : pattern Str = #("b"|"c"|"d"|"f"|"g"|"h"|"j"|"k"|"l"|"m"|"n"|"p"|"q"|"r"|"s"|"t"|"v"|"w"|"x"|"z") ;
consonantCap : pattern Str = #("B"|"C"|"D"|"F"|"G"|"H"|"J"|"K"|"L"|"M"|"N"|"P"|"Q"|"R"|"S"|"T"|"V"|"W"|"X"|"Z") ;
broadVowel : pattern Str = #("a"|"o"|"u"|"à"|"ò"|"ù") ;
slenderVowel : pattern Str = #("e"|"i"|"è"|"ì") ;
}

View File

@@ -0,0 +1,13 @@
--# -coding=latin1
resource CharactersGle = {
--Character classes
oper
vowel : pattern Str = #("a"|"e"|"i"|"o"|"u"|"á"|"é"|"í"|"ó"|"ú") ;
vowelCap : pattern Str = #("A"|"E"|"I"|"O"|"U"|"Á"|"É"|"Í"|"Ó"|"Ú") ;
consonant : pattern Str = #("b"|"c"|"d"|"f"|"g"|"h"|"j"|"k"|"l"|"m"|"n"|"p"|"q"|"r"|"s"|"t"|"v"|"w"|"x"|"z") ;
consonantCap : pattern Str = #("B"|"C"|"D"|"F"|"G"|"H"|"J"|"K"|"L"|"M"|"N"|"P"|"Q"|"R"|"S"|"T"|"V"|"W"|"X"|"Z") ;
broadVowel : pattern Str = #("a"|"o"|"u"|"á"|"ó"|"ú") ;
slenderVowel : pattern Str = #("e"|"i"|"é"|"í") ;
}

View File

@@ -7,11 +7,32 @@ FoodsChi: 那 瓶 酒 是 美 味 的
FoodsCze: tamto víno je vynikající
FoodsDut: die wijn is lekker
FoodsEng: that wine is delicious
FoodsEpo: tiu vino estas bongusta
FoodsFin: tuo viini on herkullinen
FoodsFre: ce vin est délicieux
FoodsGer: jener Wein ist köstlich
FoodsGla: tha an fìon sin blasta
FoodsGle: tá an fíon sin blasta
FoodsHeb: היין ההוא טעים
FoodsHin: वह मदिरा स्वादिष्ट है
FoodsIce: þetta vín er ljúffengt
FoodsIta: quel vino è delizioso
FoodsLat: id vinum est iucundum
FoodsLav: tas vīns ir garšīgs
FoodsMkd: она вино е вкусно
FoodsMlt: dak l- inbid tajjeb
FoodsMon: тэр дарс бол амттай
FoodsNep: त्यो रक्सी स्वादिष्ट छ
FoodsOri: ସେଇ ମଦ ସ୍ଵାଦିସ୍ଟ ଅଟେ
FoodsPes: آن شراب لذىذ است
FoodsPor: esse vinho é delicioso
FoodsRon: acel vin este delicios
FoodsSpa: ese vino es delicioso
FoodsSwe: det där vinet är läckert
FoodsTha: เหล้าองุ่น ขวด นั้น อร่อย
FoodsTsn: bojalwa boo bo monate
FoodsTur: şu şarap lezzetlidir
FoodsUrd: وہ شراب مزیدار ہے
Foods: Pred (This Pizza) (Very Boring)
FoodsAfr: hierdie pizza is baie vervelig
@@ -22,11 +43,32 @@ FoodsChi: 这 张 比 萨 饼 是 非 常 难 吃 的
FoodsCze: tato pizza je velmi nudná
FoodsDut: deze pizza is erg saai
FoodsEng: this pizza is very boring
FoodsEpo: ĉi tiu pico estas tre enuiga
FoodsFin: tämä pizza on erittäin tylsä
FoodsFre: cette pizza est très ennuyeuse
FoodsGer: diese Pizza ist sehr langweilig
FoodsGla: tha an pizza seo glè leamh
FoodsGle: tá an píotsa seo an-leamh
FoodsHeb: הפיצה הזאת מאוד משעממת
FoodsHin: यह पिज़्ज़ा अति अरुचिकर है
FoodsIce: þessi flatbaka er mjög leiðinleg
FoodsIta: questa pizza è molto noiosa
FoodsLat: haec placenta neapolitana est valde fluens
FoodsLav: šī pica ir ļoti garlaicīga
FoodsMkd: оваа пица е многу досадна
FoodsMlt: din il- pizza tad-dwejjaq ħafna
FoodsMon: энэ пицца бол маш амтгүй
FoodsNep: यो पिज्जा धेरै नमिठा छ
FoodsOri: ଏଇ ପିଜଜ଼ା ଅତି ଅରୁଚିକର ଅଟେ
FoodsPes: این پیتزا خیلی ملال آور است
FoodsPor: esta pizza é muito chata
FoodsRon: această pizza este foarte plictisitoare
FoodsSpa: esta pizza es muy aburrida
FoodsSwe: den här pizzan är mycket tråkig
FoodsTha: พิซซา ถาด นี้ น่าเบิ่อ มาก
FoodsTsn: pizza e e bosula thata
FoodsTur: bu pizza çok sıkıcıdır
FoodsUrd: یھ پیزہ بہت فضول ہے
Foods: Pred (This Cheese) Fresh
FoodsAfr: hierdie kaas is vars
@@ -37,11 +79,32 @@ FoodsChi: 这 块 奶 酪 是 新 鲜 的
FoodsCze: tento sýr je čerstvý
FoodsDut: deze kaas is vers
FoodsEng: this cheese is fresh
FoodsEpo: ĉi tiu fromaĝo estas freŝa
FoodsFin: tämä juusto on tuore
FoodsFre: ce fromage est frais
FoodsGer: dieser Käse ist frisch
FoodsGla: tha an càise seo úr
FoodsGle: tá an cháis seo úr
FoodsHeb: הגבינה הזאת טריה
FoodsHin: यह पनीर ताज़ा है
FoodsIce: þessi ostur er ferskur
FoodsIta: questo formaggio è fresco
FoodsLat: hoc formaticum est recens
FoodsLav: šis siers ir svaigs
FoodsMkd: ова сирење е свежо
FoodsMlt: dan il- ġobon frisk
FoodsMon: энэ бяслаг бол шинэ
FoodsNep: यो चिज ताजा छ
FoodsOri: ଏଇ ଛେନା ତାଜା ଅଟେ
FoodsPes: این پنیر تازه است
FoodsPor: este queijo é fresco
FoodsRon: această brânză este proaspătă
FoodsSpa: este queso es fresco
FoodsSwe: den här osten är färsk
FoodsTha: เนยแข็ง ก้อน นี้ สด
FoodsTsn: kase e e ntsha
FoodsTur: bu peynir tazedir
FoodsUrd: یھ پنیر تازہ ہے
Foods: Pred (Those Fish) Warm
FoodsAfr: daardie visse is warm
@@ -52,11 +115,32 @@ FoodsChi: 那 几 条 鱼 是 温 热 的
FoodsCze: tamty ryby jsou teplé
FoodsDut: die vissen zijn warm
FoodsEng: those fish are warm
FoodsEpo: tiuj fiŝoj estas varmaj
FoodsFin: nuo kalat ovat lämpimiä
FoodsFre: ces poissons sont chauds
FoodsGer: jene Fische sind warm
FoodsGla: tha na h-èisg sin blàth
FoodsGle: tá na héisc sin te
FoodsHeb: הדגים ההם חמים
FoodsHin: वे मछलीयँा गरम हैं
FoodsIce: þessir fiskar eru heitir
FoodsIta: quei pesci sono caldi
FoodsLat: ei pisces sunt calidi
FoodsLav: tās zivis ir siltas
FoodsMkd: оние риби се топли
FoodsMlt: dawk il- ħut sħan
FoodsMon: тэдгээр загаснууд бол халуун
FoodsNep: ती माछाहरु तातो छन्
FoodsOri: ସେଇ ମାଛ ଗୁଡିକ ଗରମ ଅଟେ
FoodsPes: آن ماهىها گرم هستند
FoodsPor: esses peixes são quentes
FoodsRon: acei peşti sunt calzi
FoodsSpa: esos pescados son calientes
FoodsSwe: de där fiskarna är varma
FoodsTha: ปลา ตัว นั้น อุ่น
FoodsTsn: dithlapi tseo di bothitho
FoodsTur: şu balıklar ılıktır
FoodsUrd: وہ مچھلیاں گرم ہیں
Foods: Pred (That (Mod Boring (Mod Italian Pizza))) Expensive
FoodsAfr: daardie vervelige Italiaanse pizza is duur
@@ -67,9 +151,30 @@ FoodsChi: 那 张 又 难 吃 又 意 大 利 式 的 比 萨 饼 是 昂 贵
FoodsCze: tamta nudná italská pizza je drahá
FoodsDut: die saaie Italiaanse pizza is duur
FoodsEng: that boring Italian pizza is expensive
FoodsEpo: tiu enuiga itala pico estas altekosta
FoodsFin: tuo tylsä italialainen pizza on kallis
FoodsFre: cette pizza italienne ennuyeuse est chère
FoodsGer: jene langweilige italienische Pizza ist teuer
FoodsGla: tha an pizza Eadailteach leamh sin daor
FoodsGle: tá an píotsa Iodálach leamh sin daor
FoodsHeb: הפיצה האיטלקית המשעממת ההיא יקרה
FoodsHin: वह अरुचिकर इटली पिज़्ज़ा बहुमूल्य है
FoodsIce: þessi leiðinlega ítalska flatbaka er dýr
FoodsIta: quella pizza italiana noiosa è cara
FoodsLat: ea placenta itala fluens neapolitana est pretiosa
FoodsLav: tā garlaicīgā itāļu pica ir dārga
FoodsMkd: онаа досадна италијанска пица е скапа
FoodsMlt: dik il- pizza Taljana tad-dwejjaq għalja
FoodsMon: тэр амтгүй итали пицца бол үнэтэй
FoodsNep: त्यो नमिठा इटालियन पिज्जा महँगो छ
FoodsOri: ସେଇ ଅରୁଚିକର ଇଟାଲି ପିଜଜ଼ା ମୁଲ୍ୟବାନ୍ ଅଟେ
FoodsPes: آن پیتزا ایتالیایی ى ملال آور گران است
FoodsPor: essa pizza Italiana chata é cara
FoodsRon: acea pizza italiană plictisitoare este scumpă
FoodsSpa: esa pizza italiana aburrida es cara
FoodsSwe: den där tråkiga italienska pizzan är dyr
FoodsTha: พิซซา อิตาลี น่าเบิ่อ ถาด นั้น แพง
FoodsTsn: pizza eo ya ga Itali le e e bosula e a tura
FoodsTur: şu sıkıcı İtalyan pizzası pahalıdır
FoodsUrd: وہ فضول اٹا لوی پیزہ مہنگا ہے

View File

@@ -0,0 +1,48 @@
-- (c) 2009 Julia Hammar under LGPL
concrete FoodsEpo of Foods = open Prelude in {
flags coding =utf8 ;
lincat
Comment = SS ;
Kind, Quality = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ;
This = det Sg "ĉi tiu" ;
That = det Sg "tiu" ;
These = det Pl "ĉi tiuj" ;
Those = det Pl "tiuj" ;
Mod quality kind = {s = \\n => quality.s ! n ++ kind.s ! n} ;
Wine = regNoun "vino" ;
Cheese = regNoun "fromaĝo" ;
Fish = regNoun "fiŝo" ;
Pizza = regNoun "pico" ;
Very quality = {s = \\n => "tre" ++ quality.s ! n} ;
Fresh = regAdj "freŝa" ;
Warm = regAdj "varma" ;
Italian = regAdj "itala" ;
Expensive = regAdj "altekosta" ;
Delicious = regAdj "bongusta" ;
Boring = regAdj "enuiga" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =
\n,d,cn -> {
s = d ++ cn.s ! n ;
n = n
} ;
regNoun : Str -> {s : Number => Str} =
\vino -> {s = table {Sg => vino ; Pl => vino + "j"}
} ;
regAdj : Str -> {s : Number => Str} =
\nova -> {s = table {Sg => nova ; Pl => nova + "j"}
} ;
copula : Number => Str = \\_ => "estas" ;
}

View File

@@ -0,0 +1,67 @@
--# -coding=latin1
concrete FoodsGla of Foods = open MutationsGla, CharactersGla, Prelude in {
param Gender = Masc|Fem ;
param Number = Sg|Pl ;
param Breadth = Broad|Slender|NoBreadth ;
param Beginning = Bcgmp|Other ;
lincat Comment = Str;
lin Pred item quality = "tha" ++ item ++ quality.s!Sg!Unmutated ;
lincat Item = Str;
lin
This kind = (addArticleSg kind) ++ "seo" ;
That kind = (addArticleSg kind) ++ "sin";
These kind = (addArticlePl kind) ++ "seo" ;
Those kind = (addArticlePl kind) ++ "sin" ;
oper addArticleSg : {s : Number => Mutation => Str; g : Gender} -> Str =
\kind -> case kind.g of { Masc => "an" ++ kind.s!Sg!PrefixT; Fem => "a'" ++ kind.s!Sg!Lenition1DNTLS } ;
oper addArticlePl : {s : Number => Mutation => Str; g : Gender} -> Str =
\kind -> "na" ++ kind.s!Pl!PrefixH ;
oper Noun : Type = {s : Number => Mutation => Str; g : Gender; pe : Breadth; beginning: Beginning; };
lincat Kind = Noun;
lin
Mod quality kind = {
s = table{
Sg => table{mutation => kind.s!Sg!mutation ++ case kind.g of {Masc => quality.s!Sg!Unmutated; Fem => quality.s!Sg!Lenition1} };
Pl => table{mutation => kind.s!Pl!mutation ++ case kind.pe of {Slender => quality.s!Pl!Lenition1; _ => quality.s!Pl!Unmutated} }
};
g = kind.g;
pe = kind.pe;
beginning = kind.beginning
} ;
Wine = makeNoun "fìon" "fìontan" Masc ;
Cheese = makeNoun "càise" "càisean" Masc ;
Fish = makeNoun "iasg" "èisg" Masc ;
Pizza = makeNoun "pizza" "pizzathan" Masc ;
oper makeNoun : Str -> Str -> Gender -> Noun = \sg,pl,g -> {
s = table{Sg => (mutate sg); Pl => (mutate pl)};
g = g;
pe = pe;
beginning = Bcgmp
}
where {
pe : Breadth = case pl of {
_ + v@(#broadVowel) + c@(#consonant*) + #consonant => Broad;
_ + v@(#slenderVowel) + c@(#consonant*) + #consonant => Slender;
_ => NoBreadth
}
};
oper Adjective : Type = {s : Number => Mutation => Str; sVery : Number => Str};
lincat Quality = Adjective;
lin
Very quality = {s=table{number => table{_ => quality.sVery!number}}; sVery=quality.sVery } ;
Fresh = makeAdjective "úr" "ùra" ;
Warm = makeAdjective "blàth" "blàtha" ;
Italian = makeAdjective "Eadailteach" "Eadailteach" ;
Expensive = makeAdjective "daor" "daora" ;
Delicious = makeAdjective "blasta" "blasta" ;
Boring = makeAdjective "leamh" "leamha" ;
oper makeAdjective : Str -> Str -> Adjective =
\sg,pl -> {
s=table{Sg => (mutate sg); Pl => (mutate pl)};
sVery=table{Sg => "glè"++(lenition1dntls sg); Pl => "glè"++(lenition1dntls pl)}
} ;
}

View File

@@ -0,0 +1,60 @@
--# -coding=latin1
concrete FoodsGle of Foods = open MutationsGle, CharactersGle in {
param Gender = Masc|Fem ;
param Number = Sg|Pl ;
param Breadth = Broad|Slender|NoBreadth ;
lincat Comment = Str;
lin Pred item quality = "tá" ++ item ++ quality.s!Sg!Unmutated ;
lincat Item = Str;
lin
This kind = (addArticleSg kind) ++ "seo" ;
That kind = (addArticleSg kind) ++ "sin";
These kind = (addArticlePl kind) ++ "seo" ;
Those kind = (addArticlePl kind) ++ "sin" ;
oper addArticleSg : {s : Number => Mutation => Str; g : Gender} -> Str =
\kind -> "an" ++ case kind.g of { Masc => kind.s!Sg!PrefixT; Fem => kind.s!Sg!Lenition1DNTLS } ;
oper addArticlePl : {s : Number => Mutation => Str; g : Gender} -> Str =
\kind -> "na" ++ kind.s!Pl!PrefixH ;
lincat Kind = {s : Number => Mutation => Str; g : Gender; pe : Breadth} ;
lin
Mod quality kind = {
s = table{
Sg => table{mutation => kind.s!Sg!mutation ++ case kind.g of {Masc => quality.s!Sg!Unmutated; Fem => quality.s!Sg!Lenition1} };
Pl => table{mutation => kind.s!Pl!mutation ++ case kind.pe of {Slender => quality.s!Pl!Lenition1; _ => quality.s!Pl!Unmutated} }
};
g = kind.g;
pe = kind.pe
} ;
Wine = makeNoun "fíon" "fíonta" Masc ;
Cheese = makeNoun "cáis" "cáiseanna" Fem ;
Fish = makeNoun "iasc" "éisc" Masc ;
Pizza = makeNoun "píotsa" "píotsaí" Masc ;
oper makeNoun : Str -> Str -> Gender -> {s : Number => Mutation => Str; g : Gender; pe : Breadth} =
\sg,pl,g -> {
s = table{Sg => (mutate sg); Pl => (mutate pl)};
g = g;
pe = case pl of {
_ + v@(#broadVowel) + c@(#consonant*) + #consonant => Broad;
_ + v@(#slenderVowel) + c@(#consonant*) + #consonant => Slender;
_ => NoBreadth
}
} ;
lincat Quality = {s : Number => Mutation => Str; sVery : Number => Str} ;
lin
Very quality = {s=table{number => table{_ => quality.sVery!number}}; sVery=quality.sVery } ;
Fresh = makeAdjective "úr" "úra" ;
Warm = makeAdjective "te" "te" ;
Italian = makeAdjective "Iodálach" "Iodálacha" ;
Expensive = makeAdjective "daor" "daora" ;
Delicious = makeAdjective "blasta" "blasta" ;
Boring = makeAdjective "leamh" "leamha" ;
oper makeAdjective : Str -> Str -> {s : Number => Mutation => Str; sVery : Number => Str} =
\sg,pl -> {
s=table{Sg => (mutate sg); Pl => (mutate pl)};
sVery=table{Sg => "an-"+(lenition1dntls sg); Pl => "an-"+(lenition1dntls pl)}
} ;
}

View File

@@ -0,0 +1,75 @@
-- (c) 2010 Vikash Rauniyar under LGPL
concrete FoodsHin of Foods = {
flags coding=utf8 ;
param
Gender = Masc | Fem ;
Number = Sg | Pl ;
lincat
Comment = {s : Str} ;
Item = {s : Str ; g : Gender ; n : Number} ;
Kind = {s : Number => Str ; g : Gender} ;
Quality = {s : Gender => Number => Str} ;
lin
Pred item quality = {
s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n
} ;
This kind = {s = "यह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
That kind = {s = "वह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
These kind = {s = "ये" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Those kind = {s = "वे" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Mod quality kind = {
s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;
g = kind.g
} ;
Wine = regN "मदिरा" ;
Cheese = regN "पनीर" ;
Fish = regN "मछली" ;
Pizza = regN "पिज़्ज़ा" ;
Very quality = {s = \\g,n => "अति" ++ quality.s ! g ! n} ;
Fresh = regAdj "ताज़ा" ;
Warm = regAdj "गरम" ;
Italian = regAdj "इटली" ;
Expensive = regAdj "बहुमूल्य" ;
Delicious = regAdj "स्वादिष्ट" ;
Boring = regAdj "अरुचिकर" ;
oper
mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\s,p,g -> {
s = table {
Sg => s ;
Pl => p
} ;
g = g
} ;
regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of {
lark + "ा" => mkN s (lark + "े") Masc ;
lark + "ी" => mkN s (lark + "ीयँा") Fem ;
_ => mkN s s Masc
} ;
mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> {
s = table {
Masc => table {
Sg => ms ;
Pl => mp
} ;
Fem => \\_ => f
}
} ;
regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of {
acch + "ा" => mkAdj a (acch + "े") (acch + "ी") ;
_ => mkAdj a a a
} ;
copula : Number -> Str = \n -> case n of {
Sg => "है" ;
Pl => "हैं"
} ;
}

View File

@@ -0,0 +1,83 @@
-- (c) 2009 Martha Dis Brandt under LGPL
concrete FoodsIce of Foods = open Prelude in {
flags coding=utf8;
lincat
Comment = SS ;
Quality = {s : Gender => Number => Defin => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number} ;
lin
Pred item quality = ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ;
This, That = det Sg "þessi" "þessi" "þetta" ;
These, Those = det Pl "þessir" "þessar" "þessi" ;
Mod quality kind = { s = \\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;
Wine = noun "vín" "vín" Neutr ;
Cheese = noun "ostur" "ostar" Masc ;
Fish = noun "fiskur" "fiskar" Masc ;
-- the word "pizza" is more commonly used in Iceland, but "flatbaka" is the Icelandic word for it
Pizza = noun "flatbaka" "flatbökur" Fem ;
Very qual = {s = \\g,n,defOrInd => "mjög" ++ qual.s ! g ! n ! defOrInd } ;
Fresh = regAdj "ferskur" ;
Warm = regAdj "heitur" ;
Boring = regAdj "leiðinlegur" ;
-- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef
Italian = adjective "ítalskur" "ítölsk" "ítalskt" "ítalskir" "ítalskar" "ítölsk" "ítalski" "ítalska" "ítalsku" ;
Expensive = adjective "dýr" "dýr" "dýrt" "dýrir" "dýrar" "dýr" "dýri" "dýra" "dýru" ;
Delicious = adjective "ljúffengur" "ljúffeng" "ljúffengt" "ljúffengir" "ljúffengar" "ljúffeng" "ljúffengi" "ljúffenga" "ljúffengu" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem | Neutr ;
Defin = Ind | Def ;
oper
det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} ->
{s : Str ; g : Gender ; n : Number} =
\n,masc,fem,neutr,cn -> {
s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ;
g = cn.g ;
n = n
} ;
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\man,men,g -> {
s = table {
Sg => man ;
Pl => men
} ;
g = g
} ;
adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} =
\ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> {
s = \\g,n,t => case <g,n,t> of {
< Masc, Sg, Ind > => ferskur ;
< Masc, Pl, Ind > => ferskir ;
< Fem, Sg, Ind > => fersk ;
< Fem, Pl, Ind > => ferskar ;
< Neutr, Sg, Ind > => ferskt ;
< Neutr, Pl, Ind > => fersk_pl;
< Masc, Sg, Def > => ferski ;
< Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ;
< _ , Pl, Def > => fersku
}
} ;
regAdj : Str -> {s : Gender => Number => Defin => Str} = \ferskur ->
let fersk = Predef.tk 2 ferskur
in adjective
ferskur fersk (fersk + "t")
(fersk + "ir") (fersk + "ar") fersk
(fersk + "i") (fersk + "a") (fersk + "u") ;
copula : Number -> Str =
\n -> case n of {
Sg => "er" ;
Pl => "eru"
} ;
}

View File

@@ -0,0 +1,7 @@
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsIta of Foods = FoodsI with
(Syntax = SyntaxIta),
(LexFoods = LexFoodsIta) ;

View File

@@ -0,0 +1,76 @@
--# -path=.:present
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsLat of Foods = LexFoodsLat **
{
lincat
Comment = { s : Str } ;
Item = { number : Number ; gender : Gender; noun : Str; adj : Str; det : Str };
lin
Mod quality kind =
variants {
{
gender = kind.gender ;
noun = table { number => kind.noun ! number ++ quality.s ! number ! kind.gender } ;
adj = kind.adj
} ;
{
gender = kind.gender ;
noun = kind.noun ;
adj = table { number => kind.adj ! number ++ quality.s ! number ! kind.gender }
} ;
{
gender = kind.gender ;
noun = table { number => quality.s ! number ! kind.gender ++ kind.noun ! number } ;
adj = kind.adj
} ;
{
gender = kind.gender ;
noun = kind.noun ;
adj = table { number => quality.s ! number ! kind.gender ++ kind.adj ! number }
}
};
Pred item quality =
let aux : Number => Str =
table { Sg => "est" ; Pl => "sunt" } ;
in
{
s = variants {
item.det ++ item.noun ++ item.adj ++ aux ! item.number ++ quality.s ! item.number ! item.gender ;
item.det ++ item.adj ++ item.noun ++ aux ! item.number ++ quality.s ! item.number ! item.gender ;
item.det ++ item.noun ++ item.adj ++ quality.s ! item.number ! item.gender ++ aux ! item.number ;
item.det ++ item.adj ++ item.noun ++ quality.s ! item.number ! item.gender ++ aux ! item.number
};
};
This kind = {
number = Sg ;
gender = kind.gender ;
noun = kind.noun ! Sg ;
adj = kind.adj ! Sg ;
det = table { Male => "hic" ; Female => "haec" ; Neuter => "hoc" } ! kind.gender
} ;
These kind = {
number = Pl ;
gender = kind.gender ;
noun = kind.noun ! Pl ;
adj = kind.adj ! Pl ;
det = table { Male => "hi" ; Female => "hae" ; Neuter => "haec" } ! kind.gender
} ;
That kind = {
number = Sg ;
gender = kind.gender ;
noun = kind.noun ! Sg ;
adj = kind.adj ! Sg ;
det = table { Male => "is" ; Female => "ea" ; Neuter => "id" } ! kind.gender
} ;
Those kind = {
number = Pl ;
gender = kind.gender ;
noun = kind.noun ! Pl ;
adj = kind.adj ! Pl ;
det = table { Male => variants { "ei "; "ii" } ; Female => "eae" ; Neuter => "ea" } ! kind.gender
} ;
Very quality = { s = \\n,g => "valde" ++ quality.s ! n ! g };
}

View File

@@ -0,0 +1,90 @@
-- (c) 2009 Inese Bernsone under LGPL
concrete FoodsLav of Foods = open Prelude in {
flags
coding=utf8 ;
lincat
Comment = SS ;
Quality = {s : Q => Gender => Number => Defin => Str } ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number } ;
lin
Pred item quality = ss (item.s ++ {- copula item.n -} "ir" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ;
This = det Sg "šis" "šī" ;
That = det Sg "tas" "tā" ;
These = det Pl "šie" "šīs" ;
Those = det Pl "tie" "tās" ;
Mod quality kind = {s = \\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;
Wine = noun "vīns" "vīni" Masc ;
Cheese = noun "siers" "sieri" Masc ;
Fish = noun "zivs" "zivis" Fem ;
Pizza = noun "pica" "picas" Fem ;
Very qual = {s = \\q,g,n,spec => "ļoti" ++ qual.s ! Q2 ! g ! n ! spec };
Fresh = adjective "svaigs" "svaiga" "svaigi" "svaigas" "svaigais" "svaigā" "svaigie" "svaigās" ;
Warm = regAdj "silts" ;
Italian = specAdj "itāļu" (regAdj "itālisks") ;
Expensive = regAdj "dārgs" ;
Delicious = regAdj "garšīgs" ;
Boring = regAdj "garlaicīgs" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
Defin = Ind | Def ;
Q = Q1 | Q2 ;
oper
det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} ->
{s : Str ; g : Gender ; n : Number} =
\n,m,f,cn -> {
s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ;
g = cn.g ;
n = n
} ;
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\man,men,g -> {
s = table {
Sg => man ;
Pl => men
} ;
g = g
} ;
adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} =
\skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> {
s = table {
_ => table {
Masc => table {
Sg => table {Ind => skaists ; Def => skaistais} ;
Pl => table {Ind => skaisti ; Def => skaistie}
} ;
Fem => table {
Sg => table {Ind => skaista ; Def => skaistaa} ;
Pl => table {Ind => skaistas ; Def => skaistaas}
}
}
}
} ;
{- irregAdj : Str -> {s : Gender => Number => Defin => Str} = \itaalju ->
let itaalju = itaalju
in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -}
regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \skaists ->
let skaist = init skaists
in adjective skaists (skaist + "a") (skaist + "i") (skaist + "as") (skaist + "ais") (skaist + "ā") (skaist + "ie") (skaist + "ās");
Adjective : Type = {s : Q => Gender => Number => Defin => Str} ;
specAdj : Str -> Adjective -> Adjective = \s,a -> {
s = table {
Q2 => a.s ! Q1 ;
Q1 => \\_,_,_ => s
}
} ;
}

120
testsuite/lpgf/FoodsMkd.gf Normal file
View File

@@ -0,0 +1,120 @@
-- (c) 2009 Krasimir Angelov under LGPL
concrete FoodsMkd of Foods = {
flags coding = utf8 ;
lincat
Comment = Str;
Quality = {s : Agr => Str};
Item = {s : Str; a : Agr};
Kind = {s : Number => Str; g : Gender};
lin
Pred item qual =
item.s ++
case item.a of {
ASg _ => "е";
APl => "се"
} ++
qual.s ! item.a;
This kind = {
s = case kind.g of {
Masc => "овоj";
Fem => "оваа";
Neutr => "ова"
} ++
kind.s ! Sg;
a = ASg kind.g};
That kind = {
s = case kind.g of {
Masc => "оноj";
Fem => "онаа";
Neutr => "она"
} ++
kind.s ! Sg;
a = ASg kind.g};
These kind = {s = "овие" ++ kind.s ! Pl; a = APl};
Those kind = {s = "оние" ++ kind.s ! Pl; a = APl};
Mod qual kind = {
s = \\n => qual.s ! case n of {
Sg => ASg kind.g;
Pl => APl
} ++
kind.s ! n;
g = kind.g};
Wine = {
s = table {
Sg => "вино";
Pl => "вина"
};
g = Neutr};
Cheese = {
s = table {
Sg => "сирење";
Pl => "сирењa"
};
g = Neutr};
Fish = {
s = table {
Sg => "риба";
Pl => "риби"
};
g = Fem};
Pizza = {
s = table {
Sg => "пица";
Pl => "пици"
};
g = Fem
};
Very qual = {s = \\g => "многу" ++ qual.s ! g};
Fresh = {
s = table {
ASg Masc => "свеж";
ASg Fem => "свежа";
ASg Neutr => "свежо";
APl => "свежи"}
};
Warm = {
s = table {
ASg Masc => "топол";
ASg Fem => "топла";
ASg Neutr => "топло";
APl => "топли"}
};
Italian = {
s = table {
ASg Masc => "италијански";
ASg Fem => "италијанска";
ASg Neutr => "италијанско";
APl => "италијански"}
};
Expensive = {
s = table {
ASg Masc => "скап";
ASg Fem => "скапа";
ASg Neutr => "скапо";
APl => "скапи"}
};
Delicious = {
s = table {
ASg Masc => "вкусен";
ASg Fem => "вкусна";
ASg Neutr => "вкусно";
APl => "вкусни"}
};
Boring = {
s = table {
ASg Masc => "досаден";
ASg Fem => "досадна";
ASg Neutr => "досадно";
APl => "досадни"}
};
param
Gender = Masc | Fem | Neutr;
Number = Sg | Pl;
Agr = ASg Gender | APl;
}

105
testsuite/lpgf/FoodsMlt.gf Normal file
View File

@@ -0,0 +1,105 @@
-- (c) 2013 John J. Camilleri under LGPL
concrete FoodsMlt of Foods = open Prelude in {
flags coding=utf8 ;
lincat
Comment = SS ;
Quality = {s : Gender => Number => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number} ;
lin
-- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ;
Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ;
This kind = det Sg "dan" "din" kind ;
That kind = det Sg "dak" "dik" kind ;
These kind = det Pl "dawn" "" kind ;
Those kind = det Pl "dawk" "" kind ;
Mod quality kind = {
s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ;
g = kind.g
} ;
Wine = noun "inbid" "inbejjed" Masc ;
Cheese = noun "ġobon" "ġobniet" Masc ;
Fish = noun "ħuta" "ħut" Fem ;
Pizza = noun "pizza" "pizzez" Fem ;
Very qual = {s = \\g,n => qual.s ! g ! n ++ "ħafna"} ;
Warm = adjective "sħun" "sħuna" "sħan" ;
Expensive = adjective "għali" "għalja" "għaljin" ;
Delicious = adjective "tajjeb" "tajba" "tajbin" ;
Boring = uniAdj "tad-dwejjaq" ;
Fresh = regAdj "frisk" ;
Italian = regAdj "Taljan" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
--Create an adjective (full function)
--Params: Sing Masc, Sing Fem, Plural
adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \iswed,sewda,suwed -> {
s = table {
Masc => table {
Sg => iswed ;
Pl => suwed
} ;
Fem => table {
Sg => sewda ;
Pl => suwed
}
}
} ;
--Create a regular adjective
--Param: Sing Masc
regAdj : Str -> {s : Gender => Number => Str} = \frisk ->
adjective frisk (frisk + "a") (frisk + "i") ;
--Create a "uni-adjective" eg tal-buzz
--Param: Sing Masc
uniAdj : Str -> {s : Gender => Number => Str} = \uni ->
adjective uni uni uni ;
--Create a noun
--Params: Singular, Plural, Gender (inherent)
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \ktieb,kotba,g -> {
s = table {
Sg => ktieb ;
Pl => kotba
} ;
g = g
} ;
--Copula is a linking verb
--Params: Number, Gender
-- copula : Number -> Gender -> Str = \n,g -> case n of {
-- Sg => case g of { Masc => "huwa" ; Fem => "hija" } ;
-- Pl => "huma"
-- } ;
--Create an article, taking into account first letter of next word
article = pre {
"a"|"e"|"i"|"o"|"u" => "l-" ;
--cons@("ċ"|"d"|"n"|"r"|"s"|"t"|"x"|"ż") => "i" + cons + "-" ;
_ => "il-"
} ;
--Create a determinant
--Params: Sg/Pl, Masc, Fem
det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> {
s = case n of {
Sg => case cn.g of {Masc => m ; Fem => f}; --string
Pl => m --default to masc
} ++ article ++ cn.s ! n ;
g = cn.g ; --gender
n = n --number
} ;
}

View File

@@ -0,0 +1,48 @@
-- (c) 2009 Nyamsuren Erdenebadrakh under LGPL
concrete FoodsMon of Foods = open Prelude in {
flags coding=utf8;
lincat
Comment, Quality = SS ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality = ss (item.s ++ "бол" ++ quality.s) ;
This = det Sg "энэ" ;
That = det Sg "тэр" ;
These = det Pl "эдгээр" ;
Those = det Pl "тэдгээр" ;
Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ;
Wine = regNoun "дарс" ;
Cheese = regNoun "бяслаг" ;
Fish = regNoun "загас" ;
Pizza = regNoun "пицца" ;
Very = prefixSS "маш" ;
Fresh = ss "шинэ" ;
Warm = ss "халуун" ;
Italian = ss "итали" ;
Expensive = ss "үнэтэй" ;
Delicious = ss "амттай" ;
Boring = ss "амтгүй" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =
\n,d,cn -> {
s = d ++ cn.s ! n ;
n = n
} ;
regNoun : Str -> {s : Number => Str} =
\x -> {s = table {
Sg => x ;
Pl => x + "нууд"}
} ;
}

View File

@@ -0,0 +1,60 @@
-- (c) 2011 Dinesh Simkhada under LGPL
concrete FoodsNep of Foods = {
flags coding = utf8 ;
lincat
Comment, Quality = {s : Str} ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality =
{s = item.s ++ quality.s ++ copula ! item.n} ;
This = det Sg "यो" ;
That = det Sg "त्यो" ;
These = det Pl "यी" ;
Those = det Pl "ती" ;
Mod quality kind =
{s = \\n => quality.s ++ kind.s ! n} ;
Wine = regNoun "रक्सी" ;
Cheese = regNoun "चिज" ;
Fish = regNoun "माछा" ;
Pizza = regNoun "पिज्जा" ;
Very a = {s = "धेरै" ++ a.s} ;
Fresh = adj "ताजा" ;
Warm = adj "तातो" ;
Italian = adj "इटालियन" ;
Expensive = adj "महँगो" | adj "बहुमूल्य" ;
Delicious = adj "स्वादिष्ट" | adj "मीठो" ;
Boring = adjPl "नमिठो" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str ->
{s : Number => Str} -> {s : Str ; n : Number} =
\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;
noun : Str -> Str -> {s : Number => Str} =
\man,men -> {s = table {Sg => man ; Pl => men}} ;
regNoun : Str -> {s : Number => Str} =
\car -> noun car (car + "हरु") ;
adjPl : Str -> {s : Str} = \a -> case a of {
bor + "ठो" => adj (bor + "ठा") ;
_ => adj a
} ;
adj : Str -> {s : Str} =
\cold -> {s = cold} ;
copula : Number => Str =
table {Sg => "छ" ; Pl => "छन्"} ;
}

View File

@@ -0,0 +1,30 @@
concrete FoodsOri of Foods = {
flags coding = utf8 ;
lincat
Comment = Str;
Item = Str;
Kind = Str;
Quality = Str;
lin
Pred item quality = item ++ quality ++ "ଅଟେ";
This kind = "ଏଇ" ++ kind;
That kind = "ସେଇ" ++ kind;
These kind = "ଏଇ" ++ kind ++ "ଗୁଡିକ" ;
Those kind = "ସେଇ" ++ kind ++ "ଗୁଡିକ" ;
Mod quality kind = quality ++ kind;
Wine = "ମଦ";
Cheese = "ଛେନା";
Fish = "ମାଛ";
Pizza = "ପିଜଜ଼ା" ;
Very quality = "ଅତି" ++ quality;
Fresh = "ତାଜା";
Warm = "ଗରମ";
Italian = "ଇଟାଲି";
Expensive = "ମୁଲ୍ୟବାନ୍";
Delicious = "ସ୍ଵାଦିସ୍ଟ ";
Boring = "ଅରୁଚିକର";
}

View File

@@ -0,0 +1,65 @@
concrete FoodsPes of Foods = {
flags optimize=noexpand ; coding=utf8 ;
lincat
Comment = {s : Str} ;
Quality = {s : Add => Str; prep : Str} ;
Kind = {s : Add => Number => Str ; prep : Str};
Item = {s : Str ; n : Number};
lin
Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ;
This = det Sg "این" ;
That = det Sg "آن" ;
These = det Pl "این" ;
Those = det Pl "آن" ;
Mod quality kind = {s = \\a,n => kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ;
prep = quality.prep
};
Wine = regN "شراب" ;
Cheese = regN "پنیر" ;
Fish = regN "ماهى" ;
Pizza = regN "پیتزا" ;
Very a = {s = \\at => "خیلی" ++ a.s ! at ; prep = a.prep} ;
Fresh = adj "تازه" ;
Warm = adj "گرم" ;
Italian = adj "ایتالیایی" ;
Expensive = adj "گران" ;
Delicious = adj "لذىذ" ;
Boring = adj "ملال آور" ; -- it must be written as ملال آور.
param
Number = Sg | Pl ;
Add = Indep | Attr ;
oper
det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} =
\n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n };
noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \pytzA, pytzAy, pytzAhA,pr ->
{s = \\a,n => case <a,n> of
{<Indep,Sg> => pytzA ; <Indep,Pl> => pytzAhA ;
<Attr,Sg> =>pytzA ; <Attr,Pl> => pytzAhA + "ى" };
prep = pr
};
regN : Str -> {s: Add => Number => Str ; prep : Str} = \mrd ->
case mrd of
{ _ + ("ا"|"ه"|"ى"|"و"|"") => noun mrd (mrd+"ى") (mrd + "ها") "";
_ => noun mrd mrd (mrd + "ها") "e"
};
adj : Str -> {s : Add => Str; prep : Str} = \tAzh ->
case tAzh of
{ _ + ("ا"|"ه"|"ى"|"و"|"") => mkAdj tAzh (tAzh ++ "ى") "" ;
_ => mkAdj tAzh tAzh "ه"
};
mkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \tAzh, tAzhy, pr ->
{s = table {Indep => tAzh;
Attr => tAzhy};
prep = pr
};
copula : Number => Str = table {Sg => "است"; Pl => "هستند"};
}

View File

@@ -0,0 +1,78 @@
-- (c) 2009 Rami Shashati under LGPL
--# -coding=latin1
concrete FoodsPor of Foods = open Prelude in {
lincat
Comment = {s : Str} ;
Quality = {s : Gender => Number => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; n : Number ; g : Gender } ;
lin
Pred item quality =
{s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ;
This = det Sg (table {Masc => "este" ; Fem => "esta"}) ;
That = det Sg (table {Masc => "esse" ; Fem => "essa"}) ;
These = det Pl (table {Masc => "estes" ; Fem => "estas"}) ;
Those = det Pl (table {Masc => "esses" ; Fem => "essas"}) ;
Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ;
Wine = regNoun "vinho" Masc ;
Cheese = regNoun "queijo" Masc ;
Fish = regNoun "peixe" Masc ;
Pizza = regNoun "pizza" Fem ;
Very a = { s = \\g,n => "muito" ++ a.s ! g ! n } ;
Fresh = mkAdjReg "fresco" ;
Warm = mkAdjReg "quente" ;
Italian = mkAdjReg "Italiano" ;
Expensive = mkAdjReg "caro" ;
Delicious = mkAdjReg "delicioso" ;
Boring = mkAdjReg "chato" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
QualityT : Type = {s : Gender => Number => Str} ;
mkAdj : (_,_,_,_ : Str) -> QualityT = \bonito,bonita,bonitos,bonitas -> {
s = table {
Masc => table { Sg => bonito ; Pl => bonitos } ;
Fem => table { Sg => bonita ; Pl => bonitas }
} ;
} ;
-- regular pattern
adjSozinho : Str -> QualityT = \sozinho ->
let sozinh = Predef.tk 1 sozinho
in mkAdj sozinho (sozinh + "a") (sozinh + "os") (sozinh + "as") ;
-- for gender-independent adjectives
adjUtil : Str -> Str -> QualityT = \util,uteis ->
mkAdj util util uteis uteis ;
-- smart paradigm for adjcetives
mkAdjReg : Str -> QualityT = \a -> case last a of {
"o" => adjSozinho a ;
"e" => adjUtil a (a + "s")
} ;
ItemT : Type = {s : Str ; n : Number ; g : Gender } ;
det : Number -> (Gender => Str) -> KindT -> ItemT =
\num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ;
KindT : Type = {s : Number => Str ; g : Gender} ;
noun : Str -> Str -> Gender -> KindT =
\animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ;
regNoun : Str -> Gender -> KindT =
\carro,gen -> noun carro (carro + "s") gen ;
copula : Number => Str = table {Sg => "é" ; Pl => "são"} ;
}

View File

@@ -0,0 +1,72 @@
-- (c) 2009 Ramona Enache under LGPL
concrete FoodsRon of Foods =
{
flags coding=utf8 ;
param Number = Sg | Pl ;
Gender = Masc | Fem ;
NGender = NMasc | NFem | NNeut ;
lincat
Comment = {s : Str};
Quality = {s : Number => Gender => Str};
Kind = {s : Number => Str; g : NGender};
Item = {s : Str ; n : Number; g : Gender};
lin
This = det Sg (mkTab "acest" "această");
That = det Sg (mkTab "acel" "acea");
These = det Pl (mkTab "acești" "aceste");
Those = det Pl (mkTab "acei" "acele");
Wine = mkNoun "vin" "vinuri" NNeut ;
Cheese = mkNoun "brânză" "brânzeturi" NFem ;
Fish = mkNoun "peşte" "peşti" NMasc ;
Pizza = mkNoun "pizza" "pizze" NFem;
Very a = {s = \\n,g => "foarte" ++ a.s ! n ! g};
Fresh = mkAdj "proaspăt" "proaspătă" "proaspeţi" "proaspete" ;
Warm = mkAdj "cald" "caldă" "calzi" "calde" ;
Italian = mkAdj "italian" "italiană" "italieni" "italiene" ;
Expensive = mkAdj "scump" "scumpă" "scumpi" "scumpe" ;
Delicious = mkAdj "delicios" "delcioasă" "delicioşi" "delicioase" ;
Boring = mkAdj "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ;
Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ;
Mod quality kind = {s = \\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g};
oper
mkTab : Str -> Str -> {s : Gender => Str} = \acesta, aceasta ->
{s = table{Masc => acesta;
Fem => aceasta}};
det : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} =
\n,det,noun -> let gg = getAgrGender noun.g n
in
{s = det.s ! gg ++ noun.s ! n ; n = n ; g = gg};
mkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \peste, pesti,g ->
{s = table {Sg => peste;
Pl => pesti};
g = g
};
oper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \scump, scumpa, scumpi, scumpe ->
{s = \\n,g => case <n,g> of
{<Sg,Masc> => scump ; <Sg,Fem> => scumpa;
<Pl,Masc> => scumpi ; <Pl,Fem> => scumpe
}};
copula : Number => Str = table {Sg => "este" ; Pl => "sunt"};
getAgrGender : NGender -> Number -> Gender = \ng,n ->
case <ng,n> of
{<NMasc,_> => Masc ; <NFem,_> => Fem;
<NNeut,Sg> => Masc ; <NNeut,Pl> => Fem
};
}

View File

@@ -0,0 +1,30 @@
concrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in {
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_QuantSg kind ;
That kind = mkNP that_QuantSg kind ;
These kind = mkNP these_QuantPl kind ;
Those kind = mkNP those_QuantPl kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN (mkN "vino") ;
Pizza = mkCN (mkN "pizza") ;
Cheese = mkCN (mkN "queso") ;
Fish = mkCN (mkN "pescado") ;
Fresh = mkAP (mkA "fresco") ;
Warm = mkAP (mkA "caliente") ;
Italian = mkAP (mkA "italiano") ;
Expensive = mkAP (mkA "caro") ;
Delicious = mkAP (mkA "delicioso") ;
Boring = mkAP (mkA "aburrido") ;
}

View File

@@ -0,0 +1,32 @@
concrete FoodsTha of Foods = open SyntaxTha, LexiconTha,
ParadigmsTha, (R=ResTha) in {
flags coding = utf8 ;
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_Det kind ;
That kind = mkNP that_Det kind ;
These kind = mkNP these_Det kind ;
Those kind = mkNP those_Det kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN (mkN (R.thword "เหล้าอ" "งุ่น") "ขวด") ;
Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ;
Cheese = mkCN (mkN (R.thword "เนย" "แข็ง") "ก้อน") ;
Fish = mkCN fish_N ;
Fresh = mkAP (mkA "สด") ;
Warm = mkAP warm_A ;
Italian = mkAP (mkA " อิตาลี") ;
Expensive = mkAP (mkA "แพง") ;
Delicious = mkAP (mkA "อร่อย") ;
Boring = mkAP (mkA (R.thword "น่า" "เบิ่อ")) ;
}

177
testsuite/lpgf/FoodsTsn.gf Normal file
View File

@@ -0,0 +1,177 @@
-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL
concrete FoodsTsn of Foods = open Prelude, Predef in {
flags coding = utf8;
lincat
Comment = {s:Str};
Item = {s:Str; c:NounClass; n:Number};
Kind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool};
Quality = {s: NounClass => Number => Str; p_form: Str; t: TType};
lin
Pred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form};
This kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};
That kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};
These kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};
Those kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};
Mod quality kind = mkMod quality kind;
-- Lexicon
Wine = mkNounNC14_6 "jalwa";
Cheese = mkNounNC9_10 "kase";
Fish = mkNounNC9_10 "thlapi";
Pizza = mkNounNC9_10 "pizza";
Very quality = smartVery quality;
Fresh = mkVarAdj "ntsha";
Warm = mkOrdAdj "bothitho";
Italian = mkPerAdj "Itali";
Expensive = mkVerbRel "tura";
Delicious = mkOrdAdj "monate";
Boring = mkOrdAdj "bosula";
param
NounClass = NC9_10 | NC14_6;
Number = Sg | Pl;
TType = P | V | ModV | R ;
oper
mkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str;
b: Bool} = \x,y -> case y.b of
{
True => {w = y.w; r = y.r; c = y.c;
q = table {
Sg => ((y.q ! Sg) ++ "le" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg));
Pl => ((y.q ! Pl) ++ "le" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl))
}; b = True
};
False => {w = y.w; r = y.r; c = y.c;
q = table {
Sg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg));
Pl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl))
}; b = True
}
};
mkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "bo" + x; Pl => "ma" + x}; r = x; c = NC14_6;
q = table {Sg => ""; Pl => ""}; b = False};
mkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "" + x; Pl => "di" + x}; r = x; c = NC9_10;
q = table {Sg => ""; Pl => ""}; b = False};
mkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "di" + x};
NC14_6 => table {Sg => "bo" + x; Pl => "ma" + x}
};
p_form = x;
t = R;
};
mkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "" + x};
NC14_6 => table {Sg => "" + x; Pl => "" + x}
};
p_form = x;
t = R;
};
mkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => x + "ng"; Pl => x + "ng"};
NC14_6 => table {Sg => x + "ng"; Pl => x + "ng"}
};
p_form = x;
t = V;
};
mkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "" + x};
NC14_6 => table {Sg => "" + x; Pl => "" + x}
};
p_form = "mo" ++ x;
t = P;
};
mkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = x.t
};
mkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = ModV
};
smartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} =
\x -> case x.t of --(x.s!c!n)
{
(V | ModV) => mkVeryVerb x;
--ModV => mkVeryVerb x;
_ => mkVeryAdj x
};
mkDemPron1 : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "tse"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkDemPron2 : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "eo"; Pl => "tseo"};
NC14_6 => table {Sg => "boo"; Pl => "ao"}
};
smartQualRelPart : TType -> (NounClass => Number => Str) = \x -> case x of
{
P => mkQualRelPart_PName;
_ => mkQualRelPart
};
mkQualRelPart : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "tse"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkQualRelPart_PName : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "ya"; Pl => "tsa"};
NC14_6 => table {Sg => "ba"; Pl => "a"}
};
smartDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of
{
P => mkDescrCop_PName;
_ => mkDescrCop
};
mkDescrCop : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "di"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkDescrCop_PName : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "ga"; Pl => "ga"};
NC14_6 => table {Sg => "ga"; Pl => "ga"}
};
mkPredDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of
{
V => table {NC9_10 => table {Sg => "e" ++ "a"; Pl => "di" ++ "a"};
NC14_6 => table {Sg => "bo" ++ "a"; Pl => "a" ++ "a"}};
_ => table {NC9_10 => table {Sg => "e"; Pl => "di"};
NC14_6 => table {Sg => "bo"; Pl => "a"}}
};
}

140
testsuite/lpgf/FoodsTur.gf Normal file
View File

@@ -0,0 +1,140 @@
{-
File : FoodsTur.gf
Author : Server Çimen
Version : 1.0
Created on: August 26, 2009
This file contains concrete grammar of Foods abstract grammar for Turkish Language.
This grammar is to be used for Fridge demo and developed in the scope of GF Resource
Grammar Summer School.
-}
concrete FoodsTur of Foods = open Predef in {
flags
coding=utf8 ;
lincat
Comment = {s : Str} ;
Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ;
Kind = {s : Case => Number => Str} ;
Item = {s : Str; n : Number} ;
lin
This = det Sg "bu" ;
That = det Sg "şu" ;
These = det Pl "bu" ;
Those = det Pl "şu" ;
-- Reason for excluding plural form of copula: In Turkish if subject is not a human being,
-- then singular form of copula is used regardless of the number of subject. Since all
-- possible subjects are non human, copula do not need to have plural form.
Pred item quality = {s = item.s ++ quality.s ++ BIND ++ copula ! quality.softness ! quality.h} ;--! item.n} ;
Mod quality kind = {s = case quality.c of {
Nom => \\t,n => quality.s ++ kind.s ! t ! n ;
Gen => \\t,n => quality.s ++ kind.s ! Gen ! n
}
} ;
Wine = mkN "şarap" "şaraplar" "şarabı" "şarapları" ;
Cheese = mkN "peynir" "peynirler" "peyniri" "peynirleri" ;
Fish = mkN "balık" "balıklar" "balığı" "balıkları" ;
Pizza = mkN "pizza" "pizzalar" "pizzası" "pizzaları" ;
Very a = {s = "çok" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ;
Fresh = adj "taze" Nom;
Warm = adj "ılık" Nom;
Italian = adj "İtalyan" Gen ;
Expensive = adj "pahalı" Nom;
Delicious = adj "lezzetli" Nom;
Boring = adj "sıkıcı" Nom;
param
Number = Sg | Pl ;
Case = Nom | Gen ;
Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü
Softness = Soft | Hard ;
oper
det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} =
\num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ;
mkN = overload {
mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ;
mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ;
} ;
regNoun : Str -> Str -> {s : Case => Number => Str} =
\peynir,peynirler -> noun peynir peynirler [] [] ;
noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} =
\sarap,saraplar,sarabi,saraplari -> {
s = table {
Nom => table {
Sg => sarap ;
Pl => saraplar
} ;
Gen => table {
Sg => sarabi ;
Pl => saraplari
}
}
};
{-
Since there is a bug in overloading, this overload is useless.
mkA = overload {
mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \base -> adj base Nom ;
mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ;
} ;
-}
adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} =
\italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ;
-- See the comment at lines 26 and 27 for excluded plural form of copula.
copula : Softness => Harmony {-=> Number-} => Str =
table {
Soft => table {
I_Har => "dır" ;--table {
-- Sg => "dır" ;
-- Pl => "dırlar"
--} ;
Ih_Har => "dir" ;--table {
--Sg => "dir" ;
--Pl => "dirler"
--} ;
U_Har => "dur" ;--table {
-- Sg => "dur" ;
-- Pl => "durlar"
--} ;
Uh_Har => "dür" --table {
--Sg => "dür" ;
--Pl => "dürler"
--}
} ;
Hard => table {
I_Har => "tır" ;--table {
--Sg => "tır" ;
--Pl => "tırlar"
--} ;
Ih_Har => "tir" ;--table {
--Sg => "tir" ;
--Pl => "tirler"
--} ;
U_Har => "tur" ;--table {
-- Sg => "tur" ;
-- Pl => "turlar"
--} ;
Uh_Har => "tür"--table {
--Sg => "tür" ;
--Pl => "türler"
--}
}
} ;
getHarmony : Str -> Harmony
= \base -> case base of {
_+c@("ı"|"a"|"i"|"e"|"u"|"o"|"ü"|"ö")+
("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h")* =>
case c of {
("ı"|"a") => I_Har ;
("i"|"e") => Ih_Har ;
("u"|"o") => U_Har ;
("ü"|"ö") => Uh_Har
}
} ;
getSoftness : Str -> Softness
= \base -> case base of {
_+("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") => Hard ;
_ => Soft
} ;
}

View File

@@ -0,0 +1,53 @@
-- (c) 2009 Shafqat Virk under LGPL
concrete FoodsUrd of Foods = {
flags coding=utf8 ;
param Number = Sg | Pl ;
param Gender = Masc | Fem;
oper coupla : Number -> Str =\n -> case n of {Sg => "ہے" ; Pl => "ہیں"};
lincat
Comment = {s : Str} ;
Item = {s: Str ; n: Number ; g:Gender};
Kind = {s: Number => Str ; g:Gender};
Quality = {s: Gender => Number => Str};
lin
Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++ coupla item.n} ;
This kind = {s = "یھ" ++ kind.s ! Sg; n= Sg ; g = kind.g } ;
These kind = {s = "یھ" ++ kind.s ! Pl; n = Pl ; g = kind.g} ;
That kind = {s = "وہ" ++ kind.s ! Sg; n= Sg ; g = kind.g} ;
Those kind = {s = "وہ" ++ kind.s ! Pl; n=Pl ; g = kind.g} ;
Mod quality kind = {s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g};
Wine = {s = table { Sg => "شراب" ; Pl => "شرابیں"} ; g = Fem};
Cheese = {s = table { Sg => "پنیر" ; Pl => "پنیریں"} ; g = Fem};
Fish = {s = table { Sg => "مچھلی" ; Pl => "مچھلیاں"} ; g = Fem};
Pizza = {s = table { Sg => "پیزہ" ; Pl => "پیزے"} ; g = Masc};
Very quality = {s = \\g,n => "بہت" ++ quality.s ! g ! n} ;
Fresh = regAdj "تازہ" ;
Warm = regAdj "گرم" ;
Italian = regAdj "اٹا لوی" ;
Expensive = regAdj "مہنگا" ;
Delicious = regAdj "مزیدار" ;
Boring = regAdj "فضول" ;
oper
regAdj : Str -> {s: Gender => Number => Str} = \a -> case a of {
x + "ا" => mkAdj a (x+"ے") (x+"ی");
_ => mkAdj a a a
};
mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \s,p,f -> {
s = table {
Masc => table {
Sg => s;
Pl => p
};
Fem => \\_ => f
}
};
}

View File

@@ -0,0 +1,16 @@
-- (c) 2009 Aarne Ranta under LGPL
instance LexFoodsIta of LexFoods =
open SyntaxIta, ParadigmsIta in {
oper
wine_N = mkN "vino" ;
pizza_N = mkN "pizza" ;
cheese_N = mkN "formaggio" ;
fish_N = mkN "pesce" ;
fresh_A = mkA "fresco" ;
warm_A = mkA "caldo" ;
italian_A = mkA "italiano" ;
expensive_A = mkA "caro" ;
delicious_A = mkA "delizioso" ;
boring_A = mkA "noioso" ;
}

View File

@@ -0,0 +1,53 @@
-- (c) 2009 Aarne Ranta under LGPL
incomplete concrete LexFoodsLat of Foods =
{
param
Gender = Male|Female|Neuter;
Number = Sg|Pl;
oper
regA : Str -> { s : Number => Gender => Str } =
\a -> {
s = case a of {
stem + "us" => table { Sg => table { Male => a ;
Female => stem + "a" ;
Neuter => stem + "um"
};
Pl => table { Male => stem + "i" ;
Female => stem + "ae" ;
Neuter => stem + "a"
}
} ;
_ => \\_,_ => ""
}
} ;
regN : Str -> { gender : Gender ; noun : Number => Str; adj : Number => Str } =
\nomsg ->
let nounpart : { gender : Gender ; noun : Number => Str } =
case nomsg of {
stem + "us" => { gender = Male; noun = table { Sg => nomsg ; Pl => stem + "i" } ; } ;
stem + "a" => { gender = Female; noun = table { Sg => nomsg ; Pl => stem + "ae" } } ;
stem + "um" => { gender = Neuter; noun = table { Sg => nomsg ; Pl => stem + "i" } } ;
_ => { gender = Neuter; noun = \\_ => "" }
};
in
nounpart ** { adj = \\_ => "" } ;
irregN : Str -> Str -> Gender -> { gender : Gender ; noun : Number => Str; adj : Number => Str } =
\nomsg,nompl,gender ->
{ gender = gender ; noun = table { Sg => nomsg ; Pl => nompl } ; adj = \\_ => "" } ;
lincat
Kind = { gender : Gender; noun : Number => Str; adj: Number => Str };
Quality = { s : Number => Gender => Str } ;
lin
Wine = regN "vinum" ;
Pizza = { gender = Female ; noun = table { Sg => "placenta" ; Pl => "placentae" } ; adj = table { Sg => "neapolitana" ; Pl => "neapolitanae" } } ;
Cheese = regN "formaticum" ;
Fish = irregN "piscis" "pisces" Male ;
Fresh = { s = table { Sg => \\_ => "recens" ; Pl => table { Male|Female => "recentes" ; Neuter => "recentia" } } } ;
Warm = regA "calidus" ;
Italian = regA "italus" ;
Expensive = regA "pretiosus" ;
Delicious = regA "iucundus" ;
Boring = { s = table { Sg => \\_ => "fluens" ; Pl => table { Male|Female => "fluentes" ; Neuter => "recentia" } } };
}

View File

@@ -0,0 +1,53 @@
resource MutationsGla = open CharactersGla in {
param Mutation = Unmutated|Lenition1|Lenition1DNTLS|Lenition2|PrefixT|PrefixH;
--Turns a string into a mutation table
oper mutate : (_ : Str) -> (Mutation => Str) = \str -> table {
Unmutated => str ;
Lenition1 => lenition1 str ;
Lenition1DNTLS => lenition1dntls str ;
Lenition2 => lenition2 str ;
PrefixT => prefixT str ;
PrefixH => prefixH str
};
--Performs lenition 1: inserts "h" if the word begins with a lenitable character
oper lenition1 : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"t"|"d"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"T"|"D"|"C"|"G") + rest => start + "h" + rest ;
("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated
start@("s"|"S") + rest => start + "h" + rest ;
_ => str
};
--Performs lenition 1 with dentals: same as lenition 1 but leaves "d", "t" and "s" unmutated
oper lenition1dntls : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ;
_ => str
};
--Performs lenition 2: same as lenition 1 with dentals but also changes "s" into "ts"
oper lenition2 : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ;
("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated
start@("s"|"S") + rest => "t-" + start + rest ;
_ => str
};
--Prefixes a "t" to words beginning with a vowel
oper prefixT : Str -> Str = \str -> case str of {
start@(#vowel) + rest => "t-" + start + rest ;
start@(#vowelCap) + rest => "t-" + start + rest ;
_ => str
};
--Prefixes a "h" to words beginning with a vowel
oper prefixH : Str -> Str = \str -> case str of {
start@(#vowel) + rest => "h-" + start + rest ;
start@(#vowelCap) + rest => "h-" + start + rest ;
_ => str
};
}

View File

@@ -0,0 +1,92 @@
resource MutationsGle = open CharactersGle in {
param Mutation = Unmutated|Lenition1|Lenition1DNTLS|Lenition2|Eclipsis1|Eclipsis2|Eclipsis3|PrefixT|PrefixH;
--Turns a string into a mutation table
oper mutate : (_ : Str) -> (Mutation => Str) = \str -> table {
Unmutated => str ;
Lenition1 => lenition1 str ;
Lenition1DNTLS => lenition1dntls str ;
Lenition2 => lenition2 str ;
Eclipsis1 => eclipsis1 str ;
Eclipsis2 => eclipsis2 str ;
Eclipsis3 => eclipsis3 str ;
PrefixT => prefixT str ;
PrefixH => prefixH str
};
--Performs lenition 1: inserts "h" if the word begins with a lenitable character
oper lenition1 : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"t"|"d"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"T"|"D"|"C"|"G") + rest => start + "h" + rest ;
("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated
start@("s"|"S") + rest => start + "h" + rest ;
_ => str
};
--Performs lenition 1 with dentals: same as lenition 1 but leaves "d", "t" and "s" unmutated
oper lenition1dntls : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ;
_ => str
};
--Performs lenition 2: same as lenition 1 with dentals but also changes "s" into "ts"
oper lenition2 : Str -> Str = \str -> case str of {
start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ;
start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ;
("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated
start@("s"|"S") + rest => "t" + start + rest ;
_ => str
};
--Performs eclisis 1: prefixes something to every word that begins with an ecliptable character
oper eclipsis1 : Str -> Str = \str -> case str of {
start@("p"|"P") + rest => "b" + start + rest ;
start@("b"|"B") + rest => "m" + start + rest ;
start@("f"|"F") + rest => "bh" + start + rest ;
start@("c"|"C") + rest => "g" + start + rest ;
start@("g"|"G") + rest => "n" + start + rest ;
start@("t"|"T") + rest => "d" + start + rest ;
start@("d"|"D") + rest => "n" + start + rest ;
start@(#vowel) + rest => "n-" + start + rest ;
start@(#vowelCap) + rest => "n" + start + rest ;
_ => str
};
--Performs eclipsis 2: same as eclipsis 1 but leaves "t", "d" and vowels unchanges
oper eclipsis2 : Str -> Str = \str -> case str of {
start@("p"|"P") + rest => "b" + start + rest ;
start@("b"|"B") + rest => "m" + start + rest ;
start@("f"|"F") + rest => "bh" + start + rest ;
start@("c"|"C") + rest => "g" + start + rest ;
start@("g"|"G") + rest => "n" + start + rest ;
_ => str
};
--Performs eclipsis 3: same as eclipsis 2 but also changes "s" to "ts"
eclipsis3 : Str -> Str = \str -> case str of {
start@("p"|"P") + rest => "b" + start + rest ;
start@("b"|"B") + rest => "m" + start + rest ;
start@("f"|"F") + rest => "bh" + start + rest ;
start@("c"|"C") + rest => "g" + start + rest ;
start@("g"|"G") + rest => "n" + start + rest ;
("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated
start@("s"|"S") + rest => "t" + start + rest ;
_ => str
};
--Prefixes a "t" to words beginning with a vowel
oper prefixT : Str -> Str = \str -> case str of {
start@(#vowel) + rest => "t-" + start + rest ;
start@(#vowelCap) + rest => "t" + start + rest ;
_ => str
};
--Prefixes a "h" to words beginning with a vowel
oper prefixH : Str -> Str = \str -> case str of {
start@(#vowel) + rest => "h" + start + rest ;
start@(#vowelCap) + rest => "h" + start + rest ;
_ => str
};
}