diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 63ca2a2cd..b983f3119 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -419,8 +419,11 @@ oper -------------------------------------------------------------------------------- -- Verbs - Verb : Type = { + BaseVerb : Type = { s : VForm => Str ; + } ; + + Verb : Type = BaseVerb ** { sii : Str ; -- closed class of particles: sii, soo, kala, wada (Sayeed 171) dhex : Str ; -- closed class of adverbials: hoos, kor, dul, dhex, … } ; @@ -629,13 +632,13 @@ oper pred : PredType ; -- to choose right sentence type marker and copula } ; - VerbPhrase : Type = Verb ** Complement ** { + VerbPhrase : Type = BaseVerb ** Complement ** BaseAdv ** { -- Prepositions can combine together and with object pronoun. c2 : PrepositionPlus ; -- hack to implement passives more efficiently: c3 : Preposition ; -- if c2 is Passive, the real preposition is in c3. obj2 : {s : Str ; a : AgreementPlus} ; secObj : Str ; -- if two overt pronoun objects - berri : Str ; -- adverb that goes before verbal group + vComp : Str ; -- VV complement miscAdv : Str ; -- dump for any other kind of adverb, that isn't } ; -- in a closed class of particles or made with PrepNP. @@ -644,7 +647,7 @@ oper useV : Verb -> VerbPhrase = \v -> v ** { comp = \\_ => <[],[]> ; pred = NoPred ; - berri,miscAdv = [] ; + vComp,berri,miscAdv = [] ; c2 = P NoPrep ; c3 = NoPrep ; obj2 = {s = [] ; a = Unassigned} ; @@ -674,7 +677,7 @@ oper insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np -> let noun : Str = case of { => np.s ! Abs ; - => (pronTable ! np.a).sp ; -- long object pronoun for 3rd person object + -- => (pronTable ! np.a).sp ; -- uncomment if you want to add long object pronoun for 3rd person object _ => [] } -- no long object for other pronouns in case vp.obj2.a of { Unassigned => @@ -701,10 +704,9 @@ oper } ; insertAdv : VerbPhrase -> Adverb -> VerbPhrase = \vp,adv -> - case of { - -- a) the adverb is not formed with PrepNP, e.g. "tomorrow" - | <_,True> -- b) is formed with PrepNP, and has 3rd person obj. - => vp ** adv'' ; + case of { + => vp ** adv'' ; -- a) the adverb is not formed with PrepNP, e.g. "tomorrow" + <_,True,False> => vp ** adv'' ; -- b) is formed with PrepNP, and has 3rd person obj, which is a noun. _ => case of { -- if free complement slots, introduce adv.np with insertComp

=> insertComp (vp ** {c2 = P adv.c2}) adv.np ** adv' ; @@ -713,12 +715,12 @@ oper -- if complement slots are full, just insert strings. _ => vp ** adv'' } - } where { - adv' : {sii,dhex,berri : Str} = adv ; -- adv.np done with insertComp - adv'' : {sii,dhex,berri,miscAdv : Str} -- adv.np inserted into miscAdv - = adv ** {dhex = (prepTable ! P adv.c2).s ! adv.np.a ++ adv.dhex ; - miscAdv = adv.np.s ! Abs} -- TODO: check case - } ; + } where { + adv' : {sii,dhex,berri : Str} = adv ; -- adv.np done with insertComp + adv'' : {sii,dhex,berri,miscAdv : Str} -- adv.np inserted into miscAdv + = adv ** {dhex = (prepTable ! P adv.c2).s ! adv.np.a ++ adv.dhex ; + miscAdv = adv.np.s ! Abs} -- TODO: check case + } ; -------------------------------------------------------------------------------- -- Sentences etc. Clause : Type = {s : Bool {-is question-} => Tense => Anteriority => Polarity => Str} ; @@ -727,6 +729,56 @@ oper ClSlash, Sentence : Type = SS ; ---- TODO + predVP : NounPhrase -> VerbPhrase -> Clause = \np,vps -> { + s = \\isQ,t,a,p => + let predRaw : {fin : Str ; inf : Str} = vf t a p subj.a vp ; + 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} = + let o : {p1,p2 : Str} = vp.comp ! subj.a ; + bind : Str = case of { + => [] ; + _ => BIND } ; + 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 ; -- TODO check subj pron or not? + => stmarkerNoContr ! subj.a ! p + } + } ; + in wordOrder subjnoun subjpron stm obj pred vp ; + } where { + vp = case vps.c2 of { + Passive => complSlash (insertComp vps np) ; + _ => complSlash vps } ; + subj = case vps.c2 of {Passive => impersNP ; _ => np} ; + } ; + + wordOrder : (sn,sp,stm : Str) -> {p1,p2 : Str} -> {fin,inf : Str} -> VerbPhrase -> Str = + \subjnoun,subjpron,stm,obj,pred,vp -> vp.berri -- AdV + ++ subjnoun -- subject if it's a noun + ++ obj.p1 -- object if it's a noun + ++ stm -- sentence type marker + possible subj. pronoun + ++ obj.p2 -- object if it's a pronoun + ++ vp.sii -- restricted set of particles + ++ vp.dhex -- restricted set of nouns/adverbials + ++ vp.secObj -- "second object" + ++ vp.vComp -- VV complement + ++ pred.inf -- potential infinitive/participle + ++ pred.fin -- the verb inflected + ++ vp.miscAdv ; ---- NB. Only used if there are several adverbs. + ---- Primary places for adverbs are obj, sii or dhex. + vf : Tense -> Anteriority -> Polarity -> Agreement -> Verb -> {fin : Str ; inf : Str} = \t,ant,p,agr,vp -> case of { @@ -736,7 +788,7 @@ oper => {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 => {fin = pastV have_V ; inf = vp.s ! VInf} -- TODO check } where { @@ -747,6 +799,10 @@ oper presV : Verb -> Str = \v -> v.s ! VPres Simple agr p ; } ; + infVP : VerbPhrase -> Str = \vp -> + let inf = (vf Past Anter Pos (Sg3 Masc) vp) ** {fin=[]} + in wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; + stmarker : Agreement => Polarity => Str = \\a,b => let stm = if_then_Pol b "w" "m" in stm + subjpron ! a ; @@ -767,7 +823,7 @@ oper -- linrefs oper - linVP : VerbPhrase -> Str = \vp -> let obj = vp.comp ! Sg3 Masc in obj.p1 ++ obj.p2 ++ vp.s ! VInf ; ---- + linVP : VerbPhrase -> Str = infVP ; linCN : CNoun -> Str = \cn -> cn.s ! NomSg ++ cn.mod ! Sg ! Abs ; linAdv : Adverb -> Str = \adv -> adv.berri diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index d05027cdf..4dd5b7c9c 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -8,49 +8,8 @@ lin --2 Clauses -- : NP -> VP -> Cl - PredVP np vps = - let vp = case vps.c2 of { - Passive => complSlash (insertComp vps np) ; - _ => complSlash vps } ; - 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 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} = - let o : {p1,p2 : Str} = vp.comp ! subj.a ; - bind : Str = if_then_Str (isP3 vp.obj2.a) [] BIND ; - 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 - } - } ; + PredVP = predVP ; - in vp.berri -- AdV - ++ subjnoun -- subject if it's a noun - ++ obj.p1 -- object if it's a noun - ++ stm -- sentence type marker + possible subj. pronoun - ++ obj.p2 -- object if it's a pronoun - ++ vp.sii -- restricted set of particles - ++ vp.dhex -- restricted set of nouns/adverbials - ++ vp.secObj -- "second object" - ++ pred.inf -- potential infinitive/participle - ++ pred.fin -- the verb inflected - ++ vp.miscAdv ---- NB. Only used if there are several adverbs. - ---- Primary places for adverbs are obj, sii or dhex. - } ; {- -- : SC -> VP -> Cl ; -- that she goes is good PredSCVP sc vp = ; diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index 17230ae65..4715ec0bf 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -119,7 +119,7 @@ lin with_Prep = mkPrep la ; -- Pron -- Pronouns are closed class, no constructor in ParadigmsSom. - it_Pron = he_Pron ** {s = \\_ => []} ; + it_Pron = he_Pron ** {s = \\_ => [] ; sp = []} ; i_Pron = pronTable ! Sg1 ; youPol_Pron, -- TODO check youSg_Pron = pronTable ! Sg2 ; @@ -160,10 +160,9 @@ lin yes_Utt = ss "yes" ; -- Verb lin have_V2 = mkV2 have_V noPrep ; -{- -lin can8know_VV = mkV "" ; -- can (capacity) -lin can_VV = mkV "" ; -- can (possibility) -lin must_VV = mkV "" ; +lin can8know_VV = can_VV ; -- can (capacity) +lin can_VV = mkV "kar" ; -- can (possibility) +{-lin must_VV = mkV "" ; lin want_VV = mkV "" ; diff --git a/src/somali/VerbSom.gf b/src/somali/VerbSom.gf index d740fca71..512459a20 100644 --- a/src/somali/VerbSom.gf +++ b/src/somali/VerbSom.gf @@ -10,10 +10,12 @@ lin -- : V2 -> VP ; -- be loved PassV2 = ResSom.passV2 ; -{- - -- : VV -> VP -> VP ; - ComplVV vv vp = ; -- TODO Sayeed p. 169 + -- : VV -> VP -> VP ; + ComplVV vv vp = useV vv ** { -- check Sayeed p. 169 + vComp = infVP vp + } ; +{- -- : VS -> S -> VP ; ComplVS vs s = ;