packages feed

gf-3.3.3: lib/src/maltese/ResMlt.gf

-- ResMlt.gf: Language-specific parameter types, morphology, VP formation
--
-- Maltese Resource Grammar Library
-- John J. Camilleri, 2012
-- Licensed under LGPL

--# -path=.:../abstract:../common:../prelude

{-
  Verb types summary:
  ===================
  - Strong verb: none of radicals are semi-vowels    eg ĦAREĠ (Ħ-R-Ġ)
  - Defective verb: third radical is semivowel GĦ    eg QATA' (Q-T-GĦ)
  - Weak verb: third radical is semivowel J      eg MEXA (M-X-J)
  - Hollow verb: long A or IE btw radicals 1 & 3    eg QAL (Q-W-L) or SAB (S-J-B)
  - Double/Geminated verb: radicals 2 & 3 identical  eg ĦABB (Ħ-B-B)
  - Quadriliteral verb: 4 radicals          eg QARMEĊ (Q-R-M-Ċ)
-}


resource ResMlt = PatternsMlt ** open Prelude in {

  flags coding=utf8 ;

  param

    -- Used in the NumeralMlt module
    CardOrd = NCard | NOrd ;
    DTail = T1 | T2 | T3 ; -- This is already defined in ParamX...
    Num_Number =
        NumSg
      | NumDual
      | NumPl
    ;
    DForm =
        Unit    -- 0..10
      | Teen    -- 11-19
      --| TeenIl  -- 11-19
      | Ten    -- 20-99
      | Hund    -- 100..999
      --| Thou    -- 1000+
    ;
    Num_Case =
        NumNominative
      | NumAdjectival ;


{-
  Note: NNQ = Non-numerically quantifiable

  Nouns can have the following forms:
    o Singular
      - Singulative (1, >10)
      - Collective (NNQ)
    o Dual (2)
    o Plural
      - Determinate (2-10)
      - Indeterminate (NNQ)
        - Sound
        - Broken
        - Plural of Plural

  Typical combinations thereof  (* marks base form):
    - Singulative, no plural!
    - Singulative*, Plural
    - Singulative* (1), Dual (2), Plural (>2)
    - Singulative (1, >10), Collective* (NNQ), Determinate Plural (2-10)
    - Singulative, Collective*, Determinate Plural, Indeterminate Plural -> very few nouns have these 4 forms
-}
    Noun_Sg_Type =
        Singulative  -- eg ĦUTA
      | Collective  -- eg ĦUT
    ;
    Noun_Pl_Type =
        Determinate  -- eg ĦUTIET
      | Indeterminate  -- eg ĦWIET
    ;
    Noun_Number =
        Singular Noun_Sg_Type    -- eg ĦUTA / ĦUT
      | Dual            -- eg WIDNEJN
      | Plural Noun_Pl_Type    -- eg ĦUTIET / ĦWIET
    ;

{-
    Noun_PluralType =
        Sound        -- External (affix), eg FERGĦA -> FERGĦAT
      | Broken      -- Internal, eg FERGĦA -> FRIEGĦI
      | Irregular      -- eg MARA -> NISA
      | PluralOfPlural  -- eg TARF -> TRUF -> TRUFIJIET
      | Foreign      -- eg KARTI, PRATTIĊI, TELEVIXINS
    ;
-}

    Gender  = Masc | Fem ;

    Animacy =
        Animate
      | Inanimate
    ;

    Definiteness =
        Definite    -- eg IL-KARTA. In this context same as Determinate
      | Indefinite  -- eg KARTA
    ;

{-
    -- CASE AS DEFINED BY GRAMMATIKA MALTIJA, p132
    -- Noun cases
    Case =
        Nominative  -- referent as subject, eg IT-TARBIJA ...
      | Genitive    -- referent as possessor, eg ... TAT-TARBIJA
      | Accusative  -- referent as direct object
      | Dative    -- referent as indirect object, eg ... LIT-TARBIJA
      | Ablative    -- referent as instrument, cause, location, source or time, eg ... MINN TARBIJA
      | Vocative    -- referent being adressed, eg AA TARBIJA (lol)
    ;
-}
{-
    -- CASE AS DEFINED BY ME
    -- Noun cases (note my examples include DEFINITE ARTICLE)
    -- Commented lines mean that noun iflection is unchanged, not that the case does not occur in Maltese!
    Case =
--        Absessive    -- lack or absence of referent (MINGĦAJR)
--      | Ablative    -- referent as instrument, cause, location, source or time
--      | Absolutive  -- subject of intransitive or object of transitive verb (in ergative-absolutive languages)
--      | Accusative  -- referent as direct object (in nominative-accusative languages)
--      | Allative    -- motion towards referent (LEJN)
--      | Additive    -- synonym of Allative (above)
      Benefactive    -- referent as recipient, eg GĦAT-TARBIJA. cf Dative.
--      | Causative    -- referent as the cause of a situation (MINĦABBA)
      | Comitative  -- with, eg MAT-TARBIJA
      | Dative    -- referent as indirect object, eg LIT-TARBIJA. cf Benefactive.
--      | Delative    -- motion downward from referent
      | Elative    -- motion away from referent, eg MIT-TARBIJA
      | Equative    -- likeness or identity, eg BĦAT-TARBIJA
--      | Ergative    -- subject of transitive verb (in ergative-absolutive languages)
--      | Essive    -- temporary state / while / in capacity of (BĦALA)
      | Genitive    -- referent as possessor, eg TAT-TARBIJA
--      | Illative    -- motion into / towards referent, eg SAT-TARBIJA. cf Allative.
      | Inessive    -- within referent, eg ĠOT-TARBIJA, FIT-TARBIJA
      | Instrumental  -- referent as instrument, eg BIT-TARBIJA. cf Ablative.
      | Lative    -- motion up to referent, eg SAT-TARBIJA
--      | Locative    -- location at referent
      | Nominative  -- referent as subject, eg IT-TARBIJA
--      | Partitive    -- partial nature of referent
--      | Prolative    -- motion along / beside referent
--      | Superessive  -- on / upon (FUQ)
--      | Translative  -- referent noun or adjective as result of process of change
--      | Vocative    -- referent being adressed, eg AA TARBIJA (lol)
    ;
-}
--    Person  = P1 | P2 | P3 ;
--    State   = Def | Indef | Const ;
--    Mood    = Ind | Cnj | Jus ;
--    Voice   = Act | Pas ;
    Origin =
        Semitic
      | Romance
      | English
    ;
--    Order   = Verbal | Nominal ;

    -- Just for my own use
    -- Mamma = Per3 Sg Masc ;

    -- Shortcut type
    -- GenNum = gn Gender Number2 ;


    Person_Number = Sg | Pl ;

    -- Agreement features
    Agr =
        Per1 Person_Number  -- Jiena, Aħna
      | Per2 Person_Number  -- Inti, Intom
      | Per3Sg Gender  -- Huwa, Hija
      | Per3Pl    -- Huma
    ;

    -- Possible tenses
    Tense =
        Perf  -- Perfect tense, eg SERAQ
      | Impf -- Imperfect tense, eg JISRAQ
      | Imp  -- Imperative, eg ISRAQ
      -- | PresPart  -- Present Particible. Intransitive and 'motion' verbs only, eg NIEŻEL
      -- | PastPart  -- Past Particible. Both verbal & adjectival function, eg MISRUQ
      -- | VerbalNoun  -- Verbal Noun, eg SERQ
    ;

    -- Possible verb forms (tense + person)
    VForm =
        VPerf Agr    -- Perfect tense in all pronoun cases
      | VImpf Agr    -- Imperfect tense in all pronoun cases
      | VImp Person_Number  -- Imperative is always Per2, Sg & Pl
      -- | VPresPart GenNum  -- Present Particible for Gender/Number
      -- | VPastPart GenNum  -- Past Particible for Gender/Number
      -- | VVerbalNoun      -- Verbal Noun
    ;

    -- Possible verb types
    VType =
        Strong  -- Strong verb: none of radicals are semi-vowels  eg ĦAREĠ (Ħ-R-Ġ)
      | Defective  -- Defective verb: third radical is semivowel GĦ  eg QATA' (Q-T-GĦ)
      | Weak    -- Weak verb: third radicl is semivowel J      eg MEXA (M-X-J)
      | Hollow  -- Hollow verb: long A or IE btw radicals 1 & 3    eg QAL (Q-W-L) or SAB (S-J-B)
      | Double  -- Double/Geminated verb: radicals 2 & 3 identical  eg ĦABB (Ħ-B-B)
      | Quad    -- Quadliteral verb                  eg KARKAR (K-R-K-R), MAQDAR (M-Q-D-R), LEMBEB (L-M-B-B)
    ;

  oper

    -- Roots & Patterns
    Pattern : Type = {v1, v2 : Str} ; -- vowel1, vowel2
    -- Root3 : Type = {K, T, B : Str} ;
    -- Root4 : Type = Root3 ** {L : Str} ;
    Root : Type = {K, T, B, L : Str} ;

    -- Some classes. I need to include "c" because currently "ċ" gets downgraded to "c" in input :/
    Consonant : pattern Str = #( "b" | "c" | "ċ" | "d" | "f" | "ġ" | "g" | "għ" | "ħ" | "h" | "j" | "k" | "l" | "m" | "n" | "p" | "q" | "r" | "s" | "t" | "v" | "w" | "x" | "ż" | "z" );
    CoronalConsonant : pattern Str = #( "c" | "ċ" | "d" | "n" | "r" | "s" | "t" | "x" | "ż" | "z" ); -- "konsonanti xemxin"
    LiquidCons : pattern Str = #( "l" | "m" | "n" | "r" | "għ" );
    Vowel : pattern Str = #( "a" | "e" | "i" | "o" | "u" );
    Digraph : pattern Str = #( "ie" );
    SemiVowel : pattern Str = #( "għ" | "j" );

    {- ===== Type declarations ===== -}

    -- VP = {
      -- v : Verb ;
      -- clit : Str ;
      -- clitAgr : ClitAgr ;
      -- obj : Agr => Str
    -- } ;

    -- NP = {
      -- s : Case => {clit,obj : Str ; isClit : Bool} ;
      -- a : Agr
    -- } ;

{-
    Noun : Type = {
      s : Number5 => Str ;
      g : Gender ;
    } ;
-}
    Noun : Type = {
      s : Noun_Number => Str ;
      g : Gender ;
    } ;

    Adj : Type = {
      s : Gender => Person_Number => Str ;
      -- isPre : Bool ;
    } ;

    Verb : Type = {
      s : VForm => Str ;  -- Give me the form (tense, person etc) and I'll give you the string
      t : VType ;      -- Inherent - Strong/Hollow etc
      o : Origin ;    -- Inherent - a verb of Semitic or Romance origins?
    } ;


    {- ===== Useful helper functions ===== -}

    addDefinitePreposition : Str -> Str -> Str = \prep,n -> (getDefinitePreposition prep n) ++ n ;
    addDefiniteArticle = addDefinitePreposition "il" ;
    getDefiniteArticle = getDefinitePreposition "il" ;

    -- Correctly inflect definite preposition
    -- A more generic version of getDefiniteArticle
      -- Params:
        -- preposition (eg TAL, MAL, BĦALL)
        -- noun
    -- NOTE trying to call this with a runtime string will cause a world of pain. Design around it.
    getDefinitePreposition : Str -> Str -> Str = \prep,noun ->
      let
        -- Remove either 1 or 2 l's
        prepStem : Str = case prep of {
          _ + "ll" => Predef.tk 2 prep ;
          _ + "l"  => Predef.tk 1 prep ;
          _ => prep -- this should never happen, I don't think
        }
      in
      case noun of {
        ("s"|#LiquidCons) + #Consonant + _   => prep + "-i" ;    -- L-ISKOLA
        ("għ" | #Vowel) + _         => case prep of {    -- L-GĦATBA...
                            ("fil"|"bil")  => (Predef.take 1 prep) + "l-" ;
                            "il"       => "l" + "-" ;
                            _         => prep + "-"
                          };
        K@#CoronalConsonant + _       => prepStem + K + "-" ;  -- IĊ-ĊISK
        #Consonant + _             => prep + "-" ;      -- IL-QADDIS
        _                   => []          -- ?
      } ;

    definiteArticle : Str =
      pre {
        "il-" ;
        "l-" / strs { "a" ; "e" ; "i" ; "o" ; "u" ; "h" ; "għ" } ;
        "iċ-" / strs { "ċ" } ;
        "id-" / strs { "d" } ;
        "in-" / strs { "n" } ;
        "ir-" / strs { "r" } ;
        "is-" / strs { "s" } ;
        "it-" / strs { "t" } ;
        "ix-" / strs { "x" } ;
        "iż-" / strs { "ż" } ;
        "iz-" / strs { "z" }
      } ;

}