From c25a2365857cc624d49a52b8067f8a788ebbde1d Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 22 Feb 2019 11:16:49 +0100 Subject: [PATCH 1/5] (Pes) Make poss.suff. attach to the head for N2,N3 --- src/persian/CatPes.gf | 2 +- src/persian/LexiconPes.gf | 6 ++--- src/persian/NounPes.gf | 44 ++++++++++++++++++++----------------- src/persian/ParadigmsPes.gf | 4 ++-- src/persian/ResPes.gf | 5 ++++- 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/persian/CatPes.gf b/src/persian/CatPes.gf index 490ae3fde..014b1c651 100644 --- a/src/persian/CatPes.gf +++ b/src/persian/CatPes.gf @@ -89,7 +89,7 @@ concrete CatPes of Cat = CommonX - [Adv] ** open ResPes, Prelude in { N = ResPes.Noun ; - N2 = ResPes.Noun ** {c : Str}; + N2 = ResPes.Noun ** {c : Str ; compl : Str}; -- when N3 is made to N2, need to retain compl N3 = ResPes.Noun ** {c2 : Str ; c3 : Str} ; PN = {s : Str ; animacy : Animacy} ; diff --git a/src/persian/LexiconPes.gf b/src/persian/LexiconPes.gf index e5d10b9dc..0574740a4 100644 --- a/src/persian/LexiconPes.gf +++ b/src/persian/LexiconPes.gf @@ -35,7 +35,7 @@ concrete LexiconPes of Lexicon = CatPes ** bread_N = mkN01 "نان" inanimate; break_V2 = mkV2 (mkV "شکستن" "شکن") "را"; broad_A = mkA "وسیع" ; - brother_N2 = (mkN01 "برادر" animate) ** {c=""}; + brother_N2 = mkN2 (mkN01 "برادر" animate) []; brown_A = mkA ["قهوه ای"] ; butter_N = mkN01 "کره" inanimate; buy_V2 = mkV2 (mkV_1 "خریدن") "را"; @@ -75,7 +75,7 @@ concrete LexiconPes of Lexicon = CatPes ** empty_A = mkA "خالی" ; enemy_N = mkN02 "دشمن" animate; factory_N = mkN01 "کارخانه" inanimate; - father_N2 = (mkN02 "پدر" animate) ** {c=""}; + father_N2 = mkN2 (mkN02 "پدر" animate) []; fear_VS = mkV_1 "ترسیدن"; find_V2 = mkV2 (compoundV "پیدا" doVerb) "را"; fish_N = mkN01 "ماهی" animate; @@ -125,7 +125,7 @@ concrete LexiconPes of Lexicon = CatPes ** meat_N = mkN01 "گوشت" inanimate; milk_N = mkN01 "شیر" inanimate; moon_N = mkN01 "ماه" inanimate; -- is this not a proper noun? - mother_N2 = (mkN02 "مادر" animate) ** {c=""}; + mother_N2 = mkN2 (mkN02 "مادر" animate) [] ; mountain_N = mkN01 "کوه" inanimate; music_N = mkN "موسیقی" "موسیقی" animate; narrow_A = mkA "باریک" ; diff --git a/src/persian/NounPes.gf b/src/persian/NounPes.gf index 8a2552a06..ea4f3826e 100644 --- a/src/persian/NounPes.gf +++ b/src/persian/NounPes.gf @@ -3,13 +3,14 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { flags optimize=all_subs ; lin - DetCN det cn = cn ** {s = \\mod => - case of { - => det.s ++ cn.s ! det.n ! mod ; -- det is not from Pron, retain NPForm. - => cn.s ! det.n ! X ++ det.s ; -- det is from Pron, cn is in Ezafe. - => det.s ++ cn.s ! Sg ! mod ; -- noun modified by a number is invariably singular - => cn.s ! Sg ! X ++ det.s - } ; + DetCN det cn = cn ** { + s = \\m => + let num : Number = case det.isNum of { + True => Sg ; -- noun modified by a number is invariably singular + False => det.n } ; + in case det.mod of { + Bare => det.s ++ cn.s ! num ! m ++ cn.compl ; -- det doesn't require a special form, keep the Mod=>Str table + x => cn.s ! num ! x ++ det.s ++ cn.compl } ; -- det requires a special form a = agrP3 det.n ; } ; @@ -29,7 +30,7 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { } ; AdvNP np adv = np ** { - s = \\ez => np.s ! Ezafe ++ adv.s + s = \\ez => np.s ! Ezafe ++ adv.s } ; DetQuantOrd quant num ord = { @@ -71,39 +72,40 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { OrdSuperl a = {s = a.s ! Bare ++ taryn; n = Sg ; isNum=False} ; -- check the form of adjective DefArt = {s = \\_ => [] ; a = defaultAgr ; mod = Bare} ; - IndefArt = {s = table { Sg => IndefArticle ; Pl => []} ; a =defaultAgr ; mod = Bare} ; + IndefArt = {s = table {Sg => IndefArticle ; Pl => []} ; a = defaultAgr ; mod = Bare} ; MassNP cn = cn ** { s = cn.s ! Sg ; a = agrP3 Sg } ; - UseN n = n ** {hasAdj=False}; - UseN2 n = n ** {hasAdj=False}; + UseN n = n ** {hasAdj=False; compl=[]}; + UseN2 n = n ** {hasAdj=False; compl=[]}; Use2N3 f = f ** { c = f.c2; - definitness = True + compl = [] } ; Use3N3 f = f ** { c = f.c3; - definitness = True + compl = [] } ; ComplN2 n2 np = n2 ** { - s = \\n,m => n2.s ! n ! Ezafe ++ n2.c ++ np.s ! m ; + s = \\n,m => n2.s ! n ! Ezafe ; + compl = n2.compl ++ n2.c ++ np.s ! Bare ; hasAdj = False }; - ComplN3 f x = f ** { - s = \\n,ez => f.s ! n ! Ezafe ++ f.c2 ++ x.s ! ez ; - c = f.c3; - definitness = True; + ComplN3 n3 np = n3 ** { + s = \\n,m => n3.s ! n ! Ezafe ; + compl = n3.c2 ++ np.s ! Bare ; + c = n3.c3; } ; AdjCN ap cn = cn ** { - s = \\n,ez => cn.s ! n ! Ezafe ++ ap.s ! ez ; -- check the form of adjective and also cn.s!ez!n changed from cn.s!Ezafe!n to have correct enclicitic form other wise it creats wrong enclictic form of old man + s = \\n,ez => cn.s ! n ! Ezafe ++ ap.s ! ez ; hasAdj = True } ; @@ -115,6 +117,8 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { SentCN cn sc = cn ** {s = \\n,m => cn.s ! n ! m ++ sc.s} ; - ApposCN cn np = cn ** {s = \\n,m => cn.s ! n ! Ezafe ++ np.s ! m ; definitness = True} ; + -- correct for /city Paris/, incorrect for /king John/ + -- ApposNP in ExtendPes works for /king John/ (no ezafe). + ApposCN cn np = cn ** {s = \\n,m => cn.s ! n ! Ezafe ++ np.s ! m} ; } diff --git a/src/persian/ParadigmsPes.gf b/src/persian/ParadigmsPes.gf index 01bdf6db3..a4ffc6839 100644 --- a/src/persian/ParadigmsPes.gf +++ b/src/persian/ParadigmsPes.gf @@ -265,9 +265,9 @@ oper mkN2 = overload { mkN2 : N -> Str -> N2 - = \n,c -> lin N2 (n ** {c = c}) ; + = \n,c -> lin N2 (n ** {c = c ; compl=[]}) ; mkN2 : N -> Prep -> Str -> N2 -- hidden from puclic API - = \n,p,c -> lin N2 (n ** {c = p.s ; c2 = c}) -- there is no c2 + = \n,p,c -> lin N2 (n ** {c = p.s ; c2 = c; compl=[]}) -- there is no c2 } ; mkN3 = overload { diff --git a/src/persian/ResPes.gf b/src/persian/ResPes.gf index 4df0e412c..9f428415a 100644 --- a/src/persian/ResPes.gf +++ b/src/persian/ResPes.gf @@ -24,7 +24,10 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { oper Compl : Type = {s : Str ; ra : Str ; c : VType} ; - CN : Type = Noun ** {hasAdj : Bool} ; -- for getting the right form when NP/CN is a predicate + CN : Type = Noun ** { + hasAdj : Bool ; -- to get the right form when CN is a predicate + compl : Str -- to make possessive suffix attach to the right word + } ; NP : Type = {s : Mod => Str ; a : Agr ; animacy : Animacy ; hasAdj : Bool} ; VPHSlash : Type = VPH ** {c2 : Compl} ; From 50200f3e0c6a92844ffe16e3d621fed9b48baca3 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 22 Feb 2019 15:18:59 +0100 Subject: [PATCH 2/5] (Pes) Word order regarding ra + cleanup and renaming --- src/persian/ConjunctionPes.gf | 2 +- src/persian/IdiomPes.gf | 11 +-- src/persian/NounPes.gf | 34 ++++--- src/persian/ParadigmsPes.gf | 1 + src/persian/PhrasePes.gf | 26 ++--- src/persian/RelativePes.gf | 7 +- src/persian/ResPes.gf | 170 +++++++++++++++------------------ src/persian/SentencePes.gf | 4 +- src/persian/SymbolPes.gf | 9 +- src/persian/VerbPes.gf | 50 +++++----- src/persian/src/IdiomPes.gf | 4 +- src/persian/src/ResPes.gf | 10 +- src/persian/src/SentencePes.gf | 2 +- 13 files changed, 156 insertions(+), 174 deletions(-) diff --git a/src/persian/ConjunctionPes.gf b/src/persian/ConjunctionPes.gf index 1e303666f..4d79b8a5d 100644 --- a/src/persian/ConjunctionPes.gf +++ b/src/persian/ConjunctionPes.gf @@ -39,7 +39,7 @@ concrete ConjunctionPes of Conjunction = lincat [S] = {s1,s2 : Str} ; [Adv] = {s1,s2 : Str} ; - [NP] = {s1,s2 : Mod => Str ; a : Agr ; animacy : Animacy ; hasAdj : Bool} ; + [NP] = {s1,s2 : Mod => Str ; a : Agr ; animacy : Animacy ; hasAdj : Bool; compl:Str} ; [AP] = {s1,s2 : Mod => Str ; adv : Str} ; [RS] = {s1,s2 : Agr => Str }; diff --git a/src/persian/IdiomPes.gf b/src/persian/IdiomPes.gf index 41273de11..213217ea9 100644 --- a/src/persian/IdiomPes.gf +++ b/src/persian/IdiomPes.gf @@ -17,16 +17,15 @@ lin ExistNP np = mkSClause " " (agrP3 (fromAgr np.a).n) - (insertObj (\\_ => np.s ! Bare) (predAux auxBe)) ; + (insertComp (\\_ => np.s ! Bare) (predAux auxBe)) ; ExistIP ip = let cl = mkSClause ( ip.s ) (agrP3 ip.n) (predAux auxBe); - in { - s = \\t,p,qf => case qf of { - QDir => cl.s ! t ! p ! ODir; + in {s = \\t,p,qf => case qf of { + QDir => cl.s ! t ! p ! ODir; QIndir => cl.s ! t! p ! ODir - } - }; + } + }; ProgrVP vp = predProg vp ; diff --git a/src/persian/NounPes.gf b/src/persian/NounPes.gf index ea4f3826e..4210cbcbf 100644 --- a/src/persian/NounPes.gf +++ b/src/persian/NounPes.gf @@ -9,13 +9,14 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { True => Sg ; -- noun modified by a number is invariably singular False => det.n } ; in case det.mod of { - Bare => det.s ++ cn.s ! num ! m ++ cn.compl ; -- det doesn't require a special form, keep the Mod=>Str table - x => cn.s ! num ! x ++ det.s ++ cn.compl } ; -- det requires a special form + Bare => det.s ++ cn.s ! num ! m ; -- det doesn't require a special form, keep the Mod=>Str table + x => cn.s ! num ! x ++ det.s } ; -- det requires a special form a = agrP3 det.n ; + compl = cn.compl ! det.n } ; - UsePN pn = pn ** {s = \\_ => pn.s ; a = agrP3 Sg ; hasAdj = False} ; - UsePron p = p ** {s = \\_ => p.s ; animacy = Animate ; hasAdj = False} ; + UsePN pn = emptyNP ** pn ** {s = \\_ => pn.s} ; + UsePron p = emptyNP ** p ** {s = \\_ => p.s ; animacy = Animate} ; PredetNP pred np = np ** { s = \\ez => pred.s ++ np.s ! ez @@ -51,7 +52,8 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { s = \\_ => det.s ; ---- case a = agrP3 det.n ; hasAdj = False ; - animacy = Inanimate + animacy = Inanimate ; + compl = [] } ; PossPron p = {s = \\_ => BIND ++ p.ps ; a = p.a ; mod = Poss} ; @@ -76,25 +78,26 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { MassNP cn = cn ** { s = cn.s ! Sg ; - a = agrP3 Sg + a = agrP3 Sg ; + compl = cn.compl ! Sg } ; - UseN n = n ** {hasAdj=False; compl=[]}; - UseN2 n = n ** {hasAdj=False; compl=[]}; + UseN, + UseN2 = useN ; - Use2N3 f = f ** { - c = f.c2; + Use2N3 n3 = useN n3 ** { + c = n3.c2 ; compl = [] } ; - Use3N3 f = f ** { - c = f.c3; + Use3N3 n3 = useN n3 ** { + c = n3.c3 ; compl = [] } ; ComplN2 n2 np = n2 ** { s = \\n,m => n2.s ! n ! Ezafe ; - compl = n2.compl ++ n2.c ++ np.s ! Bare ; + compl = \\_ => n2.compl ++ n2.c ++ np.s ! Bare ; hasAdj = False }; @@ -110,12 +113,13 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { } ; RelCN cn rs = cn ** { - s = \\n,ez => cn.s ! n ! Clitic ++ rs.s ! agrP3 n ; + s = \\n,ez => cn.s ! n ! Clitic ; + compl = \\n => rs.s ! agrP3 n ; } ; AdvCN cn ad = cn ** {s = \\n,m => cn.s ! n ! Ezafe ++ ad.s} ; - SentCN cn sc = cn ** {s = \\n,m => cn.s ! n ! m ++ sc.s} ; + SentCN cn sc = cn ** {compl = \\n => sc.s} ; -- correct for /city Paris/, incorrect for /king John/ -- ApposNP in ExtendPes works for /king John/ (no ezafe). diff --git a/src/persian/ParadigmsPes.gf b/src/persian/ParadigmsPes.gf index a4ffc6839..35c9317a7 100644 --- a/src/persian/ParadigmsPes.gf +++ b/src/persian/ParadigmsPes.gf @@ -92,6 +92,7 @@ oper = lin V M.haveVerb ; beVerb : V -- The verb "be", to be used for light verb constructions: e.g. compoundV "عاشق" beVerb. = lin V M.beVerb ; + mkV2 : overload { mkV2 : Str -> V2 ; -- Predictable V2 out of string. No preposition, را for direct object. mkV2 : V -> V2 ; -- V2 out of V. No preposition, را for direct object. diff --git a/src/persian/PhrasePes.gf b/src/persian/PhrasePes.gf index 603875762..7e63d6c6b 100644 --- a/src/persian/PhrasePes.gf +++ b/src/persian/PhrasePes.gf @@ -3,25 +3,25 @@ concrete PhrasePes of Phrase = CatPes ** open Prelude, ResPes in { lin PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; - UttS s = s ; UttQS qs = {s = qs.s ! QDir} ; UttImpSg pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg False} ; UttImpPl pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Pl False} ; UttImpPol pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg True} ; - UttIP ip = {s = ip.s } ; --- Acc also - UttIAdv iadv = iadv ; - UttNP np = {s = np.s ! Bare} ; - UttVP vp = {s = vp.ad ++ vp.comp ! Ag Sg P3 ++ vp.obj.s ++ vp.inf ++ vp.vComp ! Ag Sg P3 ++ vp.embComp} ; - UttAdv adv = {s = adv.s } ; - UttCN cn = {s = cn.s ! Sg ! Bare }; - UttCard n = n ; + UttS, + UttIP, --- Acc also + UttAdv, + UttIAdv, + UttCard = \ss -> ss ; + + UttNP np = {s = np2str np} ; + UttCN cn = {s = cn2str cn}; UttAP ap = {s = ap.s ! Bare} ; + UttVP vp = {s = showVPH VPInf defaultAgr vp} ; + PConjConj conj = {s = conj.s2} ; + + NoVoc, NoPConj = {s = []} ; - PConjConj conj = {s = conj.s2} ; --- - - NoVoc = {s = []} ; - VocNP np = {s = np.s ! Bare} ; - + VocNP = UttNP ; } diff --git a/src/persian/RelativePes.gf b/src/persian/RelativePes.gf index 935751140..d0156dc9b 100644 --- a/src/persian/RelativePes.gf +++ b/src/persian/RelativePes.gf @@ -27,11 +27,6 @@ concrete RelativePes of Relative = CatPes ** open ResPes in { cl.s ! t ! p ! ODir ; -- c = Dir } ; - - ----- Pied piping: "ت wهعه we رe لْْکنگ". Stranding and empty ----- relative are defined in $ExtraHin.gf$ ("تهت we رe لْْکنگ ت", ----- "we رe لْْکنگ ت"). -- RelSlash rp slash = { s = \\t,p,o,agr => rp.s ++ slash.c2.s ++ slash.subj ++ slash.vp ! t ! p ! o ;--case t of { ---- AR 18/8/2017 is this the right place of subj? @@ -42,7 +37,7 @@ concrete RelativePes of Relative = CatPes ** open ResPes in { } ; FunRP p np rp = { - s = np.s ! Clitic ++ rp.s ++ p.s ++ getPron np.animacy (fromAgr np.a).n ; -- need to make a special form of relative np by addY + s = np.s ! Clitic ++ rp.s ++ p.s ++ getPron np.animacy (fromAgr np.a).n ; -- need to make a special form of relative np by addY a = RAg np.a } ; diff --git a/src/persian/ResPes.gf b/src/persian/ResPes.gf index 9f428415a..14fc1539f 100644 --- a/src/persian/ResPes.gf +++ b/src/persian/ResPes.gf @@ -22,16 +22,40 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { | CNeg Bool; -- contracted or not oper - - Compl : Type = {s : Str ; ra : Str ; c : VType} ; CN : Type = Noun ** { - hasAdj : Bool ; -- to get the right form when CN is a predicate - compl : Str -- to make possessive suffix attach to the right word + hasAdj : Bool ; -- to get the right form when CN is a predicate + compl : Number => Str -- to make possessive suffix attach to the right word + -- dep. on Agr because of RelCN + } ; + + NP : Type = { + s : Mod => Str ; -- NP can appear with a clitic, need to keep Mod open + a : Agr ; + hasAdj : Bool ; -- to get the right form when NP is a predicate + compl : Str ; -- to make possessive suffix attach to the right word + animacy : Animacy -- to get the right relative pronoun } ; - NP : Type = {s : Mod => Str ; a : Agr ; animacy : Animacy ; hasAdj : Bool} ; - VPHSlash : Type = VPH ** {c2 : Compl} ; oper + emptyNP : NP = { + s = \\_ => [] ; + a = defaultAgr ; + hasAdj = False ; + animacy = Inanimate ; + compl = [] + } ; + + useN : Noun -> CN = \n -> n ** { + hasAdj = False ; + compl = \\_ => [] + } ; + + np2str : NP -> Str = \np -> + np.s ! Bare ++ np.compl ; + + cn2str : CN -> Str = \cn -> + cn.s ! Sg ! Bare ++ cn.compl ! Sg ; + contrNeg : Bool -> Polarity -> CPolarity = \b,p -> case p of { Pos => CPos ; Neg => CNeg b @@ -48,17 +72,24 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { oper - VPH : Type = { - s : VPHForm => Str ; -- {inf : Str} ; - obj : {s : Str ; a : Agr} ; + VPH : Type = { + s : VPHForm => Str ; + obj : {s : Str ; a : Agr} ; -- direct object of a verb subj : VType ; - comp : Agr => Str; - vComp : Agr => Str; - inf : Str; + comp : Agr => Str; -- complements of a verb; those other than a direct object. e.g. indirect object of ditransitive verbs. + vComp : Agr => Str; -- when a verb is used as a complement of an auxiliary verb, we store it in this field. Unlike ‘comp’ or ‘obj’, this type of complement follows the auxiliary verb. ad : Str; - embComp : Str ; + embComp : Str ; -- when a declarative or interrogative sentence is used as a complement of a verb. wish : Bool ; } ; + + showVPH : VPHForm -> Agr -> VPH -> Str = \vf,agr,vp -> + vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.s ! vf ++ vp.vComp ! agr ++ vp.embComp ; + + Compl : Type = {s : Str ; ra : Str} ; + + VPHSlash : Type = VPH ** {c2 : Compl} ; + param VPHForm = @@ -69,6 +100,7 @@ oper | VVForm Agr | VPStem1 | VPStem2 + | VPInf ; VPHTense = @@ -84,7 +116,6 @@ oper | VRoot1 -- AR 22/3/2018 for mustCl past after Nasrin ; - VType = VIntrans | VTrans | VTransPost ; VPPTense = @@ -93,8 +124,6 @@ oper |VPFutr Anteriority |VPCond Anteriority ; oper ---s (Vvform (Ag Sg P1)) : بخوانم - predV : Verb -> VPH = \verb -> { s = \\vh => @@ -110,10 +139,10 @@ oper VVForm agr => verb.s ! Vvform agr ; VPStem1 => verb.s ! Root1 ; VPStem2 => verb.s ! Root2 ; + VPInf => verb.s ! Inf; VPImp pol n =>verb.s ! Imp pol n }; obj = {s = [] ; a = defaultAgr} ; subj = VIntrans ; - inf = verb.s ! Inf; ad = []; embComp = []; wish = False ; @@ -122,88 +151,51 @@ oper } ; predVc : (Verb ** {c2,c1 : Str}) -> VPHSlash = \verb -> - predV verb ** {c2 = {s = verb.c1 ; ra = [] ; c = VTrans} } ; ----------------------- --- Verb Phrase complimantation ------------------------- -{- - insertObject : NP -> VPHSlash -> VPH = \np,vps -> vps ** { --- obj = {s = variants { vps.obj.s ++ np.s ++ vps.c2.s ; vps.obj.s ++ np.s } ; a = np.a} ; - obj = {s = case vps.c2.s of { - "را" => np.s ++ vps.c2.s ++ vps.obj.s; - _ => vps.c2.s ++ np.s ++ vps.obj.s - }; - a = np.a} ; - subj = vps.c2.c ; - } ; --} - insertObjc : (Agr => Str) -> VPHSlash -> VPHSlash = \obj,vp -> - insertObj obj vp ** {c2 = vp.c2} ; - insertVVc : (Agr => Str) -> VPHSlash -> VPHSlash = \obj,vp -> - insertVV obj vp ** {c2 = vp.c2} ; + predV verb ** {c2 = {s = verb.c1 ; ra = []} } ; - {- - insertSubj : Person -> Str -> Str = \p,s -> - case p of { Pers1 => s ++ "wN" ; _ => s ++ "E"}; - -} - insertObj : (Agr => Str) -> VPH -> VPH = \obj1,vp -> vp ** { - comp = \\a => vp.comp ! a ++ obj1 ! a + + +--------------------- +-- VP complementation +--------------------- + + insertComp : (Agr => Str) -> VPH -> VPH = \obj,vp -> vp ** { + comp = \\a => vp.comp ! a ++ obj ! a } ; + insertCompPre : (Agr=>Str) -> VPHSlash -> VPH = \obj,vp -> vp ** { + comp = \\a => vp.c2.s ++ obj ! a ++ vp.c2.ra ++ vp.comp ! a + } ; + insertVV : (Agr => Str) -> VPH -> VPH = \obj1,vp -> vp ** { wish = True ; --- vComp = \\a => vp.comp ! a ++ conjThat ++ obj1 ! a ; -- TODO: do we insert conjThat here or in infVV? /IL - vComp = \\a => vp.comp ! a ++ obj1 ! a ; + vComp = \\a => vp.comp ! a ++ obj1 ! a ; -- IL why this is vp.comp and not vp.vComp?? } ; - insertObj2 : (Str) -> VPH -> VPH = \obj1,vp -> vp ** { - embComp = vp.embComp ++ obj1; + embComp : Str -> VPH -> VPH = \str,vp -> vp ** { + embComp = vp.embComp ++ str ; } ; - insertObj3 : (Str) -> VPH -> VPH = \obj1,vp -> vp ** { - obj = {s = obj1 ++ vp.obj.s ; a = vp.obj.a }; + insertObj : Str -> VPH -> VPH = \str,vp -> vp ** { + obj = vp.obj ** {s = str ++ vp.obj.s} + } ; + + -- TODO: comp or obj? /IL + insertObjPre : NP -> VPHSlash -> VPH = \np,vp -> vp ** { + comp = \\a => vp.c2.s ++ np.s ! Bare ++ vp.c2.ra ++ np.compl ++ vp.comp ! a } ; - - insertObjc2 : Str -> VPHSlash -> VPHSlash = \obj,vp -> - insertObj2 obj vp ** {c2 = vp.c2} ; - insertObjc3 : Str -> VPHSlash -> VPHSlash = \obj,vp -> - insertObj3 obj vp ** {c2 = vp.c2} ; -{- - infVP : Bool -> VPH -> Agr -> Str = \isAux,vp,a -> - vp.obj.s ++ vp.inf ++ vp.comp ! a ; - -} - ---- AR 14/9/2017 trying to fix isAux = True case by inserting conjThat ---- but don't know yet how False should be affect - infVV : Bool -> VPH -> {s : Agr => Str} = \isAux,vp -> { - s = \\agr => case isAux of { - True => conjThat ++ vp.ad ++ vp.comp ! agr ++ vp.s ! VVForm agr ; - False => vp.ad ++ vp.comp ! agr ++ vp.s ! VVForm agr } - } ; + infVV : Bool -> VPH -> (Agr => Str) = \isAux,vp -> + \\agr => if_then_Str isAux conjThat [] ++ showVPH (VVForm agr) agr vp ; - insertObjPre : (Agr => Str) -> VPHSlash -> VPH = \obj,vp -> vp ** { - -- comp = \\a => case vp.c2.s of {"را" => obj ! a ++ vp.c2.s ++ vp.comp ! a ; _ => vp.c2.s ++ obj ! a ++ vp.comp ! a} -- gives linking error - comp = \\a => vp.c2.s ++ obj ! a ++ vp.c2.ra ++ vp.comp ! a - } ; + insertAdV : Str -> VPH -> VPH = \ad,vp -> vp ** { + ad = vp.ad ++ ad ; + } ; - insertAdV : Str -> VPH -> VPH = \ad,vp -> vp ** { - ad = vp.ad ++ ad ; - } ; + conjThat : Str = "که" ; - conjThat : Str = "که" ; - {- checkPron : NP -> Str -> Str = \np,str -> case (np.isPron) of { - True => np.s ! Obl; - False => np.s ! Obl ++ str} ; - - insertEmbCompl : VPH -> Str -> VPH = \vp,emb -> vp ** { - embComp = vp.embComp ++ emb; - } ; - - insertTrans : VPH -> VType -> VPH = \vp,vtype -> vp ** { - subj = case vtype of {VIntrans => VTransPost ; VTrans => VTrans ; _ => vtype} ; -- still some problem not working properly - } ; --} --------------------------- --- Clauses --------------------------- @@ -277,12 +269,11 @@ oper VVForm agr => []; -- to be checked => verb.s ! Vvform agr ; VPStem1 => []; VPStem2 => "بود" ; + VPInf => "بودن"; VPImp _ _ => [] -- need to be confirmed --- _ => [] }; obj = {s = [] ; a = defaultAgr} ; subj = VIntrans ; - inf = "بودن"; ad = []; embComp = []; wish = False ; @@ -363,16 +354,8 @@ taryn = "ترین" ; ----------------------------- -- Noun Phrase ----------------------------- -{-toNP : Str -> Str = \pn, -> case of { - c => pn ! c ; - NPObj => pn ! Dir ; - NPErg => pn ! Obl - } ; --} partNP : Str -> Str = \str -> (Prelude.glue str "ه") ++ "شده" ; --- partNP : Str -> Str = \str -> str + "ه" ++ "شده" ; - ----------------------------------- -- Reflexive Pronouns @@ -396,5 +379,4 @@ taryn = "ترین" ; => zwnj "آن" "ها" }; - } diff --git a/src/persian/SentencePes.gf b/src/persian/SentencePes.gf index 2b48d2b5f..ade5cb56e 100644 --- a/src/persian/SentencePes.gf +++ b/src/persian/SentencePes.gf @@ -34,12 +34,12 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { SlashVS np vs slash = mkSlClause np - (insertObj2 (conjThat ++ slash.s) (predV vs)) ** + (embComp (conjThat ++ slash.s) (predV vs)) ** {c2 = slash.c2} ; EmbedS s = {s = conjThat ++ s.s} ; EmbedQS qs = {s = qs.s ! QIndir} ; - EmbedVP vp = {s = vp.obj.s ++ vp.inf ++ vp.comp ! defaultAgr} ; --- agr + EmbedVP vp = {s = showVPH VPInf defaultAgr vp} ; --- agr UseCl temp p cl = diff --git a/src/persian/SymbolPes.gf b/src/persian/SymbolPes.gf index 28d18e005..bcce24df5 100644 --- a/src/persian/SymbolPes.gf +++ b/src/persian/SymbolPes.gf @@ -12,15 +12,18 @@ concrete SymbolPes of Symbol = CatPes ** open Prelude, ResPes in { NumPN i = {s = i.s ; animacy = Inanimate} ; CNIntNP cn i = cn ** { s = \\ez => cn.s ! Sg ! Ezafe ++ i.s ; - a = agrP3 Sg + a = agrP3 Sg ; + compl = cn.compl ! Sg } ; CNSymbNP det cn xs = cn ** { s = \\ez => det.s ++ cn.s ! det.n ! Ezafe ++ xs.s ; - a = agrP3 det.n + a = agrP3 det.n ; + compl = cn.compl ! det.n } ; CNNumNP cn i = cn ** { s = \\ez => cn.s ! Sg ! Ezafe ++ i.s ; - a = agrP3 Sg + a = agrP3 Sg ; + compl = cn.compl ! Sg } ; SymbS sy = sy ; diff --git a/src/persian/VerbPes.gf b/src/persian/VerbPes.gf index 0620c9ea8..bd5a0e2ba 100644 --- a/src/persian/VerbPes.gf +++ b/src/persian/VerbPes.gf @@ -5,40 +5,39 @@ concrete VerbPes of Verb = CatPes ** open ResPes,Prelude in { lin UseV v = predV v ; - SlashV2a v = predV v ** {c2 = {s = v.c2.s ; ra = v.c2.ra ; c = VTrans}} ; - Slash2V3 v np = - insertObjc (\\_ => np.s ! Bare ++ v.c2 ) (predV v ** {c2 = {s = [] ; ra = v.c3 ; c = VTrans}}) ; + SlashV2a v = predV v ** {c2 = v.c2} ; --{s = v.c2.s ; ra = v.c2.ra ; c = VTrans}} ; + Slash2V3 v np = {c2 = {s = [] ; ra = v.c3}} ** + insertObj (np.s ! Bare ++ v.c2) (predV v) ; -- ** ; c = VTrans}}) ; - Slash3V3 v np = - insertObjc (\\_ => v.c3 ++ np.s ! Bare) (predV v ** {c2 = {s = [] ; ra = v.c2 ; c = VTrans}}) ; + Slash3V3 v np = {c2 = {s = [] ; ra = v.c2}} ** + insertObj (v.c3 ++ np.s ! Bare) (predV v) ; -- ** ; c = VTrans}}) ; - ComplVV v vp = insertVV (infVV v.isAux vp).s (predV v) ; - ComplVS v s = insertObj2 (conjThat ++ s.s) (predV v) ; - ComplVQ v q = insertObj2 (conjThat ++ q.s ! QIndir) (predV v) ; - ComplVA v ap = insertObj (\\_ => ap.s ! Bare) (predV v) ; -- check form of adjective - SlashV2V v vp = insertVV (infVV v.isAux vp).s (predV v) **{c2 = {s = v.c1 ; ra = [] ; c = VTransPost}} ; + ComplSlash vp np = insertObjPre np vp ; - SlashV2S v s = insertObjc2 (conjThat ++ s.s) (predV v ** {c2 = {s = v.c2.s ;ra = [] ; c = VTransPost}}) ; - SlashV2Q v q = insertObjc2 ( q.s ! QIndir) (predV v ** {c2 = {s = v.c2.s ; ra = [] ;c = VTransPost}}) ; - SlashV2A v ap = insertObjc3 ( ap.s ! Bare) (predV v ** {c2 = {s = [] ; ra = v.c2.ra ;c = VTransPost}}) ; ---- paint it red , check form of adjective + ComplVV v vp = insertVV (infVV v.isAux vp) (predV v) ; + ComplVS v s = embComp (conjThat ++ s.s) (predV v) ; + ComplVQ v q = embComp (conjThat ++ q.s ! QIndir) (predV v) ; + ComplVA v ap = insertComp (\\_ => ap.s ! Bare) (predV v) ; -- check form of adjective + SlashV2V v vp = insertVV (infVV v.isAux vp) (predV v) **{c2 = {s = v.c1 ; ra = []}} ; - ComplSlash vp np = insertObjPre (\\_ => np.s ! Bare ) vp ; - SlashVV vv vp = - -- insertObj (infVV vv.isAux vp).s (predV vv) ** - insertVV (infVV vv.isAux vp).s (predV vv) ** - {c2 = vp.c2} ; - SlashV2VNP vv np vp = - insertObjPre (\\_ => np.s ! Bare ) --- (insertObjc (infVV vv.isAux vp).s (predVc vv)) ** - (insertVVc (infVV vv.isAux vp).s (predVc vv)) ** - {c2 = vp.c2} ; + SlashV2S v s = v ** embComp (conjThat ++ s.s) (predV v) ; + SlashV2Q v q = v ** embComp (q.s ! QIndir) (predV v) ; + SlashV2A v ap = v ** insertObj (ap.s ! Bare) (predV v) ; ---- paint it red , check form of adjective - UseComp comp = insertObj comp.s (predAux auxBe) ; + SlashVV vv vps = vps ** insertVV (infVV vv.isAux vps) (predV vv) ; + + SlashV2VNP v2v np vps = + let vvVP : VPH = insertVV (infVV v2v.isAux vps) (predV v2v) ; + vvVPS = vvVP ** {c2={s=v2v.c1 ; ra=v2v.c2}} ; + in insertObjPre np vvVPS ** {c2 = vps.c2} ; + + + UseComp comp = insertComp comp.s (predAux auxBe) ; AdvVP vp adv = insertAdV adv.s vp ; AdVVP adv vp = insertAdV adv.s vp ; - ReflVP v = insertObjPre (\\a => reflPron ! a) v ; + ReflVP v = insertCompPre reflPron v ; PassV2 v = predV v ; -- need to be fixed CompAP ap ={s = \\_ => ap.s ! Bare} ; -- check form of adjective CompAdv adv = {s = \\_ => adv.s } ; @@ -49,7 +48,6 @@ concrete VerbPes of Verb = CatPes ** open ResPes,Prelude in { ! case cn.hasAdj of { False => Bare ; True => Clitic } - } ; CompNP np = { diff --git a/src/persian/src/IdiomPes.gf b/src/persian/src/IdiomPes.gf index 8464328d4..29c51ce24 100644 --- a/src/persian/src/IdiomPes.gf +++ b/src/persian/src/IdiomPes.gf @@ -17,7 +17,7 @@ concrete IdiomPes of Idiom = CatPes ** open Prelude,Predef, ResPes in { ExistNP np = mkSClause " " (agrPesP3 (fromAgr np.a).n) - (insertObj (\\_ => np.s ! Bare) (predAux auxBe)) ; + (insertComp (\\_ => np.s ! Bare) (predAux auxBe)) ; ExistIP ip = let cl = mkSClause ( ip.s ) (agrPesP3 ip.n) (predAux auxBe); @@ -28,7 +28,7 @@ concrete IdiomPes of Idiom = CatPes ** open Prelude,Predef, ResPes in { } }; --- ProgrVP vp = insertObj (\\a => vp.obj.s ++ vp.ad ++ vp.comp ! a ++ (vp.s ! VPStem).inf ++ raha (fromAgr a).g (fromAgr a).n ) (predAux auxBe) ; +-- ProgrVP vp = insertComp (\\a => vp.obj.s ++ vp.ad ++ vp.comp ! a ++ (vp.s ! VPStem).inf ++ raha (fromAgr a).g (fromAgr a).n ) (predAux auxBe) ; ProgrVP vp = (predProg vp) ; diff --git a/src/persian/src/ResPes.gf b/src/persian/src/ResPes.gf index 53cf10a76..14ea48075 100644 --- a/src/persian/src/ResPes.gf +++ b/src/persian/src/ResPes.gf @@ -162,7 +162,7 @@ oper } ; -} insertObjc : (AgrPes => Str) -> VPHSlash -> VPHSlash = \obj,vp -> - insertObj obj vp ** {c2 = vp.c2} ; + insertComp obj vp ** {c2 = vp.c2} ; insertVVc : (AgrPes => Str) -> VPHSlash -> VPHSlash = \obj,vp -> insertVV obj vp ** {c2 = vp.c2} ; @@ -170,7 +170,7 @@ oper insertSubj : PPerson -> Str -> Str = \p,s -> case p of { Pers1 => s ++ "wN" ; _ => s ++ "E"}; -} - insertObj : (AgrPes => Str) -> VPH -> VPH = \obj1,vp -> { + insertComp : (AgrPes => Str) -> VPH -> VPH = \obj1,vp -> { s = vp.s ; obj = vp.obj ; subj = vp.subj ; @@ -195,7 +195,7 @@ oper comp = vp.comp } ; - insertObj2 : (Str) -> VPH -> VPH = \obj1,vp -> { + embComp : (Str) -> VPH -> VPH = \obj1,vp -> { s = vp.s; obj = vp.obj ; subj = vp.subj ; @@ -221,8 +221,8 @@ oper } ; - insertObjc2 : Str -> VPHSlash -> VPHSlash = \obj,vp -> - insertObj2 obj vp ** {c2 = vp.c2} ; + embCompSlash : Str -> VPHSlash -> VPHSlash = \obj,vp -> + embComp obj vp ** {c2 = vp.c2} ; insertObjc3 : Str -> VPHSlash -> VPHSlash = \obj,vp -> insertObj3 obj vp ** {c2 = vp.c2} ; {- diff --git a/src/persian/src/SentencePes.gf b/src/persian/src/SentencePes.gf index bcaafe82d..f3a982016 100644 --- a/src/persian/src/SentencePes.gf +++ b/src/persian/src/SentencePes.gf @@ -32,7 +32,7 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { SlashVS np vs slash = mkClause np - (insertObj2 (conjThat ++ slash.s) (predV vs)) ** + (embComp (conjThat ++ slash.s) (predV vs)) ** {c2 = slash.c2} ; EmbedS s = {s = conjThat ++ s.s} ; From bd19c7a8a9beb359a5f5a7213b81a172ec018112 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 22 Feb 2019 16:18:14 +0100 Subject: [PATCH 3/5] (Pes) Remove unused CPolarity --- src/persian/CatPes.gf | 2 +- src/persian/PhrasePes.gf | 6 +++--- src/persian/ResPes.gf | 16 +--------------- src/persian/SentencePes.gf | 5 ++--- 4 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/persian/CatPes.gf b/src/persian/CatPes.gf index 014b1c651..cf475fe51 100644 --- a/src/persian/CatPes.gf +++ b/src/persian/CatPes.gf @@ -18,7 +18,7 @@ concrete CatPes of Cat = CommonX - [Adv] ** open ResPes, Prelude in { vp : ResPes.VPHTense => Polarity => Order => Str ; c2 : ResPes.Compl } ; - Imp = {s : CPolarity => ImpForm => Str} ; + Imp = {s : Polarity => ImpForm => Str} ; ---- Question QCl = {s : ResPes.VPHTense => Polarity => QForm => Str} ; diff --git a/src/persian/PhrasePes.gf b/src/persian/PhrasePes.gf index 7e63d6c6b..e1edfc71a 100644 --- a/src/persian/PhrasePes.gf +++ b/src/persian/PhrasePes.gf @@ -4,9 +4,9 @@ concrete PhrasePes of Phrase = CatPes ** open Prelude, ResPes in { PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; UttQS qs = {s = qs.s ! QDir} ; - UttImpSg pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg False} ; - UttImpPl pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Pl False} ; - UttImpPol pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg True} ; + UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg False} ; + UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Pl False} ; + UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg True} ; UttS, UttIP, --- Acc also diff --git a/src/persian/ResPes.gf b/src/persian/ResPes.gf index 14fc1539f..671d12436 100644 --- a/src/persian/ResPes.gf +++ b/src/persian/ResPes.gf @@ -16,16 +16,12 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { CardOrd = NCard | NOrd ; RAgr = RNoAg | RAg Agr ; - -- RCase = RC Number Case ; - - CPolarity = CPos - | CNeg Bool; -- contracted or not oper CN : Type = Noun ** { hasAdj : Bool ; -- to get the right form when CN is a predicate compl : Number => Str -- to make possessive suffix attach to the right word - -- dep. on Agr because of RelCN + -- dep. on Number because of RelCN } ; NP : Type = { @@ -56,16 +52,6 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { cn2str : CN -> Str = \cn -> cn.s ! Sg ! Bare ++ cn.compl ! Sg ; - contrNeg : Bool -> Polarity -> CPolarity = \b,p -> case p of { - Pos => CPos ; - Neg => CNeg b - } ; - - cpol2pol : CPolarity -> Polarity = \cp -> case cp of { - CPos => Pos ; - _ => Neg - } ; - ----------------------- --- Verb Phrase ----------------------- diff --git a/src/persian/SentencePes.gf b/src/persian/SentencePes.gf index ade5cb56e..0938da99f 100644 --- a/src/persian/SentencePes.gf +++ b/src/persian/SentencePes.gf @@ -7,12 +7,11 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { PredVP np vp = mkClause np vp ; - PredSCVP sc vp = mkSClause ("این" ++ sc.s) (defaultAgr) vp ; + PredSCVP sc vp = mkSClause ("این" ++ sc.s) defaultAgr vp ; ImpVP vp = { - s = \\cpol,n => + s = \\pol,n => let agr = Ag (numImp n) P2 ; - pol = cpol2pol cpol ; in case vp.wish of { True => vp.s ! VPImp pol (numImp n) ++ vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.vComp ! agr ++ vp.embComp; False => vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.vComp ! agr ++ vp.s ! VPImp pol (numImp n) ++ vp.embComp } From f686761bc5ecf3186710401f8cc9b7b76d5bc47e Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 22 Feb 2019 17:50:02 +0100 Subject: [PATCH 4/5] (Pes) Cleanup, refactoring, add comments --- src/persian/CatPes.gf | 2 +- src/persian/ParadigmsPes.gf | 22 +++++++----- src/persian/ResPes.gf | 59 ++++++++++++++++++------------- src/persian/SentencePes.gf | 70 ++++++++----------------------------- src/persian/VerbPes.gf | 22 ++++++------ 5 files changed, 76 insertions(+), 99 deletions(-) diff --git a/src/persian/CatPes.gf b/src/persian/CatPes.gf index cf475fe51..4f5ca6483 100644 --- a/src/persian/CatPes.gf +++ b/src/persian/CatPes.gf @@ -81,7 +81,7 @@ concrete CatPes of Cat = CommonX - [Adv] ** open ResPes, Prelude in { V, VS, VQ, VA = ResPes.Verb ; V2, V2A, V2Q, V2S = ResPes.Verb ** {c2 : Compl} ; - V3 = ResPes.Verb ** {c2, c3 : Str} ; + V3 = ResPes.Verb ** {c2, c3 : Compl} ; VV = ResPes.Verb ** {isAux : Bool} ; V2V = ResPes.Verb ** {c1 : Str ; c2 : Str ; isAux : Bool} ; A = ResPes.Adjective ; diff --git a/src/persian/ParadigmsPes.gf b/src/persian/ParadigmsPes.gf index 35c9317a7..196e638fb 100644 --- a/src/persian/ParadigmsPes.gf +++ b/src/persian/ParadigmsPes.gf @@ -101,7 +101,7 @@ oper mkV3 : V -> (dir,indir : Str) -> V3 ; -- Takes a verb and two prepositions as strings (can be empty). If the verb takes را for direct object, it's the first Str argument. e.g. talk, با, دربارۀ - mkV3 v p q = lin V3 (v ** {c2 = p ; c3 = q}) ; + mkV3 v p q = lin V3 (v ** {c2 = prepOrRa p ; c3 = prepOrRa q}) ; mkV2V : V -> (cV, cN : Str) -> (isAux : Bool) -> V2V ; -- Verb, complementiser for the verb, complementiser for the noun, whether it's auxiliary. mkV2V v s1 s2 b = lin V2V (v ** {isAux = b ; c1 = s1 ; c2 = s2}) ; @@ -253,15 +253,20 @@ oper mkV2 = overload { mkV2 : Str -> V2 -- Predictable V2 with - = \s -> lin V2 (regV s ** {c2 = {s = [] ; ra = "را" ; c = VTrans}}) ; + = \s -> lin V2 (regV s ** {c2 = prepOrRa "را"}) ; mkV2 : V -> V2 - = \v -> lin V2 (v ** {c2 = {s = [] ; ra = "را" ; c = VTrans}}) ; + = \v -> lin V2 (v ** {c2 = prepOrRa "را"}) ; mkV2 : V -> Prep -> V2 - = \v,p -> lin V2 (v ** {c2 = {ra = [] ; s = p.s ; c = VTrans}}) ; + = \v,p -> lin V2 (v ** {c2 = prepOrRa p.s}) ; mkV2 : V -> Str -> V2 - = \v,ra -> lin V2 (v ** {c2 = {ra = ra ; s = [] ; c = VTrans}}) ; + = \v,ra -> lin V2 (v ** {c2 = prepOrRa ra}) ; mkV2 : V -> Str -> Bool -> V2 - = \v,p,b -> lin V2 (v ** {c2 = {ra = [] ; s = p ; c = VTrans}}) ; + = \v,p,b -> lin V2 (v ** {c2 = {ra = [] ; s = p}}) ; + } ; + + prepOrRa : Str -> Compl = \s -> case s of { + "را" => {s = [] ; ra = "را"} ; + prep => {s = prep ; ra = []} } ; mkN2 = overload { @@ -273,11 +278,12 @@ oper mkN3 = overload { mkN3 : N -> Str -> Str -> N3 - = \n,p,q -> lin N3 (n ** {c2=p ; c3=q}) ; + = \n,p,q -> lin N3 (n ** {c2 = p ; c3 = q}) ; mkN3 : N -> Prep -> Str -> Str -> N3 -- hidden from public API - = \n,p,q,r -> lin N3 (n ** {c2 = p.s ; c3 = q ; c4 = r}) -- there is no c4 + = \n,p,q,r -> lin N3 (n ** {c2 = p.s ; c3 = q ; c4 = r}) -- there is no c4 } ; + mkQuant = overload { -- mkQuant : Pron -> Quant = \p -> {s = \\_,_,c => p.s!c ;a = p.a ; lock_Quant = <>}; mkQuant : Str -> Str -> Quant -- hidden from public API diff --git a/src/persian/ResPes.gf b/src/persian/ResPes.gf index 671d12436..a6be9d891 100644 --- a/src/persian/ResPes.gf +++ b/src/persian/ResPes.gf @@ -59,18 +59,18 @@ resource ResPes = MorphoPes ** open Prelude,Predef in { oper VPH : Type = { - s : VPHForm => Str ; - obj : {s : Str ; a : Agr} ; -- direct object of a verb - subj : VType ; - comp : Agr => Str; -- complements of a verb; those other than a direct object. e.g. indirect object of ditransitive verbs. - vComp : Agr => Str; -- when a verb is used as a complement of an auxiliary verb, we store it in this field. Unlike ‘comp’ or ‘obj’, this type of complement follows the auxiliary verb. - ad : Str; + s : VPHForm => Str ; + comp : Agr => Str; -- complements of a verb, agr for e.g. CompCN "I am human/we are humans" + vComp : Agr => Str; -- when a verb is used as a complement of an auxiliary verb. Unlike ‘comp’ or ‘obj’, this type of complement follows the auxiliary verb. + obj : Str ; -- object of a verb; so far only used for A ("paint it black") + subj : VType ; + ad : Str ; embComp : Str ; -- when a declarative or interrogative sentence is used as a complement of a verb. - wish : Bool ; + wish : Bool ; -- whether a VV has been added } ; showVPH : VPHForm -> Agr -> VPH -> Str = \vf,agr,vp -> - vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.s ! vf ++ vp.vComp ! agr ++ vp.embComp ; + vp.ad ++ vp.comp ! agr ++ vp.obj ++ vp.s ! vf ++ vp.vComp ! agr ++ vp.embComp ; Compl : Type = {s : Str ; ra : Str} ; @@ -127,13 +127,13 @@ oper VPStem2 => verb.s ! Root2 ; VPInf => verb.s ! Inf; VPImp pol n =>verb.s ! Imp pol n }; - obj = {s = [] ; a = defaultAgr} ; subj = VIntrans ; - ad = []; + ad, + obj, embComp = []; wish = False ; + comp, vComp = \\_ => [] ; - comp = \\_ => [] } ; predVc : (Verb ** {c2,c1 : Str}) -> VPHSlash = \verb -> @@ -144,31 +144,32 @@ oper --------------------- -- VP complementation --------------------- + appComp : Compl -> Str -> Str = \c2,obj -> + c2.s ++ obj ++ c2.ra ; insertComp : (Agr => Str) -> VPH -> VPH = \obj,vp -> vp ** { comp = \\a => vp.comp ! a ++ obj ! a - } ; + } ; insertCompPre : (Agr=>Str) -> VPHSlash -> VPH = \obj,vp -> vp ** { - comp = \\a => vp.c2.s ++ obj ! a ++ vp.c2.ra ++ vp.comp ! a + comp = \\a => appComp vp.c2 (obj ! a) ++ vp.comp ! a } ; insertVV : (Agr => Str) -> VPH -> VPH = \obj1,vp -> vp ** { wish = True ; vComp = \\a => vp.comp ! a ++ obj1 ! a ; -- IL why this is vp.comp and not vp.vComp?? - } ; + } ; embComp : Str -> VPH -> VPH = \str,vp -> vp ** { embComp = vp.embComp ++ str ; - } ; - - insertObj : Str -> VPH -> VPH = \str,vp -> vp ** { - obj = vp.obj ** {s = str ++ vp.obj.s} } ; - -- TODO: comp or obj? /IL - insertObjPre : NP -> VPHSlash -> VPH = \np,vp -> vp ** { - comp = \\a => vp.c2.s ++ np.s ! Bare ++ vp.c2.ra ++ np.compl ++ vp.comp ! a + insertObj : Str -> VPH -> VPH = \str,vp -> vp ** { + obj = vp.obj ++ str + } ; + + complSlash : VPHSlash -> NP -> VPH = \vp,np -> vp ** { + comp = \\a => appComp vp.c2 (np.s ! Bare) ++ np.compl ++ vp.comp ! a } ; ---- AR 14/9/2017 trying to fix isAux = True case by inserting conjThat @@ -231,7 +232,7 @@ oper subj = np.s ! Bare ; vp = \\vt,b,ord => let vps = clTable vp ! np.a ! vt ! b - in vp.ad ++ vp.comp ! np.a ++ vp.obj.s ++ vps ++ vp.vComp ! np.a ++ vp.embComp + in vp.ad ++ vp.comp ! np.a ++ vp.obj ++ vps ++ vp.vComp ! np.a ++ vp.embComp }; --Clause : Type = {s : VPHTense => Polarity => Order => Str} ; @@ -239,9 +240,19 @@ oper s = \\vt,b,ord => let vps = clTable vp ! agr ! vt ! b ; quest = case ord of { ODir => [] ; OQuest => "آیا" } - in quest ++ subj ++ vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vps ++ vp.vComp ! agr ++ vp.embComp + in quest ++ subj ++ vp.ad ++ vp.comp ! agr ++ vp.obj ++ vps ++ vp.vComp ! agr ++ vp.embComp }; + ta2vt : Tense -> Anteriority -> VPHTense = \t,a -> case of { + => VPres ; + => VPerfPres ; + => VPast ; + => VPerfPast ; + => VFut ; + => VPerfFut ; + => VCondSimul ; + => VCondSimul } ; + predAux : Aux -> VPH = \verb -> { s = \\vh => case vh of { VPTense pol (VPPres Simul) agr => verb.inf ! AX pol (AuxPresent PrImperf) agr ; @@ -258,7 +269,7 @@ oper VPInf => "بودن"; VPImp _ _ => [] -- need to be confirmed }; - obj = {s = [] ; a = defaultAgr} ; + obj = [] ; subj = VIntrans ; ad = []; embComp = []; diff --git a/src/persian/SentencePes.gf b/src/persian/SentencePes.gf index 0938da99f..e20b9037c 100644 --- a/src/persian/SentencePes.gf +++ b/src/persian/SentencePes.gf @@ -13,8 +13,8 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { s = \\pol,n => let agr = Ag (numImp n) P2 ; in case vp.wish of { - True => vp.s ! VPImp pol (numImp n) ++ vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.vComp ! agr ++ vp.embComp; - False => vp.ad ++ vp.comp ! agr ++ vp.obj.s ++ vp.vComp ! agr ++ vp.s ! VPImp pol (numImp n) ++ vp.embComp } + True => vp.s ! VPImp pol (numImp n) ++ vp.ad ++ vp.comp ! agr ++ vp.obj ++ vp.vComp ! agr ++ vp.embComp; + False => vp.ad ++ vp.comp ! agr ++ vp.obj ++ vp.vComp ! agr ++ vp.s ! VPImp pol (numImp n) ++ vp.embComp } } ; @@ -28,7 +28,7 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { SlashPrep cl prep = { subj = [] ; ---- AR 18/9/2017 this can destroy SOV ; Cl should be made discont vp = cl.s ; - c2 = { s = prep.s ; ra = [] ; c = VIntrans} + c2 = prep ** {ra = []} } ; SlashVS np vs slash = @@ -41,61 +41,21 @@ concrete SentencePes of Sentence = CatPes ** open Prelude, ResPes,Predef in { EmbedVP vp = {s = showVPH VPInf defaultAgr vp} ; --- agr - UseCl temp p cl = - { s = case of { - => temp.s ++ p.s ++ cl.s ! VPres ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VPerfPres ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VPast ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VPerfPast ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VFut ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VPerfFut ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VCondSimul ! p.p ! ODir; - => temp.s ++ p.s ++ cl.s ! VCondAnter ! p.p ! ODir -- this needs to be fixed by making SubjPerf in ResPnb + UseCl temp p cl = let vt = ta2vt temp.t temp.a in { + s = temp.s ++ p.s ++ cl.s ! vt ! p.p ! ODir + } ; - }; - } ; - UseQCl temp p cl = { - s = \\q => case of { - => temp.s ++ p.s ++ cl.s ! VPres ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VPerfPres ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VPast ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VPerfPast ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VFut ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VPerfFut ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VCondSimul ! p.p ! q; - => temp.s ++ p.s ++ cl.s ! VCondAnter ! p.p ! q + UseQCl temp p qcl = let vt = ta2vt temp.t temp.a in { + s = \\q => temp.s ++ p.s ++ qcl.s ! vt ! p.p ! q; + } ; - }; - } ; + UseRCl temp p rcl = let vt = ta2vt temp.t temp.a in rcl ** { + s = \\q => temp.s ++ p.s ++ rcl.s ! vt ! p.p ! ODir ! q + } ; - UseRCl temp p rcl = { - s = \\q => case of { - => temp.s ++ p.s ++ rcl.s ! VPres ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VPerfPres ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VPast ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VPerfPast ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VFut ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VPerfFut ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VCondSimul ! p.p ! ODir ! q; - => temp.s ++ p.s ++ rcl.s ! VCondAnter ! p.p ! ODir ! q - }; - c = rcl.c - } ; - - UseSlash temp p clslash = { - s = temp.s ++ p.s ++ clslash.subj ++ - case of { - => clslash.vp ! VPres ! p.p ! ODir; - => clslash.vp ! VPerfPres ! p.p ! ODir; - => clslash.vp ! VPast ! p.p ! ODir ; - => clslash.vp ! VPerfPast ! p.p ! ODir; - => clslash.vp ! VFut ! p.p ! ODir; - => clslash.vp ! VPerfFut ! p.p ! ODir; - => clslash.vp ! VCondSimul ! p.p ! ODir; - => clslash.vp ! VCondSimul ! p.p ! ODir - }; - c2 = clslash.c2 - } ; + UseSlash temp p cls = let vt = ta2vt temp.t temp.a in cls ** { + s = temp.s ++ p.s ++ cls.subj ++ cls.vp ! vt ! p.p ! ODir + } ; AdvS a s = {s = a.s ++ s.s} ; diff --git a/src/persian/VerbPes.gf b/src/persian/VerbPes.gf index bd5a0e2ba..393996842 100644 --- a/src/persian/VerbPes.gf +++ b/src/persian/VerbPes.gf @@ -4,20 +4,20 @@ concrete VerbPes of Verb = CatPes ** open ResPes,Prelude in { flags optimize=all_subs ; lin - UseV v = predV v ; - SlashV2a v = predV v ** {c2 = v.c2} ; --{s = v.c2.s ; ra = v.c2.ra ; c = VTrans}} ; - Slash2V3 v np = {c2 = {s = [] ; ra = v.c3}} ** - insertObj (np.s ! Bare ++ v.c2) (predV v) ; -- ** ; c = VTrans}}) ; + UseV v = predV v ; + SlashV2a v = v ** predV v; + Slash2V3 v np = {c2 = v.c3} ** + complSlash (predV v ** {c2 = v.c2}) np ; - Slash3V3 v np = {c2 = {s = [] ; ra = v.c2}} ** - insertObj (v.c3 ++ np.s ! Bare) (predV v) ; -- ** ; c = VTrans}}) ; + Slash3V3 v np = {c2 = v.c2} ** + complSlash (predV v ** {c2 = v.c3}) np ; - ComplSlash vp np = insertObjPre np vp ; + ComplSlash = complSlash ; ComplVV v vp = insertVV (infVV v.isAux vp) (predV v) ; ComplVS v s = embComp (conjThat ++ s.s) (predV v) ; ComplVQ v q = embComp (conjThat ++ q.s ! QIndir) (predV v) ; - ComplVA v ap = insertComp (\\_ => ap.s ! Bare) (predV v) ; -- check form of adjective + ComplVA v ap = insertObj (ap.s ! Bare) (predV v) ; -- check form of adjective SlashV2V v vp = insertVV (infVV v.isAux vp) (predV v) **{c2 = {s = v.c1 ; ra = []}} ; SlashV2S v s = v ** embComp (conjThat ++ s.s) (predV v) ; @@ -28,8 +28,8 @@ concrete VerbPes of Verb = CatPes ** open ResPes,Prelude in { SlashV2VNP v2v np vps = let vvVP : VPH = insertVV (infVV v2v.isAux vps) (predV v2v) ; - vvVPS = vvVP ** {c2={s=v2v.c1 ; ra=v2v.c2}} ; - in insertObjPre np vvVPS ** {c2 = vps.c2} ; + vvVPS = vvVP ** {c2={s=v2v.c1 ; ra=v2v.c2}} ; -- TODO find out if it's a general rule; only one V2V in the lexicon /IL + in complSlash vvVPS np ** {c2 = vps.c2} ; UseComp comp = insertComp comp.s (predAux auxBe) ; @@ -39,7 +39,7 @@ concrete VerbPes of Verb = CatPes ** open ResPes,Prelude in { AdVVP adv vp = insertAdV adv.s vp ; ReflVP v = insertCompPre reflPron v ; PassV2 v = predV v ; -- need to be fixed - CompAP ap ={s = \\_ => ap.s ! Bare} ; -- check form of adjective + CompAP ap = {s = \\_ => ap.s ! Bare} ; -- check form of adjective CompAdv adv = {s = \\_ => adv.s } ; -- see https://sites.la.utexas.edu/persian_online_resources/nouns/noun-in-a-predicative-position/ From 5a2aedbffa6357fea1ec2da35ae87db372fdaa08 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 22 Feb 2019 17:50:15 +0100 Subject: [PATCH 5/5] (Pes) WIP merge auxBe and beVerb --- src/persian/MorphoPes.gf | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/persian/MorphoPes.gf b/src/persian/MorphoPes.gf index 3a85bf809..adc16b280 100644 --- a/src/persian/MorphoPes.gf +++ b/src/persian/MorphoPes.gf @@ -329,6 +329,7 @@ oper _ => mkCmnVF dasht dar pol t ag } ; + -- TODO: merge with auxBe in ResPes beVerb : Verb = { s = table { Vvform agr => imperfectSuffixD agr "باش" ; Imp Pos Sg => "باش" ; @@ -338,7 +339,18 @@ oper Inf => "بودن" ; Root1 => "بود" ; Root2 => "باش" ; - VF pol tense agr => mkCmnVF "بود" "باش" pol tense agr - } + VF pol tense agr => + let impfSuff = imperfectSuffix agr ; + perfSuff = perfectSuffix agr + in case of { + => "است" ; + => impfSuff "هست" ; + => perfSuff "بوده" ; + => "نیست" ; + => impfSuff "نیست" ; + => perfSuff "نبوده" ; + _ => mkCmnVF "بود" "باش" pol tense agr + } + } } ; }