packages feed

gf-3.6: examples/letter/LetterFre.gf

concrete LetterFre of Letter = {

--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$. 


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 ;

oper SS     = {s : Str} ;
oper SSDep  = {s : Num => Gen => Str} ;      -- needs Num and Gen
oper SSSrc  = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen
oper SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs
oper SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's
oper 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
    } ;

  RET = "" ; -- &-

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 ++ "," ++ RET ++ 
      mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ RET ++ 
      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"] ++ RET ++ auth.s ! n ! g}} ; 
   n = auth.n ; g = auth.g} ;
InformalEnding auth = 
  {s = table {n => table {g => ["Amicalement"] ++ RET ++ 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"]}
        }} ;
}