From 8aa05c9736cb87776e23f4fb01228bbf0f12a67f Mon Sep 17 00:00:00 2001 From: janna Date: Wed, 27 Oct 2004 18:24:56 +0000 Subject: [PATCH] *** empty log message *** --- examples/letter/Letter.gfcm | 574 +++++++++++++++++------------------ src/JavaGUI/GFEditor2.java | 271 ++++++++++++----- src/JavaGUI/LinPosition.java | 13 + src/JavaGUI/MarkedArea.java | 5 +- 4 files changed, 490 insertions(+), 373 deletions(-) create mode 100644 src/JavaGUI/LinPosition.java diff --git a/examples/letter/Letter.gfcm b/examples/letter/Letter.gfcm index 6cf296396..c8e2fa117 100644 --- a/examples/letter/Letter.gfcm +++ b/examples/letter/Letter.gfcm @@ -1,287 +1,287 @@ -concrete Russian of Letter = open ResRusU in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;flags coding = utf8 ;lincat Author = {s : (ResRusU.Num => (ResRusU.Gen => Str)) ;n : ResRusU.DepNum ;g : ResRusU.DepGen }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; -lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "вы" ++ "были" ++ ("назначены" ++ Position @ 0.s ! ! ) ;(ResRusU.masc)=> "вы" ++ "были" ++ ("назначены" ++ Position @ 0.s ! ! ) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)=> "ты" ++ "был" ++ ("назначен" ++ Position @ 0.s ! ! ) ;(ResRusU.fem)=> "ты" ++ "была" ++ ("назначена" ++ Position @ 0.s ! ! ) }}}}} ;"(ты был)назначен Position_0" ; -lin ColleagueHe : Letter.Recipient = \ -> {s = "коллега" ;n = ;g = } ;"коллега" ; -lin ColleagueShe : Letter.Recipient = \ -> {s = "коллега" ;n = ;g = } ;"коллега" ; -lin ColleaguesHe : Letter.Recipient = \ -> {s = "коллеги" ;n = ;g = } ;"коллеги" ; -lin ColleaguesShe : Letter.Recipient = \ -> {s = "коллеги" ;n = ;g = } ;"коллеги" ; -lin Company : Letter.NounPhrase = \ -> {s = "наше" ++ "предприятие" ;n = ;g = } ;"наше предприятие" ; -lin Competitor : Letter.NounPhrase = \ -> {s = "наш" ++ "конкурент" ;n = ;g = } ;"наш конкурент" ; -lin DarlingHe : Letter.Recipient = \ -> {s = "любимый" ;n = ;g = } ;"любимый" ; -lin DarlingShe : Letter.Recipient = \ -> {s = "любимая" ;n = ;g = } ;"любимая" ; -lin Dean : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "декан" }} ;n = > ;g = > } ;"декан" ; -lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "Дорогая" ;(ResRusU.masc)=> "Дорогой" }! (Recipient @ 0.g);(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "Дорогие" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Дорогой Recipient_0" ; -lincat Ending = {s : (ResRusU.Num => (ResRusU.Gen => Str)) ;n : ResRusU.DepNum ;g : ResRusU.DepGen }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; -lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"С (наилучшими пожеланиями, &-)Author_0" ; -lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> NounPhrase @ 0.s ++ table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "обанкротилось" ;(ResRusU.masc)=> "обанкротился" }! (NounPhrase @ 0.g);(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "обанкротились" }! (NounPhrase @ 0.g)}! (NounPhrase @ 0.n)}}}}} ;"NounPhrase_0 обанкротился" ; -lincat Heading = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; -lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> "Здравствуй" ;(ResRusU.pl)=> "Здравствуйте" }! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Здравствуй Recipient_0" ; -lin Honour : Letter.Mode = \ -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}}}} ;"(я имею)честь (сообщить тебе), что" ; -lin ILoveYou : Letter.Sentence = \ -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("вас" ++ "любим")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("тебя" ++ "любим")}}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("вас" ++ "любим")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("тебя" ++ "люблю")}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вас" ++ "люблю")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("тебя" ++ "люблю")}}}}} ;"я тебя люблю" ; -lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! ;(ResRusU.masc)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! ;(ResRusU.masc)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(С дружеским приветом, &-)Author_0" ; -lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> "Здравствуй" ;(ResRusU.pl)=> "Здравствуйте" }! (Recipient @ 0.n);n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Здравствуй" ; -lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; -lincat Message = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Message" ; -lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; -lincat Mode = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Mode" ; -lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; -lin Mother : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мама" }} ;n = > ;g = > } ;"мама" ; -lin Name : Letter.Author = \ String @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; -lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lincat NounPhrase = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; -lin OurCustomers : Letter.NounPhrase = \ -> {s = "наши" ++ "клиенты" ;n = ;g = } ;"наши клиенты" ; -lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; -lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; -lincat Position = {s : (ResRusU.Num => (ResRusU.Gen => Str)) }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}} ;"Position" ; -lin President : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "президент" }} ;n = > ;g = > } ;"президент" ; -lin ProjectManager : Letter.Position = \ -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "менеджерами" ++ "проектов" } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "менеджером" ++ "проекта" }}} ;"менеджером проекта" ; -lincat Recipient = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; -lin Regret : Letter.Mode = \ -> {s = table ResRusU.DepNum {(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")));(ResRusU.masc)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")));(ResRusU.masc)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))}}}}} ;"я вынуждена сообщить , что" ; -lin Senior : Letter.Position = \ -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "старшим" ++ ("научным" ++ "сотрудником")} ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "старшими" ++ ("научными" ++ "сотрудниками")}}} ;"старшим научным сотрудником" ; -lincat Sentence = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Sentence" ; -lin Spouse : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "твой" ++ "муж" ;(ResRusU.masc)=> "твоя" ++ "жена" } ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)=> "ваши" ++ "жены" ;(ResRusU.fem)=> "ваши" ++ "мужья" }} ;n = ;g = } ;"твоя жена" ; -} -resource ResRusU = {param DepGen = depgen | cgen ResRusU.Gen ; -param DepNum = depnum | cnum ResRusU.Num ; -param Gen = masc | fem ; -param Kas = nom | acc ; -param Num = sg | pl ; -} -abstract Letter = {cat Author [] = ; -fun BePromoted : (h_ : Letter.Position)-> Letter.Sentence = {} ; -fun ColleagueHe : Letter.Recipient = {} ; -fun ColleagueShe : Letter.Recipient = {} ; -fun ColleaguesHe : Letter.Recipient = {} ; -fun ColleaguesShe : Letter.Recipient = {} ; -fun Company : Letter.NounPhrase = {} ; -fun Competitor : Letter.NounPhrase = {} ; -fun DarlingHe : Letter.Recipient = {} ; -fun DarlingShe : Letter.Recipient = {} ; -fun Dean : Letter.Author = {} ; -fun DearRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; -cat Ending [] = ; -fun FormalEnding : (h_ : Letter.Author)-> Letter.Ending = {} ; -fun GoBankrupt : (h_ : Letter.NounPhrase)-> Letter.Sentence = {} ; -cat Heading [] = ; -fun HelloRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; -fun Honour : Letter.Mode = {} ; -fun ILoveYou : Letter.Sentence = {} ; -fun InformalEnding : (h_ : Letter.Author)-> Letter.Ending = {} ; -fun JustHello : (h_ : Letter.Recipient)-> Letter.Heading = {} ; -cat Letter [] = ; -cat Message [] = ; -fun MkLetter : (h_ : Letter.Heading)-> (h_ : Letter.Message)-> (h_ : Letter.Ending)-> Letter.Letter = {} ; -cat Mode [] = ; -fun ModeSent : (h_ : Letter.Mode)-> (h_ : Letter.Sentence)-> Letter.Message = {} ; -fun Mother : Letter.Author = {} ; -fun Name : (h_ : PredefAbs.String)-> Letter.Author = {} ; -fun NameHe : (h_ : PredefAbs.String)-> Letter.Recipient = {} ; -fun NameShe : (h_ : PredefAbs.String)-> Letter.Recipient = {} ; -cat NounPhrase [] = ; -fun OurCustomers : Letter.NounPhrase = {} ; -fun PlainRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; -fun PlainSent : (h_ : Letter.Sentence)-> Letter.Message = {} ; -cat Position [] = ; -fun President : Letter.Author = {} ; -fun ProjectManager : Letter.Position = {} ; -cat Recipient [] = ; -fun Regret : Letter.Mode = {} ; -fun Senior : Letter.Position = {} ; -cat Sentence [] = ; -fun Spouse : Letter.Author = {} ; -} -concrete Finnish of Letter = open ResFin in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; -lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) }}}}} ;"(sinut on)ylennetty Position_0" ; -lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; -lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; -lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; -lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; -lin Company : Letter.NounPhrase = \ -> {s = "yrityksemme" ;n = ;g = } ;"yrityksemme" ; -lin Competitor : Letter.NounPhrase = \ -> {s = "pahin" ++ "kilpailijamme" ;n = ;g = } ;"pahin kilpailijamme" ; -lin DarlingHe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; -lin DarlingShe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; -lin Dean : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "dekaani" }} ;n = > ;g = > } ;"dekaani" ; -lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakas" }! (Recipient @ 0.g);(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakkaat" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"rakas Recipient_0" ; -lincat Ending = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; -lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(parhain terveisin &-)Author_0" ; -lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> NounPhrase @ 0.s ++ (table ResFin.Num {(ResFin.sg)=> "on" ;(ResFin.pl)=> "ovat" }! (NounPhrase @ 0.n)++ (table ResFin.Num {(ResFin.pl)=> "menneet" ;(ResFin.sg)=> "mennyt" }! (NounPhrase @ 0.n)++ "konkurssiin")) }}}}} ;"NounPhrase_0 on mennyt konkurssiin" ; -lincat Heading = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; -lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve Recipient_0" ; -lin Honour : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}}}} ;"(minulla on)kunnia (ilmoittaa sinulle)ett" ; -lin ILoveYou : Letter.Sentence = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "teit" }}}}} ;"rakastan sinua" ; -lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(terveisin &-)Author_0" ; -lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve" ; -lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; -lincat Message = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Message" ; -lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; -lincat Mode = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Mode" ; -lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResFin.DepNum {(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.depnum)=> table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; -lin Mother : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "iti" }} ;n = > ;g = > } ;"iti" ; -lin Name : Letter.Author = \ String @ 0 -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; -lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lincat NounPhrase = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; -lin OurCustomers : Letter.NounPhrase = \ -> {s = "asiakkaamme" ;n = ;g = } ;"asiakkaamme" ; -lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; -lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; -lincat Position = {s : (ResFin.Num => (ResFin.Gen => Str)) }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}} ;"Position" ; -lin President : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "presidentti" }} ;n = > ;g = > } ;"presidentti" ; -lin ProjectManager : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikiksi" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikksi" }}} ;"projektipllikksi" ; -lincat Recipient = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; -lin Regret : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}}}} ;"minun (on valitettavasti ilmoitettava)ett" ; -lin Senior : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmaksi" ++ "tutkijaksi" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmiksi" ++ "tutkijoiksi" }}} ;"vanhemmaksi tutkijaksi" ; -lincat Sentence = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Sentence" ; -lin Spouse : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "miehenne" ;(ResFin.masc)=> "vaimonne" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "miehesi" ;(ResFin.masc)=> "vaimosi" }} ;n = ;g = } ;"vaimosi" ; -} -resource ResFin = {param DepGen = depgen | cgen ResFin.Gen ; -param DepNum = depnum | cnum ResFin.Num ; -param Gen = masc | fem ; -param Kas = nom | acc ; -param Num = sg | pl ; -} -concrete Swedish of Letter = open ResSve in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResSve.Num => (ResSve.Sex => Str)) ;n : ResSve.DepNum ;x : ResSve.Sex }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }} ;n = ;x = } ;"Author" ; -lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "du" ++ ("har" ++ "blivit" ++ ("befordrad" ++ ("till" ++ Position @ 0.s ! ! ))) ;(ResSve.masc)=> "du" ++ ("har" ++ "blivit" ++ ("befordrad" ++ ("till" ++ Position @ 0.s ! ! ))) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! ! ))) ;(ResSve.masc)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! ! ))) }}}}} ;"du (har blivit)befordrad till Position_0" ; -lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = ;x = } ;"kollega" ; -lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;x = } ;"kollega" ; -lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; -lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; -lin Company : Letter.NounPhrase = \ -> {s = "vrt" ++ "fretag" ;n = ;g = } ;"vrt fretag" ; -lin Competitor : Letter.NounPhrase = \ -> {s = "vr" ++ ("vrsta" ++ "konkurrent");n = ;g = } ;"vr vrsta konkurrent" ; -lin DarlingHe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; -lin DarlingShe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; -lin Dean : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Dekanus" }} ;n = > ;x = } ;"Dekanus" ; -lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Kra" ;(ResSve.masc)=> "Kre" }! (Recipient @ 0.x);(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Kra" }! (Recipient @ 0.x)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Kre Recipient_0" ; -lincat Ending = {s : (ResSve.Num => (ResSve.Sex => Str)) ;n : ResSve.DepNum ;x : ResSve.Sex }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }} ;n = ;x = } ;"Ending" ; -lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med vnlig hlsning &-)Author_0" ; -lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> NounPhrase @ 0.s ++ ("har" ++ ("gtt" ++ ("i" ++ "konkurs")))}}}}} ;"NounPhrase_0 har gtt i konkurs" ; -lincat Heading = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Heading" ; -lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej Recipient_0" ; -lin Honour : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}}}} ;"jag (har ran att meddela)dig att" ; -lin ILoveYou : Letter.Sentence = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "er")}}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}}}} ;"jag lskar dig" ; -lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med hlsningar &-)Author_0" ; -lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej" ; -lincat Letter = {s : Str }= {s = str @ 0 } ;"Brev" ; -lincat Message = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Message" ; -lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"brevmall" ; -lincat Mode = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Mode" ; -lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; -lin Mother : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Mamma" }} ;n = > ;x = } ;"Mamma" ; -lin Name : Letter.Author = \ String @ 0 -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> String @ 0.s }} ;n = > ;x = } ;"String_0" ; -lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; -lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; -lincat NounPhrase = {s : Str ;n : ResSve.Num ;g : ResSve.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; -lin OurCustomers : Letter.NounPhrase = \ -> {s = "vra" ++ "kunder" ;n = ;g = } ;"vra kunder" ; -lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Recipient_0" ; -lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; -lincat Position = {s : (ResSve.Num => (ResSve.Sex => Str)) }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}} ;"Position" ; -lin President : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Presidenten" }} ;n = > ;x = } ;"Presidenten" ; -lin ProjectManager : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchef" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchefer" }}} ;"projektchef" ; -lincat Recipient = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Recipient" ; -lin Regret : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}}}} ;"jag (mste tyvrr meddela)dig att" ; -lin Senior : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "ldre" ++ "forskare" }}} ;"ldre forskare" ; -lincat Sentence = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Sentence" ; -lin Spouse : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)=> "din" ++ "hustru" ;(ResSve.fem)=> "din" ++ "man" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)=> "era" ++ "hustrur" ;(ResSve.fem)=> "era" ++ "mn" }} ;n = ;x = } ;"din hustru" ; -} -resource ResSve = {param DepNum = depnum | cnum ResSve.Num ; -param Gen = en | ett ; -param Kas = nom | acc ; -param Num = sg | pl ; -param Sex = masc | fem ; -} -concrete French of Letter = open ResFra in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResFra.Num => (ResFra.Gen => Str)) ;n : ResFra.DepNum ;g : ResFra.DepGen }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; -lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "vous" ++ ("avez" ++ "t")++ ("promues" ++ Position @ 0.s ! ! ) ;(ResFra.masc)=> "vous" ++ ("avez" ++ "t")++ ("promus" ++ Position @ 0.s ! ! ) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "tu" ++ ("as" ++ "t")++ ("promu" ++ Position @ 0.s ! ! ) ;(ResFra.fem)=> "tu" ++ ("as" ++ "t")++ ("promue" ++ Position @ 0.s ! ! ) }}}}} ;"(tu as t)promu Position_0" ; -lin ColleagueHe : Letter.Recipient = \ -> {s = "collgue" ;n = ;g = } ;"collgue" ; -lin ColleagueShe : Letter.Recipient = \ -> {s = "collgue" ;n = ;g = } ;"collgue" ; -lin ColleaguesHe : Letter.Recipient = \ -> {s = "collgues" ;n = ;g = } ;"collgues" ; -lin ColleaguesShe : Letter.Recipient = \ -> {s = "collgues" ;n = ;g = } ;"collgues" ; -lin Company : Letter.NounPhrase = \ -> {s = "notre" ++ "entreprise" ;n = ;g = } ;"notre entreprise" ; -lin Competitor : Letter.NounPhrase = \ -> {s = "notre" ++ ("pire" ++ "comptiteur");n = ;g = } ;"notre pire comptiteur" ; -lin DarlingHe : Letter.Recipient = \ -> {s = "chri" ;n = ;g = } ;"chri" ; -lin DarlingShe : Letter.Recipient = \ -> {s = "chrie" ;n = ;g = } ;"chrie" ; -lin Dean : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "le" ++ "doyen" }} ;n = > ;g = > } ;"le doyen" ; -lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "cher" ;(ResFra.fem)=> "chre" }! (Recipient @ 0.g);(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "chers" ;(ResFra.fem)=> "chres" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"cher Recipient_0" ; -lincat Ending = {s : (ResFra.Num => (ResFra.Gen => Str)) ;n : ResFra.DepNum ;g : ResFra.DepGen }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; -lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => ;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => ;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ))} ;(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.pl)) => ;(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.pl)) => ;(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ))}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"avec mes (salutations distingues &-)Author_0" ; -lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> NounPhrase @ 0.s ++ (table ResFra.Num {(ResFra.sg)=> "a" ;(ResFra.pl)=> "ont" }! (NounPhrase @ 0.n)++ ("fait" ++ "banqueroute")) }}}}} ;"NounPhrase_0 a fait banqueroute" ; -lincat Heading = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; -lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Bonjour" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Bonjour Recipient_0" ; -lin Honour : Letter.Mode = \ -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}}}} ;"j'ai (l'honneur de)t'informer que" ; -lin ILoveYou : Letter.Sentence = \ -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ ("vous" ++ "aime")} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "t'aime" }}} ;(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ ("vous" ++ "aimons")} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "t'aimons" }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "t'aime" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ ("vous" ++ "aimons")}}}}} ;"je t'aime" ; -lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! ;(ResFra.masc)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! ;(ResFra.masc)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(Amicalement &-)Author_0" ; -lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Bonjour" ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Bonjour" ; -lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; -lincat Message = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Message" ; -lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; -lincat Mode = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Mode" ; -lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; -lin Mother : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "maman" }} ;n = > ;g = > } ;"maman" ; -lin Name : Letter.Author = \ String @ 0 -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; -lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; -lincat NounPhrase = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; -lin OurCustomers : Letter.NounPhrase = \ -> {s = "nos" ++ "clients" ;n = ;g = } ;"nos clients" ; -lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; -lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; -lincat Position = {s : (ResFra.Num => (ResFra.Gen => Str)) }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}} ;"Position" ; -lin President : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "le" ++ "prsident" }} ;n = > ;g = > } ;"le prsident" ; -lin ProjectManager : Letter.Position = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "chef" ++ ("de" ++ "projet")} ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "chefs" ++ ("de" ++ "projets")}}} ;"chef de projet" ; -lincat Recipient = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; -lin Regret : Letter.Mode = \ -> {s = table ResFra.DepNum {(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }}}}} ;"(je suis)dsole d'informer que" ; -lin Senior : Letter.Position = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "responsable" ++ "scientifique" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "responsables" ++ "scientifiques" }}} ;"responsable scientifique" ; -lincat Sentence = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Sentence" ; -lin Spouse : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "ta" ++ "femme" ;(ResFra.fem)=> "ton" ++ "mari" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "vos" ++ "femmes" ;(ResFra.fem)=> "vos" ++ "maris" }} ;n = ;g = } ;"ta femme" ; -} -resource ResFra = {param DepGen = depgen | cgen ResFra.Gen ; -param DepNum = depnum | cnum ResFra.Num ; -param Gen = masc | fem ; -param Kas = nom | acc ; -param Num = sg | pl ; -} -concrete English of Letter = open ResEng in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResEng.Num => (ResEng.Sex => Str)) ;n : ResEng.DepNum ;x : ResEng.Sex }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }} ;n = ;x = } ;"Author" ; -lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! ;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! ;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! }}}}} ;"(you have been promoted to)Position_0" ; -lin ColleagueHe : Letter.Recipient = \ -> {s = "colleague" ;n = ;x = } ;"colleague" ; -lin ColleagueShe : Letter.Recipient = \ -> {s = "colleague" ;n = ;x = } ;"colleague" ; -lin ColleaguesHe : Letter.Recipient = \ -> {s = "colleagues" ;n = ;x = } ;"colleagues" ; -lin ColleaguesShe : Letter.Recipient = \ -> {s = "colleagues" ;n = ;x = } ;"colleagues" ; -lin Company : Letter.NounPhrase = \ -> {s = "our" ++ "company" ;n = } ;"our company" ; -lin Competitor : Letter.NounPhrase = \ -> {s = "our" ++ ("worst" ++ "competitor");n = } ;"our worst competitor" ; -lin DarlingHe : Letter.Recipient = \ -> {s = "darling" ;n = ;x = } ;"darling" ; -lin DarlingShe : Letter.Recipient = \ -> {s = "darling" ;n = ;x = } ;"darling" ; -lin Dean : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "the" ++ "Dean" }} ;n = > ;x = } ;"the Dean" ; -lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = "Dear" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Dear Recipient_0" ; -lincat Ending = {s : (ResEng.Num => (ResEng.Sex => Str)) ;n : ResEng.DepNum ;x : ResEng.Sex }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }} ;n = ;x = } ;"Ending" ; -lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! ;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! ;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Sincerely yours &-)Author_0" ; -lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> NounPhrase @ 0.s ++ (table ResEng.Num {(ResEng.sg)=> "has" ;(ResEng.pl)=> "have" }! (NounPhrase @ 0.n)++ ("gone" ++ "bankrupt")) }}}}} ;"NounPhrase_0 has gone bankrupt" ; -lincat Heading = {s : Str ;n : ResEng.Num ;x : ResEng.Sex }= {s = str @ 0 ;n = ;x = } ;"Heading" ; -lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Hello" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hello Recipient_0" ; -lin Honour : Letter.Mode = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) } ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}}}} ;"I have the honour to inform you that" ; -lin ILoveYou : Letter.Sentence = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("love" ++ "you")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("love" ++ "you")}}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("love" ++ "you")}}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("love" ++ "you")}}}}} ;"I love you" ; -lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! ;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! ;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(With best regards &-)Author_0" ; -lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Hello" ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hello" ; -lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; -lincat Message = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Message" ; -lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; -lincat Mode = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Mode" ; -lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResEng.DepNum {(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResEng.depnum)=> table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; -lin Mother : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "Mom" }} ;n = > ;x = } ;"Mom" ; -lin Name : Letter.Author = \ String @ 0 -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> String @ 0.s }} ;n = > ;x = } ;"String_0" ; -lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; -lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; -lincat NounPhrase = {s : Str ;n : ResEng.Num }= {s = str @ 0 ;n = } ;"NounPhrase" ; -lin OurCustomers : Letter.NounPhrase = \ -> {s = "our" ++ "customers" ;n = } ;"our customers" ; -lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Recipient_0" ; -lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; -lincat Position = {s : (ResEng.Num => (ResEng.Sex => Str)) }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}} ;"Position" ; -lin President : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "the" ++ "President" }} ;n = > ;x = } ;"the President" ; -lin ProjectManager : Letter.Position = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "a" ++ ("project" ++ "manager")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "project" ++ "managers" }}} ;"a project manager" ; -lincat Recipient = {s : Str ;n : ResEng.Num ;x : ResEng.Sex }= {s = str @ 0 ;n = ;x = } ;"Recipient" ; -lin Regret : Letter.Mode = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("am" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("are" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("am" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("are" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}}}} ;"I am sorry to inform you that" ; -lin Senior : Letter.Position = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "a" ++ ("senior" ++ "fellow")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "senior" ++ "fellows" }}} ;"a senior fellow" ; -lincat Sentence = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Sentence" ; -lin Spouse : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "your" ++ "husband" ;(ResEng.masc)=> "your" ++ "wife" } ;(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "your" ++ "husbands" ;(ResEng.masc)=> "your" ++ "wives" }} ;n = ;x = } ;"your wife" ; -} -resource ResEng = {param DepNum = depnum | cnum ResEng.Num ; -param Kas = nom | acc ; -param Num = sg | pl ; -param Sex = masc | fem ; -} +concrete Russian of Letter = open ResRusU in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;flags coding = utf8 ;lincat Author = {s : (ResRusU.Num => (ResRusU.Gen => Str)) ;n : ResRusU.DepNum ;g : ResRusU.DepGen }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "вы" ++ "были" ++ ("назначены" ++ Position @ 0.s ! ! ) ;(ResRusU.masc)=> "вы" ++ "были" ++ ("назначены" ++ Position @ 0.s ! ! ) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)=> "ты" ++ "был" ++ ("назначен" ++ Position @ 0.s ! ! ) ;(ResRusU.fem)=> "ты" ++ "была" ++ ("назначена" ++ Position @ 0.s ! ! ) }}}}} ;"(ты был)назначен Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "коллега" ;n = ;g = } ;"коллега" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "коллега" ;n = ;g = } ;"коллега" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "коллеги" ;n = ;g = } ;"коллеги" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "коллеги" ;n = ;g = } ;"коллеги" ; +lin Company : Letter.NounPhrase = \ -> {s = "наше" ++ "предприятие" ;n = ;g = } ;"наше предприятие" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "наш" ++ "конкурент" ;n = ;g = } ;"наш конкурент" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "любимый" ;n = ;g = } ;"любимый" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "любимая" ;n = ;g = } ;"любимая" ; +lin Dean : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "декан" }} ;n = > ;g = > } ;"декан" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "Дорогая" ;(ResRusU.masc)=> "Дорогой" }! (Recipient @ 0.g);(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "Дорогие" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Дорогой Recipient_0" ; +lincat Ending = {s : (ResRusU.Num => (ResRusU.Gen => Str)) ;n : ResRusU.DepNum ;g : ResRusU.DepGen }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожеланиями," ++ "&-")++ Author @ 0.s ! ! ) }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"С (наилучшими пожеланиями, &-)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> NounPhrase @ 0.s ++ table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "обанкротилось" ;(ResRusU.masc)=> "обанкротился" }! (NounPhrase @ 0.g);(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "обанкротились" }! (NounPhrase @ 0.g)}! (NounPhrase @ 0.n)}}}}} ;"NounPhrase_0 обанкротился" ; +lincat Heading = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> "Здравствуй" ;(ResRusU.pl)=> "Здравствуйте" }! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Здравствуй Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ "имеем" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "вам" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ "имею" ++ ("честь" ++ ("сообщить" ++ "тебе" ++ ("," ++ "что")))}}}}} ;"(я имею)честь (сообщить тебе), что" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("вас" ++ "любим")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("тебя" ++ "любим")}}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мы" ++ ("вас" ++ "любим")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("тебя" ++ "люблю")}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вас" ++ "люблю")} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("тебя" ++ "люблю")}}}}} ;"я тебя люблю" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! ;(ResRusU.masc)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! ;(ResRusU.masc)=> "С" ++ ("дружеским" ++ ("приветом," ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(С дружеским приветом, &-)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)=> "Здравствуй" ;(ResRusU.pl)=> "Здравствуйте" }! (Recipient @ 0.n);n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Здравствуй" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; +lincat Message = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; +lincat Mode = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResRusU.DepNum {(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResRusU.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мама" }} ;n = > ;g = > } ;"мама" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "наши" ++ "клиенты" ;n = ;g = } ;"наши клиенты" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResRusU.Num => (ResRusU.Gen => Str)) }= {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "президент" }} ;n = > ;g = > } ;"президент" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "менеджерами" ++ "проектов" } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "менеджером" ++ "проекта" }}} ;"менеджером проекта" ; +lincat Recipient = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResRusU.DepNum {(ResRusU.depnum)=> table ResRusU.DepGen {(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")));(ResRusU.masc)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))} ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")));(ResRusU.masc)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынужден" ++ ("сообщить" ++ ("," ++ "что")))}} ;(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "я" ++ ("вынуждена" ++ ("сообщить" ++ ("," ++ "что")))}}} ;(ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "вы" ++ ("вынуждены" ++ ("сообщить" ++ ("," ++ "что")))}}}}} ;"я вынуждена сообщить , что" ; +lin Senior : Letter.Position = \ -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "старшим" ++ ("научным" ++ "сотрудником")} ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "старшими" ++ ("научными" ++ "сотрудниками")}}} ;"старшим научным сотрудником" ; +lincat Sentence = {s : (ResRusU.DepNum => (ResRusU.DepGen => (ResRusU.Num => (ResRusU.Gen => Str)))) }= {s = table ResRusU.DepNum {(ResRusU.depnum)(ResRusU.cnum (ResRusU.sg)) (ResRusU.cnum (ResRusU.pl)) => table ResRusU.DepGen {(ResRusU.depgen)(ResRusU.cgen (ResRusU.masc)) (ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "твой" ++ "муж" ;(ResRusU.masc)=> "твоя" ++ "жена" } ;(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)=> "ваши" ++ "жены" ;(ResRusU.fem)=> "ваши" ++ "мужья" }} ;n = ;g = } ;"твоя жена" ; +} +resource ResRusU = {param DepGen = depgen | cgen ResRusU.Gen ; +param DepNum = depnum | cnum ResRusU.Num ; +param Gen = masc | fem ; +param Kas = nom | acc ; +param Num = sg | pl ; +} +abstract Letter = {cat Author [] = ; +fun BePromoted : (h_ : Letter.Position)-> Letter.Sentence = {} ; +fun ColleagueHe : Letter.Recipient = {} ; +fun ColleagueShe : Letter.Recipient = {} ; +fun ColleaguesHe : Letter.Recipient = {} ; +fun ColleaguesShe : Letter.Recipient = {} ; +fun Company : Letter.NounPhrase = {} ; +fun Competitor : Letter.NounPhrase = {} ; +fun DarlingHe : Letter.Recipient = {} ; +fun DarlingShe : Letter.Recipient = {} ; +fun Dean : Letter.Author = {} ; +fun DearRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; +cat Ending [] = ; +fun FormalEnding : (h_ : Letter.Author)-> Letter.Ending = {} ; +fun GoBankrupt : (h_ : Letter.NounPhrase)-> Letter.Sentence = {} ; +cat Heading [] = ; +fun HelloRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; +fun Honour : Letter.Mode = {} ; +fun ILoveYou : Letter.Sentence = {} ; +fun InformalEnding : (h_ : Letter.Author)-> Letter.Ending = {} ; +fun JustHello : (h_ : Letter.Recipient)-> Letter.Heading = {} ; +cat Letter [] = ; +cat Message [] = ; +fun MkLetter : (h_ : Letter.Heading)-> (h_ : Letter.Message)-> (h_ : Letter.Ending)-> Letter.Letter = {} ; +cat Mode [] = ; +fun ModeSent : (h_ : Letter.Mode)-> (h_ : Letter.Sentence)-> Letter.Message = {} ; +fun Mother : Letter.Author = {} ; +fun Name : (h_ : PredefAbs.String)-> Letter.Author = {} ; +fun NameHe : (h_ : PredefAbs.String)-> Letter.Recipient = {} ; +fun NameShe : (h_ : PredefAbs.String)-> Letter.Recipient = {} ; +cat NounPhrase [] = ; +fun OurCustomers : Letter.NounPhrase = {} ; +fun PlainRec : (h_ : Letter.Recipient)-> Letter.Heading = {} ; +fun PlainSent : (h_ : Letter.Sentence)-> Letter.Message = {} ; +cat Position [] = ; +fun President : Letter.Author = {} ; +fun ProjectManager : Letter.Position = {} ; +cat Recipient [] = ; +fun Regret : Letter.Mode = {} ; +fun Senior : Letter.Position = {} ; +cat Sentence [] = ; +fun Spouse : Letter.Author = {} ; +} +concrete Finnish of Letter = open ResFin in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) }}}}} ;"(sinut on)ylennetty Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; +lin Company : Letter.NounPhrase = \ -> {s = "yrityksemme" ;n = ;g = } ;"yrityksemme" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "pahin" ++ "kilpailijamme" ;n = ;g = } ;"pahin kilpailijamme" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; +lin Dean : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "dekaani" }} ;n = > ;g = > } ;"dekaani" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakas" }! (Recipient @ 0.g);(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakkaat" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"rakas Recipient_0" ; +lincat Ending = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(parhain terveisin &-)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> NounPhrase @ 0.s ++ (table ResFin.Num {(ResFin.sg)=> "on" ;(ResFin.pl)=> "ovat" }! (NounPhrase @ 0.n)++ (table ResFin.Num {(ResFin.pl)=> "menneet" ;(ResFin.sg)=> "mennyt" }! (NounPhrase @ 0.n)++ "konkurssiin")) }}}}} ;"NounPhrase_0 on mennyt konkurssiin" ; +lincat Heading = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}}}} ;"(minulla on)kunnia (ilmoittaa sinulle)ett" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "teit" }}}}} ;"rakastan sinua" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "&-" ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(terveisin &-)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; +lincat Message = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; +lincat Mode = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResFin.DepNum {(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.depnum)=> table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "iti" }} ;n = > ;g = > } ;"iti" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "asiakkaamme" ;n = ;g = } ;"asiakkaamme" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResFin.Num => (ResFin.Gen => Str)) }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "presidentti" }} ;n = > ;g = > } ;"presidentti" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikiksi" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikksi" }}} ;"projektipllikksi" ; +lincat Recipient = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}}}} ;"minun (on valitettavasti ilmoitettava)ett" ; +lin Senior : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmaksi" ++ "tutkijaksi" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmiksi" ++ "tutkijoiksi" }}} ;"vanhemmaksi tutkijaksi" ; +lincat Sentence = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "miehenne" ;(ResFin.masc)=> "vaimonne" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "miehesi" ;(ResFin.masc)=> "vaimosi" }} ;n = ;g = } ;"vaimosi" ; +} +resource ResFin = {param DepGen = depgen | cgen ResFin.Gen ; +param DepNum = depnum | cnum ResFin.Num ; +param Gen = masc | fem ; +param Kas = nom | acc ; +param Num = sg | pl ; +} +concrete Swedish of Letter = open ResSve in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResSve.Num => (ResSve.Sex => Str)) ;n : ResSve.DepNum ;x : ResSve.Sex }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }} ;n = ;x = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "du" ++ ("har" ++ "blivit" ++ ("befordrad" ++ ("till" ++ Position @ 0.s ! ! ))) ;(ResSve.masc)=> "du" ++ ("har" ++ "blivit" ++ ("befordrad" ++ ("till" ++ Position @ 0.s ! ! ))) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! ! ))) ;(ResSve.masc)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! ! ))) }}}}} ;"du (har blivit)befordrad till Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = ;x = } ;"kollega" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;x = } ;"kollega" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; +lin Company : Letter.NounPhrase = \ -> {s = "vrt" ++ "fretag" ;n = ;g = } ;"vrt fretag" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "vr" ++ ("vrsta" ++ "konkurrent");n = ;g = } ;"vr vrsta konkurrent" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; +lin Dean : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Dekanus" }} ;n = > ;x = } ;"Dekanus" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Kra" ;(ResSve.masc)=> "Kre" }! (Recipient @ 0.x);(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Kra" }! (Recipient @ 0.x)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Kre Recipient_0" ; +lincat Ending = {s : (ResSve.Num => (ResSve.Sex => Str)) ;n : ResSve.DepNum ;x : ResSve.Sex }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }} ;n = ;x = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med vnlig hlsning &-)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> NounPhrase @ 0.s ++ ("har" ++ ("gtt" ++ ("i" ++ "konkurs")))}}}}} ;"NounPhrase_0 har gtt i konkurs" ; +lincat Heading = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}}}} ;"jag (har ran att meddela)dig att" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "er")}}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}}}} ;"jag lskar dig" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med hlsningar &-)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Brev" ; +lincat Message = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"brevmall" ; +lincat Mode = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Mamma" }} ;n = > ;x = } ;"Mamma" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> String @ 0.s }} ;n = > ;x = } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResSve.Num ;g : ResSve.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "vra" ++ "kunder" ;n = ;g = } ;"vra kunder" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResSve.Num => (ResSve.Sex => Str)) }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Presidenten" }} ;n = > ;x = } ;"Presidenten" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchef" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchefer" }}} ;"projektchef" ; +lincat Recipient = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}}}} ;"jag (mste tyvrr meddela)dig att" ; +lin Senior : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "ldre" ++ "forskare" }}} ;"ldre forskare" ; +lincat Sentence = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)=> "din" ++ "hustru" ;(ResSve.fem)=> "din" ++ "man" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)=> "era" ++ "hustrur" ;(ResSve.fem)=> "era" ++ "mn" }} ;n = ;x = } ;"din hustru" ; +} +resource ResSve = {param DepNum = depnum | cnum ResSve.Num ; +param Gen = en | ett ; +param Kas = nom | acc ; +param Num = sg | pl ; +param Sex = masc | fem ; +} +concrete French of Letter = open ResFra in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResFra.Num => (ResFra.Gen => Str)) ;n : ResFra.DepNum ;g : ResFra.DepGen }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "vous" ++ ("avez" ++ "t")++ ("promues" ++ Position @ 0.s ! ! ) ;(ResFra.masc)=> "vous" ++ ("avez" ++ "t")++ ("promus" ++ Position @ 0.s ! ! ) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "tu" ++ ("as" ++ "t")++ ("promu" ++ Position @ 0.s ! ! ) ;(ResFra.fem)=> "tu" ++ ("as" ++ "t")++ ("promue" ++ Position @ 0.s ! ! ) }}}}} ;"(tu as t)promu Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "collgue" ;n = ;g = } ;"collgue" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "collgue" ;n = ;g = } ;"collgue" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "collgues" ;n = ;g = } ;"collgues" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "collgues" ;n = ;g = } ;"collgues" ; +lin Company : Letter.NounPhrase = \ -> {s = "notre" ++ "entreprise" ;n = ;g = } ;"notre entreprise" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "notre" ++ ("pire" ++ "comptiteur");n = ;g = } ;"notre pire comptiteur" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "chri" ;n = ;g = } ;"chri" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "chrie" ;n = ;g = } ;"chrie" ; +lin Dean : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "le" ++ "doyen" }} ;n = > ;g = > } ;"le doyen" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "cher" ;(ResFra.fem)=> "chre" }! (Recipient @ 0.g);(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "chers" ;(ResFra.fem)=> "chres" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"cher Recipient_0" ; +lincat Ending = {s : (ResFra.Num => (ResFra.Gen => Str)) ;n : ResFra.DepNum ;g : ResFra.DepGen }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => ;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => ;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ))} ;(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.pl)) => ;(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.pl)) => ;(ResFra.cnum (ResFra.sg)) => }! (Author @ 0.n)) ++ ("salutations" ++ ("distingues" ++ "&-")++ Author @ 0.s ! ! ))}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"avec mes (salutations distingues &-)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> NounPhrase @ 0.s ++ (table ResFra.Num {(ResFra.sg)=> "a" ;(ResFra.pl)=> "ont" }! (NounPhrase @ 0.n)++ ("fait" ++ "banqueroute")) }}}}} ;"NounPhrase_0 a fait banqueroute" ; +lincat Heading = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Bonjour" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Bonjour Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "avons" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("vous" ++ "informer" ++ "que")) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "j'ai" ++ ("l'honneur" ++ "de" ++ ("t'informer" ++ "que")) }}}}} ;"j'ai (l'honneur de)t'informer que" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ ("vous" ++ "aime")} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "t'aime" }}} ;(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ ("vous" ++ "aimons")} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "t'aimons" }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "t'aime" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ ("vous" ++ "aimons")}}}}} ;"je t'aime" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! ;(ResFra.masc)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! ;(ResFra.masc)=> "Amicalement" ++ "&-" ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(Amicalement &-)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Bonjour" ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Bonjour" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; +lincat Message = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; +lincat Mode = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFra.depnum)=> table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFra.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "maman" }} ;n = > ;g = > } ;"maman" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "nos" ++ "clients" ;n = ;g = } ;"nos clients" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResFra.Num => (ResFra.Gen => Str)) }= {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "le" ++ "prsident" }} ;n = > ;g = > } ;"le prsident" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "chef" ++ ("de" ++ "projet")} ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "chefs" ++ ("de" ++ "projets")}}} ;"chef de projet" ; +lincat Recipient = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResFra.DepNum {(ResFra.depnum)=> table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsol" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("dsole" ++ ("d'informer" ++ "que")) }}} ;(ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)=> table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsoles" ++ ("d'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("dsols" ++ ("d'informer" ++ "que")) }}}}} ;"(je suis)dsole d'informer que" ; +lin Senior : Letter.Position = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "responsable" ++ "scientifique" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "responsables" ++ "scientifiques" }}} ;"responsable scientifique" ; +lincat Sentence = {s : (ResFra.DepNum => (ResFra.DepGen => (ResFra.Num => (ResFra.Gen => Str)))) }= {s = table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.sg)) (ResFra.cnum (ResFra.pl)) => table ResFra.DepGen {(ResFra.depgen)(ResFra.cgen (ResFra.masc)) (ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "ta" ++ "femme" ;(ResFra.fem)=> "ton" ++ "mari" } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "vos" ++ "femmes" ;(ResFra.fem)=> "vos" ++ "maris" }} ;n = ;g = } ;"ta femme" ; +} +resource ResFra = {param DepGen = depgen | cgen ResFra.Gen ; +param DepNum = depnum | cnum ResFra.Num ; +param Gen = masc | fem ; +param Kas = nom | acc ; +param Num = sg | pl ; +} +concrete English of Letter = open ResEng in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResEng.Num => (ResEng.Sex => Str)) ;n : ResEng.DepNum ;x : ResEng.Sex }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }} ;n = ;x = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! ;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! ;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! ! }}}}} ;"(you have been promoted to)Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "colleague" ;n = ;x = } ;"colleague" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "colleague" ;n = ;x = } ;"colleague" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "colleagues" ;n = ;x = } ;"colleagues" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "colleagues" ;n = ;x = } ;"colleagues" ; +lin Company : Letter.NounPhrase = \ -> {s = "our" ++ "company" ;n = } ;"our company" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "our" ++ ("worst" ++ "competitor");n = } ;"our worst competitor" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "darling" ;n = ;x = } ;"darling" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "darling" ;n = ;x = } ;"darling" ; +lin Dean : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "the" ++ "Dean" }} ;n = > ;x = } ;"the Dean" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = "Dear" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Dear Recipient_0" ; +lincat Ending = {s : (ResEng.Num => (ResEng.Sex => Str)) ;n : ResEng.DepNum ;x : ResEng.Sex }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }} ;n = ;x = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! ;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! ;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "&-")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Sincerely yours &-)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> NounPhrase @ 0.s ++ (table ResEng.Num {(ResEng.sg)=> "has" ;(ResEng.pl)=> "have" }! (NounPhrase @ 0.n)++ ("gone" ++ "bankrupt")) }}}}} ;"NounPhrase_0 has gone bankrupt" ; +lincat Heading = {s : Str ;n : ResEng.Num ;x : ResEng.Sex }= {s = str @ 0 ;n = ;x = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Hello" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hello Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) } ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("have" ++ ("the" ++ ("honour" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))) }}}}} ;"I have the honour to inform you that" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("love" ++ "you")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("love" ++ "you")}}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("love" ++ "you")}}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("love" ++ "you")}}}}} ;"I love you" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! ;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! ;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "&-")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(With best regards &-)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Hello" ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hello" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; +lincat Message = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("&-" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("&-" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"Heading_0 , &- Message_1 . &- Ending_2" ; +lincat Mode = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResEng.DepNum {(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResEng.depnum)=> table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResEng.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "Mom" }} ;n = > ;x = } ;"Mom" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> String @ 0.s }} ;n = > ;x = } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResEng.Num }= {s = str @ 0 ;n = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "our" ++ "customers" ;n = } ;"our customers" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResEng.Num => (ResEng.Sex => Str)) }= {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "the" ++ "President" }} ;n = > ;x = } ;"the President" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "a" ++ ("project" ++ "manager")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "project" ++ "managers" }}} ;"a project manager" ; +lincat Recipient = {s : Str ;n : ResEng.Num ;x : ResEng.Sex }= {s = str @ 0 ;n = ;x = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResEng.DepNum {(ResEng.depnum)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("am" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("are" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "I" ++ ("am" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}} ;(ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "we" ++ ("are" ++ ("sorry" ++ ("to" ++ ("inform" ++ ("you" ++ "that")))))}}}}} ;"I am sorry to inform you that" ; +lin Senior : Letter.Position = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "a" ++ ("senior" ++ "fellow")} ;(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "senior" ++ "fellows" }}} ;"a senior fellow" ; +lincat Sentence = {s : (ResEng.DepNum => (ResEng.Sex => (ResEng.Num => (ResEng.Sex => Str)))) }= {s = table ResEng.DepNum {(ResEng.depnum)(ResEng.cnum (ResEng.sg)) (ResEng.cnum (ResEng.pl)) => table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "your" ++ "husband" ;(ResEng.masc)=> "your" ++ "wife" } ;(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "your" ++ "husbands" ;(ResEng.masc)=> "your" ++ "wives" }} ;n = ;x = } ;"your wife" ; +} +resource ResEng = {param DepNum = depnum | cnum ResEng.Num ; +param Kas = nom | acc ; +param Num = sg | pl ; +param Sex = masc | fem ; +} diff --git a/src/JavaGUI/GFEditor2.java b/src/JavaGUI/GFEditor2.java index aa2e13bf4..bd7830220 100644 --- a/src/JavaGUI/GFEditor2.java +++ b/src/JavaGUI/GFEditor2.java @@ -14,6 +14,7 @@ import java.util.*; public class GFEditor2 extends JFrame implements ActionListener, CaretListener, KeyListener, FocusListener { + private static Color color = Color.green; private int[] sizes = {14,18,22,26,30}; private String[] envfonts; private Font font; @@ -31,12 +32,13 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, public MouseEvent m2; public static String selectedText=""; - public static boolean debug = true; + public static boolean debug = false; public static boolean debug3 = false; public static boolean debug2 = true; public static boolean selectionCheck = false; - public static String focusPosition = ""; + public static LinPosition focusPosition ; public static String stringToAppend = ""; + //stack for storing the current position: public static Vector currentPosition = new Vector(); public static int selStart = -1; public static int selEnd = -1; @@ -811,12 +813,24 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, } public void outputAppend(){ - int i, j, k, l, l2, selectionLength, m=0, n=0; + int i, j, j2, k, l, l2, selectionLength, m=0, n=0; + result=result.replace('\n',' '); if (debug2) - System.out.println("INPUT:"+result); + System.out.println("INPUT:"+result); l = result.indexOf("',i); + // status incorrect ?: + if (result.substring(i,j).indexOf("incorrect")!=-1) + { + j2 = result.indexOf("status"); + color = Color.red; + } + else + { + j2 = j; + color = Color.green; + } l2 = result.indexOf("focus"); if (l2!=-1){ // in case focus tag is cut into two lines: @@ -827,8 +841,9 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, if (debug2) System.out.println("POSITION END: "+n); if (debug) System.out.println("form Lin1: "+result); - focusPosition = result.substring(m+9,n+1); - statusLabel.setText(" "+result.substring(i+5,j)); + focusPosition = new LinPosition(result.substring(m+9,n+1), + result.substring(m,j).indexOf("incorrect")==-1); + statusLabel.setText(" "+result.substring(i+5,j2)); //cutting result= result.substring(0,l)+result.substring(j+2); i=result.indexOf("/focus",l); @@ -932,7 +947,7 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, } if (visible) { if (!firstLin) - appendMarked("************"+'\n',-1,-1); + appendMarked("\n************"+'\n',-1,-1); if (debug) System.out.println("linearization for the language: "+result); outputAppend(); } @@ -952,6 +967,18 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, lin = lin.substring(lin.indexOf("")); } } + for (int i = 0; i=jElement.begin) { iElement = (MarkedArea)outputVector.elementAt(0); - iPosition = iElement.position; + iPosition = iElement.position.position; if (debug2) System.out.println("Less: "+jPosition+" and "+iPosition); position = findMax(0,j); @@ -1718,7 +1752,7 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, else { iElement = (MarkedArea)outputVector.elementAt(i); - iPosition = iElement.position; + iPosition = iElement.position.position; if (debug2) System.out.println("SELECTED TEXT Just: "+iPosition +" and "+jPosition+"\n"); position = findMax(i,j); @@ -1733,12 +1767,12 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, if (i>=0) { iElement = (MarkedArea)outputVector.elementAt(i); - iPosition = iElement.position; + iPosition = iElement.position.position; // more if (start<=iElement.end) { jElement = (MarkedArea)outputVector.elementAt(outputVector.size()-1); - jPosition = jElement.position; + jPosition = jElement.position.position; if (debug2) System.out.println("MORE: "+iPosition+ " and "+jPosition); position = findMax(i,outputVector.size()-1); @@ -1756,9 +1790,9 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, // bigger: { iElement = (MarkedArea)outputVector.elementAt(0); - iPosition = iElement.position; + iPosition = iElement.position.position; jElement = (MarkedArea)outputVector.elementAt(outputVector.size()-1); - jPosition = jElement.position; + jPosition = jElement.position.position; if (debug2) System.out.println("BIGGER: "+iPosition +" and "+jPosition+"\n"); if (debug2) @@ -1778,13 +1812,15 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, System.out.println("where selection start is: "+selectionStart); if (debug2) System.out.println("where selection end is: "+selectionEnd); + if (debug2&&(selectionStart>-1)) + System.out.println("where selection is: "+s.substring(selectionStart,selectionEnd)); currentLength = 0; newLength=0; oldLength = output.getText().length(); int j, l, l2, n, pos, selStartTotal, selEndTotal, selEndT; restString = s; int m2, m1; - String position = ""; + LinPosition position ; // if ((selectionStart>-1)&&(selectionEnd>=selectionStart)) if (selectionStart>-1) { @@ -1796,25 +1832,28 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, selectionCheck = (s.substring(selStart, selEnd).indexOf("<")==-1); l = restString.indexOf("-1)||(l>-1)) - { + { if ((l2==-1)||((l-1))) { - j = restString.indexOf(">",l); + j = restString.indexOf('>',l); n = restString.indexOf("<",j); - m1 = restString.indexOf("[",l); - m2 = restString.indexOf("]",l); + m1 = restString.indexOf('[',l); + m2 = restString.indexOf(']',l); //getting position: - position = restString.substring(m1,m2+1); + position = new LinPosition(restString.substring(m1,m2+1), + restString.substring(l,j).indexOf("incorrect")==-1); // something before the tag: if (l-currentLength>1) { if (debug2) System.out.println("SOMETHING BEFORE THE TAG"); if (currentPosition.size()>0) - register(currentLength, l, (String)currentPosition.elementAt(currentPosition.size()-1)); + register(currentLength, l, (LinPosition)currentPosition.elementAt(currentPosition.size()-1)); else - register(currentLength, l, "[]"); + register(currentLength, l, new LinPosition("[]", + restString.substring(l,j).indexOf("incorrect")==-1)); } // nothing before the tag: else @@ -1837,9 +1876,10 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, if (debug2) System.out.println("SOMETHING BEFORE THE TAG"); if (currentPosition.size()>0) - register(currentLength, l2, (String)currentPosition.elementAt(currentPosition.size()-1)); + register(currentLength, l2, (LinPosition)currentPosition.elementAt(currentPosition.size()-1)); else - register(currentLength, l2, "[]"); + register(currentLength, l2, new LinPosition("[]", + restString.substring(l,l2).indexOf("incorrect")==-1)); currentLength += newLength ; } // nothing before the tag: @@ -1862,12 +1902,13 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, ((MarkedArea)outputVector.elementAt(outputVector.size()-1)).end -=1; if (currentLength>0) currentLength -=1; } - if (debug2) System.out.println("currentLength: "+currentLength +" old length " +oldLength); + if (debug2) System.out.println("currentLength: "+currentLength +" old length " +oldLength); // register the punctuation: if (currentPosition.size()>0) - register(currentLength, currentLength+2, (String)currentPosition.elementAt(currentPosition.size()-1)); + register(currentLength, currentLength+2, (LinPosition)currentPosition.elementAt(currentPosition.size()-1)); else - register(currentLength, currentLength+2, "[]"); + register(currentLength, currentLength+2, new LinPosition("[]", + true)); currentLength += newLength ; } else @@ -1880,8 +1921,8 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, // System.out.println("/subtree index: "+l2 + "=selStart)&&(outputVector.size()>0)) @@ -1934,19 +1975,20 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, } } // appending: - output.append(restString); + // output.append(restString); + output.append(restString.replaceAll("&-","\n ")); if ((selectionEnd>=selectionStart)&&(selectionStart>-1)) try { - output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) ); + output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(color) ); selectedText = output.getText().substring(selStart+oldLength, selEnd+oldLength+1); -// output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(Color.white) ); + // output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(Color.white) ); } catch (Exception e) {System.out.println("highlighting problem!");} }// s.length()>0 } - public static void register(int start, int end, String position) + public static void register(int start, int end, LinPosition position) { oldLength = output.getText().length(); addedLength = 0; @@ -1957,61 +1999,51 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, if (newLength>0) { //focus has a separate position: - if (selectionCheck&&(selEndselStart)) { selectionCheck=false; if (debug2) System.out.println("SELECTION HAS A SEPARATE POSITION"); - // selection Second: - if (end-selEnd<=3) - if (selStart-start<=1) - { // only selection is to register: - resultCurrent = currentLength + oldLength ; - resultNew = newLength + resultCurrent - 1; - outputVector.addElement(new MarkedArea(resultCurrent, resultNew, focusPosition,restString.substring(selStart,selEnd+2))); - if (debug2) - System.out.println("APPENDING SelectedZONE ONLy:"+restString.substring(selStart,selEnd+2)+ - "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew); - } - else - { - // register the rest: - resultCurrent = currentLength+oldLength; - resultNew = resultCurrent+ selStart-start -1; - addedLength = selStart -start; - outputVector.addElement(new MarkedArea(resultCurrent, resultNew, position,restString.substring(start,start+addedLength))); - if (debug2) - System.out.println("APPENDING ZONE First:"+restString.substring(start,start+addedLength)+ - "Length: "+addedLength+" POSITION: "+resultCurrent + " "+resultNew); - currentLength += addedLength; + if (debug2) + System.out.println("SELECTION: "+ selStart+" "+selEnd); + if (debug2) + System.out.println("TEXT to REGISTER: "+ start+" "+end); + if (debug2) + System.out.println("CURRLENGTH: "+ currentLength); - //selection second: - newLength = selEnd - selStart+2; - resultCurrent = currentLength+oldLength; - resultNew = resultCurrent+ newLength -1; - outputVector.addElement(new MarkedArea(resultCurrent, resultNew, focusPosition,restString.substring(selStart,selEnd+2))); - if (debug2) - System.out.println("APPENDING SelectedZONE Second:"+restString.substring(selStart,selEnd+2)+ - "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew); - } - else - { // selection first: - addedLength = selEnd - selStart +2; - resultCurrent = currentLength+oldLength; - resultNew = resultCurrent + addedLength-1; - outputVector.addElement(new MarkedArea(resultCurrent, resultNew, focusPosition,restString.substring(selStart,selEnd+2))); + resultCurrent = currentLength+oldLength; + + if (selStart>start+1) + { + // register text before selection: + addedLength = selStart - start; + resultNew = resultCurrent+ addedLength -1; + outputVector.addElement(new MarkedArea(resultCurrent, resultNew, position, restString.substring(start,start+addedLength))); if (debug2) - System.out.println("APPENDING SelectedZONE First:"+restString.substring(selStart,selEnd+2)+ + System.out.println("APPENDING ZONE Before selection:"+restString.substring(start,start+addedLength)+ "Length: "+addedLength+" POSITION: "+resultCurrent + " "+resultNew); - currentLength += addedLength; - + } + + //selection: + resultCurrent += addedLength; + addedLength = selEnd - selStart + 2; + resultNew = resultCurrent + addedLength - 1; + outputVector.addElement(new MarkedArea(resultCurrent, resultNew, focusPosition,restString.substring(selStart,selEnd+2))); + if (debug2) + System.out.println("APPENDING SelectedZONE: "+restString.substring(selStart,selEnd+2)+ + "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew); + + + if (end>selEnd+2) + { // register the rest: - newLength = end-selEnd-2; - resultCurrent = currentLength+oldLength; - resultNew = resultCurrent + newLength -1; + resultCurrent += addedLength; + addedLength = end-selEnd-2; + resultNew = resultCurrent + addedLength -1; outputVector.addElement(new MarkedArea(resultCurrent, resultNew, position,restString.substring(selEnd+2,end))); - if (debug2) - System.out.println("APPENDING ZONE Second:"+restString.substring(selEnd+2,end)+ + if (debug2) + System.out.println("APPENDING ZONE after:"+ + restString.substring(selEnd+2,end)+ "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew); } }// focus has a separate position @@ -2027,7 +2059,7 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, outputVector.addElement(new MarkedArea(resultCurrent, resultNew, position,stringToAppend)); if (debug2) System.out.println("APPENDING ZONE:"+stringToAppend+ - "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew+" "+position); + "Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew+" "+position.position); } else if (debug2) @@ -2047,7 +2079,10 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, { positionStart = restString.indexOf("[", start); positionEnd = restString.indexOf("]", start); - currentPosition.addElement(restString.substring(positionStart, positionEnd+1)); + + currentPosition.addElement(new LinPosition( + restString.substring(positionStart, positionEnd+1), + restString.substring(start,end).indexOf("incorrect")==-1)); } else if (currentPosition.size()>0) @@ -2136,3 +2171,71 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener, repaint(); } } + + /*focus has a separate position: + if (selectionCheck&&(selEnd