diff --git a/src/somali/ParadigmsSom.gf b/src/somali/ParadigmsSom.gf index fe847f49..a2df4b7d 100644 --- a/src/somali/ParadigmsSom.gf +++ b/src/somali/ParadigmsSom.gf @@ -116,7 +116,7 @@ oper -- mkSubj : Str -> Bool -> Subj = \s,b -> -- lin Subj { } ; - mkAdv : Str -> Adv = \s -> lin Adv {s = s ; c2 = noPrep ; np = emptyNP} ; + mkAdv : Str -> Adv = \s -> lin Adv {s = s ; c2=noPrep ; np = emptyNP} ; mkAdV : Str -> AdV = \s -> lin AdV {s = s} ; @@ -146,11 +146,11 @@ oper fem = Fem ; Preposition = ResSom.Preposition ; - ka = ResSom.ka ; - ku = ResSom.ku ; - la = ResSom.la ; - u = ResSom.u ; - noPrep = ResSom.noPrep ; + ka = ResSom.Ka ; + ku = ResSom.Ku ; + la = ResSom.La ; + u = ResSom.U ; + noPrep = ResSom.NoPrep ; ------------------------ mkN = overload { diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index a5cd1b11..bc0cdb24 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -156,28 +156,34 @@ param -- Prepositions param - Preposition = u | ku | ka | la | noPrep | passive ; - PrepCombination = ugu | uga | ula | kaga | kula | kala - | Single Preposition ; + Preposition = U | Ku | Ka | La | NoPrep ; + PrepositionPlus = P Preposition | Passive ; -- Hack: RGL only supports V2s as passive, so I can reuse V2's preposition slot for passives as well, and save >200 parameters. (Don't ask.) + PrepCombination = Ugu | Uga | Ula | Kaga | Kula | Kala + | Single PrepositionPlus ; oper - combine : Preposition -> Preposition -> PrepCombination = \p1,p2 -> - let oneWay : Preposition => Preposition => PrepCombination = + combine : PrepositionPlus -> Preposition -> PrepCombination = \p1,p2 -> + let oneWay : PrepositionPlus => Preposition => PrepCombination = \\x,y => case of { - => ugu ; - => uga ; - => ula ; - => kaga ; - => kula ; - => kala ; - => Single p ; - => Single p ; - => Single p } -- for trying both ways - in case oneWay ! p2 ! p1 of { + => Single Passive ; + => Single (P p) ; -- TODO check if this ever happens +

=> case of { + => Ugu ; + => Uga ; + => Ula ; + => Kaga ; + => Kula ; + => Kala ; + => Single (P p) ; + => Single x ; + => Single x }} -- for trying both ways + in case oneWay ! P p2 ! (pp2prep p1) of { Single _ => oneWay ! p1 ! p2 ; - x => x } ; + z => z } ; + pp2prep : PrepositionPlus -> Preposition = \pp -> + case pp of {P p => p ; Passive => NoPrep} ; -------------------------------------------------------------------------------- -- Verbs diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index ff01bb46..0ee9adf6 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -191,7 +191,7 @@ oper } ; Pl1 Excl => { s = table {Nom => "aan" ; Abs => "na"} ; - a = Pl1 Incl ; isPron = True ; sp ="annaga" ; + a = Pl1 Excl ; isPron = True ; sp ="annaga" ; poss = {s = quantTable "eenn" ; short = quantTable "een" ; sp = gnTable "eenn" "eenn" "uweenn"} } ; Pl1 Incl => { @@ -322,55 +322,52 @@ oper _ => ku } } ; - prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! p ** {c2 = p} ; + prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! P p ** {c2 = p} ; - prepTable : Preposition => Prep = table { - ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ; - ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "laga" ; - la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ; - u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ; - noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ; + prepTable : PrepositionPlus => Prep = table { + P Ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ; + P Ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "laga" ; + P La => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ; + P U => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ; + P NoPrep => mkPrep [] "i" "ku" "na" "idin" "la" ; -- impersonal subject clitic combining with object clitics. - passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la" + Passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la" } ; prepCombTable : Agreement => PrepCombination => Str = table { - Sg1 => table { ugu => "iigu" ; uga => "iiga" ; - ula => "iila" ; kaga => "igaga" ; - kula => "igula" ; kala => "igala" ; + Sg1 => table { Ugu => "iigu" ; Uga => "iiga" ; + Ula => "iila" ; Kaga => "igaga" ; + Kula => "igula" ; Kala => "igala" ; Single p => (prepTable ! p).s ! Sg1 } ; - Sg2 => table { ugu => "kuugu" ; uga => "kaaga" ; - ula => "kuula" ; kaga => "kaaga" ; - kula => "kugula" ; kala => "kaala" ; + Sg2 => table { Ugu => "kuugu" ; Uga => "kaaga" ; + Ula => "kuula" ; Kaga => "kaaga" ; + Kula => "kugula" ; Kala => "kaala" ; Single p => (prepTable ! p).s ! Sg2 } ; Pl1 Excl => - table { ugu => "noogu" ; uga => "nooga" ; - ula => "noola" ; kaga => "nagaga" ; - kula => "nagula" ; kala => "nagala" ; + table { Ugu => "noogu" ; Uga => "nooga" ; + Ula => "noola" ; Kaga => "nagaga" ; + Kula => "nagula" ; Kala => "nagala" ; Single p => (prepTable ! p).s ! Pl1 Excl } ; Pl1 Incl => - table { ugu => "inoogu" ; uga => "inooga" ; - ula => "inoola" ; kaga => "inagaga" ; - kula => "inagula" ; kala => "inagala" ; + table { Ugu => "inoogu" ; Uga => "inooga" ; + Ula => "inoola" ; Kaga => "inagaga" ; + Kula => "inagula" ; Kala => "inagala" ; Single p => (prepTable ! p).s ! Pl1 Incl } ; - - Pl2 => table { ugu => "idiinku" ; uga => "idiinka" ; - ula => "idiinla" ; kaga => "idinkaga" ; - kula => "idinkula" ; kala => "idinkala" ; + Pl2 => table { Ugu => "idiinku" ; Uga => "idiinka" ; + Ula => "idiinla" ; Kaga => "idinkaga" ; + Kula => "idinkula" ; Kala => "idinkala" ; Single p => (prepTable ! p).s ! Pl2 } ; Impers => - table { ugu => "loogu" ; uga => "looga" ; - ula => "loola" ; kaga => "lagaga" ; - kula => "lagula" ; kala => "lagala" ; + table { Ugu => "loogu" ; Uga => "looga" ; + Ula => "loola" ; Kaga => "lagaga" ; + Kula => "lagula" ; Kala => "lagala" ; Single p => (prepTable ! p).s ! Impers } ; - a => table { ugu => "ugu" ; uga => "uga" ; - ula => "ula" ; kaga => "kaga" ; - kula => "kula" ; kala => "kala" ; + a => table { Ugu => "ugu" ; Uga => "uga" ; + Ula => "ula" ; Kaga => "kaga" ; + Kula => "kula" ; Kala => "kala" ; Single p => (prepTable ! p).s ! a } } ; --- TODO: Negationen má `inte' skrivs samman med en föregående preposition. - -------------------------------------------------------------------------------- -- Adjectives @@ -620,7 +617,8 @@ oper VerbPhrase : Type = Verb ** Complement ** { adv : Str ; - c2, c3 : Preposition ; -- can combine together and with object pronoun(s?) + c2 : PrepositionPlus ; -- hack to allow passives + c3 : Preposition ; -- can combine together and with object pronoun(s?) obj2 : {s : Str ; a : AgreementPlus} ; secObj : Str ; -- if two overt pronoun objects } ; @@ -631,17 +629,18 @@ oper comp = \\_ => <[],[]> ; pred = NoPred ; adv = [] ; - c2,c3 = noPrep ; + c2 = P NoPrep ; + c3 = NoPrep ; obj2 = {s = [] ; a = Unassigned} ; secObj = [] } ; useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** { - c2 = v2.c2 + c2 = P v2.c2 } ; passV2 : Verb2 -> VerbPhrase = \v2 -> useV v2 ** { - c2 = passive ; + c2 = Passive ; c3 = v2.c2 ; } ; @@ -649,8 +648,8 @@ oper comp = \\agr => let cmp = vps.comp ! agr in {p1 = np.s ++ cmp.p1 ; -- if object is a noun, it will come before verb in the sentence. -- if object is a pronoun, np.s is empty. - p2 = cmp.p2 ++ compl np.a vps ++ vps.secObj} -- object combines with the preposition of the verb. - } ; -- secObj in case there was a ditransitive verb. + p2 = cmp.p2 ++ compl np.a vps} -- object combines with the preposition of the verb. + } ; compl : AgreementPlus -> VerbPhrase -> Str = \a,vp -> let agr = case a of {IsPron x => x ; _ => Pl3} ; @@ -687,12 +686,12 @@ oper insertAdv : VerbPhrase -> Adverb -> VerbPhrase = \vp,adv -> case adv.c2 of { - noPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP + NoPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP prep => case of { - => insertComp adv.np ; -- should cover for obligatory argument that is not introduced with a preposition - <_,_, noPrep> => insertComp (vp ** {c3 = adv.c2}) adv.np ; +

=> insertComp (vp ** {c2 = P adv.c2}) adv.np ; -- should cover for obligatory argument that is not introduced with a preposition + <_ ,_ ,NoPrep> => insertComp (vp ** {c3 = adv.c2}) adv.np ; -- if complement slots are full, put preposition just as a string. TODO check word order. - _ => vp ** {adv = (prepTable ! adv.c2).s ! adv.np.a ++ adv.np.s ! Abs} + _ => vp ** {adv = (prepTable ! P adv.c2).s ! adv.np.a ++ adv.np.s ! Abs} } } ; -------------------------------------------------------------------------------- @@ -709,11 +708,11 @@ oper => {fin = presV vp ; inf = [] } ; => {fin = presV copula ; inf = vp.s ! VInf } ; ---- just guessing => {fin = pastV vp ; inf = [] } ; - => {fin = pastV (aux "jir" vp) ; inf = []} ; - => {fin = presV (aux "doon" vp) ; inf = []} ; - => {fin = pastV (aux "doon" vp) ; inf = []} ; - <_,Simul> => {fin = presV vp ; inf = []} ; -- TODO conditional - <_,Anter> => {fin = pastV vp ; inf = []} -- TODO conditional + => {fin = pastV (cSug "jir") ; inf = vp.s ! VInf} ; + => {fin = presV (cSug "doon") ; inf = vp.s ! VInf} ; + => {fin = pastV (cSug "doon") ; inf = vp.s ! VInf} ; + => {fin = presV have_V ; inf = vp.s ! VInf} ; -- TODO check + => {fin = pastV have_V ; inf = vp.s ! VInf} -- TODO check } where { pastV : Verb -> Str = \v -> @@ -721,9 +720,6 @@ oper Pos => v.s ! VPast Simple agr } ; presV : Verb -> Str = \v -> v.s ! VPres Simple agr p ; - - aux : Str -> Verb -> Verb = \jir,v -> - let jir : Verb = cSug jir in {s = \\vf => v.s ! VInf ++ jir.s ! vf} } ; stmarker : Agreement => Polarity => Str = \\a,b => diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index 9308d7ed..c8bc9dcc 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -10,34 +10,41 @@ lin -- : NP -> VP -> Cl PredVP np vps = let vp = case vps.c2 of { - passive => complSlash (insertComp vps np) ; + Passive => complSlash (insertComp vps np) ; _ => complSlash vps } ; - subj = case vps.c2 of {passive => impersNP ; _ => np} ; + subj = case vps.c2 of {Passive => impersNP ; _ => np} ; in { s = \\isQ,t,a,p => let predRaw : {fin : Str ; inf : Str} = vf t a p subj.a vp ; - pred : {fin : Str ; inf : Str} = case vp.pred of { - NoCopula => {fin,inf = []} ; - _ => predRaw + pred : {fin : Str ; inf : Str} = case of { + => {fin,inf = []} ; + _ => predRaw } ; subjnoun : Str = if_then_Str np.isPron [] (subj.s ! Nom) ; subjpron : Str = if_then_Str np.isPron (subj.s ! Nom) [] ; - obj : {p1,p2 : Str} = vp.comp ! subj.a ; - stm : Str = - case of { - => "ma" ; - <_,Pos,Copula|NoCopula,Sg3 _|Impers> => "waa" ; - -- _ => stmarker ! np.a ! b } -- marker+pronoun contract - _ => case of { - => "waa" ++ subjpron ; -- to force some string from NP to show in the tree - => "ma" ++ subjpron ; - => stmarkerNoContr ! subj.a ! p }} ; + obj : {p1,p2 : Str} = + let o : {p1,p2 : Str} = vp.comp ! subj.a ; + in case p of { + Pos => o ; + Neg => {p2 = [] ; p1 = o.p1 ++ o.p2 ++ BIND} -- object pronoun, prepositions and negation all contract + } ; + stm : Str = case of { + => "waa" ; + => "ma" ; + _ => case of { + => "waa" ++ subjpron ; -- to force some string from NP to show in the tree + => "ma" ++ subjpron ; + => stmarkerNoContr ! subj.a ! p + } + } ; + in subjnoun -- subject if it's a noun ++ obj.p1 -- object if it's a noun - ++ stm -- sentence type marker + possible subj. pronoun + ++ stm -- sentence type marker + possible subj. pronoun ++ vp.adv ---- TODO word order - ++ obj.p2 -- object if it's a pronoun + ++ obj.p2 -- object if it's a pronoun + ++ vp.secObj -- "second object" + ++ pred.inf -- potential infinitive/participle ++ pred.fin -- the verb inflected - ++ pred.inf -- potential participle } ; {- -- : SC -> VP -> Cl ; -- that she goes is good diff --git a/src/somali/VerbSom.gf b/src/somali/VerbSom.gf index 29baad2d..a9069926 100644 --- a/src/somali/VerbSom.gf +++ b/src/somali/VerbSom.gf @@ -12,7 +12,7 @@ lin PassV2 = ResSom.passV2 ; {- -- : VV -> VP -> VP ; - ComplVV vv vp = ; + ComplVV vv vp = ; -- TODO Sayeed p. 169 -- : VS -> S -> VP ; ComplVS vs s = ; @@ -96,7 +96,7 @@ lin -- : VP -> Prep -> VPSlash ; -- live in (it) -- NB. We need possibly a MissingArg kind of solution here too -- VPSlashPrep vp prep = vp ** - -- { c2 = case vp.c2 of { noPrep => prep.prep ; + -- { c2 = case vp.c2 of { NoPrep => prep.prep ; -- x => x }} ; @@ -133,7 +133,7 @@ lin CompAdv adv = { comp = \\a => ; + , adv.s ++ prepCombTable ! adv.np.a ! Single (P adv.c2)> ; pred = Copula ; } ;