diff --git a/src/english/NounEng.gf b/src/english/NounEng.gf index 9fccab1df..702613067 100644 --- a/src/english/NounEng.gf +++ b/src/english/NounEng.gf @@ -3,7 +3,7 @@ concrete NounEng of Noun = CatEng ** open MorphoEng, ResEng, Prelude in { flags optimize=all_subs ; lin - DetCN det cn = { + DetCN det cn = { s = \\c => det.s ++ cn.s ! det.n ! npcase2case c ; a = agrgP3 det.n cn.g } ; diff --git a/src/portuguese/BeschPor.gf b/src/portuguese/BeschPor.gf index 16fd305c9..8221897bb 100644 --- a/src/portuguese/BeschPor.gf +++ b/src/portuguese/BeschPor.gf @@ -59,12 +59,6 @@ oper } } ; - genNumForms : Str -> Str -> Str -> Str -> Gender => Number => Str ; - genNumForms ms fs mp fp = table { - Masc => \\n => numForms ms mp ! n ; - Fem => \\n => numForms fs fp ! n - } ; - mkPass : Str -> Gender => Number => Str ; -- passive form is highly predictable from singular masculine mkPass p' = let p = p' + [] in case p of { diff --git a/src/portuguese/DiffPor.gf b/src/portuguese/DiffPor.gf index 423540588..5cfcd7c65 100644 --- a/src/portuguese/DiffPor.gf +++ b/src/portuguese/DiffPor.gf @@ -6,7 +6,7 @@ instance DiffPor of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRo coding=utf8 ; param - Prepos = P_de | P_a ; + Prepos = P_de | P_a | P_em | P_por ; VType = VHabere | VRefl ; @@ -79,8 +79,11 @@ instance DiffPor of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRo estarCopula = True ; oper + -- the other Cases are defined in ResRomance dative : Case = CPrep P_a ; genitive : Case = CPrep P_de ; + locative : Case = CPrep P_em ; + ablative : Case = CPrep P_por ; oper vRefl _ = VRefl ; @@ -94,40 +97,32 @@ instance DiffPor of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRo Nom => [] ; Acc => [] ; CPrep P_de => "de" ; - CPrep P_a => "a" + CPrep P_a => "a" ; + CPrep P_em => "em" ; + CPrep P_por => "por" } ; oper partitive = \_,c -> prepCase c ; oper - artDef : Bool -> Gender -> Number -> Case -> Str = \isNP,g,n,c -> - case isNP of { - True => case of { - => prepCase c ++ "o" ; - => prepCase c ++ "a" ; ----- ?? - => prepCase c ++ "os" ; - => prepCase c ++ "as" - } ; - False => case of { - => "do" ; - => "ao" ; - => prepCase c ++ "o" ; - => "da" ; - => "à" ; - => prepCase c ++ "a" ; - => prepCase c ++ "os" ; - => prepCase c ++ "as" - } - } ; + artDef : Bool -> Gender -> Number -> Case -> Str ; + -- not sure if isNP is relevant + artDef _isNP g n c = case c of { + Nom | Acc => genNumForms "o" "a" "os" "as" ; + CPrep P_de => genNumForms "do" "da" "dos" "das" ; + CPrep P_a => genNumForms "ao" "à" "aos" "às" ; + CPrep P_em => genNumForms "no" "na" "nos" "nas" ; + CPrep P_por => genNumForms "pelo" "pela" "pelos" "pelas" + } ! g ! n ; artIndef = \isNP,g,n,c -> case isNP of { True => case n of { - Sg => prepCase c ++ genForms "um" "uma" ! g ; + Sg => prepCase c ++ genForms "um" "uma" ! g ; _ => prepCase c ++ genForms "uns" "umas" ! g } ; _ => case n of { - Sg => prepCase c ++ genForms "um" "uma" ! g ; + Sg => prepCase c ++ genForms "um" "uma" ! g ; _ => prepCase c } } ; diff --git a/src/portuguese/NounPor.gf b/src/portuguese/NounPor.gf index b1a1056f0..f7f92d7d2 100644 --- a/src/portuguese/NounPor.gf +++ b/src/portuguese/NounPor.gf @@ -1,2 +1,30 @@ concrete NounPor of Noun = CatPor ** NounRomance with - (ResRomance = ResPor) ; + (ResRomance = ResPor) ** open Prelude, PhonoPor in { + + lin + -- not implemented for romance languages, maybe because it can't + -- be done elegantly? + CountNP det np = heavyNPpol np.isNeg + {s = \\c => det.s ! np.a.g ! c ++ elisDe ++ (np.s ! c).ton ; + a = np.a ** {n = det.n} } ; + +} ; +{-- + NounPhrase : Type = { + s : Case => {c1,c2,comp,ton : Str} ; + a : Agr ; + hasClit : Bool ; + isPol : Bool ; --- only needed for French complement agr + isNeg : Bool --- needed for negative NP's such as "personne" + } ; + + Det = { + s : Gender => Case => Str ; + n : Number ; + s2 : Str ; -- -ci + sp : Gender => Case => Str ; -- substantival: mien, mienne + isNeg : Bool -- negative element, e.g. aucun + } ; + + Bool -> {s : Case => Str ; a : Agr} -> NounPhrase +--} \ No newline at end of file diff --git a/src/portuguese/PhonoPor.gf b/src/portuguese/PhonoPor.gf index 8bb52c4da..2a41d17e3 100644 --- a/src/portuguese/PhonoPor.gf +++ b/src/portuguese/PhonoPor.gf @@ -1,3 +1,12 @@ resource PhonoPor = open Prelude in { -} + oper + arts : pattern Str = #("o" | "os" | "a" | "as") ; + + elisDe : Str ; + elisDe = pre { + #arts => "d" ++ BIND ; + _ => "de" + } ; + +} ; diff --git a/src/romance/CommonRomance.gf b/src/romance/CommonRomance.gf index 36d722652..6620875bd 100644 --- a/src/romance/CommonRomance.gf +++ b/src/romance/CommonRomance.gf @@ -199,16 +199,22 @@ oper --- oper - genForms : Str -> Str -> Gender => Str = \bon,bonne -> - table { - Masc => bon ; - Fem => bonne + genForms : Str -> Str -> Gender => Str ; + genForms bon bonne = table { + Masc => bon ; + Fem => bonne } ; + numForms : (_,_ : Str) -> Number => Str ; -- The following macro is useful for creating the forms of -- number-dependent tables, such as common nouns. - numForms : (_,_ : Str) -> Number => Str = \campus, campi -> - table {Sg => campus ; Pl => campi} ; + numForms campus campi = table {Sg => campus ; Pl => campi} ; + + genNumForms : (_,_,_,_ : Str) -> Gender => Number => Str ; + genNumForms ms fs mp fp = table { + Masc => \\n => numForms ms mp ! n ; + Fem => \\n => numForms fs fp ! n + } ; aagrForms : (x1,_,_,x4 : Str) -> (AAgr => Str) = \tout,toute,tous,toutes -> table { diff --git a/src/romance/ResRomance.gf b/src/romance/ResRomance.gf index 5e928d786..9d08d4947 100644 --- a/src/romance/ResRomance.gf +++ b/src/romance/ResRomance.gf @@ -16,14 +16,15 @@ oper NounPhrase : Type = { s : Case => {c1,c2,comp,ton : Str} ; a : Agr ; - hasClit : Bool ; + hasClit : Bool ; isPol : Bool ; --- only needed for French complement agr isNeg : Bool --- needed for negative NP's such as "personne" } ; + Pronoun : Type = { s : Case => {c1,c2,comp,ton : Str} ; a : Agr ; - hasClit : Bool ; + hasClit : Bool ; isPol : Bool ; --- only needed for French complement agr poss : Number => Gender => Str ---- also: substantival } ; @@ -48,7 +49,7 @@ oper pn2npNeg : {s : Str ; g : Gender} -> NounPhrase = pn2npPol True ; pn2npPol : Bool -> {s : Str ; g : Gender} -> NounPhrase = \isNeg, pn -> heavyNPpol isNeg { - s = \\c => prepCase c ++ pn.s ; + s = \\c => prepCase c ++ pn.s ; a = agrP3 pn.g Sg } ; @@ -77,7 +78,7 @@ oper oper - predV : Verb -> VP = \verb -> + predV : Verb -> VP = \verb -> let typ = verb.vtyp ; in { @@ -87,12 +88,12 @@ oper clit1 = [] ; clit2 = [] ; clit3 = {s,imp = [] ; hasClit = False} ; --- refl is treated elsewhere - isNeg = False ; + isNeg = False ; comp = \\a => [] ; ext = \\p => [] } ; - insertObject : Compl -> NounPhrase -> VP -> VP = \c,np,vp -> + insertObject : Compl -> NounPhrase -> VP -> VP = \c,np,vp -> let obj = np.s ! c.c ; in { @@ -110,12 +111,12 @@ oper ext = vp.ext ; } ; - insertComplement : (Agr => Str) -> VP -> VP = \co,vp -> { + insertComplement : (Agr => Str) -> VP -> VP = \co,vp -> { s = vp.s ; agr = vp.agr ; - clit1 = vp.clit1 ; - clit2 = vp.clit2 ; - clit3 = vp.clit3 ; + clit1 = vp.clit1 ; + clit2 = vp.clit2 ; + clit3 = vp.clit3 ; isNeg = vp.isNeg ; --- can be in compl as well neg = vp.neg ; comp = \\a => vp.comp ! a ++ co ! a ; @@ -123,54 +124,54 @@ oper } ; --- Agreement with preceding relative or interrogative: +-- Agreement with preceding relative or interrogative: -- "les femmes que j'ai aimées" - insertAgr : AAgr -> VP -> VP = \ag,vp -> vp ** { + insertAgr : AAgr -> VP -> VP = \ag,vp -> vp ** { agr = vpAgrClits vp.s ag ; } ; - insertRefl : VP -> VP = \vp -> vp ** { + insertRefl : VP -> VP = \vp -> vp ** { s = vp.s ** {vtyp = vRefl vp.s.vtyp} ; agr = vpAgrSubj vp.s ; } ; - insertAdv : Str -> VP -> VP = \co,vp -> vp ** { - isNeg = vp.isNeg ; --- adv could be neg + insertAdv : Str -> VP -> VP = \co,vp -> vp ** { + isNeg = vp.isNeg ; --- adv could be neg comp = \\a => vp.comp ! a ++ co ; } ; - insertAdV : Str -> VP -> VP = \co,vp -> { + insertAdV : Str -> VP -> VP = \co,vp -> { s = vp.s ; agr = vp.agr ; - clit1 = vp.clit1 ; - clit2 = vp.clit2 ; + clit1 = vp.clit1 ; + clit2 = vp.clit2 ; clit3 = vp.clit3 ; - isNeg = vp.isNeg ; + isNeg = vp.isNeg ; neg = \\b => let vpn = vp.neg ! b in {p1 = vpn.p1 ; p2 = vpn.p2 ++ co} ; comp = vp.comp ; ext = vp.ext ; } ; - insertClit3 : Str -> VP -> VP = \co,vp -> { + insertClit3 : Str -> VP -> VP = \co,vp -> { s = vp.s ; agr = vp.agr ; - clit1 = vp.clit1 ; - clit2 = vp.clit2 ; + clit1 = vp.clit1 ; + clit2 = vp.clit2 ; clit3 = addClit3 True co vp.clit3.imp vp.clit3 ; - isNeg = vp.isNeg ; + isNeg = vp.isNeg ; neg = vp.neg ; comp = vp.comp ; ext = vp.ext ; } ; - insertExtrapos : (RPolarity => Str) -> VP -> VP = \co,vp -> { + insertExtrapos : (RPolarity => Str) -> VP -> VP = \co,vp -> { s = vp.s ; agr = vp.agr ; - clit1 = vp.clit1 ; - clit2 = vp.clit2 ; + clit1 = vp.clit1 ; + clit2 = vp.clit2 ; clit3 = vp.clit3 ; - isNeg = vp.isNeg ; + isNeg = vp.isNeg ; neg = vp.neg ; comp = vp.comp ; ext = \\p => vp.ext ! p ++ co ! p ; @@ -179,7 +180,7 @@ oper mkVPSlash : Compl -> VP -> VP ** {c2 : Compl} = \c,vp -> vp ** {c2 = c} ; Clause : Type = {s : Direct => RTense => Anteriority => RPolarity => Mood => Str} ; - + -- for pos/neg variation other than negation word, e.g. "il y a du vin" / "il n'y a pas de vin" posNegClause : Clause -> Clause -> RPolarity -> Clause = \pos,neg,pol -> { s = \\d,t,a,b,m => case b of { @@ -188,20 +189,20 @@ oper } } ; - mkClause : Str -> Bool -> Bool -> Agr -> VP -> + mkClause : Str -> Bool -> Bool -> Agr -> VP -> {s : Direct => RTense => Anteriority => RPolarity => Mood => Str} = mkClausePol False ; -- isNeg = True if subject NP is a negative element, e.g. "personne" - mkClausePol : Bool -> Str -> Bool -> Bool -> Agr -> VP -> + mkClausePol : Bool -> Str -> Bool -> Bool -> Agr -> VP -> {s : Direct => RTense => Anteriority => RPolarity => Mood => Str} = \isNeg, subj, hasClit, isPol, agr, vp -> { - s = \\d,te,a,b,m => + s = \\d,te,a,b,m => let pol : RPolarity = case of { - <_,True,RPos,_> => RNeg True ; - => RNeg True ; + <_,True,RPos,_> => RNeg True ; + => RNeg True ; => polNegDirSubj ; _ => b } ; @@ -223,7 +224,7 @@ oper vtyp = vp.s.vtyp ; refl = case isVRefl vtyp of { True => reflPron num per Acc ; ---- case ? - _ => [] + _ => [] } ; clit = refl ++ vp.clit1 ++ vp.clit2 ++ vp.clit3.s ; ---- refl first? @@ -237,7 +238,7 @@ oper } ; ---- part = case vp.agr of { ---- VPAgrSubj => verb ! VPart agr.g agr.n ; ----- VPAgrClit g n => verb ! VPart g n +---- VPAgrClit g n => verb ! VPart g n ---- } ; @@ -251,7 +252,7 @@ oper => ; --# notpresent => ; --# notpresent => ; --# notpresent - => + => } ; fin = vps.p1 ; @@ -261,14 +262,14 @@ oper in case d of { - DDir => + DDir => subj ++ neg.p1 ++ clit ++ fin ++ neg.p2 ++ inf ++ compl ++ ext ; - DInv => + DInv => invertedClause vp.s.vtyp hasClit neg hypt clit fin inf compl subj ext } } ; --- in French, pronouns +-- in French, pronouns -- have a "-" with possibly a special verb form with "t": -- "comment fera-t-il" vs. "comment fera Pierre" @@ -285,20 +286,20 @@ oper obj = vp.s.p ++ vp.comp ! agr ++ vp.ext ! RPos ; ---- pol refl = case isVRefl vp.s.vtyp of { True => reflPron agr.n agr.p Acc ; ---- case ? - _ => [] + _ => [] } ; in neg.p1 ++ neg.p2 ++ clitInf iform (refl ++ vp.clit1 ++ vp.clit2 ++ vp.clit3.s) inf ++ obj ; -- ne pas dormant - + } -- insertObject: -- p -cat=Cl -tr "la femme te l' envoie" --- PredVP (DetCN (DetSg DefSg NoOrd) (UseN woman_N)) +-- PredVP (DetCN (DetSg DefSg NoOrd) (UseN woman_N)) -- (ComplV3 send_V3 (UsePron he_Pron) (UsePron thou_Pron)) -- la femme te l' a envoyé -- -- p -cat=Cl -tr "la femme te lui envoie" --- PredVP (DetCN (DetSg DefSg NoOrd) (UseN woman_N)) +-- PredVP (DetCN (DetSg DefSg NoOrd) (UseN woman_N)) -- (ComplV3 send_V3 (UsePron thou_Pron) (UsePron he_Pron)) -- la femme te lui a envoyée