diff --git a/src/persian/AdverbPes.gf b/src/persian/AdverbPes.gf index 026d2dd1b..3d6df3b6d 100644 --- a/src/persian/AdverbPes.gf +++ b/src/persian/AdverbPes.gf @@ -16,7 +16,12 @@ concrete AdverbPes of Adverb = CatPes ** open ResPes, Prelude in { AdAdv ada adv = { s = ada.s ++ adv.s} ; -- SubjS = cc2 ; - SubjS sub snt = {s = sub.s ++ conjThat ++ snt.s ! sub.compl} ; + SubjS sub snt = { + s = case sub.relpron of { + Ke => sub.s ++ conjThat ++ snt.s ! sub.compl ; + Ance => "آنچه" ++ snt.s ! sub.compl } + } ; + AdnCAdv cadv = {s = cadv.s ++ "از"} ; } diff --git a/src/persian/CatPes.gf b/src/persian/CatPes.gf index cd39cb741..87436ec83 100644 --- a/src/persian/CatPes.gf +++ b/src/persian/CatPes.gf @@ -71,8 +71,12 @@ concrete CatPes of Cat = CommonX ** open ResPes, Prelude in { Conj = {s1,s2 : Str ; n : Number} ; -----b Conj = {s : Str ; n : Number} ; -----b DConj = {s1,s2 : Str ; n : Number} ; - Subj = {s : Str ; compl : VVForm} ; -- subjunctive or indicative - VS = ResPes.Verb ** {compl : VVForm} ; -- subjunctive or indicative + Subj = { + s : Str ; + compl : VVForm ; -- subjunctive or indicative + relpron : RelPron -- choose between که and آنچه + } ; + VS = ResPes.Verb ** {compl : VVForm} ; -- subjunctive or indicative Prep = Compl ; ---- Open lexical classes, e.g. Lexicon V, VQ = ResPes.Verb ; @@ -86,8 +90,8 @@ concrete CatPes of Cat = CommonX ** open ResPes, Prelude in { N = ResPes.Noun ; - N2 = ResPes.Noun ** {c2 : Str ; compl : Str}; -- when N3 is made to N2, need to retain compl - N3 = ResPes.Noun ** {c2 : Str ; c3 : Str} ; + N2 = ResPes.Noun ** {c2 : Compl ; compl : Str}; -- when N3 is made to N2, need to retain compl + N3 = ResPes.Noun ** {c2 : Compl ; c3 : Compl} ; PN = {s : Str ; animacy : Animacy} ; } diff --git a/src/persian/LexiconPes.gf b/src/persian/LexiconPes.gf index 28ca642ea..c9e6cff1c 100644 --- a/src/persian/LexiconPes.gf +++ b/src/persian/LexiconPes.gf @@ -65,7 +65,7 @@ concrete LexiconPes of Lexicon = CatPes ** cow_N = mkN01 "گاو" animate; die_V = mkV "مردن" "میر" ; dirty_A = mkA "کثیف" ; - distance_N3 = (mkN "فاصله" "فواصل" inanimate ) ** {c2="از" ; c3 = "تا"}; + distance_N3 = mkN3 (mkN "فاصله" "فواصل" inanimate ) "از" "تا" ; doctor_N = mkN01 "دکتر" animate; -- has variant "پزشک", but only a doctor in medicine dog_N = mkN01 "سگ" animate; door_N = mkN01 "در" inanimate; diff --git a/src/persian/MorphoPes.gf b/src/persian/MorphoPes.gf index 2c294f37b..78d075395 100644 --- a/src/persian/MorphoPes.gf +++ b/src/persian/MorphoPes.gf @@ -25,6 +25,10 @@ oper -- fatha : Str = "َ" ; kasre,fatha : Str = [] ; + -- for appComp + -- runtimeKasre : Str -> Str = \s -> glue s kasre ; + runtimeKasre : Str -> Str = \s -> s ; + ---- Nouns param @@ -316,7 +320,7 @@ oper haveVerb : Verb = haveRegV ** {s = table { ImpPrefix _ => [] ; - VAor Neg agr => imperfectSuffix agr (addN "دار") ; + VAor Neg agr => imperfectSuffixD agr (addN "دار") ; VSubj pol agr => haveRegV.s ! VPerf pol agr ; vf => haveRegV.s ! vf } } where { haveRegV = mkVerb "داشتن" "دار" } ; diff --git a/src/persian/NounPes.gf b/src/persian/NounPes.gf index 428ab04ce..9a222dcfa 100644 --- a/src/persian/NounPes.gf +++ b/src/persian/NounPes.gf @@ -119,14 +119,14 @@ concrete NounPes of Noun = CatPes ** open ResPes, Prelude in { } ; ComplN2 n2 np = n2 ** { - s = \\n,m => n2.s ! n ! Ezafe ; - compl = \\_ => n2.compl ++ n2.c2 ++ np2str np ; + s = \\n,m => n2.s ! n ! n2.c2.mod ; + compl = \\_ => n2.compl ++ n2.c2.s ++ np2str np ; hasAdj = False }; ComplN3 n3 np = n3 ** { - s = \\n,m => n3.s ! n ! Ezafe ; - compl = n3.c2 ++ np2str np ; + s = \\n,m => n3.s ! n ! n3.c2.mod ; + compl = n3.c2.s ++ np2str np ; c = n3.c3; } ; diff --git a/src/persian/NumeralPes.gf b/src/persian/NumeralPes.gf index 5051074d9..3e1f767b3 100644 --- a/src/persian/NumeralPes.gf +++ b/src/persian/NumeralPes.gf @@ -72,7 +72,7 @@ lin pot3plus n m = { } ; -} D_0 = mkDig "0" ; - D_1 = mk3Dig "1" "" Pl; + D_1 = mk3Dig "1" "" Sg ; D_2 = mk2Dig "2" ""; D_3 = mk2Dig "3" "سوم" ; D_4 = mkDig "4" ; diff --git a/src/persian/ParadigmsPes.gf b/src/persian/ParadigmsPes.gf index dd86f8e06..c65e8f96e 100644 --- a/src/persian/ParadigmsPes.gf +++ b/src/persian/ParadigmsPes.gf @@ -42,11 +42,13 @@ oper } ; mkN2 : overload { - mkN2 : (key : N) -> (to : Str) -> N2 -- Takes a noun and a complementiser, returns a N2. + mkN2 : (key : N) -> (to : Str) -> N2 ; -- Takes a noun and a complementiser as a string, returns a N2. + mkN2 : (key : N) -> (to : Prep) -> N2 -- Takes a noun and a complementiser as a Prep, returns a N2. } ; mkN3 : overload { - mkN3 : (distance : N) -> (from,to : Str) -> N3 -- Takes a noun and two complementisers, returns a N3. + mkN3 : (distance : N) -> (from,to : Str) -> N3 ; -- Takes a noun and two complementisers as strings, returns a N3. + mkN3 : (distance : N) -> (from,to : Prep) -> N3 -- Takes a noun and two complementisers as Preps, returns a N3. } ; -- Compound Nouns @@ -124,7 +126,7 @@ oper mkV3 = overload { mkV3 : Str -> V3 -- Predictable V3, را for direct object, no prepositions. - = \s -> lin V3 (regV s ** {c2 = prepOrRa "را" ; c3 = prepOrRa []}) ; + = \s -> lin V3 (regV s ** {c2 = prepOrRa "را" ; c3 = noPrep}) ; mkV3 : V -> (dir,indir : Str) -> V3 -- Takes a verb and two prepositions or را as strings (can be empty). = \v,p,q -> lin V3 (v ** {c2 = prepOrRa p ; c3 = prepOrRa q}) ; mkV3 : V -> (dir,indir : Prep) -> V3 -- Takes a verb and two prepositions @@ -140,9 +142,9 @@ oper mkVA = overload { mkVA : Str -> VA -- predictable verb with adjective complement - = \s -> lin VA (regV s ** {c2 = prepOrRa []}) ; + = \s -> lin VA (regV s ** {c2 = noPrep}) ; mkVA : V -> VA -- VA out of a verb - = \v -> lin VA (v ** {c2 = prepOrRa []}) ; + = \v -> lin VA (v ** {c2 = noPrep}) ; mkVA : V -> Prep -> VA -- VA out of a verb and preposition = \v,p -> lin VA (v ** {c2 = p}) ; } ; @@ -214,9 +216,9 @@ oper mkSubj = overload { mkSubj : Str -> Subj -- Takes its verbal complement in indicative. - = \s -> lin Subj {s=s ; compl=indicative} ; + = \s -> mkSubj' s ; mkSubj : VVForm -> Str -> Subj -- Specify whether it takes complement in subjunctive or indicative. - = \vvf,s -> lin Subj {s=s ; compl=vvf} + = \vvf,s -> mkSubj' s ** {compl=vvf} } ; mkInterj : Str -> Interj @@ -246,6 +248,13 @@ oper Mod = ResPes.Mod ; ezafe = ResPes.Ezafe ; + + mkSubj' : Str -> Subj ; + mkSubj' s = lin Subj (case s of { + "آن" => {s = [] ; relpron = Ance ; compl = indicative} ; + _ => {s = s ; relpron = Ke ; compl = indicative} + }) ; + -- Removed mkV_1, mkV_2, mkN01 and mkN02 from public API, still available for -- any applications that open ParadigmsPes. /IL 2019-02-08 mkV_1 : Str -> V @@ -360,25 +369,29 @@ oper "را" => {s = [] ; ra = "را" ; mod=Bare} ; prep => {s = prep ; ra = []; mod=Bare} } ; + noPrep = prepOrRa [] ; + ezafePrep = {s = [] ; ra = [] ; mod=Ezafe} ; mkPost : Str -> Prep = \s -> lin Prep {s=[] ; ra=s ; mod=Bare} ; mkN2 = overload { mkN2 : Str -> N2 -- Predictable N2 without complement - = \s -> lin N2 (mkN01 s inanimate ** {c2,compl = []}) ; + = \s -> lin N2 (mkN01 s inanimate ** {c2 = ezafePrep ; compl = []}) ; mkN2 : N -> N2 -- N2 from without complement - = \n -> lin N2 (n ** {c2,compl = []}) ; + = \n -> lin N2 (n ** {c2 = ezafePrep ; compl = []}) ; mkN2 : N -> Str -> N2 - = \n,c -> lin N2 (n ** {c2 = c ; compl = []}) ; + = \n,c -> lin N2 (n ** {c2 = prepOrRa c ; compl = []}) ; mkN2 : N -> Prep -> Str -> N2 -- hidden from puclic API - = \n,p,c -> lin N2 (n ** {c2 = p.s; compl = []}) + = \n,p,c -> lin N2 (n ** {c2 = p; compl = []}) } ; mkN3 = overload { mkN3 : N -> Str -> Str -> N3 + = \n,p,q -> lin N3 (n ** {c2 = prepOrRa p ; c3 = prepOrRa q}) ; + mkN3 : N -> Prep -> Prep -> N3 = \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 ; c3 = prepOrRa q ; c4 = r}) -- there is no c4 } ; diff --git a/src/persian/ResPes.gf b/src/persian/ResPes.gf index 8235a477b..cc773a539 100644 --- a/src/persian/ResPes.gf +++ b/src/persian/ResPes.gf @@ -149,7 +149,9 @@ oper -- VP complementation --------------------- appComp : Compl -> (Mod=>Str) -> Str = \c2,obj -> - c2.s ++ obj ! c2.mod ++ c2.ra ; + case c2.mod of { + Ezafe => runtimeKasre c2.s ++ obj ! Bare ++ c2.ra ; + _ => c2.s ++ obj ! c2.mod ++ c2.ra } ; insertComp : (Agr => Str) -> VPH -> VPH = \obj,vp -> vp ** { comp = \\a => vp.comp ! a ++ obj ! a