From bb353fcbf73c8eded4ddfb4493f9614c11c5fbd7 Mon Sep 17 00:00:00 2001 From: "ali.eldada" Date: Tue, 25 Dec 2007 23:30:26 +0000 Subject: [PATCH] 20071225_ArabicRG --- lib/resource/arabic/AdjectiveAra.gf | 15 +- lib/resource/arabic/AdverbAra.gf | 2 +- lib/resource/arabic/CatAra.gf | 46 +++-- lib/resource/arabic/LexiconAra.gf | 28 +-- lib/resource/arabic/MorphoAra.gf | 8 +- lib/resource/arabic/NounAra.gf | 263 +++++++++++++++++---------- lib/resource/arabic/NumeralAra.gf | 205 ++++++++++++--------- lib/resource/arabic/ParadigmsAra.gf | 36 +++- lib/resource/arabic/PatternsAra.gf | 2 + lib/resource/arabic/ResAra.gf | 235 +++++++++++++++--------- lib/resource/arabic/SentenceAra.gf | 2 + lib/resource/arabic/StructuralAra.gf | 37 ++-- 12 files changed, 532 insertions(+), 347 deletions(-) diff --git a/lib/resource/arabic/AdjectiveAra.gf b/lib/resource/arabic/AdjectiveAra.gf index b6e0f551a..f324d95d3 100644 --- a/lib/resource/arabic/AdjectiveAra.gf +++ b/lib/resource/arabic/AdjectiveAra.gf @@ -2,15 +2,14 @@ concrete AdjectiveAra of Adjective = CatAra ** open ResAra, Prelude in { lin + PositA a = { - s = - table { - Hum => a.s ; - NoHum => \\g,n => - case n of { - Pl => a.s ! Fem ! Sg ; - _ => a.s ! g ! n - } + s = \\h,g,n,d,c => case h of { + Hum => a.s ! APosit g n d c; + NoHum => case n of { + Pl => a.s ! APosit Fem Sg d c ; + _ => a.s ! APosit g n d c + } } }; -- ComparA a np = { diff --git a/lib/resource/arabic/AdverbAra.gf b/lib/resource/arabic/AdverbAra.gf index f42480b99..5c2cbdfb6 100644 --- a/lib/resource/arabic/AdverbAra.gf +++ b/lib/resource/arabic/AdverbAra.gf @@ -1,7 +1,7 @@ concrete AdverbAra of Adverb = CatAra ** open ResAra, Prelude in { lin - PositAdvAdj a = {s = a.s ! Masc ! Sg ! Indef ! Acc} ; + PositAdvAdj a = {s = a.s ! APosit Masc Sg Indef Acc} ; -- ComparAdvAdj cadv a np = { -- s = cadv.s ++ a.s ! AAdv ++ "مِنْ" ++ np.s ! Gen -- } ; diff --git a/lib/resource/arabic/CatAra.gf b/lib/resource/arabic/CatAra.gf index 89d9ef5e1..8b1a14d2e 100644 --- a/lib/resource/arabic/CatAra.gf +++ b/lib/resource/arabic/CatAra.gf @@ -44,49 +44,55 @@ concrete CatAra of Cat = CommonX - [Utt] ** open ResAra, Prelude, ParamX in { -- Noun - CN = ResAra.Noun; + CN = ResAra.Noun ** {adj : NTable}; NP, Pron = ResAra.NP; --{s : Case => Str ; a : Agr } ; Num, Ord = {s : Gender => State => Case => Str ; n : Size }; Predet = ResAra.Predet ; ---- DEPREC QuantSg, QuantPl = ---- {s : Species => Gender => Case => Str; ---- n : ResAra.Number; d : State; isNum : Bool} ; + +-- DEPRECATED +-- QuantSg, QuantPl = +-- {s : Species => Gender => Case => Str; +-- n : ResAra.Number; +-- d : State; +-- isNum : Bool; +-- isPron : Bool} ; + Det = ResAra.Det ; --- {s : Species => Gender => Case => Str ; d : State; n : Size; isNum : Bool } ; - Quant = {s : ResAra.Number => Species => Gender => Case => Str; d : State} ; - --- Adverb - --- Adv, AdV, AdA, AdS, AdN = {s : Str} ; +-- {s : Species => Gender => Case => Str ; +-- d : State; n : Size; isNum : Bool } ; + Quant = {s : ResAra.Number => Species => Gender => Case => Str; + d : State; + isNum : Bool; + isPron: Bool} ; -- Numeral - Numeral,Digits = {s : Gender => State => Case => Str ; + Numeral = {s : CardOrd => Gender => State => Case => Str ; n : Size } ; + Digits = {s : Str; + n : Size}; +-- Structural ----- Structural --- Conj = {s : Str ; n : ResAra.Number} ; -- DConj = {s1,s2 : Str ; n : ResAra.Number} ; --- PConj = {s : Str} ; --- CAdv = {s : Str} ; -- Subj = {s : Str} ; Prep = {s : Str} ; --- + -- Open lexical classes, e.g. Lexicon V, VS, VQ, VA = ResAra.Verb ; -- = {s : VForm => Str} ; V2, V2A = ResAra.Verb ** {c2 : Str} ; V3 = ResAra.Verb ** {c2, c3 : Str} ; -- VV = {s : VVForm => Str ; isAux : Bool} ; --- + A = ResAra.Adj ; A2 = ResAra.Adj ** {c2 : Str} ; --- - N, N2 = ResAra.Noun ; --{s : ResAra.Number => State => Case => Str; g : Gender ; h = Species} ; --- N2 = {s : ResAra.Number => Case => Str} ** {c2 : Str} ; + + N, N2 = ResAra.Noun ; +--{s : ResAra.Number => State => Case => Str; g : Gender ; h = Species} ; +-- N2 = {s : ResAra.Number => Case => Str} ** {c2 : Str} ;?? N3 = ResAra.Noun ** {c2,c3 : Str} ; PN = {s : Case => Str; g : Gender; h : Species} ; diff --git a/lib/resource/arabic/LexiconAra.gf b/lib/resource/arabic/LexiconAra.gf index b29e6ee94..ab44e5faa 100644 --- a/lib/resource/arabic/LexiconAra.gf +++ b/lib/resource/arabic/LexiconAra.gf @@ -25,10 +25,10 @@ flags become_VA = mkVA (v4 "صبح") ; beer_N = sdfN "بير" "فِعلة" Fem NoHum ; beg_V2V = dirV2 (v5 "وسل") ; - big_A = sndA "كبر" "فَعِيل" ; +-} big_A = sndA "كبر" "فَعِيل" ; bike_N = sdfN "درج" "فَعّالة" Fem NoHum ; bird_N = brkN "طير" "فَعل" "فُعُول" Masc NoHum; - black_A = clrA "سود" ; +{- black_A = clrA "سود" ; blue_A = clrA "زرق" ; boat_N = brkN "قرب" "فاعِل" "فَواعِل" Masc NoHum ; book_N = brkN "كتب" "فِعال" "فُعُل" Masc NoHum ; @@ -97,8 +97,8 @@ flags -- go_V = v1 "ذهب" a a ; green_A = clrA "خضر" ; harbour_N = brkN "رف؟" "مَفعَل" "مَفاعِل" Masc NoHum ; --mInA', marsaY - hate_V2 = dirV2 (regV "كَرِه") ; - hat_N = sdfN "قبع" "فُعَّلة" Fem NoHum ; +-} hate_V2 = dirV2 (regV "كَرِه") ; +{- hat_N = sdfN "قبع" "فُعَّلة" Fem NoHum ; have_V2 = dirV2 (regV "يَملِك") ; -- have_V2 = dirV2 (v1 "ملك" a i) ; hear_V2 = dirV2 (regV "سَمِع") ; @@ -107,8 +107,8 @@ flags hope_VS = mkVS (v1 "رجو" a u) ; --check horse_N = brkN "حصن" "فِعال" "أَفعِلة" Masc NoHum ; hot_A = sndA "سخن" "فاعِل" ; --HAr - house_N = brkN "بيت" "فَعل" "فُعُول" Masc NoHum ; --manzil - important_A = sndA "هيم" "فاعّ" ; +-} house_N = brkN "بيت" "فَعل" "فُعُول" Masc NoHum ; --manzil +{- important_A = sndA "هيم" "فاعّ" ; industry_N = sdfN "صنع" "فِعالة" Fem NoHum ; iron_N = brkN "حدّ" "فَعِيل" "فَعائِل" Masc NoHum ; king_N = brkN "ملك" "فَعِل" "فُعُول" Masc Hum ; @@ -147,8 +147,8 @@ flags paint_V2A = mkV2A (regV "يَدهَن" ) [] ; -- paint_V2A = mkV2A (v1 "دهن" a a ) [] ; paper_N = brkN "ورق" "فَعَلة" "أَفعال" Fem NoHum ; --} paris_PN = mkPN "بارِيس" Fem NoHum ; -{- peace_N = brkN "سلم" "فَعال" "فَعال" Masc NoHum; --no plur + paris_PN = mkPN "بارِيس" Fem NoHum ; + peace_N = brkN "سلم" "فَعال" "فَعال" Masc NoHum; --no plur pen_N = brkN "قلم" "فَعَل" "أَفعال" Masc NoHum; planet_N = mkN (reg "كَوكَب" "كَواكِب") Masc NoHum ; -- quadriconsonantal plastic_N = mkN (sndf "بلاستِيك") Masc NoHum ; @@ -239,8 +239,8 @@ flags do_V2 = dirV2 (regV "يَفعَل") ; -- do_V2 = dirV2 (v1 "فعل" a a ) ; - now_Adv = mkAdv "الآن" ; - already_Adv = mkAdv "سابِقاً" ; +-} now_Adv = mkAdv "الآن" ; +{- already_Adv = mkAdv "سابِقاً" ; song_N = brkN "غني" "أَفعِلة" "أَفاعِي" Fem NoHum ; add_V3 = dirV3 (regV "يَجمَع") "وَ" ; -- add_V3 = dirV3 (v1 "جمع" a a) "وَ" ; @@ -305,10 +305,10 @@ flags leg_N = brkN "رجل" "فِعل" "أَفعُل" Fem NoHum; liver_N = brkN "كبد" "فَعِل" "أَفعال" Masc NoHum ; louse_N = sdfN "قمل" "فَعلة" Fem NoHum; - mouth_N = brkN "فوه" "فُعل" "أَفعال" Masc NoHum ; - name_N = brkN "؟سم" "فِعل" "فَعالِي" Masc NoHum; - neck_N = brkN "رقب" "فَعَلة" "فِعال" Fem NoHum; - night_N = brkN "ليل" "فَعلة" "فَعالِي" Fem NoHum; --plural? +-} mouth_N = brkN "فوه" "فُعل" "أَفعال" Masc NoHum ; + name_N = brkN "؟سم" "فِعل" "فَعالِي" Masc NoHum; +{- neck_N = brkN "رقب" "فَعَلة" "فِعال" Fem NoHum; + night_N = brkN "ليل" "فَعلة" "فَعالِي" Fem NoHum; --plural? nose_N = brkN "؟نف" "فَعل" "فُعُول" Masc NoHum; person_N = brkN "شخص" "فَعل" "أَفعال" Masc Hum; rain_N = brkN "مطر" "فَعَل" "أَفعال" Masc NoHum; diff --git a/lib/resource/arabic/MorphoAra.gf b/lib/resource/arabic/MorphoAra.gf index 9bdfc4f86..0ab4332ca 100644 --- a/lib/resource/arabic/MorphoAra.gf +++ b/lib/resource/arabic/MorphoAra.gf @@ -8,8 +8,9 @@ flags optimize = all ;--noexpand; = \word,num,state -> { s = \\_,_,c => word + vowel ! c ; n = numberToSize num; - d = state; - isNum = False + d = state; --only Const is used now. check StructuralAra + isNum = False; + isPron = False }; mkPredet : Str -> Bool -> Predet @@ -23,7 +24,7 @@ flags optimize = all ;--noexpand; }; mkQuantNum : Str -> Number -> State -> { - s: Species => Gender => Case => Str; n: Number; d : State; isNum : Bool} = + s: Species => Gender => Case => Str; n: Number; d : State; isPron: Bool; isNum : Bool} = \waHid,num,state -> let waHida = waHid + "َة" in { s = \\_,g,c => @@ -34,6 +35,7 @@ flags optimize = all ;--noexpand; } in Al ! state + word + dec1sg ! state ! c; n = num; d = state; + isPron = False; isNum = True }; diff --git a/lib/resource/arabic/NounAra.gf b/lib/resource/arabic/NounAra.gf index 69a6b35e7..c32479a12 100644 --- a/lib/resource/arabic/NounAra.gf +++ b/lib/resource/arabic/NounAra.gf @@ -1,107 +1,170 @@ concrete NounAra of Noun = CatAra ** open ResAra, Prelude in { - flags optimize=all_subs ; +flags optimize=noexpand ; - lin +lin - DetCN det cn = - let { - number = sizeToNumber det.n; - determiner : Case -> Str = \c -> - det.s ! cn.h ! (detGender cn.g det.n) ! c; - noun : Case -> Str = \c -> - cn.s ! number ! (nounState det.d number) ! (nounCase c det.n det.d) - } in - { s = \\c => - case detAsAdj det.isNum det.n det.d of { - False => determiner c ++ noun c; - --FIXME use the adj -> cn -> cn rule from below instead of repeating code - True => cn.s ! number ! det.d ! c ++ det.s ! cn.h ! cn.g ! c - }; - a = { pgn = agrP3 cn.h cn.g number; - isPron = False } - }; - - UsePN pn = { - s = pn.s; - a = {pgn = (Per3 pn.g Sg); isPron = False } - }; - - UsePron p = p ; - - PredetNP pred np = { - s = \\c => case pred.isDecl of { - True => pred.s!c ++ np.s ! Gen ; -- akvaru l-awlAdi - False => pred.s!c ++ np.s ! c + DetCN det cn = let { + number = sizeToNumber det.n; + determiner : Case -> Str = \c -> + det.s ! cn.h ! (detGender cn.g det.n) ! c; + noun : Case -> Str = \c -> cn.s ! + number ! (nounState det.d number) ! (nounCase c det.n det.d) + } in { + s = \\c => + case cnB4det det.isPron det.isNum det.n det.d of { + False => determiner c ++ noun c; + --FIXME use the adj -> cn -> cn rule from below instead of + --repeating code + True => cn.s ! number ! det.d ! c ++ det.s ! cn.h ! cn.g ! c + ++ cn.adj ! number ! det.d ! c }; - a = np.a - } ; - - DetSg quant ord = { - s = \\h,g,c => - quant.s ! Sg ! h ! g ! c ; - ---- s = quant.s ; --++ ord.s -- AR 18/12/2007 - n = One; - d = quant.d; - isNum = False ---- quant.isNum - } ; - - - DetPl quant num ord = { - s = \\h,g,c => - quant.s ! Pl ! h ! g ! c ++ -- AR 18/12/2007 ?? - num.s ! g ! (toDef quant.d num.n) ! c ; - n = num.n; - d = quant.d; - isNum = - case num.n of { - None => False; - _ => True - }; - } ; - ---- DEPREC ---- SgQuant quant = {s = quant.s ! Sg ; n = Sg; d = quant.d; isNum = False} ; ---- PlQuant quant = {s = quant.s ! Pl ; n = Pl; d = quant.d; isNum = False} ; - - --- PossPron p = {s = \\_ => p.s ! Gen} ; - - NoNum, NoOrd = {s = \\_,_,_ => [] ; - n = None} ; - --- NumInt n = n ; --- OrdInt n = {s = n.s ++ "ته"} ; --- - - NumNumeral numeral = numeral ; --- OrdNumeral numeral = {s = numeral.s ! NOrd} ; --- --- AdNum adn num = {s = adn.s ++ num.s} ; --- --- OrdSuperl a = {s = a.s ! AAdj Superl} ; --- - DefArt = {s = \\_,_,_,_ => []; d = Def } ; - - IndefArt = {s = \\_,_,_,_ => []; d = Indef} ; - - MassDet = {s = \\_,_,_,_ => [] ; n = Sg; d = Indef; isNum = False} ; - - UseN n = n ; --- UseN2 n = n ; --- UseN3 n = n ; --- --- ComplN2 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c} ; --- ComplN3 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c ; c2 = f.c3} ; --- - AdjCN ap cn = { - s = \\n,d,c => - cn.s ! n ! d ! c ++ ap.s ! cn.h ! cn.g ! n ! (definite ! d) ! c ; - g = cn.g; - h = cn.h + a = { pgn = agrP3 cn.h cn.g number; + isPron = False } + }; + + UsePN pn = { + s = pn.s; + a = {pgn = (Per3 pn.g Sg); isPron = False } + }; + + UsePron p = p ; + + PredetNP pred np = { + s = \\c => case pred.isDecl of { + True => pred.s!c ++ np.s ! Gen ; -- akvaru l-awlAdi + False => pred.s!c ++ np.s ! c }; --- RelCN cn rs = {s = \\n,c => cn.s ! n ! c ++ rs.s ! {n = n ; p = P3}} ; --- AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s} ; --- --- SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s} ; --- + a = np.a + } ; + {- + --should compile.. not working :( wierd error message.. bug? + PPartNP np v2 = + let x = case np.a.pgn of { + Per3 g n => ( positAdj (v2.s ! VPPart) ) ! g ! n ! Indef ; + _ => \\_ => [] -- not occuring anyway + } in { + s = \\c => np.s ! c ++ x ! c ; + a = np.a + }; + -} + + -- FIXME try parsing something like "this house now" and you'll get + -- an internal compiler error, but it still works.. wierd.. + AdvNP np adv = { + s = \\c => np.s ! c ++ adv.s; + a = np.a + }; + + DetSg quant ord = { + s = \\h,g,c => + quant.s ! Sg ! h ! g ! c ++ ord.s ! g ! quant.d ! c ; + n = One; + d = quant.d; + isPron = quant.isPron; + isNum = + case ord.n of { + None => False; + _ => True + } + } ; + + + DetPl quant num ord = { + s = \\h,g,c => quant.s ! Pl ! h ! g ! c + ++ num.s ! g ! (toDef quant.d num.n) ! c + --FIXME check this: + ++ ord.s ! g ! (toDef quant.d num.n) ! c ; + n = num.n; + d = quant.d; + isPron = quant.isPron; + isNum = + case num.n of { + None => False; + _ => True + } + } ; + + --DEPRECATED + -- SgQuant quant = {s = quant.s ! Sg ; d = quant.d; + -- isPron = quant.isPron; isNum = False} ; + -- PlQuant quant = {s = quant.s ! Pl ; d = quant.d; + -- isPron = quant.isPron; isNum = False} ; + + PossPron p = { + s = \\_,_,_,_ => p.s ! Gen; + d = Const; + isPron = True; + isNum = False } ; + + NoNum, NoOrd = { + s = \\_,_,_ => [] ; + n = None } ; + + NumDigits digits = { + s = \\_,_,_ => digits.s; + n = digits.n + }; + + NumNumeral numeral = { + s = numeral.s ! NCard ; + n = numeral.n + }; + + AdNum adn num = { + s = \\g,d,c => adn.s ++ num.s ! g ! d ! c ; + n = num.n } ; + + OrdDigits digits = { + s = \\_,d,_ => Al ! d ++ digits.s; + n = digits.n + }; + + -- OrdNumeral : Numeral -> Ord ; -- fifty-first + OrdNumeral numeral = { + s = numeral.s ! NOrd ; + n = numeral.n + }; + + -- FIXME, "the biggest house" would better translate into + -- akbaru baytin rather than al-baytu l-2akbaru + -- DetCN (DetSg DefArt (OrdSuperl big_A)) (UseN house_N) + OrdSuperl a = { + s = \\_,d,c => a.s ! AComp d c; + n = One + } ; + + DefArt = { + s = \\_,_,_,_ => []; + d = Def; + isPron = False; + isNum = False } ; + + IndefArt = { + s = \\_,_,_,_ => []; + d = Indef; + isPron = False; + isNum = False} ; + + MassDet = {s = \\_,_,_,_ => [] ; d = Indef; + isNum = False; isPron = False} ; + + UseN n = n ** {adj = \\_,_,_ => []}; + -- ComplN2 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c} ; + -- ComplN3 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c ; c2 = f.c3} ; + -- + -- UseN2 n = n ; + -- UseN3 n = n ; + -- + AdjCN ap cn = { + s = \\n,d,c => cn.s ! n ! d ! c; + adj = \\n,d,c => ap.s ! cn.h ! cn.g ! n ! (definite ! d) ! c ; + g = cn.g; + h = cn.h + }; + -- RelCN cn rs = {s = \\n,c => cn.s ! n ! c ++ rs.s ! {n = n ; p = P3}} ; + -- AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s} ; + -- + -- SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s} ; + -- ApposCN cn np = } diff --git a/lib/resource/arabic/NumeralAra.gf b/lib/resource/arabic/NumeralAra.gf index 5d97f44bc..12c7548f8 100644 --- a/lib/resource/arabic/NumeralAra.gf +++ b/lib/resource/arabic/NumeralAra.gf @@ -5,115 +5,150 @@ concrete NumeralAra of Numeral = CatAra ** lincat - Digit = {s : DForm => Gender => State => Case => Str ; + Digit = {s : DForm => CardOrd => Gender => State => Case => Str ; n : Size } ; - Sub10 = {s : DForm => Gender => State => Case => Str ; + Sub10 = {s : DForm => CardOrd => Gender => State => Case => Str ; n : Size } ; - Sub100 = {s : Gender => State => Case => Str ; - n : Size} ; - Sub1000 = {s : Gender => State => Case => Str ; - n : Size } ; - Sub1000000 = {s : Gender => State => Case => Str ; + Sub100 = {s : CardOrd => Gender => State => Case => Str ; n : Size} ; + Sub1000 = {s : CardOrd => Gender => State => Case => Str ; + n : Size } ; + Sub1000000 = {s : CardOrd => Gender => State => Case => Str ; + n : Size} ; + + + lin num x = x ; + + lin n2 = num2 ** {n = Two }; + lin n3 = num3_10 "ثَلاث" "ثالِث"; + lin n4 = num3_10 "أَربَع" "رابِع"; + lin n5 = num3_10 "خَمس" "خامِس"; + lin n6 = num3_10 "سِتّ" "سادِس"; + lin n7 = num3_10 "سَبع" "سابِع"; + lin n8 = num3_10 "ثَمانِي" "ثامِن"; + lin n9 = num3_10 "تِسع" "تاسِع"; -lin num x = x ; + lin pot01 = mkNum "واحِد" "أَوَّل" "أُولى" ** { n = One } ; + lin pot0 d = d ; -lin n2 = num2 ** {n = Two }; - - -lin n3 = num3_10 "ثَلاث"; -lin n4 = num3_10 "أَربَع"; -lin n5 = num3_10 "خَمس"; -lin n6 = num3_10 "سِتّ"; -lin n7 = num3_10 "سَبع"; -lin n8 = num3_10 "ثَمانِي"; -lin n9 = num3_10 "تِسع"; - - -lin pot01 = num1_10 "واحِد" ** { n = One } ; - -lin pot0 d = d ; - -lin pot110 = - { s= ((num3_10 "عَشر").s ! unit ) ; + lin pot110 = { + s= ((num3_10 "عَشر" "عاشِر").s ! unit ) ; n = ThreeTen - }; -lin pot111 = - { s = \\g,d,_ => + }; + + lin pot111 = { + s = \\_,g,d,_ => case g of { Masc => Al ! d + "أَحَدَ" ++ teen ! Masc ; Fem => Al ! d + "إِحدَى" ++ teen ! Fem }; n = NonTeen - }; - -lin pot1to19 dig = - { s = \\g,d,c => - case dig.n of { - Two => Al ! d + num2.s ! unit ! g ! Const ! c ++ teen ! g ; - _ => dig.s ! unit ! g ! (toDef d ThreeTen) ! Acc ++ - teen ! (genPolarity ! g) - }; - n = case dig.n of { - Two => NonTeen; - _ => Teen - } - }; - -lin pot0as1 num = - { s= num.s ! unit; + }; + + lin pot1to19 dig = { + s = \\co,g,d,c => case dig.n of { + Two => Al ! d + num2.s ! unit ! co ! g ! Const ! c ++ teen ! g ; + _ => dig.s ! unit ! co ! g ! (toDef d ThreeTen) ! Acc ++ + teen ! (genPolarity ! g) + }; + n = case dig.n of { + Two => NonTeen; + _ => Teen + } + }; + + lin pot0as1 num = { + s= num.s ! unit; n = num.n - } ; - -lin pot1 dig = - { s = dig.s ! ten; + } ; + + lin pot1 dig = { + s = dig.s ! ten; n = NonTeen - }; + } ; + + lin pot1plus dig n = { + s = \\co,g,d,c => n.s ! unit ! co ! g ! d ! c + ++ "وَ" ++ dig.s ! ten ! co ! g ! d ! c ; + n = NonTeen + }; -lin pot1plus dig n = { - s = \\g,d,c => n.s ! unit ! g ! d ! c - ++ "وَ" ++ dig.s ! ten ! g ! d ! c ; - n = NonTeen - }; + lin pot1as2 n = n ; -lin pot1as2 n = n ; - -lin pot2 dig = { - s = \\g,d,c => - case dig.n of { - One => num100 ! d ! c ; - Two => num200 ! d ! c ; - _ => dig.s ! unit ! Masc ! (toDef d ThreeTen) ! c ++ "مِٱَةِ" + lin pot2 dig = { + s = \\co,_,d,c => case dig.n of { + One => num100 ! d ! c ; + Two => num200 ! d ! c ; + _ => dig.s ! unit ! co ! Masc ! (toDef d ThreeTen) ! c ++ "مِٱَةِ" }; n = Hundreds - }; + }; + + lin pot2plus m e = { + s = \\co,g,d,c => case m.n of { + One => num100 ! d ! c; + Two => num200 ! d ! c; + _ => m.s ! unit ! co ! Masc ! (toDef d ThreeTen) ! c ++ "مِٱَةٌ" + } ++ "وَ" ++ e.s ! co ! g ! d ! c ; + n = e.n + }; -lin pot2plus m e = { - s = \\g,d,c => - case m.n of { - One => num100 ! d ! c; - Two => num200 ! d ! c; - _ => m.s ! unit ! Masc ! (toDef d ThreeTen) ! c ++ "مِٱَةٌ" - } ++ "وَ" ++ e.s ! g ! d ! c ; - n = e.n - }; - - -lin pot2as3 n = n ; - -lin pot3 m = { - s = \\g,d,c => - case m.n of { + lin pot2as3 n = n ; + + lin pot3 m = { + s = \\co,_,d,c => case m.n of { One => num1000 ! (definite ! d) ! c; Two => num2000 ! (definite ! d) ! c; - _ => m.s ! Fem ! (toDef d ThreeTen) ! c ++ "آلافٌ" - } ; - n = m.n - }; + _ => m.s ! co ! Fem ! (toDef d ThreeTen) ! c ++ "آلافٌ" + } ; + n = m.n + }; --lin pot3plus n m = { -- s = \\c => n.s ! NCard ++ "تهُْسَند" ++ m.s ! c ; n = Pl} ; +-- numerals as sequences of digits + + lincat + Dig = Digits ; +-- Numeral,Digits = {s : Gender => State => Case => Str ; +-- n : Size } ; + + + lin + IDig d = d ; + + IIDig d i = { + s = d.s ++ i.s; + n = ThreeTen ; + } ; + + D_0 = mk1Dig "0" ; + D_1 = mk2Dig "1" One ; + D_2 = mk2Dig "2" Two ; + D_3 = mk1Dig "3" ; + D_4 = mk1Dig "4" ; + D_5 = mk1Dig "5" ; + D_6 = mk1Dig "6" ; + D_7 = mk1Dig "7" ; + D_8 = mk1Dig "8" ; + D_9 = mk1Dig "9" ; + + oper + + + mk2Dig : Str -> Size -> Digits = \str,sz -> { + s = str ; + n = sz ; + lock_Digits = <> + }; + + mk1Dig : Str -> Digits = \str -> { + s = str ; + n = ThreeTen; + lock_Digits = <> + }; + } diff --git a/lib/resource/arabic/ParadigmsAra.gf b/lib/resource/arabic/ParadigmsAra.gf index ce41f7ff2..102c661c7 100644 --- a/lib/resource/arabic/ParadigmsAra.gf +++ b/lib/resource/arabic/ParadigmsAra.gf @@ -339,7 +339,7 @@ resource ParadigmsAra = open mkN3 = \n,p,q -> n ** {lock_N3 = <> ; c2 = p ; c3 = q} ; - mkNP : (_,_,_ : Str) -> PerGenNum -> NP = \ana,nI,I,pgn -> + mkPron : (_,_,_ : Str) -> PerGenNum -> NP = \ana,nI,I,pgn -> { s = table { Nom => ana; @@ -349,6 +349,20 @@ resource ParadigmsAra = open a = {pgn = pgn; isPron = True }; lock_NP = <> }; + + -- e.g. al-jamii3, 2a7ad + regNP : Str -> Number -> NP = \word,n -> + { s = \\c => word + vowel ! c ; + a = {pgn = Per3 Masc n; isPron = False }; + lock_NP = <> + }; + + -- e.g. hadha, dhaalika + indeclNP : Str -> Number -> NP = \word,n -> + { s = \\c => word ; + a = {pgn = Per3 Masc n; isPron = False }; + lock_NP = <> + }; mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant = \hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det -> @@ -364,6 +378,8 @@ resource ParadigmsAra = open _ => havihi }; d = Def; + isPron = False; + isNum = False; lock_Quant = <> }; @@ -377,24 +393,30 @@ resource ParadigmsAra = open _ => tilka }; d = Def; + isPron = False; + isNum = False; lock_Quant = <> }; sndA root pat = - let { raw = sndA' root pat } in - { s = \\g,n,d,c => + let raw = sndA' root pat in { + s = \\af => case root of { - _ + "؟" + _ => rectifyHmz(raw.s ! g ! n ! d ! c); - _ => raw.s ! g ! n ! d ! c + _ + "؟" + _ => rectifyHmz(raw.s ! af); + _ => raw.s ! af }; lock_A = <> }; sndA' : Str -> Str -> A = \root,pat -> - let { kabIr = mkWord pat root + let { kabIr = mkWord pat root; + akbar = mkWord "أَفعَل" root } in { - s = adj kabIr ; + s = table { + APosit g n d c => (positAdj kabIr) ! g ! n ! d ! c ; + AComp d c => (indeclN akbar) ! d ! c + }; lock_A = <> }; diff --git a/lib/resource/arabic/PatternsAra.gf b/lib/resource/arabic/PatternsAra.gf index 9bdc838d8..0912c5d88 100644 --- a/lib/resource/arabic/PatternsAra.gf +++ b/lib/resource/arabic/PatternsAra.gf @@ -89,6 +89,8 @@ resource PatternsAra = { fuculo = { h = "" ; m1 = "ُ" ; m2 = "ُ" ; t = "ْ" } ; fucUl = { h = "" ; m1 = "ُ" ; m2 = "ُو" ; t = "" } ; fUcil = { h = "" ; m1 = "ُو" ; m2 = "ِ" ; t = "" } ; + mafcUl = { h = "مَ"; m1 = "ْ" ; m2 = "ُو" ; t = "" } ; + mafcil = { h = "مَ"; m1 = "ْ" ; m2 = "ِ" ; t = "" } ; tafAcal = { h = "تَ"; m1 = "َا" ; m2 = "َ" ; t = "" } ; tafaccal = { h = "تَ"; m1 = "َ" ; m2 = "َّ" ; t = "" } ; tufuccil = { h = "تُ"; m1 = "ُ" ; m2 = "ِّ" ; t = "" } ; diff --git a/lib/resource/arabic/ResAra.gf b/lib/resource/arabic/ResAra.gf index db2066496..a6c97e6c6 100644 --- a/lib/resource/arabic/ResAra.gf +++ b/lib/resource/arabic/ResAra.gf @@ -99,42 +99,45 @@ resource ResAra = PatternsAra ** open Prelude, Predef in { NTable = Number => State => Case => Str; Noun : Type = {s : NTable ; g : Gender; h : Species} ; - Adj : Type = {s : Gender => NTable} ; --- Adj : Type = {s : AForm => Str} ; +-- Adj : Type = {s : Gender => NTable} ; + Adj : Type = {s : AForm => Str} ; Verb : Type = {s : VForm => Str} ; param VForm = - VPerf Voice PerGenNum + VPerf Voice PerGenNum | VImpf Mood Voice PerGenNum - | VImp Gender Number ; + | VImp Gender Number + | VPPart ; PerGenNum = - Per3 Gender Number + Per3 Gender Number | Per2 Gender Number | Per1 SgPl; SgPl = Sing | Plur; - + AForm = - APosit Gender Number State Case - | AComp Case ; - ---verbal morphology - + APosit Gender Number State Case + | AComp State Case ; + + --verbal morphology + oper - + --macro for sound verb - verb : (_,_,_,_,_ : Str) -> Verb = --PerfAct, PerfPas, ImpfAct, ImpfPas, Imp - \katab,kutib,aktub,uktab,euktub -> - { s = table { + --PerfAct, PerfPas, ImpfAct, ImpfPas, Imp, PPart + verb : (_,_,_,_,_,_ : Str) -> Verb = + \katab,kutib,aktub,uktab,euktub,maktUb -> { + s = table { VPerf Act pgn => katab + suffixPerf ! pgn ; VPerf Pas pgn => kutib + suffixPerf ! pgn ; - VImpf Ind Act pgn => prefixImpf ! pgn + aktub + suffixImpfInd ! pgn ; - VImpf Ind Pas pgn => prefixImpf ! pgn + uktab + suffixImpfInd ! pgn ; - VImpf m Act pgn => prefixImpf ! pgn + aktub + suffixImpfCJ m ! pgn ; - VImpf m Pas pgn => prefixImpf ! pgn + uktab + suffixImpfCJ m ! pgn ; - VImp g n => euktub + suffixImpfCJ Jus ! (Per2 g n) + VImpf Ind Act pgn => prefixImpf!pgn + aktub + suffixImpfInd !pgn; + VImpf Ind Pas pgn => prefixImpf!pgn + uktab + suffixImpfInd !pgn; + VImpf m Act pgn => prefixImpf!pgn + aktub + suffixImpfCJ m ! pgn; + VImpf m Pas pgn => prefixImpf !pgn + uktab + suffixImpfCJ m !pgn; + VImp g n => euktub + suffixImpfCJ Jus ! (Per2 g n); + VPPart => maktUb } } ; @@ -156,7 +159,7 @@ oper Per1 Sing => "ْتُ" ; Per1 Plur => "ْنَا" } ; - + prefixImpf : PerGenNum => Str = table { Per1 Sing => "أ" ; @@ -191,8 +194,8 @@ oper } ; --macro for geminate verbs: FIXME, change the misleading variable names - verbGeminate : (_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = - \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf' -> + verbGeminate : (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = + \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf',ppart -> let { perfPattern = patHollowPerf xAf xif xyf xuf ; impfPattern = patHollowImpf axAf axaf uxAf uxaf ; impPattern = patHollowImp xaf xAf' @@ -201,13 +204,14 @@ oper VPerf v pgn => perfPattern ! v ! pgn + suffixPerf ! pgn ; VImpf Ind v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfInd ! pgn ; VImpf m v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfCJ m ! pgn ; - VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n) + VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n); + VPPart => ppart } } ; --macro for hollow verbs: - verbHollow : (_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = - \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf' -> + verbHollow : (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = + \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf',ppart -> let { perfPattern = patHollowPerf xAf xif xyf xuf ; impfPattern = patHollowImpf axAf axaf uxAf uxaf ; impPattern = patHollowImp axaf xAf' ; @@ -218,13 +222,14 @@ oper VImpf Ind v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfInd ! pgn ; VImpf Cnj v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfCJ Cnj ! pgn ; VImpf Jus v pgn => prefixImpf ! pgn + jusPattern ! v ! pgn + suffixImpfCJ Jus ! pgn ; - VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n) + VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n); + VPPart => ppart } } ; --macro for defective verbs: - verbDef: (_,_,_,_,_,_,_,_,_,_ : Str) -> Vowel -> Verb = - \rama,ramay,rumi,rumu,rumiy,armi,armu,urma,Irmi,Irmu,vowel -> + verbDef: (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Vowel -> Verb = + \rama,ramay,rumi,rumu,rumiy,armi,armu,urma,Irmi,Irmu,ppart,vowel -> let { patPerf = patDefPerf rama ramay rumi rumu rumiy ; patImpfAct = patDefImpfAct armi armu ; @@ -234,7 +239,8 @@ oper VPerf v pgn => patPerf ! v ! pgn + (suffixPerfDef v) ! pgn ; VImpf m Act pgn => prefixImpf ! pgn + patImpfAct ! pgn + (suffixImpfDef Act vowel) ! m ! pgn ; VImpf m Pas pgn => prefixImpf ! pgn + urma + (suffixImpfDef Pas vowel) ! m ! pgn ; - VImp g n => patImp ! g ! n + (suffixImpfDef Act vowel) ! Jus ! (Per2 g n) + VImp g n => patImp ! g ! n + (suffixImpfDef Act vowel) ! Jus ! (Per2 g n) ; + VPPart => ppart } } ; @@ -355,9 +361,10 @@ v1sound : Root3 -> Vowel -> Vowel -> Verb = euktub = case fcl.f of { "؟"|"و"|"ي" => qif ; _ => prefixImp ! vImpf + ktub - } + }; + maktUb = mkStrong mafcUl fcl } in - verb katab kutib aktub uktab euktub ; + verb katab kutib aktub uktab euktub maktUb ; v1hollow : Root3 -> Vowel -> Verb = \xwf,vowel -> @@ -371,8 +378,10 @@ v1hollow : Root3 -> Vowel -> Verb = uxAf= mkHollow ufAc xwf ; uxaf= "ُ" + xaf ; xAf'= mkHollow (patHol3 ! vowel) xwf ; - axAf= "َ" + xAf' - } in verbHollow xAf xif xyf xuf axAf axaf uxAf uxaf xaf xAf' ; + axAf= "َ" + xAf'; + ppart = "مَ" + xAf' -- FIXME actually wierd anomalies happen with the a vowel.. + + } in verbHollow xAf xif xyf xuf axAf axaf uxAf uxaf xaf xAf' ppart ; patHol1 : Vowel => Pattern = table { u => fuc ; _ => fic} ; @@ -411,8 +420,9 @@ v1geminate : Str -> Vowel -> Vowel -> Verb = amdud = "َ" + mdud ; umadd = "ُ" + madd ; umdad = "ُ" + mkStrong fcal mdd ; - Umdud = (prefixImp ! vImpf) + mdud - } in verbGeminate madd madad mudd mudid amudd amdud umadd umdad Umdud mudd' ; + Umdud = (prefixImp ! vImpf) + mdud; + mamdUd = mkStrong mafcUl mdd + } in verbGeminate madd madad mudd mudid amudd amdud umadd umdad Umdud mudd' mamdUd; patGem1 : Vowel => Pattern = table { @@ -449,8 +459,9 @@ v1defective : Root3 -> Vowel -> Verb = armu = "َ" + rmu ; urma = mkDefective ufca rmy ; eirmi = prefixImp ! vowel + rmi; - eirmu = prefixImp ! vowel + rmu - } in verbDef rama ramay rumi rumu rumiy armi armu urma eirmi eirmu vowel; + eirmu = prefixImp ! vowel + rmu; + marmiy = mkStrong mafcil rmy + } in verbDef rama ramay rumi rumu rumiy armi armu urma eirmi eirmu marmiy vowel ; patDef1 : Vowel => Pattern = table { @@ -471,9 +482,10 @@ v2sound : Root3 -> Verb = \qsm -> qussim = mkStrong fuccil qsm ; qassim = mkStrong faccil qsm ; uqassim = "ُ" + qassim ; - uqassam = "ُ" + qassam + uqassam = "ُ" + qassam ; + muqassam = "مُ" + qassam } in - verb qassam qussim uqassim uqassam qassim ; + verb qassam qussim uqassim uqassam qassim muqassam; v2defective : Root3 -> Verb = \gny -> let { @@ -487,7 +499,8 @@ v2defective : Root3 -> Verb = \gny -> gannu = mkDefective faccu gny; ugannu = "ُ" + gannu; uganna = "ُ" + ganna; - } in verbDef ganna gannay gunni gunnu gunniy uganni ugannu uganna ganni gannu i; + mugannaY = "مُ" + ganna + "ى" + } in verbDef ganna gannay gunni gunnu gunniy uganni ugannu uganna ganni gannu mugannaY i; v3sound : Root3 -> Verb = \tbc -> @@ -497,7 +510,8 @@ v3sound : Root3 -> Verb = tAbic = mkStrong fAcil tbc ; utAbic = "ُ" + tAbic ; utAbac = mkStrong ufAcal tbc ; - } in verb tAbac twbic utAbic utAbac tAbic; + mutAbac = "م" + utAbac + } in verb tAbac twbic utAbic utAbac tAbic mutAbac; v4sound : Root3 -> Verb = \qnc -> @@ -506,9 +520,10 @@ v4sound : Root3 -> Verb = euqnic = mkStrong eufcil qnc; uqnic = mkStrong ufcil qnc; uqnac = mkStrong ufcal qnc; - eaqnic = mkStrong eafcil qnc + eaqnic = mkStrong eafcil qnc; + muqnac = "م" + uqnac } in - verb eaqnac euqnic uqnic uqnac eaqnic ; + verb eaqnac euqnic uqnic uqnac eaqnic muqnac; v4defective : Root3 -> Verb = \cTy -> let { @@ -525,7 +540,8 @@ v4defective : Root3 -> Verb = \cTy -> ucTa = "ُ" + cTa; eacTi = "أَ" + cTi; eacTu = "أَ" + cTu; - } in verbDef eacTa eacTay eucTi eucTu eucTiy ucTi ucTu ucTa eacTi eacTu i; + mucTaY = "م" + ucTa +"ى" + } in verbDef eacTa eacTay eucTi eucTu eucTiy ucTi ucTu ucTa eacTi eacTu mucTaY i; v5sound : Root3 -> Verb = \nfs -> @@ -534,7 +550,8 @@ v5sound : Root3 -> Verb = tunuffis = mkStrong tufuccil nfs ; atanaffas = "َ" + tanaffas ; utanaffas = "ُ" + tanaffas ; - } in verb tanaffas tunuffis atanaffas utanaffas tanaffas ; + mutanaffas = "م" + tanaffas + } in verb tanaffas tunuffis atanaffas utanaffas tanaffas mutanaffas; v6sound : Root3 -> Verb = \fqm -> @@ -543,7 +560,8 @@ v6sound : Root3 -> Verb = tufUqim = mkStrong tufUcil fqm ; atafAqam = "َ" + tafAqam ; utafAqam = "ُ" + tafAqam ; - } in verb tafAqam tufUqim atafAqam utafAqam tafAqam ; + mutafAqam = "م" + utafAqam + } in verb tafAqam tufUqim atafAqam utafAqam tafAqam mutafAqam; v8sound : Root3 -> Verb = \rbT -> @@ -555,7 +573,8 @@ v8sound : Root3 -> Verb = artabiT = "َ" + rtabiT ; urtabaT = "ُ" + rtabaT ; eirtabiT = "إِ" + rtabiT ; - } in verb eirtabaT eurtubiT artabiT urtabaT eirtabiT; + murtabaT = "م" + urtabaT + } in verb eirtabaT eurtubiT artabiT urtabaT eirtabiT murtabaT; patV1Perf : Vowel => Pattern = table { @@ -649,7 +668,8 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> --Nominal Morphology - adj : Str -> Gender => NTable = +--takes the adjective lemma and gives the Posit table + positAdj : Str -> Gender => NTable = \kabIr -> let kabIra = kabIr + "َة" in table { @@ -657,21 +677,22 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> Fem => sndf kabIra }; - clr : Str -> Str -> Str -> Gender => NTable = + clr : Str -> Str -> Str -> AForm => Str = \aHmar,HamrA',Humr -> table { - Masc => table { - Sg => indeclN aHmar; - Dl => dual aHmar; - Pl => sing Humr + APosit Masc n d c => case n of { + Sg => indeclN aHmar ! d ! c ; + Dl => dual aHmar ! d ! c ; + Pl => sing Humr ! d ! c }; - Fem => table { - Sg => indeclN HamrA'; - Dl => dual ((tk 2 HamrA') + "و"); - Pl => sing Humr - } + APosit Fem n d c => case n of { + Sg => indeclN HamrA' ! d ! c; + Dl => dual ((tk 2 HamrA') + "و") ! d ! c; + Pl => sing Humr ! d ! c + }; + AComp d c => indeclN aHmar ! d ! c }; - + -- indeclinable nominal word (mamnuu3 mina S-Sarf) indeclN : Str -> State => Case => Str = \aHmar -> \\s,c => Al!s + aHmar + indecl!c; @@ -770,7 +791,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> }; - --declection 2 (ends in yaa') of the singular or broken plural words + --declection 2 (ends in yaa') dec2sg : State => Case => Str = table { Indef => @@ -785,7 +806,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> } }; - --declection 3 (ending in alif) of the singular or broken plural words + --declention 3 (ending in alif) dec3sg : State => Case => Str = table { Indef => @@ -886,7 +907,8 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> _ => Def --Lkitaabu }; - --FIXME needs testing, should be wrong! + + --FIXME needs testing nounCase : Case -> Size -> State -> Case = \c,size,s -> case of { @@ -914,13 +936,17 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> _ => s }; - --some determiners act as adjectives modifying the noun they count - detAsAdj : Bool -> Size -> State -> Bool = \isNum,s,d -> - case of { - => False; --this doesn't hold for non-numerals - => True; --definite numbers act as adjectives - => True; --numerals one and two always adjectives - => True; --numerals one and two always adjectives + -- in a NP, sometimes the common noun preceedes the determiner + -- e.g. some determiners act as adjectives modifying the noun they count + -- "the three children, two children" + -- e.g. possesive pronouns: his book (kitaabuhu" + cnB4det : Bool -> Bool -> Size -> State -> Bool = \isPron,isNum,s,d -> + case of { + => True; + <_,False,_,_> => False; --non-numerals + <_,True,_,Def> => True; --definite numbers act as adjectives + <_,True,Two,_> => True; --numerals one and two always adjectives + <_,True,One,_> => True; --numerals one and two always adjectives _ => False }; @@ -958,7 +984,10 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> s : Species => Gender => Case => Str ; d : State; n : Size; - isNum : Bool + isNum : Bool; + -- for genitive pronouns (suffixes). if true, then "cn ++ det" + --should be used instead of "det ++ cn" when constructing the NP + isPron : Bool } ; Predet : Type = { @@ -1055,36 +1084,60 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> Size = One | Two | ThreeTen | Teen | NonTeen | Hundreds | None ; DForm = unit | ten ; + CardOrd = NCard | NOrd ; oper - --digits 3 to 10: take the digit in masculine form and - --calculates the whole table + --digits 1, 3 - 10: take the lemmas of the card ords & in masculine + --form and calculates the whole table - num1_10 : Str -> { s : DForm => Gender => State => Case => Str } = - \xams -> - let xamsa = xams + "َة" in { - s= table { + regNum : Str -> Str -> + {s : DForm => CardOrd => Gender => State => Case => Str} = + \xams,xAmis -> + let { xamsa = xams + "َة"; + xAmisa = xAmis + "َة"} in + mkNum xamsa xAmis xAmisa; + + mkNum : Str -> Str -> Str -> + {s : DForm => CardOrd => Gender => State => Case => Str} = + \wAhid,awwal,Ula -> + let { wAhida = wAhid + "َة"} in + { s= table { unit => table { - Masc => \\s,c => (sing xams) ! s ! c ; - Fem => \\s,c => Al ! s + xamsa + dec1sg ! s ! c --we know it's dec1 - }; - ten => \\_,s,c => Al ! s + xams + m_pl ! Indef ! c + NCard => table { + Masc => \\s,c => (sing wAhid) ! s ! c ; + --all fem are first declension: + Fem => \\s,c => Al ! s + wAhida + dec1sg ! s ! c + }; + NOrd => table { + Masc => \\s,c => Al ! s + awwal + dec1sg ! s ! c; + Fem => \\s,c => (sing Ula) ! s ! c + } + }; + ten => table { + NCard => \\_,s,c => Al ! s + wAhid + m_pl ! Indef ! c; + NOrd => \\_,s,c => Al ! s + awwal + m_pl ! Indef ! c + } } }; - num3_10 : Str ->{ s : DForm => Gender => State => Case => Str ; - n : Size } = - \xams -> - num1_10 xams ** { n = ThreeTen }; + num3_10 : Str -> Str -> { s : DForm => CardOrd => Gender + => State => Case => Str ; n : Size } = + \xams,xAmis -> + regNum xams xAmis ** { n = ThreeTen }; - num2 : { s : DForm => Gender => State => Case => Str} = + num2 : { s : DForm => CardOrd => Gender => State => Case => Str} = { s = table { - unit => - table { - Masc => \\s,c => Al ! s + "ٱِثن" + dl ! s ! c ; - Fem => \\s,c => Al ! s + "ٱِثنَت" + dl ! s ! c + unit => table { + NCard => table { + Masc => \\s,c => Al ! s + "ٱِثن" + dl ! s ! c ; + Fem => \\s,c => Al ! s + "ٱِثنَت" + dl ! s ! c + }; + NOrd => table { + Masc => \\s,c => Al ! s + "ثان" + dec2sg ! s ! c ; + Fem => \\s,c => Al ! s + "ثانِيَة" + dec1sg ! s ! c + } }; - ten => \\_,s,c => Al ! s + "عِشر" + m_pl ! Indef ! c + ten => \\_,_,s,c => Al ! s + "عِشر" + m_pl ! Indef ! c } }; diff --git a/lib/resource/arabic/SentenceAra.gf b/lib/resource/arabic/SentenceAra.gf index f64646e20..951b07640 100644 --- a/lib/resource/arabic/SentenceAra.gf +++ b/lib/resource/arabic/SentenceAra.gf @@ -58,7 +58,9 @@ concrete SentenceAra of Sentence = CatAra ** open case o of { Verbal => case of { + -- ya2kuluhu => (vStr t p) ++ vp.obj.s ++ vp.s2 ++ (pred t p); + -- ya2kuluhu al-waladu, yakuluhu al-2awlaadu => (vStr t p) ++ np.s ! Nom ++ vp.obj.s ++ vp.s2 ++ (pred t p); => (vStr t p) ++ vp.obj.s ++ np.s ! Nom ++ vp.s2 ++ (pred t p); => (vStr t p) ++ vp.obj.s ++ vp.s2 ++ (pred t p) diff --git a/lib/resource/arabic/StructuralAra.gf b/lib/resource/arabic/StructuralAra.gf index 5b6ac1db4..d9939b85e 100644 --- a/lib/resource/arabic/StructuralAra.gf +++ b/lib/resource/arabic/StructuralAra.gf @@ -7,7 +7,8 @@ concrete StructuralAra of Structural = CatAra ** above_Prep = ss "فَوْقَ" ; after_Prep = ss "بَعْدَ" ; all_Predet = mkPredet "كُلّ" True ; --- almost_AdA, almost_AdN = ss "َلمْست" ; + almost_AdA = ss "تَقْرِيباً"; + almost_AdN = ss "حَوَالي" ; -- or "تَقرِيبا" -- although_Subj = ss "َلتهُْغه" ; -- always_AdV = ss "َلوَيس" ; and_Conj = ss "وَ" ** {n = Pl} ; @@ -26,14 +27,14 @@ concrete StructuralAra of Structural = CatAra ** -- } ; during_Prep = ss "خِلَالَ" ; -- either7or_DConj = sd2 "ِتهر" "ْر" ** {n = Sg} ; --- everybody_NP = regNP "ثريبْدي" Sg ; + everybody_NP = regNP "الجَمِيع" Pl ; every_Det = mkDet "كُلّ" Sg Const ; --- everything_NP = regNP "ثريتهِنغ" Sg ; + everything_NP = regNP "كُلّ" Sg ; -- everywhere_Adv = ss "ثريوهري" ; few_Det = mkDet "بَعض" Pl Const ; -- first_Ord = ss "فِرست" ; from_Prep = ss "مِنَ" ; - he_Pron = mkNP "هُوَ" "هُ" "هُ" (Per3 Masc Sg) ; + he_Pron = mkPron "هُوَ" "هُ" "هُ" (Per3 Masc Sg) ; here_Adv = ss "هُنا" ; -- here7to_Adv = ss ["تْ هري"] ; -- here7from_Adv = ss ["فرْم هري"] ; @@ -41,9 +42,9 @@ concrete StructuralAra of Structural = CatAra ** -- how8many_IDet = mkDeterminer Pl ["هْو مَني"] ; -- if_Subj = ss "ِف" ; in8front_Prep = ss "مُقَابِلَ" ; - i_Pron = mkNP "أَنَا" "نِي" "ِي" (Per1 Sing); + i_Pron = mkPron "أَنَا" "نِي" "ِي" (Per1 Sing); in_Prep = ss "فِي" ; --- it_Pron = mkNP "ِت" "ِت" "ِتس" Sg P3 ; +-- it_Pron = mkPron "ِت" "ِت" "ِتس" Sg P3 ; -- less_CAdv = ss "لسّ" ; many_Det = mkDet "جَمِيع" Pl Const ; -- more_CAdv = ss "مْري" ; @@ -64,31 +65,31 @@ concrete StructuralAra of Structural = CatAra ** -- please_Voc = ss "ةلَسي" ; possess_Prep = ss "ل" ; -- quite_Adv = ss "قُِتي" ; --- she_Pron = mkNP "سهي" "هر" "هر" Sg P3 ; + she_Pron = mkPron "هِيَ" "ها" "ها" (Per3 Fem Sg) ; -- so_AdA = ss "سْ" ; --- somebody_NP = regNP "سْمبْدي" Sg ; + somebody_NP = regNP "أَحَد" Sg ; someSg_Det = mkDet "أَحَد" Pl Const ; somePl_Det = mkDet "بَعض" Pl Const ; --- something_NP = regNP "سْمتهِنغ" Sg ; + something_NP = regNP "شَيْء" Sg ; -- somewhere_Adv = ss "سْموهري" ; that_Quant = mkQuant3 "ذَلِكَ" "تِلكَ" "أُلٱِكَ" Def; --- that_NP = regNP "تهَت" Sg ; + that_NP = indeclNP "ذَلِكَ" Sg ; there_Adv = ss "هُناك" ; -- there7to_Adv = ss "تهري" ; -- there7from_Adv = ss ["فرْم تهري"] ; -- therefore_PConj = ss "تهرفْري" ; --- these_NP = regNP "تهسي" Pl ; - they_Pron = mkNP "هُمْ" "هُمْ" "هُمْ" (Per3 Masc Pl) ; + these_NP = indeclNP "هَؤُلَاء" Pl ; + they_Pron = mkPron "هُمْ" "هُمْ" "هُمْ" (Per3 Masc Pl) ; this_Quant = mkQuant7 "هَذا" "هَذِهِ" "هَذَان" "هَذَيْن" "هَاتَان" "هَاتَيْن" "هَؤُلَاء" Def; --- this_NP = regNP "تهِس" Sg ; --- those_NP = regNP "تهْسي" Pl ; + this_NP = indeclNP "هَذا" Sg ; + those_NP = indeclNP "هَؤُلَاءكَ" Pl ; through_Prep = ss "عَبْرَ" ; -- too_AdA = ss "تّْ" ; to_Prep = ss "إِلى" ; under_Prep = ss "تَحْتَ" ; -- very_AdA = ss "ثري" ; -- want_VV = P.mkVV (P.regV "وَنت") ; - we_Pron = mkNP "نَحنُ" "نا" "نا" (Per1 Plur) ; + we_Pron = mkPron "نَحنُ" "نا" "نا" (Per1 Plur) ; whatPl_IP = mkIP "ماذا" Pl ; whatSg_IP = mkIP "ماذا" Sg ; when_IAdv = ss "مَتَى" ; @@ -102,8 +103,8 @@ concrete StructuralAra of Structural = CatAra ** without_Prep = ss "بِدُونِ" ; with_Prep = ss "مَع" ; yes_Phr = ss "نَعَم" ; - youSg_Pron = mkNP "أَنتَ" "كَ" "كَ" (Per2 Masc Sg) ; - youPl_Pron = mkNP "أَنتُمْ" "كُمْ" "كُمْ" (Per2 Masc Sg) ; - youPol_Pron = mkNP "أَنتِ" "كِ" "كِ" (Per2 Fem Sg) ; + youSg_Pron = mkPron "أَنتَ" "كَ" "كَ" (Per2 Masc Sg) ; + youPl_Pron = mkPron "أَنتُمْ" "كُمْ" "كُمْ" (Per2 Masc Sg) ; + youPol_Pron = mkPron "أَنتِ" "كِ" "كِ" (Per2 Fem Sg) ; }