summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn J. Camilleri <john@digitalgrammars.com>2021-06-30 12:41:56 +0200
committerJohn J. Camilleri <john@digitalgrammars.com>2021-06-30 12:41:56 +0200
commit0f5be0bbaa862d2ccdb649eb6dd9fc5e26814e8a (patch)
tree055e215af682bdde05f3e0b8e78e65e9d3e856d6
parent0a70eca6e2913c462c5c65361131f3ed341e539d (diff)
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
-rw-r--r--testsuite/compiler/canonical/.gitignore1
-rw-r--r--testsuite/compiler/canonical/Foods.gf16
-rw-r--r--testsuite/compiler/canonical/FoodsFin.gf6
-rw-r--r--testsuite/compiler/canonical/FoodsFin.gf.gold102
-rw-r--r--testsuite/compiler/canonical/FoodsI.gf29
-rw-r--r--testsuite/compiler/canonical/Greetings.gf28
-rw-r--r--testsuite/compiler/canonical/GreetingsBul.gf31
-rw-r--r--testsuite/compiler/canonical/GreetingsGer.gf31
-rw-r--r--testsuite/compiler/canonical/LexFoods.gf15
-rw-r--r--testsuite/compiler/canonical/LexFoodsFin.gf21
-rw-r--r--testsuite/compiler/canonical/Phrasebook.gf8
-rw-r--r--testsuite/compiler/canonical/PhrasebookBul.gf9
-rw-r--r--testsuite/compiler/canonical/PhrasebookGer.gf10
-rw-r--r--testsuite/compiler/canonical/Sentences.gf222
-rw-r--r--testsuite/compiler/canonical/SentencesBul.gf54
-rw-r--r--testsuite/compiler/canonical/SentencesGer.gf50
-rw-r--r--testsuite/compiler/canonical/SentencesI.gf302
-rw-r--r--testsuite/compiler/canonical/Words.gf254
-rw-r--r--testsuite/compiler/canonical/WordsBul.gf305
-rw-r--r--testsuite/compiler/canonical/WordsGer.gf262
-rwxr-xr-xtestsuite/compiler/canonical/run.sh23
21 files changed, 1779 insertions, 0 deletions
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 <lin Numeral n : Numeral> ;
+
+ 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 <lin V drink_V2 : V> ;
+ VEat = mkVP <lin V eat_V2 : V> ;
+ VRead = mkVP <lin V read_V2 : V> ;
+ VWait = mkVP <lin V wait_V2 : V> ;
+ VWrite = mkVP <lin V write_V2 : V> ;
+
+ 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