Improving unicode menus, e.g. in Letter.

This commit is contained in:
aarne committed 2004-01-29 12:03:23 +00:00
1 parent 4c31deb839
commit fdddeca0d0
10 files changed
+1224 -2

No files matched your search

+287
View File
@@ -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 = <ResFin.depnum>;g = <ResFin.depgen>} ;"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.sg>! <ResFin.fem>) ;(ResFin.masc)=> "sinut" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! <ResFin.sg>! <ResFin.masc>) } ;(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "teidät" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! <ResFin.pl>! <ResFin.fem>) ;(ResFin.masc)=> "teidät" ++ "on" ++ ("ylennetty" ++ Position @ 0.s ! <ResFin.pl>! <ResFin.masc>) }}}}} ;"(sinut on)ylennetty Position_0" ;
lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = <ResFin.sg>;g = <ResFin.masc>} ;"kollega" ;
lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = <ResFin.sg>;g = <ResFin.fem>} ;"kollega" ;
lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegat" ;n = <ResFin.pl>;g = <ResFin.masc>} ;"kollegat" ;
lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegat" ;n = <ResFin.pl>;g = <ResFin.fem>} ;"kollegat" ;
lin Company : Letter.NounPhrase = \ -> {s = "yrityksemme" ;n = <ResFin.sg>;g = <ResFin.fem>} ;"yrityksemme" ;
lin Competitor : Letter.NounPhrase = \ -> {s = "pahin" ++ "kilpailijamme" ;n = <ResFin.sg>;g = <ResFin.masc>} ;"pahin kilpailijamme" ;
lin DarlingHe : Letter.Recipient = \ -> {s = "kulta" ;n = <ResFin.sg>;g = <ResFin.masc>} ;"kulta" ;
lin DarlingShe : Letter.Recipient = \ -> {s = "kulta" ;n = <ResFin.sg>;g = <ResFin.fem>} ;"kulta" ;
lin Dean : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "dekaani" }} ;n = <ResFin.cnum <ResFin.sg>> ;g = <ResFin.cgen <ResFin.masc>> } ;"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 = <ResFin.depnum>;g = <ResFin.depgen>} ;"Ending" ;
lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "<p>")++ Author @ 0.s ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "<p>")++ Author @ 0.s ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "parhain" ++ ("terveisin" ++ "<p>")++ Author @ 0.s ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> "parhain" ++ ("terveisin" ++ "<p>")++ Author @ 0.s ! <ResFin.sg>! <ResFin.masc>}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(parhain terveisin <p>)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 = <ResFin.sg>;g = <ResFin.masc>} ;"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" ++ "<p>" ++ Author @ 0.s ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> "terveisin" ++ "<p>" ++ Author @ 0.s ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> "terveisin" ++ "<p>" ++ Author @ 0.s ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> "terveisin" ++ "<p>" ++ Author @ 0.s ! <ResFin.sg>! <ResFin.masc>}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(terveisin <p>)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 ++ ("," ++ ("<p>" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("<p>" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , <p> Message_1 . <p> 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 ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.masc>}} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.masc>}} ;(ResFin.depgen)=> table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.pl>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.pl>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.sg>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.sg>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.pl>> ! <ResFin.depgen>! <ResFin.sg>! <ResFin.masc>}}} ;(ResFin.cnum (ResFin.sg)) => table ResFin.DepGen {(ResFin.cgen (ResFin.fem)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.fem>> ! <ResFin.sg>! <ResFin.masc>}} ;(ResFin.cgen (ResFin.masc)) => table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.pl>! <ResFin.masc>} ;(ResFin.sg)=> table ResFin.Gen {(ResFin.fem)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.fem>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.fem>;(ResFin.masc)=> Mode @ 0.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.masc>++ Sentence @ 1.s ! <ResFin.cnum <ResFin.sg>> ! <ResFin.cgen <ResFin.masc>> ! <ResFin.sg>! <ResFin.masc>}} ;(ResFin.depgen)=> table ResLine truncated
lin Mother : Letter.Author = \ -> {s = table ResFin.Num {(ResFin.sg)(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "äiti" }} ;n = <ResFin.cnum <ResFin.sg>> ;g = <ResFin.cgen <ResFin.fem>> } ;"ä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 = <ResFin.cnum <ResFin.sg>> ;g = <ResFin.cgen <ResFin.masc>> } ;"String_0" ;
lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResFin.sg>;g = <ResFin.masc>} ;"String_0" ;
lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResFin.sg>;g = <ResFin.fem>} ;"String_0" ;
lincat NounPhrase = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = <ResFin.sg>;g = <ResFin.masc>} ;"NounPhrase" ;
lin OurCustomers : Letter.NounPhrase = \ -> {s = "asiakkaamme" ;n = <ResFin.pl>;g = <ResFin.masc>} ;"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 = <ResFin.cnum <ResFin.sg>> ;g = <ResFin.cgen <ResFin.masc>> } ;"presidentti" ;
lin ProjectManager : Letter.Position = \ -> {s = table ResFin.Num {(ResFin.pl)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipäälliköiksi" } ;(ResFin.sg)=> table ResFin.Gen {(ResFin.masc)(ResFin.fem)=> "projektipäälliköksi" }}} ;"projektipäälliköksi" ;
lincat Recipient = {s : Str ;n : ResFin.Num ;g : ResFin.Gen }= {s = str @ 0 ;n = <ResFin.sg>;g = <ResFin.masc>} ;"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)=> "meidän" ++ ("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)=> "meidän" ++ ("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 = <ResFin.depnum>;g = <ResFin.depgen>} ;"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 = <ResFra.depnum>;g = <ResFra.depgen>} ;"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.pl>! <ResFra.fem>) ;(ResFra.masc)=> "vous" ++ ("avez" ++ "été")++ ("promus" ++ Position @ 0.s ! <ResFra.pl>! <ResFra.masc>) } ;(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "tu" ++ ("as" ++ "été")++ ("promu" ++ Position @ 0.s ! <ResFra.sg>! <ResFra.masc>) ;(ResFra.fem)=> "tu" ++ ("as" ++ "été")++ ("promue" ++ Position @ 0.s ! <ResFra.sg>! <ResFra.fem>) }}}}} ;"(tu as été)promu Position_0" ;
lin ColleagueHe : Letter.Recipient = \ -> {s = "collègue" ;n = <ResFra.sg>;g = <ResFra.masc>} ;"collègue" ;
lin ColleagueShe : Letter.Recipient = \ -> {s = "collègue" ;n = <ResFra.sg>;g = <ResFra.fem>} ;"collègue" ;
lin ColleaguesHe : Letter.Recipient = \ -> {s = "collègues" ;n = <ResFra.pl>;g = <ResFra.masc>} ;"collègues" ;
lin ColleaguesShe : Letter.Recipient = \ -> {s = "collègues" ;n = <ResFra.pl>;g = <ResFra.fem>} ;"collègues" ;
lin Company : Letter.NounPhrase = \ -> {s = "notre" ++ "entreprise" ;n = <ResFra.sg>;g = <ResFra.fem>} ;"notre entreprise" ;
lin Competitor : Letter.NounPhrase = \ -> {s = "notre" ++ ("pire" ++ "compétiteur");n = <ResFra.sg>;g = <ResFra.masc>} ;"notre pire compétiteur" ;
lin DarlingHe : Letter.Recipient = \ -> {s = "chéri" ;n = <ResFra.sg>;g = <ResFra.masc>} ;"chéri" ;
lin DarlingShe : Letter.Recipient = \ -> {s = "chérie" ;n = <ResFra.sg>;g = <ResFra.fem>} ;"chérie" ;
lin Dean : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "le" ++ "doyen" }} ;n = <ResFra.cnum <ResFra.sg>> ;g = <ResFra.cgen <ResFra.masc>> } ;"le doyen" ;
lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)=> "cher" ;(ResFra.fem)=> "chère" }! (Recipient @ 0.g);(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "chers" ;(ResFra.fem)=> "chères" }! (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 = <ResFra.depnum>;g = <ResFra.depgen>} ;"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.pl>;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => <ResFra.sg>}! (Author @ 0.n)) ++ ("salutations" ++ ("distinguées" ++ "<p>")++ Author @ 0.s ! <ResFra.sg>! <ResFra.fem>));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.cnum (ResFra.pl)) => <ResFra.pl>;(ResFra.depnum)(ResFra.cnum (ResFra.sg)) => <ResFra.sg>}! (Author @ 0.n)) ++ ("salutations" ++ ("distinguées" ++ "<p>")++ Author @ 0.s ! <ResFra.sg>! <ResFra.masc>))} ;(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.pl>;(ResFra.cnum (ResFra.sg)) => <ResFra.sg>}! (Author @ 0.n)) ++ ("salutations" ++ ("distinguées" ++ "<p>")++ Author @ 0.s ! <ResFra.pl>! <ResFra.fem>));(ResFra.masc)=> "avec" ++ (table ResFra.Num {(ResFra.sg)=> "mes" ;(ResFra.pl)=> "nos" }! (table ResFra.DepNum {(ResFra.depnum)(ResFra.cnum (ResFra.pl)) => <ResFra.pl>;(ResFra.cnum (ResFra.sg)) => <ResFra.sg>}! (Author @ 0.n)) ++ ("salutations" ++ ("distinguées" ++ "<p>")++ Author @ 0.s ! <ResFra.pl>! <ResFra.masc>))}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"avec mes (salutations distinguées <p>)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 = <ResFra.sg>;g = <ResFra.masc>} ;"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" ++ "<p>" ++ Author @ 0.s ! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> "Amicalement" ++ "<p>" ++ Author @ 0.s ! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> "Amicalement" ++ "<p>" ++ Author @ 0.s ! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> "Amicalement" ++ "<p>" ++ Author @ 0.s ! <ResFra.sg>! <ResFra.masc>}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(Amicalement <p>)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 ++ ("," ++ ("<p>" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("<p>" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , <p> Message_1 . <p> 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 ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.masc>}} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.masc>}} ;(ResFra.depgen)=> table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.pl>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.pl>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.sg>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.sg>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.pl>> ! <ResFra.depgen>! <ResFra.sg>! <ResFra.masc>}}} ;(ResFra.cnum (ResFra.sg)) => table ResFra.DepGen {(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.fem>> ! <ResFra.sg>! <ResFra.masc>}} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.pl)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.pl>! <ResFra.masc>} ;(ResFra.sg)=> table ResFra.Gen {(ResFra.fem)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.fem>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.fem>;(ResFra.masc)=> Mode @ 0.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.masc>++ Sentence @ 1.s ! <ResFra.cnum <ResFra.sg>> ! <ResFra.cgen <ResFra.masc>> ! <ResFra.sg>! <ResFra.masc>}} ;(ResFra.depgen)=> table ResLine truncated
lin Mother : Letter.Author = \ -> {s = table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "maman" }} ;n = <ResFra.cnum <ResFra.sg>> ;g = <ResFra.cgen <ResFra.fem>> } ;"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 = <ResFra.cnum <ResFra.sg>> ;g = <ResFra.cgen <ResFra.masc>> } ;"String_0" ;
lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResFra.sg>;g = <ResFra.masc>} ;"String_0" ;
lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResFra.sg>;g = <ResFra.fem>} ;"String_0" ;
lincat NounPhrase = {s : Str ;n : ResFra.Num ;g : ResFra.Gen }= {s = str @ 0 ;n = <ResFra.sg>;g = <ResFra.masc>} ;"NounPhrase" ;
lin OurCustomers : Letter.NounPhrase = \ -> {s = "nos" ++ "clients" ;n = <ResFra.pl>;g = <ResFra.masc>} ;"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" ++ "président" }} ;n = <ResFra.cnum <ResFra.sg>> ;g = <ResFra.cgen <ResFra.masc>> } ;"le président" ;
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 = <ResFra.sg>;g = <ResFra.masc>} ;"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" ++ ("désolé" ++ ("d\'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("désolée" ++ ("d\'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)=> "nous" ++ "sommes" ++ ("désolées" ++ ("d\'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolés" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("désolé" ++ ("d\'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolés" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("désolée" ++ ("d\'informer" ++ "que")) } ;(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolées" ++ ("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" ++ ("désolé" ++ ("d\'informer" ++ "que")) ;(ResFra.masc)=> "je" ++ "suis" ++ ("désolée" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("désolé" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "je" ++ "suis" ++ ("désolée" ++ ("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" ++ ("désolées" ++ ("d\'informer" ++ "que")) ;(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolés" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.fem)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolées" ++ ("d\'informer" ++ "que")) }} ;(ResFra.cgen (ResFra.masc)) => table ResFra.Num {(ResFra.sg)(ResFra.pl)=> table ResFra.Gen {(ResFra.masc)(ResFra.fem)=> "nous" ++ "sommes" ++ ("désolés" ++ ("d\'informer" ++ "que")) }}}}} ;"(je suis)désolée 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 = <ResFra.depnum>;g = <ResFra.depgen>} ;"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 = <ResEng.depnum>;x = <ResEng.masc>} ;"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.pl>! <ResEng.fem>;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> "you" ++ ("have" ++ ("been" ++ ("promoted" ++ "to")))++ Position @ 0.s ! <ResEng.sg>! <ResEng.masc>}}}}} ;"(you have been promoted to)Position_0" ;
lin ColleagueHe : Letter.Recipient = \ -> {s = "colleague" ;n = <ResEng.sg>;x = <ResEng.masc>} ;"colleague" ;
lin ColleagueShe : Letter.Recipient = \ -> {s = "colleague" ;n = <ResEng.sg>;x = <ResEng.fem>} ;"colleague" ;
lin ColleaguesHe : Letter.Recipient = \ -> {s = "colleagues" ;n = <ResEng.pl>;x = <ResEng.masc>} ;"colleagues" ;
lin ColleaguesShe : Letter.Recipient = \ -> {s = "colleagues" ;n = <ResEng.pl>;x = <ResEng.fem>} ;"colleagues" ;
lin Company : Letter.NounPhrase = \ -> {s = "our" ++ "company" ;n = <ResEng.sg>} ;"our company" ;
lin Competitor : Letter.NounPhrase = \ -> {s = "our" ++ ("worst" ++ "competitor");n = <ResEng.sg>} ;"our worst competitor" ;
lin DarlingHe : Letter.Recipient = \ -> {s = "darling" ;n = <ResEng.sg>;x = <ResEng.masc>} ;"darling" ;
lin DarlingShe : Letter.Recipient = \ -> {s = "darling" ;n = <ResEng.sg>;x = <ResEng.fem>} ;"darling" ;
lin Dean : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "the" ++ "Dean" }} ;n = <ResEng.cnum <ResEng.sg>> ;x = <ResEng.masc>} ;"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 = <ResEng.depnum>;x = <ResEng.masc>} ;"Ending" ;
lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "<p>")++ Author @ 0.s ! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "<p>")++ Author @ 0.s ! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "Sincerely" ++ ("yours" ++ "<p>")++ Author @ 0.s ! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> "Sincerely" ++ ("yours" ++ "<p>")++ Author @ 0.s ! <ResEng.sg>! <ResEng.masc>}} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Sincerely yours <p>)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 = <ResEng.sg>;x = <ResEng.masc>} ;"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" ++ "<p>")) ++ Author @ 0.s ! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "<p>")) ++ Author @ 0.s ! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> "With" ++ ("best" ++ ("regards" ++ "<p>")) ++ Author @ 0.s ! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> "With" ++ ("best" ++ ("regards" ++ "<p>")) ++ Author @ 0.s ! <ResEng.sg>! <ResEng.masc>}} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(With best regards <p>)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 ++ ("," ++ ("<p>" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("<p>" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.x)))))) } ;"Heading_0 , <p> Message_1 . <p> 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 ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>}} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.pl>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.masc>}}} ;(ResEng.cnum (ResEng.sg)) => table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>}} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.cnum <ResEng.sg>> ! <ResEng.masc>! <ResEng.sg>! <ResEng.masc>}}} ;(ResEng.depnum)=> table ResEng.Sex {(ResEng.fem)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.fem>! <ResEng.sg>! <ResEng.masc>}} ;(ResEng.masc)=> table ResEng.Num {(ResEng.pl)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.pl>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.pl>! <ResEng.masc>} ;(ResEng.sg)=> table ResEng.Sex {(ResEng.fem)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>++ Sentence @ 1.s ! <ResEng.depnum>! <ResEng.masc>! <ResEng.sg>! <ResEng.fem>;(ResEng.masc)=> Mode @ 0.s ! <ResEng.depnum>! <ResEng.masc>Line truncated
lin Mother : Letter.Author = \ -> {s = table ResEng.Num {(ResEng.sg)(ResEng.pl)=> table ResEng.Sex {(ResEng.masc)(ResEng.fem)=> "Mom" }} ;n = <ResEng.cnum <ResEng.sg>> ;x = <ResEng.fem>} ;"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 = <ResEng.cnum <ResEng.sg>> ;x = <ResEng.masc>} ;"String_0" ;
lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResEng.sg>;x = <ResEng.masc>} ;"String_0" ;
lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResEng.sg>;x = <ResEng.fem>} ;"String_0" ;
lincat NounPhrase = {s : Str ;n : ResEng.Num }= {s = str @ 0 ;n = <ResEng.sg>} ;"NounPhrase" ;
lin OurCustomers : Letter.NounPhrase = \ -> {s = "our" ++ "customers" ;n = <ResEng.pl>} ;"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 = <ResEng.cnum <ResEng.sg>> ;x = <ResEng.masc>} ;"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 = <ResEng.sg>;x = <ResEng.masc>} ;"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 = <ResEng.depnum>;x = <ResEng.masc>} ;"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 = <ResSve.depnum>;x = <ResSve.masc>} ;"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.sg>! <ResSve.fem>))) ;(ResSve.masc)=> "du" ++ ("har" ++ "blivit" ++ ("befordrad" ++ ("till" ++ Position @ 0.s ! <ResSve.sg>! <ResSve.masc>))) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! <ResSve.pl>! <ResSve.fem>))) ;(ResSve.masc)=> "ni" ++ ("har" ++ "blivit" ++ ("befordrade" ++ ("till" ++ Position @ 0.s ! <ResSve.pl>! <ResSve.masc>))) }}}}} ;"du (har blivit)befordrad till Position_0" ;
lin ColleagueHe : Letter.Recipient = \ -> {s = "kollega" ;n = <ResSve.sg>;x = <ResSve.masc>} ;"kollega" ;
lin ColleagueShe : Letter.Recipient = \ -> {s = "kollega" ;n = <ResSve.sg>;x = <ResSve.fem>} ;"kollega" ;
lin ColleaguesHe : Letter.Recipient = \ -> {s = "kollegor" ;n = <ResSve.pl>;x = <ResSve.masc>} ;"kollegor" ;
lin ColleaguesShe : Letter.Recipient = \ -> {s = "kollegor" ;n = <ResSve.pl>;x = <ResSve.fem>} ;"kollegor" ;
lin Company : Letter.NounPhrase = \ -> {s = "vårt" ++ "företag" ;n = <ResSve.sg>;g = <ResSve.ett>} ;"vårt företag" ;
lin Competitor : Letter.NounPhrase = \ -> {s = "vår" ++ ("värsta" ++ "konkurrent");n = <ResSve.sg>;g = <ResSve.en>} ;"vår värsta konkurrent" ;
lin DarlingHe : Letter.Recipient = \ -> {s = "älskling" ;n = <ResSve.sg>;x = <ResSve.masc>} ;"älskling" ;
lin DarlingShe : Letter.Recipient = \ -> {s = "älskling" ;n = <ResSve.sg>;x = <ResSve.fem>} ;"älskling" ;
lin Dean : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Dekanus" }} ;n = <ResSve.cnum <ResSve.sg>> ;x = <ResSve.masc>} ;"Dekanus" ;
lin DearRec : Letter.Heading = \ Recipient @ 0 -> {s = table ResSve.Num {(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Kära" ;(ResSve.masc)=> "Käre" }! (Recipient @ 0.x);(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Kära" }! (Recipient @ 0.x)}! (Recipient @ 0.n)++ Recipient @ 0.s ;n = Recipient @ 0.n ;x = Recipient @ 0.x } ;"Käre 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 = <ResSve.depnum>;x = <ResSve.masc>} ;"Ending" ;
lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vänlig" ++ ("hälsning" ++ "<p>")) ++ Author @ 0.s ! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> "Med" ++ ("vänlig" ++ ("hälsning" ++ "<p>")) ++ Author @ 0.s ! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("vänlig" ++ ("hälsning" ++ "<p>")) ++ Author @ 0.s ! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> "Med" ++ ("vänlig" ++ ("hälsning" ++ "<p>")) ++ Author @ 0.s ! <ResSve.sg>! <ResSve.masc>}} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med vänlig hälsning <p>)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" ++ ("gått" ++ ("i" ++ "konkurs")))}}}}} ;"NounPhrase_0 har gått i konkurs" ;
lincat Heading = {s : Str ;n : ResSve.Num ;x : ResSve.Sex }= {s = str @ 0 ;n = <ResSve.sg>;x = <ResSve.masc>} ;"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" ++ ("hälsningar" ++ "<p>")++ Author @ 0.s ! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> "Med" ++ ("hälsningar" ++ "<p>")++ Author @ 0.s ! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> "Med" ++ ("hälsningar" ++ "<p>")++ Author @ 0.s ! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> "Med" ++ ("hälsningar" ++ "<p>")++ Author @ 0.s ! <ResSve.sg>! <ResSve.masc>}} ;n = Author @ 0.n ;x = Author @ 0.x } ;"(Med hälsningar <p>)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 ++ ("," ++ ("<p>" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.x)! (Heading @ 0.n)! (Heading @ 0.x)++ ("." ++ ("<p>" ++ 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 ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>}} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.pl>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.masc>}}} ;(ResSve.cnum (ResSve.sg)) => table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>}} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.cnum <ResSve.sg>> ! <ResSve.masc>! <ResSve.sg>! <ResSve.masc>}}} ;(ResSve.depnum)=> table ResSve.Sex {(ResSve.fem)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.fem>! <ResSve.sg>! <ResSve.masc>}} ;(ResSve.masc)=> table ResSve.Num {(ResSve.pl)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.pl>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.pl>! <ResSve.masc>} ;(ResSve.sg)=> table ResSve.Sex {(ResSve.fem)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>++ Sentence @ 1.s ! <ResSve.depnum>! <ResSve.masc>! <ResSve.sg>! <ResSve.fem>;(ResSve.masc)=> Mode @ 0.s ! <ResSve.depnum>! <ResSve.masc>Line truncated
lin Mother : Letter.Author = \ -> {s = table ResSve.Num {(ResSve.sg)(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "Mamma" }} ;n = <ResSve.cnum <ResSve.sg>> ;x = <ResSve.fem>} ;"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 = <ResSve.cnum <ResSve.sg>> ;x = <ResSve.masc>} ;"String_0" ;
lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResSve.sg>;x = <ResSve.masc>} ;"String_0" ;
lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResSve.sg>;x = <ResSve.fem>} ;"String_0" ;
lincat NounPhrase = {s : Str ;n : ResSve.Num ;g : ResSve.Gen }= {s = str @ 0 ;n = <ResSve.sg>;g = <ResSve.en>} ;"NounPhrase" ;
lin OurCustomers : Letter.NounPhrase = \ -> {s = "våra" ++ "kunder" ;n = <ResSve.pl>;g = <ResSve.en>} ;"våra 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 = <ResSve.cnum <ResSve.sg>> ;x = <ResSve.masc>} ;"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 = <ResSve.sg>;x = <ResSve.masc>} ;"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" ++ ("måste" ++ ("tyvärr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "jag" ++ ("måste" ++ ("tyvärr" ++ "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" ++ ("måste" ++ ("tyvärr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("måste" ++ ("tyvärr" ++ "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" ++ ("måste" ++ ("tyvärr" ++ "meddela")++ ("dig" ++ "att")) } ;(ResSve.pl)=> table ResSve.Sex {(ResSve.masc)(ResSve.fem)=> "vi" ++ ("måste" ++ ("tyvärr" ++ "meddela")++ ("er" ++ "att")) }}}}} ;"jag (måste tyvärr 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" ++ "män" }} ;n = <ResSve.depnum>;x = <ResSve.masc>} ;"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 = <ResRusU.depnum>;g = <ResRusU.depgen>} ;"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.pl>! <ResRusU.fem>) ;(ResRusU.masc)=> "вы" ++ "были" ++ ("назначены" ++ Position @ 0.s ! <ResRusU.pl>! <ResRusU.masc>) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.masc)=> "ты" ++ "был" ++ ("назначен" ++ Position @ 0.s ! <ResRusU.sg>! <ResRusU.masc>) ;(ResRusU.fem)=> "ты" ++ "была" ++ ("назначена" ++ Position @ 0.s ! <ResRusU.sg>! <ResRusU.fem>) }}}}} ;"(ты был)назначен Position_0" ;
lin ColleagueHe : Letter.Recipient = \ -> {s = "коллега" ;n = <ResRusU.sg>;g = <ResRusU.masc>} ;"коллега" ;
lin ColleagueShe : Letter.Recipient = \ -> {s = "коллега" ;n = <ResRusU.sg>;g = <ResRusU.fem>} ;"коллега" ;
lin ColleaguesHe : Letter.Recipient = \ -> {s = "коллеги" ;n = <ResRusU.pl>;g = <ResRusU.masc>} ;"коллеги" ;
lin ColleaguesShe : Letter.Recipient = \ -> {s = "коллеги" ;n = <ResRusU.pl>;g = <ResRusU.fem>} ;"коллеги" ;
lin Company : Letter.NounPhrase = \ -> {s = "наше" ++ "предпри�тие" ;n = <ResRusU.sg>;g = <ResRusU.fem>} ;"наше предпри�тие" ;
lin Competitor : Letter.NounPhrase = \ -> {s = "наш" ++ "конкурент" ;n = <ResRusU.sg>;g = <ResRusU.masc>} ;"наш конкурент" ;
lin DarlingHe : Letter.Recipient = \ -> {s = "любимый" ;n = <ResRusU.sg>;g = <ResRusU.masc>} ;"любимый" ;
lin DarlingShe : Letter.Recipient = \ -> {s = "любима�" ;n = <ResRusU.sg>;g = <ResRusU.fem>} ;"любима�" ;
lin Dean : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "декан" }} ;n = <ResRusU.cnum <ResRusU.sg>> ;g = <ResRusU.cgen <ResRusU.masc>> } ;"декан" ;
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 = <ResRusU.depnum>;g = <ResRusU.depgen>} ;"Ending" ;
lin FormalEnding : Letter.Ending = \ Author @ 0 -> {s = table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожелани�ми," ++ "<p>")++ Author @ 0.s ! <ResRusU.pl>! <ResRusU.fem>) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожелани�ми," ++ "<p>")++ Author @ 0.s ! <ResRusU.pl>! <ResRusU.masc>) } ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("наилучшими" ++ ("пожелани�ми," ++ "<p>")++ Author @ 0.s ! <ResRusU.sg>! <ResRusU.fem>) ;(ResRusU.masc)=> "С" ++ ("наилучшими" ++ ("пожелани�ми," ++ "<p>")++ Author @ 0.s ! <ResRusU.sg>! <ResRusU.masc>) }} ;n = Author @ 0.n ;g = Author @ 0.g } ;"С (наилучшими пожелани�ми, <p>)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 = <ResRusU.sg>;g = <ResRusU.masc>} ;"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)=> "С" ++ ("друже�ким" ++ ("приветом," ++ "<p>")) ++ Author @ 0.s ! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> "С" ++ ("друже�ким" ++ ("приветом," ++ "<p>")) ++ Author @ 0.s ! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> "С" ++ ("друже�ким" ++ ("приветом," ++ "<p>")) ++ Author @ 0.s ! <ResRusU.sg>! <ResRusU.fem>;(ResRusU.masc)=> "С" ++ ("друже�ким" ++ ("приветом," ++ "<p>")) ++ Author @ 0.s ! <ResRusU.sg>! <ResRusU.masc>}} ;n = Author @ 0.n ;g = Author @ 0.g } ;"(С друже�ким приветом, <p>)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 ++ ("," ++ ("<p>" ++ (Message @ 1.s ! (Ending @ 2.n)! (Ending @ 2.g)! (Heading @ 0.n)! (Heading @ 0.g)++ ("." ++ ("<p>" ++ Ending @ 2.s ! (Heading @ 0.n)! (Heading @ 0.g)))))) } ;"Heading_0 , <p> Message_1 . <p> 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 ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.masc>}} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.sg>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.sg>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.sg>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.sg>! <ResRusU.masc>}} ;(ResRusU.depgen)=> table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.pl>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.pl>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.sg>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.sg>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.sg>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.pl>> ! <ResRusU.depgen>! <ResRusU.sg>! <ResRusU.masc>}}} ;(ResRusU.cnum (ResRusU.sg)) => table ResRusU.DepGen {(ResRusU.cgen (ResRusU.fem)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.fem>> ! <ResRusU.sg>! <ResRusU.masc>}} ;(ResRusU.cgen (ResRusU.masc)) => table ResRusU.Num {(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.fem>;(ResRusU.masc)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.masc>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.pl>! <ResRusU.masc>} ;(ResRusU.sg)=> table ResRusU.Gen {(ResRusU.fem)=> Mode @ 0.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>> ! <ResRusU.sg>! <ResRusU.fem>++ Sentence @ 1.s ! <ResRusU.cnum <ResRusU.sg>> ! <ResRusU.cgen <ResRusU.masc>Line truncated
lin Mother : Letter.Author = \ -> {s = table ResRusU.Num {(ResRusU.sg)(ResRusU.pl)=> table ResRusU.Gen {(ResRusU.masc)(ResRusU.fem)=> "мама" }} ;n = <ResRusU.cnum <ResRusU.sg>> ;g = <ResRusU.cgen <ResRusU.fem>> } ;"мама" ;
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 = <ResRusU.cnum <ResRusU.sg>> ;g = <ResRusU.cgen <ResRusU.masc>> } ;"String_0" ;
lin NameHe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResRusU.sg>;g = <ResRusU.masc>} ;"String_0" ;
lin NameShe : Letter.Recipient = \ String @ 0 -> {s = String @ 0.s ;n = <ResRusU.sg>;g = <ResRusU.fem>} ;"String_0" ;
lincat NounPhrase = {s : Str ;n : ResRusU.Num ;g : ResRusU.Gen }= {s = str @ 0 ;n = <ResRusU.sg>;g = <ResRusU.masc>} ;"NounPhrase" ;
lin OurCustomers : Letter.NounPhrase = \ -> {s = "наши" ++ "клиенты" ;n = <ResRusU.pl>;g = <ResRusU.masc>} ;"наши клиенты" ;
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 = <ResRusU.cnum <ResRusU.sg>> ;g = <ResRusU.cgen <ResRusU.masc>> } ;"президент" ;
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 = <ResRusU.sg>;g = <ResRusU.masc>} ;"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 = <ResRusU.depnum>;g = <ResRusU.depgen>} ;"тво� жена" ;
}
+80
View File
@@ -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 ;
+151
View File
@@ -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 ++ "," ++ "<p>" ++
mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "<p>" ++
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 <p>"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ;
InformalEnding auth =
{s = table {n => table {x =>
["With best regards <p>"] ++ 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"}
} ;
+179
View File
@@ -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 => "teidät" ++ "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 => "meidän"} ;
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 ++ "," ++ "<p>" ++
mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "<p>" ++
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 <p>"] ++ auth.s ! n ! g}} ;
n = auth.n ; g = auth.g} ;
InformalEnding auth =
{s = table {n => table {g => ["terveisin <p>"] ++ 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 {_ => ["projektipäälliköksi"]} ;
pl => table {_ => ["projektipäälliköiksi"]}
}} ;
+168
View File
@@ -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 "chère" ! 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 ++ "," ++ "<p>" ++
mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "<p>" ++
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 distinguées <p>"] ++ auth.s ! n ! g}} ;
n = auth.n ; g = auth.g} ;
InformalEnding auth =
{s = table {n => table {g => ["Amicalement <p>"] ++ auth.s ! n ! g}} ;
n = auth.n ; g = auth.g} ;
ColleaguesHe = {s = regNom "collègue" ! pl ; n = pl ; g = masc} ;
ColleaguesShe = {s = regNom "collègue" ! pl ; n = pl ; g = fem} ;
ColleagueHe = {s = regNom "collègue" ! sg ; n = sg ; g = masc} ;
ColleagueShe = {s = regNom "collègue" ! sg ; n = sg ; g = fem} ;
DarlingHe = {s = "chéri" ; n = sg ; g = masc} ;
DarlingShe = {s = "chérie" ; 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 "désolé" ! dga ! dna ++
["d'informer"] ++ quePrep}}}}
} ;
President = constNG ["le président"] 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 compétiteur"] ; 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"]}
}} ;
+178
View File
@@ -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 ++ "," ++ "<p>" ++
mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ "<p>" ++
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 =>
"С" ++
["наилучшими пожеланиями, <p>"] ++ auth.s ! n ! g}} ;
n = auth.n ; g = auth.g} ;
InformalEnding auth =
{s = table {n => table {g => ["С дружеским приветом, <p>"] ++ 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 {_ => ["менеджерами проектов"]}
}} ;
+161
View File
@@ -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 ++ "," ++ "<p>" ++
mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ "<p>" ++
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 vänlig hälsning <p>"] ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ;
InformalEnding auth =
{s = table {n => table {x =>
["Med hälsningar <p>"] ++ 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 ++ ["måste tyvärr 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 män"] ; 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 gått i konkurs"]}}}}
} ;
ILoveYou = {s =
table {na => table {xa => table {nr => table {xr =>
jag ! dep2num na nr ! nom ++ ["älskar"] ++ du ! nr ! acc}}}}
} ;
Company = {s = ["vårt företag"] ; n = sg ; g = ett} ;
Competitor = {s = ["vår värsta konkurrent"] ; n = sg ; g = en} ;
OurCustomers = {s = ["våra 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 => "Käre" ; fem => "Kära"} ;
pl => table {_ => "Kära"}
} ;
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"}
} ;
+13
View File
@@ -0,0 +1,13 @@
-- to make a multilingual gfcm grammar for rapid loading. AR 29/1/2004
-- to run: gf2+ <mkLetter.gfs
i -old -abs=Letter -cnc=English letter.Eng.gf
i -old -abs=Letter -cnc=French letter.Fra.gf
i -old -abs=Letter -cnc=Swedish letter.Sve.gf
i -old -abs=Letter -cnc=Finnish letter.Fin.gf
i -old -abs=Letter -cnc=Russian letter.RusU.gf
s
pm | wf Letter.gfcm
+6 -1
View File
@@ -409,7 +409,7 @@ displaySStateJavaX isNew env state = encodeUTF8 $ mkUnicode $
] ]
where where
(tree,msg,menu) = displaySState env state (tree,msg,menu) = displaySState env state
menu' = [tagXML "show" [s] ++ tagXML "send" [c] | (s,c) <- menu] menu' = [tagXML "show" [unicode s] ++ tagXML "send" [c] | (s,c) <- menu]
(ls,grs) = unzip $ lgrs (ls,grs) = unzip $ lgrs
lgrs = allActiveStateGrammarsWithNames env lgrs = allActiveStateGrammarsWithNames env
lins = (langAbstract, exp) : linAll lins = (langAbstract, exp) : linAll
@@ -423,6 +423,11 @@ displaySStateJavaX isNew env state = encodeUTF8 $ mkUnicode $
gr = firstStateGrammar env gr = firstStateGrammar env
mark = markOptXML -- markOptJava mark = markOptXML -- markOptJava
unicode = case getOptVal opts menuDisplay of
Just lang -> optDecodeUTF8 (stateGrammarOfLang env (language lang))
_ -> id
langAbstract = language "Abstract" langAbstract = language "Abstract"
langXML = language "XML" langXML = language "XML"
+1 -1
View File
@@ -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"