summaryrefslogtreecommitdiff
path: root/next-lib/src/arabic/NounAra.gf
diff options
context:
space:
mode:
Diffstat (limited to 'next-lib/src/arabic/NounAra.gf')
-rw-r--r--next-lib/src/arabic/NounAra.gf188
1 files changed, 188 insertions, 0 deletions
diff --git a/next-lib/src/arabic/NounAra.gf b/next-lib/src/arabic/NounAra.gf
new file mode 100644
index 000000000..d96e71970
--- /dev/null
+++ b/next-lib/src/arabic/NounAra.gf
@@ -0,0 +1,188 @@
+concrete NounAra of Noun = CatAra ** open ResAra, Prelude in {
+
+flags optimize=noexpand ;
+
+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 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 = { 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
+ };
+ 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
+ }
+ } ;
+-}
+
+ DetQuantOrd 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
+ }
+ } ;
+
+ DetQuant quant num = {
+ s = \\h,g,c => quant.s ! Pl ! h ! g ! c
+ ++ num.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 } ;
+
+ NumSg = {
+ s = \\_,_,_ => [] ;
+ n = One } ;
+
+ NumPl = {
+ 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 ;
+ isNum,isPron = False
+ } ;
+
+ IndefArt = {
+ s = \\_,_,_,_ => [];
+ d = Indef ;
+ isNum,isPron = 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 =
+}