From eb82e5960e771eb52fa07a1648739efbcd3bd27a Mon Sep 17 00:00:00 2001 From: aarne Date: Thu, 29 Jan 2004 12:03:23 +0000 Subject: [PATCH] Improving unicode menus, e.g. in Letter. --- examples/letter/Letter.gfcm | 287 +++++++++++++++++++++++++++++++++ examples/letter/letter.Abs.gf | 80 +++++++++ examples/letter/letter.Eng.gf | 151 +++++++++++++++++ examples/letter/letter.Fin.gf | 179 ++++++++++++++++++++ examples/letter/letter.Fra.gf | 168 +++++++++++++++++++ examples/letter/letter.RusU.gf | 178 ++++++++++++++++++++ examples/letter/letter.Sve.gf | 161 ++++++++++++++++++ examples/letter/mkLetter.gfs | 13 ++ src/GF/Shell/Commands.hs | 7 +- src/Today.hs | 2 +- 10 files changed, 1224 insertions(+), 2 deletions(-) create mode 100644 examples/letter/Letter.gfcm create mode 100644 examples/letter/letter.Abs.gf create mode 100644 examples/letter/letter.Eng.gf create mode 100644 examples/letter/letter.Fin.gf create mode 100644 examples/letter/letter.Fra.gf create mode 100644 examples/letter/letter.RusU.gf create mode 100644 examples/letter/letter.Sve.gf create mode 100644 examples/letter/mkLetter.gfs diff --git a/examples/letter/Letter.gfcm b/examples/letter/Letter.gfcm new file mode 100644 index 000000000..377141d44 --- /dev/null +++ b/examples/letter/Letter.gfcm @@ -0,0 +1,287 @@ +concrete Finnish of Letter = open ResFin in {flags startcat = Letter ;flags lexer = textlit ;flags unlexer = textlit ;lincat Author = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Author" ; +lin BePromoted : Letter.Sentence = \ Position @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) ;(ResFin.masc)=> "teidt" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! ! ) }}}}} ;"(sinut on)ylennetty Position_0" ; +lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;g = } ;"kollega" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegat" ;n = ;g = } ;"kollegat" ; +lin Company : Letter.NounPhrase = \ -> {s = "yrityksemme" ;n = ;g = } ;"yrityksemme" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "pahin" ++ "kilpailijamme" ;n = ;g = } ;"pahin kilpailijamme" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "kulta" ;n = ;g = } ;"kulta" ; +lin Dean : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "dekaani" }} ;n = > ;g = > } ;"dekaani" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakas" }! (Recipient @ 0.g);(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakkaat" }! (Recipient @ 0.g)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"rakas Recipient_0" ; +lincat Ending = {s : (ResFin.Num => (ResFin.Gen => Str)) ;n : ResFin.DepNum ;g : ResFin.DepGen }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }} ;n = ;g = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "

")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "

")++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "

")++ Author @ 0.s ! ! ;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "

")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(parhain terveisin

)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> NounPhrase @ 0.s ++ (table ResFin.Num {(ResFin.sg)=> "on" ;(ResFin.pl)=> "ovat" }! (NounPhrase @ 0.n)++ (table ResFin.Num {(ResFin.pl)=> "menneet" ;(ResFin.sg)=> "mennyt" }! (NounPhrase @ 0.n)++ "konkurssiin")) }}}}} ;"NounPhrase_0 on mennyt konkurssiin" ; +lincat Heading = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meill" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "sinulle" ++ "ett")) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minulla" ++ "on" ++ ("kunnia" ++ ("ilmoittaa" ++ "teille" ++ "ett")) }}}}} ;"(minulla on)kunnia (ilmoittaa sinulle)ett" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" }}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastamme" ++ "teit" }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "sinua" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "rakastan" ++ "teit" }}}}} ;"rakastan sinua" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "

" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "

" ++ Author @ 0.s ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "

" ++ Author @ 0.s ! ! ;(ResFin.masc)=> "terveisin" ++ "

" ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(terveisin

)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Terve" ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Terve" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Letter" ; +lincat Message = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("

" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("

" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 ,

Message_1 .

Ending_2" ; +lincat Mode = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResFin.DepNum {(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! > ! ! ++ Sentence @ 1.s ! > ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResFin.depnum)=> table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! > ! ! ++ Sentence @ 1.s ! ! > ! ! }} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResFin.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "iti" }} ;n = > ;g = > } ;"iti" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> String @ 0.s }} ;n = > ;g = > } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;g = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "asiakkaamme" ;n = ;g = } ;"asiakkaamme" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;g = Recipient @ 0.g } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResFin.Num => (ResFin.Gen => Str)) }= {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "presidentti" }} ;n = > ;g = > } ;"presidentti" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikiksi" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipllikksi" }}} ;"projektipllikksi" ; +lincat Recipient = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = ;g = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResFin.DepNum {(ResFin.depnum)=> table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "meidn" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "minun" ++ ("on" ++ ("valitettavasti" ++ "ilmoitettava")++ "ett")}}}}} ;"minun (on valitettavasti ilmoitettava)ett" ; +lin Senior : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmaksi" ++ "tutkijaksi" } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "vanhemmiksi" ++ "tutkijoiksi" }}} ;"vanhemmaksi tutkijaksi" ; +lincat Sentence = {s : (ResFin.DepNum => (ResFin.DepGen => (ResFin.Num => (ResFin.Gen => Str)))) }= {s = table ResFin.DepNum {(ResFin.depnum)(ResFin.cnum (ResFin.sg)) (ResFin.cnum (ResFin.pl)) => table ResFin.DepGen {(ResFin.depgen)(ResFin.cgen (ResFin.masc)) (ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "miehenne" ;(ResFin.masc)=> "vaimonne" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "miehesi" ;(ResFin.masc)=> "vaimosi" }} ;n = ;g = } ;"vaimosi" ; +} +resource ResFin = {param DepGen = depgen | cgen ResFin.Gen ; +param DepNum = depnum | cnum ResFin.Num ; +param Gen = masc | fem ; +param Kas = nom | acc ; +param Num = sg | pl ; +} +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" ; +lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = ;x = } ;"kollega" ; +lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; +lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegor" ;n = ;x = } ;"kollegor" ; +lin Company : Letter.NounPhrase = \ -> {s = "vrt" ++ "fretag" ;n = ;g = } ;"vrt fretag" ; +lin Competitor : Letter.NounPhrase = \ -> {s = "vr" ++ ("vrsta" ++ "konkurrent");n = ;g = } ;"vr vrsta konkurrent" ; +lin DarlingHe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; +lin DarlingShe : Letter.Recipient = \ -> {s = "lskling" ;n = ;x = } ;"lskling" ; +lin Dean : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Dekanus" }} ;n = > ;x = } ;"Dekanus" ; +lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Kra" ;(ResSve.masc)=> "Kre" }! (Recipient @ 0.x);(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Kra" }! (Recipient @ 0.x)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Kre Recipient_0" ; +lincat Ending = {s : (ResSve.Num => (ResSve.Sex => Str)) ;n : ResSve.DepNum ;x : ResSve.Sex }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }} ;n = ;x = } ;"Ending" ; +lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "

")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "

")) ++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "

")) ++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("vnlig" ++ ("hlsning" ++ "

")) ++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med vnlig hlsning

)Author_0" ; +lin GoBankrupt : Letter.Sentence = \ NounPhrase @ 0 -> {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> NounPhrase @ 0.s ++ ("har" ++ ("gtt" ++ ("i" ++ "konkurs")))}}}}} ;"NounPhrase_0 har gtt i konkurs" ; +lincat Heading = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Heading" ; +lin HelloRec : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej Recipient_0" ; +lin Honour : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("har" ++ ("ran" ++ ("att" ++ "meddela")) ++ ("er" ++ "att")) }}}}} ;"jag (har ran att meddela)dig att" ; +lin ILoveYou : Letter.Sentence = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "er")}}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "dig")} ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("lskar" ++ "er")}}}}} ;"jag lskar dig" ; +lin InformalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "

")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "

")++ Author @ 0.s ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hlsningar" ++ "

")++ Author @ 0.s ! ! ;(ResSve.masc)=> "Med" ++ ("hlsningar" ++ "

")++ Author @ 0.s ! ! }} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med hlsningar

)Author_0" ; +lin JustHello : Letter.Heading = \ Recipient @ 0 -> {s = "Hej" ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Hej" ; +lincat Letter = {s : Str }= {s = str @ 0 } ;"Brev" ; +lincat Message = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Message" ; +lin MkLetter : Letter.Letter = \ Heading @ 0, Message @ 1, Ending @ 2 -> {s = Heading @ 0.s ++ ("," ++ ("

" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("

" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"brevmall" ; +lincat Mode = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Mode" ; +lin ModeSent : Letter.Message = \ Mode @ 0, Sentence @ 1 -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! > ! ! ! ++ Sentence @ 1.s ! > ! ! ! }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! } ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! ;(ResSve.masc)=> Mode @ 0.s ! ! ! ! ++ Sentence @ 1.s ! ! ! ! }}}}} ;"Mode_0 Sentence_1" ; +lin Mother : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Mamma" }} ;n = > ;x = } ;"Mamma" ; +lin Name : Letter.Author = \ String @ 0 -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> String @ 0.s }} ;n = > ;x = } ;"String_0" ; +lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = ;x = } ;"String_0" ; +lincat NounPhrase = {s : Str ;n : ResSve.Num ;g : ResSve.Gen }= {s = str @ 0 ;n = ;g = } ;"NounPhrase" ; +lin OurCustomers : Letter.NounPhrase = \ -> {s = "vra" ++ "kunder" ;n = ;g = } ;"vra kunder" ; +lin PlainRec : Letter.Heading = \ Recipient @ 0 -> {s = Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Recipient_0" ; +lin PlainSent : Letter.Message = \ Sentence @ 0 -> {s = Sentence @ 0.s } ;"Sentence_0" ; +lincat Position = {s : (ResSve.Num => (ResSve.Sex => Str)) }= {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}} ;"Position" ; +lin President : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Presidenten" }} ;n = > ;x = } ;"Presidenten" ; +lin ProjectManager : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchef" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "projektchefer" }}} ;"projektchef" ; +lincat Recipient = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = ;x = } ;"Recipient" ; +lin Regret : Letter.Mode = \ -> {s = table ResSve.DepNum {(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}} ;(ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("mste" ++ ("tyvrr" ++ "meddela")++ ("er" ++ "att")) }}}}} ;"jag (mste tyvrr meddela)dig att" ; +lin Senior : Letter.Position = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "ldre" ++ "forskare" }}} ;"ldre forskare" ; +lincat Sentence = {s : (ResSve.DepNum => (ResSve.Sex => (ResSve.Num => (ResSve.Sex => Str)))) }= {s = table ResSve.DepNum {(ResSve.depnum)(ResSve.cnum (ResSve.sg)) (ResSve.cnum (ResSve.pl)) => table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> str @ 0 }}}}} ;"Sentence" ; +lin Spouse : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.masc)=> "din" ++ "hustru" ;(ResSve.fem)=> "din" ++ "man" } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)=> "era" ++ "hustrur" ;(ResSve.fem)=> "era" ++ "mn" }} ;n = ;x = } ;"din hustru" ; +} +resource 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 ; +} +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 = } ;"твоя жена" ; +} diff --git a/examples/letter/letter.Abs.gf b/examples/letter/letter.Abs.gf new file mode 100644 index 000000000..48be93a33 --- /dev/null +++ b/examples/letter/letter.Abs.gf @@ -0,0 +1,80 @@ +--1 An Abstract Syntax for Business and Love Letters +-- +-- This file defines the abstract syntax of a grammar set whose concrete syntax +-- has so far been written to five languages: English, Finnish, French, Russian, +-- and Swedish. +-- +-- The main category of the grammar is $Letter$. The other categories are +-- parts of the letter. + +flags startcat=Letter ; + +cat + Letter ; + Recipient ; Author ; + Message ; + Heading ; Ending ; + Mode ; Sentence ; NounPhrase ; Position ; + +-- There is just one top-level letter structure. + +fun + MkLetter : Heading -> Message -> Ending -> Letter ; + +-- The heading consists of a greeting of the recipient. The $JustHello$ +-- function will actually suppress the name (and title) of the recipient, +-- but the $Recipient$ argument keeps track of the gender and number. + + DearRec : Recipient -> Heading ; + PlainRec : Recipient -> Heading ; + HelloRec : Recipient -> Heading ; + JustHello : Recipient -> Heading ; + +-- A message is a sentence with of without a *mode*, which is either +-- regret or honour. + + ModeSent : Mode -> Sentence -> Message ; + PlainSent : Sentence -> Message ; + + Honour, Regret : Mode ; + +-- The ending is either formal or informal. It does not currently depend on +-- the heading: making it so would eliminate formality mismatches between +-- the heading and the ending. + + FormalEnding : Author -> Ending ; + InformalEnding : Author -> Ending ; + +-- The recipient is either a colleague, colleagues, or darling. +-- It can also be a named person. The gender distinction is made +-- because there are things in the body of the letter that depend on it. + + ColleagueHe, ColleagueShe : Recipient ; + ColleaguesHe, ColleaguesShe : Recipient ; + DarlingHe, DarlingShe : Recipient ; + + NameHe, NameShe : String -> Recipient ; + +-- For the author, there is likewise a fixed set of titles, plus the named author. +-- Gender distinctions could be useful even here, for the same reason as with +-- $Recipient$. Notice that the rendering of $Spouse$ will depend on the +-- gender of the recipient. + + President, Mother, Spouse, Dean : Author ; + Name : String -> Author ; + +-- As for the message body, no much choice is yet available: one can say that +-- the recipient is promoted to some position, that someone has gone bankrupt, +-- or that the author loves the recipient. + + BePromoted : Position -> Sentence ; + GoBankrupt : NounPhrase -> Sentence ; + ILoveYou : Sentence ; + + Competitor : NounPhrase ; + Company : NounPhrase ; + OurCustomers : NounPhrase ; + + Senior : Position ; + ProjectManager : Position ; + diff --git a/examples/letter/letter.Eng.gf b/examples/letter/letter.Eng.gf new file mode 100644 index 000000000..195caf8c7 --- /dev/null +++ b/examples/letter/letter.Eng.gf @@ -0,0 +1,151 @@ +--1 An English Concrete Syntax for Business and Love Letters +-- +-- This file defines the English syntax of the grammar set +-- whose abstract syntax is $letter.Abs.gf$. + +include letter.Abs.gf ; + +flags lexer=textlit ; unlexer=textlit ; + +param Sex = masc | fem ; +param Num = sg | pl ; +param Kas = nom | acc ; +param DepNum = depnum | cnum Num ; + +lintype SS = {s : Str} ; +lintype SSDep = {s : Num => Sex => Str} ; -- needs Num and Sex +lintype SSSrc = {s : Str ; n : Num ; x : Sex} ; -- gives Num and Sex +lintype SSSrc2 = {s : Num => Sex => Str ; n : DepNum ; x : Sex} ; -- gives and needs +lintype SSDep2 = {s : DepNum => Sex => Num => Sex => Str} ; -- needs Auth's & Recp's +lintype SSSrcNum = {s : Str ; n : Num} ; -- gives Num only + + +oper + ss : Str -> SS = \s -> {s = s} ; + constNX : Str -> Num -> Sex -> SSSrc2 = \str,num,sex -> + {s = table {_ => table {_ => str}} ; n = cnum num ; x = sex} ; + + dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { + depnum => n ; + cnum cn => cn + } ; + +lincat +Letter = SS ; +Recipient = SSSrc ; +Author = SSSrc2 ; +Message = SSDep2 ; +Heading = SSSrc ; +Ending = SSSrc2 ; +Mode = SSDep2 ; +Sentence = SSDep2 ; +NounPhrase = SSSrcNum ; +Position = SSDep ; + +lin +MkLetter head mess end = + 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} ; +PlainRec rec = rec ; +HelloRec rec = {s = "Hello" ++ rec.s ; n = rec.n ; x = rec.x} ; +JustHello rec = {s = "Hello" ; n = rec.n ; x = rec.x} ; + +ModeSent mode sent = + {s = + table {dna => table {xa => table {nr => table {xr => + mode.s ! dna ! xa ! nr ! xr ++ sent.s ! dna ! xa ! nr ! xr}}}} + } ; +PlainSent sent = sent ; + +FormalEnding auth = + {s = table {n => table {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} ; + +ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; +ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; +ColleagueHe = {s = kollega ! sg ; n = sg ; x = masc} ; +ColleagueShe = {s = kollega ! sg ; n = sg ; x = fem} ; +DarlingHe = {s = "darling" ; n = sg ; x = masc} ; +DarlingShe = {s = "darling" ; n = sg ; x = fem} ; +NameHe s = {s = s.s ; n = sg ; x = masc} ; +NameShe s = {s = s.s ; n = sg ; x = fem} ; + + +Honour = {s = + table {dna => table {xa => table {nr => table {xr => + let {na = dep2num dna nr} in + ego ! na ! nom ++ ["have the honour to inform you that"]}}}} + } ; + +Regret = {s = + table {dna => table {xa => table {nr => table {xr => + let {na = dep2num dna nr} in + ego ! na ! nom ++ am ! na ++ ["sorry to inform you that"]}}}} + } ; + + +President = constNX ["the President"] sg masc ; +Mother = constNX "Mom" sg fem ; +Spouse = {s = table { + sg => table {fem => ["your husband"] ; masc => ["your wife"]} ; + pl => table {fem => ["your husbands"] ; masc => ["your wives"]} + } ; n = depnum ; x = masc} ; -- sex does not matter here +Dean = constNX ["the Dean"] sg masc ; +Name s = constNX s.s sg masc ; --- + +BePromoted pos = {s = + table {na => table {xa => table {nr => table {xr => + ["you have been promoted to"] ++ + pos.s ! nr ! xr}}}} + } ; +GoBankrupt np = {s = + table {na => table {xa => table {nr => table {xr => + np.s ++ have ! np.n ++ ["gone bankrupt"]}}}} + } ; +ILoveYou = {s = + table {na => table {xa => table {nr => table {xr => + ego ! dep2num na nr ! nom ++ ["love you"]}}}} + } ; + +Company = {s = ["our company"] ; n = sg} ; +Competitor = {s = ["our worst competitor"] ; n = sg} ; +OurCustomers = {s = ["our customers"] ; n = pl} ; + +Senior = {s = + table { + sg => table {x => ["a senior fellow"]} ; + pl => table {x => ["senior fellows"]} + }} ; +ProjectManager = {s = + table { + sg => table {_ => ["a project manager"]} ; + pl => table {_ => ["project managers"]} + }} ; + +oper + +kollega : + Num => Str = + table {sg => "colleague" ; pl => "colleagues"} ; + +am : + Num => Str = + table {sg => "am" ; pl => "are"} ; + +have : + Num => Str = + table {sg => "has" ; pl => "have"} ; + +ego : + Num => Kas => Str = + table { + sg => table {nom => "I" ; acc => "me"} ; + pl => table {nom => "we" ; acc => "us"} + } ; + diff --git a/examples/letter/letter.Fin.gf b/examples/letter/letter.Fin.gf new file mode 100644 index 000000000..5536d12d6 --- /dev/null +++ b/examples/letter/letter.Fin.gf @@ -0,0 +1,179 @@ +--1 A Finnish Concrete Syntax for Business and Love Letters +-- +-- This file defines the Finnish syntax of the grammar set +-- whose abstract syntax is $letter.Abs.gf$. + +include letter.Abs.gf ; + +flags lexer=textlit ; unlexer=textlit ; + +-- modified from French in 20 min, 15/6/2002 + +param Gen = masc | fem ; +param Num = sg | pl ; +param Kas = nom | acc ; +param DepNum = depnum | cnum Num ; +param DepGen = depgen | cgen Gen ; + +lintype SS = {s : Str} ; +lintype SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen +lintype SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen +lintype SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs +lintype SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's +lintype SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen + +oper + ss : Str -> SS = \s -> {s = s} ; + + noDep : (P : Type) -> Str -> P => Str = \_,s -> table {_ => s} ; + + cher : Num => Gen => Tok = + table {sg => noDep Gen "rakas" ; pl => noDep Gen "rakkaat"} ; + + egosum : Num => Str = + table {sg => "olen" ; pl => "olemme"} ; + egohabeo : Num => Str = + table {sg => "minulla" ++ "on" ; pl => "meill" ++ "on"} ; + fuisti : Num => Str = + table {sg => "sinut" ++ "on"; pl => "teidt" ++ "on"} ; + quePrep = "ett" ; ---- + tuinformare : Num => Str = + table {sg => "ilmoittaa" ++ "sinulle" ; pl => "ilmoittaa" ++ "teille"} ; + + regNom : Str -> Num => Str = \pora -> table {sg => pora ; pl => pora + "t"} ; + + avoir : Num => Str = + table {sg => "on"; pl => "ovat"} ; + + mes : Num => Str = table {sg => "minun" ; pl => "meidn"} ; + + teamo : Num => Num => Str = table { + sg => table {sg => "rakastan" ++ "sinua" ; + pl => "rakastan" ++ "teit"} ; + pl => table {sg => "rakastamme" ++ "sinua" ; + pl => "rakastamme" ++ "teit"} + } ; + + constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> + {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; + + dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { + depnum => n ; + cnum cn => cn + } ; + dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { + depgen => case g of { + masc => fem ; + fem => masc + }; -- negative dependence: the author is of opposite sex + cgen cg => cg + } ; + + +lincat +Letter = SS ; +Recipient = SSSrc ; +Author = SSSrc2 ; +Message = SSDep2 ; +Heading = SSSrc ; +Ending = SSSrc2 ; +Mode = SSDep2 ; +Sentence = SSDep2 ; +NounPhrase = SSSrcGen ; +Position = SSDep ; + +lin +MkLetter head mess end = + 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} ; +PlainRec rec = rec ; +HelloRec rec = {s = "Terve" ++ rec.s ; n = rec.n ; g = rec.g} ; +JustHello rec = {s = "Terve" ; n = rec.n ; g = rec.g} ; + +ModeSent mode sent = + {s = + table {na => table {xa => table {nr => table {xr => + mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} + } ; +PlainSent sent = sent ; + +FormalEnding auth = + {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}} ; + n = auth.n ; g = auth.g} ; + +ColleaguesHe = {s = regNom "kollega" ! pl ; n = pl ; g = masc} ; +ColleaguesShe = {s = regNom "kollega" ! pl ; n = pl ; g = fem} ; +ColleagueHe = {s = regNom "kollega" ! sg ; n = sg ; g = masc} ; +ColleagueShe = {s = regNom "kollega" ! sg ; n = sg ; g = fem} ; +DarlingHe = {s = "kulta" ; n = sg ; g = masc} ; +DarlingShe = {s = "kulta" ; n = sg ; g = fem} ; +NameHe s = {s = s.s ; n = sg ; g = masc} ; +NameShe s = {s = s.s ; n = sg ; g = fem} ; + + +Honour = {s = + table {na => table {xa => table {nr => table {xr => + egohabeo ! dep2num na nr ++ + ["kunnia"] ++ tuinformare ! nr ++ quePrep}}}} + } ; + +Regret = {s = + table {na => table {ga => table {nr => table {gr => + mes ! dep2num na nr ++ + ["on valitettavasti ilmoitettava"] ++ quePrep}}}} + } ; + + +President = constNG ["presidentti"] sg masc ; +Mother = constNG ["iti"] sg fem ; +Spouse = {s = table { + sg => table {fem => ["miehesi"] ; masc => ["vaimosi"]} ; + pl => table {fem => ["miehenne"] ; masc => ["vaimonne"]} + } ; n = depnum ; g = depgen} ; +Dean = constNG ["dekaani"] sg masc ; +Name s = constNG s.s sg masc ; --- + +BePromoted pos = {s = + table {na => table {xa => table {nr => table {xr => + fuisti ! nr ++ "ylennetty" ++ + pos.s ! nr ! xr}}}} + } ; +GoBankrupt np = {s = + table {na => + table {xa => + table {nr => + table {xr => + np.s ++ avoir ! np.n ++ + (case np.n of {sg => "mennyt" ; pl => "menneet"}) ++ + "konkurssiin" + } + } + } + } + } ; + +ILoveYou = {s = + table {na => table {xa => table {nr => table {xr => + teamo ! dep2num na nr ! nr}}}}} ; + +Company = {s = ["yrityksemme"] ; n = sg ; g = fem} ; +Competitor = {s = ["pahin kilpailijamme"] ; n = sg ; g = masc} ; +OurCustomers = {s = ["asiakkaamme"] ; n = pl ; g = masc} ; + +Senior = {s = table {sg => table {g => ["vanhemmaksi tutkijaksi"]} ; + pl => table {g => ["vanhemmiksi tutkijoiksi"]} + } + } ; + +ProjectManager = {s = + table { + sg => table {_ => ["projektipllikksi"]} ; + pl => table {_ => ["projektipllikiksi"]} + }} ; + diff --git a/examples/letter/letter.Fra.gf b/examples/letter/letter.Fra.gf new file mode 100644 index 000000000..33b45143e --- /dev/null +++ b/examples/letter/letter.Fra.gf @@ -0,0 +1,168 @@ +--1 An French Concrete Syntax for Business and Love Letters +-- +-- This file defines the French syntax of the grammar set +-- whose abstract syntax is $letter.Abs.gf$. + +include letter.Abs.gf ; + +flags lexer=textlit ; unlexer=textlit ; + +param Gen = masc | fem ; +param Num = sg | pl ; +param Kas = nom | acc ; +param DepNum = depnum | cnum Num ; +param DepGen = depgen | cgen Gen ; + +lintype SS = {s : Str} ; +lintype SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen +lintype SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen +lintype SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs +lintype SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's +lintype SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen + +oper + ss : Str -> SS = \s -> {s = s} ; + cher : Num => Gen => Tok = + table {n => table {masc => regNom "cher" ! n ; fem => regNom "chre" ! n}}; + regAdj : Str -> Gen => Num => Str = \s -> + table {masc => regNom s ; fem => regNom (s + "e")} ; + regNom : Str -> Num => Str = \s -> table {sg => s ; pl => s + "s"} ; + egosum : Num => Str = + table {sg => "je" ++ "suis" ; pl => "nous" ++ "sommes"} ; + egohabeo : Num => Str = + table {sg => "j'ai" ; pl => "nous" ++ "avons"} ; + fuisti : Num => Str = + table {sg => "tu" ++ "as" ++ "t"; pl => "vous" ++ "avez" ++ "t"} ; + quePrep = "que" ; ---- + tuinformare : Num => Str = + table {sg => "t'informer"; pl => "vous" ++ "informer"} ; + + avoir : Num => Str = + table {sg => "a"; pl => "ont"} ; + + mes : Num => Str = table {sg => "mes" ; pl => "nos"} ; + + teamo : Num => Num => Str = table { + sg => table {sg => "je" ++ "t'aime" ; + pl => "je" ++ "vous" ++ "aime"} ; + pl => table {sg => "nous" ++ "t'aimons" ; + pl => "nous" ++ "vous" ++ "aimons"} + } ; + + constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> + {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; + + dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { + depnum => n ; + cnum sg => sg ; + cnum pl => pl + } ; + dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { + depgen => case g of { + masc => fem ; + fem => masc + }; -- negative dependence: the author is of opposite sex + cgen cg => cg + } ; + + +lincat +Letter = SS ; +Recipient = SSSrc ; +Author = SSSrc2 ; +Message = SSDep2 ; +Heading = SSSrc ; +Ending = SSSrc2 ; +Mode = SSDep2 ; +Sentence = SSDep2 ; +NounPhrase = SSSrcGen ; +Position = SSDep ; + +lin +MkLetter head mess end = + 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} ; +PlainRec rec = rec ; +HelloRec rec = {s = "Bonjour" ++ rec.s ; n = rec.n ; g = rec.g} ; +JustHello rec = {s = "Bonjour" ; n = rec.n ; g = rec.g} ; + +ModeSent mode sent = + {s = + table {na => table {xa => table {nr => table {xr => + mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} + } ; +PlainSent sent = sent ; + +FormalEnding auth = + {s = + table {n => table {g => + "avec" ++ mes ! dep2num auth.n n ++ + ["salutations distingues

"] ++ auth.s ! n ! g}} ; + n = auth.n ; g = auth.g} ; +InformalEnding auth = + {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} ; +ColleaguesShe = {s = regNom "collgue" ! pl ; n = pl ; g = fem} ; +ColleagueHe = {s = regNom "collgue" ! sg ; n = sg ; g = masc} ; +ColleagueShe = {s = regNom "collgue" ! sg ; n = sg ; g = fem} ; +DarlingHe = {s = "chri" ; n = sg ; g = masc} ; +DarlingShe = {s = "chrie" ; n = sg ; g = fem} ; +NameHe s = {s = s.s ; n = sg ; g = masc} ; +NameShe s = {s = s.s ; n = sg ; g = fem} ; + +Honour = {s = + table {na => table {xa => table {nr => table {xr => + egohabeo ! dep2num na nr ++ + ["l'honneur de"] ++ tuinformare ! nr ++ quePrep}}}} + } ; + +Regret = {s = + table {na => table {ga => table {nr => table {gr => + let {dga = dep2gen ga gr ; dna = dep2num na nr} in + egosum ! dna ++ regAdj "dsol" ! dga ! dna ++ + ["d'informer"] ++ quePrep}}}} + } ; + + +President = constNG ["le prsident"] sg masc ; +Mother = constNG ["maman"] sg fem ; +Spouse = {s = table { + sg => table {fem => ["ton mari"] ; masc => ["ta femme"]} ; + pl => table {fem => ["vos maris"] ; masc => ["vos femmes"]} + } ; n = depnum ; g = depgen} ; +Dean = constNG ["le doyen"] sg masc ; +Name s = constNG s.s sg masc ; --- + +BePromoted pos = {s = + table {na => table {xa => table {nr => table {xr => + fuisti ! nr ++ regAdj "promu" ! xr ! nr ++ + pos.s ! nr ! xr}}}} + } ; +GoBankrupt np = {s = + table {na => table {xa => table {nr => table {xr => + np.s ++ avoir ! np.n ++ ["fait banqueroute"]}}}} + } ; +ILoveYou = {s = + table {na => table {xa => table {nr => table {xr => + teamo ! dep2num na nr ! nr}}}} + } ; + +Company = {s = ["notre entreprise"] ; n = sg ; g = fem} ; +Competitor = {s = ["notre pire comptiteur"] ; n = sg ; g = masc} ; +OurCustomers = {s = ["nos clients"] ; n = pl ; g = masc} ; + +Senior = {s = table {sg => table {g => ["responsable scientifique"]} ; + pl => table {g => ["responsables scientifiques"]} + } + } ; + +ProjectManager = {s = + table { + sg => table {_ => ["chef de projet"]} ; + pl => table {_ => ["chefs de projets"]} + }} ; diff --git a/examples/letter/letter.RusU.gf b/examples/letter/letter.RusU.gf new file mode 100644 index 000000000..24efee06c --- /dev/null +++ b/examples/letter/letter.RusU.gf @@ -0,0 +1,178 @@ +include letter.Abs.gf ; + +flags lexer=textlit ; unlexer=textlit ; coding=utf8 ; + +param Gen = masc | fem ; +param Num = sg | pl ; +param Kas = nom | acc ; +param DepNum = depnum | cnum Num ; +param DepGen = depgen | cgen Gen ; + +lintype SS = {s : Str} ; +lintype SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen +lintype SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen +lintype SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs +lintype SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's +lintype SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen + +oper + ss : Str -> SS = \s -> {s = s} ; + regAdj : Str -> Num => Gen => Tok =\s -> table { + sg => table {masc => s+"ой"; fem => s+"ая"}; + pl => table {masc => s+"ие"; fem => s+"ие"} + }; + regVer : Str -> Num => Gen => Str = \s -> table { + sg => table {masc => s; fem => s+"а"}; + pl => table {masc => s+"ы"; fem => s+"ы"} + }; + + hello : Str -> Num => Str = \s -> + table {sg => s ; pl => s+"те" } ; + + regVerPerf : Str -> Num => Gen => Str = \s -> table { + sg => table {masc => s+"ся"; fem => s+"ось"}; + pl => table {masc => s+"ись"; fem => s+"ись"} + }; + + ego : Num => Str = + table {sg => "я" ; pl => "вы" } ; + egoHave : Num => Str = + table {sg => ["я имею"] ; pl => ["мы имеем"]} ; + + haveBeen : Num => Gen => Str = table { + sg => table {masc => ["ты был"] ; fem => ["ты была"] }; + pl => table {masc => ["вы были"]; fem => ["вы были"]} + }; + + thatPrep = [", что"] ; + informYou : Num => Str = + table {sg => ["сообщить тебе"]; pl => ["сообщить вам"]} ; + + loveYou : Num => Num => Str = table { + sg => table {sg => ["я тебя люблю"] ; + pl => ["я вас люблю"]} ; + pl => table {sg => ["мы тебя любим"] ; + pl => ["мы вас любим"]} + } ; + + constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> + {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; + + dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { + depnum => n ; + cnum cn => cn + } ; + dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { + depgen => case g of { + masc => fem ; + fem => masc + }; -- negative dependence: the author is of opposite sex + cgen cg => cg + } ; + + +lincat +Letter = SS ; +Recipient = SSSrc ; +Author = SSSrc2 ; +Message = SSDep2 ; +Heading = SSSrc ; +Ending = SSSrc2 ; +Mode = SSDep2 ; +Sentence = SSDep2 ; +NounPhrase = SSSrcGen ; +Position = SSDep ; + +lin +MkLetter head mess end = + ss (head.s ++ "," ++ "

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

" ++ + end.s ! head.n ! head.g) ; + +DearRec rec = {s = regAdj "Дорог" + ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; +PlainRec rec = rec ; +HelloRec rec = {s = hello "Здравствуй" ! rec.n ++ rec.s ; n = rec.n ; g = rec.g} ; +JustHello rec = {s = hello "Здравствуй" ! rec.n ; n = rec.n ; g = rec.g} ; + +ModeSent mode sent = + {s = + table {na => table {xa => table {nr => table {xr => + mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} + } ; +PlainSent sent = sent ; + +FormalEnding auth = + {s = + table {n => table {g => + "С" ++ + ["наилучшими пожеланиями,

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

"] ++ auth.s ! n ! g}} ; + n = auth.n ; g = auth.g} ; + +ColleaguesHe = {s = "коллеги" ; n = pl ; g = masc} ; +ColleaguesShe = {s = "коллеги" ; n = pl ; g = fem} ; +ColleagueHe = {s = "коллега" ; n = sg ; g = masc} ; +ColleagueShe = {s = "коллега" ; n = sg ; g = fem} ; +DarlingHe = {s = "любимый" ; n = sg ; g = masc} ; +DarlingShe = {s = "любимая" ; n = sg ; g = fem} ; +NameHe s = {s = s.s ; n = sg ; g = masc} ; +NameShe s = {s = s.s ; n = sg ; g = fem} ; + + +Honour = {s = + table {na => table {xa => table {nr => table {xr => + egoHave ! dep2num na nr ++ + ["честь"] ++ informYou ! nr ++ thatPrep}}}} + } ; + +Regret = {s = + table {na => table {ga => table {nr => table {gr => + let {dga = dep2gen ga gr ; dna = dep2num na nr} in + ego ! dna ++ regVer "вынужден" ! dna ! dga ++ + ["сообщить"] ++ thatPrep}}}} + } ; + + +President = constNG ["президент"] sg masc ; +Mother = constNG ["мама"] sg fem ; +Spouse = {s = table { + sg => table {fem => ["твой муж"] ; masc => ["твоя жена"]} ; + pl => table {fem => ["ваши мужья"] ; masc => ["ваши жены"]} + } ; n = depnum ; g = depgen} ; +Dean = constNG ["декан"] sg masc ; +Name s = constNG s.s sg masc ; --- + +BePromoted pos = {s = + table {na => table {xa => table {nr => table {xr => + haveBeen ! nr ! xr ++ regVer "назначен" ! nr ! xr ++ + pos.s ! nr ! xr}}}} + } ; +GoBankrupt np = {s = + table {na => table {xa => table {nr => table {xr => + np.s ++ regVerPerf "обанкротил" ! np.n ! np.g }}}} + } ; +ILoveYou = {s = + table {na => table {xa => table {nr => table {xr => + loveYou ! dep2num na nr ! nr}}}} + } ; + +Company = {s = ["наше предприятие"] ; n = sg ; g = fem} ; +Competitor = {s = ["наш конкурент"] ; n = sg ; g = masc} ; +OurCustomers = {s = ["наши клиенты"] ; n = pl ; g = masc} ; + +Senior = {s = table {sg => table {g => ["старшим научным сотрудником"]} ; + pl => table {g =>[ "старшими научными сотрудниками"]} + } + } ; + +ProjectManager = {s = + table { + sg => table {_ => ["менеджером проекта"]} ; + pl => table {_ => ["менеджерами проектов"]} + }} ; + + + diff --git a/examples/letter/letter.Sve.gf b/examples/letter/letter.Sve.gf new file mode 100644 index 000000000..fc95cc8f6 --- /dev/null +++ b/examples/letter/letter.Sve.gf @@ -0,0 +1,161 @@ +--1 An Swedish Concrete Syntax for Business and Love Letters +-- +-- This file defines the Swedish syntax of the grammar set +-- whose abstract syntax is $letter.Abs.gf$. + + +include letter.Abs.gf ; + +flags lexer=textlit ; unlexer=textlit ; + +printname Letter = "Brev" ; +printname MkLetter = "brevmall" ; + +param Sex = masc | fem ; +param Gen = en | ett ; +param Num = sg | pl ; +param Kas = nom | acc ; +param DepNum = depnum | cnum Num ; + +lintype SS = {s : Str} ; +lintype SSDep = {s : Num => Sex => Str} ; -- needs Num and Sex +lintype SSSrc = {s : Str ; n : Num ; x : Sex} ; -- gives Num and Sex +lintype SSSrc2 = {s : Num => Sex => Str ; n : DepNum ; x : Sex} ; -- gives and needs +lintype SSDep2 = {s : DepNum => Sex => Num => Sex => Str} ; -- needs Auth's & Recp's +lintype SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen + + +oper + ss : Str -> SS = \s -> {s = s} ; + + constNX : Str -> Num -> Sex -> SSSrc2 = \str,num,sex -> + {s = table {_ => table {_ => str}} ; n = cnum num ; x = sex} ; + + dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { + depnum => n ; + cnum cn => cn + } ; + +lincat +Letter = SS ; +Recipient = SSSrc ; +Author = SSSrc2 ; +Message = SSDep2 ; +Heading = SSSrc ; +Ending = SSSrc2 ; +Mode = SSDep2 ; +Sentence = SSDep2 ; +NounPhrase = SSSrcGen ; +Position = SSDep ; + +lin +MkLetter head mess end = + 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} ; +PlainRec rec = rec ; +HelloRec rec = {s = "Hej" ++ rec.s ; n = rec.n ; x = rec.x} ; +JustHello rec = {s = "Hej" ; n = rec.n ; x = rec.x} ; + +ModeSent mode sent = + {s = + table {na => table {xa => table {nr => table {xr => + mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} + } ; +PlainSent sent = sent ; + +FormalEnding auth = + {s = table {n => table {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} ; + +ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; +ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; +ColleagueHe = {s = kollega ! sg ; n = sg ; x = masc} ; +ColleagueShe = {s = kollega ! sg ; n = sg ; x = fem} ; +DarlingHe = {s = "lskling" ; n = sg ; x = masc} ; +DarlingShe = {s = "lskling" ; n = sg ; x = fem} ; +NameHe s = {s = s.s ; n = sg ; x = masc} ; +NameShe s = {s = s.s ; n = sg ; x = fem} ; + +Honour = {s = + table {na => table {xa => table {nr => table {xr => + jag ! dep2num na nr ! nom ++ ["har ran att meddela"] ++ + du ! nr ! acc ++ "att"}}}} + } ; + +Regret = {s = + table {na => table {xa => table {nr => table {xr => + jag ! dep2num na nr ! nom ++ ["mste tyvrr meddela"] ++ + du ! nr ! acc ++ "att"}}}} + } ; + + +President = constNX ["Presidenten"] sg masc ; +Mother = constNX ["Mamma"] sg fem ; +Spouse = {s = table { + sg => table {fem => ["din man"] ; masc => ["din hustru"]} ; + pl => table {fem => ["era mn"] ; masc => ["era hustrur"]} + } ; n = depnum ; x = masc} ; -- sex does not matter here +Dean = constNX ["Dekanus"] sg masc ; +Name s = constNX s.s sg masc ; --- + +BePromoted pos = {s = + table {na => table {xa => table {nr => table {xr => + du ! nr ! nom ++ ["har blivit"] ++ befordrad ! nr ++ + "till" ++ pos.s ! nr ! xr}}}} + } ; +GoBankrupt np = {s = + table {na => table {xa => table {nr => table {xr => + np.s ++ ["har gtt i konkurs"]}}}} + } ; +ILoveYou = {s = + table {na => table {xa => table {nr => table {xr => + jag ! dep2num na nr ! nom ++ ["lskar"] ++ du ! nr ! acc}}}} + } ; + +Company = {s = ["vrt fretag"] ; n = sg ; g = ett} ; +Competitor = {s = ["vr vrsta konkurrent"] ; n = sg ; g = en} ; +OurCustomers = {s = ["vra kunder"] ; n = pl ; g = en} ; + +Senior = {s = table {n => table {x => ["ldre forskare"]}}} ; +ProjectManager = {s = + table { + sg => table {_ => "projektchef"} ; + pl => table {_ => "projektchefer"} + }} ; + +oper + +kaer : + Num => Sex => Str = + table { + sg => table {masc => "Kre" ; fem => "Kra"} ; + pl => table {_ => "Kra"} + } ; + +kollega : + Num => Str = + table {sg => "kollega" ; pl => "kollegor"} ; + +befordrad : + Num => Str = + table {sg => "befordrad" ; pl => "befordrade"} ; + +jag : + Num => Kas => Str = + table { + sg => table {nom => "jag" ; acc => "mig"} ; + pl => table {nom => "vi" ; acc => "oss"} + } ; +du : + Num => Kas => Str = + table { + sg => table {nom => "du" ; acc => "dig"} ; + pl => table {nom => "ni" ; acc => "er"} + } ; diff --git a/examples/letter/mkLetter.gfs b/examples/letter/mkLetter.gfs new file mode 100644 index 000000000..52dd0dc7a --- /dev/null +++ b/examples/letter/mkLetter.gfs @@ -0,0 +1,13 @@ +-- to make a multilingual gfcm grammar for rapid loading. AR 29/1/2004 +-- to run: gf2+ optDecodeUTF8 (stateGrammarOfLang env (language lang)) + _ -> id + + langAbstract = language "Abstract" langXML = language "XML" diff --git a/src/Today.hs b/src/Today.hs index 281ea68a1..6184d8036 100644 --- a/src/Today.hs +++ b/src/Today.hs @@ -1 +1 @@ -module Today where today = "Wed Jan 28 14:24:20 CET 2004" +module Today where today = "Thu Jan 29 13:42:01 CET 2004"