diff --git a/examples/letter/Letter.gfcm b/examples/letter/Letter.gfcm index 45f7c59c6..6cf296396 100644 --- a/examples/letter/Letter.gfcm +++ b/examples/letter/Letter.gfcm @@ -1,3 +1,95 @@ +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" ; @@ -11,17 +103,17 @@ lin DarlingShe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = {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 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 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" ; +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" ; @@ -47,152 +139,6 @@ param Gen = masc | fem ; param Kas = nom | acc ; param Num = sg | pl ; } -abstract Letter = {cat Author [] = ; -fun BePromoted : (h_ : Letter.Position)-> Letter.Sentence = data ; -fun ColleagueHe : Letter.Recipient = data ; -fun ColleagueShe : Letter.Recipient = data ; -fun ColleaguesHe : Letter.Recipient = data ; -fun ColleaguesShe : Letter.Recipient = data ; -fun Company : Letter.NounPhrase = data ; -fun Competitor : Letter.NounPhrase = data ; -fun DarlingHe : Letter.Recipient = data ; -fun DarlingShe : Letter.Recipient = data ; -fun Dean : Letter.Author = data ; -fun DearRec : (h_ : Letter.Recipient)-> Letter.Heading = data ; -cat Ending [] = ; -fun FormalEnding : (h_ : Letter.Author)-> Letter.Ending = data ; -fun GoBankrupt : (h_ : Letter.NounPhrase)-> Letter.Sentence = data ; -cat Heading [] = ; -fun HelloRec : (h_ : Letter.Recipient)-> Letter.Heading = data ; -fun Honour : Letter.Mode = data ; -fun ILoveYou : Letter.Sentence = data ; -fun InformalEnding : (h_ : Letter.Author)-> Letter.Ending = data ; -fun JustHello : (h_ : Letter.Recipient)-> Letter.Heading = data ; -cat Letter [] = ; -cat Message [] = ; -fun MkLetter : (h_ : Letter.Heading)-> (h_ : Letter.Message)-> (h_ : Letter.Ending)-> Letter.Letter = data ; -cat Mode [] = ; -fun ModeSent : (h_ : Letter.Mode)-> (h_ : Letter.Sentence)-> Letter.Message = data ; -fun Mother : Letter.Author = data ; -fun Name : (h_ : PredefAbs.String)-> Letter.Author = data ; -fun NameHe : (h_ : PredefAbs.String)-> Letter.Recipient = data ; -fun NameShe : (h_ : PredefAbs.String)-> Letter.Recipient = data ; -cat NounPhrase [] = ; -fun OurCustomers : Letter.NounPhrase = data ; -fun PlainRec : (h_ : Letter.Recipient)-> Letter.Heading = data ; -fun PlainSent : (h_ : Letter.Sentence)-> Letter.Message = data ; -cat Position [] = ; -fun President : Letter.Author = data ; -fun ProjectManager : Letter.Position = data ; -cat Recipient [] = ; -fun Regret : Letter.Mode = data ; -fun Senior : Letter.Position = data ; -cat Sentence [] = ; -fun Spouse : Letter.Author = data ; -} -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 ; -} -resource ResEng = {param DepNum = depnum | cnum ResEng.Num ; -param Kas = nom | acc ; -param Num = sg | pl ; -param Sex = masc | fem ; -} -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 ResSve = {param DepNum = depnum | cnum ResSve.Num ; -param Gen = en | ett ; -param Kas = nom | acc ; -param Num = sg | pl ; -param Sex = masc | fem ; -} 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" ; @@ -206,17 +152,17 @@ lin DarlingShe : Letter.Recipient = \ -> {s = " 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 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 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" ; +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" ; @@ -236,52 +182,106 @@ lin Senior : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl 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 ResRusU = {param DepGen = depgen | cgen ResRusU.Gen ; -param DepNum = depnum | cnum ResRusU.Num ; +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 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 } ;"Здравствуй" ; +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 : (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" ; +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 : (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 = } ;"твоя жена" ; +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/examples/letter/letter.Eng.gf b/examples/letter/letter.Eng.gf index 195caf8c7..561917551 100644 --- a/examples/letter/letter.Eng.gf +++ b/examples/letter/letter.Eng.gf @@ -3,7 +3,7 @@ -- This file defines the English syntax of the grammar set -- whose abstract syntax is $letter.Abs.gf$. -include letter.Abs.gf ; +include letter.Abs.gf ; flags lexer=textlit ; unlexer=textlit ; @@ -44,8 +44,8 @@ Position = SSDep ; lin MkLetter head mess end = - ss (head.s ++ "," ++ "

" ++ - mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "

" ++ + ss (head.s ++ "," ++ "&-" ++ + mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "&-" ++ end.s ! head.n ! head.x) ; DearRec rec = {s = "Dear" ++ rec.s ; n = rec.n ; x = rec.x} ; @@ -62,10 +62,10 @@ PlainSent sent = sent ; FormalEnding auth = {s = table {n => table {x => - ["Sincerely yours

"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; + ["Sincerely yours &-"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; InformalEnding auth = {s = table {n => table {x => - ["With best regards

"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; + ["With best regards &-"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; diff --git a/examples/letter/letter.Fin.gf b/examples/letter/letter.Fin.gf index 5536d12d6..afebeef69 100644 --- a/examples/letter/letter.Fin.gf +++ b/examples/letter/letter.Fin.gf @@ -84,8 +84,8 @@ Position = SSDep ; lin MkLetter head mess end = - ss (head.s ++ "," ++ "

" ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "

" ++ + ss (head.s ++ "," ++ "&-" ++ + mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "&-" ++ end.s ! head.n ! head.g) ; DearRec rec = {s = cher ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; @@ -101,10 +101,10 @@ ModeSent mode sent = PlainSent sent = sent ; FormalEnding auth = - {s = table {n => table {g => ["parhain terveisin

"] ++ auth.s ! n ! g}} ; + {s = table {n => table {g => ["parhain terveisin &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; InformalEnding auth = - {s = table {n => table {g => ["terveisin

"] ++ auth.s ! n ! g}} ; + {s = table {n => table {g => ["terveisin &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; ColleaguesHe = {s = regNom "kollega" ! pl ; n = pl ; g = masc} ; diff --git a/examples/letter/letter.Fra.gf b/examples/letter/letter.Fra.gf index 33b45143e..afbb6db4e 100644 --- a/examples/letter/letter.Fra.gf +++ b/examples/letter/letter.Fra.gf @@ -80,8 +80,8 @@ Position = SSDep ; lin MkLetter head mess end = - ss (head.s ++ "," ++ "

" ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "

" ++ + ss (head.s ++ "," ++ "&-" ++ + mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "&-" ++ end.s ! head.n ! head.g) ; DearRec rec = {s = cher ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; @@ -100,10 +100,10 @@ FormalEnding auth = {s = table {n => table {g => "avec" ++ mes ! dep2num auth.n n ++ - ["salutations distingues

"] ++ auth.s ! n ! g}} ; + ["salutations distingues &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; InformalEnding auth = - {s = table {n => table {g => ["Amicalement

"] ++ auth.s ! n ! g}} ; + {s = table {n => table {g => ["Amicalement &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; ColleaguesHe = {s = regNom "collgue" ! pl ; n = pl ; g = masc} ; diff --git a/examples/letter/letter.RusU.gf b/examples/letter/letter.RusU.gf index 24efee06c..1ed5f4404 100644 --- a/examples/letter/letter.RusU.gf +++ b/examples/letter/letter.RusU.gf @@ -85,8 +85,8 @@ Position = SSDep ; lin MkLetter head mess end = - ss (head.s ++ "," ++ "

" ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "

" ++ + ss (head.s ++ "," ++ "&-" ++ + mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "&-" ++ end.s ! head.n ! head.g) ; DearRec rec = {s = regAdj "Дорог" @@ -106,10 +106,10 @@ FormalEnding auth = {s = table {n => table {g => "С" ++ - ["наилучшими пожеланиями,

"] ++ auth.s ! n ! g}} ; + ["наилучшими пожеланиями, &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; InformalEnding auth = - {s = table {n => table {g => ["С дружеским приветом,

"] ++ auth.s ! n ! g}} ; + {s = table {n => table {g => ["С дружеским приветом, &-"] ++ auth.s ! n ! g}} ; n = auth.n ; g = auth.g} ; ColleaguesHe = {s = "коллеги" ; n = pl ; g = masc} ; diff --git a/examples/letter/letter.Sve.gf b/examples/letter/letter.Sve.gf index fc95cc8f6..00d5439ef 100644 --- a/examples/letter/letter.Sve.gf +++ b/examples/letter/letter.Sve.gf @@ -50,8 +50,8 @@ Position = SSDep ; lin MkLetter head mess end = - ss (head.s ++ "," ++ "

" ++ - mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "

" ++ + ss (head.s ++ "," ++ "&-" ++ + mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "&-" ++ end.s ! head.n ! head.x) ; DearRec rec = {s = kaer ! rec.n ! rec.x ++ rec.s ; n = rec.n ; x = rec.x} ; @@ -68,11 +68,11 @@ PlainSent sent = sent ; FormalEnding auth = {s = table {n => table {x => - ["Med vnlig hlsning

"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; + ["Med vnlig hlsning &-"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; InformalEnding auth = {s = table {n => table {x => - ["Med hlsningar

"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; + ["Med hlsningar &-"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; diff --git a/grammars/logic/ArithmEng.gf b/grammars/logic/ArithmEng.gf index 8c78132ea..e09f14396 100644 --- a/grammars/logic/ArithmEng.gf +++ b/grammars/logic/ArithmEng.gf @@ -1,3 +1,5 @@ +--# -path=.:../prelude + concrete ArithmEng of Arithm = LogicEng ** open LogicResEng in { lin diff --git a/grammars/logic/LogicEng.gf b/grammars/logic/LogicEng.gf index 3b823fcb0..b708068e2 100644 --- a/grammars/logic/LogicEng.gf +++ b/grammars/logic/LogicEng.gf @@ -1,4 +1,4 @@ -concrete LogicEng of Logic = open LogicResEng in { +concrete LogicEng of Logic = open LogicResEng, Prelude in { flags lexer=vars ; unlexer=text ; @@ -8,9 +8,10 @@ lincat lin Statement A = {s = A.s ++ "."} ; -ThmWithProof A a = {s = ["Theorem ."] ++ A.s ++ [".

Proof ."] ++ a.s ++ "."} ; +ThmWithProof A a = {s = + ["Theorem ."] ++ A.s ++ "." ++ PARA ++ "Proof" ++ "." ++ a.s ++ "."} ; ThmWithTrivialProof A a = - {s = "Theorem" ++ "." ++ A.s ++ [".

Proof . Trivial ."]} ; + {s = "Theorem" ++ "." ++ A.s ++ "." ++ PARA ++ "Proof" ++ "." ++ "Trivial" ++ "."} ; Disj A B = {s = A.s ++ "or" ++ B.s} ; Conj A B = {s = A.s ++ "and" ++ B.s} ; Impl A B = {s = "if" ++ A.s ++ "then" ++ B.s} ; diff --git a/grammars/prelude/Prelude.gf b/grammars/prelude/Prelude.gf index d124d7df6..c84fa6188 100644 --- a/grammars/prelude/Prelude.gf +++ b/grammars/prelude/Prelude.gf @@ -94,6 +94,7 @@ oper glueOpt : Str -> Str -> Str = \x,y -> variants {glue x y ; x ++ y} ; noglueOpt : Str -> Str -> Str = \x,y -> variants {x ++ y ; glue x y} ; --- this should be hidden, and never changed since it's hardcoded in (un)lexers +-- these should be hidden, and never changed since it's hardcoded in (un)lexers BIND : Str = "&+" ; + PARA : Str = "&-" ; } ; diff --git a/src/GF/Canon/AbsGFC.hs b/src/GF/Canon/AbsGFC.hs index 78f237d38..846a570b8 100644 --- a/src/GF/Canon/AbsGFC.hs +++ b/src/GF/Canon/AbsGFC.hs @@ -129,6 +129,7 @@ data Term = data Tokn = KS String + | KM String | KP [String] [Variant] deriving (Eq,Ord,Show) diff --git a/src/GF/Canon/CMacros.hs b/src/GF/Canon/CMacros.hs index e075821b2..45f3c9d81 100644 --- a/src/GF/Canon/CMacros.hs +++ b/src/GF/Canon/CMacros.hs @@ -16,37 +16,64 @@ import Monad -- macros for concrete syntax in GFC that do not need lookup in a grammar -- how to mark subtrees, dep. on node, position, whether focus -type Marker = V.TrNode -> [Int] -> Bool -> (String, String) +type JustMarker = V.TrNode -> [Int] -> Bool -> (String, String) + +-- also to process the text (needed for escapes e.g. in XML) +type Marker = (JustMarker, Maybe (String -> String)) + +defTMarker :: JustMarker -> Marker +defTMarker = flip (curry id) Nothing markSubtree :: Marker -> V.TrNode -> [Int] -> Bool -> Term -> Term -markSubtree mk n is = markSubterm . mk n is +markSubtree (mk,esc) n is = markSubterm esc . mk n is + +escapeMkString :: Marker -> Maybe (String -> String) +escapeMkString = snd -- if no marking is wanted, use the following noMark :: Marker -noMark _ _ _ = ("","") +noMark = defTMarker mk where + mk _ _ _ = ("","") -- for vanilla brackets, focus, and position, use markBracket :: Marker -markBracket n p b = if b then ("[*" ++ show p,"*]") else ("[" ++ show p,"]") +markBracket = defTMarker mk where + mk n p b = if b then ("[*" ++ show p,"*]") else ("[" ++ show p,"]") -- for focus only markFocus :: Marker -markFocus n p b = if b then ("[*","*]") else ("","") +markFocus = defTMarker mk where + mk n p b = if b then ("[*","*]") else ("","") -- for XML, use -markXML :: Marker -markXML n i b = +markJustXML :: JustMarker +markJustXML n i b = if b then ("", "") else ("", "") where c = "type=" ++ prt (M.valNode n) p = "position=" ++ (show $ reverse i) - s = "" ---- if (null (M.constrsNode n)) then "" else " status=incorrect" + s = if (null (M.constrsNode n)) then "" else " status=incorrect" + +markXML :: Marker +markXML = (markJustXML, Just esc) where + esc s = case s of + '\\':'<':cs -> '\\':'<':esc cs + '\\':'>':cs -> '\\':'>':esc cs + '\\':'\\':cs -> '\\':'\\':esc cs + ----- the first 3 needed because marking may revisit; needs to be fixed + + '<':cs -> '\\':'<':esc cs + '>':cs -> '\\':'>':esc cs + '\\':cs -> '\\':'\\':esc cs + c :cs -> c :esc cs + _ -> s -- for XML in JGF 1, use markXMLjgf :: Marker -markXMLjgf n p b = +markXMLjgf = defTMarker mk where + mk n p b = if b then ("", "") else ("","") @@ -54,19 +81,28 @@ markXMLjgf n p b = c = "type=" ++ prt (M.valNode n) -- the marking engine -markSubterm :: (String,String) -> Term -> Term -markSubterm (beg, end) t = case t of +markSubterm :: Maybe (String -> String) -> (String,String) -> Term -> Term +markSubterm esc (beg, end) t = case t of R rs -> R $ map markField rs T ty cs -> T ty [Cas p (mark v) | Cas p v <- cs] FV ts -> FV $ map mark ts - _ -> foldr1 C (tk beg ++ [t] ++ tk end) -- t : Str guaranteed? + _ -> foldr1 C (tm beg ++ [mkEscIf t] ++ tm end) -- t : Str guaranteed? where - mark = markSubterm (beg, end) + mark = markSubterm esc (beg, end) markField lt@(Ass l t) = if isLinLabel l then (Ass l (mark t)) else lt - tk s = if null s then [] else [tK s] + tm s = if null s then [] else [tM s] + mkEscIf t = case esc of + Just f -> mkEsc f t + _ -> t + mkEsc f t = case t of + K (KS s) -> K (KS (f s)) + C u v -> C (mkEsc f u) (mkEsc f v) + FV ts -> FV (map (mkEsc f) ts) + _ -> t ---- do we need to look at other cases? -tK :: String -> Term +tK,tM :: String -> Term tK = K . KS +tM = K . KM term2patt :: Term -> Err Patt term2patt trm = case trm of @@ -120,6 +156,7 @@ valTableType t = case t of strsFromTerm :: Term -> Err [Str] strsFromTerm t = case t of K (KS s) -> return [str s] + K (KM s) -> return [str s] K (KP d vs) -> return $ [Str [TN d [(s,v) | Var s v <- vs]]] C s t -> do s' <- strsFromTerm s diff --git a/src/GF/Canon/GFC.cf b/src/GF/Canon/GFC.cf index ff6af21e8..a7199af4c 100644 --- a/src/GF/Canon/GFC.cf +++ b/src/GF/Canon/GFC.cf @@ -115,6 +115,7 @@ E. Term2 ::= "[" "]" ; KS. Tokn ::= String ; KP. Tokn ::= "[" "pre" [String] "{" [Variant] "}" "]" ; +internal KM. Tokn ::= String ; -- mark-up Ass. Assign ::= Label "=" Term ; Cas. Case ::= [Patt] "=>" Term ; diff --git a/src/GF/Canon/PrintGFC.hs b/src/GF/Canon/PrintGFC.hs index 2e617c61f..3e6ddc88e 100644 --- a/src/GF/Canon/PrintGFC.hs +++ b/src/GF/Canon/PrintGFC.hs @@ -272,6 +272,7 @@ instance Print Term where instance Print Tokn where prt i e = case e of KS str -> prPrec i 0 (concatD [prt 0 str]) + KM str -> prPrec i 0 (concatD [prt 0 str]) KP strs variants -> prPrec i 0 (concatD [doc (showString "[") , doc (showString "pre") , prt 0 strs , doc (showString "{") , prt 0 variants , doc (showString "}") , doc (showString "]")]) diff --git a/src/GF/Canon/Unlex.hs b/src/GF/Canon/Unlex.hs index f665f4c85..68c3c054e 100644 --- a/src/GF/Canon/Unlex.hs +++ b/src/GF/Canon/Unlex.hs @@ -21,7 +21,7 @@ formatAsText = unwords . format . cap . words where cap [] = [] major = flip elem (map (:[]) ".!?") minor = flip elem (map (:[]) ",:;") - para = (=="

") + para = (=="&-") unlex :: [Str] -> String unlex = formatAsText . performBinds . concat . map sstr . take 1 ---- diff --git a/src/GF/Text/Text.hs b/src/GF/Text/Text.hs index de29e9026..aff52608b 100644 --- a/src/GF/Text/Text.hs +++ b/src/GF/Text/Text.hs @@ -46,7 +46,7 @@ formatAsText = unwords . format . cap . words where cap [] = [] major = flip elem (map singleton ".!?") minor = flip elem (map singleton ",:;") - para = (=="

") + para = (=="&-") formatAsCode :: String -> String formatAsCode = rend 0 . words where