diff --git a/lib/src/catalan/ExtraCat.gf b/lib/src/catalan/ExtraCat.gf index 8af5639e4..4d69606f7 100644 --- a/lib/src/catalan/ExtraCat.gf +++ b/lib/src/catalan/ExtraCat.gf @@ -6,11 +6,11 @@ concrete ExtraCat of ExtraCatAbs = ExtraRomanceCat ** -- "yo" "me" "me" "mí" -- "mi" "mi" "mis" "mis" -- Fem Sg P1 ; --- these8fem_NP = mkNP ["estas"] Fem Pl ; --- they8fem_Pron = mkPronoun --- "ellas" "las" "les" "ellas" --- "su" "su" "sus" "sus" --- Fem Pl P3 ; + these8fem_NP = mkNP "aquestes" Fem Pl ; + they8fem_Pron = mkPronoun + "elles" "les" "les" "elles" + "llur" "llur" "llurs" + Fem Pl P3 ; -- this8fem_NP = pn2np (mkPN ["esta"] Fem) ; -- those8fem_NP = mkNP ["esas"] Fem Pl ; diff --git a/lib/src/catalan/LexiconCat.gf b/lib/src/catalan/LexiconCat.gf index 596e3c1d3..22f20d81c 100644 --- a/lib/src/catalan/LexiconCat.gf +++ b/lib/src/catalan/LexiconCat.gf @@ -10,6 +10,7 @@ oper regFN : Str -> N = \s -> femN (regN s) ; regMN : Str -> N = \s -> regN s ; irregMN : Str -> Str -> N = \pa,pans -> M.mkNounIrreg pa pans masculine ; + saberV : V = verbV (saber_99 "saber") ; lin airplane_N = regMN "avió" ; @@ -106,7 +107,8 @@ lin industry_N = regFN "indústria" ; iron_N = regMN "ferro" ; king_N = regMN "rei" ; - know_V2 = dirV2 (verbV (saber_99 "saber")) ; + know_V2 = dirV2 saberV ; + know_VS = mkVS saberV; lake_N = regMN "llac" ; lamp_N = regFN "làmpada" ; learn_V2 = dirV2 (verbV (aprendre_6 "aprendre")) ; diff --git a/lib/src/catalan/MorphoCat.gf b/lib/src/catalan/MorphoCat.gf index 05d10cb8e..f928305fe 100644 --- a/lib/src/catalan/MorphoCat.gf +++ b/lib/src/catalan/MorphoCat.gf @@ -1,45 +1,59 @@ --# -path=.:../romance:../common:../../prelude -----1 A Simple Catalan Resource Morphology ----- ----- Aarne Ranta 2002 -- 2005 ----- ----- This resource morphology contains definitions needed in the resource ----- syntax. To build a lexicon, it is better to use $ParadigmsCat$, which ----- gives a higher-level access to this module. +--1 A Simple Catalan Resource Morphology -- +-- Aarne Ranta 2002 -- 2005 +-- Jordi Saludes 2008: Derived from MorphoSpa. +-- +-- This resource morphology contains definitions needed in the resource +-- syntax. To build a lexicon, it is better to use $ParadigmsCat$, which +-- gives a higher-level access to this module. + resource MorphoCat = CommonRomance, ResCat ** open PhonoCat, Prelude, Predef in { + + flags optimize=all ; coding=utf8 ; + +--2 Nouns -- --- flags optimize=all ; --- --- -----2 Nouns ----- ----- The following macro is useful for creating the forms of number-dependent ----- tables, such as common nouns. --- +-- The following macro is useful for creating the forms of number-dependent +-- tables, such as common nouns. +-- gcc M2.3 oper numForms : (_,_ : Str) -> Number => Str = \vi, vins -> table {Sg => vi ; Pl => vins} ; --- For example: + nomCep : Str -> Number => Str = \cep -> + numForms cep (cep + "s") ; - nomHome : Str -> Number => Str = \home -> - numForms home (home + "s") ; - - nomDona : Str -> Number => Str = \dona -> - numForms dona (init dona + "es") ; - - nomDisc : Str -> Number => Str = \disc -> - numForms disc (variants {disc + "s"; disc + "os"}) ; --- nomPilar : Str -> Number => Str = \pilar -> --- numForms pilar (pilar + "es") ; --- --- nomTram : Str -> Number => Str = \tram -> --- numForms tram tram ; --- + nomCasa : Str -> Str -> Number => Str = \es,casa -> + numForms casa (init casa + es) ; + + nomFre : Str -> Number => Str = \fre -> + numForms fre (fre + "ns") ; + + nomCas : Str -> Number => Str = \cas -> + numForms cas (cas + "os") ; + + nomTest : Str -> Number => Str = \test -> + numForms test (variants {test + "s"; test + "os"}) ; + + nomFaig : Str -> Number => Str = \faig -> + let + fa = Predef.tk 2 faig + in + numForms faig (variants {fa + "jos" ; faig + "s"}) ; + + nomDesig : Str -> Number => Str = \desig -> + let + desi = Predef.tk 1 desig + in + numForms desig (variants {desi + "tjos" ; desi + "gs"}) ; + + nomTemps : Str -> Number => Str = \temps -> + numForms temps temps ; + -- Common nouns are inflected in number and have an inherent gender. mkNoun : (Number => Str) -> Gender -> Noun = \noinois,gen -> @@ -49,89 +63,107 @@ oper mkNoun (numForms vi vins) ; mkNomReg : Str -> Noun = \noi -> + let + mkNounMas : (Str -> Number => Str) -> Noun = \rule -> mkNoun (rule noi) Masc + in case last noi of { - "o" | "e" => mkNoun (nomHome noi) Masc ; - "a" => mkNoun (nomDona noi) Fem ; - "c" => mkNoun (nomDisc noi) Masc ; - --- "u" => mkNounIrreg mec (init mec + "ces") Fem ; - _ => mkNoun (nomHome noi) Masc - } ; + "a" => mkNoun (nomCasa "es" noi) Fem ; + "s"|"x"|"ç" => mkNounMas nomCas ; + "i"|"e" => mkNounMas nomFre ; + "í" => mkNounMas (nomCasa "ins") ; + "à" => mkNounMas (nomCasa "ans") ; + "ó" => mkNounMas (nomCasa "ons") ; + "g" => mkNounMas nomFaig ; + _ => mkNounMas nomCep + } ; -----2 Adjectives ----- +--2 Adjectives +-- -- Adjectives are conveniently seen as gender-dependent nouns. -- Here are some patterns. First one that describes the worst case. +-- gcc M2.1 - mkAdj : (_,_,_,_,_ : Str) -> Adj = \petit,petita,petits,petites,petitament -> + mkAdj : (_,_,_,_,_ : Str) -> Adj = \prim,prima,prims,primes,primament -> {s = table { - AF Masc n => numForms petit petits ! n ; - AF Fem n => numForms petita petites ! n ; - AA => petitament + AF Masc n => numForms prim prims ! n ; + AF Fem n => numForms prima primes ! n ; + AA => primament } } ; ----- Then the regular and invariant patterns. --- --- adjfort : Str -> Adj = \solo -> --- let --- sol = Predef.tk 1 solo --- in --- mkAdj solo (sol + "a") (sol + "os") (sol + "as") (sol + "amente") ; --- - adjFort : Str -> Adj = \fort -> - mkAdj fort (fort + "a") (fort + "s") (fort + "es") (fort + "ament") ; --- --- adjBlu : Str -> Adj = \blu -> --- mkAdj blu blu blu blu blu ; --- --- - mkAdjReg : Str -> Adj = \fort -> adjFort fort ; -{- - case last solo of { - "o" => adjSolo solo ; - --- "e" => adjUtil solo (solo + "s") ; - "a" => - _ => adjUtil solo (solo + "es") - } ; --} --- -----2 Personal pronouns ----- ----- All the eight personal pronouns can be built by the following macro. ----- The use of "ne" as atonic genitive is debatable. ----- We follow the rule that the atonic nominative is empty. --- +--- Then the regular and invariant patterns. - mkPronoun : (_,_,_,_,_,_,_,_ : Str) -> + adjPrim : Str -> Adj = \prim -> + mkAdj prim (prim + "a") (prim + "s") (prim + "es") (prim + "ament") ; + + adjBlau : Str -> Str -> Adj = \blau,blava -> + let + blav = Predef.tk 1 blava + in + mkAdj blau blava (blau + "s") (blav + "es") (blava + "ment") ; + + adjFondo : Str -> Adj = \fondo -> + let + fond = Predef.tk 1 fondo + in + adjBlau fondo (fond + "a") ; + + adjBo : Str -> Adj = \bo -> + mkAdj bo (bo + "na") (bo + "ns") (bo + "nes") (bo + "nament") ; + + adjFidel : Str -> Adj = \fidel -> + let + fidels = fidel + "s" + in + mkAdj fidel fidel fidels fidels (fidel + "ment") ; + + mkAdjReg : Str -> Adj = \prim -> + case last prim of { + "e"|"u"|"o" => adjFondo prim ; + _ => adjPrim prim + } ; + + +--2 Personal pronouns +-- +-- All the eight personal pronouns can be built by the following macro. +-- The use of "en" as atonic genitive is debatable. + + mkPronoun : (_,_,_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pronoun = - \il,le,lui,Lui,son,sa,ses,see,g,n,p -> + \ell,el,li,Ell,son,sa,ses,g,n,p -> let - alui : Case -> Str = \x -> prepCase x ++ Lui ; + aell : Case -> Str = \x -> prepCase x ++ Ell ; in { s = table { - Nom => {c1 = [] ; c2 = [] ; comp = il ; ton = Lui} ; - Acc => {c1 = le ; c2 = [] ; comp = [] ; ton = Lui} ; - CPrep P_a => {c1 = [] ; c2 = lui ; comp = [] ; ton = alui (CPrep P_a)} ; - c => {c1 = [] ; c2 = [] ; comp, ton = alui c} + Nom => {c1 = [] ; c2 = [] ; comp = ell ; ton = Ell} ; + Acc => {c1 = el ; c2 = [] ; comp = [] ; ton = Ell} ; + CPrep P_a => {c1 = [] ; c2 = li ; comp = [] ; ton = aell (CPrep P_a)} ; + c => {c1 = [] ; c2 = [] ; comp, ton = aell c} } ; poss = \\n,g => case of { - => son ; - => sa ; - => ses ; - => see - } ; - + => son ; + => sa ; + _ => ses + } ; a = {g = g ; n = n ; p = p} ; hasClit = True } ; + elisPoss : Str -> Str = \s -> + pre { + vocal => s + "on" ; + _ => s + "a" + } ; + + + +--2 Determiners -- --- -----2 Determiners ----- ----- Determiners, traditionally called indefinite pronouns, are inflected ----- in gender and number, like adjectives. --- - pronForms : Adj -> Gender -> Number -> Str = \tale,g,n -> tale.s ! AF g n ; --- +-- Determiners, traditionally called indefinite pronouns, are inflected +-- in gender and number, like adjectives. + + pronForms : Adj -> Gender -> Number -> Str = \tal,g,n -> tal.s ! AF g n ; + } diff --git a/lib/src/catalan/ParadigmsCat.gf b/lib/src/catalan/ParadigmsCat.gf index ec6dc4b81..2f071ce8f 100644 --- a/lib/src/catalan/ParadigmsCat.gf +++ b/lib/src/catalan/ParadigmsCat.gf @@ -32,7 +32,9 @@ resource ParadigmsCat = BeschCat, CatCat in { - flags optimize=all ; +flags + optimize=all ; + -- coding = utf8 ; --2 Parameters -- @@ -158,7 +160,7 @@ oper -- them to prefix ones (i.e. ones placed before the noun in -- modification, as in "gran casa"), the following function is -- provided. --- JS: What about vi bó -> bon vi ? +-- JS: What about vi bÛ -> bon vi ? prefixA : A -> A ; @@ -191,7 +193,7 @@ oper mkV : overload { --- Regular verbs are ones inflected like "cantar", "perdre", "témer", "perdre", "servir", "dormir" +-- Regular verbs are ones inflected like "cantar", "perdre", "tÈmer", "perdre", "servir", "dormir" -- The regular verb function works for models I, IIa, IIb and IIa -- The module $BeschCat$ gives the complete set of "Bescherelle" conjugations. @@ -306,7 +308,7 @@ oper aN2 n = mkN2 n dative ; mkN3 = \n,p,q -> n ** {lock_N3 = <> ; c2 = p ; c3 = q} ; - mk2PN x g = {s = x ; g = g} ** {lock_PN = <>} ; + mk2PN x g = {s = x ; g = g; isPersonal = True ; lock_PN = <>} ; regPN x = mk2PN x g where { g = case last x of { "a" => feminine ; @@ -327,7 +329,7 @@ oper {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; isPre = a.isPre ; lock_A = <>} ; compADeg a = - {s = table {Posit => a.s ! Posit ; _ => \\f => "más" ++ a.s ! Posit ! f} ; + {s = table {Posit => a.s ! Posit ; _ => \\f => "més" ++ a.s ! Posit ! f} ; isPre = a.isPre ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -336,7 +338,7 @@ oper mkAdV x = ss x ** {lock_AdV = <>} ; mkAdA x = ss x ** {lock_AdA = <>} ; - regV x = -- cantar, perdre, témer, dormir, (servir) + regV x = -- cantar, perdre, tÈmer, dormir, (servir) let verb = case (Predef.dp 2 x) of { "re" => perdre_83 x ; @@ -354,7 +356,7 @@ oper special_ppV ve pa = { s = table { - VPart g n => (adjFort pa).s ! AF g n ; + VPart g n => (regA pa).s ! Posit ! AF g n ; p => ve.s ! p } ; lock_V = <> ; diff --git a/lib/src/catalan/StructuralCat.gf b/lib/src/catalan/StructuralCat.gf index c0626ad90..d9c48aee8 100644 --- a/lib/src/catalan/StructuralCat.gf +++ b/lib/src/catalan/StructuralCat.gf @@ -13,7 +13,7 @@ lin } ; almost_AdA, almost_AdN = ss (variants {"quasi"; "gairebé"}) ; always_AdV = ss "sempre" ; - although_Subj = ss "benché" ** {m = Conjunct} ; + although_Subj = ss ["encara que"] ** {m = Conjunct} ; and_Conj = {s1 = [] ; s2 = etConj.s ; n = Pl} ; because_Subj = ss "perque" ** {m = Indic} ; before_Prep = {s = "abans" ; c = MorphoCat.genitive ; isDir = False} ; @@ -29,7 +29,7 @@ lin either7or_DConj = {s1,s2 = "o" ; n = Sg} ; everybody_NP = makeNP ["tothom"] Masc Sg ; every_Det = {s,sp = \\_,_ => "cada" ; n = Sg ; s2 = []} ; - everything_NP = pn2np (mkPN ["tot"] Masc) ; + everything_NP = pn2np (mkPN "tot" Masc) ; everywhere_Adv = ss ["a tot arreu"] ; few_Det = { s,sp = \\g,c => prepCase c ++ genForms "pocs" "poques" ! g ; n = Pl ; s2 = []} ; @@ -38,8 +38,7 @@ lin from_Prep = complGen ; --- he_Pron = mkPronoun - "ell" "lo" "el" "ell" - ["el seu"] ["la seva"] ["els seus"] ["les seves"] + "ell" "el" "li" "ell" ("son"|["el seu"]) ("sa"|["la seva"]) "ses" Masc Sg P3 ; here_Adv = mkAdv "aquí" ; -- acÃŒ here7to_Adv = mkAdv ["cap aquí"] ; @@ -52,14 +51,14 @@ lin i_Pron = mkPronoun "jo" "em" "em" "mi" - ["el meu"] ["la meva"] ["els meus"] ["les meves"] + ("mon"|["el meu"]) ("ma"|["la meva"]) "mes" Fem Sg P1 ; in_Prep = mkPrep "en" ; - it_Pron = - mkPronoun - "ell" "lo" "el" "ell" - ["el seu"] ["la seva"] ["els seus"] ["les seves"] + it_Pron = mkPronoun + "ell" "ho" "li" "ell" + ["el seu"] ["la seva"] ["els seus"] Masc Sg P3 ; + less_CAdv = X.mkCAdv "menys" conjThan ; ---- many_Det = { s,sp = \\g,c => prepCase c ++ genForms "molts" "moltes" ! g ; n = Pl ; s2 = []} ; @@ -80,8 +79,8 @@ lin quite_Adv = ss "bastant" ; she_Pron = mkPronoun - "ella" "la" "la" "ella" - ["el seu"] ["la seva"] ["els seus"] ["les seves"] + "ella" "la" "li" "ella" + ("son"|["el seu"]) ("sa"|["la seva"]) "ses" Fem Sg P3 ; so_AdA = ss "tan" ; somebody_NP = pn2np (mkPN ["algË™"] Masc) ; @@ -107,7 +106,7 @@ lin therefore_PConj = ss ["per tant"] ; they_Pron = mkPronoun "elles" "les" "les" "elles" - ["el seu"] ["la seva"] ["llurs"] ["llurs"] + "llur" "llur" "llurs" Fem Pl P3 ; this_Quant = @@ -128,8 +127,8 @@ lin want_VV = mkVV (verbV (voler_120 "voler")) ; we_Pron = mkPronoun - "nosaltres" "nos" "nos" "nosaltres" - ["el nostre"] ["la nostra"] ["els nostres"] ["les nostres"] + "nosaltres" "ens" "ens" "nosaltres" + ["el nostre"] ["la nostra"] ["els nostres"] Fem Pl P1 ; whatSg_IP = {s = \\c => prepCase c ++ ["què"] ; a = aagr Masc Sg} ; whatPl_IP = {s = \\c => prepCase c ++ ["què"] ; a = aagr Masc Pl} ; --- @@ -149,21 +148,46 @@ lin yes_Utt = ss "sí" ; youSg_Pron = mkPronoun "tu" "et" "et" "tu" - ["el teu"] ["la teva"] ["els teus"] ["les teves"] + ("ton"|["el teu"]) ("ta"|["la teva"]) ("tes"|["les teves"]) Fem Sg P2 ; youPl_Pron = mkPronoun "vosaltres" "us" "us" "vosaltres" - ["el vostre"] ["la vostra"] ["els vostres"] ["les vostres"] + ["el vostre"] ["la vostra"] ["els vostres"] Fem Pl P2 ; - youPol_Pron = - mkPronoun - "vosté" "li" "li" "vosté" + youPol_Pron = he_Pron ; +{- mkPronoun + "vosté" "el" "li" "vosté" ["el seu"] ["la seva"] ["els seus"] ["les seves"] Fem Pl P2 ; +-} + not_Predet = {s = \\a,c => prepCase c ++ "no pas" ; c = Nom} ; have_V2 = dirV2 (verbV (tenir_108 "tenir")) ; + oper etConj : {s : Str ; n : MorphoCat.Number} = {s = "i" } ** {n = Pl} ; + +lin + if_then_Conj = {s1 = "si" ; s2 = "llavors" ; n = Sg ; lock_Conj = <>} ; + + no_Quant = + let + capS : Str = "cap" ; + cap : ParadigmsCat.Number => ParadigmsCat.Gender => Case => Str = table { + Sg => \\g,c => prepCase c ++ genForms capS capS ! g ; + Pl => \\g,c => prepCase c ++ genForms capS capS ! g + } + in { + s = \\_ => cap ; + sp = cap ; + s2 = [] + } ; + nobody_NP = pn2np (mkPN "ningú") ; + nothing_NP = pn2np (mkPN "res") ; + at_least_AdN = X.mkAdN "almenys" ; + at_most_AdN = X.mkAdN "com a màxim" ; + except_Prep = mkPrep "excepte" ; + as_CAdv = X.mkCAdv "tan" "com" ; lin language_title_Utt = ss "català" ;