diff --git a/testsuite/lpgf/CharactersGla.gf b/testsuite/lpgf/CharactersGla.gf new file mode 100644 index 000000000..007ca7a24 --- /dev/null +++ b/testsuite/lpgf/CharactersGla.gf @@ -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"|""|"") ; + +} \ No newline at end of file diff --git a/testsuite/lpgf/CharactersGle.gf b/testsuite/lpgf/CharactersGle.gf new file mode 100644 index 000000000..8315703a6 --- /dev/null +++ b/testsuite/lpgf/CharactersGle.gf @@ -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"|""|"") ; + +} \ No newline at end of file diff --git a/testsuite/lpgf/Foods.treebank b/testsuite/lpgf/Foods.treebank index 95af23fda..0a52510d0 100644 --- a/testsuite/lpgf/Foods.treebank +++ b/testsuite/lpgf/Foods.treebank @@ -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: وہ فضول اٹا لوی پیزہ مہنگا ہے diff --git a/testsuite/lpgf/FoodsEpo.gf b/testsuite/lpgf/FoodsEpo.gf new file mode 100644 index 000000000..dd2400fe7 --- /dev/null +++ b/testsuite/lpgf/FoodsEpo.gf @@ -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" ; +} + diff --git a/testsuite/lpgf/FoodsGla.gf b/testsuite/lpgf/FoodsGla.gf new file mode 100644 index 000000000..127ef22e9 --- /dev/null +++ b/testsuite/lpgf/FoodsGla.gf @@ -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 "fon" "fontan" Masc ; + Cheese = makeNoun "cise" "cisean" 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 "blth" "bltha" ; + 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)} + } ; +} \ No newline at end of file diff --git a/testsuite/lpgf/FoodsGle.gf b/testsuite/lpgf/FoodsGle.gf new file mode 100644 index 000000000..f137da6aa --- /dev/null +++ b/testsuite/lpgf/FoodsGle.gf @@ -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 "fon" "fonta" Masc ; + Cheese = makeNoun "cis" "ciseanna" Fem ; + Fish = makeNoun "iasc" "isc" Masc ; + Pizza = makeNoun "potsa" "potsa" 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 "Iodlach" "Iodlacha" ; + 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)} + } ; +} \ No newline at end of file diff --git a/testsuite/lpgf/FoodsHin.gf b/testsuite/lpgf/FoodsHin.gf new file mode 100644 index 000000000..67c29df8b --- /dev/null +++ b/testsuite/lpgf/FoodsHin.gf @@ -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 => "हैं" + } ; + + } diff --git a/testsuite/lpgf/FoodsIce.gf b/testsuite/lpgf/FoodsIce.gf new file mode 100644 index 000000000..61b1a95b2 --- /dev/null +++ b/testsuite/lpgf/FoodsIce.gf @@ -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 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" + } ; +} diff --git a/testsuite/lpgf/FoodsIta.gf b/testsuite/lpgf/FoodsIta.gf new file mode 100644 index 000000000..0f959d2e5 --- /dev/null +++ b/testsuite/lpgf/FoodsIta.gf @@ -0,0 +1,7 @@ + +-- (c) 2009 Aarne Ranta under LGPL + +concrete FoodsIta of Foods = FoodsI with + (Syntax = SyntaxIta), + (LexFoods = LexFoodsIta) ; + diff --git a/testsuite/lpgf/FoodsLat.gf b/testsuite/lpgf/FoodsLat.gf new file mode 100644 index 000000000..bd2530900 --- /dev/null +++ b/testsuite/lpgf/FoodsLat.gf @@ -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 }; +} + diff --git a/testsuite/lpgf/FoodsLav.gf b/testsuite/lpgf/FoodsLav.gf new file mode 100644 index 000000000..2d5357ff9 --- /dev/null +++ b/testsuite/lpgf/FoodsLav.gf @@ -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 + } + } ; + + } diff --git a/testsuite/lpgf/FoodsMkd.gf b/testsuite/lpgf/FoodsMkd.gf new file mode 100644 index 000000000..7df235132 --- /dev/null +++ b/testsuite/lpgf/FoodsMkd.gf @@ -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; + +} diff --git a/testsuite/lpgf/FoodsMlt.gf b/testsuite/lpgf/FoodsMlt.gf new file mode 100644 index 000000000..5fcd4de78 --- /dev/null +++ b/testsuite/lpgf/FoodsMlt.gf @@ -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 + } ; + +} diff --git a/testsuite/lpgf/FoodsMon.gf b/testsuite/lpgf/FoodsMon.gf new file mode 100644 index 000000000..c0d58f722 --- /dev/null +++ b/testsuite/lpgf/FoodsMon.gf @@ -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 + "нууд"} + } ; + } + + diff --git a/testsuite/lpgf/FoodsNep.gf b/testsuite/lpgf/FoodsNep.gf new file mode 100644 index 000000000..ea02e64a6 --- /dev/null +++ b/testsuite/lpgf/FoodsNep.gf @@ -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 => "छन्"} ; +} + diff --git a/testsuite/lpgf/FoodsOri.gf b/testsuite/lpgf/FoodsOri.gf new file mode 100644 index 000000000..ad4f492f6 --- /dev/null +++ b/testsuite/lpgf/FoodsOri.gf @@ -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 = "ଅରୁଚିକର"; + +} diff --git a/testsuite/lpgf/FoodsPes.gf b/testsuite/lpgf/FoodsPes.gf new file mode 100644 index 000000000..c2e631e81 --- /dev/null +++ b/testsuite/lpgf/FoodsPes.gf @@ -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 of + { => pytzA ; => pytzAhA ; + =>pytzA ; => 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 => "هستند"}; + +} \ No newline at end of file diff --git a/testsuite/lpgf/FoodsPor.gf b/testsuite/lpgf/FoodsPor.gf new file mode 100644 index 000000000..76ffa3109 --- /dev/null +++ b/testsuite/lpgf/FoodsPor.gf @@ -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 => "so"} ; +} diff --git a/testsuite/lpgf/FoodsRon.gf b/testsuite/lpgf/FoodsRon.gf new file mode 100644 index 000000000..d7d917ffc --- /dev/null +++ b/testsuite/lpgf/FoodsRon.gf @@ -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 of +{ => scump ; => scumpa; + => scumpi ; => scumpe +}}; + +copula : Number => Str = table {Sg => "este" ; Pl => "sunt"}; + +getAgrGender : NGender -> Number -> Gender = \ng,n -> +case of +{ => Masc ; => Fem; + => Masc ; => Fem +}; + +} diff --git a/testsuite/lpgf/FoodsSpa.gf b/testsuite/lpgf/FoodsSpa.gf new file mode 100644 index 000000000..693d77d06 --- /dev/null +++ b/testsuite/lpgf/FoodsSpa.gf @@ -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") ; + +} + diff --git a/testsuite/lpgf/FoodsTha.gf b/testsuite/lpgf/FoodsTha.gf new file mode 100644 index 000000000..68245e1af --- /dev/null +++ b/testsuite/lpgf/FoodsTha.gf @@ -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 "น่า" "เบิ่อ")) ; + +} diff --git a/testsuite/lpgf/FoodsTsn.gf b/testsuite/lpgf/FoodsTsn.gf new file mode 100644 index 000000000..dae2bdfba --- /dev/null +++ b/testsuite/lpgf/FoodsTsn.gf @@ -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"}} + }; + +} diff --git a/testsuite/lpgf/FoodsTur.gf b/testsuite/lpgf/FoodsTur.gf new file mode 100644 index 000000000..9347a6bf7 --- /dev/null +++ b/testsuite/lpgf/FoodsTur.gf @@ -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 + } ; +} \ No newline at end of file diff --git a/testsuite/lpgf/FoodsUrd.gf b/testsuite/lpgf/FoodsUrd.gf new file mode 100644 index 000000000..186b2f929 --- /dev/null +++ b/testsuite/lpgf/FoodsUrd.gf @@ -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 + } + }; + } \ No newline at end of file diff --git a/testsuite/lpgf/LexFoodsIta.gf b/testsuite/lpgf/LexFoodsIta.gf new file mode 100644 index 000000000..11de5fcda --- /dev/null +++ b/testsuite/lpgf/LexFoodsIta.gf @@ -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" ; +} diff --git a/testsuite/lpgf/LexFoodsLat.gf b/testsuite/lpgf/LexFoodsLat.gf new file mode 100644 index 000000000..ab5da3e2e --- /dev/null +++ b/testsuite/lpgf/LexFoodsLat.gf @@ -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" } } }; +} diff --git a/testsuite/lpgf/MutationsGla.gf b/testsuite/lpgf/MutationsGla.gf new file mode 100644 index 000000000..41eb11006 --- /dev/null +++ b/testsuite/lpgf/MutationsGla.gf @@ -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 + }; + +} \ No newline at end of file diff --git a/testsuite/lpgf/MutationsGle.gf b/testsuite/lpgf/MutationsGle.gf new file mode 100644 index 000000000..9ae734a90 --- /dev/null +++ b/testsuite/lpgf/MutationsGle.gf @@ -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 + }; + +} \ No newline at end of file