From b25ae6bff801add6b1c4408194078ec8be699875 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 21 Dec 2018 15:53:50 +0100 Subject: [PATCH] (Ara) Handle defective nouns with sound feminine plural --- src/arabic/ParadigmsAra.gf | 24 ++++++++++++++---------- src/arabic/ResAra.gf | 21 ++++++++++++++++----- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/arabic/ParadigmsAra.gf b/src/arabic/ParadigmsAra.gf index 8aa944c5..38a9f596 100644 --- a/src/arabic/ParadigmsAra.gf +++ b/src/arabic/ParadigmsAra.gf @@ -104,6 +104,8 @@ resource ParadigmsAra = open sdmN : Str -> Str -> Gender -> Species -> N ; + + --3 Proper names mkPN = overload { @@ -185,7 +187,7 @@ resource ParadigmsAra = open mkSubj : overload { mkSubj : Str -> Subj ; -- Default order Subord (=noun first and in accusative) mkSubj : Str -> Order -> Subj -- Specify word order - } ; + } ; --2 Prepositions -- @@ -364,9 +366,9 @@ resource ParadigmsAra = open = attrN Sg ; mkN : Number -> N -> N -> N -- Compound nouns where attribute inflects in state, case and number = attrN ; - mkN : N -> A -> N + mkN : N -> A -> N = mkAN ; - mkN : N -> AP -> N + mkN : N -> AP -> N = mkAPN } ; @@ -543,13 +545,15 @@ resource ParadigmsAra = open }; sdfN = - \root,sg,gen,spec -> - let { kalimaStr = mkWord sg root; - kalimaRaw : NTable = case gen of { + \root,sg,gen,spec -> let { + kalimaStr = case root of { + x@? + y@? + "ي" => mkDefectiveAlifMaqsura (mkPat sg) (mkRoot3 root) ; + _ => mkWord sg root } ; + kalimaRaw : NTable = case gen of { Fem => sndf kalimaStr ; - Masc => sgMsndf kalimaStr } ; - kalima : NTable = \\n,d,c => - rectifyHmz (kalimaRaw ! n ! d ! c) + Masc => sgMsndf kalimaStr } ; -- TODO this isn't actually the case of gender, add an argument + kalima : NTable = \\n,d,c => + rectifyHmz (kalimaRaw ! n ! d ! c) } in mkFullN kalima gen spec; sdmN = @@ -690,7 +694,7 @@ resource ParadigmsAra = open mkSubj = overload { mkSubj : Str -> Subj = \s -> lin Subj {s = s ; o = Subord} ; mkSubj : Str -> Order -> Subj = \s,o -> lin Subj {s = s ; o = o} ; - } ; + } ; dirV2 v = prepV2 v (casePrep acc) ; diff --git a/src/arabic/ResAra.gf b/src/arabic/ResAra.gf index f39acc20..2218ddc1 100644 --- a/src/arabic/ResAra.gf +++ b/src/arabic/ResAra.gf @@ -55,6 +55,13 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { _ => error ("mkRoot2: too short root" ++ fcl) }; + mkPat : Str -> Pattern = \pat -> + case pat of { + w + "ف" + x + "ع" + y + "ل" + z + => { h = w ; m1 = x; m2 = y; t = z} ; + w + "ف" + x + ("ع"|"ل") + y + => { h = w ; m1 = x; m2 = ""; t = y} + } ; --opers to interdigitize (make words out of roots and patterns: oper @@ -65,6 +72,9 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { mkDefective : Pattern -> Root3 -> Str = \p,fcl -> p.h + fcl.f + p.m1 + fcl.c + p.t; + mkDefectiveAlifMaqsura : Pattern -> Root3 -> Str = \p,fcl -> + p.h + fcl.f + p.m1 + fcl.c + p.t + "َى" ; + mkHollow : Pattern -> Root3 -> Str = \p,fcl -> p.h + fcl.f + p.m1 + fcl.l + p.t; @@ -85,14 +95,13 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { --takes a pattern string and root string and makes a word mkWord : Str -> Str -> Str =\pS, rS -> + let pat = mkPat pS in case pS of { w + "ف" + x + "ع" + y + "ل" + z => - let pat = { h = w ; m1 = x; m2 = y; t = z} in case rS of { - x@? + y@? + "ّ" => mkStrong pat (mkRoot3 (x+y+y)) ; -- In principle, shadda shouldn't be in the root, but if someone puts one, this should fix it. /IL + x@? + y@? + "ّ" => mkStrong pat (mkRoot3 (x+y+y)) ; -- In principle, shadda shouldn't be in the root when dealing with strong inflection, but if someone puts one, this should fix it. /IL _ => mkStrong pat (mkRoot3 rS) } ; w + "ف" + x + "ع" + y => - let pat = { h = w ; m1 = x; m2 = ""; t = y} in case rS of { x + "ّ" => mkBilit pat (mkRoot2 x) ; -- fc~ x@? + y@? + ("و"|"ي") @@ -1016,7 +1025,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> --takes the sound noun in singular and gives the --complete noun inflection table of sound feminine plural - sndf : Str -> NTable = + sndf : Str -> NTable = \lawHa -> table { Sg => sing lawHa ; @@ -1049,7 +1058,6 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> -- determine the declension and gives the corresponding inf table brkPl : Str -> State => Case => Str = \word -> \\s,c => defArt s c (case word of { - lemma + "ِيّ" => fixShd word (dec1sg ! s ! c) ; -- nisba lemma + "ِي" => fixShd lemma (dec2sg ! s ! c) ; -- 2nd declension _ + ("ا"|"ى") => fixShd word (dec3sg ! s ! c) ; lemma + (#hamza|#hamzaseat) @@ -1219,6 +1227,9 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> } }; + -- TODO: this isn't actually because of gender, it "just happens". + -- Refactor the whole sdfN and make variant with a parameter + -- whether to insert a و or ه or something else /IL mkAtMasc : Str -> Str = \x -> case x of { y + "ة" => y + "ات";