diff --git a/src/maltese/CatMlt.gf b/src/maltese/CatMlt.gf index bf77bc9f..70c1ff06 100644 --- a/src/maltese/CatMlt.gf +++ b/src/maltese/CatMlt.gf @@ -60,6 +60,9 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in { Pron = Pronoun ; Det = Determiner ; + DAP = Determiner ** { + adj : GenNum => Str + } ; Predet = {s : Str} ; Quant = Quantifier ; @@ -83,6 +86,10 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in { s : NumCase => Str ; n : NumForm ; } ; + ACard = { + s : NumCase => Str ; + n : NumForm ; + } ; -- Numeral @@ -127,10 +134,6 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in { -- Overridden from CommonX - Adv = { - s : Str ; - joinsVerb : Bool ; -- Adv "for us" completely integrates into verb at VP level - a : Agr ; -- when joinsVerb, this is important - } ; + Adv = Adverb ; } diff --git a/src/maltese/ConstructionMlt.gf b/src/maltese/ConstructionMlt.gf new file mode 100644 index 00000000..cb8a9a55 --- /dev/null +++ b/src/maltese/ConstructionMlt.gf @@ -0,0 +1,214 @@ +concrete ConstructionMlt of Construction = CatMlt ** open + Prelude, + ResMlt, + GrammarMlt, + ParadigmsMlt, + (S = StructuralMlt) in { + + lincat + Timeunit = N ; + Hour = {s : Str} ; + Weekday = N ; + Monthday = NP ; + Month = N ; + Year = NP ; + Language = N ; + + oper + mkHour : Str -> Hour = \s -> lin Hour {s = s} ; + mkYearNP : Str -> NounPhrase = \s -> { + s = \\_ => s ; + a = agrP3 Sg Masc ; + isPron = False ; + isDefn = False + } ; + amountStr : Card -> CN -> Str = \card,unit -> + card.s ! NumAdj ++ unit.s ! numform2nounnum card.n ; + containerCN : N -> NP -> Noun = \container,np -> { + s = \\num => container.s ! num ++ prepNP prep_ta np ; + g = container.g ; + hasColl = container.hasColl ; + hasDual = container.hasDual ; + takesPron = container.takesPron + } ; + + lin + hungry_VP = UseComp (CompAP (PositA (mkA "bil-ġuħ"))) ; + thirsty_VP = UseComp (CompAP (PositA (mkA "bil-għatx"))) ; + tired_VP = UseComp (CompAP (PositA (mkA "għajjien"))) ; + scared_VP = UseComp (CompAP (PositA (mkA "imbeżża'"))) ; + ill_VP = UseComp (CompAP (PositA (mkA "marid"))) ; + ready_VP = UseComp (CompAP (PositA (mkA "lest"))) ; + + has_age_VP card = + ComplSlash (SlashV2a S.have_V2) { + s = \\_ => card.s ! NumNom ++ "sena" ; + a = agrP3 Pl Fem ; + isPron = False ; + isDefn = False + } ; + + weather_adjCl ap = PredVP (UsePron S.it_Pron) (UseComp (CompAP ap)) ; + is_right_VP = UseComp (CompAP (PositA (mkA "għandu raġun"))) ; + is_wrong_VP = UseComp (CompAP (PositA (mkA "żbaljat"))) ; + + have_name_Cl x y = + mkClause ("l-isem" ++ prepNP prep_ta x) (agrP3 Sg Masc) + (insertObj (\\_ => y.s ! NPAcc) CopulaVP) ; + married_Cl x y = + PredVP x (UseComp (CompAP (ComplA2 (mkA2 (mkA "miżżewweġ") S.with_Prep) y))) ; + what_name_QCl x = { + s = \\_,_,_,_ => "x'inhu l-isem" ++ prepNP prep_ta x + } ; + how_old_QCl x = { + s = \\_,_,_,_ => "kemm għandu żmien" ++ x.s ! NPNom + } ; + how_far_QCl x = { + s = \\_,_,_,_ => "kemm qiegħed 'il bogħod" ++ x.s ! NPNom + } ; + + n_units_AP card unit a = { + s = \\gn => amountStr card unit ++ a.s ! APosit gn ; + isPre = False + } ; + n_units_of_NP card unit np = { + s = \\_ => amountStr card unit ++ prepNP prep_ta np ; + a = agrP3 (numform2num card.n) unit.g ; + isPron = False ; + isDefn = False + } ; + n_unit_CN card unit cn = { + s = \\num => amountStr card unit ++ cn.s ! num ; + g = cn.g ; + hasColl = cn.hasColl ; + hasDual = cn.hasDual ; + takesPron = cn.takesPron + } ; + + bottle_of_CN np = containerCN (mkN "flixkun") np ; + cup_of_CN np = containerCN (mkN "kikkra") np ; + glass_of_CN np = containerCN (mkN "tazza") np ; + few_X_short_of_Y np x y = { + s = np.s ! NPNom ++ "jonqsu" ++ x.s ! Plural ++ "biex ikun" ++ y.s ! Singulative + } ; + + timeunitAdv n unit = advSS (n.s ! NumNom ++ unit.s ! Singulative) ; + timeunitRange l u unit = advSS (l.s ! NumNom ++ "sa" ++ u.s ! NumNom ++ unit.s ! Plural) ; + + oneHour = mkHour "1" ; + twoHour = mkHour "2" ; + threeHour = mkHour "3" ; + fourHour = mkHour "4" ; + fiveHour = mkHour "5" ; + sixHour = mkHour "6" ; + sevenHour = mkHour "7" ; + eightHour = mkHour "8" ; + nineHour = mkHour "9" ; + tenHour = mkHour "10" ; + elevenHour = mkHour "11" ; + twelveHour = mkHour "12" ; + thirteenHour = mkHour "13" ; + fourteenHour = mkHour "14" ; + fifteenHour = mkHour "15" ; + sixteenHour = mkHour "16" ; + seventeenHour = mkHour "17" ; + eighteenHour = mkHour "18" ; + nineteenHour = mkHour "19" ; + twentyHour = mkHour "20" ; + twentyOneHour = mkHour "21" ; + twentyTwoHour = mkHour "22" ; + twentyThreeHour = mkHour "23" ; + twentyFourHour = mkHour "24" ; + + timeHour h = advSS ("fis-" ++ h.s) ; + timeHourMinute h m = advSS ("fis-" ++ h.s ++ m.s ! NumNom) ; + + weekdayPunctualAdv w = advSS ("nhar" ++ w.s ! Singulative) ; + weekdayHabitualAdv w = advSS ("nhar ta'" ++ w.s ! Plural) ; + weekdayLastAdv w = advSS (w.s ! Singulative ++ "li għadda") ; + weekdayNextAdv w = advSS (w.s ! Singulative ++ "li ġej") ; + + monthAdv m = advSS (makePreVowel "fi" "f'" ++ m.s ! Singulative) ; + yearAdv y = PrepNP S.in_Prep y ; + dayMonthAdv d m = advSS (d.s ! NPNom ++ m.s ! Singulative) ; + monthYearAdv m y = advSS (m.s ! Singulative ++ y.s ! NPNom) ; + dayMonthYearAdv d m y = advSS (d.s ! NPNom ++ m.s ! Singulative ++ y.s ! NPNom) ; + + intYear i = lin NP (mkYearNP i.s) ; + intMonthday i = lin NP (mkYearNP i.s) ; + + InLanguage l = PrepNP S.in_Prep (MassNP (UseN l)) ; + + weekdayN w = w ; + monthN m = m ; + weekdayPN w = mkPN (w.s ! Singulative) ; + monthPN m = mkPN (m.s ! Singulative) ; + languageNP l = MassNP (UseN l) ; + languageCN l = UseN l ; + + second_Timeunit = mkN "sekonda" ; + minute_Timeunit = mkN "minuta" ; + hour_Timeunit = mkN "siegħa" ; + day_Timeunit = mkN "jum" ; + week_Timeunit = mkN "ġimgħa" ; + month_Timeunit = mkN "xahar" ; + year_Timeunit = mkN "sena" ; + + monday_Weekday = mkN "Tnejn" ; + tuesday_Weekday = mkN "Tlieta" ; + wednesday_Weekday = mkN "Erbgħa" ; + thursday_Weekday = mkN "Ħamis" ; + friday_Weekday = mkN "Ġimgħa" ; + saturday_Weekday = mkN "Sibt" ; + sunday_Weekday = mkN "Ħadd" ; + + january_Month = mkN "Jannar" ; + february_Month = mkN "Frar" ; + march_Month = mkN "Marzu" ; + april_Month = mkN "April" ; + may_Month = mkN "Mejju" ; + june_Month = mkN "Ġunju" ; + july_Month = mkN "Lulju" ; + august_Month = mkN "Awwissu" ; + september_Month = mkN "Settembru" ; + october_Month = mkN "Ottubru" ; + november_Month = mkN "Novembru" ; + december_Month = mkN "Diċembru" ; + + afrikaans_Language = mkN "Afrikans" ; + amharic_Language = mkN "Amħariku" ; + arabic_Language = mkN "Għarbi" ; + bulgarian_Language = mkN "Bulgaru" ; + catalan_Language = mkN "Katalan" ; + chinese_Language = mkN "Ċiniż" ; + danish_Language = mkN "Daniż" ; + dutch_Language = mkN "Olandiż" ; + english_Language = mkN "Ingliż" ; + estonian_Language = mkN "Estonjan" ; + finnish_Language = mkN "Finlandiż" ; + french_Language = mkN "Franċiż" ; + german_Language = mkN "Ġermaniż" ; + greek_Language = mkN "Grieg" ; + hebrew_Language = mkN "Ebrajk" ; + hindi_Language = mkN "Ħindi" ; + japanese_Language = mkN "Ġappuniż" ; + italian_Language = mkN "Taljan" ; + latin_Language = mkN "Latin" ; + latvian_Language = mkN "Latvjan" ; + maltese_Language = mkN "Malti" ; + nepali_Language = mkN "Nepali" ; + norwegian_Language = mkN "Norveġiż" ; + persian_Language = mkN "Persjan" ; + polish_Language = mkN "Pollakk" ; + punjabi_Language = mkN "Punġabi" ; + romanian_Language = mkN "Rumen" ; + russian_Language = mkN "Russu" ; + sindhi_Language = mkN "Sindi" ; + spanish_Language = mkN "Spanjol" ; + swahili_Language = mkN "Swaħili" ; + swedish_Language = mkN "Svediż" ; + thai_Language = mkN "Tajlandiż" ; + turkish_Language = mkN "Tork" ; + urdu_Language = mkN "Urdu" ; + +} diff --git a/src/maltese/LangMlt.gf b/src/maltese/LangMlt.gf index 6d22be0d..369b6295 100644 --- a/src/maltese/LangMlt.gf +++ b/src/maltese/LangMlt.gf @@ -9,6 +9,8 @@ concrete LangMlt of Lang = GrammarMlt, LexiconMlt + ,ConstructionMlt + ,DocumentationMlt --# notpresent ** { flags diff --git a/src/maltese/NamesMlt.gf b/src/maltese/NamesMlt.gf index 40ad01ef..2c7dd074 100644 --- a/src/maltese/NamesMlt.gf +++ b/src/maltese/NamesMlt.gf @@ -19,5 +19,17 @@ lin UseLN pn = { isPron = False ; isDefn = False ; } ; +lin PlainLN = UseLN ; + +lin AdjLN ap pn = { + s = preOrPost ap.isPre (ap.s ! toGenNum pn.a) pn.s ; + a = pn.a ; + } ; + +lin InLN pn = { + s = makePreVowel "fi" "f'" ++ pn.s ; + joinsVerb = False ; + a = pn.a ; + } ; } diff --git a/src/maltese/NounMlt.gf b/src/maltese/NounMlt.gf index 2b7a6585..add58c1e 100644 --- a/src/maltese/NounMlt.gf +++ b/src/maltese/NounMlt.gf @@ -107,6 +107,18 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude, Maybe in { isDefn = True ; } ; + -- DAP -> AP -> DAP + -- the large one + AdjDAP dap ap = dap ** { + adj = \\gn => dap.adj ! gn ++ ap.s ! gn + } ; + + -- Det -> DAP + -- this one + DetDAP det = det ** { + adj = \\_ => [] + } ; + -- Quant DefArt = { s = \\_ => artDef ; diff --git a/src/maltese/ParadigmsMlt.gf b/src/maltese/ParadigmsMlt.gf index 88d13a44..1cea238e 100644 --- a/src/maltese/ParadigmsMlt.gf +++ b/src/maltese/ParadigmsMlt.gf @@ -84,6 +84,25 @@ resource ParadigmsMlt = open mkPN : Str -> Gender -> Number -> PN ; } ; + mkLN : overload { + mkLN : Str -> LN ; + mkLN : Str -> Number -> LN ; + mkLN : Str -> Gender -> LN ; + mkLN : Str -> Gender -> Number -> LN ; + } ; + + mkGN : overload { + mkGN : Str -> GN ; + mkGN : Str -> Gender -> GN ; + } ; + + mkSN : overload { + mkSN : Str -> SN ; + mkSN : Str -> Number -> SN ; + mkSN : Str -> Gender -> SN ; + mkSN : Str -> Gender -> Number -> SN ; + } ; + mkN2 : overload { mkN2 : N -> Prep -> N2 ; mkN2 : N -> Str -> N2 ; @@ -94,6 +113,11 @@ resource ParadigmsMlt = open possN : N -> N ; -- Mark a noun as taking possessive enclitic pronouns: missieri, missierek... + compoundN : overload { + compoundN : N -> A -> N ; -- Noun modified by adjective: dar kbira + compoundN : N -> Str -> N ; -- Noun modified by adverbial string + } ; + mkRoot : overload { mkRoot : Root ; -- Null root mkRoot : Str -> Root ; -- From hyphenated string: "k-t-b" @@ -137,6 +161,8 @@ resource ParadigmsMlt = open mkVS : V -> VS ; -- sentence-compl + compoundV : V -> Str -> V ; -- post-verbal particle/fixed object: mar lura + mkV3 : overload { mkV3 : V -> V3 ; -- ditransitive: give,_,_ mkV3 : V -> Prep -> Prep -> V3 ; -- two prepositions: speak, with, about @@ -144,11 +170,26 @@ resource ParadigmsMlt = open }; mkV2V : V -> Prep -> Prep -> V2V ; -- want (noPrep NP) (to VP) + dirV2V : V -> V2V ; -- make (NP) (VP) mkConj : overload { mkConj : Str -> Conj ; -- Conjunction: wieħed tnejn u tlieta mkConj : Str -> Str -> Conj ; -- Conjunction: wieħed , tnejn u tlieta } ; + mkPConj : Str -> PConj ; + + mkDet : overload { + mkDet : Str -> Det ; + mkDet : Str -> Number -> Det ; + } ; + mkPredet : Str -> Predet ; + + mkSubj : Str -> Subj ; + mkIQuant : Str -> IQuant ; + mkIDet : overload { + mkIDet : Str -> IDet ; + mkIDet : Str -> Number -> IDet ; + } ; mkA : overload { mkA : Str -> A ; -- Regular adjective with predictable feminine and plural forms: bravu @@ -168,10 +209,20 @@ resource ParadigmsMlt = open mkAdv : Str -> Adv ; -- post-verbal adverb: illum mkAdV : Str -> AdV ; -- preverbal adverb: dejjem + mkIAdv : Str -> IAdv ; + mkCAdv : overload { + mkCAdv : Str -> CAdv ; + mkCAdv : Str -> Str -> CAdv ; + } ; mkAdA : Str -> AdA ; -- adverb modifying adjective: pjuttost mkAdN : Str -> AdN ; -- adverb modifying numeral: madwar + mkCard : Str -> Card ; + mkACard : Str -> ACard ; + mkInterj : Str -> Interj ; + mkVoc : Str -> Voc ; + --. -- Everything below this is definitions (excluded from synopsis) @@ -334,12 +385,46 @@ resource ParadigmsMlt = open mkPN : Str -> Gender -> Number -> PN = \s,g,n -> regPN s g n ; } ; + mkLN = overload { + mkLN : Str -> LN = \s -> regLN s masculine singular ; + mkLN : Str -> Number -> LN = \s,n -> regLN s masculine n ; + mkLN : Str -> Gender -> LN = \s,g -> regLN s g singular ; + mkLN : Str -> Gender -> Number -> LN = \s,g,n -> regLN s g n ; + } ; + + mkGN = overload { + mkGN : Str -> GN = \s -> regGN s masculine singular ; + mkGN : Str -> Gender -> GN = \s,g -> regGN s g singular ; + } ; + + mkSN = overload { + mkSN : Str -> SN = \s -> regSN s masculine singular ; + mkSN : Str -> Number -> SN = \s,n -> regSN s masculine n ; + mkSN : Str -> Gender -> SN = \s,g -> regSN s g singular ; + mkSN : Str -> Gender -> Number -> SN = \s,g,n -> regSN s g n ; + } ; + -- Proper noun regPN : Str -> Gender -> Number -> PN = \name,g,n -> lin PN { s = name ; a = mkAgr n P3 g ; } ; + regLN : Str -> Gender -> Number -> LN = \name,g,n -> lin LN { + s = name ; + a = mkAgr n P3 g ; + } ; + + regGN : Str -> Gender -> Number -> GN = \name,g,n -> lin GN { + s = name ; + a = mkAgr n P3 g ; + } ; + + regSN : Str -> Gender -> Number -> SN = \name,g,n -> lin SN { + s = name ; + a = mkAgr n P3 g ; + } ; + mkN2 = overload { mkN2 : N -> Prep -> N2 = prepN2 ; mkN2 : N -> Str -> N2 = \n,s -> prepN2 n (mkPrep s); @@ -363,6 +448,23 @@ resource ParadigmsMlt = open takesPron = True ; } ; + compoundN = overload { + compoundN : N -> A -> N = \n,a -> lin N { + s = \\num => n.s ! num ++ a.s ! APosit (mkGenNum num n.g) ; + g = n.g ; + hasColl = n.hasColl ; + hasDual = n.hasDual ; + takesPron = n.takesPron ; + } ; + compoundN : N -> Str -> N = \n,adv -> lin N { + s = \\num => n.s ! num ++ adv ; + g = n.g ; + hasColl = n.hasColl ; + hasDual = n.hasDual ; + takesPron = n.takesPron ; + } ; + } ; + {- Preposition -------------------------------------------------------- -} mkPrep = overload { @@ -1278,6 +1380,26 @@ resource ParadigmsMlt = open mkVS v = lin VS v ; + compoundV : V -> Str -> V = \v,s -> lin V { + s = \\vf => postVerbStems (v.s ! vf) s ; + i = v.i ; + presPart = postParticiple v.presPart s ; + pastPart = postParticiple v.pastPart s ; + } ; + + postVerbStems : VerbStems -> Str -> VerbStems = \vs,s -> { + s1 = vs.s1 ++ s ; + s2 = vs.s2 ++ s ; + s3 = vs.s3 ++ s ; + } ; + + postParticiple : Maybe Participle -> Str -> Maybe Participle = \part,s -> + case exists Participle part of { + True => let part' : Participle = fromJust Participle part in + Just Participle (\\gn => part' ! gn ++ s) ; + False => noParticiple + } ; + prepV2 : V -> Prep -> V2 ; prepV2 v p = lin V2 ( v ** { c2 = hasCompl p } ) ; @@ -1301,6 +1423,8 @@ resource ParadigmsMlt = open mkV2V v p t = lin V2V (v ** { c2 = hasCompl p ; c3 = hasCompl t }) ; + dirV2V v = lin V2V (v ** { c2 = noCompl ; c3 = noCompl }) ; + {- Conjunction -------------------------------------------------------- -} mkConj = overload { @@ -1311,6 +1435,24 @@ resource ParadigmsMlt = open mk2Conj : Str -> Str -> Conj = \x,y -> lin Conj (sd2 x y) ; + mkPConj : Str -> PConj = \s -> lin PConj {s = s} ; + + mkDet = overload { + mkDet : Str -> Det = \s -> lin Det (mkDeterminer singular s) ; + mkDet : Str -> Number -> Det = \s,n -> lin Det (mkDeterminer n s) ; + } ; + + mkPredet : Str -> Predet = \s -> lin Predet {s = s} ; + + mkSubj : Str -> Subj = \s -> lin Subj {s = s} ; + + mkIQuant : Str -> IQuant = \s -> lin IQuant {s = s} ; + + mkIDet = overload { + mkIDet : Str -> IDet = \s -> lin IDet {s = s ; n = singular} ; + mkIDet : Str -> Number -> IDet = \s,n -> lin IDet {s = s ; n = n} ; + } ; + {- Adjective ---------------------------------------------------------- -} -- Overloaded function for building an adjective @@ -1404,8 +1546,17 @@ resource ParadigmsMlt = open a = agrP3 Sg Masc ; -- ignored when joinsVerb = False } ; mkAdV x = lin AdV (ss x) ; + mkIAdv x = lin IAdv {s = x} ; + mkCAdv = overload { + mkCAdv : Str -> CAdv = \s -> lin CAdv {s = s ; p = []} ; + mkCAdv : Str -> Str -> CAdv = \s,p -> lin CAdv {s = s ; p = p} ; + } ; mkAdA x = lin AdA (ss x) ; mkAdN x = lin AdN (ss x) ; + mkCard : Str -> Card = \s -> lin Card {s = \\_ => s ; n = Num20_99} ; + mkACard : Str -> ACard = \s -> lin ACard {s = \\_ => s ; n = Num20_99} ; + mkInterj x = lin Interj {s = x} ; + mkVoc x = lin Voc {s = x} ; {- Quantifier, Ord ---------------------------------------------------- -} diff --git a/src/maltese/ResMlt.gf b/src/maltese/ResMlt.gf index 291161db..e82503cd 100644 --- a/src/maltese/ResMlt.gf +++ b/src/maltese/ResMlt.gf @@ -1312,4 +1312,11 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { ma+"z-" ++ BIND / strs { "z" } } ; + Adverb = { + s : Str ; + joinsVerb : Bool ; -- Adv "for us" completely integrates into verb at VP level + a : Agr ; -- when joinsVerb, this is important + } ; + advSS : Str -> Adverb = \s -> {s = s ; joinsVerb = False ; a = agrP3 Sg Masc} ; + } diff --git a/src/maltese/SentenceMlt.gf b/src/maltese/SentenceMlt.gf index d2288f95..8b02c50a 100644 --- a/src/maltese/SentenceMlt.gf +++ b/src/maltese/SentenceMlt.gf @@ -40,6 +40,11 @@ concrete SentenceMlt of Sentence = CatMlt ** open } ; } ; + -- Adv -> Imp -> Imp + AdvImp adv imp = { + s = \\pol,n => adv.s ++ imp.s ! pol ! n + } ; + -- NP -> VPSlash -> ClSlash -- (whom) he sees SlashVP np vp =