diff --git a/src/arabic/ExtendAra.gf b/src/arabic/ExtendAra.gf index 3b667a237..a371dd234 100644 --- a/src/arabic/ExtendAra.gf +++ b/src/arabic/ExtendAra.gf @@ -6,15 +6,16 @@ concrete ExtendAra of Extend = StrandRelSlash, ExistPluralCN, ExistMassCN, ExistCN, EmptyRelSlash, DetNPMasc, DetNPFem, ComplBareVS, ComplDirectVS, ComplDirectVQ, ICompAP, - VPS, MkVPS, + VPS, MkVPS, PredVPS, BaseVPS, ConsVPS, ConjVPS, ApposNP ] with (Grammar=GrammarAra) ** open - Prelude, + ParamX, ResAra, - ParamX + Prelude, + Coordination in { @@ -29,15 +30,30 @@ concrete ExtendAra of Extend = lincat - VPS = VP ; -- finite VP's with tense and polarity - + VPS = {s : PerGenNum => Str} ; -- finite VP's with tense and polarity + [VPS] = {s1,s2 : PerGenNum => Str} ; lin -- : Temp -> Pol -> VP -> VPS ; -- hasn't slept - MkVPS t p vp = lin VPS (vp ** { - s = \\pgn,vf => case of { --- IL guessed tenses - <(Pres|Fut),Simul> => vp.s ! pgn ! VPImpf Ind ; - => vp.s ! pgn ! VPImpf Cnj ; - <_ ,_ > => vp.s ! pgn ! VPPerf - } - }) ; + MkVPS t p vp = { + s = \\pgn => let vps = + wordOrderNoSubj + Nominal -- Nominal (=SVO) generalises best for ConjVPS. + vp.obj.a.isPron + (vStr vp pgn t.t p.p) + (case of { + => BIND ++ vp.obj.s ; + _ => vp.obj.s }) + (pred vp pgn t.t p.p) + vp.s2 + in vps.before ++ vps.after -- word order is SVO, so this is safe for just this case. + } ; + + BaseVPS = twoTable PerGenNum ; + ConsVPS = consrTable PerGenNum comma ; + ConjVPS = conjunctTable PerGenNum ; + + PredVPS np vps = { + s = \\_ => np.s ! Nom ++ vps.s ! np.a.pgn -- first quick version with order always Nominal. + } ; -- if necessary, change VPS into {s : PerGenNum => Order => {before,after : Str}} + } diff --git a/src/arabic/ResAra.gf b/src/arabic/ResAra.gf index 0311148ce..95335fe81 100644 --- a/src/arabic/ResAra.gf +++ b/src/arabic/ResAra.gf @@ -1484,14 +1484,17 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> oper - VP : Type = { - s : PerGenNum => VPForm => Str ; + BaseVP : Type = { -- to minimise duplication of code for VPS sc : Preposition ; -- subject case: e.g. يُمْكِنُ *لِ*Xِ obj : Obj; pred : Comp; isPred : Bool; --indicates if there is a predicate (xabar) s2 : Str - }; + } ; + + VP : Type = BaseVP ** { + s : PerGenNum => VPForm => Str ; + } ; uttVP : VP -> (Gender=>Str) = \vp -> \\g => vp.s ! Per3 g Sg ! VPPerf @@ -1531,28 +1534,6 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> => verbalAgr np.a.pgn; _ => np.a.pgn }; - gn = pgn2gn pgn; - kataba = vp.s ! pgn ! VPPerf ; - yaktubu = vp.s ! pgn ! VPImpf Ind ; - yaktuba = vp.s ! pgn ! VPImpf Cnj ; - yaktub = vp.s ! pgn ! VPImpf Jus ; - vStr : ParamX.Tense -> Polarity -> Str = - \tn,pl -> case of { - => yaktubu ; - => "لَا" ++ yaktubu ; - => "" ; --no verb "to be" in present - => "لَيسَ" ;--same here, just add negation particle - <_, Past, Pos> => kataba ; - <_, Past, Neg> => "لَمْ" ++ yaktub ; - <_, Cond, _ > => yaktuba ; - <_, Fut, Pos> => glue "سَ" yaktubu ; - <_, Fut, Neg> => "لَنْ" ++ yaktuba - }; - pred : ParamX.Tense -> Polarity -> Str = - \tn,pl -> case of { - => vp.pred.s ! gn ! Nom; --xabar marfooc - _ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob - }; sc : Preposition = case o of {Subord => {s=[]; c=Acc} ; _ => vp.sc} ; subj = np.empty ++ sc.s ++ case vp.isPred of { @@ -1561,30 +1542,59 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> } ; } in wordOrder o vp.obj.a.isPron np.a.isPron - (vStr t p) - subj - + (vStr vp pgn t p) (case of { => BIND ++ vp.obj.s ; _ => vp.obj.s }) - - (pred t p) + (pred vp pgn t p) vp.s2 - + subj } ; - -- seems complicated, but this is to share code between PredVP and ClSlash-using funs - wordOrder : Order -> (objIsPron,subjIsPron : Bool) -> (verb,subj,obj,pred,adv : Str) -> Str = - \o,objIsPron,subjIsPron,verb,subj,obj,pred,adv -> + -- seems complicated, but this is to share code with VPS and other similar structures + wordOrder : Order -> (objIsPron,subjIsPron : Bool) -> (verb,obj,pred,adv,subj : Str) -> Str = + \o,objIsPron,subjIsPron,verb,obj,pred,adv,subj -> + let cl = wordOrderNoSubj o objIsPron verb obj pred adv in case o of { - VOS => verb ++ obj ++ pred ++ adv ++ subj ; - Verbal => verb ++ - case objIsPron of { - True => obj ++ subj ; -- obj. clitic attaches directly to the verb - False => subj ++ obj } ++ adv ++ pred ; - Nominal => subj ++ verb ++ obj ++ adv ++ pred ; - Subord => if_then_Str subjIsPron BIND [] -- in subord. clause, subj. pronoun binds to the main verb - ++ subj ++ verb ++ obj ++ adv ++ pred + Subord => + let bind = if_then_Str subjIsPron BIND [] -- in subord. clause, subj. pronoun binds to the main verb + in cl.before ++ bind ++ subj ++ cl.after ; + _ => cl.before ++ subj ++ cl.after + } ; + + wordOrderNoSubj : Order -> (objIsPron : Bool) -> (verb,obj,pred,adv : Str) -> {before,after : Str} = + \o,objIsPron,verb,obj,pred,adv -> + case o of { + VOS => {before = verb ++ obj ++ pred ++ adv; after = []} ; + Verbal => case objIsPron of { + True => {before = verb ++ obj ; after = adv ++ pred} ; -- obj. clitic attaches directly to the verb + False => {before = verb ; after = obj ++ adv ++ pred} + } ; + (Nominal|Subord) => {before = [] ; after = verb ++ obj ++ adv ++ pred} + } ; + + pred : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl -> + let gn = pgn2gn pgn + in case of { + => vp.pred.s ! gn ! Nom; --xabar marfooc + _ => vp.pred.s ! gn ! Acc --xabar kaana wa laysa manSoob + } ; + + vStr : VP -> PerGenNum -> ParamX.Tense -> Polarity -> Str = \vp,pgn,tn,pl -> + let kataba = vp.s ! pgn ! VPPerf ; + yaktubu = vp.s ! pgn ! VPImpf Ind ; + yaktuba = vp.s ! pgn ! VPImpf Cnj ; + yaktub = vp.s ! pgn ! VPImpf Jus ; + in case of { + => yaktubu ; + => "لَا" ++ yaktubu ; + => "" ; --no verb "to be" in present + => "لَيسَ" ;--same here, just add negation particle + <_, Past, Pos> => kataba ; + <_, Past, Neg> => "لَمْ" ++ yaktub ; + <_, Cond, _ > => yaktuba ; + <_, Fut, Pos> => glue "سَ" yaktubu ; + <_, Fut, Neg> => "لَنْ" ++ yaktuba } ; -- in verbal sentences, the verb agrees with the subject @@ -1659,6 +1669,9 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> Cl : Type = {s : Tense => Polarity => Order => Str} ; QCl : Type = {s : Tense => Polarity => QForm => Str} ; + forceOrder : Order -> Cl -> Cl = \o,cl -> + {s = \\t,p,_ => cl.s ! t ! p ! o} ; + ----------------------------------------------------------------------------- -- Relative