From 0f5be0bbaa862d2ccdb649eb6dd9fc5e26814e8a Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 30 Jun 2021 12:41:56 +0200 Subject: [PATCH] Add shell script in testsuite/compiler/canonical for replicating known issues Ideally this is integrated into proper test suite, but that's too much overhead for now --- testsuite/compiler/canonical/.gitignore | 1 + testsuite/compiler/canonical/Foods.gf | 16 + testsuite/compiler/canonical/FoodsFin.gf | 6 + testsuite/compiler/canonical/FoodsFin.gf.gold | 102 ++++++ testsuite/compiler/canonical/FoodsI.gf | 29 ++ testsuite/compiler/canonical/Greetings.gf | 28 ++ testsuite/compiler/canonical/GreetingsBul.gf | 31 ++ testsuite/compiler/canonical/GreetingsGer.gf | 31 ++ testsuite/compiler/canonical/LexFoods.gf | 15 + testsuite/compiler/canonical/LexFoodsFin.gf | 21 ++ testsuite/compiler/canonical/Phrasebook.gf | 8 + testsuite/compiler/canonical/PhrasebookBul.gf | 9 + testsuite/compiler/canonical/PhrasebookGer.gf | 10 + testsuite/compiler/canonical/Sentences.gf | 222 +++++++++++++ testsuite/compiler/canonical/SentencesBul.gf | 54 ++++ testsuite/compiler/canonical/SentencesGer.gf | 50 +++ testsuite/compiler/canonical/SentencesI.gf | 302 +++++++++++++++++ testsuite/compiler/canonical/Words.gf | 254 +++++++++++++++ testsuite/compiler/canonical/WordsBul.gf | 305 ++++++++++++++++++ testsuite/compiler/canonical/WordsGer.gf | 262 +++++++++++++++ testsuite/compiler/canonical/run.sh | 23 ++ 21 files changed, 1779 insertions(+) create mode 100644 testsuite/compiler/canonical/.gitignore create mode 100644 testsuite/compiler/canonical/Foods.gf create mode 100644 testsuite/compiler/canonical/FoodsFin.gf create mode 100644 testsuite/compiler/canonical/FoodsFin.gf.gold create mode 100644 testsuite/compiler/canonical/FoodsI.gf create mode 100644 testsuite/compiler/canonical/Greetings.gf create mode 100644 testsuite/compiler/canonical/GreetingsBul.gf create mode 100644 testsuite/compiler/canonical/GreetingsGer.gf create mode 100644 testsuite/compiler/canonical/LexFoods.gf create mode 100644 testsuite/compiler/canonical/LexFoodsFin.gf create mode 100644 testsuite/compiler/canonical/Phrasebook.gf create mode 100644 testsuite/compiler/canonical/PhrasebookBul.gf create mode 100644 testsuite/compiler/canonical/PhrasebookGer.gf create mode 100644 testsuite/compiler/canonical/Sentences.gf create mode 100644 testsuite/compiler/canonical/SentencesBul.gf create mode 100644 testsuite/compiler/canonical/SentencesGer.gf create mode 100644 testsuite/compiler/canonical/SentencesI.gf create mode 100644 testsuite/compiler/canonical/Words.gf create mode 100644 testsuite/compiler/canonical/WordsBul.gf create mode 100644 testsuite/compiler/canonical/WordsGer.gf create mode 100755 testsuite/compiler/canonical/run.sh diff --git a/testsuite/compiler/canonical/.gitignore b/testsuite/compiler/canonical/.gitignore new file mode 100644 index 000000000..72988cf10 --- /dev/null +++ b/testsuite/compiler/canonical/.gitignore @@ -0,0 +1 @@ +canonical/ diff --git a/testsuite/compiler/canonical/Foods.gf b/testsuite/compiler/canonical/Foods.gf new file mode 100644 index 000000000..aa68d4429 --- /dev/null +++ b/testsuite/compiler/canonical/Foods.gf @@ -0,0 +1,16 @@ +-- (c) 2009 Aarne Ranta under LGPL + +abstract Foods = { + flags startcat = Comment ; + cat + Comment ; Item ; Kind ; Quality ; + fun + -- Pred : Item -> Quality -> Comment ; + -- This, That, These, Those : Kind -> Item ; + -- Mod : Quality -> Kind -> Kind ; + -- Wine, Cheese, Fish, Pizza : Kind ; + -- Very : Quality -> Quality ; + -- Fresh, Warm, Italian, + -- Expensive, Delicious, Boring : Quality ; + Expensive: Quality; +} diff --git a/testsuite/compiler/canonical/FoodsFin.gf b/testsuite/compiler/canonical/FoodsFin.gf new file mode 100644 index 000000000..962199805 --- /dev/null +++ b/testsuite/compiler/canonical/FoodsFin.gf @@ -0,0 +1,6 @@ + +-- (c) 2009 Aarne Ranta under LGPL + +concrete FoodsFin of Foods = FoodsI with + (Syntax = SyntaxFin), + (LexFoods = LexFoodsFin) ; diff --git a/testsuite/compiler/canonical/FoodsFin.gf.gold b/testsuite/compiler/canonical/FoodsFin.gf.gold new file mode 100644 index 000000000..55c2fa6c9 --- /dev/null +++ b/testsuite/compiler/canonical/FoodsFin.gf.gold @@ -0,0 +1,102 @@ +concrete FoodsFin of Foods = { +param ParamX_Number = ParamX_Sg | ParamX_Pl; +param Prelude_Bool = Prelude_False | Prelude_True; +param ResFin_Agr = ResFin_Ag ParamX_Number ParamX_Person | ResFin_AgPol; +param ParamX_Person = ParamX_P1 | ParamX_P2 | ParamX_P3; +param ResFin_Harmony = ResFin_Back | ResFin_Front; +param ResFin_NForm = + ResFin_NCase ParamX_Number ResFin_Case | ResFin_NComit | ResFin_NInstruct | + ResFin_NPossNom ParamX_Number | ResFin_NPossGen ParamX_Number | + ResFin_NPossTransl ParamX_Number | ResFin_NPossIllat ParamX_Number | + ResFin_NCompound; +param ResFin_Case = + ResFin_Nom | ResFin_Gen | ResFin_Part | ResFin_Transl | ResFin_Ess | + ResFin_Iness | ResFin_Elat | ResFin_Illat | ResFin_Adess | ResFin_Ablat | + ResFin_Allat | ResFin_Abess; +param ResFin_NPForm = ResFin_NPCase ResFin_Case | ResFin_NPAcc | ResFin_NPSep; +lincat Comment = {s : Str}; + Item = + {s : ResFin_NPForm => Str; a : ResFin_Agr; isNeg : Prelude_Bool; + isPron : Prelude_Bool}; + Kind = + {s : ResFin_NForm => Str; h : ResFin_Harmony; + postmod : ParamX_Number => Str}; + Quality = + {s : Prelude_Bool => ResFin_NForm => Str; hasPrefix : Prelude_Bool; + p : Str}; +lin Expensive = + {s = + table {Prelude_False => + table {ResFin_NCase ParamX_Sg ResFin_Nom => "kallis"; + ResFin_NCase ParamX_Sg ResFin_Gen => "kalliin"; + ResFin_NCase ParamX_Sg ResFin_Part => "kallista"; + ResFin_NCase ParamX_Sg ResFin_Transl => "kalliiksi"; + ResFin_NCase ParamX_Sg ResFin_Ess => "kalliina"; + ResFin_NCase ParamX_Sg ResFin_Iness => "kalliissa"; + ResFin_NCase ParamX_Sg ResFin_Elat => "kalliista"; + ResFin_NCase ParamX_Sg ResFin_Illat => "kalliiseen"; + ResFin_NCase ParamX_Sg ResFin_Adess => "kalliilla"; + ResFin_NCase ParamX_Sg ResFin_Ablat => "kalliilta"; + ResFin_NCase ParamX_Sg ResFin_Allat => "kalliille"; + ResFin_NCase ParamX_Sg ResFin_Abess => "kalliitta"; + ResFin_NCase ParamX_Pl ResFin_Nom => "kalliit"; + ResFin_NCase ParamX_Pl ResFin_Gen => "kalliiden"; + ResFin_NCase ParamX_Pl ResFin_Part => "kalliita"; + ResFin_NCase ParamX_Pl ResFin_Transl => "kalliiksi"; + ResFin_NCase ParamX_Pl ResFin_Ess => "kalliina"; + ResFin_NCase ParamX_Pl ResFin_Iness => "kalliissa"; + ResFin_NCase ParamX_Pl ResFin_Elat => "kalliista"; + ResFin_NCase ParamX_Pl ResFin_Illat => "kalliisiin"; + ResFin_NCase ParamX_Pl ResFin_Adess => "kalliilla"; + ResFin_NCase ParamX_Pl ResFin_Ablat => "kalliilta"; + ResFin_NCase ParamX_Pl ResFin_Allat => "kalliille"; + ResFin_NCase ParamX_Pl ResFin_Abess => "kalliitta"; + ResFin_NComit => "kalliine"; + ResFin_NInstruct => "kalliin"; + ResFin_NPossNom ParamX_Sg => "kallii"; + ResFin_NPossNom ParamX_Pl => "kallii"; + ResFin_NPossGen ParamX_Sg => "kallii"; + ResFin_NPossGen ParamX_Pl => "kalliide"; + ResFin_NPossTransl ParamX_Sg => "kalliikse"; + ResFin_NPossTransl ParamX_Pl => "kalliikse"; + ResFin_NPossIllat ParamX_Sg => "kalliisee"; + ResFin_NPossIllat ParamX_Pl => "kalliisii"; + ResFin_NCompound => "kallis"}; + Prelude_True => + table {ResFin_NCase ParamX_Sg ResFin_Nom => "kallis"; + ResFin_NCase ParamX_Sg ResFin_Gen => "kalliin"; + ResFin_NCase ParamX_Sg ResFin_Part => "kallista"; + ResFin_NCase ParamX_Sg ResFin_Transl => "kalliiksi"; + ResFin_NCase ParamX_Sg ResFin_Ess => "kalliina"; + ResFin_NCase ParamX_Sg ResFin_Iness => "kalliissa"; + ResFin_NCase ParamX_Sg ResFin_Elat => "kalliista"; + ResFin_NCase ParamX_Sg ResFin_Illat => "kalliiseen"; + ResFin_NCase ParamX_Sg ResFin_Adess => "kalliilla"; + ResFin_NCase ParamX_Sg ResFin_Ablat => "kalliilta"; + ResFin_NCase ParamX_Sg ResFin_Allat => "kalliille"; + ResFin_NCase ParamX_Sg ResFin_Abess => "kalliitta"; + ResFin_NCase ParamX_Pl ResFin_Nom => "kalliit"; + ResFin_NCase ParamX_Pl ResFin_Gen => "kalliiden"; + ResFin_NCase ParamX_Pl ResFin_Part => "kalliita"; + ResFin_NCase ParamX_Pl ResFin_Transl => "kalliiksi"; + ResFin_NCase ParamX_Pl ResFin_Ess => "kalliina"; + ResFin_NCase ParamX_Pl ResFin_Iness => "kalliissa"; + ResFin_NCase ParamX_Pl ResFin_Elat => "kalliista"; + ResFin_NCase ParamX_Pl ResFin_Illat => "kalliisiin"; + ResFin_NCase ParamX_Pl ResFin_Adess => "kalliilla"; + ResFin_NCase ParamX_Pl ResFin_Ablat => "kalliilta"; + ResFin_NCase ParamX_Pl ResFin_Allat => "kalliille"; + ResFin_NCase ParamX_Pl ResFin_Abess => "kalliitta"; + ResFin_NComit => "kalliine"; + ResFin_NInstruct => "kalliin"; + ResFin_NPossNom ParamX_Sg => "kallii"; + ResFin_NPossNom ParamX_Pl => "kallii"; + ResFin_NPossGen ParamX_Sg => "kallii"; + ResFin_NPossGen ParamX_Pl => "kalliide"; + ResFin_NPossTransl ParamX_Sg => "kalliikse"; + ResFin_NPossTransl ParamX_Pl => "kalliikse"; + ResFin_NPossIllat ParamX_Sg => "kalliisee"; + ResFin_NPossIllat ParamX_Pl => "kalliisii"; + ResFin_NCompound => "kallis"}}; + hasPrefix = Prelude_False; p = ""}; +} diff --git a/testsuite/compiler/canonical/FoodsI.gf b/testsuite/compiler/canonical/FoodsI.gf new file mode 100644 index 000000000..f4113b724 --- /dev/null +++ b/testsuite/compiler/canonical/FoodsI.gf @@ -0,0 +1,29 @@ +-- (c) 2009 Aarne Ranta under LGPL + +incomplete concrete FoodsI of Foods = + open Syntax, LexFoods in { + 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 wine_N ; + Pizza = mkCN pizza_N ; + Cheese = mkCN cheese_N ; + Fish = mkCN fish_N ; + Fresh = mkAP fresh_A ; + Warm = mkAP warm_A ; + Italian = mkAP italian_A ; + Expensive = mkAP expensive_A ; + Delicious = mkAP delicious_A ; + Boring = mkAP boring_A ; +} diff --git a/testsuite/compiler/canonical/Greetings.gf b/testsuite/compiler/canonical/Greetings.gf new file mode 100644 index 000000000..580b1560b --- /dev/null +++ b/testsuite/compiler/canonical/Greetings.gf @@ -0,0 +1,28 @@ +abstract Greetings = Sentences [Greeting] ** { + +fun + GBye : Greeting ; + GCheers : Greeting ; + GDamn : Greeting ; + GExcuse, GExcusePol : Greeting ; + GGoodDay : Greeting ; + GGoodEvening : Greeting ; + GGoodMorning : Greeting ; + GGoodNight : Greeting ; + GGoodbye : Greeting ; + GHello : Greeting ; + GHelp : Greeting ; + GHowAreYou : Greeting ; + GLookOut : Greeting ; + GNiceToMeetYou : Greeting ; + GPleaseGive, GPleaseGivePol : Greeting ; + GSeeYouSoon : Greeting ; + GSorry, GSorryPol : Greeting ; + GThanks : Greeting ; + GTheCheck : Greeting ; + GCongratulations : Greeting ; + GHappyBirthday : Greeting ; + GGoodLuck : Greeting ; + GWhatTime : Greeting ; + +} diff --git a/testsuite/compiler/canonical/GreetingsBul.gf b/testsuite/compiler/canonical/GreetingsBul.gf new file mode 100644 index 000000000..f271d7717 --- /dev/null +++ b/testsuite/compiler/canonical/GreetingsBul.gf @@ -0,0 +1,31 @@ +concrete GreetingsBul of Greetings = SentencesBul [Greeting,mkGreeting] ** open Prelude in { + +flags + coding=utf8; + +lin + GBye = mkGreeting "чао" ; + GCheers = mkGreeting "наздраве" ; + GDamn = mkGreeting "по дяволите" ; + GExcuse, GExcusePol = mkGreeting "извинете" ; + GGoodDay = mkGreeting "добър ден" ; + GGoodEvening = mkGreeting "добра вечер" ; + GGoodMorning = mkGreeting "добро утро" ; + GGoodNight = mkGreeting "лека нощ" ; + GGoodbye = mkGreeting "довиждане" ; + GHello = mkGreeting "здравей" ; + GHelp = mkGreeting "помощ" ; + GHowAreYou = mkGreeting "как си" ; + GLookOut = mkGreeting "погледни" ; + GNiceToMeetYou = mkGreeting "радвам се да се видим" ; + GPleaseGive, GPleaseGivePol = mkGreeting "моля" ; + GSeeYouSoon = mkGreeting "до скоро" ; + GSorry, GSorryPol = mkGreeting "извинете" ; + GThanks = mkGreeting "благодаря ти" ; + GTheCheck = mkGreeting "сметката" ; + GCongratulations = mkGreeting "поздравления"; + GHappyBirthday = mkGreeting "честит рожден ден" ; + GGoodLuck = mkGreeting "успех" ; + GWhatTime = mkGreeting "колко е часът" ; + +} diff --git a/testsuite/compiler/canonical/GreetingsGer.gf b/testsuite/compiler/canonical/GreetingsGer.gf new file mode 100644 index 000000000..f027d70ac --- /dev/null +++ b/testsuite/compiler/canonical/GreetingsGer.gf @@ -0,0 +1,31 @@ +--# -path=.:abstract:prelude:german:api:common +--# -coding=latin1 +concrete GreetingsGer of Greetings = SentencesGer [Greeting,mkGreeting] ** open Prelude in { + +lin + GBye = mkGreeting "tsch" ; + GCheers = mkGreeting "zum Wohl" ; + GDamn = mkGreeting "verdammt" ; + GExcuse, GExcusePol = mkGreeting "Entschuldigung" ; + GGoodDay = mkGreeting "guten Tag" ; + GGoodEvening = mkGreeting "guten Abend" ; + GGoodMorning = mkGreeting "guten Morgen" ; + GGoodNight = mkGreeting "gute Nacht" ; + GGoodbye = mkGreeting "auf Wiedersehen" ; + GHello = mkGreeting "Hallo" ; + GHelp = mkGreeting "Hilfe" ; + GHowAreYou = mkGreeting "wie geht's" ; + GLookOut = mkGreeting "Achtung" ; + GNiceToMeetYou = mkGreeting "nett, Sie zu treffen" ; + GPleaseGive, GPleaseGivePol = mkGreeting "bitte" ; + GSeeYouSoon = mkGreeting "bis bald" ; + GSorry, GSorryPol = mkGreeting "Entschuldigung" ; + GThanks = mkGreeting "Danke" ; + GTheCheck = mkGreeting "die Rechnung" ; + GCongratulations = mkGreeting "herzlichen Glckwunsch"; + GHappyBirthday = mkGreeting "alles Gute zum Geburtstag" ; + GGoodLuck = mkGreeting "viel Glck" ; + GWhatTime = mkGreeting "wieviel Uhr ist es" | mkGreeting "wie spt ist es" ; + +} + diff --git a/testsuite/compiler/canonical/LexFoods.gf b/testsuite/compiler/canonical/LexFoods.gf new file mode 100644 index 000000000..12ace208c --- /dev/null +++ b/testsuite/compiler/canonical/LexFoods.gf @@ -0,0 +1,15 @@ +-- (c) 2009 Aarne Ranta under LGPL + +interface LexFoods = open Syntax in { + oper + wine_N : N ; + pizza_N : N ; + cheese_N : N ; + fish_N : N ; + fresh_A : A ; + warm_A : A ; + italian_A : A ; + expensive_A : A ; + delicious_A : A ; + boring_A : A ; +} diff --git a/testsuite/compiler/canonical/LexFoodsFin.gf b/testsuite/compiler/canonical/LexFoodsFin.gf new file mode 100644 index 000000000..8b12f449f --- /dev/null +++ b/testsuite/compiler/canonical/LexFoodsFin.gf @@ -0,0 +1,21 @@ +-- (c) 2009 Aarne Ranta under LGPL +--# -coding=latin1 + +instance LexFoodsFin of LexFoods = + open SyntaxFin, ParadigmsFin in { + oper + wine_N = mkN "viini" ; + pizza_N = mkN "pizza" ; + cheese_N = mkN "juusto" ; + fish_N = mkN "kala" ; + fresh_A = mkA "tuore" ; + warm_A = mkA + (mkN "l�mmin" "l�mpim�n" "l�mmint�" "l�mpim�n�" "l�mpim��n" + "l�mpimin�" "l�mpimi�" "l�mpimien" "l�mpimiss�" "l�mpimiin" + ) + "l�mpim�mpi" "l�mpimin" ; + italian_A = mkA "italialainen" ; + expensive_A = mkA "kallis" ; + delicious_A = mkA "herkullinen" ; + boring_A = mkA "tyls�" ; +} diff --git a/testsuite/compiler/canonical/Phrasebook.gf b/testsuite/compiler/canonical/Phrasebook.gf new file mode 100644 index 000000000..9ebc13106 --- /dev/null +++ b/testsuite/compiler/canonical/Phrasebook.gf @@ -0,0 +1,8 @@ +abstract Phrasebook = + Greetings, + Words + ** { + +flags startcat = Phrase ; + +} diff --git a/testsuite/compiler/canonical/PhrasebookBul.gf b/testsuite/compiler/canonical/PhrasebookBul.gf new file mode 100644 index 000000000..bbc092963 --- /dev/null +++ b/testsuite/compiler/canonical/PhrasebookBul.gf @@ -0,0 +1,9 @@ +--# -path=.:present + +concrete PhrasebookBul of Phrasebook = + GreetingsBul, + WordsBul ** open + SyntaxBul, + Prelude in { + +} diff --git a/testsuite/compiler/canonical/PhrasebookGer.gf b/testsuite/compiler/canonical/PhrasebookGer.gf new file mode 100644 index 000000000..69a61187c --- /dev/null +++ b/testsuite/compiler/canonical/PhrasebookGer.gf @@ -0,0 +1,10 @@ +--# -path=.:present + +concrete PhrasebookGer of Phrasebook = + GreetingsGer, + WordsGer ** open + SyntaxGer, + Prelude in { + + +} diff --git a/testsuite/compiler/canonical/Sentences.gf b/testsuite/compiler/canonical/Sentences.gf new file mode 100644 index 000000000..6798c2127 --- /dev/null +++ b/testsuite/compiler/canonical/Sentences.gf @@ -0,0 +1,222 @@ +--1 The Ontology of the Phrasebook + +--2 Syntactic Structures of the Phrasebook + +-- This module contains phrases that can be defined by a functor over the +-- resource grammar API. The phrases that are likely to have different implementations +-- are in the module Words. But the distinction is not quite sharp; thus it may happen +-- that the functor instantiations make exceptions. + +abstract Sentences = Numeral ** { + +-- The ontology of the phrasebook is defined by the following types. The commented ones +-- are defined in other modules. + + cat + Phrase ; -- complete phrase, the unit of translation e.g. "Where are you?" + Word ; -- word that could be used as phrase e.g. "Monday" + Message ; -- sequence of phrases, longest unit e.g. "Hello! Where are you?" + Greeting ; -- idiomatic greeting e.g. "hello" + Sentence ; -- declarative sentence e.g. "I am in the bar" + Question ; -- question, either yes/no or wh e.g. "where are you" + Proposition ; -- can be turned into sentence or question e.g. "this pizza is good" + Object ; -- the object of wanting, ordering, etc e.g. "three pizzas and a beer" + PrimObject ; -- single object of wanting, ordering, etc e.g. "three pizzas" + Item ; -- a single entity e.g. "this pizza" + Kind ; -- a type of an item e.g. "pizza" + MassKind ; -- a type mass (uncountable) e.g. "water" + PlurKind ; -- a type usually only in plural e.g. "noodles" + DrinkKind ; -- a drinkable, countable type e.g. "beer" + Quality ; -- qualification of an item, can be complex e.g. "very good" + Property ; -- basic property of an item, one word e.g. "good" + Place ; -- location e.g. "the bar" + PlaceKind ; -- type of location e.g. "bar" + Currency ; -- currency unit e.g. "leu" + Price ; -- number of currency units e.g. "eleven leu" + Person ; -- agent wanting or doing something e.g. "you" + Action ; -- proposition about a Person e.g. "you are here" + Nationality ; -- complex of language, property, country e.g. "Swedish, Sweden" + LAnguage ; -- language (can be without nationality) e.g. "Flemish" + Citizenship ; -- property (can be without language) e.g. "Belgian" + Country ; -- country (can be without language) e.g. "Belgium" + Day ; -- weekday type e.g. "Friday" + Date ; -- definite date e.g. "on Friday" + Name ; -- name of person e.g. "NN" + Number ; -- number expression 1 .. 999,999 e.g. "twenty" + Transport ; -- transportation device e.g. "car" + ByTransport ; -- mean of transportation e.g. "by tram" + Superlative ; -- superlative modifiers of places e.g. "the best restaurant" + + + fun + +-- To build a whole message + + MPhrase : Phrase -> Message ; + MContinue : Phrase -> Message -> Message ; + +-- Many of the categories are accessible as Phrases, i.e. as translation units. +-- To regulate whether words appear on the top level, change their status between +-- Word and Phrase, or uncomment PWord, + + -- PWord : Word -> Phrase ; + + PGreetingMale : Greeting -> Phrase ; -- depends on speaker e.g. in Thai + PGreetingFemale : Greeting -> Phrase ; + PSentence : Sentence -> Phrase ; + PQuestion : Question -> Phrase ; + + PNumber : Number -> Phrase ; + PPrice : Price -> Phrase ; + PObject : Object -> Word ; + PKind : Kind -> Word ; + PMassKind : MassKind -> Word ; + PQuality : Quality -> Word ; + PPlace : Place -> Word ; + PPlaceKind : PlaceKind -> Word ; + PCurrency : Currency -> Word ; + PLanguage : LAnguage -> Word ; + PCitizenship : Citizenship -> Word ; + PCountry : Country -> Word ; + PDay : Day -> Word ; + PByTransport : ByTransport -> Word ; + PTransport : Transport -> Word ; + + PYes, PNo, PYesToNo : Greeting ; -- yes, no, si/doch (pos. answer to neg. question) + +-- To order something. + + GObjectPlease : Object -> Greeting ; -- a pizza and beer, please! + +-- This is the way to build propositions about inanimate items. + + Is : Item -> Quality -> Proposition ; -- this pizza is good + IsMass : MassKind -> Quality -> Proposition ; -- Belgian beer is good + +-- To use propositions on higher levels. + + SProp : Proposition -> Sentence ; -- this pizza is good + SPropNot : Proposition -> Sentence ; -- this pizza isn't good + QProp : Proposition -> Question ; -- is this pizza good + + WherePlace : Place -> Question ; -- where is the bar + WherePerson : Person -> Question ; -- where are you + +-- This is the way to build propositions about persons. + + PropAction : Action -> Proposition ; -- (you (are|aren't) | are you) Swedish + +-- Here are some general syntactic constructions. + + ObjItem : Item -> PrimObject ; -- this pizza + ObjNumber : Number -> Kind -> PrimObject ; -- five pizzas + ObjIndef : Kind -> PrimObject ; -- a pizza + ObjPlural : Kind -> PrimObject ; -- pizzas + ObjPlur : PlurKind -> PrimObject ; -- noodles + ObjMass : MassKind -> PrimObject ; -- water + ObjAndObj : PrimObject -> Object -> Object ; -- this pizza and a beer + OneObj : PrimObject -> Object ; -- this pizza + + SuchKind : Quality -> Kind -> Kind ; -- Italian pizza + SuchMassKind : Quality -> MassKind -> MassKind ; -- Italian water + Very : Property -> Quality ; -- very Italian + Too : Property -> Quality ; -- too Italian + PropQuality : Property -> Quality ; -- Italian + + MassDrink : DrinkKind -> MassKind ; -- beer + DrinkNumber : Number -> DrinkKind -> PrimObject ; -- five beers + +-- Determiners. + + This, That, These, Those : Kind -> Item ; -- this pizza,...,those pizzas + The, Thes : Kind -> Item ; -- the pizza, the pizzas + ThisMass, ThatMass, TheMass : MassKind -> Item ; -- this/that/the water + ThesePlur, ThosePlur, ThesPlur : PlurKind -> Item ; -- these/those/the potatoes + + AmountCurrency : Number -> Currency -> Price ; -- five euros + + ThePlace : PlaceKind -> Place ; -- the bar + APlace : PlaceKind -> Place ; -- a bar + + IMale, IFemale, -- I, said by man/woman (affects agreement) + YouFamMale, YouFamFemale, -- familiar you, said to man/woman (affects agreement) + YouPolMale, YouPolFemale : Person ; -- polite you, said to man/woman (affects agreement) + + LangNat : Nationality -> LAnguage ; -- Swedish + CitiNat : Nationality -> Citizenship ; -- Swedish + CountryNat : Nationality -> Country ; -- Sweden + PropCit : Citizenship -> Property ; -- Swedish + + OnDay : Day -> Date ; -- on Friday + Today : Date ; -- today + + PersonName : Name -> Person ; -- person referred by name + NameNN : Name ; -- the name "NN" + +---- NameString : String -> Name ; ---- creates ambiguities with all words --% + + NNumeral : Numeral -> Number ; -- numeral in words, e.g. "twenty" + +-- Actions are typically language-dependent, not only lexically but also +-- structurally. However, these ones are mostly functorial. + + SHave : Person -> Object -> Sentence ; -- you have beer + SHaveNo : Person -> Kind -> Sentence ; -- you have no apples + SHaveNoMass : Person -> MassKind -> Sentence ; -- you have no beer + QDoHave : Person -> Object -> Question ; -- do you have beer + + AHaveCurr : Person -> Currency -> Action ; -- you have dollars + ACitizen : Person -> Citizenship -> Action ; -- you are Swedish + ABePlace : Person -> Place -> Action ; -- you are in the bar + + ByTransp : Transport -> ByTransport ; -- by bus + + AKnowSentence : Person -> Sentence -> Action ; -- you know that I am in the bar + AKnowPerson : Person -> Person -> Action ; -- you know me + AKnowQuestion : Person -> Question -> Action ; -- you know how far the bar is + +------------------------------------------------------------------------------------------ +-- New things added 30/11/2011 by AR +------------------------------------------------------------------------------------------ + + cat + VerbPhrase ; -- things one does, can do, must do, wants to do, e.g. swim + Modality ; -- can, want, must + fun + ADoVerbPhrase : Person -> VerbPhrase -> Action ; -- I swim + AModVerbPhrase : Modality -> Person -> VerbPhrase -> Action ; -- I can swim + ADoVerbPhrasePlace : Person -> VerbPhrase -> Place -> Action ; -- I swim in the hotel + AModVerbPhrasePlace : Modality -> Person -> VerbPhrase -> Place -> Action ; -- I can swim in the hotel + + QWhereDoVerbPhrase : Person -> VerbPhrase -> Question ; -- where do you swim + QWhereModVerbPhrase : Modality -> Person -> VerbPhrase -> Question ; -- where can I swim + + MCan, MKnow, MMust, MWant : Modality ; + +-- lexical items given in the resource Lexicon + + VPlay, VRun, VSit, VSleep, VSwim, VWalk : VerbPhrase ; + VDrink, VEat, VRead, VWait, VWrite, VSit, VStop : VerbPhrase ; + V2Buy, V2Drink, V2Eat : Object -> VerbPhrase ; + V2Wait : Person -> VerbPhrase ; + + PImperativeFamPos, -- eat + PImperativeFamNeg, -- don't eat + PImperativePolPos, -- essen Sie + PImperativePolNeg, -- essen Sie nicht + PImperativePlurPos, -- esst + PImperativePlurNeg : -- esst nicht + VerbPhrase -> Phrase ; + +-- other new things allowed by the resource + +--- PBecause : Sentence -> Sentence -> Phrase ; -- I want to swim because it is hot + + He, She, -- he, she + WeMale, WeFemale, -- we, said by men/women (affects agreement) + YouPlurFamMale, YouPlurFamFemale, -- plural familiar you, said to men/women (affects agreement) + YouPlurPolMale, YouPlurPolFemale, -- plural polite you, said to men/women (affects agreement) + TheyMale, TheyFemale : Person ; -- they, said of men/women (affects agreement) + +} + diff --git a/testsuite/compiler/canonical/SentencesBul.gf b/testsuite/compiler/canonical/SentencesBul.gf new file mode 100644 index 000000000..b2968bc85 --- /dev/null +++ b/testsuite/compiler/canonical/SentencesBul.gf @@ -0,0 +1,54 @@ +concrete SentencesBul of Sentences = + NumeralBul ** SentencesI - [IMale, IFemale, YouFamMale, YouFamFemale, YouPolMale, + YouPolFemale, ACitizen, Citizenship, PCitizenship, + LangNat, CitiNat, CountryNat, PropCit, + Nationality, Country, LAnguage, PLanguage, PCountry + ] with + (Syntax = SyntaxBul), + (Symbolic = SymbolicBul), + (Lexicon = LexiconBul) ** open ExtraBul, (R = ResBul) in { + +lincat + Citizenship = {s1 : R.Gender => R.NForm => Str; -- there are two nouns for every citizenship - one for males and one for females + s2 : A -- furthermore, adjective for Property + } ; + Nationality = {s1 : R.Gender => R.NForm => Str; -- there are two nouns for every citizenship - one for males and one for females + s2 : A; -- furthermore, adjective for Property + s3 : PN -- country name + } ; + LAnguage = A ; + Country = PN ; + +lin IMale = mkPerson i_Pron ; + IFemale = mkPerson i8fem_Pron ; + +lin YouFamMale = mkPerson youSg_Pron ; + YouFamFemale = mkPerson youSg8fem_Pron ; + YouPolMale, YouPolFemale = mkPerson youPol_Pron ; + +lin ACitizen p cit = + let noun : N + = case p.name.gn of { + R.GSg g => lin N {s = \\nf => cit.s1 ! g ! nf; + rel = cit.s2.s; relType = R.AdjMod; + g = case g of {R.Masc=>R.AMasc R.Human; R.Fem=>R.AFem; R.Neut=>R.ANeut} + } ; + R.GPl => lin N {s = \\nf => cit.s1 ! R.Masc ! nf; + rel = cit.s2.s; relType = R.AdjMod; + g = R.AMasc R.Human + } + } ; + in mkCl p.name noun ; + + PCitizenship cit = + mkPhrase (mkUtt (mkAP cit.s2)) ; + + LangNat n = n.s2 ; + CitiNat n = n ; + CountryNat n = n.s3 ; + PropCit cit = cit.s2 ; + + PLanguage x = mkPhrase (mkUtt (mkAP x)) ; + PCountry x = mkPhrase (mkUtt (mkNP x)) ; + +} diff --git a/testsuite/compiler/canonical/SentencesGer.gf b/testsuite/compiler/canonical/SentencesGer.gf new file mode 100644 index 000000000..cc0922d5f --- /dev/null +++ b/testsuite/compiler/canonical/SentencesGer.gf @@ -0,0 +1,50 @@ +concrete SentencesGer of Sentences = NumeralGer ** SentencesI - + [PYesToNo,SHaveNo,SHaveNoMass, + Proposition, Action, Is, IsMass, SProp, SPropNot, QProp, + AHaveCurr, ACitizen, ABePlace, AKnowSentence, AKnowPerson, AKnowQuestion, + Nationality, LAnguage, + ADoVerbPhrase, AModVerbPhrase, ADoVerbPhrasePlace, AModVerbPhrasePlace, + YouPlurPolMale, YouPlurPolFemale + ] with + (Syntax = SyntaxGer), + (Symbolic = SymbolicGer), + (Lexicon = LexiconGer) ** open Prelude, SyntaxGer in { + + lin + PYesToNo = mkPhrase (lin Utt (ss "doch")) ; + SHaveNo p k = mkS (mkCl p.name have_V2 (mkNP no_Quant plNum k)) ; + SHaveNoMass p k = mkS (mkCl p.name have_V2 (mkNP no_Quant k)) ; + + lincat + Proposition, Action = Prop ; + oper + Prop = {pos : Cl ; neg : S} ; -- x F y ; x F nicht/kein y + mkProp : Cl -> S -> Prop = \pos,neg -> {pos = pos ; neg = neg} ; + prop : Cl -> Prop = \cl -> mkProp cl (mkS negativePol cl) ; + lin + Is i q = prop (mkCl i q) ; + IsMass m q = prop (mkCl (mkNP m) q) ; + SProp p = mkS p.pos ; + SPropNot p = p.neg ; + QProp p = mkQS (mkQCl p.pos) ; + + AHaveCurr p curr = prop (mkCl p.name have_V2 (mkNP aPl_Det curr)) ; + ACitizen p n = prop (mkCl p.name n) ; + ABePlace p place = prop (mkCl p.name place.at) ; + + AKnowSentence p s = prop (mkCl p.name Lexicon.know_VS s) ; + AKnowQuestion p s = prop (mkCl p.name Lexicon.know_VQ s) ; + AKnowPerson p q = prop (mkCl p.name Lexicon.know_V2 q.name) ; + + lincat + Nationality = {lang : CN ; country : NP ; prop : A} ; + LAnguage = CN ; -- kein Deutsch + +-- the new things + lin + ADoVerbPhrase p vp = prop (mkCl p.name vp) ; + AModVerbPhrase m p vp = prop (mkCl p.name (mkVP m vp)) ; + ADoVerbPhrasePlace p vp x = prop (mkCl p.name (mkVP vp x.at)) ; + AModVerbPhrasePlace m p vp x = prop (mkCl p.name (mkVP m (mkVP vp x.at))) ; + YouPlurPolMale, YouPlurPolFemale = mkPerson youPol_Pron ; +} diff --git a/testsuite/compiler/canonical/SentencesI.gf b/testsuite/compiler/canonical/SentencesI.gf new file mode 100644 index 000000000..913aa11ad --- /dev/null +++ b/testsuite/compiler/canonical/SentencesI.gf @@ -0,0 +1,302 @@ +--1 Implementation of MOLTO Phrasebook + +--2 The functor for (mostly) common structures + +incomplete concrete SentencesI of Sentences = Numeral ** + open + Syntax, + Lexicon, + Symbolic, -- for names as strings + Prelude + in { + lincat + Phrase = Text ; + Word = Text ; + Message = Text ; + Greeting = Text ; + Sentence = S ; + Question = QS ; + Proposition = Cl ; + Item = NP ; + Kind = CN ; + MassKind = CN ; + MassKind = CN ; + PlurKind = CN ; + DrinkKind = CN ; + Quality = AP ; + Property = A ; + Object = NP ; + PrimObject = NP ; + Place = NPPlace ; -- {name : NP ; at : Syntax.Adv ; to : Syntax.Adv} ; + PlaceKind = CNPlace ; -- {name : CN ; at : Prep ; to : Prep} ; + Currency = CN ; + Price = NP ; + Action = Cl ; + Person = NPPerson ; -- {name : NP ; isPron : Bool ; poss : Quant} ; + Nationality = NPNationality ; -- {lang : NP ; country : NP ; prop : A} ; + LAnguage = NP ; + Citizenship = A ; + Country = NP ; + Day = NPDay ; -- {name : NP ; point : Syntax.Adv ; habitual : Syntax.Adv} ; + Date = Syntax.Adv ; + Name = NP ; + Number = Card ; + ByTransport = Syntax.Adv ; + Transport = {name : CN ; by : Syntax.Adv} ; + Superlative = Det ; + lin + MPhrase p = p ; + MContinue p m = mkText p m ; + + PSentence s = mkText s | lin Text (mkUtt s) ; -- optional '.' + PQuestion s = mkText s | lin Text (mkUtt s) ; -- optional '?' + + PGreetingMale, PGreetingFemale = \g -> mkText (lin Phr (ss g.s)) exclMarkPunct | g ; + + -- PWord w = w ; + + PNumber x = mkSentence (mkUtt x) ; + PPrice x = mkSentence (mkUtt x) ; + + PObject x = mkPhrase (mkUtt x) ; + PKind x = mkPhrase (mkUtt x) ; + PMassKind x = mkPhrase (mkUtt x) ; + PQuality x = mkPhrase (mkUtt x) ; + PPlace x = mkPhrase (mkUtt x.name) ; + PPlaceKind x = mkPhrase (mkUtt x.name) ; + PCurrency x = mkPhrase (mkUtt x) ; + PLanguage x = mkPhrase (mkUtt x) ; + PCountry x = mkPhrase (mkUtt x) ; + PCitizenship x = mkPhrase (mkUtt (mkAP x)) ; + PDay d = mkPhrase (mkUtt d.name) ; + PTransport t = mkPhrase (mkUtt t.name) ; + PByTransport t = mkPhrase (mkUtt t) ; + + PYes = mkPhrase yes_Utt ; + PNo = mkPhrase no_Utt ; + PYesToNo = mkPhrase yes_Utt ; + + GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) please_Voc) | lin Text (mkUtt o) ; + + Is = mkCl ; + IsMass m q = mkCl (mkNP m) q ; + + SProp = mkS ; + SPropNot = mkS negativePol ; + QProp p = mkQS (mkQCl p) ; + + WherePlace place = mkQS (mkQCl where_IAdv place.name) ; + WherePerson person = mkQS (mkQCl where_IAdv person.name) ; + + PropAction a = a ; + + AmountCurrency num curr = mkNP num curr ; + + ObjItem i = i ; + ObjNumber n k = mkNP n k ; + ObjIndef k = mkNP a_Quant k ; + ObjPlural k = mkNP aPl_Det k ; + ObjPlur k = mkNP aPl_Det k ; + ObjMass k = mkNP k ; + ObjAndObj = mkNP and_Conj ; + OneObj o = o ; + + MassDrink d = d ; + DrinkNumber n k = mkNP n k ; + + This kind = mkNP this_Quant kind ; + That kind = mkNP that_Quant kind ; + These kind = mkNP this_Quant plNum kind ; + Those kind = mkNP that_Quant plNum kind ; + The kind = mkNP the_Quant kind ; + Thes kind = mkNP the_Quant plNum kind ; + ThisMass kind = mkNP this_Quant kind ; + ThatMass kind = mkNP that_Quant kind ; + TheMass kind = mkNP the_Quant kind ; + ThesePlur kind = mkNP this_Quant plNum kind ; + ThosePlur kind = mkNP that_Quant plNum kind ; + ThesPlur kind = mkNP the_Quant plNum kind ; + + SuchKind quality kind = mkCN quality kind ; + SuchMassKind quality kind = mkCN quality kind ; + Very property = mkAP very_AdA (mkAP property) ; + Too property = mkAP too_AdA (mkAP property) ; + PropQuality property = mkAP property ; + + ThePlace kind = let dd : Det = if_then_else Det kind.isPl thePl_Det theSg_Det + in placeNP dd kind ; + APlace kind = let dd : Det = if_then_else Det kind.isPl aPl_Det aSg_Det + in placeNP dd kind ; + + IMale, IFemale = mkPerson i_Pron ; + YouFamMale, YouFamFemale = mkPerson youSg_Pron ; + YouPolMale, YouPolFemale = mkPerson youPol_Pron ; + + LangNat n = n.lang ; + CitiNat n = n.prop ; + CountryNat n = n.country ; + PropCit c = c ; + + OnDay d = d.point ; + Today = today_Adv ; + + PersonName n = + {name = n ; isPron = False ; poss = mkQuant he_Pron} ; -- poss not used +---- NameString s = symb s ; --% + NameNN = symb "NN" ; + + NNumeral n = mkCard ; + + SHave p obj = mkS (mkCl p.name have_V2 obj) ; + SHaveNo p k = mkS negativePol (mkCl p.name have_V2 (mkNP aPl_Det k)) ; + SHaveNoMass p m = mkS negativePol (mkCl p.name have_V2 (mkNP m)) ; + QDoHave p obj = mkQS (mkQCl (mkCl p.name have_V2 obj)) ; + + AHaveCurr p curr = mkCl p.name have_V2 (mkNP aPl_Det curr) ; + ACitizen p n = mkCl p.name n ; + ABePlace p place = mkCl p.name place.at ; + ByTransp t = t.by ; + + AKnowSentence p s = mkCl p.name Lexicon.know_VS s ; + AKnowQuestion p s = mkCl p.name Lexicon.know_VQ s ; + AKnowPerson p q = mkCl p.name Lexicon.know_V2 q.name ; + +oper + +-- These operations are used internally in Sentences. + + mkPhrase : Utt -> Text = \u -> lin Text u ; -- no punctuation + mkGreeting : Str -> Text = \s -> lin Text (ss s) ; -- no punctuation + mkSentence : Utt -> Text = \t -> lin Text (postfixSS "." t | t) ; -- optional . + + mkPerson : Pron -> {name : NP ; isPron : Bool ; poss : Quant} = \p -> + {name = mkNP p ; isPron = True ; poss = mkQuant p} ; + +-- These are used in Words for each language. + + NPNationality : Type = {lang : NP ; country : NP ; prop : A} ; + + mkNPNationality : NP -> NP -> A -> NPNationality = \la,co,pro -> + {lang = la ; + country = co ; + prop = pro + } ; + + NPDay : Type = {name : NP ; point : Syntax.Adv ; habitual : Syntax.Adv} ; + + mkNPDay : NP -> Syntax.Adv -> Syntax.Adv -> NPDay = \d,p,h -> + {name = d ; + point = p ; + habitual = h + } ; + + NPPlace : Type = {name : NP ; at : Syntax.Adv ; to : Syntax.Adv} ; + CNPlace : Type = {name : CN ; at : Prep ; to : Prep; isPl : Bool} ; + + mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { + name = p ; + at = i ; + to = t ; + isPl = False + } ; + + mkCNPlacePl : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { + name = p ; + at = i ; + to = t ; + isPl = True + } ; + + placeNP : Det -> CNPlace -> NPPlace = \det,kind -> + let name : NP = mkNP det kind.name in { + name = name ; + at = Syntax.mkAdv kind.at name ; + to = Syntax.mkAdv kind.to name + } ; + + NPPerson : Type = {name : NP ; isPron : Bool ; poss : Quant} ; + + relativePerson : GNumber -> CN -> (Num -> NP -> CN -> NP) -> NPPerson -> NPPerson = + \n,x,f,p -> + let num = if_then_else Num n plNum sgNum in { + name = case p.isPron of { + True => mkNP p.poss num x ; + _ => f num p.name x + } ; + isPron = False ; + poss = mkQuant he_Pron -- not used because not pron + } ; + + GNumber : PType = Bool ; + sing = False ; plur = True ; + +-- for languages without GenNP, use "the wife of p" + mkRelative : Bool -> CN -> NPPerson -> NPPerson = \n,x,p -> + relativePerson n x + (\a,b,c -> mkNP (mkNP the_Quant a c) (Syntax.mkAdv possess_Prep b)) p ; + +-- for languages with GenNP, use "p's wife" +-- relativePerson n x (\a,b,c -> mkNP (GenNP b) a c) p ; + + phrasePlease : Utt -> Text = \u -> --- lin Text (mkPhr noPConj u please_Voc) | + lin Text u ; + +------------------------------------------------------------------------------------------ +-- New things added 30/11/2011 by AR +------------------------------------------------------------------------------------------ + + lincat + VerbPhrase = VP ; + Modality = VV ; + lin + ADoVerbPhrase p vp = mkCl p.name vp ; + AModVerbPhrase m p vp = mkCl p.name (mkVP m vp) ; + ADoVerbPhrasePlace p vp x = mkCl p.name (mkVP vp x.at) ; + AModVerbPhrasePlace m p vp x = mkCl p.name (mkVP m (mkVP vp x.at)) ; + + QWhereDoVerbPhrase p vp = mkQS (mkQCl where_IAdv (mkCl p.name vp)) ; + QWhereModVerbPhrase m p vp = mkQS (mkQCl where_IAdv (mkCl p.name (mkVP m vp))) ; + + MWant = want_VV ; + MCan = can_VV ; + MKnow = can8know_VV ; + MMust = must_VV ; + + VPlay = mkVP play_V ; + VRun = mkVP run_V ; + VSit = mkVP sit_V ; + VSleep = mkVP sleep_V ; + VSwim = mkVP swim_V ; + VWalk = mkVP walk_V ; + VSit = mkVP sit_V ; + VStop = mkVP stop_V ; + VDrink = mkVP ; + VEat = mkVP ; + VRead = mkVP ; + VWait = mkVP ; + VWrite = mkVP ; + + V2Buy o = mkVP buy_V2 o ; + V2Drink o = mkVP drink_V2 o ; + V2Eat o = mkVP eat_V2 o ; + V2Wait o = mkVP wait_V2 o.name ; + + PImperativeFamPos v = phrasePlease (mkUtt (mkImp v)) ; + PImperativeFamNeg v = phrasePlease (mkUtt negativePol (mkImp v)) ; + PImperativePolPos v = phrasePlease (mkUtt politeImpForm (mkImp v)) ; + PImperativePolNeg v = phrasePlease (mkUtt politeImpForm negativePol (mkImp v)) ; + PImperativePlurPos v = phrasePlease (mkUtt pluralImpForm (mkImp v)) ; + PImperativePlurNeg v = phrasePlease (mkUtt pluralImpForm negativePol (mkImp v)) ; + +-- other new things allowed by the resource + +--- PBecause a b = SSubjS a because_Subj b ; + + He = mkPerson he_Pron ; + She = mkPerson she_Pron ; + WeMale, WeFemale = mkPerson we_Pron ; + YouPlurFamMale, YouPlurFamFemale = mkPerson youPl_Pron ; + YouPlurPolMale, YouPlurPolFemale = mkPerson youPl_Pron ; + TheyMale, TheyFemale = mkPerson they_Pron ; + +} diff --git a/testsuite/compiler/canonical/Words.gf b/testsuite/compiler/canonical/Words.gf new file mode 100644 index 000000000..08704990a --- /dev/null +++ b/testsuite/compiler/canonical/Words.gf @@ -0,0 +1,254 @@ +--2 Words and idiomatic phrases of the Phrasebook + + +-- (c) 2010 Aarne Ranta under LGPL --% + +abstract Words = Sentences ** { + + fun + +-- kinds of items (so far mostly food stuff) + + Apple : Kind ; + Beer : DrinkKind ; + Bread : MassKind ; + Cheese : MassKind ; + Chicken : MassKind ; + Coffee : DrinkKind ; + Fish : MassKind ; + Meat : MassKind ; + Milk : MassKind ; + Pizza : Kind ; + Salt : MassKind ; + Tea : DrinkKind ; + Water : DrinkKind ; + Wine : DrinkKind ; + +-- properties of kinds (so far mostly of food) + + Bad : Property ; + Boring : Property ; + Cheap : Property ; + Cold : Property ; + Delicious : Property ; + Expensive : Property ; + Fresh : Property ; + Good : Property ; + Suspect : Property ; + Warm : Property ; + +-- kinds of places + + Airport : PlaceKind ; + AmusementPark : PlaceKind ; + Bank : PlaceKind ; + Bar : PlaceKind ; + Cafeteria : PlaceKind ; + Center : PlaceKind ; + Cinema : PlaceKind ; + Church : PlaceKind ; + Disco : PlaceKind ; + Hospital : PlaceKind ; + Hotel : PlaceKind ; + Museum : PlaceKind ; + Park : PlaceKind ; + Parking : PlaceKind ; + Pharmacy : PlaceKind ; + PostOffice : PlaceKind ; + Pub : PlaceKind ; + Restaurant : PlaceKind ; + School : PlaceKind ; + Shop : PlaceKind ; + Station : PlaceKind ; + Supermarket : PlaceKind ; + Theatre : PlaceKind ; + Toilet : PlaceKind ; + University : PlaceKind ; + Zoo : PlaceKind ; + + CitRestaurant : Citizenship -> PlaceKind ; + +-- currency units + + DanishCrown : Currency ; + Dollar : Currency ; + Euro : Currency ; -- Germany, France, Italy, Finland, Spain, The Netherlands + Lei : Currency ; -- Romania + Leva : Currency ; -- Bulgaria + NorwegianCrown : Currency ; + Pound : Currency ; -- UK + Rouble : Currency ; -- Russia + Rupee : Currency ; -- India + SwedishCrown : Currency ; + Zloty : Currency ; -- Poland + Yuan : Currency ; -- China + + +-- nationalities, countries, languages, citizenships + + Belgian : Citizenship ; + Belgium : Country ; + Bulgarian : Nationality ; + Catalan : Nationality ; + Chinese : Nationality ; + Danish : Nationality ; + Dutch : Nationality ; + English : Nationality ; + Finnish : Nationality ; + Flemish : LAnguage ; + French : Nationality ; + German : Nationality ; + Hindi : LAnguage ; + India : Country ; + Indian : Citizenship ; + Italian : Nationality ; + Norwegian : Nationality ; + Polish : Nationality ; + Romanian : Nationality ; + Russian : Nationality ; + Spanish : Nationality ; + Swedish : Nationality ; + +-- means of transportation + + Bike : Transport ; + Bus : Transport ; + Car : Transport ; + Ferry : Transport ; + Plane : Transport ; + Subway : Transport ; + Taxi : Transport ; + Train : Transport ; + Tram : Transport ; + + ByFoot : ByTransport ; + + +-- Actions (which can be expressed by different structures in different languages). +-- Notice that also negations and questions can be formed from these. + + AHasAge : Person -> Number -> Action ; -- I am seventy years + AHasChildren: Person -> Number -> Action ; -- I have six children + AHasName : Person -> Name -> Action ; -- my name is Bond + AHasRoom : Person -> Number -> Action ; -- you have a room for five persons + AHasTable : Person -> Number -> Action ; -- you have a table for five persons + AHungry : Person -> Action ; -- I am hungry + AIll : Person -> Action ; -- I am ill + AKnow : Person -> Action ; -- I (don't) know + ALike : Person -> Item -> Action ; -- I like this pizza + ALive : Person -> Country -> Action ; -- I live in Sweden + ALove : Person -> Person -> Action ; -- I love you + AMarried : Person -> Action ; -- I am married + AReady : Person -> Action ; -- I am ready + AScared : Person -> Action ; -- I am scared + ASpeak : Person -> LAnguage -> Action ; -- I speak Finnish + AThirsty : Person -> Action ; -- I am thirsty + ATired : Person -> Action ; -- I am tired + AUnderstand : Person -> Action ; -- I (don't) understand + AWant : Person -> Object -> Action ; -- I want two apples + AWantGo : Person -> Place -> Action ; -- I want to go to the hospital + +-- Miscellaneous phrases. Notice that also negations and questions can be formed from +-- propositions. + + QWhatAge : Person -> Question ; -- how old are you + QWhatName : Person -> Question ; -- what is your name + HowMuchCost : Item -> Question ; -- how much does the pizza cost + ItCost : Item -> Price -> Proposition ; -- the pizza costs five euros + + PropOpen : Place -> Proposition ; -- the museum is open + PropClosed : Place -> Proposition ; -- the museum is closed + PropOpenDate : Place -> Date -> Proposition ; -- the museum is open today + PropClosedDate : Place -> Date -> Proposition ; -- the museum is closed today + PropOpenDay : Place -> Day -> Proposition ; -- the museum is open on Mondays + PropClosedDay : Place -> Day -> Proposition ; -- the museum is closed on Mondays + + PSeeYouPlaceDate : Place -> Date -> Greeting ; -- see you in the bar on Monday + PSeeYouPlace : Place -> Greeting ; -- see you in the bar + PSeeYouDate : Date -> Greeting ; -- see you on Monday + +-- family relations + + Wife, Husband : Person -> Person ; -- my wife, your husband + Son, Daughter : Person -> Person ; -- my son, your husband + Children : Person -> Person ; -- my children + +-- week days + + Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday : Day ; + + Tomorrow : Date ; + +-- transports + + HowFar : Place -> Question ; -- how far is the zoo ? + HowFarFrom : Place -> Place -> Question ; -- how far is the center from the hotel ? + HowFarFromBy : Place -> Place -> ByTransport -> Question ; + -- how far is the airport from the hotel by taxi ? + HowFarBy : Place -> ByTransport -> Question ; -- how far is the museum by bus ? + + WhichTranspPlace : Transport -> Place -> Question ; -- which bus goes to the hotel + IsTranspPlace : Transport -> Place -> Question ; -- is there a metro to the airport ? + +-- modifiers of places + + TheBest : Superlative ; + TheClosest : Superlative ; + TheCheapest : Superlative ; + TheMostExpensive : Superlative ; + TheMostPopular : Superlative ; + TheWorst : Superlative ; + + SuperlPlace : Superlative -> PlaceKind -> Place ; -- the best bar + + +-------------------------------------------------- +-- New 30/11/2011 AR +-------------------------------------------------- +{- 28/8/2012 still only available in Bul Eng Fin Swe Tha + + fun + Thai : Nationality ; + Baht : Currency ; -- Thailand + + Rice : MassKind ; + Pork : MassKind ; + Beef : MassKind ; + Noodles : PlurKind ; + Shrimps : PlurKind ; + + Chili : MassKind ; + Garlic : MassKind ; + + Durian : Kind ; + Mango : Kind ; + Pineapple : Kind ; + Egg : Kind ; + + Coke : DrinkKind ; + IceCream : DrinkKind ; --- both mass and plural + OrangeJuice : DrinkKind ; + Lemonade : DrinkKind ; + Salad : DrinkKind ; + + Beach : PlaceKind ; + + ItsRaining : Proposition ; + ItsWindy : Proposition ; + ItsWarm : Proposition ; + ItsCold : Proposition ; + SunShine : Proposition ; + + Smoke : VerbPhrase ; + + ADoctor : Person -> Action ; + AProfessor : Person -> Action ; + ALawyer : Person -> Action ; + AEngineer : Person -> Action ; + ATeacher : Person -> Action ; + ACook : Person -> Action ; + AStudent : Person -> Action ; + ABusinessman : Person -> Action ; +-} + +} diff --git a/testsuite/compiler/canonical/WordsBul.gf b/testsuite/compiler/canonical/WordsBul.gf new file mode 100644 index 000000000..527b3604a --- /dev/null +++ b/testsuite/compiler/canonical/WordsBul.gf @@ -0,0 +1,305 @@ +--2 Implementations of Words, with English as example + +concrete WordsBul of Words = SentencesBul ** + open + SyntaxBul, + (R = ResBul), + ParadigmsBul, + (L = LexiconBul), + (P = ParadigmsBul), + ExtraBul, + MorphoFunsBul, + Prelude in { + + flags + coding=utf8; + + lin + +-- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. + + Apple = mkCN L.apple_N ; + Beer = mkCN L.beer_N ; + Bread = mkCN L.bread_N ; + Cheese = mkCN (mkN066 "сирене") ; + Chicken = mkCN (mkN065 "пиле") ; + Coffee = mkCN (mkN065 "кафе") ; + Fish = mkCN L.fish_N ; + Meat = mkCN (mkN054 "месо") ; + Milk = mkCN L.milk_N ; + Pizza = mkCN (mkN041 "пица") ; + Salt = mkCN L.salt_N ; + Tea = mkCN (mkN028 "чай") ; + Water = mkCN L.water_N ; + Wine = mkCN L.wine_N ; + +-- Properties; many of them are in the resource lexicon, others can be built by $mkA$. + + Bad = L.bad_A ; + Boring = mkA079 "еднообразен" ; + Cheap = mkA076 "евтин" ; + Cold = L.cold_A ; + Delicious = mkA079 "превъзходен" ; + Expensive = mkA076 "скъп" ; + Fresh = mkA076 "свеж" ; + Good = L.good_A ; + Suspect = mkA079 "подозрителен" ; + Warm = L.warm_A ; + +-- Places require different prepositions to express location; in some languages +-- also the directional preposition varies, but in English we use $to$, as +-- defined by $mkPlace$. + + Airport = mkPlace (mkN066 "летище") na_Prep ; + AmusementPark = mkCompoundPlace (mkA079 "увеселителен") (mkN001 "парк") in_Prep ; + Bank = mkPlace (mkN041 "банка") in_Prep ; + Bar = mkPlace (mkN001 "бар") in_Prep ; + Cafeteria = mkPlace (mkN065 "кафе") in_Prep ; + Center = mkPlace (mkN009a "център") in_Prep ; + Cinema = mkPlace (mkN054 "кино") na_Prep ; + Church = mkPlace (mkN041 "църква") in_Prep ; + Disco = mkPlace (mkN041 "дискотека") in_Prep ; + Hospital = mkPlace (mkN041 "болница") in_Prep ; + Hotel = mkPlace (mkN007 "хотел") in_Prep ; + Museum = mkPlace (mkN032 "музей") in_Prep ; + Park = mkPlace (mkN001 "парк") in_Prep ; + Parking = mkPlace (mkN007 "паркинг") na_Prep ; + Pharmacy = mkPlace (mkN041 "аптека") in_Prep ; + PostOffice = mkPlace (mkN041 "поща") in_Prep ; + Pub = mkPlace (mkN001 "бар") in_Prep ; + Restaurant = mkPlace (mkN007 "ресторант") in_Prep ; + School = mkPlace (mkN007 "училище") in_Prep ; + Shop = mkPlace (mkN007 "магазин") in_Prep ; + Station = mkPlace (mkN041 "гара") na_Prep ; + Supermarket = mkPlace (mkN007 "супермаркет") in_Prep ; + Theatre = mkPlace (mkN009 "театър") na_Prep ; + Toilet = mkPlace (mkN041 "тоалетна") in_Prep ; + University = mkPlace (mkN007 "университет") in_Prep ; + Zoo = mkPlace (mkN001 "зоопарк") in_Prep ; + + CitRestaurant cit = mkCNPlace (mkCN cit.s2 (mkN007 "ресторант")) in_Prep to_Prep ; + +-- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. + + DanishCrown = mkCN (mkA078 "датски") (mkN041 "крона") | mkCN (mkN041 "крона") ; + Dollar = mkCN (mkN007 "долар") ; + Euro = mkCN (mkN054 "евро") ; + Lei = mkCN (mkN047 "лея") ; + Leva = mkCN (mkN001 "лев") ; + NorwegianCrown = mkCN (mkA078 "норвежки") (mkN041 "крона") | mkCN (mkN041 "крона") ; + Pound = mkCN (mkN007 "паунд") ; + Rouble = mkCN (mkN041 "рубла") ; + SwedishCrown = mkCN (mkA078 "шведски") (mkN041 "крона") | mkCN (mkN041 "крона") ; + Zloty = mkCN (mkN041 "злота") ; + Baht = mkCN (mkN007a "бат") ; + +-- Nationalities + + Belgian = mkCitizenship (mkN013 "белгиец") (mkN041 "белгийка") (mkA078 "белгийски") ; + Belgium = mkPN "Белгия" R.Fem ; + Bulgarian = mkNat (mkN018 "българин") (mkN041 "българка") (mkA078 "български") (mkPN "България" R.Fem) ; + Catalan = mkNat (mkN008a "каталонец") (mkN041 "каталонка") (mkA078 "каталонски") (mkPN "Каталуния" R.Fem) ; + Danish = mkNat (mkN018 "датчанин") (mkN041 "датчанка") (mkA078 "датски") (mkPN "Дания" R.Fem) ; + Dutch = mkNat (mkN008a "холандец") (mkN041 "холандка") (mkA078 "холандски") (mkPN "Холандия" R.Fem) ; + English = mkNat (mkN018 "англичанин") (mkN041 "англичанка") (mkA078 "английски") (mkPN "Англия" R.Fem) ; + Finnish = mkNat (mkN008a "финландец") (mkN041 "финландка") (mkA078 "финландски") (mkPN "Финландия" R.Fem) ; + Flemish = mkA078 "фламандски" ; + French = mkNat (mkN018 "французин") (mkN041 "французойка") (mkA078 "френски") (mkPN "Франция" R.Fem) ; + German = mkNat (mkN008a "германец") (mkN041 "германка") (mkA078 "немски") (mkPN "Германия" R.Fem) ; + Italian = mkNat (mkN008a "италианец") (mkN041 "италианка") (mkA078 "италиански") (mkPN "Италия" R.Fem) ; + Norwegian = mkNat (mkN008a "норвежец") (mkN041 "норвежка") (mkA078 "норвежки") (mkPN "Норвегия" R.Fem) ; + Polish = mkNat (mkN014 "поляк") (mkN047 "полякиня") (mkA078 "полски") (mkPN "Полша" R.Fem) ; + Romanian = mkNat (mkN008a "румънец") (mkN041 "румънка") (mkA078 "румънски") (mkPN "Румъния" R.Fem) ; + Russian = mkNat (mkN014 "руснак") (mkN047 "рускиня") (mkA078 "руски") (mkPN "Русия" R.Fem) ; + Swedish = mkNat (mkN007 "швед") (mkN041 "шведка") (mkA078 "шведски") (mkPN "Швеция" R.Fem) ; + Spanish = mkNat (mkN008a "испанец") (mkN041 "испанка") (mkA078 "испански") (mkPN "Испания" R.Fem) ; + Thai = mkNat (mkN008a "тайландец") (mkN041 "тайландка") (mkA078 "тайландски") (mkPN "Тайланд" R.Masc) ; + +-- Means of transportation + + Bike = mkTransport L.bike_N ; + Bus = mkTransport (mkN007 "автобус") ; + Car = mkTransport L.car_N ; + Ferry = mkTransport (mkN007 "ферибот") ; + Plane = mkTransport (mkN007 "самолет") ; + Subway = mkTransport (mkN054 "метро") ; + Taxi = mkTransport (mkN073 "такси") ; + Train = mkTransport (mkN001 "влак") ; + Tram = mkTransport (mkN032 "трамвай") ; + + ByFoot = P.mkAdv "пеша" ; + +-- Actions: the predication patterns are very often language-dependent. + + AHasAge p num = mkCl p.name (SyntaxBul.mkAdv na_Prep (mkNP num L.year_N)) ; + AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; + AHasRoom p num = mkCl p.name have_V2 (mkNP (mkNP a_Det (mkN047 "стая")) (SyntaxBul.mkAdv (mkPrep "за" R.Acc) (mkNP num (mkN014 "човек")))) ; + AHasTable p num = mkCl p.name have_V2 (mkNP (mkNP a_Det (mkN041 "маса")) (SyntaxBul.mkAdv (mkPrep "за" R.Acc) (mkNP num (mkN014 "човек")))) ; + AHasName p name = mkCl p.name (dirV2 (medialV (actionV (mkV186 "казвам") (mkV156 "кажа")) R.Acc)) name ; + AHungry p = mkCl p.name (mkA079 "гладен") ; + AIll p = mkCl p.name (mkA079 "болен") ; + AKnow p = mkCl p.name (actionV (mkV186 "знам") (mkV162 "зная")) ; + ALike p item = mkCl p.name (dirV2 (actionV (mkV186 "харесвам") (mkV186 "харесам"))) item ; + ALive p co = mkCl p.name (mkVP (mkVP (stateV (mkV160 "живея"))) (SyntaxBul.mkAdv in_Prep (mkNP co))) ; + ALove p q = mkCl p.name (dirV2 (actionV (mkV186 "обичам") (mkV152 "обикна"))) q.name ; + AMarried p = mkCl p.name (mkA076 (case p.name.gn of { + R.GSg R.Fem => "омъжен" ; + _ => "женен" + })) ; + AReady p = mkCl p.name (mkA076 "готов") ; + AScared p = mkCl p.name (mkA076 "уплашен") ; + ASpeak p lang = mkCl p.name (dirV2 (stateV (mkV173 "говоря"))) (mkNP (substantiveN lang (R.AMasc R.NonHuman))) ; + AThirsty p = mkCl p.name (mkA079 "жаден") ; + ATired p = mkCl p.name (mkA076 "уморен") ; + AUnderstand p = mkCl p.name (actionV (mkV186 "разбирам") (mkV170 "разбера")) ; + AWant p obj = mkCl p.name (dirV2 (stateV (mkV186 "искам"))) obj ; + AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (actionV (mkV186 "отивам") (mkV146 "отида"))) place.to) ; + +-- miscellaneous + + QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (medialV (actionV (mkV186 "казвам") (mkV156 "кажа")) R.Acc))) ; + QWhatAge p = mkQS (mkQCl (MorphoFunsBul.mkIAdv "на колко") (mkCl p.name (mkNP a_Quant plNum L.year_N))) ; + HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (stateV (mkV186 "струвам")))) ; + ItCost item price = mkCl item (dirV2 (stateV (mkV186 "струвам"))) price ; + + PropOpen p = mkCl p.name open_AP ; + PropClosed p = mkCl p.name closed_AP ; + PropOpenDate p d = mkCl p.name (mkVP (mkVP open_AP) d) ; + PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_AP) d) ; + PropOpenDay p d = mkCl p.name (mkVP (mkVP open_AP) d.habitual) ; + PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_AP) d.habitual) ; + +-- Building phrases from strings is complicated: the solution is to use +-- mkText : Text -> Text -> Text ; + + PSeeYouDate d = mkText (lin Text (ss ("ще се видим"))) (mkPhrase (mkUtt d)) ; + PSeeYouPlace p = mkText (lin Text (ss ("ще се видим"))) (mkPhrase (mkUtt p.at)) ; + PSeeYouPlaceDate p d = + mkText (lin Text (ss ("ще се видим"))) + (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; + +-- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ +-- below. Languages without productive genitives must use an equivalent of +-- "the wife of my son" for non-pronouns. + + Wife = xOf sing (mkN041 "съпруга") ; + Husband = xOf sing (mkN015 "съпруг") ; + Son = xOf sing (mkN018 "син") ; + Daughter = xOf sing (mkN047 "дъщеря") ; + Children = xOf plur L.child_N ; + +-- week days + + Monday = mkDay (mkN014 "понеделник") ; + Tuesday = mkDay (mkN014 "вторник") ; + Wednesday = mkDay (mkN043 "сряда") ; + Thursday = mkDay (mkN014 "четвъртък") ; + Friday = mkDay (mkN014 "петък") ; + Saturday = mkDay (mkN041 "събота") ; + Sunday = mkDay (mkN047 "неделя") ; + + Tomorrow = P.mkAdv "утре" ; + +-- modifiers of places + + TheBest = mkSuperl L.good_A ; + TheClosest = mkSuperl L.near_A ; + TheCheapest = mkSuperl (mkA076 "евтин") ; + TheMostExpensive = mkSuperl (mkA076 "скъп") ; + TheMostPopular = mkSuperl (mkA079 "известен") ; + TheWorst = mkSuperl L.bad_A ; + + SuperlPlace sup p = placeNP sup p ; + + +-- transports + + HowFar place = mkQS (mkQCl far_IAdv place.name) ; + HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxBul.mkAdv from_Prep x.name))) ; + HowFarFromBy x y t = + mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxBul.mkAdv from_Prep x.name)) t)) ; + HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; + + WhichTranspPlace trans place = + mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; + + IsTranspPlace trans place = + mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; + + Rice = mkCN (mkN040a "ориз") ; + Pork = mkCN (mkN054 "свинско") ; + Beef = mkCN (mkN054 "телешко") ; + Egg = mkCN (mkN066 "яйце") ; + Noodles = mkCN (mkN075 "спагети") ; + Shrimps = mkCN (mkN041 "скарида") ; + Chili = mkCN (mkN065 "чили") ; + Garlic = mkCN (mkN007 "чесън") ; + Durian = mkCN (mkN007 "дуриан") ; + Mango = mkCN (mkN065 "манго") ; + Pineapple = mkCN (mkN007 "ананас") ; + Coke = mkCN (mkN041 "кола") ; + IceCream = mkCN (mkN007 "сладолед") ; + Salad = mkCN (mkN041 "салата") ; + OrangeJuice = mkCN (mkA076 "портокалов") (mkN001 "сок") ; + Lemonade = mkCN (mkN041 "лимонада") ; + + Beach = mkPlace (mkN001 "плаж") na_Prep ; + + ItsRaining = mkCl (mkVP (stateV (mkV174 "валя"))) ; + ItsCold = mkCl (mkVP (mkA076 "студен")) ; + ItsWarm = mkCl (mkVP (mkA080 "топъл")) ; + ItsWindy = mkCl (mkVP (mkA076 "ветровит")) ; + SunShine = mkCl (progressiveVP (mkVP (actionV (mkV186 "пеквам") (mkV148 "пека")))) ; + + Smoke = mkVP (stateV (mkV176 "пуша")) ; + + ADoctor = mkProfession (mkN007a "доктор") ; + AProfessor = mkProfession (mkN007a "професор") ; + ALawyer = mkProfession (mkN007a "адвокат") ; + AEngineer = mkProfession (mkN007a "инженер") ; + ATeacher = mkProfession (mkN031a "учител") ; + ACook = mkProfession (mkN007b "готвач") ; + AStudent = mkProfession (mkN007a "студент") ; + ABusinessman = mkProfession (mkN007a "бизнесмен") ; + +-- auxiliaries + + oper + mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; + + mkCitizenship : N -> N -> A -> Citizenship + = \male, female, adj -> lin Citizenship {s1 = table {R.Fem => female.s; _ => male.s}; s2 = adj} ; + + mkNat : N -> N -> A -> PN -> Nationality + = \male, female, adj, country -> lin Nationality {s1 = table {R.Fem => female.s; _ => male.s}; s2 = adj; s3 = country} ; + + mkDay : N -> {name : NP ; point : Adv ; habitual : Adv} = \d -> + let day : NP = mkNP d ; + in mkNPDay day + (SyntaxBul.mkAdv in_Prep day) + (SyntaxBul.mkAdv in_Prep (mkNP the_Quant plNum (mkCN d))) ; + + mkCompoundPlace : A -> N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \a, n, p -> + mkCNPlace (mkCN a n) p to_Prep ; + + mkPlace : N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \n,p -> + mkCNPlace (mkCN n) p to_Prep ; + + open_AP = mkAP (mkA076 "отворен") ; + closed_AP = mkAP (mkA076 "затворен") ; + + xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> + relativePerson n (mkCN x) (\a,b,c -> mkNP (mkNP the_Quant a c) (SyntaxBul.mkAdv (mkPrep "" R.Dat) b)) p ; + + mkTransport : N -> {name : CN ; by : Adv} = \n -> { + name = mkCN n ; + by = SyntaxBul.mkAdv with_Prep (mkNP n) + } ; + + mkSuperl : A -> Det = \a -> SyntaxBul.mkDet the_Art (SyntaxBul.mkOrd a) ; + + far_IAdv = ExtraBul.IAdvAdv (ss "далече") ; + + na_Prep = mkPrep "на" R.Acc ; + +} diff --git a/testsuite/compiler/canonical/WordsGer.gf b/testsuite/compiler/canonical/WordsGer.gf new file mode 100644 index 000000000..4984eb080 --- /dev/null +++ b/testsuite/compiler/canonical/WordsGer.gf @@ -0,0 +1,262 @@ +-- (c) 2009 Aarne Ranta under LGPL +--# -coding=latin1 + +concrete WordsGer of Words = SentencesGer ** + open SyntaxGer, ParadigmsGer, IrregGer, (L = LexiconGer), ExtraGer, Prelude in { + + lin + +-- kinds of food + + Apple = mkCN L.apple_N ; + Beer = mkCN L.beer_N ; + Bread = mkCN L.bread_N ; + Cheese = mkCN (mkN "Kse" "Kse" "Kse" "Kse" "Kse" "Kse" masculine) ; + Chicken = mkCN (mkN "Huhn" "Huhn" "Huhn" "Huhn" "Hhner" "Hhner" neuter) ; + Coffee = mkCN (mkN "Kaffee" "Kaffee" "Kaffee" "Kaffee" "Kaffees" "Kaffee" masculine) ; + Fish = mkCN L.fish_N ; + Meat = mkCN (mkN "Fleisch" "Fleisch" "Fleisch" "Fleisch" "Fleisch" "Fleisch" neuter) ; + Milk = mkCN L.milk_N ; + Pizza = mkCN (mkN "Pizza" "Pizzen" feminine) ; + Salt = mkCN L.salt_N ; + Tea = mkCN (mkN "Tee" "Tee" "Tee" "Tee" "Tees" "Tees" masculine) ; + Water = mkCN L.water_N ; + Wine = mkCN L.wine_N ; + +-- properties + + Bad = L.bad_A ; + Cheap = mkA "billig" ; + Boring = mkA "langweilig" ; + Cold = L.cold_A ; + Delicious = mkA "lecker" ; + Expensive = mkA "teuer" ; + Fresh = mkA "frisch" ; + Good = L.good_A ; + Warm = L.warm_A ; + Suspect = mkA "verdchtig" ; + +-- places + + Airport = mkPlace (mkN "Flughafen" "Flughfen" masculine) on_Prep zu_Prep ; + Church = mkPlace (mkN "Kirche") in_Prep inAcc_Prep ; + Hospital = mkPlace (mkN "Krankenhaus" "Krankenhuser" neuter) in_Prep inAcc_Prep ; + Restaurant = mkPlace (mkN "Restaurant" "Restaurants" neuter) in_Prep inAcc_Prep ; + Station = mkPlace (mkN "Bahnhof" "Bahnhfe" masculine) on_Prep zu_Prep ; + University = mkPlace (mkN "Universitt" "Universitten" feminine) in_Prep zu_Prep ; + + AmusementPark = mkPlace (mkN "Vergngungspark" "Vergngungspark" "Vergngungspark" "Vergngungspark" "Vergngungsparks" "Vergngungsparks" masculine) in_Prep inAcc_Prep ; + Bank = mkPlace (mkN "Bank" "Bank" "Bank" "Bank" "Banken" "Banken" feminine) in_Prep zu_Prep ; + Bar = mkPlace (mkN "Bar" "Bar" "Bar" "Bar" "Bars" "Bars" feminine) in_Prep inAcc_Prep ; + Cafeteria = mkPlace (mkN "Cafeteria" "Cafeteria" "Cafeteria" "Cafeteria" "Cafeterien" "Cafeterien" feminine) in_Prep inAcc_Prep ; + Center = mkPlace (mkN "Zentrum" "Zentrum" "Zentrum" "Zentrum" "Zentren" "Zentren" neuter) in_Prep zu_Prep ; + Cinema = mkPlace (mkN "Kino" "Kino" "Kino" "Kino" "Kinos" "Kinos" neuter) in_Prep inAcc_Prep ; + Disco = mkPlace (mkN "Disco" "Disco" "Disco" "Disco" "Discos" "Discos" feminine) in_Prep inAcc_Prep ; + Hotel = mkPlace (mkN "Hotel" "Hotel" "Hotel" "Hotel" "Hotels" "Hotels" neuter) in_Prep inAcc_Prep ; + Museum = mkPlace (mkN "Museum" "Museum" "Museum" "Museum" "Museen" "Museen" neuter) in_Prep inAcc_Prep ; + Park = mkPlace (mkN "Park" "Park" "Park" "Park" "Parks" "Parks" masculine) in_Prep inAcc_Prep ; + Parking = mkPlace (mkN "Parkplatz" "Parkplatz" "Parkplatz" "Parkplatz" "Parkplatzen" "Parkplatzen" masculine) on_Prep zu_Prep ; + Pharmacy = mkPlace (mkN "Apotheke" "Apotheke" "Apotheke" "Apotheke" "Apotheken" "Apotheken" feminine) in_Prep zu_Prep ; + PostOffice = mkPlace (mkN "Post" "Post" "Post" "Post" "Posten" "Posten" feminine) in_Prep inAcc_Prep ; + Pub = mkPlace (mkN "Kneipe" "Kneipe" "Kneipe" "Kneipe" "Kneipen" "Kneipen" feminine) in_Prep inAcc_Prep; + School = mkPlace (mkN "Schule" "Schule" "Schule" "Schule" "Schulen" "Schule" feminine) in_Prep inAcc_Prep ; + Shop = mkPlace (mkN "Geschft" "Geschft" "Geschft" "Geschft" "Geschfte" "Geschfte" neuter) in_Prep inAcc_Prep ; + Supermarket = mkPlace (mkN "Supermarkt" "Supermarkt" "Supermarkt" "Supermarkt" "Supermrkten" "Supermrkte" masculine) in_Prep inAcc_Prep ; + Theatre = mkPlace (mkN "Theater" "Theater" "Theater" "Theaters" "Theatern" "Thaters" neuter) in_Prep inAcc_Prep ; + Toilet = mkPlace (mkN "Toilette" "Toilette" "Toilette" "Toilette" "Toiletten" "Toiletten" feminine) in_Prep (mkPrep "auf" accusative) ; + Zoo = mkPlace (mkN "Zoo" "Zoo" "Zoo" "Zoo" "Zoos" "Zoos" masculine) in_Prep inAcc_Prep ; + + +CitRestaurant cit = mkCNPlace (mkCN cit (mkN "Restaurant" "Restaurants" neuter)) in_Prep inAcc_Prep ; + + +-- currencies + + DanishCrown = mkCN (mkA "Dnisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; + Dollar = mkCN (mkN "Dollar" "Dollar" "Dollar" "Dollar" "Dollar" "Dollar" masculine) ; + Euro = mkCN (mkN "Euro" "Euro" "Euro" "Euro" "Euro" "Euro" neuter) ; + Lei = mkCN (mkN "Leu" "Leu" "Leu" "Leu" "Lei" "Lei" masculine) ; + SwedishCrown = mkCN (mkA "Schwedisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; + Leva = mkCN (mkN "Lewa" "Lewa" "Lewa" "Lewa" "Lewa" "Lewa" feminine); + NorwegianCrown = mkCN (mkA "Norwegisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; + Pound = mkCN (mkN "Pfund" "Pfund" "Pfund" "Pfund" "Pfund" "Pfund" neuter) ; + Rouble = mkCN (mkN "Rubel" "Rubel" "Rubel" "Rubel" "Rubels" "Rubels" masculine); + Zloty = mkCN (mkN "Zloty" "Zloty" "Zloty" "Zloty" "Zloty" "Zloty" masculine); + + + +-- nationalities + + Belgian = mkA "belgisch" ; + Belgium = mkNP (mkPN "Belgien") ; + Bulgarian = mkNat "Bulgarien" "Bulgarisch" "bulgarisch" ; + Catalan = mkNat "Katalonien" "Katalanisch" "katalanisch" ; + Danish = mkNat "Dnemark" "Dnisch" "dnisch" ; + Dutch = mkNat "den Niederlanden" "Niederlndisch" "niederlndisch" ; + English = mkNat "England" "Englisch" "englisch" ; + Finnish = mkNat "Finnland" "Finnisch" "finnisch" ; + Flemish = mkCN (mkN "Flmisch" "Flmisch" neuter) ; + French = mkNat "Frankreich" "Franzsisch" "franzsisch" ; + German = mkNat "Deutschland" "Deutsch" "deutsche" ; + Italian = mkNat "Italien" "Italienisch" "italienisch" ; + Norwegian = mkNat "Norwegen" "Norwegisch" "norwegisch" ; + Polish = mkNat "Polen" "Polnisch" "polnisch" ; + Romanian = mkNat "Rumnien" "Rumnisch" "rumnisch" ; + Russian = mkNat "Russland" "Russisch" "russisch" ; + Spanish = mkNat "Spanien" "Spanisch" "spanisch" ; + Swedish = mkNat "Schweden" "Schwedisch" "schwedisch" ; + + + +-- actions + + AHasAge p num = prop (mkCl p.name (mkNP num L.year_N)) ; + AHasName p name = prop (mkCl p.name (mkV2 heien_V) name) ; + AHungry p = prop (mkCl p.name (mkA "hungrig")) ; + AHasChildren p num = prop (mkCl p.name have_V2 (mkNP num L.child_N)) ; + AHasRoom p num = prop (mkCl p.name have_V2 + (mkNP (mkNP a_Det (mkN "Zimmer" "Zimmer" neuter)) + (SyntaxGer.mkAdv for_Prep (mkNP num (mkN "Persone"))))) ; + AHasTable p num = prop (mkCl p.name have_V2 + (mkNP (mkNP a_Det (mkN "Tisch")) + (SyntaxGer.mkAdv for_Prep (mkNP num (mkN "Persone"))))) ; + AIll p = prop (mkCl p.name (mkA "krank")) ; + AKnow p = prop (mkCl p.name wissen_V) ; + ALike p item = prop (mkCl p.name (mkV2 mgen_V) item) ; + ALive p co = prop (mkCl p.name (mkVP (mkVP (mkV "wohnen")) (SyntaxGer.mkAdv in_Prep co))) ; + ALove p q = prop (mkCl p.name (mkV2 (mkV "lieben")) q.name) ; + AMarried p = prop (mkCl p.name (mkA "verheiratet")) ; + AReady p = prop (mkCl p.name (mkA "bereit")) ; + AScared p = prop (mkCl p.name have_V2 (mkNP (mkN "Angst" "Angsten" feminine))) ; + ASpeak p lang = mkProp (mkCl p.name (mkV2 sprechen_V) (mkNP lang)) + (mkS (mkCl p.name (mkV2 sprechen_V) (mkNP no_Quant lang))) ; + AThirsty p = prop (mkCl p.name (mkA "durstig")) ; + ATired p = prop (mkCl p.name (mkA "mde")) ; + AUnderstand p = prop (mkCl p.name (fixprefixV "ver" stehen_V)) ; + AWant p obj = prop (mkCl p.name want_VV (mkVP have_V2 obj)) ; + AWantGo p place = prop (mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to)) ; + +-- miscellaneous + + QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name heien_V)) ; + QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; + + PropOpen p = prop (mkCl p.name open_Adv) ; + PropClosed p = prop (mkCl p.name closed_Adv) ; + PropOpenDate p d = prop (mkCl p.name (mkVP (mkVP d) open_Adv)) ; + PropClosedDate p d = prop (mkCl p.name (mkVP (mkVP d) closed_Adv)) ; + PropOpenDay p d = prop (mkCl p.name (mkVP (mkVP d.habitual) open_Adv)) ; + PropClosedDay p d = prop (mkCl p.name (mkVP (mkVP d.habitual) closed_Adv)) ; + + HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "kosten"))) ; + ItCost item price = prop (mkCl item (mkV2 (mkV "kosten")) price) ; + +-- Building phrases from strings is complicated: the solution is to use +-- mkText : Text -> Text -> Text ; + + PSeeYouDate d = mkText (lin Text (ss ("wir sehen uns"))) (mkPhrase (mkUtt d)) ; + PSeeYouPlace p = mkText (lin Text (ss ("wir sehen uns"))) (mkPhrase (mkUtt p.at)) ; + PSeeYouPlaceDate p d = + mkText (lin Text (ss ("wir sehen uns"))) + (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; + + +-- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ +-- below. Languages without productive genitives must use an equivalent of +-- "the wife of my son" for non-pronouns. + + Wife = xOf sing (mkN "Frau" "Frauen" feminine) ; + Husband = xOf sing L.man_N ; + Son = xOf sing (mkN "Sohn" "Shne" masculine) ; + Daughter = xOf sing (mkN "Tochter" "Tchter" feminine) ; + Children = xOf plur L.child_N ; + +-- week days + + Monday = mkDay "Montag" ; + Tuesday = mkDay "Dienstag" ; + Wednesday = mkDay "Mittwoch" ; + Thursday = mkDay "Donnerstag" ; + Friday = mkDay "Freitag" ; + Saturday = mkDay "Samstag" ; + Sunday = mkDay "Sonntag" ; + + Tomorrow = ParadigmsGer.mkAdv "morgen" ; + + TheBest = mkSuperl L.good_A ; + TheClosest = mkSuperl L.near_A ; + TheCheapest = mkSuperl (mkA "billig") ; + TheMostExpensive = mkSuperl (mkA "teuer") ; + TheMostPopular = mkSuperl (mkA "beliebt") ; + TheWorst = mkSuperl (mkA "schlimm") ; + + SuperlPlace sup p = placeNP sup p ; + + +-- means of transportation + + Bike = mkTransport L.bike_N ; + Bus = mkTransport (mkN "Bus" "Bus" "Bus" "Bus" "Buss" "Buss" masculine) ; + Car = mkTransport L.car_N ; + Ferry = mkTransport (mkN "Fhre" "Fhre" "Fhre" "Fhre" "Fhren" "Fhren" feminine) ; + Plane = mkTransport (mkN "Flugzeug" "Flugzeug" "Flugzeug" "Flugzeug" "Flugzeuge" "Flugzeuge" neuter) ; + Subway = mkTransport (mkN "U-Bahn" "U-Bahn" "U-Bahn" "U-Bahn" "U-Bahnen" "U-Bahnen" feminine) ; + Taxi = mkTransport (mkN "Taxi" "Taxi" "Taxi" "Taxi" "Taxis" "Taxis" neuter) ; + Train = mkTransport (mkN "Zug" "Zug" "Zug" "Zug" "Zge" "Zge" masculine) ; + Tram = mkTransport (mkN "Straenbahn" "Straenbahn" "Straenbahn" "Straenbahn" "Straenbahnen" "Straenbahnen" feminine) ; + + ByFoot = ParadigmsGer.mkAdv "zu Fu" ; + + + HowFar place = mkQS (mkQCl far_IAdv place.name) ; + HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxGer.mkAdv von_Prep x.name)) (ParadigmsGer.mkAdv "entfernt"))) ; + HowFarFromBy x y t = + mkQS (mkQCl far_IAdv (mkCl (mkVP (SyntaxGer.mkAdv zu_Prep (mkNP (mkNP y.name (SyntaxGer.mkAdv von_Prep x.name)) t))))) ; + HowFarBy y t = mkQS (mkQCl far_IAdv (mkCl (mkVP (SyntaxGer.mkAdv zu_Prep (mkNP y.name t))))) ; + + WhichTranspPlace trans place = + mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; + + IsTranspPlace trans place = + mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; + + + + + oper + + mkNat : Str -> Str -> Str -> {lang : CN ; prop : A ; country : NP} = \co, la, adj -> + {lang = mkCN (mkN la la neuter) ; + prop = mkA adj ; country = mkNP (mkPN co)} ; + + mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> + let day = mkNP (mkPN d masculine) in + {name = day ; + point = SyntaxGer.mkAdv (mkPrep "am" dative) day ; ---- am + habitual = ParadigmsGer.mkAdv (d + "s") ---- + } ; + + mkPlace : N -> Prep -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,at,to -> { + name = mkCN p ; + at = at ; + to = to ; + isPl = False + } ; + + open_Adv = ParadigmsGer.mkAdv "geffnet" ; ---- Adv to get right word order easily + closed_Adv = ParadigmsGer.mkAdv "geschlossen" ; + + xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; + + + mkSuperl : A -> Det = \a -> SyntaxGer.mkDet the_Art (SyntaxGer.mkOrd a) ; + + + mkTransport : N -> {name : CN ; by : Adv} = \n -> { + name = mkCN n ; + by = SyntaxGer.mkAdv by8means_Prep (mkNP the_Det n) + } ; + + far_IAdv = ss "wie weit" ** {lock_IAdv = <>} ; + +} diff --git a/testsuite/compiler/canonical/run.sh b/testsuite/compiler/canonical/run.sh new file mode 100755 index 000000000..b9cc7e25b --- /dev/null +++ b/testsuite/compiler/canonical/run.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh + +# https://github.com/GrammaticalFramework/gf-core/issues/100 +stack run -- --batch --output-format=canonical_gf PhrasebookBul.gf +stack run -- --batch canonical/PhrasebookBul.gf + +# https://github.com/GrammaticalFramework/gf-core/issues/101 +stack run -- --batch --output-format=canonical_gf PhrasebookGer.gf +for s in c2 objCtrl; do + grep VRead --after-context=216 canonical/PhrasebookGer.gf | grep "$s" > /dev/null + if [ $? -ne 1 ]; then + echo "$s found" + exit 1 + fi +done + +# https://github.com/GrammaticalFramework/gf-core/issues/102 +stack run -- --batch --output-format=canonical_gf FoodsFin.gf +diff canonical/FoodsFin.gf ./FoodsFin.gf.gold +if [ $? -ne 0 ]; then + echo "Compiled grammar doesn't match gold version" + exit 1 +fi