diff --git a/src/somali/AdverbSom.gf b/src/somali/AdverbSom.gf index cf4225258..f57e900d1 100644 --- a/src/somali/AdverbSom.gf +++ b/src/somali/AdverbSom.gf @@ -1,4 +1,4 @@ -concrete AdverbSom of Adverb = CatSom ** open ResSom, ParamSom, Prelude in { +concrete AdverbSom of Adverb = CatSom ** open ResSom, ParamSom, ParadigmsSom, Prelude in { lin @@ -24,15 +24,10 @@ lin -- Subordinate clauses can function as adverbs. -- : Subj -> S -> Adv ; --- SubjS subj s = {} ; + SubjS subj s = mkAdv (subj.s ++ s.s ! True) ; -- Comparison adverbs also work as numeral adverbs. --AdnCAdv : CAdv -> AdN ; -- less (than five) --AdnCAdv cadv = {s = } ; } ; - -{- -gt PrepNP in_Prep (DetCN (DetQuant DefArt ?) (UseN ?) | l -bind -gt PrepNP from_Prep (DetCN (DetQuant DefArt ?) (UseN ?)) | l -bind --} diff --git a/src/somali/CatSom.gf b/src/somali/CatSom.gf index 5ec479ba8..1b6f06df8 100644 --- a/src/somali/CatSom.gf +++ b/src/somali/CatSom.gf @@ -8,8 +8,8 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { -- Constructed in SentenceSom, and also in IdiomSom S = ResSom.Sentence ; - QS = ResSom.Sentence ; - RS = { s : Agreement => Str } ; + QS = SS ; + RS = {s : {-Agreement =>-} Str} ; -- TODO -- relative sentence. Tense and polarity fixed, -- but agreement may depend on the CN/NP it modifies. @@ -28,11 +28,9 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { IDet = ResSom.Determiner ; -- interrogative determiner e.g. "how many" IQuant = ResSom.Quant ; -- interrogative quantifier e.g. "which" ---2 Relative clauses and pronouns +--2 Subord clauses and pronouns --- Constructed in RelativeSom. - - RCl = ResSom.RClause ; + RCl = ResSom.QClause ; RP = SS ; --2 Verb phrases @@ -85,7 +83,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { -- Constructed in StructuralSom. Conj = { s1,s2 : Str ; n : Number } ; - Subj = { s : Str ; isPre : Bool } ; --ba+dut vs. dut+en + Subj = SS ; Prep = ResSom.Prep ** {c2 : Preposition ; berri, sii, dhex : Str} ; diff --git a/src/somali/ExtendSom.gf b/src/somali/ExtendSom.gf index a73a83a6e..e696a76d9 100644 --- a/src/somali/ExtendSom.gf +++ b/src/somali/ExtendSom.gf @@ -1,7 +1,15 @@ --# -path=.:../common:../abstract -concrete ExtendSom of Extend = {} ; - -- CatSom ** ExtendFunctor +concrete ExtendSom of Extend = CatSom + -- ** ExtendFunctor -- Add this back when all relevant functions are implemented -- with (Grammar=GrammarSom) - -- ** open Prelude, ResSom in { - -- } ; + ** open Prelude, ResSom in { + +lin + -- : NP -> SSlash -> Utt ; -- her I love -- Sayeed p. 189- + FocusObj np sslash = + + -- FocusAdv : Adv -> S -> Utt ; -- today I will sleep + -- FocusAdV : AdV -> S -> Utt ; -- never will I sleep + -- FocusAP : AP -> NP -> Utt ; -- green was the tree +} ; diff --git a/src/somali/NounSom.gf b/src/somali/NounSom.gf index 41b08eaf3..6b634ffa3 100644 --- a/src/somali/NounSom.gf +++ b/src/somali/NounSom.gf @@ -69,7 +69,9 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { --AdvNP,ExtAdvNP = \np,adv -> np ** {} ; --adverbs are complicated -- : NP -> RS -> NP ; -- Paris, which is here - -- RelNP np rs = np ** { s = \\c => rs.s ! np.agr ++ np.s ! c } ; + RelNP np rs = np ** { + s = \\c => np.s ! c ++ rs.s + } ; -- Determiners can form noun phrases directly. @@ -225,11 +227,13 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { hasMod = True } ; -{- + -- : CN -> RS -> CN ; - RelCN cn rs = cn ** { } ; - + RelCN cn rs = cn ** { + mod = \\n,c => cn.mod ! n ! c ++ rs.s + } ; +{- -- : CN -> Adv -> CN ; AdvCN cn adv = cn ** { } ; diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index fbf98ac5d..f1d380934 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -280,4 +280,12 @@ oper Sg2|Sg3 Fem => Sg2_Sg3Fem ; Pl1 _ => Pl1_ ; Pl2 => Pl2_ ; Pl3 => Pl3_ } ; + +-------------------------------------------------------------------------------- +-- Clauses + +param + + ClType = Statement | Question | Subord ; + } diff --git a/src/somali/PhraseSom.gf b/src/somali/PhraseSom.gf index 02ceafa37..8644c3bad 100644 --- a/src/somali/PhraseSom.gf +++ b/src/somali/PhraseSom.gf @@ -3,7 +3,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { lin PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; - UttS s = s ; + UttS s = {s = s.s ! False} ; UttQS qs = qs ; UttImpSg pol imp = diff --git a/src/somali/QuestionSom.gf b/src/somali/QuestionSom.gf index ccf9be937..768da0d09 100644 --- a/src/somali/QuestionSom.gf +++ b/src/somali/QuestionSom.gf @@ -6,7 +6,7 @@ concrete QuestionSom of Question = CatSom ** open lin -- : Cl -> QCl ; - QuestCl cl = {s = cl.s ! True} ; + QuestCl cl = {s = cl.s ! Question} ; -- : IP -> VP -> QCl ; -- QuestVP ip vp = ; diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index a820850d4..41d7db84b 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -1,36 +1,36 @@ concrete RelativeSom of Relative = CatSom ** open ResSom, Prelude, (NS=NounSom), (SS=StructuralSom) in { -{- + lin -- : Cl -> RCl ; -- such that John loves her - RelCl cl = { } ; + -- RelCl cl = {s = cl.s ! Subord} ; +{- -- Sayeed p. 95-96 + ch 8 Reduced present general in relative clauses; as absolutive 1/2SG/3SG M/2PL/3PL sugá -- same as imperative (TODO check if for all conjugations) -3 SG F sugtá -- doesn't exist -1PL sugná -- doesn't exist +3 SG F sugtá -- not yet in the grammar +1PL sugná -- not yet in the grammar +(18) (a) nimánka buugágga keená men-the books-the bring +'the men who bring the books' +(b) buugágga nimanku keenàan +books-the men-the bring 'the books which the men bring' +-} -- : RP -> VP -> RCl ; - RelVP rp vp = ; + RelVP rp vp = RelSlash rp (predVPSlash emptyNP vp) ; -- : RP -> ClSlash -> RCl ; -- whom John loves - RelSlash rp cls = ; + RelSlash rp cls = { + s = \\t,a,p => rp.s ++ cls.s ! True ! t ! a ! p + } ; -- : RP ; - IdRP = { s = "" } ; + IdRP = {s = "waxa"} ; -- : Prep -> NP -> RP -> RP ; -- the mother of whom - FunRP prep np rp = { s = applyPost prep whom ++ np.s ! Abs } - where { num = case np.agr of { - Sg3 _ => NS.NumSg ; - _ => NS.NumPl } ; - whom = NS.DetNP (NS.DetQuant SS.which_IQuant num) } ; - - - --} + --FunRP prep np rp = {} ; } diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 1eddc59af..442a574c3 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -749,19 +749,24 @@ oper } ; -------------------------------------------------------------------------------- -- Sentences etc. - Clause : Type = {s : Bool {-is question-} => Tense => Anteriority => Polarity => Str} ; + Clause : Type = {s : ClType => Tense => Anteriority => Polarity => Str} ; QClause : Type = {s : Tense => Anteriority => Polarity => Str} ; - RClause, - ClSlash, - Sentence : Type = SS ; ---- TODO + ClSlash : Type = {s : Bool {-is subordinate-} => Tense => Anteriority => Polarity => Str} ; + Sentence : Type = {s : Bool {-is subordinate-} => Str} ; + + predVPSlash : NounPhrase -> VPSlash -> ClSlash = \np,vps -> + let cl = predVP np vps in {s = table { + True => cl.s ! Subord ; + False => cl.s ! Statement } + } ; 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 = []} ; - <_ , _,Copula> => {fin = presCopula ! {agr=subj.a ; pol=p} ; inf=[]} ; - _ => predRaw + s = \\cltyp,t,a,p => + let predRaw : {fin : Str ; inf : Str} = vf cltyp t a p subj.a vp ; + pred : {fin : Str ; inf : Str} = case of { + => {fin,inf = []} ; + <_ , _, Copula> => {fin = presCopula ! {agr=subj.a ; pol=p} ; inf=[]} ; + _ => predRaw } ; subjnoun : Str = if_then_Str np.isPron np.empty (subj.s ! Nom) ; subjpron : Str = if_then_Str np.isPron (subj.s ! Nom) np.empty ; @@ -774,21 +779,18 @@ oper 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 - } - } ; + stm : Str = case cltyp of { + Subord => if_then_Pol p [] "aan" ++ subjpron ; -- if we form a ClSlash, no sentence type marker; negation with aan (Sayeed p. 210) + Question => "ma" ; -- TODO find out how negative questions work + Statement => case of { + => "waa" ; + _ => stmarkerNoContr ! subj.a ! p }} ; in wordOrder subjnoun subjpron stm obj pred vp ; } where { vp = case vps.isPassive of { True => complSlash (insertComp vps np) ; _ => complSlash vps } ; - subj = case vps.isPassive of {True => impersNP ; _ => np} ; + subj = case vps.isPassive of {True => impersNP ; _ => np} } ; wordOrder : (sn,sp,stm : Str) -> {p1,p2 : Str} -> {fin,inf : Str} -> VerbPhrase -> Str = @@ -806,8 +808,13 @@ oper ++ 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 -> + VFun : Type = Tense -> Anteriority -> Polarity -> Agreement -> Verb + -> {fin : Str ; inf : Str} ; + + vf : ClType -> VFun = \clt -> case clt of { + Subord => vfSubord ; _ => vfStatement } ; + + vfStatement : VFun = \t,ant,p,agr,vp -> case of { => {fin = presV vp ; inf = [] } ; => {fin = pastV vp ; inf = [] } ; @@ -827,17 +834,24 @@ oper presV : Verb -> Str = \v -> v.s ! VPres Simple (agr2vagr agr) p ; } ; + vfSubord : VFun = \t,ant,p,agr,vp -> + case of { + => vfStatement Pres ant Neg agr vp ; + _ => vfStatement t ant p agr vp + } ; -- TODO other relative forms + infVP : VerbPhrase -> Str = \vp -> - let inf = (vf Past Anter Pos (Sg3 Masc) vp) ** {fin=[]} + let inf = {inf = vp.s ! VInf ; fin=[]} in wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; - stmarker : Agreement => Polarity => Str = \\a,b => + stmarkerContr : Agreement => Polarity => Str = \\a,b => let stm = if_then_Pol b "w" "m" in stm + subjpron ! a ; - stmarkerNoContr : Agreement => Polarity => Str = \\a,b => - let stm = if_then_Pol b "waa" "ma" - in stm ++ subjpron ! a ; + stmarkerNoContr : Agreement => Polarity => Str = \\a,p => + case p of { + Pos => "waa" ++ subjpron ! a ; + Neg => "ma" } ; subjpron : Agreement => Str = table { Sg1|Pl1 Excl => "aan" ; diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index 4dd5b7c9c..ebced1044 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -10,14 +10,13 @@ lin -- : NP -> VP -> Cl PredVP = predVP ; -{- - -- : SC -> VP -> Cl ; -- that she goes is good - PredSCVP sc vp = ; + -- : SC -> VP -> Cl ; -- that she goes is good (Sayeed p. 94) + --PredSCVP sc vp = ; --2 Clauses missing object noun phrases -- : NP -> VPSlash -> ClSlash ; - SlashVP np vps = ; - + SlashVP = predVPSlash ; +{- -- : ClSlash -> Adv -> ClSlash ; -- (whom) he sees today AdvSlash cls adv = cls ** insertAdv adv cls ; @@ -26,17 +25,17 @@ lin -- : NP -> VS -> SSlash -> ClSlash ; -- (whom) she says that he loves -- SlashVS np vs ss = {} ; - +-} -- : Temp -> Pol -> ClSlash -> SSlash ; -- (that) she had not seen - UseSlash t p cls = UseCl t p (PredVP he_Pron cls) ; + UseSlash t p cls = {s = \\b => t.s ++ p.s ++ cls.s ! b ! t.t ! t.a ! p.p} ; --2 Imperatives -- : VP -> Imp ; - ImpVP vp = { s = linVP vp } ; + --ImpVP vp = { s = linVP vp } ; --2 Embedded sentences - +{- -- : S -> SC ; EmbedS s = { } ; @@ -50,35 +49,31 @@ lin -} -- : Temp -> Pol -> Cl -> S ; - UseCl t p cl = {s = t.s ++ p.s ++ cl.s ! False ! t.t ! t.a ! p.p} ; + UseCl t p cl = {s = \\b => + let cltyp = if_then_else ClType b Subord Statement in + t.s ++ p.s ++ cl.s ! cltyp ! t.t ! t.a ! p.p + } ; -- : Temp -> Pol -> QCl -> QS ; UseQCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ; -{- -- : Temp -> Pol -> RCl -> RS ; - UseRCl t p cl = { s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p } ; + UseRCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ; --- An adverb can be added to the beginning of a sentence, either with comma ("externally") --- or without: - - -- : Adv -> S -> S ; -- then I will go home - AdvS = advS ; - - -- : Adv -> S -> S ; -- next week, I will go home - ExtAdvS adv = advS {s = adv.s ++ SOFT_BIND ++ ","} ; + -- AdvS : Adv -> S -> S ; -- then I will go home + -- ExtAdvS : Adv -> S -> S ; -- next week, I will go home + AdvS, ExtAdvS = advS ; -- There's an SubjS already in AdverbSom -- should this be deprecated? -- : S -> Subj -> S -> S ; SSubjS s1 subj s2 = AdvS (AS.SubjS subj s2) s1 ; --- A sentence can be modified by a relative clause referring to its contents. - -- : S -> RS -> S ; -- she sleeps, which is good - RelS sent rs = advS { s = rs.s ! Sg3 Masc ++ SOFT_BIND ++ ","} sent ; + -- RelS sent rs = advS {s = rs.s ! Sg3 Masc ++ SOFT_BIND ++ ","} sent ; oper - advS : Adv -> SS -> SS = \a,s -> {s = a.s ++ s.s} ; --} + advS : Adverb -> S -> S = \a,s -> s ** {s = \\b => + linAdv a ++ s.s ! b} ; + } diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index 2a8526715..278c521fe 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -133,20 +133,18 @@ lin whatSg_IP = ; lin whoPl_IP = ; lin whoSg_IP = ; - - +-} ------- -- Subj -lin although_Subj = mkSubj "" False ; -lin because_Subj = mkSubj "" False ; -lin if_Subj = mkSubj "" True ; -lin that_Subj = mkSubj "" False ; -lin when_Subj = mkSubj "" False ; +-- lin although_Subj = mkSubj "" False ; +-- lin because_Subj = mkSubj "" False ; +-- lin if_Subj = mkSubj "" True ; +lin that_Subj = {s = "in" ++ BIND} ; +-- lin when_Subj = mkSubj "" False ; --} ------ -- Utt