From aec24a390162c24a5506ee566bca26d2fe16841f Mon Sep 17 00:00:00 2001 From: odanoburu Date: Wed, 5 Dec 2018 09:51:10 +0200 Subject: [PATCH 01/10] (Eng) fix missing paradigm invarA --- src/english/ParadigmsEng.gf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/english/ParadigmsEng.gf b/src/english/ParadigmsEng.gf index 1a56707b..c6fcd2b9 100644 --- a/src/english/ParadigmsEng.gf +++ b/src/english/ParadigmsEng.gf @@ -454,6 +454,9 @@ mkInterj : Str -> Interj mkOrd : Str -> Ord = \x -> lin Ord { s = regGenitiveS x}; + invarA : Str -> A ; + invarA a = mkAdjective a a a a ; + mk2A a b = mkAdjective a a a b ; regA a = case a of { _ + ("a" | "e" | "i" | "o" | "u" | "y") + ? + _ + From dadcd386c99d6e52a5621a4b5dbbc994ebf88ee3 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Wed, 5 Dec 2018 19:16:35 +0200 Subject: [PATCH 02/10] (Romance) Attributive and predicative adjective forms (#93) * (Fre,Por) accomodate changes to Romance adjectives - to support Spanish buen/bueno, gran/grande and catalan bo/bon * (Cat) Update paradigms to allow predicative and attributive forms of adj * (Spa) fix argument order in Spanish adjective paradigms * (Eng) fix missing paradigm invarA * (Spa) Flip order of args in mkAdj constructor --- src/catalan/DocumentationCatFunctor.gf | 54 ++++++------- src/catalan/LexiconCat.gf | 50 ++++++------ src/catalan/MorphoCat.gf | 22 +++--- src/catalan/ParadigmsCat.gf | 91 ++++++++++++---------- src/french/DocumentationFreFunctor.gf | 4 +- src/french/LexiconFre.gf | 6 +- src/french/MorphoFre.gf | 17 +++-- src/french/ParadigmsFre.gf | 12 ++- src/italian/DocumentationItaFunctor.gf | 54 ++++++------- src/italian/MakeStructuralIta.gf | 2 +- src/italian/MorphoIta.gf | 12 +-- src/portuguese/DocumentationPorFunctor.gf | 4 +- src/portuguese/ExtendPor.gf | 12 ++- src/portuguese/MorphoPor.gf | 13 ++-- src/portuguese/ParadigmsPor.gf | 2 +- src/romance/AdjectiveRomance.gf | 17 ++--- src/romance/CatRomance.gf | 4 +- src/romance/CommonRomance.gf | 42 ++++++++-- src/romance/NounRomance.gf | 10 +-- src/romance/PhraseRomance.gf | 4 +- src/romance/VerbRomance.gf | 73 +++++++++--------- src/spanish/DocumentationSpaFunctor.gf | 54 ++++++------- src/spanish/MorphoSpa.gf | 46 +++++++---- src/spanish/ParadigmsSpa.gf | 93 ++++++++++++----------- src/spanish/ParseSpa.gf | 35 ++++----- 25 files changed, 401 insertions(+), 332 deletions(-) diff --git a/src/catalan/DocumentationCatFunctor.gf b/src/catalan/DocumentationCatFunctor.gf index cd08241f..74e0e3f1 100644 --- a/src/catalan/DocumentationCatFunctor.gf +++ b/src/catalan/DocumentationCatFunctor.gf @@ -1,6 +1,6 @@ --# -path=.:../abstract:../common -incomplete concrete DocumentationCatFunctor of Documentation = CatCat ** open +incomplete concrete DocumentationCatFunctor of Documentation = CatCat ** open Terminology, -- the interface to be instantiated ResCat, CommonRomance, @@ -19,22 +19,22 @@ lincat Definition = {s : Str} ; Document = {s : Str} ; Tag = {s : Str} ; - + {- -} --# notpresent oper heading : N -> Str = \n -> (nounHeading n).s ; - + lin InflectionN, InflectionN3, InflectionN3 = \noun -> { t = "n" ; - s1 = heading1 (heading noun_Category ++ + s1 = heading1 (heading noun_Category ++ case noun.g of { - Masc => "("+heading masculine_Parameter+")" ; + Masc => "("+heading masculine_Parameter+")" ; Fem => "("+heading feminine_Parameter+")" }) ; - s2 = frameTable ( + s2 = frameTable ( tr (th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ tr (td (noun.s ! Sg) ++ td (noun.s ! Pl)) ) @@ -45,8 +45,8 @@ lin s1 = heading1 (nounHeading adjective_Category).s ; s2 = frameTable ( tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ - tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (AF Masc Sg)) ++ td (adj.s ! Posit ! (AF Masc Pl))) ++ - tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (AF Fem Sg)) ++ td (adj.s ! Posit ! (AF Fem Pl))) + tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Masc Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Masc Pl))) ++ + tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Fem Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Fem Pl))) ) } ; @@ -141,23 +141,23 @@ lin MkDocument d i e = ss (i.s1 ++ d.s ++ i.s2 ++ paragraph e.s) ; -- explanation appended in a new paragraph MkTag i = ss i.t ; -oper +oper verbExample : CatCat.Cl -> Str = \cl -> - (S.mkUtt cl).s + (S.mkUtt cl).s ++ ";" ++ (S.mkUtt (S.mkS S.anteriorAnt cl)).s --# notpresent ; - inflVerb : Verb -> Str = \verb -> - let + inflVerb : Verb -> Str = \verb -> + let vfin : CommonRomance.VF -> Str = \f -> - verb.s ! f ; + verb.s ! f ; ttable : TMood -> Str = \tense -> frameTable ( - tr (th "" ++ - th (heading singular_Parameter) ++ - th (heading plural_Parameter)) ++ - tr (th "1.p" ++ + tr (th "" ++ + th (heading singular_Parameter) ++ + th (heading plural_Parameter)) ++ + tr (th "1.p" ++ td (vfin (VFin tense Sg P1)) ++ td (vfin (VFin tense Pl P1))) ++ tr (th "2.p" ++ @@ -170,11 +170,11 @@ oper ttable2 : (Mood -> TMood) -> Str = \f -> frameTable ( - tr (intagAttr "th" "colspan=2" "" ++ - th (heading indicative_Parameter) ++ - th (heading conjunctive_Parameter)) ++ + tr (intagAttr "th" "colspan=2" "" ++ + th (heading indicative_Parameter) ++ + th (heading conjunctive_Parameter)) ++ tr (intagAttr "th" "rowspan=3" (heading singular_Parameter) ++ - th "1.p" ++ + th "1.p" ++ td (vfin (VFin (f Indic) Sg P1)) ++ td (vfin (VFin (f Conjunct) Sg P1))) ++ tr (th "2.p" ++ @@ -182,7 +182,7 @@ oper td (vfin (VFin (f Conjunct) Sg P2))) ++ tr (th "3.p" ++ td (vfin (VFin (f Indic) Sg P3)) ++ - td (vfin (VFin (f Conjunct) Sg P3))) ++ + td (vfin (VFin (f Conjunct) Sg P3))) ++ tr (intagAttr "th" "rowspan=3" (heading plural_Parameter) ++ th "1.p" ++ td (vfin (VFin (f Indic) Pl P1)) ++ @@ -190,7 +190,7 @@ oper tr (th "2.p" ++ td (vfin (VFin (f Indic) Pl P2)) ++ td (vfin (VFin (f Conjunct) Pl P2))) ++ - tr (th "3.p" ++ + tr (th "3.p" ++ td (vfin (VFin (f Indic) Pl P3)) ++ td (vfin (VFin (f Conjunct) Pl P3))) ) ; @@ -209,17 +209,17 @@ oper paragraph (vfin (VInfin False)) ++ heading2 (heading imperative_Parameter) ++ frameTable ( - tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ - tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ + tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ + tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ tr (th "pl.2.p" ++ td (vfin (VImper PlP2))) ) ++ heading2 (heading participle_Parameter) ++ frameTable ( tr (th (heading past_Parameter) ++ td (vfin (VPart Masc Sg))) ++ tr (th (heading present_Parameter) ++ td (vfin VGer)) - ) ; + ) ; {- --# notpresent --} +-} } diff --git a/src/catalan/LexiconCat.gf b/src/catalan/LexiconCat.gf index b1a14fc1..81efb50d 100644 --- a/src/catalan/LexiconCat.gf +++ b/src/catalan/LexiconCat.gf @@ -1,25 +1,25 @@ --# -path=.:../romance:../common:../abstract:../../prelude -concrete LexiconCat of Lexicon = CatCat ** open +concrete LexiconCat of Lexicon = CatCat ** open (M=MorphoCat), ParadigmsCat, BeschCat in { -flags +flags coding=utf8 ; optimize=values ; oper regFN : Str -> N = \s -> femN (regN s) ; - regMN : Str -> N = \s -> regN s ; + regMN : Str -> N = \s -> regN s ; irregMN : Str -> Str -> N = \pa,pans -> M.mkNounIrreg pa pans masculine ** {lock_N=<>} ; saberV : V = verbV (saber_99 "saber") ; lin - airplane_N = regMN "avió" ; + airplane_N = regMN "avió" ; answer_V2S = mkV2S (verbV (compondre_26 "respondre")) dative ; apartment_N = regMN "pis" ; apple_N = regFN "poma" ; - art_N = regMN "art" ; + art_N = regMN "art" ; ask_V2Q = mkV2Q (mkV "preguntar") dative ; baby_N = regMN "nadó" ; bad_A = mkADeg (regA "dolent") (regA "pitjor") ; @@ -28,10 +28,10 @@ lin become_VA = reflV (mkV "tornar") ; -- esdevenir beer_N = regFN "cervesa" ; beg_V2V = mkV2V (mkV "demanar") accusative dative ; - big_A = regADeg "gros" ; + big_A = mkA "gros" "grossa" ; bike_N = regFN "bicicleta" ; bird_N = regMN "ocell" ; - black_A = compADeg (mkA "negre" "negra" "negres" "negres" "negrament") ; + black_A = compADeg (mkA "negre" "negra" "negres" "negres" "negrament") ; blue_A = compADeg (mkA "blau" "blava" "blaus" "blaves" "blavament") ; boat_N = regFN "barca" ; book_N = regMN "llibre" ; @@ -55,15 +55,15 @@ lin cheese_N = regMN "formatge" ; child_N = regMN "nen" ; -- nena church_N = regFN "església" ; - city_N = regFN "ciutat" ; + city_N = regFN "ciutat" ; clean_A = regADeg "net" ; clever_A = regADeg "inteligent" ; close_V2 = dirV2 (verbV (trencar_112 "tancar")) ; coat_N = regMN "abric" ; cold_A = regADeg "fred" ; come_V = verbV (venir_117 "venir") ; - computer_N = regMN "ordinador" ; - country_N = mkN "país" "països" masculine ; + computer_N = regMN "ordinador" ; + country_N = mkN "país" "països" masculine ; cousin_N = regMN "cosí" ; cow_N = mkN "vaca" ; die_V = verbV (morir_71 "morir") ; @@ -92,7 +92,7 @@ lin girl_N = regFN "noia" ; glove_N = regMN "guant" ; gold_N = regMN "or" ; - good_A = prefA (mkADeg (mkA "bo" "bona") (mkA "millor")) ; + good_A = mkA (prefA "bo" "bon") (mkA "millor") ; go_V = (verbV (anar_4 "anar")) ; green_A = regADeg "verd" ; harbour_N = regMN "port" ; @@ -107,7 +107,7 @@ lin important_A = regADeg "important" ; industry_N = regFN "indústria" ; iron_N = regMN "ferro" ; - king_N = regMN "rei" ; + king_N = regMN "rei" ; know_V2 = dirV2 saberV ; know_VQ = mkVQ saberV; know_VS = mkVS saberV; @@ -133,7 +133,7 @@ lin music_N = regFN "música" ; narrow_A = regADeg "estret" ; new_A = prefixA (compADeg (mkA "nou" "nova" "nous" "noves" "novament")) ; - newspaper_N = regMN "diari" ; -- periòdic + newspaper_N = regMN "diari" ; -- periòdic oil_N = regMN "oli" ; old_A = regADeg "vell" ; open_V2 = dirV2 (verbV (obrir_77 "obrir")) ; @@ -147,14 +147,14 @@ lin play_V2 = dirV2 (verbV (pregar_86 "jugar")) ; policeman_N = regMN "policia" ; -- fem refers to the institution priest_N = regMN "capellà" ; -- masc - probable_AS = mkAS (regA "probable") ; + probable_AS = mkAS (regA "probable") ; queen_N = regN "reina" ; radio_N = regFN "ràdio" ; rain_V0 = mkV0 (verbV (moure_72 "ploure")) ; read_V2 = dirV2 (verbV (servir_101 "llegir")) ; red_A = regADeg "vermell" ; religion_N = mkN "religió" "religions" feminine ; - restaurant_N = regMN "restaurant" ; + restaurant_N = regMN "restaurant" ; river_N = regMN "riu" ; rock_N = regFN "roca" ; roof_N = regFN "teulada" ; @@ -163,7 +163,7 @@ lin say_VS = mkVS (verbV (dir_41 "dir")) ; school_N = regFN "escola" ; science_N = regFN "ciència" ; - sea_N = regMN "mar" ; -- masc & fem + sea_N = regMN "mar" ; -- masc & fem seek_V2 = dirV2 (verbV (trencar_112 "buscar")) ; see_V2 = dirV2 (verbV (veure_118 "veure")) ; sell_V3 = dirV3 (verbV (vendre_116 "vendre")) dative ; @@ -184,13 +184,13 @@ lin star_N = regFN "estrella" ; steel_N = regMN "acer" ; stone_N = regFN "pedra" ; - stove_N = regMN "forn" ; + stove_N = regMN "forn" ; student_N = regN "estudiant" ; -- used both for fem & masc stupid_A = regADeg "estúpid" ; - sun_N = regMN "sol" ; + sun_N = regMN "sol" ; switch8off_V2 = dirV2 (verbV (pregar_86 "apagar")) ; switch8on_V2 = dirV2 (verbV (atendre_8 "encendre")) ; - table_N = regFN "taula" ; + table_N = regFN "taula" ; talk_V3 = mkV3 (mkV "parlar") dative genitive ; teacher_N = regMN "mestre" ; -- mestra teach_V2 = dirV2 (mkV "ensenyar") ; @@ -228,7 +228,7 @@ lin add_V3 = dirV3 (mkV "afegir") dative ; -- also: (mkV "sumar") number_N = regMN "número" ; put_V2 = dirV2 (mkV "posar") ; - stop_V = mkV "aturar" ; + stop_V = mkV "aturar" ; jump_V = mkV "saltar" ; left_Ord = M.mkOrd (regA "esquerra") ; right_Ord = M.mkOrd (regA "dreta") ; @@ -269,7 +269,7 @@ lin fog_N = regFN "boira" ; foot_N = regMN "peu" ; forest_N = regMN "bosc" ; - grass_N = regFN "herba" ; + grass_N = regFN "herba" ; guts_N = regMN "budell" ; hair_N = regMN "cabell" ; hand_N = regFN "mà" ; @@ -290,7 +290,7 @@ lin nose_N = regMN "nas" ; person_N = regFN "persona" ; rain_N = regFN "pluja" ; -- pluges - road_N = regMN "carrer" ; + road_N = regMN "carrer" ; root_N = regFN "arrel" ; rope_N = regN "corda" ; salt_N = regFN "sal" ; @@ -300,14 +300,14 @@ lin sky_N = regMN "cel" ; smoke_N = regMN "fum" ; snow_N = regFN "neu" ; -- fem - stick_N = regMN "bastó" ; + stick_N = regMN "bastó" ; tail_N = regFN "cua" ; tongue_N = mkN "llengua" ; -- llengües tooth_N = regFN "dent" ; wife_N = regFN "esposa" ; wind_N = regMN "vent" ; wing_N = regFN "ala" ; - worm_N = regMN "cuc" ; + worm_N = regMN "cuc" ; year_N = regMN "any" ; bite_V2 = dirV2 (verbV (pregar_86 "mossegar")) ; blow_V = mkV "bufar" ; @@ -327,7 +327,7 @@ lin hold_V2 = dirV2 (verbV (obtenir_78 "sostenir")) ; hunt_V2 = dirV2 (verbV (començar_22 "caçar")) ; kill_V2 = dirV2 (mkV "matar") ; - laugh_V = verbV (riure_96 "riure") ; + laugh_V = verbV (riure_96 "riure") ; lie_V = reflV (verbV (jeure_62 "jeure")) ; play_V = verbV (pregar_86 "jugar") ; pull_V2 = dirV2 (mkV "tibar") ; diff --git a/src/catalan/MorphoCat.gf b/src/catalan/MorphoCat.gf index 906ebed1..13ce7fbf 100644 --- a/src/catalan/MorphoCat.gf +++ b/src/catalan/MorphoCat.gf @@ -94,14 +94,19 @@ oper -- Here are some patterns. First one that describes the worst case. -- gcc M2.1 - mkAdj : (_,_,_,_,_ : Str) -> Adj = \prim,prima,prims,primes,primament -> + mkAdjFull : (x1,_,_,_,_,x6 : Str) -> Adj = \bon,bo,prima,prims,primes,primament -> {s = table { - AF Masc n => numForms prim prims ! n ; - AF Fem n => numForms prima primes ! n ; - AA => primament + ASg Masc AAttr => bon ; + ASg Masc APred => bo ; + ASg Fem _ => prima ; + APl Masc => prims ; + APl Fem => primes ; + AA => primament } } ; + mkAdj : (x1,_,_,_,x5 : Str) -> Adj = \a,b,c,d,e -> mkAdjFull a a b c d e ; + --- Then the regular and invariant patterns. adjPrim : Str -> Adj = \prim -> @@ -116,16 +121,15 @@ oper 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") ; + adjBo : (bo,bon : Str) -> Adj = \bo,bon -> + mkAdjFull bon bo (bon + "a") (bon + "s") (bon + "es") (bon + "ament") ; adjFidel : Str -> Adj = \fidel -> let fidels : Str = case (last fidel) of { _ + ("s"|"ç"|"x") => fidel + "os" ; --feliç; capaç _ => fidel + "s" } ; - in mkAdj fidel fidel fidels fidels - (fidel + "ment") ; + in mkAdj fidel fidel fidels fidels (fidel + "ment") ; --boig, boja, bojos, boges --lleig, lletja, lletjos, lletges @@ -300,6 +304,6 @@ oper unaccent : Str -> Str = \vocal -> -- 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 ; + pronForms : Adj -> Gender -> Number -> Str = \tal,g,n -> tal.s ! genNum2Aform g n ; } diff --git a/src/catalan/ParadigmsCat.gf b/src/catalan/ParadigmsCat.gf index b4947813..63f13096 100644 --- a/src/catalan/ParadigmsCat.gf +++ b/src/catalan/ParadigmsCat.gf @@ -5,12 +5,12 @@ -- Aarne Ranta 2004 - 2006 -- Jordi Saludes 2008: Modified from ParadigmsSpa -- --- This is an API for the user of the resource grammar +-- This is an API for the user of the resource grammar -- for adding lexical items. It gives functions for forming -- expressions of open categories: nouns, adjectives, verbs. --- +-- -- Closed categories (determiners, pronouns, conjunctions) are --- accessed through the resource syntax API, $Structural.gf$. +-- accessed through the resource syntax API, $Structural.gf$. -- -- The main difference with $MorphoCat.gf$ is that the types -- referred to are compiled resource grammar types. We have moreover @@ -24,11 +24,11 @@ -- verbs, there is a fairly complete list of irregular verbs in -- [``IrregCat`` ../../catalan/IrregCat.gf]. -resource ParadigmsCat = - open - (Predef=Predef), - Prelude, - MorphoCat, +resource ParadigmsCat = + open + (Predef=Predef), + Prelude, + MorphoCat, BeschCat, CatCat in { @@ -36,19 +36,19 @@ flags optimize=all ; coding = utf8 ; ---2 Parameters +--2 Parameters -- -- To abstract over gender names, we define the following identifiers. oper - Gender : Type ; + Gender : Type ; masculine : Gender ; feminine : Gender ; -- To abstract over number names, we define the following. - Number : Type ; + Number : Type ; singular : Number ; plural : Number ; @@ -70,7 +70,7 @@ oper mkN : overload { -- The regular function takes the singular form and the gender, --- and computes the plural and the gender by a heuristic. +-- and computes the plural and the gender by a heuristic. -- The heuristic says that the gender is feminine for nouns -- ending with "a" or "z", and masculine for all other words. -- Nouns ending with "a", "o", "e" have the plural with "s", @@ -89,23 +89,23 @@ oper } ; ---3 Compound nouns +--3 Compound nouns -- -- Some nouns are ones where the first part is inflected as a noun but --- the second part is not inflected. e.g. "número de telèfon". +-- the second part is not inflected. e.g. "número de telèfon". -- They could be formed in syntax, but we give a shortcut here since -- they are frequent in lexica. compN : N -> Str -> N ; -- compound, e.g. "número" + "de telèfon" ---3 Relational nouns --- --- Relational nouns ("filla de x") need a case and a preposition. +--3 Relational nouns +-- +-- Relational nouns ("filla de x") need a case and a preposition. mkN2 : N -> Prep -> N2 ; -- e.g. filla + genitive --- The most common cases are the genitive "de" and the dative "a", +-- The most common cases are the genitive "de" and the dative "a", -- with the empty preposition. deN2 : N -> N2 ; -- relation with genitive @@ -123,11 +123,11 @@ oper -- $N3$ are purely lexical categories. But you can use the $AdvCN$ -- and $PrepNP$ constructions to build phrases like this. --- +-- --3 Proper names and noun phrases -- -- Proper names need a string and a gender. --- The default gender is feminine for names ending with "a", otherwise masculine. TODO +-- The default gender is feminine for names ending with "a", otherwise masculine. TODO mkPN : overload { mkPN : (Anna : Str) -> PN ; -- feminine for "-a", otherwise masculine @@ -151,8 +151,8 @@ oper mkA : (fort,forta,forts,fortes,fortament : Str) -> A ; -- worst case --- In the worst case, two separate adjectives are given: --- the positive ("bo"), and the comparative ("millor"). +-- In the worst case, two separate adjectives are given: +-- the positive ("bo"), and the comparative ("millor"). mkA : (bo : A) -> (millor : A) -> A -- special comparison (default with "mas") } ; @@ -177,7 +177,7 @@ oper --2 Adverbs -- Adverbs are not inflected. Most lexical ones have position --- after the verb. +-- after the verb. mkAdv : Str -> Adv ; @@ -200,11 +200,11 @@ oper mkV : (cantar : Str) -> V ; -- regular in models I, IIa, IIb --- Verbs with predictable alternation: +-- Verbs with predictable alternation: -- a) inchoative verbs, servir serveixo -- b) re verbs with c/g in root, vendre venc ; subj. vengui - mkV : (servir,serveixo : Str) -> V ; --inchoative verbs and "re" verbs whose 1st person ends in c + mkV : (servir,serveixo : Str) -> V ; --inchoative verbs and "re" verbs whose 1st person ends in c -- Most irregular verbs are found in $IrregCat$. If this is not enough, -- the module $BeschCat$ gives all the patterns of the "Bescherelle" @@ -229,7 +229,7 @@ oper --3 Two-place verbs -- -- Two-place verbs need a preposition, except the special case with direct object. --- (transitive verbs). +-- (transitive verbs). mkV2 : overload { mkV2 : Str -> V2 ; -- regular verb, direct object @@ -274,9 +274,9 @@ oper mkAV : A -> Prep -> AV ; --% mkA2V : A -> Prep -> Prep -> A2V ; --% --- Notice: categories $AS, A2S, AV, A2V$ are just $A$, +-- Notice: categories $AS, A2S, AV, A2V$ are just $A$, -- and the second argument is given --- as an adverb. Likewise +-- as an adverb. Likewise -- $V0$ is just $V$. V0 : Type ; --% @@ -289,7 +289,7 @@ oper -- The definitions should not bother the user of the API. So they are -- hidden from the document. - Gender = MorphoCat.Gender ; + Gender = MorphoCat.Gender ; Number = MorphoCat.Number ; masculine = Masc ; feminine = Fem ; @@ -323,19 +323,23 @@ oper makeNP x g n = {s = (pn2np (mk2PN x g)).s; a = agrP3 g n ; hasClit = False ; isPol = False ; isNeg = False} ** {lock_NP = <>} ; - mk5A a b c d e = + mk5A a b c d e = compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; lock_A = <>} ; mk2A a b = compADeg {s = \\_ => (mkAdj2Reg a b).s ; isPre = False ; lock_A = <>} ; regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; + prefA = overload { + prefA : A -> A = \a -> a ** {isPre = True} ; + prefA : Str -> Str -> A = \bo,bon -> + compADeg (lin A {s = \\_ => (adjBo bo bon).s ; isPre = True}) ; + } ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; - mkADeg a b = - {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; + mkADeg a b = + {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} ; + compADeg a = + {s = table {Posit => a.s ! Posit ; _ => \\f => "més" ++ a.s ! Posit ! f} ; isPre = a.isPre ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -356,7 +360,7 @@ oper _ + "re" => perdre_83 x ; _ + "er" => verbEr x ; --handles accents in infinitives and c/ç, g/j - _ + "ir" => dormir_44 x ; --inchoative verbs with regAltV + _ + "ir" => dormir_44 x ; --inchoative verbs with regAltV _ + "ur" => dur_45 x ; _ => cantar_15 x } ; @@ -384,10 +388,10 @@ oper mk3V x y z = let ure = Predef.dp 3 x ; venc = Predef.dp 4 y ; - gut = Predef.dp 3 z + gut = Predef.dp 3 z in case of { <_+"re",_,"gut"> => regAltV x y ; --default participle of type dolgut - + --if these are overfitting, just comment out. --still doesn't catch creure, seure; mk4V with creiem as 4th arg? <"ure",_, "uit"> => coure_32 x ; --coure coem cuit @@ -425,7 +429,7 @@ oper special_ppV ve pa = { s = table { - VPart g n => (regA pa).s ! Posit ! AF g n ; + VPart g n => (regA pa).s ! Posit ! genNum2Aform g n ; p => ve.s ! p } ; lock_V = <> ; @@ -489,7 +493,7 @@ oper -- To form a noun phrase that can also be plural, -- you can use the worst-case function. - makeNP : Str -> Gender -> Number -> NP ; + makeNP : Str -> Gender -> Number -> NP ; mkA = overload { mkA : (util : Str) -> A = regA ; @@ -504,7 +508,10 @@ oper mkADeg : A -> A -> A ; compADeg : A -> A ; regADeg : Str -> A ; - prefA : A -> A ; + prefA : overload { + prefA : A -> A ; -- gran + prefA : (bo,bon : Str) -> A -- predicative masc, attributive masc + } ; prefixA = prefA ; mkV = overload { @@ -521,7 +528,7 @@ oper mkV2 = overload { mkV2 : Str -> V2 = \s -> dirV2 (mkV s) ; - mkV2 : V -> V2 = dirV2 ; + mkV2 : V -> V2 = dirV2 ; mkV2 : V -> Prep -> V2 = mk2V2 } ; mk2V2 : V -> Prep -> V2 ; diff --git a/src/french/DocumentationFreFunctor.gf b/src/french/DocumentationFreFunctor.gf index b48eff57..5ea92921 100644 --- a/src/french/DocumentationFreFunctor.gf +++ b/src/french/DocumentationFreFunctor.gf @@ -45,8 +45,8 @@ lin s1 = heading1 (nounHeading adjective_Category).s ; s2 = frameTable ( tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ - tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (AF Masc Sg)) ++ td (adj.s ! Posit ! (AF Masc Pl))) ++ - tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (AF Fem Sg)) ++ td (adj.s ! Posit ! (AF Fem Pl))) + tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Masc Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Masc Pl))) ++ + tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Fem Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Fem Pl))) ) } ; diff --git a/src/french/LexiconFre.gf b/src/french/LexiconFre.gf index 42b91684..0203a9fa 100644 --- a/src/french/LexiconFre.gf +++ b/src/french/LexiconFre.gf @@ -18,7 +18,7 @@ lin bad_A = prefA (mkADeg (regA "mauvais") (regA "pire")) ; bank_N = regGenN "banque" feminine ; beautiful_A = - prefA (compADeg (mkA (pre {voyelle => "bel" ; _ => "beau" }) "belle" "beaux" "bellement")) ; + prefA (compADeg (mkA "beau" "bel" "beaux" "belle" "bellement")) ; become_VA = mkVA devenir_V ; beer_N = regGenN "bière" feminine ; beg_V2V = mkV2V (regV "demander") accusative dative ; @@ -129,11 +129,11 @@ lin music_N = regGenN "musique" feminine ; narrow_A = regA "étroit" ; new_A = - prefA (compADeg (mkA (pre {voyelle => "nouvel" ; _ => "nouveau" }) "nouvelle" "nouveaux" "nouvellement")) ; + prefA (compADeg (mkA "nouveau" "nouvel" "nouveaux" "nouvelle" "nouvellement")) ; newspaper_N = regGenN "journal" masculine ; oil_N = regGenN "huile" feminine ; old_A = - prefA (compADeg (mkA (pre {voyelle => "vieil" ; _ => "vieux" }) "vieille" "vieux" "vieillement")) ; + prefA (compADeg (mkA "vieux" "vieil" "vieux" "vieille" "vieillement")) ; open_V2 = ouvrir_V2 ; paint_V2A = mkV2A (v2V peindre_V2) accusative (mkPrep "en") ; paper_N = regGenN "papier" masculine ; diff --git a/src/french/MorphoFre.gf b/src/french/MorphoFre.gf index 42fdb7a2..87d6c3ef 100644 --- a/src/french/MorphoFre.gf +++ b/src/french/MorphoFre.gf @@ -72,14 +72,19 @@ oper -- Adjectives are conveniently seen as gender-dependent nouns. -- Here are some patterns. First one that describes the worst case. - mkAdj : (_,_,_,_ : Str) -> Adj = \vieux,vieuxs,vieille,vieillement -> - {s = table { - AF Masc n => numForms vieux vieuxs ! n ; - AF Fem n => nomReg vieille ! n ; - AA => vieillement - } + mkAdj' : (_,_,_,_,_ : Str) -> Adj ; + mkAdj' vieux vieil vieuxs vieille vieillement = { + s = table { + ASg Masc _ => pre {#voyelle => vieil ; "h" => vieil ; _ => vieux} ; + ASg Fem _ => vieille ; + APl g => genForms vieuxs (vieille + "s") ! g ; + AA => vieillement + } } ; + mkAdj : (_,_,_,_ : Str) -> Adj ; + mkAdj bleu bleus bleue bleuement = mkAdj' bleu bleu bleus bleue bleuement ; + -- Then the regular and invariant patterns. adjReg : Str -> Gender => Number => Str = \bu -> table { diff --git a/src/french/ParadigmsFre.gf b/src/french/ParadigmsFre.gf index 97dea876..551425d6 100644 --- a/src/french/ParadigmsFre.gf +++ b/src/french/ParadigmsFre.gf @@ -160,9 +160,12 @@ oper mkA : (banal,banale,banaux : Str) -> A ; --- This is the worst-case paradigm for the positive forms. +-- This is the worst-case paradigm for the positive forms, except for "vieux/vieil". - mkA : (banal,banale,banaux,banalement : Str) -> A ; -- worst-case adjective + mkA : (banal,banale,banaux,banalement : Str) -> A ; -- almost worst-case adjective + +-- This is the worst-case paradigm for the positive forms, used for "vieux/vieil". + mkA : (vieux,vieil,vieille,vieuxs,vieuxment : Str) -> A ; -- worst-case adjetive -- If comparison forms are irregular (i.e. not formed by "plus", e.g. -- "bon-meilleur"), the positive and comparative can be given as separate @@ -387,7 +390,8 @@ oper mkPN : N -> PN = \x -> lin PN {s = x.s ! Sg ; g = x.g} ; } ; - mk4A a b c d = compADeg {s = \\_ => (mkAdj a c b d).s ; isPre = False ; lock_A = <>} ; + mk4A a b c d = mk5A a a b c d ; + mk5A a b c d e = compADeg {s = \\_ => (mkAdj' a b c d e).s ; isPre = False ; lock_A = <>} ; regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; @@ -398,6 +402,7 @@ oper mkA : (sec,seche : Str) -> A = \sec,seche -> mk4A sec seche (sec + "s") (seche + "ment") ; mkA : (banal,banale,banaux : Str) -> A = \sec,seche,secs -> mk4A sec seche secs (seche + "ment") ; mkA : (banal,banale,banaux,banalement : Str) -> A = mk4A ; + mkA : (vieux,vieil,vieille,vieuxs,vieuxment : Str) -> A = mk5A ; mkA : A -> A -> A = mkADeg }; @@ -471,6 +476,7 @@ oper regA : Str -> A ; mk4A : (banal,banale,banaux,banalement : Str) -> A ; + mk5A : (vieux,vieil,vieille,vieuxs,vieuxment : Str) -> A ; -- worst-case adjetive prefA : A -> A ; diff --git a/src/italian/DocumentationItaFunctor.gf b/src/italian/DocumentationItaFunctor.gf index 9bf75a0f..e36d281f 100644 --- a/src/italian/DocumentationItaFunctor.gf +++ b/src/italian/DocumentationItaFunctor.gf @@ -1,6 +1,6 @@ --# -path=.:../abstract:../common -incomplete concrete DocumentationItaFunctor of Documentation = CatIta ** open +incomplete concrete DocumentationItaFunctor of Documentation = CatIta ** open Terminology, -- the interface to be instantiated ResIta, CommonRomance, @@ -19,22 +19,22 @@ lincat Definition = {s : Str} ; Document = {s : Str} ; Tag = {s : Str} ; - + {- -} --# notpresent oper heading : N -> Str = \n -> (nounHeading n).s ; - + lin InflectionN, InflectionN3, InflectionN3 = \noun -> { t = "n" ; - s1 = heading1 (heading noun_Category ++ + s1 = heading1 (heading noun_Category ++ case noun.g of { - Masc => "("+heading masculine_Parameter+")" ; + Masc => "("+heading masculine_Parameter+")" ; Fem => "("+heading feminine_Parameter+")" }) ; - s2 = frameTable ( + s2 = frameTable ( tr (th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ tr (td (noun.s ! Sg) ++ td (noun.s ! Pl)) ) @@ -45,8 +45,8 @@ lin s1 = heading1 (nounHeading adjective_Category).s ; s2 = frameTable ( tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ - tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (AF Masc Sg)) ++ td (adj.s ! Posit ! (AF Masc Pl))) ++ - tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (AF Fem Sg)) ++ td (adj.s ! Posit ! (AF Fem Pl))) + tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Masc Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Masc Pl))) ++ + tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Fem Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Fem Pl))) ) } ; @@ -142,23 +142,23 @@ lin MkDocument d i e = ss (i.s1 ++ d.s ++ i.s2 ++ paragraph e.s) ; -- explanation appended in a new paragraph MkTag i = ss i.t ; -oper +oper verbExample : CatIta.Cl -> Str = \cl -> - (S.mkUtt cl).s + (S.mkUtt cl).s ++ ";" ++ (S.mkUtt (S.mkS S.anteriorAnt cl)).s --# notpresent ; - inflVerb : Verb -> Str = \verb -> - let + inflVerb : Verb -> Str = \verb -> + let vfin : CommonRomance.VF -> Str = \f -> - verb.s ! f ; + verb.s ! f ; ttable : TMood -> Str = \tense -> frameTable ( - tr (th "" ++ - th (heading singular_Parameter) ++ - th (heading plural_Parameter)) ++ - tr (th "1.p" ++ + tr (th "" ++ + th (heading singular_Parameter) ++ + th (heading plural_Parameter)) ++ + tr (th "1.p" ++ td (vfin (VFin tense Sg P1)) ++ td (vfin (VFin tense Pl P1))) ++ tr (th "2.p" ++ @@ -171,11 +171,11 @@ oper ttable2 : (Mood -> TMood) -> Str = \f -> frameTable ( - tr (intagAttr "th" "colspan=2" "" ++ - th (heading indicative_Parameter) ++ - th (heading conjunctive_Parameter)) ++ + tr (intagAttr "th" "colspan=2" "" ++ + th (heading indicative_Parameter) ++ + th (heading conjunctive_Parameter)) ++ tr (intagAttr "th" "rowspan=3" (heading singular_Parameter) ++ - th "1.p" ++ + th "1.p" ++ td (vfin (VFin (f Indic) Sg P1)) ++ td (vfin (VFin (f Conjunct) Sg P1))) ++ tr (th "2.p" ++ @@ -183,7 +183,7 @@ oper td (vfin (VFin (f Conjunct) Sg P2))) ++ tr (th "3.p" ++ td (vfin (VFin (f Indic) Sg P3)) ++ - td (vfin (VFin (f Conjunct) Sg P3))) ++ + td (vfin (VFin (f Conjunct) Sg P3))) ++ tr (intagAttr "th" "rowspan=3" (heading plural_Parameter) ++ th "1.p" ++ td (vfin (VFin (f Indic) Pl P1)) ++ @@ -191,7 +191,7 @@ oper tr (th "2.p" ++ td (vfin (VFin (f Indic) Pl P2)) ++ td (vfin (VFin (f Conjunct) Pl P2))) ++ - tr (th "3.p" ++ + tr (th "3.p" ++ td (vfin (VFin (f Indic) Pl P3)) ++ td (vfin (VFin (f Conjunct) Pl P3))) ) ; @@ -210,17 +210,17 @@ oper paragraph (vfin (VInfin False)) ++ heading2 (heading imperative_Parameter) ++ frameTable ( - tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ - tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ + tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ + tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ tr (th "pl.2.p" ++ td (vfin (VImper PlP2))) ) ++ heading2 (heading participle_Parameter) ++ frameTable ( tr (th (heading past_Parameter) ++ td (vfin (VPart Masc Sg))) ++ tr (th (heading present_Parameter) ++ td (vfin VGer)) - ) ; + ) ; {- --# notpresent --} +-} } diff --git a/src/italian/MakeStructuralIta.gf b/src/italian/MakeStructuralIta.gf index 2d4718e2..2982aa53 100644 --- a/src/italian/MakeStructuralIta.gf +++ b/src/italian/MakeStructuralIta.gf @@ -15,7 +15,7 @@ oper mkPredet = overload { mkPredet : A -> Predet = \adj -> lin Predet { - s = \\a,c => prepCase c ++ adj.s ! Posit ! AF a.g a.n ; + s = \\a,c => prepCase c ++ adj.s ! Posit ! genNum2Aform a.g a.n ; c = Nom ; a = PNoAg } ; diff --git a/src/italian/MorphoIta.gf b/src/italian/MorphoIta.gf index 60868b79..3921644b 100644 --- a/src/italian/MorphoIta.gf +++ b/src/italian/MorphoIta.gf @@ -78,10 +78,12 @@ oper mkAdj : (_,_,_,_,_ : Str) -> Adj = \solo,sola,soli,sole,solamente -> {s = table { - AF Masc n => numForms solo soli ! n ; - AF Fem n => numForms sola sole ! n ; - AA => solamente - } + ASg Masc _ => solo ; + ASg Fem _ => sola ; + APl Masc => soli ; + APl Fem => sole ; + AA => solamente + } } ; -- Then the regular and invariant patterns. @@ -189,6 +191,6 @@ oper -- 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 ; + pronForms : Adj -> Gender -> Number -> Str = \tale,g,n -> tale.s ! genNum2Aform g n ; } diff --git a/src/portuguese/DocumentationPorFunctor.gf b/src/portuguese/DocumentationPorFunctor.gf index 8a98bfc2..84d94543 100644 --- a/src/portuguese/DocumentationPorFunctor.gf +++ b/src/portuguese/DocumentationPorFunctor.gf @@ -45,8 +45,8 @@ lin s1 = heading1 (nounHeading adjective_Category).s ; s2 = frameTable ( tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ - tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (AF Masc Sg)) ++ td (adj.s ! Posit ! (AF Masc Pl))) ++ - tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (AF Fem Sg)) ++ td (adj.s ! Posit ! (AF Fem Pl))) + tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Masc Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Masc Pl))) ++ + tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (genNum2Aform Fem Sg)) ++ td (adj.s ! Posit ! (genNum2Aform Fem Pl))) ) } ; diff --git a/src/portuguese/ExtendPor.gf b/src/portuguese/ExtendPor.gf index 52cb8e90..e06683e4 100644 --- a/src/portuguese/ExtendPor.gf +++ b/src/portuguese/ExtendPor.gf @@ -127,7 +127,7 @@ concrete ExtendPor of Extend = } ; ICompAP ap = { - s =\\a => "o quão" ++ ap.s ! AF a.g a.n ; + s =\\a => "o quão" ++ ap.s ! (genNum2Aform a.g a.n) ; cop = serCopula } ; @@ -165,12 +165,12 @@ concrete ExtendPor of Extend = ComplBareVS = ComplVS ; AdjAsCN ap = { - s =\\n => ap.s ! AF Masc n ; + s =\\n => ap.s ! (genNum2Aform Masc n) ; g = Masc } ; AdjAsNP ap = heavyNP { - s = \\_c => ap.s ! AF Masc Sg ; + s = \\_c => ap.s ! ASg Masc APred ; a = Ag Masc Sg P3 } ; @@ -200,10 +200,8 @@ concrete ExtendPor of Extend = } ; CompoundAP noun adj = { - s = \\af => case af of { - AF g n => adj.s ! Posit ! AF noun.g n ++ "de" ++ noun.s ! n ; - -- do I need do(s)/da(s)? - _ => adj.s ! Posit ! AF noun.g Sg ++ "de" ++ noun.s ! Sg + s = \\af => case (aform2aagr af) of { + {n = n} => adj.s ! Posit ! (genNum2Aform noun.g n) ++ "de" ++ noun.s ! n } ; isPre = adj.isPre } ; diff --git a/src/portuguese/MorphoPor.gf b/src/portuguese/MorphoPor.gf index e4c20604..e45c92d5 100644 --- a/src/portuguese/MorphoPor.gf +++ b/src/portuguese/MorphoPor.gf @@ -118,9 +118,9 @@ oper mkAdj : (_,_,_,_,_ : Str) -> Adj = \burro,burra,burros,burras,burramente -> {s = table { - AF Masc n => numForms burro burros ! n ; - AF Fem n => numForms burra burras ! n ; - AA => burramente + ASg g _ => genForms burro burra ! g ; + APl g => genForms burros burras ! g ; + AA => burramente } } ; @@ -129,7 +129,8 @@ oper adj = mkAdjReg aj in { s = table { - AF g n => adj.s ! AF g n ; + ASg g _ => adj.s ! ASg g APred ; + APl g => adj.s ! APl g ; AA => av } } ; @@ -245,11 +246,11 @@ oper -- inflected in gender and number, like adjectives. pronForms : Adj -> Gender -> Number -> Str = - \tale,g,n -> tale.s ! AF g n ; + \tale,g,n -> tale.s ! (genNum2Aform g n) ; mkOrdinal : A -> Ord = \adj -> lin Ord { - s = \\ag => adj.s ! Posit ! AF ag.g ag.n ; + s = \\ag => adj.s ! Posit ! (genNum2Aform ag.g ag.n) ; } ; mkQuantifier : (esse,essa,esses,essas : Str) -> Quant = \esse,essa,esses,essas-> diff --git a/src/portuguese/ParadigmsPor.gf b/src/portuguese/ParadigmsPor.gf index 6066a16b..88c9e38b 100644 --- a/src/portuguese/ParadigmsPor.gf +++ b/src/portuguese/ParadigmsPor.gf @@ -366,7 +366,7 @@ oper -- deviant past participle, e.g. abrir - aberto special_ppV ve pa = { s = table { - VPart g n => (adjPreto pa).s ! AF g n ; + VPart g n => (adjPreto pa).s ! (genNum2Aform g n) ; p => ve.s ! p } ; lock_V = <> ; diff --git a/src/romance/AdjectiveRomance.gf b/src/romance/AdjectiveRomance.gf index 5be6fe69..02c13540 100644 --- a/src/romance/AdjectiveRomance.gf +++ b/src/romance/AdjectiveRomance.gf @@ -1,4 +1,4 @@ -incomplete concrete AdjectiveRomance of Adjective = +incomplete concrete AdjectiveRomance of Adjective = CatRomance ** open CommonRomance, ResRomance, Prelude in { flags coding=utf8; lin @@ -8,11 +8,11 @@ incomplete concrete AdjectiveRomance of Adjective = isPre = a.isPre } ; ComparA a np = { - s = \\af => a.s ! Compar ! af ++ conjThan ++ (np.s ! Nom).ton ; + s = \\af => a.s ! Compar ! af ++ conjThan ++ (np.s ! Nom).ton ; isPre = False } ; CAdvAP ad ap np = { - s = \\af => ad.s ++ ap.s ! af ++ ad.p ++ (np.s ! Nom).ton ; + s = \\af => ad.s ++ ap.s ! af ++ ad.p ++ (np.s ! Nom).ton ; isPre = False } ; UseComparA a = { @@ -20,29 +20,26 @@ incomplete concrete AdjectiveRomance of Adjective = isPre = a.isPre } ; AdjOrd ord = { - s = \\af => ord.s ! (case af of { - AF g n => aagr g n ; - _ => aagr Masc Sg ---- - }) ; + s = \\af => ord.s ! aform2aagr af ; ---- isPre = False ---- } ; -- $SuperlA$ belongs to determiner syntax in $Noun$. ComplA2 adj np = { - s = \\af => adj.s ! Posit ! af ++ appCompl adj.c2 np ; + s = \\af => adj.s ! Posit ! af ++ appCompl adj.c2 np ; isPre = False } ; ReflA2 adj = { - s = \\af => + s = \\af => adj.s ! Posit ! af ++ adj.c2.s ++ prepCase adj.c2.c ++ reflPron Sg P3 Nom ; --- agr isPre = False } ; SentAP ap sc = { - s = \\a => ap.s ! a ++ sc.s ! dative ; -- prête à dormir --- mood + s = \\a => ap.s ! a ++ sc.s ! dative ; -- prête à dormir --- mood isPre = False } ; diff --git a/src/romance/CatRomance.gf b/src/romance/CatRomance.gf index 3fb733aa..0c60bc41 100644 --- a/src/romance/CatRomance.gf +++ b/src/romance/CatRomance.gf @@ -134,8 +134,8 @@ incomplete concrete CatRomance of Cat = CommonX - [SC,Pol] NP = \np -> (np.s ! Nom).comp ; Conj = \c -> c.s2 ; - A = \a -> a.s ! Posit ! AF Masc Sg ; - A2 = \a -> a.s ! Posit ! AF Masc Sg ++ a.c2.s ; + A = \a -> a.s ! Posit ! ASg Masc APred ; + A2 = \a -> a.s ! Posit ! ASg Masc APred ++ a.c2.s ; N = \n -> n.s ! Sg ; N2 = \n -> n.s ! Sg ++ n.c2.s ; diff --git a/src/romance/CommonRomance.gf b/src/romance/CommonRomance.gf index 6620875b..e30e0bea 100644 --- a/src/romance/CommonRomance.gf +++ b/src/romance/CommonRomance.gf @@ -30,7 +30,9 @@ param -- Comparative adjectives are moreover inflected in degree -- (which in Romance is usually syntactic, though). - AForm = AF Gender Number | AA ; + AForm = ASg Gender APosition | APl Gender | AA ; + + APosition = AAttr | APred ; -- Gender is not morphologically determined for first and second person pronouns. @@ -49,18 +51,44 @@ oper } ; + -- genderpos2gender : GenderPosition -> {p1:Gender,p2:Number} = \gp -> case gp of { + -- MascSg _ => ; + -- MascPl => ; + -- FemSg => ; + -- FemPl => + -- } ; + + aform2gender : AForm -> Gender = \a -> case a of { - AF g _ => g ; - _ => Masc -- "le plus lentement" + ASg g _ => g ; + APl g => g ; + _ => Masc -- "le plus lentement" } ; aform2number : AForm -> Number = \a -> case a of { - AF _ n => n ; + APl _ => Pl ; _ => Sg -- "le plus lentement" } ; aform2aagr : AForm -> AAgr = \a -> case a of { - AF g n => aagr g n ; - _ => aagr Masc Sg -- "le plus lentement" + ASg g _ => aagr g Sg ; + APl g => aagr g Pl ; + _ => aagr Masc Sg -- "le plus lentement" } ; + aagr2aform : AAgr -> AForm = \gn -> case gn of { + {g=g ; n=Sg} => ASg g APred ; + {g=g ; n=Pl} => APl g + } ; + + genNum2Aform : Gender -> Number -> AForm ; + genNum2Aform g n = case n of { + Sg => ASg g APred ; + Pl => APl g + } ; + + genNumPos2Aform : Gender -> Number -> Bool -> AForm ; + genNumPos2Aform g n isPre = case n of { + Sg => ASg g (if_then_else APosition isPre AAttr APred) ; + Pl => APl g + } ; conjGender : Gender -> Gender -> Gender = \m,n -> case m of { @@ -236,7 +264,7 @@ oper oper mkOrd : {s : Degree => AForm => Str} -> {s : AAgr => Str} ; - mkOrd x = {s = \\ag => x.s ! Posit ! AF ag.g ag.n} ; + mkOrd x = {s = \\ag => x.s ! Posit ! aagr2aform ag } ; -- This is used in Spanish and Italian to bind clitics with preceding verb. diff --git a/src/romance/NounRomance.gf b/src/romance/NounRomance.gf index 465d8e7a..cf54e4ed 100644 --- a/src/romance/NounRomance.gf +++ b/src/romance/NounRomance.gf @@ -101,9 +101,9 @@ incomplete concrete NounRomance of Noun = AdNum adn num = {s = \\a => adn.s ++ num.s ! a ; isNum = num.isNum ; n = num.n} ; - OrdSuperl adj = {s = \\a => adj.s ! Superl ! AF a.g a.n} ; + OrdSuperl adj = {s = \\a => adj.s ! Superl ! genNum2Aform a.g a.n} ; - OrdNumeralSuperl num adj = {s = \\a => num.s ! NOrd a.g a.n ++ adj.s ! Superl ! AF a.g a.n} ; -- la terza più grande + OrdNumeralSuperl num adj = {s = \\a => num.s ! NOrd a.g a.n ++ adj.s ! Superl ! genNum2Aform a.g a.n} ; -- la terza più grande ---- could be discontinuous: la terza città più grande DefArt = { @@ -153,7 +153,7 @@ incomplete concrete NounRomance of Noun = let g = cn.g in { - s = \\n => preOrPost ap.isPre (ap.s ! (AF g n)) (cn.s ! n) ; + s = \\n => preOrPost ap.isPre (ap.s ! genNumPos2Aform g n ap.isPre) (cn.s ! n) ; g = g ; } ; @@ -188,9 +188,9 @@ incomplete concrete NounRomance of Noun = CountNP det np = heavyNPpol np.isNeg {s = \\c => det.s ! np.a.g ! c ++ (np.s ! genitive).ton ; a = np.a ** {n = det.n} } ; - + AdjDAP det ap = { - s = \\g => det.s ! g ++ ap.s ! AF g det.n ; + s = \\g => det.s ! g ++ ap.s ! genNum2Aform g det.n ; n = det.n ; } ; diff --git a/src/romance/PhraseRomance.gf b/src/romance/PhraseRomance.gf index 04a41b9a..933e3ec9 100644 --- a/src/romance/PhraseRomance.gf +++ b/src/romance/PhraseRomance.gf @@ -1,4 +1,4 @@ -incomplete concrete PhraseRomance of Phrase = +incomplete concrete PhraseRomance of Phrase = CatRomance ** open CommonRomance, ResRomance, Prelude in { flags optimize = all_subs ; @@ -18,7 +18,7 @@ incomplete concrete PhraseRomance of Phrase = UttVP vp = {s = infVP vp (agrP3 Fem Sg)} ; --- Agr UttAdv adv = adv ; UttCN n = {s = n.s ! Sg} ; - UttAP ap = {s = ap.s ! AF Masc Sg} ; + UttAP ap = {s = ap.s ! genNum2Aform Masc Sg} ; UttCard n = {s = n.s ! Masc} ; UttInterj i = i ; diff --git a/src/romance/VerbRomance.gf b/src/romance/VerbRomance.gf index a5bfa4e5..d4dba254 100644 --- a/src/romance/VerbRomance.gf +++ b/src/romance/VerbRomance.gf @@ -1,4 +1,4 @@ -incomplete concrete VerbRomance of Verb = +incomplete concrete VerbRomance of Verb = CatRomance ** open Prelude, CommonRomance, ResRomance in { flags optimize=all_subs ; @@ -6,50 +6,50 @@ incomplete concrete VerbRomance of Verb = lin UseV = predV ; - ComplVV v vp = + ComplVV v vp = insertComplement (\\a => prepCase v.c2.c ++ infVP vp a) (predV v) ; ComplVS v s = insertExtrapos (\\b => conjThat ++ s.s ! (v.m ! b)) (predV v) ; ComplVQ v q = insertExtrapos (\\_ => q.s ! QIndir) (predV v) ; - ComplVA v ap = - insertComplement (\\a => let agr = complAgr a in ap.s ! AF agr.g agr.n) (predV v) ; + ComplVA v ap = + insertComplement (\\a => let agr = complAgr a in ap.s ! genNum2Aform agr.g agr.n) (predV v) ; SlashV2a v = mkVPSlash v.c2 (predV v) ; Slash2V3 v np = mkVPSlash v.c3 (insertObject v.c2 np (predV v)) ; Slash3V3 v np = mkVPSlash v.c2 (insertObject v.c3 np (predV v)) ; - SlashV2V v vp = + SlashV2V v vp = mkVPSlash v.c2 - (insertComplement - (\\a => v.c3.s ++ prepCase v.c3.c ++ infVP vp a) - (predV v)) ; + (insertComplement + (\\a => v.c3.s ++ prepCase v.c3.c ++ infVP vp a) + (predV v)) ; - SlashV2S v s = + SlashV2S v s = mkVPSlash v.c2 - (insertExtrapos + (insertExtrapos (\\b => conjThat ++ s.s ! Indic) ---- mood - (predV v)) ; + (predV v)) ; - SlashV2Q v q = + SlashV2Q v q = mkVPSlash v.c2 - (insertExtrapos + (insertExtrapos (\\_ => q.s ! QIndir) - (predV v)) ; + (predV v)) ; {- ---- lincat should be fixed - SlashV2A v ap = + SlashV2A v ap = let af = case v.c3.isDir of { - True => AF np.a.g np.a.n ; -- ... bleues - _ => AF Masc Sg -- il les peint en bleu + True => genNum2Aform np.a.g np.a.n ; -- ... bleues + _ => genNum2Aform Masc Sg -- il les peint en bleu } -} - SlashV2A v ap = - let af = AF Masc Sg + SlashV2A v ap = + let af = genNum2Aform Masc Sg in mkVPSlash v.c2 - (insertComplement + (insertComplement (\\_ => v.c3.s ++ prepCase v.c3.c ++ ap.s ! af) (predV v)) ; @@ -57,33 +57,33 @@ incomplete concrete VerbRomance of Verb = ReflVP v = case v.c2.isDir of { True => insertRefl v ; - False => insertComplement + False => insertComplement (\\a => let agr = verbAgr a in v.c2.s ++ reflPron agr.n agr.p v.c2.c) v } ; - SlashVV v vp = + SlashVV v vp = mkVPSlash vp.c2 (insertComplement (\\a => prepCase v.c2.c ++ infVP vp a) (predV v)) ; - SlashV2VNP v np vps = let obj = np.s ! v.c2.c in { + SlashV2VNP v np vps = let obj = np.s ! v.c2.c in { s = v ; agr = getVPAgr v ; - clit1 = obj.c1 ; - clit2 = obj.c2 ; - clit3 = {s,imp = [] ; hasClit = False} ; ---- shortcut from insertObject, to check AR 20/11/2013 - isNeg = False ; + clit1 = obj.c1 ; + clit2 = obj.c2 ; + clit3 = {s,imp = [] ; hasClit = False} ; ---- shortcut from insertObject, to check AR 20/11/2013 + isNeg = False ; neg = negation ; comp = \\a => v.c2.s ++ obj.comp ++ prepCase v.c3.c ++ infVP vps a ; ext = \\p => [] ; c2 = vps.c2 } ; -{- ---- this takes ages to compile, hence inlined as above AR 20/11/2013 - SlashV2VNP v np vp = +{- ---- this takes ages to compile, hence inlined as above AR 20/11/2013 + SlashV2VNP v np vp = mkVPSlash vp.c2 - (insertComplement - (\\a => prepCase v.c3.c ++ infVP vp a) - (insertObject v.c2 np (predV v))) ; + (insertComplement + (\\a => prepCase v.c3.c ++ infVP vp a) + (insertObject v.c2 np (predV v))) ; -} @@ -91,9 +91,9 @@ incomplete concrete VerbRomance of Verb = UseCopula = predV copula ; - CompAP ap = {s = \\ag => let agr = complAgr ag in ap.s ! AF agr.g agr.n ; cop = serCopula} ; - CompCN cn = { s = \\ag => - let agr = complAgr ag in + CompAP ap = {s = \\ag => let agr = complAgr ag in ap.s ! genNum2Aform agr.g agr.n ; cop = serCopula} ; + CompCN cn = { s = \\ag => + let agr = complAgr ag in artIndef False cn.g agr.n Nom ++ cn.s ! agr.n ; cop = serCopula }; --- RE 7/12/2010 -- AR added indef 2/8/2011 @@ -109,11 +109,10 @@ incomplete concrete VerbRomance of Verb = AdVVPSlash adv vps = vps ** insertAdV adv.s vps ; - PassV2 v = insertComplement + PassV2 v = insertComplement (\\a => let agr = complAgr a in v.s ! VPart agr.g agr.n) (predV auxPassive) ; VPSlashPrep vp prep = vp ** { c2 = {s = prep.s ; c = prep.c ; isDir = False} } ; } - diff --git a/src/spanish/DocumentationSpaFunctor.gf b/src/spanish/DocumentationSpaFunctor.gf index 9a59e626..41734738 100644 --- a/src/spanish/DocumentationSpaFunctor.gf +++ b/src/spanish/DocumentationSpaFunctor.gf @@ -1,6 +1,6 @@ --# -path=.:../abstract:../common -incomplete concrete DocumentationSpaFunctor of Documentation = CatSpa ** open +incomplete concrete DocumentationSpaFunctor of Documentation = CatSpa ** open Terminology, -- the interface to be instantiated ResSpa, CommonRomance, @@ -19,22 +19,22 @@ lincat Definition = {s : Str} ; Document = {s : Str} ; Tag = {s : Str} ; - + {- -} --# notpresent oper heading : N -> Str = \n -> (nounHeading n).s ; - + lin InflectionN, InflectionN3, InflectionN3 = \noun -> { t = "n" ; - s1 = heading1 (heading noun_Category ++ + s1 = heading1 (heading noun_Category ++ case noun.g of { - Masc => "("+heading masculine_Parameter+")" ; + Masc => "("+heading masculine_Parameter+")" ; Fem => "("+heading feminine_Parameter+")" }) ; - s2 = frameTable ( + s2 = frameTable ( tr (th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ tr (td (noun.s ! Sg) ++ td (noun.s ! Pl)) ) @@ -45,8 +45,8 @@ lin s1 = heading1 (nounHeading adjective_Category).s ; s2 = frameTable ( tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++ - tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! (AF Masc Sg)) ++ td (adj.s ! Posit ! (AF Masc Pl))) ++ - tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! (AF Fem Sg)) ++ td (adj.s ! Posit ! (AF Fem Pl))) + tr (th (heading masculine_Parameter) ++ td (adj.s ! Posit ! genNum2Aform Masc Sg) ++ td (adj.s ! Posit ! (genNum2Aform Masc Pl))) ++ + tr (th (heading feminine_Parameter) ++ td (adj.s ! Posit ! genNum2Aform Fem Sg) ++ td (adj.s ! Posit ! (genNum2Aform Fem Pl))) ) } ; @@ -142,23 +142,23 @@ lin MkDocument b i e = ss (i.s1 ++ "

"++b.s++"

" ++ i.s2 ++ paragraph e.s) ; -- explanation appended in a new paragraph MkTag i = ss i.t ; -oper +oper verbExample : CatSpa.Cl -> Str = \cl -> - (S.mkUtt cl).s + (S.mkUtt cl).s ++ ";" ++ (S.mkUtt (S.mkS S.anteriorAnt cl)).s --# notpresent ; - inflVerb : Verb -> Str = \verb -> - let + inflVerb : Verb -> Str = \verb -> + let vfin : CommonRomance.VF -> Str = \f -> - verb.s ! f ; + verb.s ! f ; ttable : TMood -> Str = \tense -> frameTable ( - tr (th "" ++ - th (heading singular_Parameter) ++ - th (heading plural_Parameter)) ++ - tr (th "1.p" ++ + tr (th "" ++ + th (heading singular_Parameter) ++ + th (heading plural_Parameter)) ++ + tr (th "1.p" ++ td (vfin (VFin tense Sg P1)) ++ td (vfin (VFin tense Pl P1))) ++ tr (th "2.p" ++ @@ -171,11 +171,11 @@ oper ttable2 : (Mood -> TMood) -> Str = \f -> frameTable ( - tr (intagAttr "th" "colspan=2" "" ++ - th (heading indicative_Parameter) ++ - th (heading conjunctive_Parameter)) ++ + tr (intagAttr "th" "colspan=2" "" ++ + th (heading indicative_Parameter) ++ + th (heading conjunctive_Parameter)) ++ tr (intagAttr "th" "rowspan=3" (heading singular_Parameter) ++ - th "1.p" ++ + th "1.p" ++ td (vfin (VFin (f Indic) Sg P1)) ++ td (vfin (VFin (f Conjunct) Sg P1))) ++ tr (th "2.p" ++ @@ -183,7 +183,7 @@ oper td (vfin (VFin (f Conjunct) Sg P2))) ++ tr (th "3.p" ++ td (vfin (VFin (f Indic) Sg P3)) ++ - td (vfin (VFin (f Conjunct) Sg P3))) ++ + td (vfin (VFin (f Conjunct) Sg P3))) ++ tr (intagAttr "th" "rowspan=3" (heading plural_Parameter) ++ th "1.p" ++ td (vfin (VFin (f Indic) Pl P1)) ++ @@ -191,7 +191,7 @@ oper tr (th "2.p" ++ td (vfin (VFin (f Indic) Pl P2)) ++ td (vfin (VFin (f Conjunct) Pl P2))) ++ - tr (th "3.p" ++ + tr (th "3.p" ++ td (vfin (VFin (f Indic) Pl P3)) ++ td (vfin (VFin (f Conjunct) Pl P3))) ) ; @@ -210,17 +210,17 @@ oper paragraph (vfin (VInfin False)) ++ heading2 (heading imperative_Parameter) ++ frameTable ( - tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ - tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ + tr (th "sg.2.p" ++ td (vfin (VImper SgP2))) ++ + tr (th "pl.1.p" ++ td (vfin (VImper PlP1))) ++ tr (th "pl.2.p" ++ td (vfin (VImper PlP2))) ) ++ heading2 (heading participle_Parameter) ++ frameTable ( tr (th (heading past_Parameter) ++ td (vfin (VPart Masc Sg))) ++ tr (th (heading present_Parameter) ++ td (vfin VGer)) - ) ; + ) ; {- --# notpresent --} +-} } diff --git a/src/spanish/MorphoSpa.gf b/src/spanish/MorphoSpa.gf index 83620b9c..c942fcb9 100644 --- a/src/spanish/MorphoSpa.gf +++ b/src/spanish/MorphoSpa.gf @@ -57,12 +57,16 @@ oper -- Adjectives are conveniently seen as gender-dependent nouns. -- Here are some patterns. First one that describes the worst case. - mkAdj : (_,_,_,_,_ : Str) -> Adj = \solo,sola,soli,sole,solamente -> + mkAdj : (x1,_,_,_,_,_,x7 : Str) -> Adj = \buen,solo,gran,sola,solos,solas,solamente -> {s = table { - AF Masc n => numForms solo soli ! n ; - AF Fem n => numForms sola sole ! n ; - AA => solamente - } + ASg Masc AAttr => buen ; + ASg Masc APred => solo ; + ASg Fem AAttr => gran ; + ASg Fem APred => sola ; + APl Masc => solos ; + APl Fem => solas ; + AA => solamente + } } ; -- Then the regular and invariant patterns. @@ -71,26 +75,36 @@ oper let sol = Predef.tk 1 solo in - mkAdj solo (sol + "a") (sol + "os") (sol + "as") (sol + "amente") ; + mkAdj solo solo (sol + "a") (sol + "a") + (sol + "os") (sol + "as") (sol + "amente") ; -- masculine and feminine are identical: -- adjectives ending with -e, -a and many but not all that end in a consonant adjUtil : Str -> Str -> Adj = \util,utiles -> - mkAdj util util utiles utiles (util + "mente") ; + mkAdj util util util util + utiles utiles (util + "mente") ; -- adjectives that end in consonant but have different masc and fem forms -- español, hablador ... adjEspanol : Str -> Str -> Adj = \espanol,espanola -> - mkAdj espanol espanola (espanol + "es") (espanol + "as") (espanola + "mente") ; + mkAdj espanol espanol espanola espanola + (espanol + "es") (espanol + "as") (espanola + "mente") ; - adjBlu : Str -> Adj = \blu -> - mkAdj blu blu blu blu blu ; --- + adjBueno : Str -> Adj = \bueno -> + let buen = init bueno in + mkAdj buen bueno (buen + "a") (buen + "a") + (buen + "os") (buen + "as") (buen + "amente") ; + + adjGrande : Str -> Str -> Adj = \gran,grande -> + mkAdj gran grande gran grande + (grande + "s") (grande + "s") (grande + "mente") ; -- francés francesa franceses francesas adjEs : Str -> Adj = \francEs -> let franc : Str = Predef.tk 2 francEs ; frances : Str = franc + "es" ; - in mkAdj francEs (frances + "a") (frances + "es") (frances + "as") (frances + "amente") ; + in mkAdj francEs francEs (frances + "a") (frances + "a") + (frances + "es") (frances + "as") (frances + "amente") ; -- alemán alemana alemanes alemanas @@ -106,11 +120,13 @@ oper "ú" => "u" } ; alemVn : Str = alem + V + "n" ; - in mkAdj alemAn (alemVn + "a") (alemVn + "es") - (alemVn + "as") (alemVn + "amente") ; + in mkAdj alemAn alemAn (alemVn + "a") (alemVn + "a") + (alemVn + "es") (alemVn + "as") (alemVn + "amente") ; mkAdjReg : Str -> Adj = \solo -> case solo of { + "grande" => adjGrande "gran" "grande" ; + "bueno" => adjBueno solo ; _ + "o" => adjSolo solo ; _ + ("e" | "a") => adjUtil solo (solo + "s") ; _ + "és" => adjEs solo ; @@ -153,11 +169,11 @@ oper -- 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 ; + pronForms : Adj -> Gender -> Number -> Str = \tale,g,n -> tale.s ! genNum2Aform g n ; mkOrdinal : A -> Ord = \adj-> lin Ord { - s = \\ag => adj.s ! Posit ! AF ag.g ag.n ; + s = \\ag => adj.s ! Posit ! genNum2Aform ag.g ag.n ; } ; mkQuantifier : (ese,esa,esos,esas : Str) -> Quant = \ese,esa,esos,esas-> diff --git a/src/spanish/ParadigmsSpa.gf b/src/spanish/ParadigmsSpa.gf index 08f3cc3d..b1a73aa4 100644 --- a/src/spanish/ParadigmsSpa.gf +++ b/src/spanish/ParadigmsSpa.gf @@ -4,12 +4,12 @@ -- -- Aarne Ranta 2004 - 2006 -- --- This is an API for the user of the resource grammar +-- This is an API for the user of the resource grammar -- for adding lexical items. It gives functions for forming -- expressions of open categories: nouns, adjectives, verbs. --- +-- -- Closed categories (determiners, pronouns, conjunctions) are --- accessed through the resource syntax API, $Structural.gf$. +-- accessed through the resource syntax API, $Structural.gf$. -- -- The main difference with $MorphoSpa.gf$ is that the types -- referred to are compiled resource grammar types. We have moreover @@ -23,30 +23,30 @@ -- verbs, there is a fairly complete list of irregular verbs in -- [``IrregSpa`` ../../spanish/IrregSpa.gf]. -resource ParadigmsSpa = - open - (Predef=Predef), - Prelude, - MorphoSpa, +resource ParadigmsSpa = + open + (Predef=Predef), + Prelude, + MorphoSpa, BeschSpa, CatSpa in { flags optimize=all ; coding=utf8 ; ---2 Parameters +--2 Parameters -- -- To abstract over gender names, we define the following identifiers. oper - Gender : Type ; + Gender : Type ; masculine : Gender ; feminine : Gender ; -- To abstract over number names, we define the following. - Number : Type ; + Number : Type ; singular : Number ; plural : Number ; @@ -71,7 +71,7 @@ oper mkN : overload { -- The regular function takes the singular form and the gender, --- and computes the plural and the gender by a heuristic. +-- and computes the plural and the gender by a heuristic. -- The heuristic says that the gender is feminine for nouns -- ending with "a" or "z", and masculine for all other words. -- Nouns ending with "a", "o", "e" have the plural with "s", @@ -92,23 +92,23 @@ oper } ; ---3 Compound nouns +--3 Compound nouns -- -- Some nouns are ones where the first part is inflected as a noun but --- the second part is not inflected. e.g. "número de teléfono". +-- the second part is not inflected. e.g. "número de teléfono". -- They could be formed in syntax, but we give a shortcut here since -- they are frequent in lexica. compN : N -> Str -> N ; -- compound, e.g. "número" + "de teléfono" ---3 Relational nouns --- --- Relational nouns ("fille de x") need a case and a preposition. +--3 Relational nouns +-- +-- Relational nouns ("fille de x") need a case and a preposition. mkN2 : N -> Prep -> N2 ; -- relational noun with preposition --- The most common cases are the genitive "de" and the dative "a", +-- The most common cases are the genitive "de" and the dative "a", -- with the empty preposition. deN2 : N -> N2 ; -- relational noun with preposition "de" @@ -126,7 +126,7 @@ oper -- $N3$ are purely lexical categories. But you can use the $AdvCN$ -- and $PrepNP$ constructions to build phrases like this. --- +-- --3 Proper names and noun phrases -- -- Proper names need a string and a gender. @@ -156,10 +156,12 @@ oper -- One-place adjectives compared with "mas" need five forms in the worst -- case (masc and fem singular, masc plural, adverbial). - mkA : (solo,sola,solos,solas,solamente : Str) -> A ; -- worst-case + mkA : (solo,sola,solos,solas,solamente : Str) -> A ; -- almost worst-case, except for buen/bueno gran/grande --- In the worst case, two separate adjectives are given: --- the positive ("bueno"), and the comparative ("mejor"). + mkA : (gran,grande,gran,grande,grandes,grandes,solamente : Str) -> A ; -- worst-case + +-- In the worst case, two separate adjectives are given: +-- the positive ("bueno"), and the comparative ("mejor"). mkA : (bueno : A) -> (mejor : A) -> A ; -- special comparison (default with "mas") @@ -184,7 +186,7 @@ oper --2 Adverbs -- Adverbs are not inflected. Most lexical ones have position --- after the verb. +-- after the verb. mkAdv : Str -> Adv ; @@ -197,7 +199,7 @@ oper mkAdA : Str -> AdA ; mkAdN : Str -> AdN ; - + --2 Verbs @@ -239,7 +241,7 @@ oper --3 Two-place verbs -- -- Two-place verbs need a preposition, except the special case with direct object. --- (transitive verbs). +-- (transitive verbs). mkV2 : overload { mkV2 : Str -> V2 ; -- regular, direct object @@ -258,7 +260,7 @@ oper -- the first one or both can be absent. mkV3 : overload { - mkV3 : V -> V3 ; -- donner (+ accusative + dative) + mkV3 : V -> V3 ; -- donner (+ accusative + dative) mkV3 : V -> Prep -> V3 ; -- placer (+ accusative) + dans mkV3 : V -> Prep -> Prep -> V3 -- parler + dative + genitive } ; @@ -301,9 +303,9 @@ oper mkAV : A -> Prep -> AV ; --% mkA2V : A -> Prep -> Prep -> A2V ; --% --- Notice: categories $AS, A2S, AV, A2V$ are just $A$, +-- Notice: categories $AS, A2S, AV, A2V$ are just $A$, -- and the second argument is given --- as an adverb. Likewise +-- as an adverb. Likewise -- $V0$ is just $V$. V0 : Type ; --% @@ -316,7 +318,7 @@ oper -- The definitions should not bother the user of the API. So they are -- hidden from the document. - Gender = MorphoSpa.Gender ; + Gender = MorphoSpa.Gender ; Number = MorphoSpa.Number ; masculine = Masc ; feminine = Fem ; @@ -354,22 +356,23 @@ oper makeNP x g n = {s = (pn2np (mk2PN x g)).s; a = agrP3 g n ; hasClit = False ; isPol = False ; isNeg = False} ** {lock_NP = <>} ; - mk5A a b c d e = - compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; lock_A = <>} ; + mk7A a b c d e f g = + compADeg {s = \\_ => (mkAdj a b c d e f g).s ; isPre = False ; lock_A = <>} ; - mk2A a b = - compADeg {s = \\_ => (adjEspanol a b).s ; isPre = False ; lock_A = <>} ; + mk5A a b c d e = mk7A a a b b c d e ; + + mk2A a b = compADeg {s = \\_ => (adjEspanol a b).s ; isPre = False ; lock_A = <>} ; regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; - mkADeg a b = - {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; + mkADeg a b = + {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} ; + compADeg a = + {s = table {Posit => a.s ! Posit ; _ => \\f => "más" ++ a.s ! Posit ! f} ; isPre = a.isPre ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -381,7 +384,7 @@ oper regV x = -- cortar actuar cazar guiar pagar sacar - let + let ar = Predef.dp 2 x ; z = Predef.dp 1 (Predef.tk 2 x) ; verb = case ar of { @@ -407,7 +410,7 @@ oper special_ppV ve pa = { s = table { - VPart g n => (adjSolo pa).s ! AF g n ; + VPart g n => (adjSolo pa).s ! genNum2Aform g n ; p => ve.s ! p } ; lock_V = <> ; @@ -417,10 +420,10 @@ oper regAltV x y = case x of { _ + "ar" => verboV (regAlternV x y) ; - _ => verboV (regAlternVEr x y) + _ => verboV (regAlternVEr x y) } ; - + mk2V2 v p = lin V2 (v ** {c2 = p}) ; dirV2 v = mk2V2 v accusative ; @@ -502,17 +505,19 @@ oper -- To form a noun phrase that can also be plural, -- you can use the worst-case function. - makeNP : Str -> Gender -> Number -> NP ; + makeNP : Str -> Gender -> Number -> NP ; mkA = overload { mkA : (util : Str) -> A = regA ; mkA : (espanol,espanola : Str) -> A = mk2A ; mkA : (solo,sola,solos,solas,solamente : Str) -> A = mk5A ; + mkA : (_,_,_,_,_,_,_ : Str) -> A = mk7A ; mkA : (bueno : A) -> (mejor : A) -> A = mkADeg ; - mkA : (blanco : A) -> (hueso : Str) -> A = \blanco,hueso -> blanco ** + mkA : (blanco : A) -> (hueso : Str) -> A = \blanco,hueso -> blanco ** { s = \\x,y => blanco.s ! x ! y ++ hueso } ; } ; + mk7A : (_,_,_,_,_,_,_ : Str) -> A ; mk5A : (solo,sola,solos,solas,solamente : Str) -> A ; mk2A : (espanol,espanola : Str) -> A ; regA : Str -> A ; @@ -538,7 +543,7 @@ oper mkV2 = overload { mkV2 : Str -> V2 = \s -> dirV2 (regV s) ; - mkV2 : V -> V2 = dirV2 ; + mkV2 : V -> V2 = dirV2 ; mkV2 : V -> Prep -> V2 = mk2V2 } ; mk2V2 : V -> Prep -> V2 ; diff --git a/src/spanish/ParseSpa.gf b/src/spanish/ParseSpa.gf index 6ee0a692..7b17e50f 100644 --- a/src/spanish/ParseSpa.gf +++ b/src/spanish/ParseSpa.gf @@ -1,5 +1,5 @@ --# -path=alltenses -concrete ParseSpa of ParseEngAbs = +concrete ParseSpa of ParseEngAbs = TenseSpa, -- CatSpa, NounSpa - [PPartNP], @@ -19,7 +19,7 @@ concrete ParseSpa of ParseEngAbs = VPI, VPIForm, VPIInf, VPIPresPart, ListVPI, VV, MkVPI, BaseVPI, ConsVPI, ConjVPI, ComplVPIVV, ClSlash, RCl, EmptyRelSlash], - DictEngSpa ** + DictEngSpa ** open MorphoSpa, ResSpa, ParadigmsSpa, SyntaxSpa, Prelude in { flags @@ -30,11 +30,11 @@ flags lin -- missing from ExtraSpa; should not really be there either - GenNP np = + GenNP np = let denp = (np.s ! ResSpa.genitive).ton in { - s = \\_,_,_,_ => [] ; + s = \\_,_,_,_ => [] ; sp = \\_,_,_ => denp ; - s2 = denp ; + s2 = denp ; isNeg = False ; } ; @@ -48,7 +48,7 @@ lin another_Quant = mkQuantifier "otro" "otra" "otros" "otras" ; some_Quant = mkQuantifier "algún" "alguna" "algunos" "algunas" ; - anySg_Det = mkDeterminer "algún" "alguna" Sg False ; ---- also meaning "whichever" ? + anySg_Det = mkDeterminer "algún" "alguna" Sg False ; ---- also meaning "whichever" ? each_Det = SyntaxSpa.every_Det ; but_Subj = {s = "pero" ; m = Indic} ; ---- strange to have this as Subj @@ -70,7 +70,7 @@ lin g = cn.g } ; -{- +{- DashCN noun1 noun2 = { s = \\n,c => noun1.s ! Sg ! Nom ++ "-" ++ noun2.s ! n ! c ; g = noun2.g @@ -80,7 +80,7 @@ lin s = \\n,c => v.s ! VPresPart ; g = Neutr } ; - + GerundAP v = { s = \\agr => v.s ! VPresPart ; isPre = True @@ -89,7 +89,8 @@ lin PastPartAP v = { s = table { - AF g n => v.s ! VPart g n ; + ASg g _ => v.s ! VPart g Sg ; + APl g _ => v.s ! VPart g Pl ; _ => v.s ! VPart Masc Sg ---- the adverb form } ; isPre = True @@ -108,11 +109,11 @@ lin infVP v.typ vp ant.a p.p a) (predVc v) ; - SlashVPIV2V v p vpi = insertObjc (\\a => p.s ++ - v.c3 ++ + SlashVPIV2V v p vpi = insertObjc (\\a => p.s ++ + v.c3 ++ vpi.s ! VVAux ! a) (predVc v) ; - ComplVV v a p vp = insertObj (\\agr => a.s ++ p.s ++ + ComplVV v a p vp = insertObj (\\agr => a.s ++ p.s ++ infVP v.typ vp a.a p.p agr) (predVV v) ; -} @@ -126,10 +127,10 @@ lin {- CompQS qs = {s = \\_ => qs.s ! QIndir} ; - CompVP ant p vp = {s = \\a => ant.s ++ p.s ++ + CompVP ant p vp = {s = \\a => ant.s ++ p.s ++ infVP VVInf vp ant.a p.p a} ; - VPSlashVS vs vp = + VPSlashVS vs vp = insertObj (\\a => infVP VVInf vp Simul CPos a) (predV vs) ** {c2 = ""; gapInMiddle = False} ; @@ -147,11 +148,11 @@ lin s = \\c => np1.s ! c ++ "," ++ np2.s ! npNom ; a = np1.a } ; - + AdAdV = cc2 ; - + UttAdV adv = adv; --} +-} } From a009c31606116b286c1712e4917022018730eb59 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Thu, 6 Dec 2018 08:48:49 +0100 Subject: [PATCH 03/10] Update hardcoded links in synopsis intro When new languages are added, the links from chapter 4 onwards need to be incremented --- doc/synopsis/intro.txt | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/synopsis/intro.txt b/doc/synopsis/intro.txt index 4c504243..7e205939 100644 --- a/doc/synopsis/intro.txt +++ b/doc/synopsis/intro.txt @@ -13,18 +13,16 @@ to the relevant source files, which give more information. Some of the files hav not yet been prepared so that the machine generated documentation has the nicest possible format. +% These hardcoded TOC links (chapter 4 onwards) need to be updated as new languages are added. + The main contents are: -- [Chapter 1 #toc2]: categories, with links to the functions for -constructing trees in them. -- [Chapter 2 #toc5]: syntactic construction functions, with cross-links and -examples. -- [Chapter 3 #toc85]: morphological paradigms. -- [Chapter 4 #toc120]: additional libraries. -- [Chapter 5 #toc126]: how to "browse" the library by -loading the grammars into the ``gf`` command editor. -- [Chapter 6 #toc127]: a brief example of how application grammars can -use the resource modules. -- [Detailed table of contents #toc128]. +- [Chapter 1 #toc2]: categories, with links to the functions for constructing trees in them. +- [Chapter 2 #toc5]: syntactic construction functions, with cross-links and examples. +- [Chapter 3 #toc85]: morphological (lexical) paradigms. +- [Chapter 4 #toc121]: additional libraries. +- [Chapter 5 #toc127]: how to "browse" the library by loading the grammars into the ``gf`` command editor. +- [Chapter 6 #toc128]: a brief example of how application grammars can use the resource modules. +- [Detailed table of contents #toc129]. The [RGL Browser http://www.grammaticalframework.org/~john/rgl-browser/] tool allows you to interactively browse through From db2560efe4e8b553d6816bafb363b1d615414c91 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Thu, 6 Dec 2018 12:20:35 +0200 Subject: [PATCH 04/10] (Ara) updates in hamza rules + sound fem. plural noun constructor --- src/arabic/OrthoAra.gf | 33 ++++++++++++++-------- src/arabic/ParadigmsAra.gf | 11 ++++---- src/arabic/ResAra.gf | 58 ++++++++++++++++++++++++++++++++------ 3 files changed, 75 insertions(+), 27 deletions(-) diff --git a/src/arabic/OrthoAra.gf b/src/arabic/OrthoAra.gf index 8bd8f4f3..22a325db 100644 --- a/src/arabic/OrthoAra.gf +++ b/src/arabic/OrthoAra.gf @@ -6,8 +6,16 @@ oper vow : pattern Str = #("َ" | "ِ" | "ُ" | "ً" | "ٍ" | "ٌ") ; + vstar : pattern Str = #("َ"|"ِ"|"ُ"|"ً"|"ٍ"|"ٌ"|"ْ"|"ا"|"ي"|"و") ; -- long or short vowels + + astar : pattern Str = #("َ"|"ً"|"ا") ; -- a: short, nunated or long + istar : pattern Str = #("ِ"|"ي"|"يْ") ; -- i: short, long or long with sukun + ustar : pattern Str = #("ُ"|"و"|"وْ") ; -- u: short, long or long with sukun + weak : pattern Str = #("و"|"ي") ; + hamzaseat : pattern Str = #("أ"|"ؤ"|"ئ") ; + -- "Sun letters": assimilate with def. article sun : pattern Str = #("ت"|"ث"|"د"|"ذ"|"ر"|"ز"|"س"|"ش"|"ص"|"ض"|"ط"|"ظ"|"ل"|"ن") ; @@ -30,19 +38,19 @@ oper rectifyHmz : Str -> Str = \word -> case word of { - l@(""|"ال") + ("أ"|"أَ") + #hamza + "ْ" + tail => l + "آ" + tail; - l@(""|"ال") + ("أ"|"أَ") + #hamza + tail => l + "آ" + tail; + l@(""|"ل"|"ال") + ("أ"|"أَ") + #hamza + "ْ" + tail => l + "آ" + tail; + l@(""|"ل"|"ال") + ("أ"|"أَ") + #hamza + tail => l + "آ" + tail; l@(""|"ال") + #hamza + v@("َ"|"ُ") + tail => l + "أ" + v + tail; l@(""|"ال") + #hamza + v@("ِ") + tail => l + "إ" + v + tail; - head + v1@(#vow|"ْ"|"ا"|"ي"|"و") + head + v1@#vstar + #hamza + v2@(#vow|"ْ") + tail => case v2 of { "ْ" => head + v1 + bHmz v1 v2 + tail ; -- unsure about this /IL _ => head + v1 + bHmz v1 v2 + v2 + tail } ; - head + v1@(#vow|"ْ"|"ا"|"ي"|"و") -- the same but it ends in vowel + head + v1@#vstar -- the same but it ends in vowel + #hamza + v2@(#vow|"ْ") => case v2 of { "ْ" => head + v1 + tHmz v1 ; _ => head + v1 + tHmz v1 + v2 } ; - head + v1@(#vow|"ْ"|"ا"|"ي"|"و") -- the same but it ends without vowel + head + v1@#vstar -- the same but it ends without vowel + #hamza => head + v1 + tHmz v1 ; head + #hamza + tail => head + (bHmz (dp 2 head) (take 2 tail)) + tail; --last head , take 1 tail @@ -57,21 +65,22 @@ oper }; --hamza in middle of word (body) + -- relaxing the pattern matching, so that we can call it from ResAra.sing /IL bHmz : Str -> Str -> Str = \d1,d2 -> case of { - <"ِ",_> | <_,"ِ"> => "ئ"; - <"ُ",_> | <_,"ُ"> => "ؤ"; - <"َ",_> | <_,"َ"> => "أ"; - _ => "ء" + <_+#istar,_> | <_,#istar> => "ئ"; + <_+#ustar,_> | <_,#ustar> => "ؤ"; + <_+"َ" ,_> | <_,"َ"> => "أ"; -- #astar would allow double alif + _ => "ء" }; --hamza carrier sequence tHmz : Str -> Str = \d -> case d of { "ِ" => "ئ"; - "ُ" => "ؤ"; - "َ" => "أ"; - "ْ"|"ا"|"و"|"ي" => "ء" + "ُ" => "ؤ"; + "َ" => "أ"; + _ => "ء" -- long vowels and sukun }; } diff --git a/src/arabic/ParadigmsAra.gf b/src/arabic/ParadigmsAra.gf index 0c5030ef..18637e2d 100644 --- a/src/arabic/ParadigmsAra.gf +++ b/src/arabic/ParadigmsAra.gf @@ -530,12 +530,11 @@ resource ParadigmsAra = open sdfN = \root,sg,gen,spec -> let { kalimaStr = mkWord sg root; - kalimaRaw = sndf kalimaStr; - kalima : NTable = \\n,d,c => case root of { - _ + #hamza + _ - => rectifyHmz (kalimaRaw ! n ! d ! c); - _ => kalimaRaw ! n ! d ! c - }; + kalimaRaw : NTable = case gen of { + Fem => sndf kalimaStr ; + Masc => sgMsndf kalimaStr } ; + kalima : NTable = \\n,d,c => + rectifyHmz (kalimaRaw ! n ! d ! c) } in mkFullN kalima gen spec; sdmN = diff --git a/src/arabic/ResAra.gf b/src/arabic/ResAra.gf index d5198483..08c398bb 100644 --- a/src/arabic/ResAra.gf +++ b/src/arabic/ResAra.gf @@ -75,9 +75,9 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { -- a word, deducing which root consonant is weak mkWeak : Pattern -> Root3 -> Str = \pat,fcl -> case of { - <_,_,("و"|"ي"|"ّ")> => mkDefective pat fcl; - <_,("و"|"ي"),_> => mkHollow pat fcl; - <("و"|"ي"),_,_> => mkAssimilated pat fcl + <_,_,#weak|"ّ"> => mkDefective pat fcl; + <_,#weak,_> => mkHollow pat fcl; + <#weak,_,_> => mkAssimilated pat fcl }; mkBilit : Pattern -> Root2 -> Str = \p,fcl -> @@ -990,12 +990,12 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> APosit Masc n d c => case n of { Sg => indeclN aHmar ! d ! c ; Dl => dual aHmar ! d ! c ; - Pl => sing Humr ! d ! c + Pl => brkPl Humr ! d ! c }; APosit Fem n d c => case n of { Sg => indeclN HamrA' ! d ! c; Dl => dual ((tk 2 HamrA') + "و") ! d ! c; - Pl => sing Humr ! d ! c + Pl => brkPl Humr ! d ! c }; AComp d c => indeclN aHmar ! d ! c }; @@ -1011,7 +1011,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> table { Sg => sing kitAb ; Dl => dual kitAb ; - Pl => sing kutub + Pl => brkPl kutub }; --takes the sound noun in singular and gives the @@ -1024,6 +1024,16 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> Pl => plurF lawHa }; + --takes the sound noun in singular and gives the + --complete noun inflection table of sound feminine plural + sgMsndf : Str -> NTable = + \lawHa -> + table { + Sg => sing lawHa ; + Dl => dual lawHa ; + Pl => singMplurF lawHa + }; + --takes the sound noun in singular and gives the --complete inflection table of sound masculine plural nominals sndm : Str -> NTable = @@ -1034,21 +1044,39 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> Pl => plurM muzAric }; + -- takes a singular or broken plural word and tests the ending to -- determine the declension and gives the corresponding inf table - sing : Str -> State => Case => Str = \word -> + brkPl : Str -> State => Case => Str = \word -> \\s,c => defArt s c (case word of { lemma + "ِيّ" => fixShd word (decNisba ! s ! c) ; lemma + "ِي" => fixShd lemma (dec2sg ! s ! c) ; _ + ("ا"|"ى") => fixShd word (dec3sg ! s ! c) ; - lemma + ("ء"|"أ"|"ئ"|"ؤ") => word + dec1sgNoDoubleAlif ! s ! c ; + lemma + (#hamza|#hamzaseat) + => word + dec1sgNoDoubleAlif ! s ! c ; lemma + "ة" => case s of { Poss => lemma + "ت" + dec1sg ! s ! c ; _ => word + dec1sgNoDoubleAlif ! s ! c } ; - _ => fixShd word (dec1sg ! s ! c) + _ => fixShd word (dec1sg ! s ! c) }) ; + sing : Str -> State => Case => Str = \word -> + \\s,c => case word of { + -- This only applies for singular indefinite + x + y@? + #hamza => defArt s c ( + case of { -- if hamza was last, it's now in the body + => + case y of { + #vstar => word + dec1sgNoDoubleAlif ! Indef ! Acc ; + _ => let an : Str = dec1sg ! Indef ! Acc ; + hmz : Str = bHmz x an ; + in x + y + hmz + an } ; + _ => word + dec1sg ! s ! c }) ; + -- The rest is identical with singulars and broken plurals + _ => brkPl word ! s ! c + } ; + -- takes a singular word and tests the ending to -- determine the declension and gives the corresponding dual inf table @@ -1065,6 +1093,12 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> \kalima -> \\s,c => defArt s c (mkAt kalima) + f_pl ! s ! c ; + -- takes a singular masculine word and gives the corresponding + -- sound plural feminine table + singMplurF : Str -> State => Case => Str = + \ijra' -> + \\s,c => defArt s c (mkAtMasc ijra') + f_pl ! s ! c ; + -- takes a singular word and gives the corresponding sound --plural masculine table. FIXME: consider declension 3 plurM : Str -> State => Case => Str = @@ -1196,6 +1230,12 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> } }; + mkAtMasc : Str -> Str = \x -> + case x of { + y + "ة" => y + "ات"; + y + "ى" => y + "يَات"; -- TODO check does this happen? + _ => x + "ات" + }; mkAt : Str -> Str = \bayDo -> case bayDo of { From 5ef182f4beef436e31fe5dc5177b365fed3e19d2 Mon Sep 17 00:00:00 2001 From: jfschaefer Date: Fri, 7 Dec 2018 17:46:27 +0100 Subject: [PATCH 05/10] (Ger) fix old spellings of irregular verbs --- src/german/IrregGer.gf | 71 ++++++++++++++++++++++++++------------- src/german/IrregGerAbs.gf | 26 +++++++++++++- 2 files changed, 73 insertions(+), 24 deletions(-) diff --git a/src/german/IrregGer.gf b/src/german/IrregGer.gf index ea4263b5..d8ca8c95 100644 --- a/src/german/IrregGer.gf +++ b/src/german/IrregGer.gf @@ -13,9 +13,9 @@ in { lin backen_V = irregV "backen" "bäckt" "backt" "backt" "gebacken" ; lin backen_u_V = irregV "backen" "bäckt" "buk" "buke" "gebacken" ; - lin befehlen_V = irregV "befehlen" "befiehlt" "befahl" "beföhle" "befähle)" ; - lin beginnen_V = irregV "beginnen" "beginnt" "begann" "begönne" "begänne)" ; - lin beißen_V = irregV "beißen" "beißt" "biß" "bisse" "gebissen" ; + lin befehlen_V = irregV "befehlen" "befiehlt" "befahl" "beföhle" "befähle" ; + lin beginnen_V = irregV "beginnen" "beginnt" "begann" "begönne" "begänne" ; + lin beißen_V = irregV "beißen" "beißt" "biss" "bisse" "gebissen" ; lin bergen_V = irregV "bergen" "birgt" "barg" "bärge" "geborgen" ; lin bersten_V = irregV "bersten" "birst" "barst" "bärste" "geborsten" ; lin bewegen_V = irregV "bewegen" "bewegt" "bewog" "bewöge" "bewogen" ; @@ -23,7 +23,7 @@ in { lin bieten_V = irregV "bieten" "bietet" "bot" "böte" "geboten" ; lin binden_V = irregV "binden" "bindet" "band" "bände" "gebunden" ; lin bitten_V = irregV "bitten" "bittet" "bat" "bäte" "gebeten" ; - lin blasen_V = irregV "blasen" "bläst" "blies" "bliese" "geblasen" ; + lin blasen_V = irregV "blasen" "bläst" "blies" "bliese" "geblasen" ; lin bleiben_V = irregV "bleiben" "bleibt" "blieb" "bliebe" "geblieben" ; lin braten_V = irregV "braten" "brät" "briet" "briete" "gebraten" ; lin brechen_V = irregV "brechen" "bricht" "brach" "bräche" "gebrochen" ; @@ -52,8 +52,8 @@ in { lin flechten_V = irregV "flechten" "flicht" "flocht" "flöchte" "geflochten" ; lin fliegen_V = irregV "fliegen" "fliegt" "flog" "flöge" "geflogen" ; lin fliehen_V = irregV "fliehen" "flieht" "floh" "flöhe" "geflohen" ; - lin fließen_V = irregV "fließen" "fließt" "floß" "flösse" "geflossen" ; - lin fressen_V = irregV "fressen" "frißt" "fraß" "fräße" "gefressen" ; + lin fließen_V = irregV "fließen" "fließt" "floss" "flösse" "geflossen" ; + lin fressen_V = irregV "fressen" "frisst" "fraß" "fräße" "gefressen" ; lin frieren_V = irregV "frieren" "friert" "fror" "fröre" "gefroren" ; lin gären_V = irregV "gären" "gärt" "gärte" "göre" "gegoren" ; lin gären_o_V = irregV "gären" "gärt" "gor" "göre" "gegoren" ; @@ -65,11 +65,11 @@ in { lin gelten_V = irregV "gelten" "gilt" "galt" "galte" "gegolten" ; lin gelten_o_V = irregV "gelten" "gilt" "galt" "golte" "gegolten" ; lin genesen_V = irregV "genesen" "genest" "genas" "genäse" "genesen" ; - lin genießen_V = irregV "genießen" "genießt" "genoß" "genösse" "genossen" ; + lin genießen_V = irregV "genießen" "genießt" "genoss" "genösse" "genossen" ; lin geschehen_V = irregV "geschehen" "geschieht" "geschah" "geschehen" "geschähe" ; lin gewinnen_V = irregV "gewinnen" "gewinnt" "gewann" "gewänne" "gewonnen" ; lin gewinnen_o_V = irregV "gewinnen" "gewinnt" "gewann" "gewönne" "gewonnen" ; - lin gießen_V = irregV "gießen" "gießt" "goß" "gösse" "gegossen" ; + lin gießen_V = irregV "gießen" "gießt" "goss" "gösse" "gegossen" ; lin gleichen_V = irregV "gleichen" "gleicht" "glich" "gliche" "geglichen" ; lin gleiten_V = irregV "gleiten" "gleitet" "glitt" "glitte" "geglitten" ; lin glimmen_V = irregV "glimmen" "glimmt" "glomm" "glimmte" "glömme" ; @@ -94,7 +94,7 @@ in { lin kriechen_V = irregV "kriechen" "kriecht" "kroch" "kröche" "gekrochen" ; lin küren_V = irregV "küren" "kürt" "kürte" "kor" "gekürt" ; lin laden_V = irregV "laden" "lädt" "lud" "lüde" "geladen" ; - lin lassen_V = irregV "lassen" "läßt" "ließ" "ließe" "gelassen" ; + lin lassen_V = irregV "lassen" "lässt" "ließ" "ließe" "gelassen" ; lin laufen_V = irregV "laufen" "läuft" "lief" "liefe" "gelaufen" ; lin leiden_V = irregV "leiden" "leidt" "litt" "litte" "gelitten" ; lin leihen_V = irregV "leihen" "leiht" "lieh" "liehe" "geliehen" ; @@ -104,14 +104,15 @@ in { lin mahlen_V = irregV "mahlen" "mahlt" "mahlte" "mahlte" "gemahlen" ; lin meiden_V = irregV "meiden" "meidt" "mied" "miede" "gemieden" ; lin melken_V = irregV "melken" "milkt" "molk" "mölke" "gemolken" ; - lin messen_V = irregV "messen" "mißt" "maß" "mäße" "gemessen" ; - lin mißlingen_V = irregV "mißlingen" "mißlingt" "mißlang" "mißlungen" "mißlänge" ; + lin messen_V = irregV "messen" "misst" "maß" "mäße" "gemessen" ; + lin mißlingen_V = irregV "misslingen" "misslingt" "misslang" "misslungen" "misslänge" ; -- old spelling + lin misslingen_V = irregV "misslingen" "misslingt" "misslang" "misslungen" "misslänge" ; lin mögen_V = lin V (M.mkV "mögen" "mag" "magst" "mag" "mögt" "mög" "mochte" "mochtest" "mochten" "mochtet" "möchte" "gemocht" [] M.VHaben) ; - lin müssen_V = lin V (M.mkV "müssen" "muß" "mußt" "muß" "müßt" "müß" - "mußte" "mußtest" "mußten" "mußtet" - "müßte" "gemußt" [] M.VHaben) ; + lin müssen_V = lin V (M.mkV "müssen" "muss" "musst" "muss" "müsst" "müss" + "musste" "musstest" "mussten" "musstet" + "müsste" "gemusst" [] M.VHaben) ; lin nehmen_V = mk6V "nehmen" "nimmt" "nimm" "nahm" "nähme" "genommen" ; lin nennen_V = irregV "nennen" "nennt" "nannte" "nennte" "genannt" ; lin pfeifen_V = irregV "pfeifen" "pfeift" "pfiff" "pfiffe" "gepfiffen" ; @@ -119,7 +120,7 @@ in { lin quellen_V = irregV "quellen" "quillt" "quoll" "quölle" "gequollen" ; lin raten_V = irregV "raten" "rät" "riet" "riete" "geraten" ; lin reiben_V = irregV "reiben" "reibt" "rieb" "riebe" "gerieben" ; - lin reißen_V = irregV "reißen" "reißt" "riß" "riße" "gerissen" ; + lin reißen_V = irregV "reißen" "reißt" "riss" "risse" "gerissen" ; lin reiten_V = irregV "reiten" "reitet" "ritt" "ritte" "geritten" ; lin rennen_V = irregV "rennen" "rennt" "rannte" "rennte" "gerannt" ; lin riechen_V = irregV "riechen" "riecht" "roch" "röche" "gerochen" ; @@ -132,20 +133,20 @@ in { lin schaffen_V = irregV "schaffen" "schafft" "schuf" "schüfe" "geschaffen" ; lin scheiden_V = irregV "scheiden" "scheidt" "schied" "schiede" "geschieden" ; lin scheinen_V = irregV "scheinen" "scheint" "schien" "schiene" "geschienen" ; - lin scheißen_V = irregV "scheißen" "scheißt" "schiß" "schiße" "geschissen" ; + lin scheißen_V = irregV "scheißen" "scheißt" "schiss" "schisse" "geschissen" ; lin schelten_V = irregV "schelten" "schilt" "schalt" "schölte" "gescholten" ; lin scheren_V = irregV "scheren" "schert" "schor" "schöre" "geschoren" ; lin schieben_V = irregV "schieben" "schiebt" "schob" "schöbe" "geschoben" ; - lin schießen_V = irregV "schießen" "schießt" "schoß" "schösse" "geschossen" ; + lin schießen_V = irregV "schießen" "schießt" "schoss" "schösse" "geschossen" ; lin schinden_V = irregV "schinden" "schindt" "schund" "schunde" "geschunden" ; lin schlafen_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ; lin schlagen_V = irregV "schlagen" "schlägt" "schlug" "schlüge" "geschlagen" ; lin schleichen_V = irregV "schleichen" "schleicht" "schlich" "schliche" "geschlichen" ; lin schleifen_V = irregV "schleifen" "schleift" "schliff" "schliffe" "geschliffen" ; - lin schleißen_V = irregV "schleißen" "schleißt" "schliß" "schliß" "geschlissen" ; - lin schließen_V = irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen" ; + lin schleißen_V = irregV "schleißen" "schleißt" "schliss" "schliss" "geschlissen" ; + lin schließen_V = irregV "schließen" "schließt" "schloss" "schlösse" "geschlossen" ; lin schlingen_V = irregV "schlingen" "schlingt" "schlang" "schlünge" "geschlungen" ; - lin schmeißen_V = irregV "schmeißen" "schmeißt" "schmiß" "schmiße" "geschmissen" ; + lin schmeißen_V = irregV "schmeißen" "schmeißt" "schmiss" "schmisse" "geschmissen" ; lin schmelzen_V = irregV "schmelzen" "schmilzt" "schmolz" "schmölze" "geschmolzen" ; lin schneiden_V = irregV "schneiden" "schneidet" "schnitt" "schnitte" "geschnitten" ; lin schreiben_V = irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben" ; @@ -173,9 +174,9 @@ in { lin speien_V = irregV "speien" "speit" "spie" "spie" "gespien" ; lin spinnen_V = irregV "spinnen" "spinnt" "spann" "spänne" "gesponnen" ; lin spinnen_o_V = irregV "spinnen" "spinnt" "spann" "spönne" "gesponnen" ; - lin spleißen_V = irregV "spleißen" "spleißt" "spliß" "spliße" "gesplissen" ; + lin spleißen_V = irregV "spleißen" "spleißt" "spliss" "splisse" "gesplissen" ; lin sprechen_V = irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen" ; - lin sprießen_V = irregV "sprießen" "sprießt" "sproß" "sprösse" "gesprossen" ; + lin sprießen_V = irregV "sprießen" "sprießt" "spross" "sprösse" "gesprossen" ; lin springen_V = irregV "springen" "springt" "sprang" "spränge" "gesprungen" ; lin stechen_V = irregV "stechen" "sticht" "stach" "stäche" "gestochen" ; lin stehen_V = irregV "stehen" "steht" "stand" "stände" "gestanden" ; @@ -200,7 +201,7 @@ in { "tat" "tatest" "taten" "tatet" "täte" "getan" [] M.VHaben) ; lin verderben_V = irregV "verderben" "verdirbt" "verdarb" "verdarbe" "verdorben" ; - lin vergessen_V = irregV "vergessen" "vergißt" "vergaß" "vergäße" "vergessen" ; + lin vergessen_V = irregV "vergessen" "vergisst" "vergaß" "vergäße" "vergessen" ; lin verlieren_V = irregV "verlieren" "verliert" "verlor" "verlöre" "verloren" ; lin wachsen_V = irregV "wachsen" "wächst" "wuchs" "wüchse" "gewachsen" ; lin wägen_V = irregV "wägen" "wägt" "wog" "woge" "gewogen" ; @@ -229,4 +230,28 @@ in { lin ziehen_V = irregV "ziehen" "zieht" "zog" "zöge" "gezogen" ; lin zwingen_V = irregV "zwingen" "zwingt" "zwang" "zwänge" "gezwungen" ; + +-- old spellings, before the German orthography reform +-- see https://en.wikipedia.org/wiki/German_orthography_reform_of_1996 + + lin beißen_old_V = irregV "beißen" "beißt" "biß" "bisse" "gebissen" ; + lin fließen_old_V = irregV "fließen" "fließt" "floß" "flösse" "geflossen" ; + lin fressen_old_V = irregV "fressen" "frißt" "fraß" "fräße" "gefressen" ; + lin genießen_old_V = irregV "genießen" "genießt" "genoß" "genösse" "genossen" ; + lin gießen_old_V = irregV "gießen" "gießt" "goß" "gösse" "gegossen" ; + lin lassen_old_V = irregV "lassen" "läßt" "ließ" "ließe" "gelassen" ; + lin messen_old_V = irregV "messen" "mißt" "maß" "mäße" "gemessen" ; + lin mißlingen_old_V = irregV "mißlingen" "mißlingt" "mißlang" "mißlungen" "mißlänge" ; + lin müssen_old_V = lin V (M.mkV "müssen" "muß" "mußt" "muß" "müßt" "müß" + "mußte" "mußtest" "mußten" "mußtet" + "müßte" "gemußt" [] M.VHaben) ; + lin reißen_old_V = irregV "reißen" "reißt" "riß" "riße" "gerissen" ; + lin scheißen_old_V = irregV "scheißen" "scheißt" "schiß" "schiße" "geschissen" ; + lin schießen_old_V = irregV "schießen" "schießt" "schoß" "schösse" "geschossen" ; + lin schleißen_old_V = irregV "schleißen" "schleißt" "schliß" "schliß" "geschlissen" ; + lin schließen_old_V = irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen" ; + lin schmeißen_old_V = irregV "schmeißen" "schmeißt" "schmiß" "schmiße" "geschmissen" ; + lin spleißen_old_V = irregV "spleißen" "spleißt" "spliß" "spliße" "gesplissen" ; + lin sprießen_old_V = irregV "sprießen" "sprießt" "sproß" "sprösse" "gesprossen" ; + lin vergessen_old_V = irregV "vergessen" "vergißt" "vergaß" "vergäße" "vergessen" ; } diff --git a/src/german/IrregGerAbs.gf b/src/german/IrregGerAbs.gf index 1e22443f..8f0d7ea1 100644 --- a/src/german/IrregGerAbs.gf +++ b/src/german/IrregGerAbs.gf @@ -89,7 +89,8 @@ abstract IrregGerAbs = Cat ** { fun meiden_V : V ; fun melken_V : V ; fun messen_V : V ; - fun mißlingen_V : V ; + fun mißlingen_V : V ; -- old spelling + fun misslingen_V : V ; fun mögen_V : V ; fun müssen_V : V ; fun nehmen_V : V ; @@ -193,4 +194,27 @@ abstract IrregGerAbs = Cat ** { fun zeihen_V : V ; fun ziehen_V : V ; fun zwingen_V : V ; + + +-- old spellings, before the German orthography reform +-- see https://en.wikipedia.org/wiki/German_orthography_reform_of_1996 + + fun beißen_old_V : V ; + fun fließen_old_V : V ; + fun fressen_old_V : V ; + fun genießen_old_V : V ; + fun gießen_old_V : V ; + fun lassen_old_V : V ; + fun messen_old_V : V ; + fun mißlingen_old_V : V ; + fun müssen_old_V : V ; + fun reißen_old_V : V ; + fun scheißen_old_V : V ; + fun schießen_old_V : V ; + fun schleißen_old_V : V ; + fun schließen_old_V : V ; + fun schmeißen_old_V : V ; + fun spleißen_old_V : V ; + fun sprießen_old_V : V ; + fun vergessen_old_V : V ; } From 2946e6bca19fa3facd095497214c2c61783de8ec Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Sat, 8 Dec 2018 14:07:31 +0100 Subject: [PATCH 06/10] Fix some invalid HTML in synopsis --- doc/synopsis/Makefile | 2 +- doc/synopsis/categories.dot | 2 +- doc/synopsis/template.html | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/doc/synopsis/Makefile b/doc/synopsis/Makefile index 16e2f7d6..b5b46481 100644 --- a/doc/synopsis/Makefile +++ b/doc/synopsis/Makefile @@ -58,7 +58,7 @@ categories.png: categories.dot categories-imagemap.html: categories.dot rm -f $@ - echo '' > $@ + echo 'RGL categories' > $@ dot -Tcmapx $^ >> $@ api-examples.gfs: api-examples.txt MkExx.hs diff --git a/doc/synopsis/categories.dot b/doc/synopsis/categories.dot index 69cf67e7..3bedfb17 100644 --- a/doc/synopsis/categories.dot +++ b/doc/synopsis/categories.dot @@ -1,5 +1,5 @@ -digraph categories { +digraph categoriesmap { size = "11,11" ; node [href="#\N"]; diff --git a/doc/synopsis/template.html b/doc/synopsis/template.html index b5384122..9b076f71 100644 --- a/doc/synopsis/template.html +++ b/doc/synopsis/template.html @@ -43,7 +43,7 @@ $endfor$ $if(title)$
- GF Logo + GF Logo

$title$

$if(subtitle)$ @@ -113,8 +113,7 @@ $endif$
-
Contribute -
+
Contribute
-
-
+
+
$for(include-after)$ $include-after$ From becd4324552f0ba8b044c95169208eb7d1cacca2 Mon Sep 17 00:00:00 2001 From: odanoburu Date: Mon, 10 Dec 2018 14:31:28 +0200 Subject: [PATCH 07/10] (Por) add ImpP3 - do not use nonExist in Lexicon - draft other missing lins in Idiom --- src/portuguese/IdiomPor.gf | 12 ++++++++++-- src/portuguese/LexiconPor.gf | 24 ++++++++++++------------ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/portuguese/IdiomPor.gf b/src/portuguese/IdiomPor.gf index fb14ea63..23df0d99 100644 --- a/src/portuguese/IdiomPor.gf +++ b/src/portuguese/IdiomPor.gf @@ -21,7 +21,7 @@ concrete IdiomPor of Idiom = CatPor ** ExistNP np = mkClause [] True False (agrP3 Masc Sg) (insertComplement (\\_ => (np.s ! Acc).ton) (predV B.haver_V)) ; - + ExistIP ip = { s = \\t,a,p,_ => ip.s ! Nom ++ @@ -52,4 +52,12 @@ concrete IdiomPor of Idiom = CatPor ** mkImperative False P1 vp ! RPos ! Masc ! Pl ; --- fem } ; -} + ImpP3 np vp = { + s = "deixe" ++ (np.s ! Nom).ton ++ infVP vp np.a ; + } ; + + SelfAdvVP vp = vp ; + SelfAdVVP vp = vp ; + SelfNP np = np ; + +} ; diff --git a/src/portuguese/LexiconPor.gf b/src/portuguese/LexiconPor.gf index 699a8fa6..2d7685e8 100644 --- a/src/portuguese/LexiconPor.gf +++ b/src/portuguese/LexiconPor.gf @@ -82,7 +82,7 @@ lin belly_N = mkN "barriga" ; bike_N = mkN "bicicleta" ; bird_N = mkN "pássaro" ; - blood_N = mkN "sangue" nonExist ; + blood_N = mkN "sangue" "sangues" ; boat_N = mkN "bote" ; bone_N = mkN "osso" ; book_N = mkN "livro" ; @@ -113,7 +113,7 @@ lin doctor_N = mkN "médico" ; -- médica dog_N = mkN "cachorro" ; -- cadela door_N = mkN "porta" ; - dust_N = mkN "poeira" nonExist ; + dust_N = mkN "poeira" "poeiras" ; ear_N = mkN "orelha" ; earth_N = mkN "terra" ; egg_N = mkN "ovo" ; @@ -125,7 +125,7 @@ lin fingernail_N = mkN "unha" ; fire_N = mkN "fogo" ; fish_N = mkN "peixe" ; - floor_N = mkN "chão" nonExist ; -- piso + floor_N = mkN "piso" "pisos" ; -- piso flower_N = mkN "flor" feminine ; fog_N = mkN "névoa" ; foot_N = mkN "pé" ; @@ -136,11 +136,11 @@ lin garden_N = mkN "jardim" ; girl_N = mkN "menina" ; glove_N = mkN "luva" ; - gold_N = mkN "ouro" nonExist ; + gold_N = mkN "ouro" "ouros" ; grammar_N = mkN "gramática" ; - grass_N = mkN "grama" nonExist ; + grass_N = mkN "grama" "gramas" ; guts_N = mkN "tripa" ; - hair_N = mkN "cabelo" nonExist ; + hair_N = mkN "cabelo" "cabelos" ; hand_N = mkN "mão" "mãos" feminine ; harbour_N = mkN "porto" ; hat_N = mkN "chapéu" ; @@ -160,7 +160,7 @@ lin lamp_N = mkN "lâmpada" ; language_N = mkN "linguagem" ; leaf_N = mkN "folha" ; - leather_N = mkN "couro" nonExist ; + leather_N = mkN "couro" "couros" ; leg_N = mkN "perna" ; liver_N = mkN "fígado" ; louse_N = mkN "piolho" ; @@ -203,7 +203,7 @@ lin rubber_N = mkN "borracha" ; rule_N = mkN "regra" ; salt_N = mkN "sal" ; - sand_N = mkN "areia" nonExist ; + sand_N = mkN "areia" "areias" ; school_N = mkN "escola" ; science_N = mkN "ciência" ; sea_N = mkN "mar" ; @@ -213,17 +213,17 @@ lin shirt_N = mkN "camisa" ; shoe_N = mkN "sapato" ; shop_N = mkN "loja" ; - silver_N = mkN "prata" nonExist ; + silver_N = mkN "prata" "pratas" ; sister_N = mkN "irmã" ; skin_N = mkN "pele" feminine ; sky_N = mkN "céu" ; - smoke_N = mkN "fumaça" nonExist ; + smoke_N = mkN "fumaça" "fumaças" ; snake_N = mkN "cobra" ; - snow_N = mkN "neve" nonExist feminine ; + snow_N = mkN "neve" "neves" feminine ; sock_N = mkN "meia" ; song_N = mkN "canção" "canções" feminine ; star_N = mkN "estrela" ; - steel_N = mkN "aço" nonExist ; + steel_N = mkN "aço" "aços" ; stick_N = mkN "bastão" "bastões" ; stone_N = mkN "pedra" ; stove_N = mkN "forno" ; From ffaa701197751687068b14988a9c7fce9e73ef1b Mon Sep 17 00:00:00 2001 From: odanoburu Date: Mon, 10 Dec 2018 19:46:21 +0200 Subject: [PATCH 08/10] (Romance) add copTyp to adjectives - so that one can force the use of a copula verb - before this, a sentence like "he was ready when I saw him" would be translated as "ele era pronto quando eu o via" in Portuguese, instead of using the estar copula --- src/catalan/LexiconCat.gf | 4 +-- src/catalan/ParadigmsCat.gf | 20 ++++++++---- src/french/ParadigmsFre.gf | 22 ++++++++----- src/italian/ParadigmsIta.gf | 19 +++++++---- src/portuguese/ExtendPor.gf | 9 ++++-- src/portuguese/LexiconPor.gf | 4 +-- src/portuguese/ParadigmsPor.gf | 53 ++++++++++++++++++++----------- src/romance/AdjectiveRomance.gf | 35 +++++++++++++------- src/romance/CatRomance.gf | 4 +-- src/romance/ConjunctionRomance.gf | 9 +++--- src/spanish/LexiconSpa.gf | 3 +- src/spanish/ParadigmsSpa.gf | 20 ++++++++---- 12 files changed, 128 insertions(+), 74 deletions(-) diff --git a/src/catalan/LexiconCat.gf b/src/catalan/LexiconCat.gf index 81efb50d..df72a7c1 100644 --- a/src/catalan/LexiconCat.gf +++ b/src/catalan/LexiconCat.gf @@ -1,7 +1,7 @@ --# -path=.:../romance:../common:../abstract:../../prelude concrete LexiconCat of Lexicon = CatCat ** open - (M=MorphoCat), ParadigmsCat, BeschCat in { + (M=MorphoCat), ParadigmsCat, BeschCat, (D = DiffCat) in { flags coding=utf8 ; @@ -361,7 +361,7 @@ lin language_N = mkN "llengua" ; -- llengües rule_N = regFN "regla" ; question_N = regFN "pregunta" ; - ready_A = regA "preparat" ; + ready_A = adjCopula (regA "preparat") D.estarCopula ; reason_N = regFN "raó" ; uncertain_A = regA "incert" ; diff --git a/src/catalan/ParadigmsCat.gf b/src/catalan/ParadigmsCat.gf index 63f13096..c65a8af4 100644 --- a/src/catalan/ParadigmsCat.gf +++ b/src/catalan/ParadigmsCat.gf @@ -154,7 +154,10 @@ oper -- In the worst case, two separate adjectives are given: -- the positive ("bo"), and the comparative ("millor"). - mkA : (bo : A) -> (millor : A) -> A -- special comparison (default with "mas") + mkA : (bo : A) -> (millor : A) -> A ; -- special comparison (default with "mas") + + mkA : A -> CopulaType -> A -- force copula type + } ; -- The functions above create postfix adjectives. To switch @@ -164,6 +167,7 @@ oper -- JS: What about vi bo -> bon vi ? prefixA : A -> A ; -- adjective before noun (default: after) + adjCopula : A -> CopulaType -> A ; -- force copula type --3 Two-place adjectives @@ -324,23 +328,23 @@ oper makeNP x g n = {s = (pn2np (mk2PN x g)).s; a = agrP3 g n ; hasClit = False ; isPol = False ; isNeg = False} ** {lock_NP = <>} ; mk5A a b c d e = - compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; lock_A = <>} ; - mk2A a b = compADeg {s = \\_ => (mkAdj2Reg a b).s ; isPre = False ; lock_A = <>} ; - regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; + compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + mk2A a b = compADeg {s = \\_ => (mkAdj2Reg a b).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; prefA = overload { prefA : A -> A = \a -> a ** {isPre = True} ; prefA : Str -> Str -> A = \bo,bon -> - compADeg (lin A {s = \\_ => (adjBo bo bon).s ; isPre = True}) ; + compADeg (lin A {s = \\_ => (adjBo bo bon).s ; isPre = True ; copTyp = serCopula}) ; } ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; mkADeg a b = {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; - isPre = a.isPre ; lock_A = <>} ; + isPre = a.isPre ; copTyp = serCopula ; lock_A = <>} ; compADeg a = {s = table {Posit => a.s ! Posit ; _ => \\f => "més" ++ a.s ! Posit ! f} ; - isPre = a.isPre ; + isPre = a.isPre ; copTyp = a.copTyp ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -500,6 +504,7 @@ oper mkA : (lleig,lletja : Str) -> A = mk2A ; mkA : (fort,forta,forts,fortes,fortament : Str) -> A = mk5A ; mkA : (bo : A) -> (millor : A) -> A = mkADeg ; + mkA : A -> CopulaType -> A = adjCopula ; } ; mk5A : (fort,forta,forts,fortes,fortament : Str) -> A ; @@ -513,6 +518,7 @@ oper prefA : (bo,bon : Str) -> A -- predicative masc, attributive masc } ; prefixA = prefA ; + adjCopula a cop = a ** {copTyp = cop} ; mkV = overload { mkV : (cantar : Str) -> V = \x -> verbV (regV x) ; diff --git a/src/french/ParadigmsFre.gf b/src/french/ParadigmsFre.gf index 551425d6..8cd60c58 100644 --- a/src/french/ParadigmsFre.gf +++ b/src/french/ParadigmsFre.gf @@ -171,7 +171,10 @@ oper -- "bon-meilleur"), the positive and comparative can be given as separate -- adjectives. - mkA : A -> A -> A -- irregular comparison, e.g. bon-meilleur + mkA : A -> A -> A ; -- irregular comparison, e.g. bon-meilleur + + mkA : A -> CopulaType -> A -- force copula type + } ; -- The functions create by default postfix adjectives. To switch @@ -391,9 +394,10 @@ oper } ; mk4A a b c d = mk5A a a b c d ; - mk5A a b c d e = compADeg {s = \\_ => (mkAdj' a b c d e).s ; isPre = False ; lock_A = <>} ; - regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; + mk5A a b c d e = compADeg {s = \\_ => (mkAdj' a b c d e).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + prefA a = {s = a.s ; isPre = True ; copTyp = a.copTyp ; lock_A = <>} ; + adjCopula a cop = a ** {copTyp = cop} ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; @@ -403,10 +407,11 @@ oper mkA : (banal,banale,banaux : Str) -> A = \sec,seche,secs -> mk4A sec seche secs (seche + "ment") ; mkA : (banal,banale,banaux,banalement : Str) -> A = mk4A ; mkA : (vieux,vieil,vieille,vieuxs,vieuxment : Str) -> A = mk5A ; - mkA : A -> A -> A = mkADeg + mkA : A -> A -> A = mkADeg ; + mkA : A -> CopulaType -> A = adjCopula ; }; - prefixA a = {s = a.s ; isPre = True ; lock_A = <>} ; + prefixA a = {s = a.s ; isPre = True ; copTyp = a.copTyp ; lock_A = <>} ; mkAdv x = ss x ** {lock_Adv = <>} ; mkAdV x = ss x ** {lock_AdV = <>} ; @@ -479,14 +484,15 @@ oper mk5A : (vieux,vieil,vieille,vieuxs,vieuxment : Str) -> A ; -- worst-case adjetive prefA : A -> A ; + adjCopula : A -> CopulaType -> A ; mkADeg a b = - {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; isPre = a.isPre ; lock_A = <>} ; + {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; isPre = a.isPre ; copTyp = a.copTyp ; lock_A = <>} ; compADeg a = {s = table {Posit => a.s ! Posit ; _ => \\f => "plus" ++ a.s ! Posit ! f} ; isPre = a.isPre ; + copTyp = a.copTyp ; lock_A = <>} ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; mkV = overload { mkV : Str -> V = regV ; diff --git a/src/italian/ParadigmsIta.gf b/src/italian/ParadigmsIta.gf index 15193fba..95191082 100644 --- a/src/italian/ParadigmsIta.gf +++ b/src/italian/ParadigmsIta.gf @@ -165,7 +165,9 @@ oper -- With irregular comparison, there are as it were two adjectives: -- the positive ("buono") and the comparative ("migliore"). - mkA : A -> A -> A -- special comparison, e.g. buono - migliore + mkA : A -> A -> A ; -- special comparison, e.g. buono - migliore + + mkA : A -> CopulaType -> A -- force copula type } ; -- All the functions above create postfix adjectives. To switch @@ -367,18 +369,19 @@ oper makeNP x g n = {s = (pn2np (mk2PN x g)).s; a = agrP3 g n ; hasClit = False ; isPol = False ; isNeg = False} ** {lock_NP = <>} ; mk5A a b c d e = - compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; lock_A = <>} ; - regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; + compADeg {s = \\_ => (mkAdj a b c d e).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + prefA a = {s = a.s ; isPre = True ; copTyp = a.copTyp ; lock_A = <>} ; + adjCopula a cop = a ** {copTyp = cop} ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; mkADeg a b = {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; - isPre = a.isPre ; lock_A = <>} ; + isPre = a.isPre ; copTyp = serCopula ; lock_A = <>} ; compADeg a = {s = table {Posit => a.s ! Posit ; _ => \\f => "più" ++ a.s ! Posit ! f} ; - isPre = a.isPre ; + isPre = a.isPre ; copTyp = a.copTyp ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -510,11 +513,13 @@ oper mkA = overload { mkA : (bianco : Str) -> A = regA ; mkA : (solo,sola,soli,sole, solamente : Str) -> A = mk5A ; - mkA : A -> A -> A = mkADeg + mkA : A -> A -> A = mkADeg ; + mkA : A -> CopulaType -> A = adjCopula ; } ; mk5A : (solo,sola,soli,sole, solamente : Str) -> A ; regA : Str -> A ; prefA : A -> A ; + adjCopula : A -> CopulaType -> A ; mkADeg : A -> A -> A ; compADeg : A -> A ; regADeg : Str -> A ; diff --git a/src/portuguese/ExtendPor.gf b/src/portuguese/ExtendPor.gf index e06683e4..09e106b6 100644 --- a/src/portuguese/ExtendPor.gf +++ b/src/portuguese/ExtendPor.gf @@ -142,7 +142,8 @@ concrete ExtendPor of Extend = lin PresPartAP vp = { s = \\af => gerVP vp (aform2aagr af ** {p = P3}) ; - isPre = False + isPre = False ; + copTyp = serCopula } ; PastPartAP vps = pastPartAP vps [] ; @@ -178,7 +179,8 @@ concrete ExtendPor of Extend = pastPartAP : VPSlash -> Str -> AP ; pastPartAP vps agent = lin AP { s = \\af => vps.comp ! (aform2aagr af ** {p = P3}) ++ vps.s.s ! VPart (aform2gender af) (aform2number af) ++ agent ; - isPre = False + isPre = False ; + copTyp = serCopula } ; passVPSlash : VPSlash -> Str -> VP ; @@ -203,7 +205,8 @@ concrete ExtendPor of Extend = s = \\af => case (aform2aagr af) of { {n = n} => adj.s ! Posit ! (genNum2Aform noun.g n) ++ "de" ++ noun.s ! n } ; - isPre = adj.isPre + isPre = adj.isPre ; + copTyp = adj.copTyp } ; GerundCN vp = { diff --git a/src/portuguese/LexiconPor.gf b/src/portuguese/LexiconPor.gf index 699a8fa6..1f155fd1 100644 --- a/src/portuguese/LexiconPor.gf +++ b/src/portuguese/LexiconPor.gf @@ -1,7 +1,7 @@ --# -path=.:../romance:../common:../abstract:../../prelude concrete LexiconPor of Lexicon = CatPor ** open - (M=MorphoPor), ParadigmsPor, BeschPor, Prelude in { + (M=MorphoPor), ParadigmsPor, BeschPor, Prelude, (D = DiffPor) in { flags optimize=values ; @@ -39,7 +39,7 @@ lin near_A = mkA "perto" ; new_A = prefA (mkA "novo") ; old_A = prefA (mkA "velho") ; - ready_A = mkA "pronto" ; + ready_A = adjCopula (mkA "pronto") D.estarCopula ; red_A = mkA "vermelho" ; rotten_A = mkA "podre" ; round_A = mkA "redondo" ; diff --git a/src/portuguese/ParadigmsPor.gf b/src/portuguese/ParadigmsPor.gf index 88c9e38b..f8b29945 100644 --- a/src/portuguese/ParadigmsPor.gf +++ b/src/portuguese/ParadigmsPor.gf @@ -184,10 +184,14 @@ oper --2 Adjectives compADeg : A -> A ; - compADeg a = {s = table {Posit => a.s ! Posit ; - _ => \\f => "mais" ++ - a.s ! Posit ! f} ; - isPre = a.isPre ; lock_A = <>} ; + compADeg a = lin A { + s = table { + Posit => a.s ! Posit ; + _ => \\f => "mais" ++ a.s ! Posit ! f + } ; + isPre = a.isPre ; + copTyp = a.copTyp + } ; {- superlADeg : A -> A ; superlADeg a = {s = table {Posit => a.s ! Posit ; @@ -200,24 +204,32 @@ oper -- regADeg a = compADeg (regA a) ; regA : Str -> A ; - regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; - lock_A = <>} ; + regA a = compADeg (lin A {s = \\_ => (mkAdjReg a).s ; isPre = False ; copTyp = serCopula}) ; mk2A : (único,unicamente : Str) -> A ; mk2A adj adv = compADeg {s = \\_ => (mkAdj2 adj adv).s ; isPre = False ; + copTyp = serCopula ; lock_A = <>} ; mk5A : (preto,preta,pretos,pretas,pretamente : Str) -> A ; mk5A a b c d e = compADeg {s = \\_ => (mkAdj a b c d e).s ; - isPre = False ; lock_A = <>} ; + isPre = False ; copTyp = serCopula ; + lock_A = <>} ; + + adjCopula : A -> CopulaType -> A ; + adjCopula a cop = a ** {copTyp = cop} ; mkADeg : A -> A -> A ; - mkADeg a b = {s = table {Posit => a.s ! Posit ; - _ => b.s ! Posit --- Compar => b.s ! Posit ; --- Superl => "o" ++ b.s ! Posit ; - } ; - isPre = a.isPre ; lock_A = <>} ; + mkADeg a b = lin A { + s = table { + Posit => a.s ! Posit ; + _ => b.s ! Posit + -- Compar => b.s ! Posit ; + -- Superl => "o" ++ b.s ! Posit ; + } ; + isPre = a.isPre ; + copTyp = a.copTyp + } ; mkNonInflectA : A -> Str -> A ; mkNonInflectA = \blanco,hueso -> blanco ** {s = \\x,y => blanco.s ! x ! y ++ hueso } ; @@ -245,7 +257,10 @@ oper = mkADeg ; mkA : (blanco : A) -> (hueso : Str) -> A -- noninflecting component after the adjective - = mkNonInflectA ; + = mkNonInflectA ; + + mkA : A -> CopulaType -> A -- force copula type + = adjCopula ; } ; -- The functions above create postfix adjectives. To switch them to @@ -256,7 +271,7 @@ oper prefixA = prefA ; prefA : A -> A ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; + prefA a = lin A {s = a.s ; isPre = True ; copTyp = a.copTyp} ; --3 Two-place adjectives -- @@ -320,7 +335,7 @@ oper "or" | "ôr" => pôr_Besch ; _ => comprar_Besch -- hole } - in verboV (paradigm v) ; + in lin V (verboV (paradigm v)) ; mkV = overload { --- [ ] update @@ -345,8 +360,8 @@ oper -- "Bescherelle" book. To use them in the category $V$, wrap them with -- the function - mkV : Verbum -> V = -- import verb constructed with BeschPor - verboV ; + mkV : Verbum -> V = \v -> -- import verb constructed with BeschPor + lin V (verboV v) ; -- particle verb mkV : V -> Str -> V = @@ -516,6 +531,6 @@ oper isPol = False ; isNeg = False} ** {lock_NP = <>} ; - reflVerboV : Verbum -> V = \ve -> reflV (verboV ve) ; + reflVerboV : Verbum -> V = \ve -> reflV (lin V (verboV ve)) ; } ; diff --git a/src/romance/AdjectiveRomance.gf b/src/romance/AdjectiveRomance.gf index 02c13540..70030075 100644 --- a/src/romance/AdjectiveRomance.gf +++ b/src/romance/AdjectiveRomance.gf @@ -3,59 +3,70 @@ incomplete concrete AdjectiveRomance of Adjective = flags coding=utf8; lin - PositA a = { + PositA a = { s = a.s ! Posit ; - isPre = a.isPre + isPre = a.isPre ; + copTyp = a.copTyp } ; ComparA a np = { s = \\af => a.s ! Compar ! af ++ conjThan ++ (np.s ! Nom).ton ; - isPre = False + isPre = False ; + copTyp = a.copTyp } ; CAdvAP ad ap np = { s = \\af => ad.s ++ ap.s ! af ++ ad.p ++ (np.s ! Nom).ton ; - isPre = False + isPre = False ; + copTyp = ap.copTyp } ; UseComparA a = { s = \\af => a.s ! Compar ! af ; - isPre = a.isPre + isPre = a.isPre ; + copTyp = a.copTyp } ; AdjOrd ord = { s = \\af => ord.s ! aform2aagr af ; ---- - isPre = False ---- + isPre = False ; ---- + copTyp = serCopula } ; -- $SuperlA$ belongs to determiner syntax in $Noun$. ComplA2 adj np = { s = \\af => adj.s ! Posit ! af ++ appCompl adj.c2 np ; - isPre = False + isPre = False ; + copTyp = serCopula } ; ReflA2 adj = { s = \\af => adj.s ! Posit ! af ++ adj.c2.s ++ prepCase adj.c2.c ++ reflPron Sg P3 Nom ; --- agr - isPre = False + isPre = False ; + copTyp = serCopula } ; SentAP ap sc = { s = \\a => ap.s ! a ++ sc.s ! dative ; -- prête à dormir --- mood - isPre = False + isPre = False ; + copTyp = ap.copTyp } ; AdAP ada ap = { s = \\a => ada.s ++ ap.s ! a ; - isPre = ap.isPre + isPre = ap.isPre ; + copTyp = ap.copTyp } ; UseA2 a = { s = a.s ! Posit ; - isPre = False ---- A2 has no isPre + isPre = False ; ---- A2 has no isPre + copTyp = serCopula ---- A2 has no copTyp (yet) } ; AdvAP ap adv = { s = \\a => ap.s ! a ++ adv.s ; - isPre = False + isPre = False ; + copTyp = ap.copTyp } ; diff --git a/src/romance/CatRomance.gf b/src/romance/CatRomance.gf index 0c60bc41..93e5e8c4 100644 --- a/src/romance/CatRomance.gf +++ b/src/romance/CatRomance.gf @@ -55,7 +55,7 @@ incomplete concrete CatRomance of Cat = CommonX - [SC,Pol] -- Adjective - AP = {s : AForm => Str ; isPre : Bool} ; + AP = {s : AForm => Str ; isPre : Bool ; copTyp : CopulaType} ; -- Noun @@ -105,7 +105,7 @@ incomplete concrete CatRomance of Cat = CommonX - [SC,Pol] V3, V2A, V2V = Verb ** {c2,c3 : Compl} ; VS = Verb ** {m : RPolarity => Mood} ; - A = {s : Degree => AForm => Str ; isPre : Bool} ; + A = {s : Degree => AForm => Str ; isPre : Bool ; copTyp : CopulaType} ; A2 = {s : Degree => AForm => Str ; c2 : Compl} ; N = Noun ; diff --git a/src/romance/ConjunctionRomance.gf b/src/romance/ConjunctionRomance.gf index 84c90879..8917a0de 100644 --- a/src/romance/ConjunctionRomance.gf +++ b/src/romance/ConjunctionRomance.gf @@ -14,7 +14,8 @@ incomplete concrete ConjunctionRomance of Conjunction = hasClit = False ; isNeg = ss.isNeg }) ; ConjAP conj ss = conjunctDistrTable AForm conj ss ** { - isPre = ss.isPre + isPre = ss.isPre ; + copTyp = ss.copTyp } ; ConjRS conj ss = conjunctDistrTable2 Mood Agr conj ss ** { c = ss.c @@ -40,8 +41,8 @@ incomplete concrete ConjunctionRomance of Conjunction = s2 = \\c => xs.s2 ! c ; ----e (conjunctCase c) ; a = conjAgr x.a xs.a ; isNeg = orB x.isNeg xs.isNeg } ; - BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre} ; - ConsAP xs x = consrTable AForm comma xs x ** {isPre = andB xs.isPre x.isPre} ; + BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre ; copTyp = y.copTyp} ; + ConsAP x xs = consrTable AForm comma x xs ** {isPre = andB x.isPre xs.isPre ; copTyp = xs.copTyp} ; BaseRS x y = twoTable2 Mood Agr x y ** {c = y.c} ; ConsRS xs x = consrTable2 Mood Agr comma xs x ** {c = xs.c} ; BaseIAdv = twoSS ; @@ -55,7 +56,7 @@ incomplete concrete ConjunctionRomance of Conjunction = [AdV] = {s1,s2 : Str} ; [IAdv] = {s1,s2 : Str} ; [NP] = {s1,s2 : Case => Str ; a : Agr ; isNeg : Bool} ; - [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; + [AP] = {s1,s2 : AForm => Str ; isPre : Bool ; copTyp : CopulaType} ; [RS] = {s1,s2 : Mood => Agr => Str ; c : Case} ; [CN] = {s1,s2 : Number => Str ; g : Gender} ; diff --git a/src/spanish/LexiconSpa.gf b/src/spanish/LexiconSpa.gf index 5c3a2a47..cde3c1a4 100644 --- a/src/spanish/LexiconSpa.gf +++ b/src/spanish/LexiconSpa.gf @@ -1,7 +1,7 @@ --# -path=.:../romance:../common:../abstract:../../prelude concrete LexiconSpa of Lexicon = CatSpa ** open - (M=MorphoSpa), ParadigmsSpa, BeschSpa in { + (M=MorphoSpa), ParadigmsSpa, (D = DiffSpa), BeschSpa in { flags coding=utf8 ; @@ -233,6 +233,7 @@ lin correct_A = regA "correcto" ; dry_A = regA "seco" ; dull_A = regA "desafilado" ; + ready_A = adjCopula (mkA "listo") D.estarCopula ; full_A = regA "lleno" ; heavy_A = regA "pesado" ; near_A = regA "cercano" ; diff --git a/src/spanish/ParadigmsSpa.gf b/src/spanish/ParadigmsSpa.gf index b1a73aa4..a9720d76 100644 --- a/src/spanish/ParadigmsSpa.gf +++ b/src/spanish/ParadigmsSpa.gf @@ -165,7 +165,9 @@ oper mkA : (bueno : A) -> (mejor : A) -> A ; -- special comparison (default with "mas") - mkA : (blanco : A) -> (hueso : Str) -> A -- noninflecting component after the adjective + mkA : (blanco : A) -> (hueso : Str) -> A ; -- noninflecting component after the adjective + + mkA : A -> CopulaType -> A -- force copula type } ; -- The functions above create postfix adjectives. To switch @@ -357,23 +359,24 @@ oper makeNP x g n = {s = (pn2np (mk2PN x g)).s; a = agrP3 g n ; hasClit = False ; isPol = False ; isNeg = False} ** {lock_NP = <>} ; mk7A a b c d e f g = - compADeg {s = \\_ => (mkAdj a b c d e f g).s ; isPre = False ; lock_A = <>} ; + compADeg {s = \\_ => (mkAdj a b c d e f g).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; mk5A a b c d e = mk7A a a b b c d e ; - mk2A a b = compADeg {s = \\_ => (adjEspanol a b).s ; isPre = False ; lock_A = <>} ; + mk2A a b = compADeg {s = \\_ => (adjEspanol a b).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; - regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; lock_A = <>} ; - prefA a = {s = a.s ; isPre = True ; lock_A = <>} ; + regA a = compADeg {s = \\_ => (mkAdjReg a).s ; isPre = False ; copTyp = serCopula ; lock_A = <>} ; + adjCopula a cop = a ** {copTyp = cop} ; + prefA a = {s = a.s ; isPre = True ; copTyp = a.copTyp ; lock_A = <>} ; mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ; mkADeg a b = {s = table {Posit => a.s ! Posit ; _ => b.s ! Posit} ; - isPre = a.isPre ; lock_A = <>} ; + isPre = a.isPre ; copTyp = a.copTyp ; lock_A = <>} ; compADeg a = {s = table {Posit => a.s ! Posit ; _ => \\f => "más" ++ a.s ! Posit ! f} ; - isPre = a.isPre ; + isPre = a.isPre ; copTyp = a.copTyp ; lock_A = <>} ; regADeg a = compADeg (regA a) ; @@ -515,12 +518,15 @@ oper mkA : (bueno : A) -> (mejor : A) -> A = mkADeg ; mkA : (blanco : A) -> (hueso : Str) -> A = \blanco,hueso -> blanco ** { s = \\x,y => blanco.s ! x ! y ++ hueso } ; + mkA : A -> CopulaType -> A = + adjCopula ; } ; mk7A : (_,_,_,_,_,_,_ : Str) -> A ; mk5A : (solo,sola,solos,solas,solamente : Str) -> A ; mk2A : (espanol,espanola : Str) -> A ; regA : Str -> A ; + adjCopula : A -> CopulaType -> A ; mkADeg : A -> A -> A ; compADeg : A -> A ; regADeg : Str -> A ; From 5889d5bbb33d95264a74f985ed4a1e4f497aba4a Mon Sep 17 00:00:00 2001 From: odanoburu Date: Mon, 10 Dec 2018 20:52:29 +0200 Subject: [PATCH 09/10] (Romance) modify CompAP to use copTyp from adjective --- src/romance/VerbRomance.gf | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/romance/VerbRomance.gf b/src/romance/VerbRomance.gf index d4dba254..1332336f 100644 --- a/src/romance/VerbRomance.gf +++ b/src/romance/VerbRomance.gf @@ -91,7 +91,13 @@ incomplete concrete VerbRomance of Verb = UseCopula = predV copula ; - CompAP ap = {s = \\ag => let agr = complAgr ag in ap.s ! genNum2Aform agr.g agr.n ; cop = serCopula} ; + CompAP ap = { + s = \\ag => + let + agr = complAgr ag + in ap.s ! genNum2Aform agr.g agr.n ; + cop = ap.copTyp + } ; CompCN cn = { s = \\ag => let agr = complAgr ag in artIndef False cn.g agr.n Nom ++ cn.s ! agr.n ; @@ -115,4 +121,5 @@ incomplete concrete VerbRomance of Verb = VPSlashPrep vp prep = vp ** { c2 = {s = prep.s ; c = prep.c ; isDir = False} } ; -} + +} ; From 0479820b8fb1e6de4fc16ff2f03486b6ea4bc733 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Tue, 11 Dec 2018 16:38:24 +0200 Subject: [PATCH 10/10] (Cat) Add per as another preposition that fuses with article --- src/catalan/DiffCat.gf | 60 +++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/catalan/DiffCat.gf b/src/catalan/DiffCat.gf index 0a4574fa..019d137e 100644 --- a/src/catalan/DiffCat.gf +++ b/src/catalan/DiffCat.gf @@ -12,44 +12,50 @@ instance DiffCat of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRo -------------------------------- - param - Prepos = P_de | P_a ; + param + Prepos = P_de | P_a | P_per ; VType = VHabere | VRefl ; oper dative : Case = CPrep P_a ; genitive : Case = CPrep P_de ; + ablative : Case = CPrep P_per ; prepCase = \c -> case c of { Nom => [] ; - Acc => [] ; + Acc => [] ; CPrep P_de => elisDe ; + CPrep P_per => "per" ; CPrep P_a => "a" } ; - + artDef : Bool -> Gender -> Number -> Case -> Str = \isNP,g,n,c -> case of { ---- TODO: check the NP forms => pre {"del" ; ("de l'" ++ Predef.BIND) / vocalForta} ; => pre {"al" ; ("a l'" ++ Predef.BIND) / vocalForta} ; - => elisEl ; - => prepCase c ++ elisLa ; => "dels" ; => ["de les"] ; + => "pel" ; + => ["per la"] ; + => "pels" ; + => ["per les"] ; => "als" ; => ["a les"] ; + => elisEl ; + => prepCase c ++ elisLa ; => "els" ; => "les" } ; - + artIndef = \isNP,g,n,c -> case isNP of { True => case of { => genForms ("d' ++ Predef.BIND ++ un") ("d' ++ Predef.BIND ++ una") ! g ; => prepCase c ++ genForms "un" "una" ! g ; => genForms ("d' ++ Predef.BIND ++ uns") ("d' ++ Predef.BIND ++ unes") ! g ; -- AR 3/12/2014 - => prepCase c ++ genForms "uns" "unes" ! g + => prepCase c ++ genForms "uns" "unes" ! g } ; _ => case of { => genForms ("d' ++ Predef.BIND ++ un") ("d' ++ Predef.BIND ++ una") ! g ; @@ -58,7 +64,7 @@ oper } } ; - + possCase = \_,_,c -> prepCase c ; @@ -69,7 +75,7 @@ oper conjunctCase : Case -> Case = \c -> case c of { Nom => Nom ; - _ => Acc + _ => Acc } ; auxVerb : VType -> (VF => Str) = \_ -> haver_V.s ; @@ -78,7 +84,7 @@ oper vpAgrNone ; pronArg = \n,p,acc,dat -> - let + let paccp = case acc of { CRefl => ; CPron ag an ap => ; @@ -89,27 +95,27 @@ oper _ => <[],P2,False> } in case of { - ---- AR 8/6/2008 efficiency problem in pgf generation: + ---- AR 8/6/2008 efficiency problem in pgf generation: ---- replace the case expr with ---- a constant produces an error in V3 predication with two pronouns ---- => <"se" ++ paccp.p1, [],True> ; _ => } ; - + --case of { -- => <"te" ++ "me", []> ; -- <_,_,CPron {n = Sg ; p = P2},CPron {n = Sg ; p = P1}> => <"te" ++ "me", []> ; infForm _ _ _ _ = True ; - + mkImperative b p vp = - \\pol,g,n => - let + \\pol,g,n => + let pe = case b of {True => P3 ; _ => p} ; agr = {g = g ; n = n ; p = pe} ; refl = case vp.s.vtyp of { VRefl => ; - _ => <[],False> + _ => <[],False> } ; clpr = ; ---- TODO: True if clit @@ -139,10 +145,10 @@ oper subjIf = "si" ; - + clitInf b cli inf = inf ++ bindIf b ++ cli ; --- JS copied from DiffSpa - relPron : Bool => AAgr => Case => Str = \\b,a,c => + relPron : Bool => AAgr => Case => Str = \\b,a,c => case c of { Nom | Acc => "que" ; CPrep P_a => "cuyo" ; @@ -155,19 +161,19 @@ oper partQIndir = [] ; ---- ? - reflPron : Number -> Person -> Case -> Str = \n,p,c -> - let pro = argPron Fem n p c + reflPron : Number -> Person -> Case -> Str = \n,p,c -> + let pro = argPron Fem n p c in - case p of { + case p of { P3 => case c of { Acc | CPrep P_a => "es" ; _ => "si" } ; _ => pro - } ; + } ; - argPron : Gender -> Number -> Person -> Case -> Str = - let + argPron : Gender -> Number -> Person -> Case -> Str = + let cases : (x,y : Str) -> Case -> Str = \me,moi,c -> case c of { Acc | CPrep P_a => me ; _ => moi @@ -177,8 +183,8 @@ oper CPrep P_a => leur ; _ => eux } ; - in - \g,n,p -> case of { + in + \g,n,p -> case of { <_,Sg,P1> => cases "em" "mí" ; <_,Sg,P2> => cases "et" "tú" ; <_,Pl,P1> => cases "ens" "nosaltres" ; --- nosotros