diff --git a/src/somali/CatSom.gf b/src/somali/CatSom.gf index 384fab360..a6dd71464 100644 --- a/src/somali/CatSom.gf +++ b/src/somali/CatSom.gf @@ -9,7 +9,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { S = ResSom.Sentence ; QS = SS ; - RS = {s : State => Gender => Case => Str} ; + RS = {s : State => GenNum => Case => Str} ; -- relative sentence. Tense and polarity fixed, -- but agreement may depend on the CN/NP it modifies. diff --git a/src/somali/ConjunctionSom.gf b/src/somali/ConjunctionSom.gf index 391ff78a1..5c40e803b 100644 --- a/src/somali/ConjunctionSom.gf +++ b/src/somali/ConjunctionSom.gf @@ -44,9 +44,9 @@ lincat [RS] = {s1,s2 : State => Gender => Case => Str} ; lin - BaseRS = twoTable3 State Gender Case ; - ConsRS = consrTable3 State Gender Case comma ; - ConjRS = conjunctRSTable State Gender Case ; + BaseRS = twoTable3 State GenNum Case ; + ConsRS = consrTable3 State GenNum Case comma ; + ConjRS = conjunctRSTable ; {- lincat @@ -120,7 +120,7 @@ oper s = \\c => co.s1 ++ xs.s1 ! Abs ++ co.s2 ! xs.st ++ xs.s2 ! c }) ; - conjunctRSTable : ConjDistr -> {s1,s2 : State => Gender => Case => Str} -> RS = \co,xs -> lin RS (xs ** { + conjunctRSTable : ConjDistr -> {s1,s2 : State => GenNum => Case => Str} -> RS = \co,xs -> lin RS (xs ** { s = \\st,g,c => co.s1 ++ xs.s1 ! st ! g ! c ++ co.s2 ! st diff --git a/src/somali/NounSom.gf b/src/somali/NounSom.gf index 46bc36167..00c1753d6 100644 --- a/src/somali/NounSom.gf +++ b/src/somali/NounSom.gf @@ -83,7 +83,7 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { which RS are restrictive and which appositive, as it is semantic. -} RelNP np rs = np ** { - s = \\c => objpron np ! c ++ "oo" ++ rs.s ! Indefinite ! npgender np ! c ; + s = \\c => objpron np ! c ++ "oo" ++ rs.s ! Indefinite ! npgennum np ! c ; isPron = False ; } ; @@ -245,7 +245,7 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { mod = \\st,n,c => --what to do with subject case if there's both adj and RS? cn.mod ! st ! n ! Abs ++ andConj st cn.hasMod - ++ rs.s ! st ! gender cn ! c ; + ++ rs.s ! st ! gennum cn n ! c ; hasMod = True ; } ; diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index 786bd8d69..9714b17aa 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -188,8 +188,17 @@ oper gender : {gda : GenderDefArt} -> Gender = \n -> case n.gda of {FM _ _ => Fem ; _ => Masc} ; - npgender : {a : Agreement} -> Gender = \n -> - case n.a of {Sg3 Fem => Fem ; _ => Masc} ; + + gennum : {gda : GenderDefArt} -> Number -> GenNum = \gda,n -> + case n of {Pl => PlInv ; Sg => + case gda.gda of {FM _ _ => SgFem ; _ => SgMasc} + } ; + + npgennum : {a : Agreement} -> GenNum = \n -> + case n.a of { + Sg2|Sg3 Fem => SgFem ; + Sg1|Sg3 Masc => SgMasc ; + _ => PlInv } ; -------------------------------------------------------------------------------- -- Numerals @@ -272,12 +281,12 @@ param | VNegPast Aspect | VPast Aspect VAgr | VImp Number Polarity --- | VRelShort -- "som är/har/…" TODO is this used in other verbs? - | VRel Gender ; {- Sayeed p. 95-96 + ch 8 - Reduced present general in relative clauses; as absolutive - 1/2SG/3SG M/2PL/3PL sugá (VRel Masc) - 3 SG F sugtá (VRel Fem) - 1PL sugná -- not yet in the grammar -} + | VRel GenNum {- Sayeed p. 95-96 + ch 8 + Reduced present general in relative clauses; as absolutive + 1/2SG/3SG M/2PL/3PL suga (VRel MascSg) + 3 SG F sugta (VRel FemSg) + 1PL sugna (VRel PlInv) -} + | VNegCond GenNum ; VAgr = Sg1_Sg3Masc diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index eee914013..553be7741 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -13,11 +13,11 @@ lin These forms are found in VRel in VP, and aren't chosen by predVP, so we put them in manually in RelVP. -} - RelVP rp vp = {s = \\g,c,t,a,p => + RelVP rp vp = {s = \\gn,c,t,a,p => let cls = predVPSlash impersNP vp ; rclSubord = mergeRCl (cls.s ! True) ; rclStatement = mergeRCl (cls.s ! False) ; - in rp.s ++ case of { + in rp.s ++ case of { => linVP (VRel g) vp ; -- reduced present only in absolutive <_,Nom,Pres,Simul,Pos> => rclStatement.s ! t ! a ! p ; -- the usual forms, not subordinate _ => rclSubord.s ! t ! a ! p } -- the rest is Subord because of negation. diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 2f3198a5a..84bf74d96 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -521,7 +521,7 @@ oper VPres Progressive Pl3_ pol => progr + "aan" ; VPast Simple Sg1_Sg3Masc - => qaat + ay ; + => qaat + ay ; VPast Simple Sg2_Sg3Fem => arag + t + ay ; -- t, d or s VPast Simple Pl1_ => arag + n + ay ; VPast Simple Pl2_ => arag + t + "een" ; -- t, d or s @@ -537,6 +537,10 @@ oper VNegPast Simple => arkin ; VNegPast Progressive => progr + "n" ; + -- TODO check conjugations 2 and 3 + VNegCond PlInv => arag + n + "een" ; + VNegCond SgMasc => qaat + "een" ; -- for most verbs same as VPast Simple Pl3_ + VNegCond SgFem => arag + t + "een" ; -- for most verbs same as VPast Simple Pl2_ VImp Sg Pos => arag ; VImp Pl Pos => qaat + "a" ; @@ -544,9 +548,11 @@ oper VImp Pl Neg => qaat + "ina" ; VInf => arki ; --- VRelShort => arki ; -- TODO does this exist? - VRel Masc => qaat + "a" ; - VRel Fem => arag + t + "a" } ; + VRel SgMasc => qaat + "a" ; + VRel SgFem => arag + t + "a" ; + VRel PlInv => arag + "na" + + } ; sii, dhex = [] ; } ; @@ -609,6 +615,9 @@ oper VPast _ Pl2_ => "ahaydeen" ; VPast _ Pl3_ => "ahaayeen" ; VNegPast _ => "ahi" ; + VNegCond SgMasc => "ahaadeen" ; -- 1SG/3 SG M/3PL + VNegCond SgFem => "ahaateen" ; -- 2SG/3 SG F/2PL + VNegCond PlInv => "ahaanneen" ; -- 1PL --VRelShort => "ah" ; VRel _ => "ah" ; -- TODO find right forms VInf => "ahaan" ; @@ -627,7 +636,8 @@ oper VPres _ Pl1_ Pos => "leenahay" ; VPres _ Pl2_ Pos => "leedihiin" ; VPres _ Pl3_ Pos => "leeyihiin" ; - VPast asp agr => "l" + copula.s ! VPast asp agr ; + VPast asp agr => "l" + copula.s ! VPast asp agr ; + VNegCond agr => "l" + copula.s ! VNegCond agr ; -- VRelShort => "leh" ; VRel _ => "leh" ; -- TODO find right forms x => hold_V.s ! x } @@ -764,7 +774,7 @@ oper Clause : Type = {s : ClType => Tense => Anteriority => Polarity => BaseCl} ; ClSlash : Type = {s : Bool {-is subordinate-} => Tense => Anteriority => Polarity => BaseCl} ; Sentence : Type = {s : Bool {-is subordinate-} => BaseCl} ; - RClause : Type = {s : Gender => Case => Tense => Anteriority => Polarity => Str} ; + RClause : Type = {s : GenNum => Case => Tense => Anteriority => Polarity => Str} ; QClause : Type = {s : Tense => Anteriority => Polarity => Str} ; mergeQCl : (Tense => Anteriority => Polarity => BaseCl) -> QClause = mergeSTM True ; @@ -847,15 +857,15 @@ oper Subord => vfSubord ; _ => vfStatement } ; vfStatement : VFun = \t,ant,p,agr,vp -> - case of { + case of { + => {fin = pastV have_V ; inf = vp.s ! VInf} ; + => {fin = condNegV vp ; inf = []} ; => {fin = presV vp ; inf = [] } ; => {fin = pastV vp ; inf = [] } ; => {fin = presCopula ! agrPol ; inf = vp.s ! VInf } ; ---- just guessing => {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 = pastV have_V ; inf = vp.s ! VInf} ; -- TODO check - => {fin = pastV have_V ; inf = vp.s ! VInf} -- TODO check + => {fin = pastV (cSug "doon") ; inf = vp.s ! VInf} } where { agrPol : {agr:Agreement ; pol:Polarity} = {agr=agr; pol=p} ; @@ -864,7 +874,14 @@ oper Pos => v.s ! VPast Simple (agr2vagr agr) } ; presV : Verb -> Str = \v -> v.s ! VPres Simple (agr2vagr agr) p ; - } ; + + condNegV : Verb -> Str = \v -> case agr of { + Sg2|Sg3 Fem + |Pl2 => v.s ! VNegCond SgFem ; + Pl1 _ => v.s ! VNegCond PlInv ; + _ => v.s ! VNegCond SgMasc --Sg1|Sg3 Masc|Pl3|Impers +} + } ; vfSubord : VFun = \t,ant,p,agr,vp -> case of {