Sindhi-resource-grammar

This commit is contained in:
virk.shafqat
2012-02-21 09:20:38 +00:00
parent 14e0237950
commit cf221bd363
45 changed files with 5107 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
--# -path=.:alltenses:prelude
resource CombinatorsSnd = Combinators with
(Cat = CatSnd),
(Structural = StructuralSnd),
(Constructors = ConstructorsSnd) ;

View File

@@ -0,0 +1,3 @@
--# -path=.:alltenses:prelude
resource ConstructorsSnd = Constructors with (Grammar = GrammarSnd) ;

View File

@@ -0,0 +1,5 @@
--# -path=.:present:mathematical:prelude
resource SymbolicSnd = Symbolic with
(Symbol = SymbolSnd),
(Grammar = GrammarSnd) ;

5
lib/src/api/SyntaxSnd.gf Normal file
View File

@@ -0,0 +1,5 @@
--# -path=.:./alltenses:../prelude
instance SyntaxSnd of Syntax =
ConstructorsSnd, CatSnd, StructuralSnd, CombinatorsSnd ;

22
lib/src/api/TrySnd.gf Normal file
View File

@@ -0,0 +1,22 @@
--# -path=.:alltenses:prelude:/users/shafqat/www.grammaticalframework.org_4/lib/src/sindhi
resource TrySnd = SyntaxSnd - [mkAdN] , LexiconSnd, ParadigmsSnd - [mkAdv,mkDet,mkIP,mkAdN] **
open (P = ParadigmsSnd) in {
oper
mkAdv = overload SyntaxSnd {
mkAdv : Str -> Adv = P.mkAdv ;
} ;
mkAdN = overload {
mkAdN : CAdv -> AdN = SyntaxSnd.mkAdN ;
--- mkAdN : Str -> AdN = P.mkAdN ;
} ;
-- mkOrd = overload SyntaxSnd {
-- mkOrd : A -> Ord = SyntaxSnd.OrdSuperl ;
-- } ;
}

View File

@@ -0,0 +1,40 @@
concrete AdjectiveSnd of Adjective = CatSnd ** open ResSnd, Prelude in {
flags coding = utf8;
lin
PositA a = a ;
UseComparA a = a;
ComparA a np = {
-- s = \\n,g,c => np.s ! NPC Obl ++ "کان" ++ a.s ! n ! g ! c ;
s = \\n,g,c => np.s ! NPC Abl ++ "کان" ++ a.s ! n ! g ! c ;
} ;
---- $SuperlA$ belongs to determiner syntax in $Noun$.
ComplA2 a np = {
s = \\n,g,c => np.s ! NPC Obl ++ a.c2 ++ a.s ! n ! g ! c ;
} ;
ReflA2 a = {
s = \\n,g,c => a.s ! n ! g ! c ++ RefPron ++ "سان" ;
} ;
SentAP ap sc = {
s = \\n,g,c => ap.s ! n ! g ! c ++ sc.s ;
} ;
AdAP ada ap = {
s = \\n,g,c => ada.s ++ ap.s ! n ! g ! c ;
} ;
UseA2 a = a ;
CAdvAP cadv ap np = {
s = \\n,g,c => cadv.s ++ ap.s ! n ! g ! c ++ cadv.p ++ np.s ! NPC Dir ;
};
AdjOrd ord = { s = \\_,_,_ => ord.s ; };
}

View File

@@ -0,0 +1,20 @@
concrete AdverbSnd of Adverb = CatSnd ** open ResSnd, Prelude in {
flags coding = utf8;
lin
PositAdvAdj a = {s = \\g => a.s ! Sg ! g ! Obl } ;
ComparAdvAdj cadv a np = {
s = \\g => np.s ! NPObj ++ cadv.p ++ cadv.s ++ a.s ! Sg ! g ! Obl ;
} ;
ComparAdvAdjS cadv a s = {
s = \\g => cadv.p ++ cadv.s ++ a.s ! Sg ! g ! Obl ++ s.s;
} ;
PrepNP prep np = {s = \\_ => np.s ! NPObj ++ prep.s } ;
AdAdv ada adv = { s = \\g => ada.s ++ adv.s ! g} ;
SubjS sub snt = {s = \\_ => sub.s ++ snt.s } ;
AdnCAdv cadv = {s = "سان گڏ " ++ cadv.s} ;
}

6
lib/src/sindhi/AllSnd.gf Normal file
View File

@@ -0,0 +1,6 @@
--# -path=.:../abstract:../common:../prelude
concrete AllSnd of AllSndAbs =
LangSnd,
ExtraSnd
** {} ;

View File

@@ -0,0 +1,4 @@
abstract AllSndAbs =
Lang,
ExtraSndAbs
** {} ;

100
lib/src/sindhi/CatSnd.gf Normal file
View File

@@ -0,0 +1,100 @@
concrete CatSnd of Cat = CommonX - [Adv] ** open ResSnd, Prelude in {
flags optimize=all_subs ;
lincat
------ Tensed/Untensed
S = {s : Str} ;
QS = {s : QForm => Str} ;
RS = {s : Agr => Str ; c : Case} ; -- c for it clefts
SSlash = {s : Str ; c2 : ResSnd.Compl} ;
---- Sentence
Cl = ResSnd.Clause ;
ClSlash = {
s : ResSnd.VPHTense => Polarity => Order => Str ;
c2 : ResSnd.Compl
} ;
Imp = {s : CPolarity => ImpForm => Str} ;
---- Question
QCl = {s : ResSnd.VPHTense => Polarity => QForm => Str} ;
IP = {s: Case => Str ; g : Gender ; n : Number};
IDet = {s :Gender => Str ; n : Number} ;
IQuant = {s : Number => Gender => Str} ;
---- Relative
RCl = {
s : ResSnd.VPHTense => Polarity => Order => Agr => Str ;
c : Case
} ;
RP = {s: Number => Gender => Case => Str ; a:RAgr};
---- Verb
VP = ResSnd.VPH ;
VPSlash = ResSnd.VPHSlash ;
Comp = {s : Agr => Str} ;
---- Adv
Adv = {s : Gender => Str} ;
---- Adjective
AP = ResSnd.Adjective1 ;
---- Noun
CN = ResSnd.Noun ;
NP = ResSnd.NP ;
Pron = {s : Case => Str ; ps : Str ; a : Agr};
Det = ResSnd.Determiner ;
Predet = {s : Str} ;
Num = {s : Str ; n : Number} ;
Card = {s : Str; n : Number} ;
Ord = {s : Str; n : Number} ;
Quant = {s:Number => Gender => Case => Str ; a:Agr};
Art = {s : Str} ;
---- Numeral
Numeral = {s : CardOrd => Str ; n : Number} ;
Digits = {s : CardOrd => Str ; n : Number } ;
---- Structural
Conj = {s1,s2 : Str ; n : Number} ;
-----b Conj = {s : Str ; n : Number} ;
-----b DConj = {s1,s2 : Str ; n : Number} ;
Subj = {s : Str} ;
Prep = ResSnd.Preposition;
---- Open lexical classes, e.g. Lexicon
V, VS, VQ, VA = ResSnd.Verb ; -- = {s : VForm => Str} ;
V2, V2A, V2Q, V2S = ResSnd.Verb ** {c2 : Compl} ;
V3 = ResSnd.Verb ** {c2, c3 : Str} ;
VV = ResSnd.Verb ** { isAux : Bool} ;
V2V = ResSnd.Verb ** {c1 : Str ; c2 : Str ; isAux : Bool} ;
A = ResSnd.Adjective1 ; --- {s : Gender => Number => Case => Str} ;
A2 = ResSnd.Adjective1 ** { c2 : Str} ;
N = {s : Number => Case => Str ; g : Gender} ;
N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Str ; c3 : Str } ;
N3 = {s : Number => Case => Str ; g : Gender} ** {c2 : Str ; c3 : Str ; c4 : Str} ;
PN = {s : Case => Str ; g : Gender} ;
}

View File

@@ -0,0 +1,47 @@
--concrete Conjunctionsnd of Conjunction =
-- Catsndu ** open Ressnd, Coordination, Prelude in {
concrete ConjunctionSnd of Conjunction =
CatSnd ** open ResSnd, Coordination, Prelude in {
flags optimize=all_subs ;
lin
ConjS = conjunctDistrSS ;
-- ConjAdv = conjunctDistrSS ;
ConjAdv conj advs = conjunctDistrTable Gender conj advs ;
ConjNP conj ss = conjunctDistrTable NPCase conj ss ** {
a = conjAgr (agrP3 Masc conj.n) ss.a ;
isPron = ss.isPron ;
} ;
ConjAP conj ss = conjunctDistrTable3 Number Gender Case conj ss ;
ConjRS conj rs = conjunctDistrTable Agr conj rs ** { c = rs.c};
---- These fun's are generated from the list cat's.
BaseS = twoSS ;
ConsS = consrSS comma ;
-- BaseAdv = twoSS ;
BaseAdv x y = twoTable Gender x y ;
-- ConsAdv = consrSS comma ;
ConsAdv xs x = consrTable Gender comma xs x ;
BaseNP x y = twoTable NPCase x y ** {a = conjAgr x.a y.a ; isPron = andB x.isPron y.isPron} ;
BaseRS x y = twoTable Agr x y ** {c = x.c};
ConsNP xs x = consrTable NPCase comma xs x ** {a = conjAgr xs.a x.a ; isPron = andB xs.isPron x.isPron} ;
ConsRS xs x = consrTable Agr comma xs x ** { c = xs.c};
BaseAP x y = twoTable3 Number Gender Case x y ; -- ** {isPre = andB x.isPre y.isPre} ;
ConsAP xs x = consrTable3 Number Gender Case comma xs x ;-- ** {isPre = andB xs.isPre x.isPre} ;
lincat
[S] = {s1,s2 : Str} ;
[Adv] = {s1,s2 : Gender => Str} ;
[NP] = {s1,s2 : NPCase => Str ; a : Agr ; isPron : Bool} ;
[AP] = {s1,s2 : Number => Gender => Case => Str} ;
[RS] = {s1,s2 : Agr => Str ; c : Case};
}

View File

@@ -0,0 +1,170 @@
resource Coordination = open Prelude in {
param
ListSize = TwoElem | ManyElem ;
oper
ListX = {s1,s2 : Str} ;
twoStr : (x,y : Str) -> ListX = \x,y ->
{s1 = x ; s2 = y} ;
consStr : Str -> ListX -> Str -> ListX = \comma,xs,x ->
{s1 = xs.s1 ++ comma ++ xs.s2 ; s2 = x } ;
twoSS : (_,_ : SS) -> ListX = \x,y ->
twoStr x.s y.s ;
consSS : Str -> ListX -> SS -> ListX = \comma,xs,x ->
consStr comma xs x.s ;
Conjunction : Type = SS ;
ConjunctionDistr : Type = {s1 : Str ; s2 : Str} ;
conjunctX : Conjunction -> ListX -> Str = \or,xs ->
xs.s1 ++ or.s ++ xs.s2 ;
conjunctDistrX : ConjunctionDistr -> ListX -> Str = \or,xs ->
or.s1 ++ xs.s1 ++ or.s2 ++ xs.s2 ;
conjunctSS : Conjunction -> ListX -> SS = \or,xs ->
ss (xs.s1 ++ or.s ++ xs.s2) ;
conjunctDistrSS : ConjunctionDistr -> ListX -> SS = \or,xs ->
ss (or.s1 ++ xs.s1 ++ or.s2 ++ xs.s2) ;
-- all this lifted to tables
ListTable : Type -> Type = \P -> {s1,s2 : P => Str} ;
twoTable : (P : Type) -> (_,_ : {s : P => Str}) -> ListTable P = \_,x,y ->
{s1 = x.s ; s2 = y.s} ;
consTable : (P : Type) -> Str -> ListTable P -> {s : P => Str} -> ListTable P =
\P,c,xs,x ->
{s1 = table P {o => xs.s1 ! o ++ c ++ xs.s2 ! o} ; s2 = x.s} ;
conjunctTable : (P : Type) -> Conjunction -> ListTable P -> {s : P => Str} =
\P,or,xs ->
{s = table P {p => xs.s1 ! p ++ or.s ++ xs.s2 ! p}} ;
conjunctDistrTable :
(P : Type) -> ConjunctionDistr -> ListTable P -> {s : P => Str} = \P,or,xs ->
{s = table P {p => or.s1++ xs.s1 ! p ++ or.s2 ++ xs.s2 ! p}} ;
-- ... and to two- and three-argument tables: how clumsy! ---
ListTable2 : Type -> Type -> Type = \P,Q ->
{s1,s2 : P => Q => Str} ;
twoTable2 : (P,Q : Type) -> (_,_ : {s : P => Q => Str}) -> ListTable2 P Q =
\_,_,x,y ->
{s1 = x.s ; s2 = y.s} ;
consTable2 :
(P,Q : Type) -> Str -> ListTable2 P Q -> {s : P => Q => Str} -> ListTable2 P Q =
\P,Q,c,xs,x ->
{s1 = table P {p => table Q {q => xs.s1 ! p ! q ++ c ++ xs.s2 ! p! q}} ;
s2 = x.s
} ;
conjunctTable2 :
(P,Q : Type) -> Conjunction -> ListTable2 P Q -> {s : P => Q => Str} =
\P,Q,or,xs ->
{s = table P {p => table Q {q => xs.s1 ! p ! q ++ or.s ++ xs.s2 ! p ! q}}} ;
conjunctDistrTable2 :
(P,Q : Type) -> ConjunctionDistr -> ListTable2 P Q -> {s : P => Q => Str} =
\P,Q,or,xs ->
{s =
table P {p => table Q {q => or.s1++ xs.s1 ! p ! q ++ or.s2 ++ xs.s2 ! p ! q}}} ;
ListTable3 : Type -> Type -> Type -> Type = \P,Q,R ->
{s1,s2 : P => Q => R => Str} ;
twoTable3 : (P,Q,R : Type) -> (_,_ : {s : P => Q => R => Str}) ->
ListTable3 P Q R =
\_,_,_,x,y ->
{s1 = x.s ; s2 = y.s} ;
consTable3 :
(P,Q,R : Type) -> Str -> ListTable3 P Q R -> {s : P => Q => R => Str} ->
ListTable3 P Q R =
\P,Q,R,c,xs,x ->
{s1 = \\p,q,r => xs.s1 ! p ! q ! r ++ c ++ xs.s2 ! p ! q ! r ;
s2 = x.s
} ;
conjunctTable3 :
(P,Q,R : Type) -> Conjunction -> ListTable3 P Q R -> {s : P => Q => R => Str} =
\P,Q,R,or,xs ->
{s = \\p,q,r => xs.s1 ! p ! q ! r ++ or.s ++ xs.s2 ! p ! q ! r} ;
conjunctDistrTable3 :
(P,Q,R : Type) -> ConjunctionDistr -> ListTable3 P Q R ->
{s : P => Q => R => Str} =
\P,Q,R,or,xs ->
{s = \\p,q,r => or.s1++ xs.s1 ! p ! q ! r ++ or.s2 ++ xs.s2 ! p ! q ! r} ;
---------
ListTable4 : Type -> Type -> Type -> Type -> Type = \P,Q,R,T ->
{s1,s2 : P => Q => R => T => Str} ;
twoTable4 : (P,Q,R,T : Type) -> (_,_ : {s : P => Q => R => T => Str}) ->
ListTable4 P Q R T =
\_,_,_,_,x,y ->
{s1 = x.s ; s2 = y.s} ;
consTable4 :
(P,Q,R,T : Type) -> Str -> ListTable4 P Q R T -> {s : P => Q => R => T => Str} ->
ListTable4 P Q R T =
\P,Q,R,T,c,xs,x ->
{s1 = \\p,q,r,t => xs.s1 ! p ! q ! r ! t ++ c ++ xs.s2 ! p ! q ! r ! t ;
s2 = x.s
} ;
conjunctTable4 :
(P,Q,R,T : Type) -> Conjunction -> ListTable4 P Q R T -> {s : P => Q => R => T => Str} =
\P,Q,R,T,or,xs ->
{s = \\p,q,r,t => xs.s1 ! p ! q ! r ! t ++ or.s ++ xs.s2 ! p ! q ! r ! t} ;
conjunctDistrTable4 :
(P,Q,R,T : Type) -> ConjunctionDistr -> ListTable4 P Q R T ->
{s : P => Q => R => T => Str} =
\P,Q,R,T,or,xs ->
{s = \\p,q,r,t => or.s1++ xs.s1 ! p ! q ! r ! t ++ or.s2 ++ xs.s2 ! p ! q ! r ! t} ;
--------------
comma = "," ;
-- you can also do this to right-associative lists:
consrStr : Str -> Str -> ListX -> ListX = \comma,x,xs ->
{s1 = x ++ comma ++ xs.s1 ; s2 = xs.s2 } ;
consrSS : Str -> SS -> ListX -> ListX = \comma,x,xs ->
consrStr comma x.s xs ;
consrTable : (P : Type) -> Str -> {s : P => Str} -> ListTable P -> ListTable P =
\P,c,x,xs ->
{s1 = table P {o => x.s ! o ++ c ++ xs.s1 ! o} ; s2 = xs.s2} ;
consrTable2 : (P,Q : Type) -> Str -> {s : P => Q => Str} ->
ListTable2 P Q -> ListTable2 P Q =
\P,Q,c,x,xs ->
{s1 = table P {p => table Q {q => x.s ! p ! q ++ c ++ xs.s1 ! p ! q}} ;
s2 = xs.s2
} ;
consrTable4 : (P,Q,R,T : Type) -> Str -> {s : P => Q => R => T => Str} ->
ListTable4 P Q R T -> ListTable4 P Q R T =
\P,Q,R,T,c,x,xs ->
{s1 = table P {p => table Q {q => table R { r => table T {t => x.s ! p ! q ! r ! t ++ c ++ xs.s1 ! p ! q ! r ! t}}}} ;
s2 = xs.s2
} ;
consrTable3 : (P,Q,R : Type) -> Str -> {s : P => Q => R => Str} ->
ListTable3 P Q R -> ListTable3 P Q R =
\P,Q,R,c,x,xs ->
{s1 = table P {p => table Q {q => table R {t => x.s ! p ! q ! t ++ c ++ xs.s1 ! p ! q ! t }}} ;
s2 = xs.s2
} ;
} ;

View File

@@ -0,0 +1,19 @@
concrete ExtraSnd of ExtraSndAbs = CatSnd **
open ResSnd, Coordination, Prelude, MorphoSnd, ParadigmsSnd in {
flags coding = utf8;
lin
GenNP np = {s = \\_,_,_ => np.s ! NPC Obl ++ "ڪا" ; a = np.a} ;
each_Det = mkDet "hر ڪwی" "hر ڪwی" "hر ڪwی" "hر ڪwی" Sg ;
have_V = mkV "راڪھنا";
IAdvAdv adv = {s = "ڪتنی" ++ adv.s!Masc} ;
ICompAP ap = {s = "ڪتنE" ++ ap.s ! Sg ! Masc ! Dir} ;
cost_V = mkV "قیمت" ;
-- added for causitives
make_CV = mkVerb "نoتhiنگ" ** {c2 = "" };
-- for VP conjunction
}

View File

@@ -0,0 +1,9 @@
abstract ExtraSndAbs = Extra ** {
-- uncontracted negations; contracted are the default
fun
each_Det : Det ;
have_V : V;
cost_V : V;
}

View File

@@ -0,0 +1,24 @@
--# -path=.:../abstract:../common:../prelude
concrete GrammarSnd of Grammar =
NounSnd,
VerbSnd,
AdjectiveSnd,
AdverbSnd,
NumeralSnd,
SentenceSnd,
QuestionSnd,
RelativeSnd,
ConjunctionSnd,
PhraseSnd,
TextX - [Adv],
StructuralSnd,
TenseX - [Adv],
IdiomSnd
** {
flags startcat = Phr ; unlexer = text ; lexer = text ;
}

View File

@@ -0,0 +1,40 @@
concrete IdiomSnd of Idiom = CatSnd ** open Prelude,Predef, ResSnd in {
flags optimize=all_subs ;
flags coding = utf8;
lin
ImpersCl vp = mkSClause " " (agrP3 Masc Sg) vp ;
GenericCl vp = mkSClause "ڪو۶ی" (agrP3 Masc Sg) vp ;
CleftNP np rs =
let cl = mkSClause (np.s ! NPC rs.c) (np.a) (predAux auxBe);
in
{s = \\t,p,o => cl.s ! t ! p ! o ++ rs.s ! np.a };
CleftAdv ad ss = { s = \\t,b,o => ad.s ! Masc ++ ss.s};
ExistNP np =
mkSClause "ھتی" (agrP3 (fromAgr np.a).g (fromAgr np.a).n)
(insertObj (\\_ => np.s ! NPC Dir) (predAux auxBe)) ;
ExistIP ip =
let cl = mkSClause ("ھتی" ++ ip.s ! Dir) (agrP3 ip.g ip.n) (predAux auxBe);
in {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! ODir;
QIndir => cl.s ! t! p ! ODir
}
};
ProgrVP vp = (predProg vp) ;
ImpPl1 vp = {s = "اچ" ++ (vp.s ! VPReq).inf} ;
-- ImpP3 np vp = {s = np.s!NPC Dir ++ "کی" ++ (vp.s ! VPImp ).inf ++ "ڏی"}; here VPImp form is not correct e.g jan ko sw do, rather jan ko swnE do, and swnE is stored in vp.VPInf.fin
ImpP3 np vp = {s = np.s!NPC Dir ++ "کی" ++ (vp.s ! VPInf ).fin ++ "ڏیو"};
}

10
lib/src/sindhi/LangSnd.gf Normal file
View File

@@ -0,0 +1,10 @@
--# -path=.:../abstract:../common:../sindhi
concrete LangSnd of Lang =
GrammarSnd,
LexiconSnd
** {
flags startcat = Phr ; unlexer=unwords ; lexer=words ;
}

View File

@@ -0,0 +1,362 @@
--# -path=.:prelude:alltenses
concrete LexiconSnd of Lexicon = CatSnd **
--open ResSnd, Prelude in {
open ParadigmsSnd,MorphoSnd, Prelude in {
flags
optimize=values ;
coding = utf8;
lin
airplane_N = mkN03 "جھاج" ;
answer_V2S = mkV2 (compoundV "جواب" (mkV "ڏیڻ ")) ;
apple_N = mkN03 "سوف" ;
art_N = mkN13 "فن" ;
ask_V2Q = mkV2 (mkV "پڇڻ ");
baby_N = mkN05 "ٻار" ;
bad_A = mkAdj3 "ڪراب" ;
bank_N = mkN03 "بانڪ" ;
beautiful_A = mkAdj1 "پیارو" ;
become_VA = mkV "ٿیڻ ";
beer_N = mkN03 "شراب" ;
--beg_V2V = mkV "پنڻ " ;
big_A = mkAdj1 "وڏو" ;
bike_N = mkN03 "سایچl" ;
bird_N = mkN01 "پکی" ;
black_A = mkAdj1 "ڪارو" ;
blue_A = mkAdj1 "نیرو" ;
boat_N = mkN04 "ڀیری" ;
book_N = mkN03 "ڪتاب" ;
boot_N = mkN01 "جوتو" ;
boss_N = mkN03 "بالادست" ;
boy_N = mkN01 "چوڪرو" ;
bread_N = mkN03 "مانی" ;
break_V2 = mkV2 "ٽورڻ " ;
broad_A = mkAdj1 "ویڪرو" ;
--brother_N2 = mkN10 "ڀا۶ " "جo " ; --not correct
brown_A = mkAdj3 "ناسی" ;
butter_N = mkN13 "مکڻ" ;
buy_V2 = mkV2(compoundV "ئرید " do_V2);
camera_N = mkN01 "ڪیمیرا";
cap_N = mkN03 "ڻوپY" ;
car_N = mkN03 "گاڏی" ;
carpet_N = mkN01 "تڏو" ;
cat_N = mkN09 "ٻلی" ;
ceiling_N = mkN01 "ڇت" ;
chair_N = mkN09 "ڪرسی" ;
cheese_N = mkN14 "پنیر" ;
child_N = mkN01 "ٻار" ;
--church_N = mkN03 "گرجا" (mkN "گرجا") ;
clean_A = mkAdj3 "ساف" ;
clever_A = mkAdj3 "hوشیار" ;
close_V2 = mkV2 (compoundV "بند" do_V2);
coat_N = mkN03 "ڪوٽ" ;
cold_A = mkAdj1 "ٿڌو" ;
computer_N = mkN03 "ڪمپیوٽر" ;
country_N = mkN03 "مlڪ" ;
cousin_N = mkN03 "س۶وٽ" ; -- a compund noun made of two nouns
cow_N = mkN09 "گان" ;
die_V = mkV "مرڻ " ;
dirty_A = mkAdj1 "میرو" ;
--distance_N3 = mkN3 (mkN "پنڌ") (mkPrep "دا") "دE" "توN" ;
doctor_N = mkN03 "ڊاڪتر" ;
dog_N = mkN01 "ڪتو" ;
door_N = mkN01 "دروزو" ;
drink_V2 = mkV2 "پی۶ڻ ";
easy_A2V = mkA "سولو" "" ;
eat_V2 = mkV2( mkV "کا۶ڻ ");
empty_A = mkAdj3 "ئالی" ;
enemy_N = mkN03 "دشمن" ;
factory_N = mkN02 "ڪارئانو" ;
father_N2 = mkN2 (mkN06 "پی") (mkPrep "جو") "جی" ;
fear_VS = mkV "ڊڄڻ ";
fish_N = mkN09 "مڇی" ;
floor_N = mkN03 "فرش" ;
fridge_N = mkN03 "گرج" ;
friend_N = mkN05 "دوست" ;
fruit_N = mkN13 "ثمر" ;
--fun_AV = mkAdj1V (regA "مزو") ;
garden_N = mkN03 "باغ" ;
girl_N = mkN09 "ڇوڪری" ;
glove_N = mkN01 "دستانو" ;
gold_N = mkN13 "سون" ;
good_A = mkAdj1 "سٺو" ;
-- go_V = mkIrrgV "وڃڻ" "" ;
green_A = mkAdj1 "ساعو" ;
harbour_N = mkN08 "پاناگاھ" ;
hate_V2 = mkV2 (compoundV "نفرت" do_V2) ;
hat_N = mkN01 "توپlو" ;
--have_V = dirV2 (mk5V "ha?ع" "hاس" "hاد" "hاد" "ھجڻ ") ;
hear_V2 = mkV2 (mkV "ٻڌڻ ") ;
hill_N = mkN09 "ٽڪری" ;
hope_VS = (compoundV "امید" do_V2);
horse_N = mkN01 "گورو" ;
hot_A = mkAdj1 "ڪوسو" ;
house_N = mkN03 "گھر" ;
important_A = mkAdj3 "ضروری" ;
industry_N = mkN01 "دندو" ;
iron_N = mkN09 "لوھ " ;
king_N = mkN01 "بادشاھ" ;
know_V2 = mkV2 (mkV "Jاڻڻ") ;
know_VS = (mkV "ڄاڻڻ ") ;
know_VQ = (mkV "ڄاڻڻ ") ;
lake_N = mkN09 "ڍنڍ" ;
lamp_N = mkN09 "بتی " ;
learn_V2 = mkV2 ( mkV "سK'ڻ ") ;
leather_N = mkN01 "چمڙو" ;
leave_V2 = mkV2 (mkV "چڏڻ") ;
like_V2 = mkV2 (compoundV "پصند" do_V2);
listen_V2 = mkV2 (mkV "ئن ڍیڻ ") ;
live_V = mkV "رhڻ " ; ---- touch
long_A = mkAdj1 "ڊگو" ;
lose_V2= mkV2 "hارا۶ڻ " ;
love_N = mkN08 "مھبت" ;
love_V2 = mkV2 (compoundV "عشق" do_V2) "سان";
man_N = mkN03 "ماڻھو" ;--not correct according to rules should be discussed
--married_A2 = mkAdj1 "پرڻیل" ;
meat_N = mkN01 "کادو" ;
milk_N = mkN13 "کیر" ;
moon_N = mkN13 "چنڊ" ;
--mother_N2 = mkN2(mkN07 "ما۶ " "جو" "جی" );--not covered need to be discussed
mountain_N = mkN03 "جبل" ;
music_N = mkN14 "موسیقی" ;
narrow_A = mkAdj1 "سوڙھو" ;
new_A = mkAdj1 "ن۶ون" ;
newspaper_N = mkN04 "ائبار" ;
oil_N = mkN03 "تیل" ;
old_A = mkAdj1 "پوڙھی" ;
-- open_V2 = mkV2 (mkIrrgV "ئولڻ" "ئوl") ;
paint_V2A = mkV2 (compoundV "رنگ" do_V2) ;
paper_N = mkN01 "پنو" ;
--paris_PN = mkN13 "پیرس" masculine;
peace_N = mkN13 "امن" ;
pen_N = mkN14 "قلم" ;
planet_N = mkN01 "سیارو" ;
plastic_N = mkN13 "مڙندڙ" ;
play_V2 = mkV2 (mkV "راند") ;
policeman_N = mkN05 "سپاھی" ;
priest_N = mkN05 "پیغمبر" ;
--probable_AS = mkAdj1S (regA "امڪان" ) ;
queen_N = mkN09 "شھزادی" ;
radio_N = mkN01 "باجو" ;
--rain_V0 = compoundV "مینھن" "";
red_A = mkAdj1 "ڳاڙھو" ; -- worst case
religion_N = mkN03 "مزھب" ;
restaurant_N = mkN05 "ھوٽl" ;
river_N = mkN12 "دریا" ;
rock_N = mkN08 "ٽڪری" ;
roof_N = mkN14 "ڇت" ;
rubber_N = mkN13 "ربڙ" ;
run_V = mkV "ڊوڙڻ " ;
say_VS = mkV "چوڻ " ;
school_N = mkN03 "اسڪول" ;
science_N = mkN13 "ساعنص" ;
sea_N = mkN14 "سمنڊ" ;
seek_V2 = mkV2 (compoundV "تlاش" do_V2) ;
see_V2 = mkV2 (mkV "ڏسڻ ") ;
sell_V = mkV "وڪڻڻ ";
send_V= mkV "موڪلڻ ";
sheep_N = mkN09 "رڍ" ;
ship_N = mkN03 "جhاز" ;
shirt_N = mkN01 "چولو";
shoe_N = mkN01 "جوتو" ;
shop_N = mkN03 "دوڪان" ;
short_A = mkAdj1 "ننڍو " ;
silver_N = mkN14 "چاندی" ;
sister_N = mkN11 "ٻیڻ " ;
sleep_V = mkV "سمھڻ " ;
small_A = mkAdj1 "ننڍو" ;
snake_N = mkN03 "نانگ" ;
sock_N = mkN04 "جوراب" ;
speak_V2 = mkV2 (mkV "غالh۶ڻ ") ;
star_N = mkN01 "شروعات" ;
steel_N = mkN13 "استیل" ;
stone_N = mkN05 "پٽر" ;
stove_N = mkN01 "چلھو" ;
student_N = mkN05 "شاگرد" ;
stupid_A = mkAdj1 "چریو" ;
sun_N = mkN13 "سج" ;
switch8off_V2 = mkV2 (mkV "ھلاعت") ;
switch8on_V2 = mkV2 (compoundV "بند" do_V2) ;
table_N = mkN04 "میز" ;
talk_V = mkV "غالhاعڻ ";
teacher_N = mkN05 "استاد" ;
teach_V = mkV "سیکارڻ ";
television_N = mkN14 "تیلیوزن" ;
thick_A = mkAdj1 "موتو" ;
thin_A = mkAdj1 "سنھو" ;
train_N = mkN09 "ریل" ;
travel_V = (compoundV "سفر" do_V2) ;
tree_N = mkN13 "وڻ " ;
trousers_N = mkN01 "پاجامو" ;
ugly_A = mkAdj3 "بدسورت" ;
understand_V = mkV "سمجھڻ ";
university_N = mkN09 "یونیورسٽY" ;
village_N = mkN03 "غوٺ " ;
wait_V2 = mkV2 (compoundV "انتظار" (mkV "انتظار")) ;
walk_V = mkV "ھلڻ " ;
warm_A = mkAdj3 "گرم" ;
war_N = mkN03 "جنگ" ;
watch_V2 = mkV2 (mkV "ڍسڻ ") ;
water_N = mkN14 "پاڻی" ; -- not covered masculine ending with y
white_A = mkAdj1 "اڇو" ;
window_N = mkN09 "دری" ;
wine_N = mkN04 "شراب";
win_V = mkV"کٽڻ " ;
woman_N = mkN09 "استری" ;
wonder_VQ = compoundV "ھیران"(mkV "ٿیڻ ") ;
wood_N = mkN13 "ڪاٺ" ;
write_V = mkV "لئڻ " ;
yellow_A = mkAdj1 "پیلو" ;
young_A = mkAdj3 "جوان" ;
do_V2 = mkV2 (mkV "ڪرڻ ") ;
now_Adv = mkAdv "ھاڻی" ;
--already_Adv = mkAdj1dv "پھریاعین" ;
song_N = mkN01 "گانو" ;
-- number_N = mkN03 "انگ" ;
put_V = mkV "وجڻ " ;
stop_V = mkV "بیھڻ " ;
jump_V = compoundV "ٽپو " (mkV "") ; -- here
left_Ord = {s = "کابو" ; n = singular};
right_Ord = {s= "سڄو" ; n = singular};
--far_Adv = mkAdj1dv "پری" ;
correct_A = mkAdj3 "سھی" ;
dry_A = mkAdj3 "ئشڪ" ;
dull_A = mkAdj1 "جڏو" ;
full_A = mkAdj3 "ٻریل" ;
heavy_A = mkAdj1 "گرو" ;
near_A = mkAdj1 "ویجھو" ;
rotten_A = mkAdj3 "ئراب" ;
round_A = mkAdj3 "گول" ;
sharp_A = mkAdj3 "تیز" ;
smooth_A = mkAdj3 "hموار" ;
straight_A = mkAdj1 "سڌو" ;
wet_A = mkAdj1 "االو";
wide_A = mkAdj1 "ویڪرو" ;
animal_N = mkN03 "جانور" ;
ashes_N = mkN14 "راک " ; -- FIXME: plural only?
back_N = mkN09 "پٺ " ;
bark_N = mkN13 "ٻ۶ونڪڻ " ;
belly_N = mkN14 "پیٽ" ;
blood_N = mkN13 "رت" ;
bone_N = mkN09 "hڏی" ;
breast_N = mkN09 "ڇاتی" ;
cloud_N = mkN03 "جھڙ" ;
day_N = mkN13 "ڏینھن" ;
dust_N = mkN14"ڌوڙ" ;
ear_N = mkN03 "ڪن" ;
earth_N = mkN08 "زمین" ;
egg_N = mkN01 "بیدو" ;
eye_N = mkN09 "اک " ;
fat_N = mkN09 "چرٻی" ;
feather_N = mkN13 "کنڀ" ;
fingernail_N = mkN03 "نھ " ;
fire_N = mkN14 "باھ" ;
flower_N = mkN03 "گل" ;
fog_N = mkN13 "ماڪ" ;
foot_N = mkN03 "پیر" ; -- not properly covered need to be discussed
forest_N = mkN01 "ٻیلو" ;
grass_N = mkN04 "گاh" ;
--guts_N = mkN "g?ت" ; -- FIXME: no singular
hair_N = mkN03 "وار" ;
hand_N = mkN03 "hٿ ";
head_N = mkN01 "مٿو" ;
heart_N = mkN09 "دل";
horn_N = mkN13 "سڱ " ;
husband_N = mkN03 "مڙس" ;
ice_N = mkN09 "برف" ;
nee_N = mkN01 "گوڏو" ;
leaf_N = mkN03 "پن" ;
leg_N = mkN09 "ٽنگ" ;
liver_N = mkN03 "جیرو" ;
louse_N = mkN14 "جون۶ " ;
mouth_N = mkN03 "وات" ;
name_N = mkN01 "نالو";
neck_N = mkN04 "ڪنڌ " ;
night_N = mkN09 "رات" ;
nose_N = mkN03 "نڪ" ;
person_N = mkN03 "شئس" ;
rain_N = mkN14 "مینhن" ;
road_N = mkN01 "رستو" ;
root_N = mkN09 "پاڙ" ;
rope_N = mkN09 "رسی";
salt_N = mkN14 "لوڻ " ;
sand_N = mkN14 "واری" ;
seed_N = mkN03 "ٻج" ;
skin_N = mkN09 "چمڙی" ;
sky_N = mkN03 "ااسمان";
smoke_N = mkN13 "دونھو"; -- singular masc nouns ending with aN,wN yet to be implemented
snow_N = mkN13 "برف" ;
stick_N = mkN09 "ڏنڊی" ;
tail_N = mkN13 "پڇ " ;
tongue_N = mkN08 "زبان" ;
tooth_N = mkN03 "ڏاند";
wife_N = mkN09 "زال" ;
wind_N = mkN08 "ھوا" ;
wing_N = mkN05 "پر" ;
worm_N = mkN01 "ڪینعون" ;
year_N = mkN03 "سال" ;
blow_V = mkV "وڄڻ " ;
breathe_V = compoundV "ساh " (mkV "K'ڻڻ " ) ;
burn_V = mkV "سڙڻ " ;
dig_V = mkV "K'ٽڻ " ;
fall_V = mkV "ڪرڻ " ;
float_V = mkV "ترڻ " ;
flow_V = mkV "وھڻ " ;
fly_V = mkV "اڏڻ ";
freeze_V = mkV "ڄمڻ " ;
give_V3= mkV3 (mkV "ڏیڻ ") "" "" ; -- here
laugh_V = mkV "کلڻ " ;
lie_N = mkN01 "ڪوڙ" ;
lie_V = compoundV "ڪوڙ " ( mkV "غالhاعڻ ") ;
play_V = mkV "کیڍڻ " ;
sew_V = mkV "سبڻ " ;
sing_V = mkV "گا۶ڻ " ;
sit_V = mkV "ویھڻ ";
smell_V = mkV "سنگڻ " ;
spit_V = mkV "ٿڪڻ " ;
stand_V = mkV "باھڻ ";
swell_V = mkV "سبڻ" ;
swim_V = mkV "ترڻ " ;
think_V = mkV "سوچڻ " ;
turn_V = mkV "مڙڻ ";
vomit_V = compoundV "الٽی" (mkV "ڪرڻ ") ;
bite_V2 = mkV2 (mkV "چئ پا۶ڻ ") ;
count_V = mkV "غڻڻ ";
cut_V = mkV "ڪٽڻ ";
fear_V = mkV "ڊڄڻ " ;
fight_V = mkV "وڙھڻ " ;
hit_V = mkV "مارڻ " ;
hold_V = mkV "جھلڻ " ;
hunt_V2 = mkV2 (compoundV "شڪار" do_V2);
kill_V = mkV "مارن" ;
pull_V = mkV "چڪڻ ";
push_V = mkV "ڌڪڻ " ;
rub_V = mkV "مھٽڻ " ;
scratch_V= mkV "ئرچڻ " ;
split_V= mkV "ھارڻ " ;
--squeeze_V2 = dirV2 (regV "سq?ععزع") ;
--stab_V2 = dirV2 (regDuplV "ستاب") ;
suck_V = mkV "چوسڻ " ;
throw_V = mkV "اڇلڻ " ;
tie_V = mkV "ٻڌڻ " ;
wash_V = mkV "ڌو۶ڻ" ;
wipe_V= mkV "اگھڻ ";
--other_A = regA "ٻیا";
grammar_N = mkN03 "گردان" ;
language_N = mkN09 "ٻولی" ;
rule_N = mkN03 "اصول" ;
---- added 4/6/2007
john_PN = mkPN "جان" masculine ;
question_N = mkN03 "سواl" ;
--ready_A = regA "تیار" ;
reason_N = mkN03 "سبب" ;
today_Adv = mkAdv "اڄ " ;
uncertain_A = mkAdj3 ["اچانڪ"] ;
}

View File

@@ -0,0 +1,14 @@
--# -path=.:../common:../abstract
resource MakeStructuralsnd = open Catsnd, Paradigmssnd, Ressnd, Morphosnd, Nounsnd, Prelude in {
oper
mkSubj : Str -> CatPnb.Subj = \x ->
lin Subj {s = x} ;
mkNP : Str -> Number -> ResPnb.NP = \s,n ->
MassNP (UseN (ParadigmsPnb.mkN s));
-- lin NP (regNP s n) ;
mkIDet : Str -> Number -> IDet = \s,n ->
lin IDet {s = \\_ => s ; n = n} ;
}

393
lib/src/sindhi/MorphoSnd.gf Normal file
View File

@@ -0,0 +1,393 @@
--# -path=.:../../prelude
--
----1 A Simple Sindhi Resource Morphology
----
---- by Jherna Devi, Shafqat Virk,2012
----
---- This resource morphology contains definitions needed in the resource
---- syntax. To build a lexicon, it is better to use $ParadigmsSnd$, which
---- gives a higher-level access to this module.
--
resource MorphoSnd = ResSnd ** open Prelude,Predef in {
flags optimize=all ;
coding = utf8;
----2 Nouns
oper
mkN : (x1,_,_,_,_,_,_,x8 : Str) -> Gender -> Noun =
\sd,so,sv,sa, pd,po,pv,pa, g -> {
s = table {
Sg => table {
Dir => sd ;
Obl => so ;
Voc => sv ;
Abl => sa
} ;
Pl => table {
Dir => pd ;
Obl => po ;
Voc => pv ;
Abl => pa
}
} ;
g = g
} ;
-- 1. msculine: chokro, kuto, hat
mkN01 : Str -> Noun ;
mkN01 chokro = let chokr = (tk 1 chokro)
in mkN (chokro) (chokr+"ی") (chokr+"ا") (chokr+"ا")
(chokr+"ا") (chokr+"ن") (chokr+"ا") (chokr+"ا")
Masc ;
-- 2. karkhano
mkN02 : Str -> Noun ;
mkN02 karkhano =let karkhan = (tk 1 karkhano)
in mkN (karkhano) (karkhan+"ی") (karkhan+"ا") (karkhano)
(karkhan+"ا") (karkhan+"ن") (karkhan+"و") (karkhan+"ا")
Fem ;
-- 3. gher, shehar
mkN03 : Str -> Noun ;
mkN03 gher = mkN (gher) (gher) (gher) (gher)
(gher) (gher+"ن") (gher+"و") (gher)
Masc ;
-- 4. paki, mez, gah
mkN04 : Str -> Noun ;
mkN04 paki = mkN (paki) (paki) (paki) (paki)
(paki) (paki+"ن") (paki) (paki)
Fem ;
-- 5. msculine: bar, hotel, pathar
mkN05 : Str -> Noun ;
mkN05 bar = mkN (bar) (bar) (bar) (bar)
(bar) (bar+"ن") (bar+"و") (bar)
Masc ;
-- 6. pe
mkN06 : Str -> Noun ;
mkN06 pe = mkN (pe) (pe) (pe) (pe)
(pe+"۶ر") (pe+"۶رن") (pe+"۶رو") (pe+"۶ر")
Masc ;
-- 7. Feminine : ma
mkN07 : Str -> Noun ;
mkN07 ma = mkN (ma) (ma) (ma) (ma)
(ma+"۶ر") (ma+"۶رن") (ma+"۶رو") (ma+"۶ر")
Fem ;
-- 8. msculine: topi, takre
mkN08 : Str -> Noun ;
mkN08 topi = mkN (topi) (topi) (topi) (topi)
(topi+"ون") (topi+"ن") (topi+"و") (topi+"ون")
Masc ;
-- 9. Feminine: bere, bili, kurse
mkN09 : Str -> Noun ;
mkN09 bili = mkN (bili) (bili) (bili) (bili)
(bili+"ون") (bili+"ن") (bili+"ن") (bili+"ون")
Fem ;
-- 10. msculine: bha
mkN010 : Str -> Noun ;
mkN010 bha = mkN (bha) (bha) (bha) (bha)
(bha+"ر") (bha+"رن") (bha+"رو") (bha+"ر")
Masc ;
-- 11. Feminine: bhen
mkN11 : Str -> Noun ;
mkN11 bhen = let bhe= (tk 1 bhen)
in mkN (bhen) (bhen) (bhen) (bhen)
(bhe+"نر") (bhe+"نرن") (bhen+"ون") (bhe+"نر")
Fem ;
--12. msculine: raja, darya
mkN12 : Str -> Noun ;
mkN12 raja = mkN (raja) (raja) (raja) (raja)
(raja) (raja+"۶ن") (raja+"۶و") (raja)
Masc ;
-- 13. msculine: fan, son, kher,
mkN13 : Str -> Noun ;
mkN13 son = mkN (son) (son) (son) (son)
(son) (son) (son) (son)
Masc ;
-- 14. Feminine: pen, samand
mkN14 : Str -> Noun ;
mkN14 pen = mkN (pen) (pen) (pen) (pen)
(pen) (pen) pen ""
Fem ;
----2 Determiners
IDeterminer = {s:Gender => Str ; n : Number};
makeDet : Str -> Str -> Str -> Str -> Number -> Determiner = \s1,s2,s3,s4,n -> {
s = table {
Sg => table {
Masc => s1 ;
Fem => s2
} ;
Pl => table {
Masc => s3 ;
Fem => s4
}
} ;
n = n
};
makeIDet : Str -> Str -> Number -> IDeterminer = \s1,s2,n -> {
s = table {
Masc => s1;
Fem => s2
};
n = n
};
makeIQuant : Str -> Str -> Str -> Str -> {s:Number => Gender => Str} = \s1,s2,s3,s4 -> {
s = table {
Sg => table {
Masc => s1 ;
Fem => s2
} ;
Pl => table {
Masc => s3 ;
Fem => s4
}
}
};
-- Proposition
makePrep : Str -> Preposition = \str -> {s = str } ** { lock_Prep = <>};
----2 Pronouns
--PronForm = {s:Pronoun => Str};
DemonPronForm = {s:DemPronForm => Str};
mkDemonPronForm : (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16:Str) -> DemPronForm =
\y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16 -> {
s = table {
Sg => table {
Masc => table {
Dir => y1 ;
Obl => y2 ;
Voc => y3 ;
Abl => y4
};
Fem => table {
Dir => y5 ;
Obl => y6 ;
Voc => y7 ;
Abl => y8
}
};
Pl => table {
Masc => table {
Dir => y9 ;
Obl => y10 ;
Voc => y11 ;
Abl => y12
};
Fem => table {
Dir => y13 ;
Obl => y14 ;
Voc => y15 ;
Abl => y16
}
}
}
};
makeDemonPronForm : Str -> Str -> Str -> DemPronForm ;
makeDemonPronForm yeh is inn = mkDemonPronForm yeh is "" yeh is "" yeh inn "" yeh inn "" "" "" "" "";
-- makePossPronForm myra myry hmara hmary = mkDemonPronForm myra myra myra myry myry myry hmara hmara hmara hmary hmary hmary;
mkPron : (x1,x2,x3,x4:Str) -> {s:Case => Str} =
\y1,y2,y3,y4 -> { s =
table {
Dir => y1;
Obl => y2;
Voc => y3;
Abl => y4
}
};
------- PossPronForm yet to be implemented
-- IntPronForm = {s:InterrPronForm => Str};
IntPronForm = {s: Case => Str};
mkIntPronForm : (x1,x2,x3,x4:Str) -> IntPronForm =
\y1,y2,y3,y4 -> {
s =
table {
Dir => y1;
Obl => y2;
Voc => y3;
Abl => y4
}
};
----2 Adjectives
-- defined in ResSnd
------------------------------------------------------------------
----Verbs
------------------------------------------------------------------
--1. Basic stem form, direct & indirect causatives exists
-- v1 nechna nechaana nechwana
mkVerb : (_: Str) -> Verb = \inf ->
let root = (tk 1 inf) ;
inf = inf ;
root2 = (tk 2 inf) ;
in {
s = table {
Root => root ;
Inf => inf ;
Inf_Fem => ((tk 1 root) + "ی") ;
Inf_Obl => (tk 1 root) ;
Ablative => ((tk 1 root) + "وN") ;
VF tense person number gender => (mkCmnVF root root2 tense person number gender).s
}
} ;
mkIrrgVerb : (inf,root: Str) -> Verb = \inf,root ->
let root = root ;
in {
s = table {
Root => root ;
Inf => inf ;
Inf_Fem => ((tk 1 inf) + "ی") ;
Inf_Obl => (tk 1 inf) ;
Ablative => ((tk 1 inf) + "وN") ;
VF tense person number gender => (mkCmnVF (root+"ی") (root+"ی") tense person number gender).s
}
} ;
mkCmnVF : Str -> Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \root,root2,t,p,n,g ->
{s = case (last root) of {
("ا"|"۽"|"ی") => (mkCmnVF1 root t p n g).s ;
_ => (mkCmnVF1 root t p n g).s
}
};
mkCmnVF1 : Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \root,t,p,n,g ->
{s = let nadaa = root + "ندو" ; --root + variants{"ندا";"وندا"};
nadii = root + "ون" ; --root + variants{"ندی";"وندی"} ;
nade = root + "ندی" ; --root + variants{"ندی";"یندین"} ;
nadiiaaN = root + "ندو"; --root + variants{"ندیاN";"وندیاN"};
ndi = root + "ندی";
nda = root + "ندا" ;
ndywn = root + "ندیون" ;
ndyn = root + "ندین" ;
in
case <t,p,n,g> of {
<Subj,Pers1, Sg,_> => root + "ان" ;
<Subj,Pers1, Sg,_> => root + "ان" ;
<subj, Pers1, pl,Masc> => root + "ون" ;
<subj, Pers1, pl,Fem> => root + "ون" ;
<Subj,Pers2_Casual, Sg,_> => root +"ین";
<Subj,Pers2_Casual, Pl,_> => root + "و" ;
<Subj,Pers2_Respect, _, _> => root + "و" ;
<Subj,Pers3_Near, Sg,Masc> => root +"ی";
<Subj,Pers3_Near, sg,Fem> => root +"ی";
<Subj,Pers3_Near, pl,Masc> => root +"ن";
<Subj,Pers3_Near, pl,Fem> => root +"ن";
<Subj,Pers3_Distant,Sg,Masc> => root +"ی";
<Subj,Pers3_Distant,Sg,Fem> => root +"ی";
<Subj,Pers3_Distant,Pl,Masc> => root +"ن";
<Subj,Pers3_Distant,Pl,Fem> => root +"ن";
<Perf, Pers1,Sg,Masc> => root + "یل" ;
<Perf, Pers1,Sg,Fem> => root + "یل" ;
<Perf, Pers1,Pl,Masc> => root + "یل" ;
<Perf, Pers1,Pl,Fem> => root + "یل" ;
<Perf, Pers2_Casual,Sg,Masc> => root + "یل" ;
<Perf, Pers2_Casual,Sg,Fem> => root + "یل" ;
<Perf, Pers2_Casual,Pl,Masc> => root + "یل" ;
<Perf, Pers2_Casual,Pl,Fem> => root + "یل" ;
<Perf, Pers2_Respect,Sg,Masc> => root + "یل" ;
<Perf, Pers2_Respect,Sg,Fem> => root + "یل" ;
<Perf, Pers2_Respect,Pl,Masc> => root + "یل" ;
<Perf, Pers2_Respect,Pl,Fem> => root + "یل" ;
<Perf, _, Sg,Masc> => root + "یل" ;
<Perf, _, Sg,Fem> => root + "یل" ;
<Perf, _, Pl,Masc> => root + "یل" ;
<Perf, _, Pl,Fem> => root + "یل" ;
<Imperf, Pers1,Sg, Masc> => root + "ندو" ;
<Imperf, Pers1,Sg, Fem> => root + "ندی" ;
<Imperf, Pers1,Pl, Masc> => root + "ندا" ;
<Imperf, Pers1,Pl, Fem> => root + "ندیون" ;
<Imperf, Pers2_Casual, Sg, Masc> => root + "ندو" ;
<Imperf, Pers2_Casual, Sg, Fem> => root + "ندی" ;
<Imperf, Pers2_Casual, Pl, Masc> => root + "ندا" ;
<Imperf, Pers2_Casual, Pl, Fem> => root + "ندیون" ;
<Imperf, Pers2_Respect, Sg, Masc> => root + "ندا" ;
<Imperf, Pers2_Respect, Sg, Fem> => root + "ندیون" ;
<Imperf, Pers2_Respect, Pl, Masc> => root + "ندا" ;
<Imperf, Pers2_Respect, Pl, Fem> => root + "ندیون" ;
<Imperf, _, Sg, Masc> => root + "ندو" ;
<Imperf, _, Sg, Fem> => root + "ندی" ;
<Imperf, _, Pl, Masc> => root + "ندا" ;
<Imperf, _, Pl, Fem> => root + "ندیون"
}
} ;
mkCmnVF2 : Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \inf,t,p,n,g ->
{s =
case <t,p,n,g> of {
<_, _, _,_> => inf
}
};
}

138
lib/src/sindhi/NounSnd.gf Normal file
View File

@@ -0,0 +1,138 @@
concrete NounSnd of Noun = CatSnd ** open ResSnd, Prelude in {
flags optimize=all_subs ;
lin
DetCN det cn = {
s = \\c => detcn2NP det cn c det.n ;
a = agrP3 cn.g det.n ;
isPron = False
} ;
UsePN pn = {s = \\c => toNP pn.s c ; a = agrP3 pn.g Sg ; isPron = False} ;
UsePron p = {s = \\c => np2pronCase p.s c p.a ; a = p.a ; isPron = True} ;
PredetNP pred np = {
s = \\c => pred.s ++ np.s ! c ;
a = np.a;
isPron = np.isPron
} ;
PPartNP np v2 = {
s = \\c => v2.s ! VF Perf (fromAgr np.a).p (fromAgr np.a).n (fromAgr np.a).g ++ np.s ! c ;
a = np.a ;
isPron = np.isPron
} ;
RelNP np rs = {
s = \\c => np.s ! c ++ rs.s ! np.a ;
a = np.a ;
isPron = np.isPron
} ;
AdvNP np adv = {
s = \\c => np.s ! c ++ adv.s ! (fromAgr np.a).g ;
a = np.a ;
isPron = np.isPron
} ;
DetQuantOrd quant num ord = {
-- s = \\ c => detquant2det quant.s num.s c ++ ord.s ;
s = \\n,g => quant.s!n!g!Dir ++ num.s ++ ord.s;
n = num.n
} ;
DetQuant quant num = {
-- s = \\c => detquant2det quant.s num.s c;
s = \\n,g => quant.s!n!g!Dir ++ num.s;
n = num.n
} ;
DetNP det = {
s = \\c => det2NP det c ; ---- case
a = agrP3 Masc Sg ;
isPron = False
} ;
PossPron p = {s = \\_,_,_ => p.ps ; a = p.a} ;
NumSg = {s = []; n = Sg} ;
NumPl = {s = []; n = Pl} ;
NumCard n = n ** {hasCard = True} ;
NumDigits n = {s = n.s ! NCard ; n = n.n} ;
OrdDigits n = {s = n.s ! NOrd; n = n.n} ;
NumNumeral numeral = {s = numeral.s ! NCard; n = numeral.n} ;
OrdNumeral numeral = {s = numeral.s ! NOrd ; n = numeral.n} ;
AdNum adn num = {s = adn.s ++ num.s ; n = num.n} ;
OrdSuperl a = {s = a.s ! Sg ! Masc ! Dir ; n = Sg} ;
DetArtSg art cn = {
s = \\c => art.s ++ toNP (cn.s ! Sg) c ;
a = agrP3 cn.g Sg
} ;
DetArtPl art cn = {
s = \\c => art.s ++ toNP (cn.s ! Pl) c ;
a = agrP3 cn.g Pl
} ;
DefArt = {s = \\_,_,_ => [] ; a = defaultAgr} ;
IndefArt = {s = \\_,_,_ => [] ; a =defaultAgr } ;
MassNP cn = {s = \\c => toNP (cn.s ! Sg) c ; a = agrP3 cn.g Sg ; isPron = False} ;
UseN n = n ;
UseN2 n = { s = n.s ; g = n.g };
Use2N3 f = {
s = f.s;
g = f.g ;
c2 = f.c2;
c3 = f.c3
} ;
Use3N3 f = {
s = f.s ;
g = f.g ;
c2 = f.c2;
c3 = f.c3
} ;
ComplN2 f x = {s = \\n,c => case c of {
Dir => x.s ! NPC c ++ f.c2 ++ f.s ! n ! c ;
Obl => x.s ! NPC c ++ f.c3 ++ f.s ! n ! c ;
Abl => x.s ! NPC c ++ f.c3 ++ f.s ! n ! c ;
ResSnd.Voc => x.s ! NPC c ++ f.c3 ++ f.s ! n ! c
};
g = f.g;
};
ComplN3 f x = {
s = \\n,c => x.s ! NPObj ++ f.c4 ++ f.s ! n ! Dir ;
g = f.g ;
c2 = f.c2;
c3 = f.c3
} ;
AdjCN ap cn = {
s = \\n,c => ap.s ! n ! cn.g ! c ++ cn.s ! n ! c ;
g = cn.g
} ;
RelCN cn rs = {
s = \\n,c => cn.s ! n ! c ++ rs.s ! agrP3 cn.g n ;
g = cn.g
} ;
AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s ! cn.g ; g = cn.g} ;
SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s ; g = cn.g} ;
ApposCN cn np = {s = \\n,c => cn.s ! n ! Dir ++ np.s ! NPC c ; g = cn.g} ;
}

View File

@@ -0,0 +1,126 @@
concrete NumeralSnd of Numeral = CatSnd ** open ResSnd, Prelude in {
-- By Harald Hammarstroem
-- Modification for Punjabi by Shafqat Virk
flags coding=utf8 ;
param DForm = unit | ten ;
param DSize = sg | r2 | r3 | r4 | r5 | r6 | r7 | r8 | r9 ;
param Size = singl | less100 | more100 ;
oper LinDigit = {s : DForm => Str ; size : DSize ; n : Number} ;
lincat Dig = { s:Str ; n : Number};
lincat Digit = LinDigit ;
lincat Sub10 = {s : DForm => Str ; size : DSize ; n : Number} ;
lincat Sub100 = {s : Str ; size : Size ; n : Number} ;
lincat Sub1000 = {s : Str ; s2 : Str ; size : Size ; n : Number } ;
lincat Sub1000000 = { s : Str ; n : Number } ;
lin num x0 =
{s = table {
NCard => x0.s ;
NOrd => Prelude.glue x0.s "ون" -- (mkOrd x0.s) need to use mkOrd which will make irregular ordinals but it gives path error
};
n = x0.n
} ;
oper mkOrd : Str -> Str =
\s -> case s of {
"ھڪ" => "پھریون";
"ٻ" => "ٻیون";
"ٽی" => "ٽیون";
"چار" => "چواٿون";
_ => s ++ "وN"
};
-- {s = \\_ => x0.s ; n = x0.n} ;
oper mkNum : Str -> Str -> DSize -> LinDigit =
\do -> \bis -> \sz ->
{s = table {unit => do ; ten => bis } ;
size = sz ; n = Pl} ;
lin n2 = mkNum "ٻ" "ویھ" r2 ;
lin n3 = mkNum "ٽی" "ٽیھ" r3 ;
lin n4 = mkNum "چار" "چاھ" r4 ;
lin n5 = mkNum "پنج" "پنجاھ" r5 ;
lin n6 = mkNum "ڇھ" "سٺھ " r6 ;
lin n7 = mkNum "ست" "ستر" r7;
lin n8 = mkNum "اٺ '" "اسی" r8;
lin n9 = mkNum "نو" "نوی" r9 ;
oper mkR : Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> DSize => Str = \a1 -> \a2 -> \a3 -> \a4 -> \a5 -> \a6 -> \a7 -> \a8 -> \a9 -> table {
sg => a1 + "نھن" ;
r2 => a2 + "یھ " ;
r3 => a3 + "یھ " ;
r4 => a4 + "اھ " ;
r5 => a5 + "ونجاھ " ;
r6 => a6 + "ھٺ" ;
r7 => a7 + "تر" ;
r8 => a8 + "اسی" ;
r9 => a9 + "انوی"
} ;
oper rows : DSize => DSize => Str = table {
sg => mkR "یار " "ایڪ " "اڪٽ" "ایڪیت " "ایڪ" "ایڪ" "ایڪ" "ایڪ" "ایڪ" ;
r2 => mkR "ٻای " "ٻاو" "ٻٽ" "ٻا۶ت" "ٻا" "ٻا" "ٻاھ " "ٻیی" "ٻیی" ;
r3 => mkR "ٽیر " "ٽیو " "ٽیٽ" "ٽیت" "ٽی" "ٽی" "ٽیھ " "ٽی" "تی" ;
r4 => mkR "چوڏ " "چوو " "چوٽ" "چو۶ت " "چو" "چو" "چوھ " "چور " "چور" ;
r5 => mkR "پنڌر " "پنجو " "پنجٽ" "پنجیت" "پنج" "پنج" "پنجھ" "پنج" "پنج" ;
r6 => mkR "سور " "ڇو" "ڇٽی" "ڇا۶ت" "ڇا" "ڇا" "ڇاھ" "ڇ" "ڇ" ;
r7 => mkR "ستر" "ستاو" "ستٽ " "ستیت" "ست" "ست" "ست" "ست" "ست" ;
r8 => mkR "ارڙ" "اٺاو " "اٺٽ" "اٺی" "اٺ" "اٺ" "اٺا" "اٺ" "اٺ" ;
r9 => table {sg => "اڻویھ " ; r2 => "اڻٽیھ " ; r3 => "اڻیتاھ " ;
r4 => "اڻونجاھ " ; r5 => "اڻھٺ " ; r6 => "اڻتر " ;
r7 => "اڻاسی " ;
r8 => "اڻانوی " ; r9 => "نوانوی" }
} ;
oper ss : Str -> {s : Str} = \s -> {s = s} ;
lin pot01 = {s = table {unit => "ھڪ" ; _ => "دمی" } ; size = sg ; n = Sg} ;
lin pot0 d = d ;
lin pot110 = {s = "ڏھ " ; size = less100 ; n = Pl} ;
lin pot111 = {s = rows ! sg ! sg ; size = less100 ; n = Pl} ;
lin pot1to19 d = {s = rows ! d.size ! sg ; size = less100 ; n = d.n} ;
lin pot0as1 n = {s = n.s ! unit ; size = table {sg => singl ; _ => less100} ! n.size ; n = n.n } ;
lin pot1 d = {s = d.s ! ten ; size = less100 ; n = d.n} ;
lin pot1plus d e = {s = rows ! e.size ! d.size ; size = less100 ; n = d.n} ;
lin pot1as2 n = {s = n.s ; s2 = "دمی" ; size = n.size ; n = n.n} ;
lin pot2 d = {s = (mksau (d.s ! unit) d.size) ;
s2 = d.s ! unit ++ "lک " ; size = more100 ; n = d.n} ;
lin pot2plus d e =
{s = (mksau (d.s ! unit) d.size) ++ e.s ;
s2 = (d.s ! unit) ++ "lک " ++ (mkhazar e.s e.size) ;
size = more100 ; n = d.n} ;
lin pot2as3 n = {s = n.s ; n = n.n} ;
lin pot3 n = {s = table { singl => ekhazar ;
less100 => n.s ++ "ھزار" ;
more100 => n.s2 } ! n.size ; n = n.n} ;
lin pot3plus n m =
{s = table {singl => ekhazar ;
less100 => n.s ++ "ھزار" ;
more100 => n.s2 } ! n.size ++ m.s ; n = n.n} ;
lin D_0 = { s = "۰" ; n = Sg};
lin D_1 = { s = "۱" ; n = Sg};
lin D_2 = { s = "۲" ; n = Pl};
lin D_3 = { s = "۳" ; n = Pl};
lin D_4 = { s = "۴" ; n = Pl};
lin D_5 = { s = "۵" ; n = Pl};
lin D_6 = { s = "۶" ; n = Pl};
lin D_7 = { s = "۷" ; n = Pl};
lin D_8 = { s = "۸" ; n = Pl};
lin D_9 = { s = "۹" ; n = Pl};
lin IDig d = { s = \\_ => d.s ; n = d.n} ;
lin IIDig d dg = { s = \\df => Prelude.glue (dg.s ! df) d.s ; n = Pl };
oper ekhazar : Str = variants {"ھزار" ; "ھڪ" ++ "ھزار"} ;
oper mkhazar : Str -> Size -> Str = \s -> \sz -> table {singl => ekhazar ; _ => s ++ "ھزار"} ! sz ;
oper mksau : Str -> DSize -> Str = \s -> \sz -> table {sg => "ھڪ" ++ "سو" ; _ => s ++ "سو"} ! sz ;
}

View File

@@ -0,0 +1,181 @@
--# -path=.:../abstract:../../prelude:../common
--
----1 Sndu Lexical Paradigms
resource ParadigmsSnd = open
Predef,
Prelude,
MorphoSnd,
CatSnd
in {
--2 Parameters
oper
masculine : Gender ;
feminine : Gender ;
singular : Number;
plural : Number;
singular = Sg ; plural = Pl;
masculine = Masc ; feminine = Fem ; --i
--2 Nouns
mkN2 : N -> Prep -> Str -> N2;
mkN2 = \n,p,c -> n ** {lock_N2 = <> ; c2 = p.s ; c3 = c } ;
mkN3 : N -> Prep -> Str -> Str-> N3 ;
mkN3 = \n,p,q,r -> n ** {lock_N3 = <> ; c2 = p.s ; c3 = q ; c4 = r} ;
-- Compound Nouns
mkCmpdNoun : Str -> N -> N
= \s,noun -> {s =\\n,c => s ++ noun.s ! n ! c ; g = noun.g ; lock_N = <>};
-- Proper names
mkPN = overload {
mkPN : Str -> PN =
\s -> let n = mkN11 s in {s = n.s ! Sg ; g = n.g ; lock_PN = <>} ;
mkPN : Str -> Gender -> PN =
\s,g -> let n = mkN11 s in {s = n.s ! Sg ; g = g ; lock_PN = <>} ;
};
-- Personal Pronouns
personalPN : Str -> Str -> Str -> Str -> Str -> Number -> Gender -> PPerson -> Pron =
\s1,s2,s3,s4,sp,nn,g,p -> let n = mkPron s1 s2 s3 s4 in {s = n.s ; a = toAgr nn p g ; ps = sp ; lock_Pron = <>};
-- Demonstration Pronouns
demoPN : Str -> Str -> Str -> Quant =
\s1,s2,s3 -> let n = makeDemonPronForm s1 s2 s3 in {s = n.s ; a = defaultAgr ; lock_Quant = <>};
-- Determiner
mkDet : Str -> Str -> Str -> Str -> Number -> Det =
\s1,s2,s3,s4,nb -> let dt = makeDet s1 s2 s3 s4 nb in {s = dt.s ; n = nb ; lock_Det = <>};
-- Intergative pronouns
mkIP : (x1,x2,x3,x4:Str) -> Number -> Gender -> IP =
\s1,s2,s3,s4,n,g -> let p = mkIntPronForm s1 s2 s3 s4 in { s = p.s ; n = n ; g = g ; lock_IP = <>};
-- AdN
mkAdN : Str -> AdN = \s -> ss s ;
--2 Adjectives
mkA = overload {
mkA : Str-> A
= \s -> mkAdj1 s ** {lock_A = <>} ;
mkA : Str -> Str -> A2
= \a,c -> let n = mkAdj1 a in {s = n.s; c2 = c} ** {lock_A2 = <>} ;
} ;
--2 Verbs
mkV : Str -> V
= \s -> mkVerb s ** {lock_V = <>} ;
mkV2 = overload {
mkV2 : Str -> V2
= \s -> mkVerb s ** {c2 = {s = [] ; c = VTrans} ; lock_V2 = <>} ;
mkV2 : V -> V2
= \v -> v ** {c2 = {s = [] ; c = VTrans} ; lock_V2 = <>} ;
mkV2 : V -> Str -> V2
= \v,p -> v ** {c2 = {s = p ; c = VTrans} ; lock_V2 = <>} ;
} ;
mkV3 : V -> Str -> Str -> V3;
mkV3 v p q = v ** { c2 = p ; c3 = q ; lock_V3 = <>} ;
mkV2V : V -> Str -> Str -> Bool -> V2V ;
mkV2V v s1 s2 b = v ** {isAux = b ; c1 = s1 ; c2 = s2 ; lock_V2V = <>} ;
-- compund verbs
compoundV = overload {
compoundV : Str -> V -> V = \s,v -> {s = \\vf => s ++ v.s ! vf ; lock_V = <>} ;
compoundV : Str -> V2 -> V = \s,v -> {s = \\vf => s ++ v.s ! vf ; lock_V = <>} ;
};
----2 Adverbs
mkAdv : Str -> Adv = \str -> {s =\\ _ => str ; lock_Adv = <>};
----2 Prepositions
mkPrep : Str -> Prep ;
mkPrep str = makePrep str ** {lock_Prep = <>};
--3 Determiners and quantifiers
-- mkQuant : overload {
mkQuant1 : Pron -> Quant ;
-- mkQuant : (no_sg, no_pl, none_sg, non_pl : Str) -> Quant ;
-- } ;
mkIQuant : Str -> Str -> Str -> Str -> IQuant ;
mkIQuant s1 s2 s3 s4 = let n = makeIQuant s1 s2 s3 s4 in {s = n.s; lock_IQuant = <>} ;
-- mkQuant = overload {
mkQuant1 : Pron -> Quant = \p -> {s = \\_,_,c => p.s!c ;a = p.a ; lock_Quant = <>};
-- mkQuant : (no_sg, no_pl, none_sg, non_pl : Str) -> Quant = mkQuantifier;
-- } ;
--2 Conjunctions
mkConj : overload {
mkConj : Str -> Conj ; -- and (plural agreement)
mkConj : Str -> Number -> Conj ; -- or (agrement number given as argument)
mkConj : Str -> Str -> Conj ; -- both ... and (plural)
mkConj : Str -> Str -> Number -> Conj ; -- either ... or (agrement number given as argument)
} ;
mkConj = overload {
mkConj : Str -> Conj = \y -> mk2Conj [] y plural ;
mkConj : Str -> Number -> Conj = \y,n -> mk2Conj [] y n ;
mkConj : Str -> Str -> Conj = \x,y -> mk2Conj x y plural ;
mkConj : Str -> Str -> Number -> Conj = mk2Conj ;
} ;
mk2Conj : Str -> Str -> Number -> Conj = \x,y,n ->
lin Conj (sd2 x y ** {n = n}) ;
-- mkV0 : V -> V0 ;
-- mkVS : V -> VS ;
-- mkV2S : V -> Prep -> V2S ;
mkVV : V -> VV = \v -> lin VV (v ** {isAux = False});
-- mkV2V : V -> Prep -> Prep -> V2V ;
-- mkVA : V -> VA ;
-- mkV2A : V -> Prep -> V2A ;
-- mkVQ : V -> VQ ;
-- mkV2Q : V -> Prep -> V2Q ;
--
-- mkAS : A -> AS ;
-- mkA2S : A -> Prep -> A2S ;
-- mkAV : A -> AV ;
-- mkA2V : A -> Prep -> A2V ;
-- mkA2V a p = a ** {c2 = p.s } ;
--
---- Notice: Categories $V0, AS, A2S, AV, A2V$ are just $A$.
---- $V0$ is just $V$; the second argument is treated as adverb.
--
-- V0 : Type ;
-- AS, A2S, AV, A2V : Type ;
--
----.
----2 Definitions of paradigms
----
---- The definitions should not bother the user of the API. So they are
---- hidden from the document.
--
-- Gender = MorphoHin.Gender ;
-- Number = MorphoHin.Number ;
-- Case = MorphoHin.Case ;
-- human = Masc ;
-- nonhuman = Neutr ;
-- masculine = Masc ;
-- feminine = Fem ;
-- singular = Sg ;
-- plural = Pl ;
-- nominative = Nom ;
-- genitive = Gen ;
}

View File

@@ -0,0 +1,27 @@
concrete PhraseSnd of Phrase = CatSnd ** open Prelude, ResSnd 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 ! Dir} ; --- Acc also
UttIAdv iadv = iadv ;
UttNP np = {s = np.s ! NPC Dir} ;
UttVP vp = {s = infVP False vp (agrP3 Masc Sg) ++ vp.embComp} ;
UttAdv adv = {s = adv.s ! Masc } ;
UttCN cn = {s = cn.s ! Sg ! Dir};
UttCard n = n ;
UttAP ap = {s = ap.s ! Sg ! Masc ! Dir} ;
NoPConj = {s = []} ;
PConjConj conj = {s = conj.s2} ; ---
NoVoc = {s = []} ;
VocNP np = {s = np.s ! NPC Voc} ;
}

View File

@@ -0,0 +1,75 @@
concrete QuestionSnd of Question = CatSnd ** open ResSnd, Prelude in {
flags optimize=all_subs ;
coding = utf8;
lin
QuestCl cl = {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! OQuest;
QIndir => "جیڪڏھن" ++ cl.s ! t! p ! ODir
}
};
QuestVP qp vp =
let cl = mkSClause ("") (Ag qp.g qp.n Pers3_Near) vp;
qp1 = qp.s ! Dir;
qp2 = qp.s ! Obl ++ "جی"
in { s = \\t,p,o => case t of {
VPImpPast => case vp.subj of {VIntrans => qp1 ++ cl.s ! t ! p ! ODir; _ => qp2 ++ cl.s ! t ! p ! ODir};
_ => qp1 ++ cl.s ! t ! p ! ODir
}
};
QuestSlash ip slash =
let ip1 = ip.s ! Dir;
ip2 = ip.s ! Obl ++ "جی"
in {
s = \\t,p,o => case t of {
VPImpPast => ip2 ++ slash.s ! t ! p ! ODir;
_ => ip1 ++ slash.s ! t ! p ! ODir
}
};
QuestIAdv iadv cl = {
s = \\t,p,_ => iadv.s ++ cl.s ! t ! p ! ODir;
};
QuestIComp icomp np =
let cl = mkSClause (np.s ! NPC Dir ++ icomp.s) np.a (predAux auxBe);
in {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! ODir;
QIndir => cl.s ! t! p ! ODir
}
};
PrepIP p ip = {s = ip.s ! ResSnd. Voc ++ p.s } ;
AdvIP ip adv = {
s = \\c => adv.s ! ip.g ++ ip.s ! c ;
n = ip.n;
g = ip.g;
} ;
IdetCN idet cn = {
s = \\c => idet.s ! cn.g ++ cn.s ! idet.n ! c ;
g = cn.g;
n = idet.n;
} ;
IdetIP idet = {
s = \\_ => idet.s ! Masc ;
n = idet.n;
g = Masc;
} ;
IdetQuant iqant num = {
s = \\g => iqant.s ! num.n ! g ++ num.s ;
n = num.n
} ;
CompIAdv a = a ;
CompIP p = ss (p.s ! Dir) ;
AdvIAdv i a = {s = i.s ++ a.s ! Masc} ;
}

View File

@@ -0,0 +1,90 @@
concrete RelativeSnd of Relative = CatSnd ** open ResSnd in {
flags optimize=all_subs ;
coding = utf8;
lin
RelCl cl = {
s = \\t,p,o,agr => case <t,giveNumber agr,giveGender agr> of {
<VPImpPast,Sg,_> => "جھنکی" ++ cl.s ! t ! p ! o ;
<VPImpPast,Pl,_> => "جھنجو" ++ cl.s ! t ! p ! o ;
<_,Sg,Masc> => "جیھڙو" ++ cl.s ! t ! p ! o ;
<_,Sg,Fem> => "جیھڙا" ++ cl.s ! t ! p ! o ;
<_,Pl,Masc> => "جیھڙا" ++ cl.s ! t ! p ! o ;
<_,Pl,Fem> => "جیھڙیون" ++ cl.s ! t ! p ! o
};
c = Dir
} ;
-- RelVP and RelSlash slows the linking process a lot this is why it is commented for test purposes
RelVP rp vp = {
s = \\t,p,o,ag =>
let
agr = case rp.a of {
RNoAg => ag ;
RAg a => a
} ;
cl = mkSClause (rp.s ! (giveNumber agr) ! (giveGender agr) ! Dir) agr vp;
-- cl = case t of {
-- VPImpPast => mkSClause (rp.s ! (giveNumber agr) ! Obl) agr vp;
-- _ => mkSClause (rp.s ! (giveNumber agr) ! Dir) agr vp
-- };
in
cl.s ! t ! p ! ODir ;
c = Dir
} ;
---- Pied piping: "ات whiچh wع ارع looڪiنگ". Stranding and empty
---- relative are defined in $ExtraHin.gf$ ("تhات wع ارع looڪiنگ ات",
---- "wع ارع looڪiنگ ات").
--
RelSlash rp slash = {
s = \\t,p,o,agr => rp.s ! (giveNumber agr) ! (giveGender agr) ! Obl ++ slash.c2.s ++ slash.s ! t ! p ! o ;
c = Dir
} ;
FunRP p np rp = {
s = \\n,g,c => rp.s ! n ! g ! c ++ np.s ! NPC c ++ p.s ;
a = RAg np.a
} ;
IdRP = {
s = table {
Sg => table {
Masc => table {
ResSnd.Dir => "جھڙا" ;
ResSnd.Obl => "جنھن" ;
ResSnd.Voc => "جھڙی" ;
ResSnd.Abl => "جھڙی"
};
Fem => table {
ResSnd.Dir => "جھڙی" ;
ResSnd.Obl => "جنھن" ;
ResSnd.Voc => "جھڙی" ;
ResSnd.Abl => "جھڙی"
}
};
Pl => table {
Masc => table {
ResSnd.Dir => "جھڙی" ;
ResSnd.Obl => "جھڙی" ;
ResSnd.Voc => "جھڙی" ;
ResSnd.Abl => "جھڙی"
};
Fem => table {
ResSnd.Dir => "جھڙی" ;
ResSnd.Obl => "جھڙی" ;
ResSnd.Voc => "جھڙی" ;
ResSnd.Abl => "جھڙی"
}
}
};
a = RNoAg
} ;
}

673
lib/src/sindhi/ResSnd.gf Normal file
View File

@@ -0,0 +1,673 @@
--# -path=.:../abstract:../common:../../prelude
--
--1 Sndu auxiliary operations.
--
-- This module contains operations that are needed to make the
-- resource syntax work.
resource ResSnd = ParamX ** open Prelude,Predef in {
flags optimize=all ;
coding = utf8;
param
Case = Dir | Obl | Voc | Abl ;
Gender = Masc | Fem ;
VTense = Subj | Perf | Imperf;
PPerson = Pers1
| Pers2_Casual
| Pers2_Respect
| Pers3_Near
| Pers3_Distant;
Order = ODir | OQuest ;
--2 For $Relative$
RAgr = RNoAg | RAg Agr ;
RCase = RC Number Case ;
-- for Numerial
CardOrd = NCard | NOrd ;
VerbForm4 =
VF VTense PPerson Number Gender
| Inf | Inf_Fem | Inf_Obl | Ablative
| Root ;
oper
Noun = {s : Number => Case => Str ; g : Gender} ;
Verb = {s : VerbForm4 => Str} ;
Preposition = {s : Str};
DemPronForm = {s : Number => Gender => Case => Str};
-- PossPronForm = {s : Number => Gender => Case => Str};
Determiner = {s : Number => Gender => Str ; n : Number};
-----------------------------------------------
-- Snd Adjectives
-----------------------------------------------
Adjective1 = {s : Number => Gender => Case => Str} ;
mkAdj1 : Str -> Adjective1 ;
mkAdj1 nyrw = let end = last (nyrw) ;
--nyr = if_then_else Str (eq end "ی") nyrw (tk 1 nyrw)
nyr = (tk 1 nyrw)
in adj1 (nyrw) (nyr+"ی") ( nyr+"ا") (nyr+"ا") (nyrw) (nyr+"ی") (nyr+"ی") (nyr+"ی")
(nyr+"ا") (nyr+"ن") ( nyr+"ا") (nyr+"ا") (nyr+"یون") (nyr+"ین") (nyr+"ین") (nyr+"یون") ;
adj1 :(x1,_,_,_,_,_,_, _,_,_,_,_,_,_,_, x16 : Str) -> {s : Number => Gender => Case => Str} =
\msd,mso,msv,msa, fsd,fso,fsv,fsa, mpd,mpo,mpv,mpa, fpd,fpo,fpv,fpa -> {
s = table {
Sg => (cmnAdj msd mso msv msa fsd fso fsv fsa).s ;
Pl => (cmnAdj mpd mpo mpv mpa fpd fpo fpv fpa).s
}
};
mkAdj2 : Str -> Adjective1 ;
mkAdj2 young = adj1 (young) (young) (young ) (young) (young) (young) (young) (young)
(young) (young) (young ) (young) (young+"ین") (young+"ین") (young+"ین") (young+"ین") ;
mkAdj3 : Str -> Adjective1 ;
mkAdj3 acank = adj1 acank acank acank acank acank acank acank acank acank acank acank acank acank acank acank acank ;
cmnAdj : (x1,_,_,_,_,_,_,x8 : Str) -> {s : Gender => Case => Str} =
\sd,so,sv,sa, pd,po,pv,pa -> {
s = table {
Masc => table {
Dir => sd ;
Obl => so ;
Voc => sv ;
Abl => sa
} ;
Fem => table {
Dir => pd ;
Obl => po ;
Voc => pv ;
Abl => pa
}
}
} ;
RefPron : Str;
RefPron = "پاڻ";
----------------------------------------------------------
-- Grammar part
----------------------------------------------------------
param
Agr = Ag Gender Number PPerson ;
NPCase = NPC Case | NPObj | NPErg ;
oper
np2pronCase : (Case => Str) -> NPCase -> Agr -> Str = \ppf,npc,a -> case npc of {
NPC c => ppf ! c;
NPObj => ppf ! Obl ;
NPErg => case (fromAgr a).p of {
(Pers3_Near|Pers3_Distant) => ppf ! Dir ++ "جی" ;
_ => ppf ! Dir
}
} ;
toNP : ( Case => Str) -> NPCase -> Str = \pn, npc -> case npc of {
NPC c => pn ! c ;
NPObj => pn ! Dir ;
NPErg => pn ! Obl
} ;
detcn2NP : (Determiner) -> Noun -> NPCase -> Number -> Str = \dt,cn,npc,nn -> case npc of {
NPC c => dt.s ! Sg ! Masc ++ cn.s ! nn ! c ;
NPObj => dt.s ! Sg ! Masc ++ cn.s ! nn ! Dir ;
NPErg => dt.s ! Sg ! Masc ++ cn.s ! nn ! Obl
} ;
det2NP : (Determiner) -> NPCase -> Str = \dt,npc -> case npc of {
NPC c => dt.s ! Sg ! Masc ;
NPObj => dt.s ! Sg ! Masc ;
NPErg => dt.s ! Sg ! Masc
} ;
oper
------------------------------------------
-- Agreement transformations
-----------------------------------------
toAgr : Number -> PPerson -> Gender -> Agr = \n,p,g ->
Ag g n p;
fromAgr : Agr -> {n : Number ; p : PPerson ; g : Gender} = \a -> case a of {
Ag g n p => {n = n ; p = p ; g = g}
} ;
conjAgr : Agr -> Agr -> Agr = \a0,b0 ->
let a = fromAgr a0 ; b = fromAgr b0
in
toAgr
(conjNumber a.n b.n)
b.p a.g;
giveNumber : Agr -> Number =\a -> case a of {
Ag _ n _ => n
};
giveGender : Agr -> Gender =\a -> case a of {
Ag g _ _ => g
};
defaultAgr : Agr = agrP3 Masc Sg ;
agrP3 : Gender -> Number -> Agr = \g,n -> Ag g n Pers3_Distant ;
personalAgr : Agr = agrP1 Masc Sg ;
agrP1 : Gender -> Number -> Agr = \g,n -> Ag g n Pers1 ;
param
CPolarity =
CPos
| CNeg Bool ; -- contracted or not
oper
contrNeg : Bool -> Polarity -> CPolarity = \b,p -> case p of {
Pos => CPos ;
Neg => CNeg b
} ;
NP : Type = {s : NPCase => Str ; a : Agr ; isPron : Bool} ;
param
CTense = CPresent | CPast | CFuture | CContinuous;
oper
copula : CTense -> Number -> PPerson -> Gender -> Str = \t,n,p,g ->
case <t,n,p,g> of {
<CPresent,Sg,Pers1,Masc > => "ٿو";
<CPresent,Sg,Pers1,Fem > => "ٿی" ;
<CPresent,Sg,Pers2_Casual,Masc > => "ٿو" ;
<CPresent,Sg,Pers2_Casual,Fem > => "ٿی" ;
<CPresent,Sg,Pers2_Respect,Masc > => "ٿا" ;
<CPresent,Sg,Pers2_Respect,Fem > => "ٿیون" ;
<CPresent,Sg,Pers3_Near,Masc > => "ٿو" ;
<CPresent,Sg,Pers3_Near,Fem > => "ٿی" ;
<CPresent,Sg,Pers3_Distant,Masc > => "ٿو" ;
<CPresent,Sg,Pers3_Distant,Fem > => "ٿی" ;
<CPresent,Pl,Pers1,Masc > => "ٿا" ;
<CPresent,Pl,Pers1,Fem > => "ٿیون" ;
<CPresent,Pl,Pers2_Casual,Masc > => "ٿا" ;
<CPresent,Pl,Pers2_Casual,Fem > => "ٿی" ;
<CPresent,Pl,Pers2_Respect,Masc > => "ٿا" ;
<CPresent,Pl,Pers2_Respect,Fem > => "ٿیون" ;
<CPresent,Pl,Pers3_Near,Masc > => "ٿا" ;
<CPresent,Pl,Pers3_Near,Fem > => "ٿیون" ;
<CPresent,Pl,Pers3_Distant,Masc > => "ٿا" ;
<CPresent,Pl,Pers3_Distant,Fem > => "ٿیون" ;
<CPast,Sg,Pers1,Masc > => "ھیم" ;
<CPast,Sg,Pers1,Fem > => "ھیم" ;
<CPast,Sg,Pers2_Casual,Masc > => "ھ۶ین" ;
<CPast,Sg,Pers2_Casual,Fem > => "ھ۶ین" ;
<CPast,Sg,Pers2_Respect,Masc > => "ھ۶و" ;
<CPast,Sg,Pers2_Respect,Fem > => "ھ۶یون" ;
<CPast,Sg,Pers3_Near,_ > => "اھی" ;
-- <CPast,Sg,Pers3_Near,Fem > => "اھ۶" ;
<CPast,Sg,Pers3_Distant,Masc > => "ھیو" ;
<CPast,Sg,Pers3_Distant,Fem > => "ھ۶ی" ;
<CPast,Pl,Pers1,Masc > => "ھ۶اسین" ;
<CPast,Pl,Pers1,Fem > => "ھیوسین" ;
<CPast,Pl,Pers2_Casual,_ > => "ھ۶ا" ;
<CPast,Pl,Pers2_Respect,_ > => "ھیو" ;
<CPast,Pl,Pers3_Near,Masc > => "ھ۶ا" ;
<CPast,Pl,Pers3_Near,Fem > => "ھ۶یون" ;
<CPast,Pl,Pers3_Distant,Masc > => "ھ۶ا" ;
<CPast,Pl,Pers3_Distant,Fem > => "ھیون" ;
<CFuture,Sg,Pers1,Masc > => "ھوندس" ;
<CFuture,Sg,Pers1,Fem > => "ھوندس" ;
<CFuture,Sg,Pers2_Casual,Masc > => "ھوندین" ;
<CFuture,Sg,Pers2_Casual,Fem > => "ھوندین" ;
<CFuture,Sg,Pers2_Respect,Masc > => "ھوندو۶ " ;
<CFuture,Sg,Pers2_Respect,Fem > => "ھوندو۶ " ;
<CFuture,Sg,Pers3_Near,Masc > => "ھوندو " ;
<CFuture,Sg,Pers3_Near,Fem > => "ھوندی" ;
<CFuture,Sg,Pers3_Distant,Masc > => "ھوندو " ;
<CFuture,Sg,Pers3_Distant,Fem > => "ھوندی" ;
<CFuture,Pl,Pers1,Masc > => "ھونداسین" ;
<CFuture,Pl,Pers1,Fem > => "ھوندیونسین" ;
<CFuture,Pl,Pers2_Casual,Masc > => "ھوندو۶ " ;
<CFuture,Pl,Pers2_Casual,Fem > => "ھوندیوین" ;
<CFuture,Pl,Pers2_Respect,Masc > => "ھوندو۶ " ;
<CFuture,Pl,Pers2_Respect,Fem > => "ھوندیوین" ;
<CFuture,Pl,Pers3_Near,Masc > => "ھوندا" ;
<CFuture,Pl,Pers3_Near,Fem > => "ھوندیون" ;
<CFuture,Pl,Pers3_Distant,Masc > => "ھوندا" ;
<CFuture,Pl,Pers3_Distant,Fem > => "ھوندیون" ;
<CContinuous,Sg,Pers1,Masc > => "اھیان" ;
<CContinuous,Sg,Pers1,Fem > => "اھیان" ;
<CContinuous,Sg,Pers2_Casual,Masc > => "اھین" ;
<CContinuous,Sg,Pers2_Casual,Fem > => "اھین" ;
<CContinuous,Sg,Pers2_Respect,Masc > => "اھیو " ;
<CContinuous,Sg,Pers2_Respect,Fem > => "اھیو " ;
<CContinuous,Sg,Pers3_Near,Masc > => "اھی " ;
<CContinuous,Sg,Pers3_Near,Fem > => "اھی" ;
<CContinuous,Sg,Pers3_Distant,Masc > => "اھی " ;
<CContinuous,Sg,Pers3_Distant,Fem > => "اھی" ;
<CContinuous,Pl,Pers1,Masc > => "اھیون" ;
<CContinuous,Pl,Pers1,Fem > => "اھیون" ;
<CContinuous,Pl,Pers2_Casual,Masc > => "اھیو " ;
<CContinuous,Pl,Pers2_Casual,Fem > => "اھیو " ;
<CContinuous,Pl,Pers2_Respect,Masc > => "اھیو " ;
<CContinuous,Pl,Pers2_Respect,Fem > => "اھیو " ;
<CContinuous,Pl,Pers3_Near,Masc > => "اھن" ;
<CContinuous,Pl,Pers3_Near,Fem > => "اھن" ;
<CContinuous,Pl,Pers3_Distant,Masc > => "اھن" ;
<CContinuous,Pl,Pers3_Distant,Fem > => "اھن"
} ;
param
VPPTense =
VPPres
|VPPast
|VPFutr
|VPPerf;
VPHTense =
VPGenPres -- impf hum nahim "I گo"
| VPImpPast -- impf Ta nahim "I wعنت"
| VPFut -- fut na/nahim "I سhاll گo"
| VPContPres -- stem raha hum nahim "I ام گoiنگ"
| VPContPast -- stem raha Ta nahim "I wاس گoiنگ"
| VPContFut
| VPPerfPres -- perf hum na/nahim "I hاvع گoنع"
| VPPerfPast -- perf Ta na/nahim "I hاد گoنع"
| VPPerfFut
| VPPerfPresCont
| VPPerfPastCont
| VPPerfFutCont
| VPSubj -- subj na "I مای گo"
;
VPHForm =
VPTense VPPTense Agr -- 9 * 12
| VPReq
| VPImp
| VPReqFut
| VPInf
| VPStem
;
VType = VIntrans | VTrans | VTransPost ;
oper
objVType : VType -> NPCase = \vt -> case vt of {
VTrans => NPObj ;
_ => NPC Obl
} ;
VPH : Type = {
s : VPHForm => {fin, inf : Str} ;
obj : {s : Str ; a : Agr} ;
subj : VType ;
comp : Agr => Str;
inf : Str;
ad : Str;
embComp : Str ;
prog : Bool ;
} ;
VPHSlash = VPH ** {c2 : Compl} ;
oper
Compl : Type = {s : Str ; c : VType} ;
predV : Verb -> VPH = \verb -> {
s = \\vh =>
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CPresent n p g ; inf = verb.s ! VF Subj p n g } ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf =verb.s ! VF Perf p n g} ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = verb.s ! VF Imperf p n g } ;
VPTense VPPerf (Ag g n p) => { fin = [] ; inf = verb.s ! Root ++ cka g n } ;
VPStem => {fin = [] ; inf = verb.s ! Root};
VPInf => {fin = verb.s!Inf_Obl ; inf = verb.s ! Root};
VPImp => {fin = verb.s!VF Subj Pers3_Near Pl Masc ; inf = verb.s ! Root};
VPReq => {fin = [] ; inf = verb.s!VF Subj Pers1 Pl Masc};
_ => {fin = [] ; inf = verb.s ! Root}
};
obj = {s = [] ; a = defaultAgr} ;
subj = VIntrans ;
inf = verb.s ! Inf;
ad = [];
embComp = [];
prog = False ;
comp = \\_ => []
} ;
predVc : (Verb ** {c2,c1 : Str}) -> VPHSlash = \verb ->
predV verb ** {c2 = {s = verb.c1 ; c = VTrans} } ;
-------------------------
-- added for cauitives
predVcc : (Verb **{c2:Compl}) -> VPHSlash = \verb ->
predV verb ** {c2 = {s = "" ; c = VTrans} } ;
------------------------
raha : Gender -> Number -> Str = \g,n ->
(mkAdj1 "ریا").s ! n ! g ! Dir ;
rahanDa : Gender -> Number -> Str = \g,n ->
(mkAdj1 "رھندا").s ! n ! g ! Dir ;
pya : Gender -> Number -> Str = \g,n ->
(mkAdj1 "پیا").s ! n ! g ! Dir ;
cka : Gender -> Number -> Str = \g,n ->
(mkAdj1 "گیا").s ! n ! g ! Dir ;
hw : PPerson -> Number -> Str = \pp,n ->
case <pp,n> of {
<Pers1,_> => "hwwاN";
<Pers2_Casual,Sg> => "hwwیN";
<Pers2_Casual,Pl> => "hww";
<Pers2_Respect,_> => "hww";
<Pers3_Distant,Sg> => "hwwE";
<Pers3_Distant,Pl> => "hwن";
<Pers3_Near,Sg> => "hwwE";
<Pers3_Near,Pl> => "hwن"
};
predAux : Aux -> VPH = \verb -> {
s = \\vh =>
let
inf = verb.inf ;
part = verb.ppart ;
in
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CContinuous n p g ; inf = part } ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf = part } ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = part ++ hw p n } ;
VPStem => {fin = [] ; inf = "رh" };
_ => {fin = part ; inf = inf }
};
obj = {s = [] ; a = defaultAgr} ;
subj = VIntrans ;
inf = verb.inf;
ad = [];
embComp = [];
prog = False ;
comp = \\_ => []
} ;
Aux = {
inf,ppart,prpart : Str
} ;
auxBe : Aux = {
inf = "" ;
ppart = "" ;
prpart = ""
} ;
predProg : VPH -> VPH = \verb -> {
s = \\vh =>
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CPresent n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ pya g n} ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ pya g n} ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf } ;
VPTense VPPerf (Ag g n p) => {fin = copula CPast n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ raha g n } ;
VPStem => {fin = [] ; inf = (verb.s!VPStem).inf };
_ => {fin = [] ; inf = [] }
};
obj = verb.obj ;
subj = VIntrans ;
inf = verb.inf;
ad = verb.ad;
embComp = verb.embComp;
prog = True ;
comp = verb.comp
} ;
Clause : Type = {s : VPHTense => Polarity => Order => Str} ;
mkClause : NP -> VPH -> Clause = \np,vp -> {
s = \\vt,b,ord =>
let
subjagr : NPCase * Agr = case vt of {
VPImpPast => case vp.subj of {
VTrans => <NPErg, vp.obj.a> ;
VTransPost => <NPErg, defaultAgr> ;
_ => <NPC Dir, np.a>
} ;
_ => <NPC Dir, np.a>
} ;
subj = subjagr.p1 ;
agr = subjagr.p2 ;
n = (fromAgr agr).n;
p = (fromAgr agr).p;
g = (fromAgr agr).g;
vps = case vt of {
VPGenPres => vp.s ! VPTense VPPres agr ;
VPImpPast => vp.s ! VPTense VPPast agr ;
VPFut => case vp.prog of { True => {fin = (vp.s ! VPTense VPFutr agr).fin ; inf = (vp.s ! VPTense VPFutr agr).inf ++ hw p n} ;
_ => vp.s ! VPTense VPFutr agr } ;
VPContPres =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPContPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPContFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPPerfPres =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
-- {fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfPast =>
-- {fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
VPPerfFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
VPPerfPresCont =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ raha g n} ;
VPPerfPastCont =>
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ rahanDa g n} ;
VPPerfFutCont =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ rahanDa g n} ;
VPSubj => case vp.prog of { True => {fin = (vp.s ! VPTense VPFutr agr).inf ++ hw p n ; inf = "شاید" } ;
_ => {fin = (vp.s ! VPTense VPFutr agr).inf ; inf = "شاید" } }
};
quest =
case ord of
{ ODir => [];
OQuest => "ڇا" };
na =
case b of
{ Pos => [];
Neg => "ن" };
nahim =
case b of
{ Pos => [];
Neg => "ن" };
in
case vt of {
VPSubj => quest ++ np.s ! subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! np.a ++ vps.inf ++ na ++ vps.fin ++ vp.embComp ;
_ => quest ++ np.s ! subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! np.a ++ vps.inf ++ nahim ++ vps.fin ++ vp.embComp};
} ;
mkSClause : Str -> Agr -> VPH -> Clause =
\subj,agr,vp -> {
s = \\t,b,ord =>
let
n = (fromAgr agr).n;
p = (fromAgr agr).p;
g = (fromAgr agr).g;
vps = case t of {
VPGenPres => vp.s ! VPTense VPPres agr ;
VPImpPast => vp.s ! VPTense VPPast agr ;
VPFut => vp.s ! VPTense VPFutr agr ;
VPContPres =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPContPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPContFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ pya g n ++ hw p n } ;
VPPerfPres =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ cka g n ++ hw p n } ;
VPPerfPresCont =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPPerfPastCont =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPPerfFutCont =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ pya g n ++ hw p n } ;
VPSubj => {fin = (vp.s ! VPTense VPPres agr).inf ; inf = "شاید" }
};
quest =
case ord of
{ ODir => [];
OQuest => "ڇا" };
na =
case b of
{ Pos => [];
Neg => "ن" };
nahim =
case b of
{ Pos => [];
Neg => "ن" };
in
case t of {
VPSubj => quest ++ subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! agr ++ vps.inf ++ na ++ vps.fin ++ vp.embComp;
_ => quest ++ subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! agr ++ vps.inf ++ nahim ++ vps.fin ++ vp.embComp};
} ;
insertSubj : PPerson -> Str -> Str = \p,s ->
case p of { Pers1 => s ++ "wN" ; _ => s ++ ""};
insertObj : (Agr => Str) -> VPH -> VPH = \obj1,vp -> {
s = vp.s ;
obj = vp.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp;
prog = vp.prog ;
comp = \\a => vp.comp ! a ++ obj1 ! a
} ;
insertVV : Str -> VPH -> Str -> VPH -> VPH = \obj1,vp,emb,vp2 -> {
s = vp.s ;
obj = vp2.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp ++ emb; -- this should be covered in urdu as well
prog = vp.prog ;
comp = \\a => vp.comp ! a ++ obj1
} ;
insertObj2 : (Str) -> VPH -> VPH = \obj1,vp -> {
s = vp.s;
obj = vp.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp ++ obj1;
prog = vp.prog ;
comp = vp.comp
} ;
insertObjc : (Agr => Str) -> VPHSlash -> VPHSlash = \obj,vp ->
insertObj obj vp ** {c2 = vp.c2} ;
insertObjc2 : Str -> VPHSlash -> VPHSlash = \obj,vp ->
insertObj2 obj vp ** {c2 = vp.c2} ;
infVP : Bool -> VPH -> Agr -> Str = \isAux,vp,a ->
vp.obj.s ++ vp.inf ++ vp.comp ! a ;
infVV : Bool -> VPH -> Str = \isAux,vp ->
case isAux of {False => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ vp.inf ; True => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ (vp.s ! VPImp).fin }; -- need to be checked and should be covered in urdu as well
infV2V : Bool -> VPH -> Str = \isAux,vp ->
case isAux of {False => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ vp.inf ++ "دی" ; True => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ (vp.s ! VPImp).fin ++ "دی"}; -- need to be checked and should be covered in urdu as well
insertObject : NP -> VPHSlash -> VPH = \np,vps -> {
s = vps.s ;
obj = case np.isPron of {
False => {s = vps.obj.s ++ np.s ! objVType vps.c2.c ++ vps.c2.s ; a = np.a} ;
_ => {s = vps.obj.s ++ np.s ! objVType vps.c2.c ++ vps.c2.s ; a = np.a}
};
subj = vps.c2.c ;
inf = vps.inf;
ad = vps.ad;
embComp = vps.embComp;
prog = vps.prog ;
comp = vps.comp
} ;
insertObjPre : (Agr => Str) -> VPHSlash -> VPH = \obj,vp -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj ;
ad = vp.ad ;
embComp = vp.embComp;
prog = vp.prog ;
comp = \\a => obj ! a ++ vp.c2.s ++ vp.comp ! a
} ;
insertAdV : Str -> VPH -> VPH = \ad,vp -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj;
ad = vp.ad ++ ad ;
embComp = vp.embComp;
prog = vp.prog ;
comp = vp.comp
} ;
conjThat : Str = "ت" ;
checkPron : NP -> Str -> Str = \np,str -> case (np.isPron) of {
True => np.s ! NPC Obl;
False => np.s ! NPC Obl ++ str} ;
insertEmbCompl : VPH -> Str -> VPH = \vp,emb -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj;
ad = vp.ad;
embComp = vp.embComp ++ emb;
prog = vp.prog ;
comp = vp.comp
} ;
insertTrans : VPH -> VType -> VPH = \vp,vtype -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = case vtype of {VIntrans => VTransPost ; VTrans => VTrans ; _ => vtype} ; -- still some problem not working properly
ad = vp.ad;
embComp = vp.embComp ;
prog = vp.prog ;
comp = vp.comp
} ;
}

View File

@@ -0,0 +1,104 @@
concrete SentenceSnd of Sentence = CatSnd ** open Prelude, ResSnd in {
flags optimize=all_subs ;
coding = utf8;
lin
PredVP np vp = mkClause np vp ;
PredSCVP sc vp = mkSClause sc.s (defaultAgr) vp ;
ImpVP vp = {
s = \\pol,n =>
let
agr = Ag Masc (numImp n) Pers2_Casual ;
-- verb = infVP True vp agr ;
verb = (vp.s ! VPImp).inf ++ vp.comp ! agr ;
dont = case pol of {
CNeg True => "ن" ;
CNeg False => "ن" ;
_ => []
}
in
dont ++ verb
} ;
SlashVP np vp =
mkClause np vp ** {c2 = vp.c2} ;
AdvSlash slash adv = {
s = \\t,p,o => adv.s ! Masc ++ slash.s ! t ! p ! o ;
c2 = slash.c2
} ;
SlashPrep cl prep = cl ** {c2 = { s = prep.s ; c = VIntrans}} ;
SlashVS np vs slash =
mkClause np
(insertObj2 (conjThat ++ slash.s) (predV vs)) **
{c2 = slash.c2} ;
EmbedS s = {s = conjThat ++ s.s} ;
EmbedQS qs = {s = qs.s ! QIndir} ;
EmbedVP vp = {s = infVP False vp defaultAgr} ; --- agr
UseCl temp p cl =
{ s = case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ cl.s ! VPGenPres ! p.p ! ODir;
<Pres,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPres ! p.p ! ODir;
<Past,Simul> => temp.s ++ p.s ++ cl.s ! VPImpPast ! p.p ! ODir;
<Past,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPast ! p.p ! ODir;
<Fut,Simul> => temp.s ++ p.s ++ cl.s ! VPFut ! p.p ! ODir;
<Fut,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfFut ! p.p ! ODir;
<Cond,Simul> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! ODir;
<Cond,Anter> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! ODir -- this needs to be fixed by making SubjPerf in ResPnb
};
} ;
UseQCl temp p cl = {
s = \\q => case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ cl.s ! VPGenPres ! p.p ! q;
<Pres,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPres ! p.p ! q;
<Past,Simul> => temp.s ++ p.s ++ cl.s ! VPImpPast ! p.p ! q;
<Past,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPast ! p.p ! q;
<Fut,Simul> => temp.s ++ p.s ++ cl.s ! VPFut ! p.p ! q;
<Fut,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfFut ! p.p ! q;
<Cond,Simul> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! q;
<Cond,Anter> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! q
};
} ;
UseRCl temp p rcl = {
s = \\q => case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ rcl.s ! VPGenPres ! p.p ! ODir ! q;
<Pres,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfPres ! p.p ! ODir ! q;
<Past,Simul> => temp.s ++ p.s ++ rcl.s ! VPImpPast ! p.p ! ODir ! q;
<Past,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfPast ! p.p ! ODir ! q;
<Fut,Simul> => temp.s ++ p.s ++ rcl.s ! VPFut ! p.p ! ODir ! q;
<Fut,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfFut ! p.p ! ODir ! q;
<Cond,Simul> => temp.s ++ p.s ++ rcl.s ! VPSubj ! p.p ! ODir ! q;
<Cond,Anter> => temp.s ++ p.s ++ rcl.s ! VPSubj ! p.p ! ODir ! q
};
c = rcl.c
} ;
UseSlash temp p clslash = {
s = case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ clslash.s ! VPGenPres ! p.p ! ODir;
<Pres,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfPres ! p.p ! ODir;
<Past,Simul> => temp.s ++ p.s ++ clslash.s ! VPImpPast ! p.p ! ODir ;
<Past,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfPast ! p.p ! ODir;
<Fut,Simul> => temp.s ++ p.s ++ clslash.s ! VPFut ! p.p ! ODir;
<Fut,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfFut ! p.p ! ODir;
<Cond,Simul> => temp.s ++ p.s ++ clslash.s ! VPSubj ! p.p ! ODir;
<Cond,Anter> => temp.s ++ p.s ++ clslash.s ! VPSubj ! p.p ! ODir
};
c2 = clslash.c2
} ;
AdvS a s = {s = a.s ! Masc ++ s.s} ;
RelS s r = {s = s.s ++ r.s ! agrP3 Masc Sg} ;
SSubjS s sj s = { s = s.s ++ sj.s ++ s.s};
}

View File

@@ -0,0 +1,132 @@
concrete StructuralSnd of Structural = CatSnd **
open MorphoSnd, ParadigmsSnd, Prelude in {
flags optimize=all ;
coding = utf8;
lin
above_Prep = mkPrep "مٿی " ;
after_Prep = mkPrep "کان پو۶ " ;
all_Predet = ss "سڀ " ;
almost_AdA, almost_AdN = mkAdN "گھڻو ڪری " ;
although_Subj = ss "جیتوڻیڪ " ;
always_AdV = ss "ھمیشھ " ;
and_Conj = sd2 [] "۽" ** {n = Pl} ;
because_Subj = ss "ڇاڪاڻ تی " ;
before_Prep = mkPrep "پیھرین" ;
behind_Prep = mkPrep "پٺتی " ;
between_Prep = mkPrep " جی وچ می " ;
both7and_DConj = sd2 "ٻ۶ی " "۽" ** {n = Pl} ;
but_PConj = ss "پر" ;
by8agent_Prep = mkPrep "ھٿان " ;
by8means_Prep = mkPrep "ڪان" ;
can8know_VV,can_VV = mkV "سگھڻ " ** { isAux = True} ;
during_Prep = mkPrep "وچ ۾" ;
either7or_DConj = sd2 "ڪو۶ی ٻیو " "یا" ** {n = Sg} ;
--everybody_NP = MassNP (UseN (ParadigmsSnd.mkN "ھر ڪو۶ی" "ھر ڪو۶ی" "ھر ڪو۶ی" "ھر ڪو۶ی" Masc )); -- not a good way coz need to include NounSnd
every_Det = mkDet "ھر ھڪ " "ھر ھڪ " "ھر ھڪ " "ھر ھڪ " Sg;
--everything_NP = MassNP (UseN (ParadigmsSnd.mkN "ھر شی " "ھر شی " "ھر شی " "سڀ ڪجھ " Masc ));
everywhere_Adv = mkAdv "ھر ھنڌ " ;
few_Det = mkDet "ڪجھ " "ڪجھ " "ڪجھ " "ڪجھ " Pl ;
first_Ord = {s = "پھریون" ; n = Sg} ; --DEPRECATED
for_Prep = mkPrep "لا۶ی ";
from_Prep = mkPrep "وٽان" ;
he_Pron = personalPN "ھو" "ھو" "" ["ھو "] ["ھو"] Sg Masc Pers3_Distant ;
here_Adv = mkAdv "ھتی" ;
here7to_Adv = mkAdv "اجھو" ;
here7from_Adv = mkAdv ["ھیڏانھن"] ;
how_IAdv = ss "ڪ۶ین" ;
how8many_IDet = makeIDet "ڪیترا" "ڪیترا" Pl ;
how8much_IAdv = ss "ڪیترا";
if_Subj = ss "جیڪڏھن" ;
in8front_Prep = mkPrep ["جی سامھون"] ;
i_Pron = personalPN "مان" "مھنجا " "مھنجو " "مان" " " Sg Masc Pers1;
in_Prep = mkPrep "۾" ;
it_Pron = personalPN "اھا" "ھن" "اھو" "اھا" "" Sg Masc Pers3_Near;
less_CAdv = {s = "گھٽ" ; p = ""} ;
many_Det = mkDet "گھڻا" "گھڻی" "ڪافی" "ڪیترا" Pl ;
more_CAdv = {s = "وڌیڪ"; p = "گھڻا" } ;
most_Predet = ss "سڀ کان گھڻو" ;
much_Det = mkDet "گھڻو" "گھڻو" "گھڻو" "گھڻو" Sg ;
--must_VV = {
-- s = table {
-- VVF VInf => ["hاvع تo"] ;
-- VVF VPres => "مuست" ;
-- VVF VPPart => ["hاد تo"] ;
-- VVF VPresPart => ["hاviنگ تo"] ;
-- VVF VPast => ["hاد تo"] ; --# notpresent
-- VVPastNeg => ["hادn'ت تo"] ; --# notpresent
-- VVPresNeg => "مuستn'ت"
-- } ;
-- isAux = True
-- } ;
-----b
no_Phr = ss "نo" ;
no_Utt = ss "نا" ;
on_Prep = mkPrep "مٿان" ;
one_Quant = demoPN "ھڪ" "ھڪ" "ھڪ" ; -- DEPRECATED
only_Predet = ss "صرف" ;
or_Conj = sd2 [] "یا" ** {n = Sg} ;
otherwise_PConj = ss "ن ت پو۶ی" ;
part_Prep = mkPrep "حسو" ;
possess_Prep = mkPrep[ "جو یا جی"] ;
please_Voc = ss "مھربانی" ;
quite_Adv = ss "ڇڏڻ " ;
she_Pron = personalPN "ھو۶" "ھو" "ھو" ["ھو۶"] ["ھو۶"] Sg Fem Pers3_Distant ;
so_AdA = ss "ان ڪری" ;
--somebody_NP = MassNP (UseN (ParadigmsSnd.mkN "ڪو۶ی" "ڪو۶ی" "ڪو۶ی" "ڪو۶ی" Masc ));
someSg_Det = mkDet "ڪجھ " "ڪجھ " "ڪجھ " "ڪجھ " Sg ;
somePl_Det = mkDet "ڪجھ " "ڪجھ " "ڪجھ " "ڪجھ " Pl ;
--something_NP = MassNP (UseN (ParadigmsSnd.mkN "ڪو۶ی شی" "ڪو۶ی شی" "ڪو۶ی شی" "ڪو۶ی شیون" Masc ));
somewhere_Adv = mkAdv "ڪٿی" ;
that_Quant = demoPN "جیڪو" "" "" ;
that_Subj = ss "اھا" ;
there_Adv = mkAdv "اتی" ;
there7to_Adv = mkAdv ["ھتی"] ;
there7from_Adv = mkAdv ["ھتان"] ;
therefore_PConj = ss "ان ڪری" ;
they_Pron = personalPN "اھی" "اھی" "اھی" ["اھی جو"] ["اھی جو"] Pl Masc Pers3_Distant ; ----
this_Quant = demoPN "ھی" "ھن" "";
through_Prep = mkPrep "منجھان" ;
under_Prep = mkPrep " ھیٺان" ; -- ** {lock_Prep = <>};
too_AdA = ss "بیحد";
to_Prep = mkPrep "ڏانھن" ; -- ** {lock_Prep = <>};
very_AdA = ss "تمام" ;
want_VV = mkV "چاھڻ " ** { isAux = False} ;
we_Pron = personalPN "اسان" "اسان" "اسان" "اسانجo" "اسانجo" Pl Masc Pers1 ;
whatSg_IP = mkIP "ڇا" "ڇو" "" "" Sg Masc ;
whatPl_IP = mkIP "ڇا" "ڇو " " " "" Pl Masc ;
when_IAdv = ss "ڪڏھن" ;
when_Subj = ss "جڏھن" ;
where_IAdv = ss "ڪٿی" ;
--which_IQuant = {s = \\_ => "ڪھڙو"} ;
which_IQuant = mkIQuant "جیڪو" "جیڪی" "جیڪا" "جھڙو" ;
whichPl_IDet = makeDet "جیڪY" "جنھن" ;
whichSg_IDet = makeDet "جیڪو " "جیڪا" ;
whoSg_IP = mkIP "ڪیر" "ڪھنجی" "ڪھنجo" "" Sg Masc ;
whoPl_IP = mkIP "ڪیر" "ڪھنجا" "ڪھنجا" "" Pl Masc ;
why_IAdv = ss "ڇو" ;
without_Prep = mkPrep "کان سوا۶ " ;
with_Prep = mkPrep "سان" ;
yes_Phr = ss "ھا" ;
yes_Utt = ss "ھا" ;
youSg_Pron = personalPN "تون" "تون" "تون" "تھنجو" "تھنجی" Sg Masc Pers2_Casual ;
youPl_Pron = personalPN "توھان" "توھان" "توھان" "توھانجو" "توھانجی" Pl Masc Pers2_Casual ;
youPol_Pron = personalPN "توھان" "توھان" "توھان" "توھان جو" "توھان جی" Pl Masc Pers2_Respect ;
no_Quant = demoPN " ڇو ن" "ڇو ن" "ڇو ن " ;
not_Predet = {s="ن"} ;
if_then_Conj = sd2 "جیڪڏھن" "ت" ** {n = Sg} ;
at_least_AdN = mkAdN ["گھٽ می گھٽ"] ;
at_most_AdN = mkAdN ["گھڻی کان گھڻو"];
--nothing_NP = MassNP (UseN (ParadigmsSnd.mkN "ڪجھ شی ن" "ڪجھ شی ن" "ڪجھ شی ن" "ڪجھ شی ن" "ڪجھ شی ن" "ڪجھ شی ن" Masc ));
except_Prep = mkPrep "سوا۶ " ;
--nobody_NP = MassNP (UseN (ParadigmsSnd.mkN "ڪو ب ن" "ڪو ب ن" "ڪو ب ن" "ڪو ب ن" "ڪو ب ن" "ڪو ب ن" Masc ));
as_CAdv = {s = "جی۶ن" ; p = "جھڙو"} ;
have_V2 = mkV2 (mkV "رکڻ ") "" ;
language_title_Utt = ss "ٻوlی" ;
}

View File

@@ -0,0 +1,50 @@
--# -path=.:../abstract:../common
concrete SymbolSnd of Symbol = CatSnd ** open Prelude, ResSnd in {
flags coding = utf8;
lin
-- SymbPN i = {s = \\_ => i.s ; g = Masc} ;
SymbPN i = {s = addGenitiveS i.s ; g = Masc} ;
IntPN i = {s = addGenitiveS i.s ; g = Masc} ;
FloatPN i = {s = addGenitiveS i.s ; g = Masc} ;
NumPN i = {s = \\_ =>i.s ; g = Masc} ;
CNIntNP cn i = {
s = \\c => cn.s ! Sg ! Dir ++ i.s ;
a = agrP3 cn.g Sg ;
isPron = False
} ;
CNSymbNP det cn xs = {
s = \\c => det.s!Sg!Masc ++ cn.s ! det.n ! Dir ++ xs.s ;
a = agrP3 cn.g det.n;
isPron = False
} ;
CNNumNP cn i = {
s = \\c => cn.s ! Sg ! Dir ++ i.s ;
a = agrP3 cn.g Sg;
isPron = False
} ;
SymbS sy = sy ;
SymbNum sy = { s = sy.s ; n = Pl } ;
SymbOrd sy = { s = sy.s ++ "wاN" ; n = Pl} ;
lincat
Symb, [Symb] = SS ;
lin
MkSymb s = s ;
BaseSymb = infixSS "تE" ;
ConsSymb = infixSS "" ;
oper
-- Note: this results in a space before 's, but there's
-- not mauch we can do about that.
addGenitiveS : Str -> Case => Str = \s ->
table {_ => s ++ "دا" } ;
}

44
lib/src/sindhi/VerbSnd.gf Normal file
View File

@@ -0,0 +1,44 @@
concrete VerbSnd of Verb = CatSnd ** open ResSnd in {
flags coding = utf8;
flags optimize=all_subs ;
lin
UseV v = predV v ;
SlashV2a v = predV v ** {c2 = {s = v.c2.s ; c = VTrans}} ;
Slash2V3 v np =
insertObjc (\\_ => np.s ! NPObj ++ v.c3 ) (predV v ** {c2 = {s = v.c2 ; c = VTrans}}) ;
Slash3V3 v np =
insertObjc (\\_ => checkPron np v.c2) (predV v ** {c2 = {s = v.c3 ; c = VTrans}}) ;
ComplVV v vp = insertTrans (insertVV (infVV v.isAux vp) (predV v) vp.embComp vp) vp.subj;
ComplVS v s = insertTrans (insertObj2 (conjThat ++ s.s) (predV v)) VTransPost ;
ComplVQ v q = insertObj2 (conjThat ++ q.s ! QIndir) (predV v) ;
ComplVA v ap = insertObj (\\a => ap.s ! giveNumber a ! giveGender a ! Dir ) (predV v) ;
SlashV2V v vp = insertVV (infV2V v.isAux vp) (predV v) vp.embComp vp **{c2 = {s = "تwN" ; c = VTransPost}} ; -- should creat a form at VP level which can be used in VP like 'swn da kyna' also check the c=VTransPost it is correct in case if second v is intrasitive, but not if trans like begged me to ead bread
SlashV2S v s = insertObjc2 (conjThat ++ s.s) (predV v ** {c2 = {s = "کی" ; c = VTransPost}}) ;
SlashV2Q v q = insertObjc2 (conjThat ++ q.s ! QIndir) (predV v ** {c2 = {s = "کان" ; c = VTransPost}}) ; -- chek for VTransPost, as in this case , case should be ergative but agrement should be default
SlashV2A v ap = insertObjc (\\a => ap.s ! giveNumber a ! giveGender a ! Dir ) (predV v ** {c2 = {s = "کی" ; c = VTransPost}}) ; ----
ComplSlash vp np = insertObject np vp ;
SlashVV vv vp =
insertEmbCompl (insertObj (\\a => infVP vv.isAux vp a) (predV vv)) vp.embComp **
{c2 = vp.c2} ;
SlashV2VNP vv np vp =
insertObjPre (\\_ => np.s ! NPObj )
(insertObjc (\\a => infVP vv.isAux vp a) (predVc vv)) **
{c2 = vp.c2} ;
UseComp comp = insertObj comp.s (predAux auxBe) ;
AdvVP vp adv = insertObj (\\a => adv.s ! (fromAgr a).g) vp ;
AdVVP adv vp = insertAdV adv.s vp ;
ReflVP v = insertObjPre (\\_ => RefPron) v ;
PassV2 v = predV v ; -- need to be fixed
CompAP ap ={s = \\a => ap.s ! giveNumber a ! giveGender a ! Dir } ;
CompNP np = {s = \\_ => np.s ! NPObj} ;
CompAdv adv = {s = \\a => adv.s ! (fromAgr a).g } ;
CompCN cn = {s = \\a => cn.s ! giveNumber a ! Dir} ;
}

View File

@@ -0,0 +1,40 @@
concrete AdjectiveSnd of Adjective = CatSnd ** open ResSnd, Prelude in {
flags coding = utf8;
lin
PositA a = a ;
UseComparA a = a;
ComparA a np = {
-- s = \\n,g,c => np.s ! NPC Obl ++ "k'an" ++ a.s ! n ! g ! c ;
s = \\n,g,c => np.s ! NPC Abl ++ "k'an" ++ a.s ! n ! g ! c ;
} ;
---- $SuperlA$ belongs to determiner syntax in $Noun$.
ComplA2 a np = {
s = \\n,g,c => np.s ! NPC Obl ++ a.c2 ++ a.s ! n ! g ! c ;
} ;
ReflA2 a = {
s = \\n,g,c => a.s ! n ! g ! c ++ RefPron ++ "san" ;
} ;
SentAP ap sc = {
s = \\n,g,c => ap.s ! n ! g ! c ++ sc.s ;
} ;
AdAP ada ap = {
s = \\n,g,c => ada.s ++ ap.s ! n ! g ! c ;
} ;
UseA2 a = a ;
CAdvAP cadv ap np = {
s = \\n,g,c => cadv.s ++ ap.s ! n ! g ! c ++ cadv.p ++ np.s ! NPC Dir ;
};
AdjOrd ord = { s = \\_,_,_ => ord.s ; };
}

View File

@@ -0,0 +1,20 @@
concrete AdverbSnd of Adverb = CatSnd ** open ResSnd, Prelude in {
flags coding = utf8;
lin
PositAdvAdj a = {s = \\g => a.s ! Sg ! g ! Obl } ;
ComparAdvAdj cadv a np = {
s = \\g => np.s ! NPObj ++ cadv.p ++ cadv.s ++ a.s ! Sg ! g ! Obl ;
} ;
ComparAdvAdjS cadv a s = {
s = \\g => cadv.p ++ cadv.s ++ a.s ! Sg ! g ! Obl ++ s.s;
} ;
PrepNP prep np = {s = \\_ => np.s ! NPObj ++ prep.s } ;
AdAdv ada adv = { s = \\g => ada.s ++ adv.s ! g} ;
SubjS sub snt = {s = \\_ => sub.s ++ snt.s } ;
AdnCAdv cadv = {s = "san gD' " ++ cadv.s} ;
}

View File

@@ -0,0 +1,19 @@
concrete ExtraSnd of ExtraSndAbs = CatSnd **
open ResSnd, Coordination, Prelude, MorphoSnd, ParadigmsSnd in {
flags coding = utf8;
lin
GenNP np = {s = \\_,_,_ => np.s ! NPC Obl ++ "ka" ; a = np.a} ;
each_Det = mkDet "hr kwy" "hr kwy" "hr kwy" "hr kwy" Sg ;
have_V = mkV "rakh'na";
IAdvAdv adv = {s = "ktny" ++ adv.s!Masc} ;
ICompAP ap = {s = "ktnE" ++ ap.s ! Sg ! Masc ! Dir} ;
cost_V = mkV "qymt" ;
-- added for causitives
make_CV = mkVerb "nothing" ** {c2 = "" };
-- for VP conjunction
}

View File

@@ -0,0 +1,40 @@
concrete IdiomSnd of Idiom = CatSnd ** open Prelude,Predef, ResSnd in {
flags optimize=all_subs ;
flags coding = utf8;
lin
ImpersCl vp = mkSClause " " (agrP3 Masc Sg) vp ;
GenericCl vp = mkSClause "kWe'y" (agrP3 Masc Sg) vp ;
CleftNP np rs =
let cl = mkSClause (np.s ! NPC rs.c) (np.a) (predAux auxBe);
in
{s = \\t,p,o => cl.s ! t ! p ! o ++ rs.s ! np.a };
CleftAdv ad ss = { s = \\t,b,o => ad.s ! Masc ++ ss.s};
ExistNP np =
mkSClause "h'ty" (agrP3 (fromAgr np.a).g (fromAgr np.a).n)
(insertObj (\\_ => np.s ! NPC Dir) (predAux auxBe)) ;
ExistIP ip =
let cl = mkSClause ("h'ty" ++ ip.s ! Dir) (agrP3 ip.g ip.n) (predAux auxBe);
in {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! ODir;
QIndir => cl.s ! t! p ! ODir
}
};
ProgrVP vp = (predProg vp) ;
ImpPl1 vp = {s = "ac" ++ (vp.s ! VPReq).inf} ;
-- ImpP3 np vp = {s = np.s!NPC Dir ++ "k'y" ++ (vp.s ! VPImp ).inf ++ "D'y"}; here VPImp form is not correct e.g jan ko sw do, rather jan ko swnE do, and swnE is stored in vp.VPInf.fin
ImpP3 np vp = {s = np.s!NPC Dir ++ "k'y" ++ (vp.s ! VPInf ).fin ++ "D'yW"};
}

View File

@@ -0,0 +1,362 @@
--# -path=.:prelude:alltenses
concrete LexiconSnd of Lexicon = CatSnd **
--open ResSnd, Prelude in {
open ParadigmsSnd,MorphoSnd, Prelude in {
flags
optimize=values ;
coding = utf8;
lin
airplane_N = mkN03 "jh'aj" ;
answer_V2S = mkV2 (compoundV "jWab" (mkV "D'yt' ")) ;
apple_N = mkN03 "sWf" ;
art_N = mkN13 "fn" ;
ask_V2Q = mkV2 (mkV "pc't' ");
baby_N = mkN05 "Bar" ;
bad_A = mkAdj3 "krab" ;
bank_N = mkN03 "bank" ;
beautiful_A = mkAdj1 "pyarW" ;
become_VA = mkV "T'yt' ";
beer_N = mkN03 "Xrab" ;
--beg_V2V = mkV "pnt' " ;
big_A = mkAdj1 "WD'W" ;
bike_N = mkN03 "saycl" ;
bird_N = mkN01 "pk'y" ;
black_A = mkAdj1 "karW" ;
blue_A = mkAdj1 "nyrW" ;
boat_N = mkN04 "B'yry" ;
book_N = mkN03 "ktab" ;
boot_N = mkN01 "jWtW" ;
boss_N = mkN03 "baLadst" ;
boy_N = mkN01 "cWkrW" ;
bread_N = mkN03 "many" ;
break_V2 = mkV2 "TWrt' " ;
broad_A = mkAdj1 "WykrW" ;
--brother_N2 = mkN10 "B'ae' " "jo " ; --not correct
brown_A = mkAdj3 "nasy" ;
butter_N = mkN13 "mk't'" ;
buy_V2 = mkV2(compoundV "Kryd " do_V2);
camera_N = mkN01 "kymyra";
cap_N = mkN03 "t'WpY" ;
car_N = mkN03 "gaD'y" ;
carpet_N = mkN01 "tD'W" ;
cat_N = mkN09 "BLy" ;
ceiling_N = mkN01 "c't" ;
chair_N = mkN09 "krsy" ;
cheese_N = mkN14 "pnyr" ;
child_N = mkN01 "Bar" ;
--church_N = mkN03 "grja" (mkN "grja") ;
clean_A = mkAdj3 "saf" ;
clever_A = mkAdj3 "hWXyar" ;
close_V2 = mkV2 (compoundV "bnd" do_V2);
coat_N = mkN03 "kWT" ;
cold_A = mkAdj1 "T'd'W" ;
computer_N = mkN03 "kmpyWTr" ;
country_N = mkN03 "mlk" ;
cousin_N = mkN03 "se'WT" ; -- a compund noun made of two nouns
cow_N = mkN09 "gan" ;
die_V = mkV "mrt' " ;
dirty_A = mkAdj1 "myrW" ;
--distance_N3 = mkN3 (mkN "pnd'") (mkPrep "da") "dE" "tWN" ;
doctor_N = mkN03 "d!aktr" ;
dog_N = mkN01 "ktW" ;
door_N = mkN01 "drWzW" ;
drink_V2 = mkV2 "pye't' ";
easy_A2V = mkA "sWLW" "" ;
eat_V2 = mkV2( mkV "k'ae't' ");
empty_A = mkAdj3 "KaLy" ;
enemy_N = mkN03 "dXmn" ;
factory_N = mkN02 "karKanW" ;
father_N2 = mkN2 (mkN06 "py") (mkPrep "jW") "jy" ;
fear_VS = mkV "d!J't' ";
fish_N = mkN09 "mc'y" ;
floor_N = mkN03 "frX" ;
fridge_N = mkN03 "grj" ;
friend_N = mkN05 "dWst" ;
fruit_N = mkN13 "Cmr" ;
--fun_AV = mkAdj1V (regA "mzW") ;
garden_N = mkN03 "baG" ;
girl_N = mkN09 "c'Wkry" ;
glove_N = mkN01 "dstanW" ;
gold_N = mkN13 "sWn" ;
good_A = mkAdj1 "sT!W" ;
-- go_V = mkIrrgV "WY't'" "" ;
green_A = mkAdj1 "saeW" ;
harbour_N = mkN08 "panagah'" ;
hate_V2 = mkV2 (compoundV "nfrt" do_V2) ;
hat_N = mkN01 "tWplW" ;
--have_V = dirV2 (mk5V "ha?e" "has" "had" "had" "h'jt' ") ;
hear_V2 = mkV2 (mkV "Bd't' ") ;
hill_N = mkN09 "Tkry" ;
hope_VS = (compoundV "amyd" do_V2);
horse_N = mkN01 "gWrW" ;
hot_A = mkAdj1 "kWsW" ;
house_N = mkN03 "gh'r" ;
important_A = mkAdj3 "Z-rWry" ;
industry_N = mkN01 "dndW" ;
iron_N = mkN09 "LWh' " ;
king_N = mkN01 "badXah'" ;
know_V2 = mkV2 (mkV "Jat't'") ;
know_VS = (mkV "J'at't' ") ;
know_VQ = (mkV "J'at't' ") ;
lake_N = mkN09 "DnD" ;
lamp_N = mkN09 "bty " ;
learn_V2 = mkV2 ( mkV "sK't' ") ;
leather_N = mkN01 "cmRW" ;
leave_V2 = mkV2 (mkV "cD't'") ;
like_V2 = mkV2 (compoundV "pSnd" do_V2);
listen_V2 = mkV2 (mkV "Kn Dyt' ") ;
live_V = mkV "rht' " ; ---- touch
long_A = mkAdj1 "d!gW" ;
lose_V2= mkV2 "harae't' " ;
love_N = mkN08 "mh'bt" ;
love_V2 = mkV2 (compoundV "eXq" do_V2) "san";
man_N = mkN03 "mat'h'W" ;--not correct according to rules should be discussed
--married_A2 = mkAdj1 "prt'yL" ;
meat_N = mkN01 "k'adW" ;
milk_N = mkN13 "k'yr" ;
moon_N = mkN13 "cnd!" ;
--mother_N2 = mkN2(mkN07 "mae' " "jW" "jy" );--not covered need to be discussed
mountain_N = mkN03 "jbL" ;
music_N = mkN14 "mWsyqy" ;
narrow_A = mkAdj1 "sWRh'W" ;
new_A = mkAdj1 "ne'Wn" ;
newspaper_N = mkN04 "aKbar" ;
oil_N = mkN03 "tyL" ;
old_A = mkAdj1 "pWRh'y" ;
-- open_V2 = mkV2 (mkIrrgV "KWLt'" "KWl") ;
paint_V2A = mkV2 (compoundV "rng" do_V2) ;
paper_N = mkN01 "pnW" ;
--paris_PN = mkN13 "pyrs" masculine;
peace_N = mkN13 "amn" ;
pen_N = mkN14 "qLm" ;
planet_N = mkN01 "syarW" ;
plastic_N = mkN13 "mRndR" ;
play_V2 = mkV2 (mkV "rand") ;
policeman_N = mkN05 "spah'y" ;
priest_N = mkN05 "pyGmbr" ;
--probable_AS = mkAdj1S (regA "amkan" ) ;
queen_N = mkN09 "Xh'zady" ;
radio_N = mkN01 "bajW" ;
--rain_V0 = compoundV "mynh'n" "";
red_A = mkAdj1 "G'aRh'W" ; -- worst case
religion_N = mkN03 "mzh'b" ;
restaurant_N = mkN05 "h'WTl" ;
river_N = mkN12 "drya" ;
rock_N = mkN08 "Tkry" ;
roof_N = mkN14 "c't" ;
rubber_N = mkN13 "rbR" ;
run_V = mkV "d!WRt' " ;
say_VS = mkV "cWt' " ;
school_N = mkN03 "askWL" ;
science_N = mkN13 "saenS" ;
sea_N = mkN14 "smnd!" ;
seek_V2 = mkV2 (compoundV "tlaX" do_V2) ;
see_V2 = mkV2 (mkV "D'st' ") ;
sell_V = mkV "Wkt't' ";
send_V= mkV "mWkLt' ";
sheep_N = mkN09 "rD" ;
ship_N = mkN03 "jhaz" ;
shirt_N = mkN01 "cWLW";
shoe_N = mkN01 "jWtW" ;
shop_N = mkN03 "dWkan" ;
short_A = mkAdj1 "nnDW " ;
silver_N = mkN14 "candy" ;
sister_N = mkN11 "Byt' " ;
sleep_V = mkV "smh't' " ;
small_A = mkAdj1 "nnDW" ;
snake_N = mkN03 "nang" ;
sock_N = mkN04 "jWrab" ;
speak_V2 = mkV2 (mkV "GaLhe't' ") ;
star_N = mkN01 "XrWeat" ;
steel_N = mkN13 "astyL" ;
stone_N = mkN05 "pTr" ;
stove_N = mkN01 "cLh'W" ;
student_N = mkN05 "Xagrd" ;
stupid_A = mkAdj1 "cryW" ;
sun_N = mkN13 "sj" ;
switch8off_V2 = mkV2 (mkV "h'Laet") ;
switch8on_V2 = mkV2 (compoundV "bnd" do_V2) ;
table_N = mkN04 "myz" ;
talk_V = mkV "GaLhaet' ";
teacher_N = mkN05 "astad" ;
teach_V = mkV "syk'art' ";
television_N = mkN14 "tyLyWzn" ;
thick_A = mkAdj1 "mWtW" ;
thin_A = mkAdj1 "snh'W" ;
train_N = mkN09 "ryL" ;
travel_V = (compoundV "sfr" do_V2) ;
tree_N = mkN13 "Wt' " ;
trousers_N = mkN01 "pajamW" ;
ugly_A = mkAdj3 "bdsWrt" ;
understand_V = mkV "smjh't' ";
university_N = mkN09 "yWnyWrsTY" ;
village_N = mkN03 "GWT! " ;
wait_V2 = mkV2 (compoundV "antz-ar" (mkV "antz-ar")) ;
walk_V = mkV "h'Lt' " ;
warm_A = mkAdj3 "grm" ;
war_N = mkN03 "jng" ;
watch_V2 = mkV2 (mkV "Dst' ") ;
water_N = mkN14 "pat'y" ; -- not covered masculine ending with y
white_A = mkAdj1 "ac'W" ;
window_N = mkN09 "dry" ;
wine_N = mkN04 "Xrab";
win_V = mkV"k'Tt' " ;
woman_N = mkN09 "astry" ;
wonder_VQ = compoundV "h'yran"(mkV "T'yt' ") ;
wood_N = mkN13 "kaT!" ;
write_V = mkV "LKt' " ;
yellow_A = mkAdj1 "pyLW" ;
young_A = mkAdj3 "jWan" ;
do_V2 = mkV2 (mkV "krt' ") ;
now_Adv = mkAdv "h'at'y" ;
--already_Adv = mkAdj1dv "ph'ryaeyn" ;
song_N = mkN01 "ganW" ;
-- number_N = mkN03 "ang" ;
put_V = mkV "Wjt' " ;
stop_V = mkV "byh't' " ;
jump_V = compoundV "TpW " (mkV "") ; -- here
left_Ord = {s = "k'abW" ; n = singular};
right_Ord = {s= "sJ'W" ; n = singular};
--far_Adv = mkAdj1dv "pry" ;
correct_A = mkAdj3 "sh'y" ;
dry_A = mkAdj3 "KXk" ;
dull_A = mkAdj1 "jD'W" ;
full_A = mkAdj3 "BryL" ;
heavy_A = mkAdj1 "grW" ;
near_A = mkAdj1 "Wyjh'W" ;
rotten_A = mkAdj3 "Krab" ;
round_A = mkAdj3 "gWL" ;
sharp_A = mkAdj3 "tyz" ;
smooth_A = mkAdj3 "hmWar" ;
straight_A = mkAdj1 "sd'W" ;
wet_A = mkAdj1 "aaLW";
wide_A = mkAdj1 "WykrW" ;
animal_N = mkN03 "janWr" ;
ashes_N = mkN14 "rak' " ; -- FIXME: plural only?
back_N = mkN09 "pT! " ;
bark_N = mkN13 "Be'Wnkt' " ;
belly_N = mkN14 "pyT" ;
blood_N = mkN13 "rt" ;
bone_N = mkN09 "hD'y" ;
breast_N = mkN09 "c'aty" ;
cloud_N = mkN03 "jh'R" ;
day_N = mkN13 "D'ynh'n" ;
dust_N = mkN14"d'WR" ;
ear_N = mkN03 "kn" ;
earth_N = mkN08 "zmyn" ;
egg_N = mkN01 "bydW" ;
eye_N = mkN09 "ak' " ;
fat_N = mkN09 "crBy" ;
feather_N = mkN13 "k'nB'" ;
fingernail_N = mkN03 "nh' " ;
fire_N = mkN14 "bah'" ;
flower_N = mkN03 "gL" ;
fog_N = mkN13 "mak" ;
foot_N = mkN03 "pyr" ; -- not properly covered need to be discussed
forest_N = mkN01 "ByLW" ;
grass_N = mkN04 "gah" ;
--guts_N = mkN "g?t" ; -- FIXME: no singular
hair_N = mkN03 "War" ;
hand_N = mkN03 "hT' ";
head_N = mkN01 "mT'W" ;
heart_N = mkN09 "dL";
horn_N = mkN13 "sc! " ;
husband_N = mkN03 "mRs" ;
ice_N = mkN09 "brf" ;
nee_N = mkN01 "gWD'W" ;
leaf_N = mkN03 "pn" ;
leg_N = mkN09 "Tng" ;
liver_N = mkN03 "jyrW" ;
louse_N = mkN14 "jWne' " ;
mouth_N = mkN03 "Wat" ;
name_N = mkN01 "naLW";
neck_N = mkN04 "knd' " ;
night_N = mkN09 "rat" ;
nose_N = mkN03 "nk" ;
person_N = mkN03 "XKs" ;
rain_N = mkN14 "mynhn" ;
road_N = mkN01 "rstW" ;
root_N = mkN09 "paR" ;
rope_N = mkN09 "rsy";
salt_N = mkN14 "LWt' " ;
sand_N = mkN14 "Wary" ;
seed_N = mkN03 "Bj" ;
skin_N = mkN09 "cmRy" ;
sky_N = mkN03 "aasman";
smoke_N = mkN13 "dWnh'W"; -- singular masc nouns ending with aN,wN yet to be implemented
snow_N = mkN13 "brf" ;
stick_N = mkN09 "D'nd!y" ;
tail_N = mkN13 "pc' " ;
tongue_N = mkN08 "zban" ;
tooth_N = mkN03 "D'and";
wife_N = mkN09 "zaL" ;
wind_N = mkN08 "h'Wa" ;
wing_N = mkN05 "pr" ;
worm_N = mkN01 "kyneWn" ;
year_N = mkN03 "saL" ;
blow_V = mkV "WJ't' " ;
breathe_V = compoundV "sah " (mkV "K't't' " ) ;
burn_V = mkV "sRt' " ;
dig_V = mkV "K'Tt' " ;
fall_V = mkV "krt' " ;
float_V = mkV "trt' " ;
flow_V = mkV "Wh't' " ;
fly_V = mkV "aD't' ";
freeze_V = mkV "J'mt' " ;
give_V3= mkV3 (mkV "D'yt' ") "" "" ; -- here
laugh_V = mkV "k'Lt' " ;
lie_N = mkN01 "kWR" ;
lie_V = compoundV "kWR " ( mkV "GaLhaet' ") ;
play_V = mkV "k'yDt' " ;
sew_V = mkV "sbt' " ;
sing_V = mkV "gae't' " ;
sit_V = mkV "Wyh't' ";
smell_V = mkV "sngt' " ;
spit_V = mkV "T'kt' " ;
stand_V = mkV "bah't' ";
swell_V = mkV "sbt'" ;
swim_V = mkV "trt' " ;
think_V = mkV "sWct' " ;
turn_V = mkV "mRt' ";
vomit_V = compoundV "aLTy" (mkV "krt' ") ;
bite_V2 = mkV2 (mkV "cK pae't' ") ;
count_V = mkV "Gt't' ";
cut_V = mkV "kTt' ";
fear_V = mkV "d!J't' " ;
fight_V = mkV "WRh't' " ;
hit_V = mkV "mart' " ;
hold_V = mkV "jh'Lt' " ;
hunt_V2 = mkV2 (compoundV "Xkar" do_V2);
kill_V = mkV "marn" ;
pull_V = mkV "ckt' ";
push_V = mkV "d'kt' " ;
rub_V = mkV "mh'Tt' " ;
scratch_V= mkV "Krct' " ;
split_V= mkV "h'art' " ;
--squeeze_V2 = dirV2 (regV "sq?eeze") ;
--stab_V2 = dirV2 (regDuplV "stab") ;
suck_V = mkV "cWst' " ;
throw_V = mkV "ac'Lt' " ;
tie_V = mkV "Bd't' " ;
wash_V = mkV "d'We't'" ;
wipe_V= mkV "agh't' ";
--other_A = regA "Bya";
grammar_N = mkN03 "grdan" ;
language_N = mkN09 "BWLy" ;
rule_N = mkN03 "aSWL" ;
---- added 4/6/2007
john_PN = mkPN "jan" masculine ;
question_N = mkN03 "sWal" ;
--ready_A = regA "tyar" ;
reason_N = mkN03 "sbb" ;
today_Adv = mkAdv "aJ' " ;
uncertain_A = mkAdj3 ["acank"] ;
}

View File

@@ -0,0 +1,393 @@
--# -path=.:../../prelude
--
----1 A Simple Sindhi Resource Morphology
----
---- by Jherna Devi, Shafqat Virk,2012
----
---- This resource morphology contains definitions needed in the resource
---- syntax. To build a lexicon, it is better to use $ParadigmsSnd$, which
---- gives a higher-level access to this module.
--
resource MorphoSnd = ResSnd ** open Prelude,Predef in {
flags optimize=all ;
coding = utf8;
----2 Nouns
oper
mkN : (x1,_,_,_,_,_,_,x8 : Str) -> Gender -> Noun =
\sd,so,sv,sa, pd,po,pv,pa, g -> {
s = table {
Sg => table {
Dir => sd ;
Obl => so ;
Voc => sv ;
Abl => sa
} ;
Pl => table {
Dir => pd ;
Obl => po ;
Voc => pv ;
Abl => pa
}
} ;
g = g
} ;
-- 1. msculine: chokro, kuto, hat
mkN01 : Str -> Noun ;
mkN01 chokro = let chokr = (tk 1 chokro)
in mkN (chokro) (chokr+"y") (chokr+"a") (chokr+"a")
(chokr+"a") (chokr+"n") (chokr+"a") (chokr+"a")
Masc ;
-- 2. karkhano
mkN02 : Str -> Noun ;
mkN02 karkhano =let karkhan = (tk 1 karkhano)
in mkN (karkhano) (karkhan+"y") (karkhan+"a") (karkhano)
(karkhan+"a") (karkhan+"n") (karkhan+"W") (karkhan+"a")
Fem ;
-- 3. gher, shehar
mkN03 : Str -> Noun ;
mkN03 gher = mkN (gher) (gher) (gher) (gher)
(gher) (gher+"n") (gher+"W") (gher)
Masc ;
-- 4. paki, mez, gah
mkN04 : Str -> Noun ;
mkN04 paki = mkN (paki) (paki) (paki) (paki)
(paki) (paki+"n") (paki) (paki)
Fem ;
-- 5. msculine: bar, hotel, pathar
mkN05 : Str -> Noun ;
mkN05 bar = mkN (bar) (bar) (bar) (bar)
(bar) (bar+"n") (bar+"W") (bar)
Masc ;
-- 6. pe
mkN06 : Str -> Noun ;
mkN06 pe = mkN (pe) (pe) (pe) (pe)
(pe+"e'r") (pe+"e'rn") (pe+"e'rW") (pe+"e'r")
Masc ;
-- 7. Feminine : ma
mkN07 : Str -> Noun ;
mkN07 ma = mkN (ma) (ma) (ma) (ma)
(ma+"e'r") (ma+"e'rn") (ma+"e'rW") (ma+"e'r")
Fem ;
-- 8. msculine: topi, takre
mkN08 : Str -> Noun ;
mkN08 topi = mkN (topi) (topi) (topi) (topi)
(topi+"Wn") (topi+"n") (topi+"W") (topi+"Wn")
Masc ;
-- 9. Feminine: bere, bili, kurse
mkN09 : Str -> Noun ;
mkN09 bili = mkN (bili) (bili) (bili) (bili)
(bili+"Wn") (bili+"n") (bili+"n") (bili+"Wn")
Fem ;
-- 10. msculine: bha
mkN010 : Str -> Noun ;
mkN010 bha = mkN (bha) (bha) (bha) (bha)
(bha+"r") (bha+"rn") (bha+"rW") (bha+"r")
Masc ;
-- 11. Feminine: bhen
mkN11 : Str -> Noun ;
mkN11 bhen = let bhe= (tk 1 bhen)
in mkN (bhen) (bhen) (bhen) (bhen)
(bhe+"nr") (bhe+"nrn") (bhen+"Wn") (bhe+"nr")
Fem ;
--12. msculine: raja, darya
mkN12 : Str -> Noun ;
mkN12 raja = mkN (raja) (raja) (raja) (raja)
(raja) (raja+"e'n") (raja+"e'W") (raja)
Masc ;
-- 13. msculine: fan, son, kher,
mkN13 : Str -> Noun ;
mkN13 son = mkN (son) (son) (son) (son)
(son) (son) (son) (son)
Masc ;
-- 14. Feminine: pen, samand
mkN14 : Str -> Noun ;
mkN14 pen = mkN (pen) (pen) (pen) (pen)
(pen) (pen) pen ""
Fem ;
----2 Determiners
IDeterminer = {s:Gender => Str ; n : Number};
makeDet : Str -> Str -> Str -> Str -> Number -> Determiner = \s1,s2,s3,s4,n -> {
s = table {
Sg => table {
Masc => s1 ;
Fem => s2
} ;
Pl => table {
Masc => s3 ;
Fem => s4
}
} ;
n = n
};
makeIDet : Str -> Str -> Number -> IDeterminer = \s1,s2,n -> {
s = table {
Masc => s1;
Fem => s2
};
n = n
};
makeIQuant : Str -> Str -> Str -> Str -> {s:Number => Gender => Str} = \s1,s2,s3,s4 -> {
s = table {
Sg => table {
Masc => s1 ;
Fem => s2
} ;
Pl => table {
Masc => s3 ;
Fem => s4
}
}
};
-- Proposition
makePrep : Str -> Preposition = \str -> {s = str } ** { lock_Prep = <>};
----2 Pronouns
--PronForm = {s:Pronoun => Str};
DemonPronForm = {s:DemPronForm => Str};
mkDemonPronForm : (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16:Str) -> DemPronForm =
\y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15,y16 -> {
s = table {
Sg => table {
Masc => table {
Dir => y1 ;
Obl => y2 ;
Voc => y3 ;
Abl => y4
};
Fem => table {
Dir => y5 ;
Obl => y6 ;
Voc => y7 ;
Abl => y8
}
};
Pl => table {
Masc => table {
Dir => y9 ;
Obl => y10 ;
Voc => y11 ;
Abl => y12
};
Fem => table {
Dir => y13 ;
Obl => y14 ;
Voc => y15 ;
Abl => y16
}
}
}
};
makeDemonPronForm : Str -> Str -> Str -> DemPronForm ;
makeDemonPronForm yeh is inn = mkDemonPronForm yeh is "" yeh is "" yeh inn "" yeh inn "" "" "" "" "";
-- makePossPronForm myra myry hmara hmary = mkDemonPronForm myra myra myra myry myry myry hmara hmara hmara hmary hmary hmary;
mkPron : (x1,x2,x3,x4:Str) -> {s:Case => Str} =
\y1,y2,y3,y4 -> { s =
table {
Dir => y1;
Obl => y2;
Voc => y3;
Abl => y4
}
};
------- PossPronForm yet to be implemented
-- IntPronForm = {s:InterrPronForm => Str};
IntPronForm = {s: Case => Str};
mkIntPronForm : (x1,x2,x3,x4:Str) -> IntPronForm =
\y1,y2,y3,y4 -> {
s =
table {
Dir => y1;
Obl => y2;
Voc => y3;
Abl => y4
}
};
----2 Adjectives
-- defined in ResSnd
------------------------------------------------------------------
----Verbs
------------------------------------------------------------------
--1. Basic stem form, direct & indirect causatives exists
-- v1 nechna nechaana nechwana
mkVerb : (_: Str) -> Verb = \inf ->
let root = (tk 1 inf) ;
inf = inf ;
root2 = (tk 2 inf) ;
in {
s = table {
Root => root ;
Inf => inf ;
Inf_Fem => ((tk 1 root) + "y") ;
Inf_Obl => (tk 1 root) ;
Ablative => ((tk 1 root) + "WN") ;
VF tense person number gender => (mkCmnVF root root2 tense person number gender).s
}
} ;
mkIrrgVerb : (inf,root: Str) -> Verb = \inf,root ->
let root = root ;
in {
s = table {
Root => root ;
Inf => inf ;
Inf_Fem => ((tk 1 inf) + "y") ;
Inf_Obl => (tk 1 inf) ;
Ablative => ((tk 1 inf) + "WN") ;
VF tense person number gender => (mkCmnVF (root+"y") (root+"y") tense person number gender).s
}
} ;
mkCmnVF : Str -> Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \root,root2,t,p,n,g ->
{s = case (last root) of {
("a"|"A"|"y") => (mkCmnVF1 root t p n g).s ;
_ => (mkCmnVF1 root t p n g).s
}
};
mkCmnVF1 : Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \root,t,p,n,g ->
{s = let nadaa = root + "ndW" ; --root + variants{"nda";"Wnda"};
nadii = root + "Wn" ; --root + variants{"ndy";"Wndy"} ;
nade = root + "ndy" ; --root + variants{"ndy";"yndyn"} ;
nadiiaaN = root + "ndW"; --root + variants{"ndyaN";"WndyaN"};
ndi = root + "ndy";
nda = root + "nda" ;
ndywn = root + "ndyWn" ;
ndyn = root + "ndyn" ;
in
case <t,p,n,g> of {
<Subj,Pers1, Sg,_> => root + "an" ;
<Subj,Pers1, Sg,_> => root + "an" ;
<subj, Pers1, pl,Masc> => root + "Wn" ;
<subj, Pers1, pl,Fem> => root + "Wn" ;
<Subj,Pers2_Casual, Sg,_> => root +"yn";
<Subj,Pers2_Casual, Pl,_> => root + "W" ;
<Subj,Pers2_Respect, _, _> => root + "W" ;
<Subj,Pers3_Near, Sg,Masc> => root +"y";
<Subj,Pers3_Near, sg,Fem> => root +"y";
<Subj,Pers3_Near, pl,Masc> => root +"n";
<Subj,Pers3_Near, pl,Fem> => root +"n";
<Subj,Pers3_Distant,Sg,Masc> => root +"y";
<Subj,Pers3_Distant,Sg,Fem> => root +"y";
<Subj,Pers3_Distant,Pl,Masc> => root +"n";
<Subj,Pers3_Distant,Pl,Fem> => root +"n";
<Perf, Pers1,Sg,Masc> => root + "yL" ;
<Perf, Pers1,Sg,Fem> => root + "yL" ;
<Perf, Pers1,Pl,Masc> => root + "yL" ;
<Perf, Pers1,Pl,Fem> => root + "yL" ;
<Perf, Pers2_Casual,Sg,Masc> => root + "yL" ;
<Perf, Pers2_Casual,Sg,Fem> => root + "yL" ;
<Perf, Pers2_Casual,Pl,Masc> => root + "yL" ;
<Perf, Pers2_Casual,Pl,Fem> => root + "yL" ;
<Perf, Pers2_Respect,Sg,Masc> => root + "yL" ;
<Perf, Pers2_Respect,Sg,Fem> => root + "yL" ;
<Perf, Pers2_Respect,Pl,Masc> => root + "yL" ;
<Perf, Pers2_Respect,Pl,Fem> => root + "yL" ;
<Perf, _, Sg,Masc> => root + "yL" ;
<Perf, _, Sg,Fem> => root + "yL" ;
<Perf, _, Pl,Masc> => root + "yL" ;
<Perf, _, Pl,Fem> => root + "yL" ;
<Imperf, Pers1,Sg, Masc> => root + "ndW" ;
<Imperf, Pers1,Sg, Fem> => root + "ndy" ;
<Imperf, Pers1,Pl, Masc> => root + "nda" ;
<Imperf, Pers1,Pl, Fem> => root + "ndyWn" ;
<Imperf, Pers2_Casual, Sg, Masc> => root + "ndW" ;
<Imperf, Pers2_Casual, Sg, Fem> => root + "ndy" ;
<Imperf, Pers2_Casual, Pl, Masc> => root + "nda" ;
<Imperf, Pers2_Casual, Pl, Fem> => root + "ndyWn" ;
<Imperf, Pers2_Respect, Sg, Masc> => root + "nda" ;
<Imperf, Pers2_Respect, Sg, Fem> => root + "ndyWn" ;
<Imperf, Pers2_Respect, Pl, Masc> => root + "nda" ;
<Imperf, Pers2_Respect, Pl, Fem> => root + "ndyWn" ;
<Imperf, _, Sg, Masc> => root + "ndW" ;
<Imperf, _, Sg, Fem> => root + "ndy" ;
<Imperf, _, Pl, Masc> => root + "nda" ;
<Imperf, _, Pl, Fem> => root + "ndyWn"
}
} ;
mkCmnVF2 : Str -> VTense -> PPerson -> Number -> Gender -> {s:Str}= \inf,t,p,n,g ->
{s =
case <t,p,n,g> of {
<_, _, _,_> => inf
}
};
}

View File

@@ -0,0 +1,126 @@
concrete NumeralSnd of Numeral = CatSnd ** open ResSnd, Prelude in {
-- By Harald Hammarstroem
-- Modification for Punjabi by Shafqat Virk
flags coding=utf8 ;
param DForm = unit | ten ;
param DSize = sg | r2 | r3 | r4 | r5 | r6 | r7 | r8 | r9 ;
param Size = singl | less100 | more100 ;
oper LinDigit = {s : DForm => Str ; size : DSize ; n : Number} ;
lincat Dig = { s:Str ; n : Number};
lincat Digit = LinDigit ;
lincat Sub10 = {s : DForm => Str ; size : DSize ; n : Number} ;
lincat Sub100 = {s : Str ; size : Size ; n : Number} ;
lincat Sub1000 = {s : Str ; s2 : Str ; size : Size ; n : Number } ;
lincat Sub1000000 = { s : Str ; n : Number } ;
lin num x0 =
{s = table {
NCard => x0.s ;
NOrd => Prelude.glue x0.s "Wn" -- (mkOrd x0.s) need to use mkOrd which will make irregular ordinals but it gives path error
};
n = x0.n
} ;
oper mkOrd : Str -> Str =
\s -> case s of {
"h'k" => "ph'ryWn";
"B" => "ByWn";
"Ty" => "TyWn";
"car" => "cWaT'Wn";
_ => s ++ "WN"
};
-- {s = \\_ => x0.s ; n = x0.n} ;
oper mkNum : Str -> Str -> DSize -> LinDigit =
\do -> \bis -> \sz ->
{s = table {unit => do ; ten => bis } ;
size = sz ; n = Pl} ;
lin n2 = mkNum "B" "Wyh'" r2 ;
lin n3 = mkNum "Ty" "Tyh'" r3 ;
lin n4 = mkNum "car" "calyh'" r4 ;
lin n5 = mkNum "pnj" "pnjah'" r5 ;
lin n6 = mkNum "c'h'" "sT!h' " r6 ;
lin n7 = mkNum "st" "str" r7;
lin n8 = mkNum "aT! '" "asy" r8;
lin n9 = mkNum "nW" "nWy" r9 ;
oper mkR : Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> Str -> DSize => Str = \a1 -> \a2 -> \a3 -> \a4 -> \a5 -> \a6 -> \a7 -> \a8 -> \a9 -> table {
sg => a1 + "nh'n" ;
r2 => a2 + "yh' " ;
r3 => a3 + "yh' " ;
r4 => a4 + "alyh' " ;
r5 => a5 + "Wnjah' " ;
r6 => a6 + "h'T!" ;
r7 => a7 + "tr" ;
r8 => a8 + "asy" ;
r9 => a9 + "anWy"
} ;
oper rows : DSize => DSize => Str = table {
sg => mkR "yar " "ayk " "akT" "aykyt " "ayk" "ayk" "ayk" "ayk" "ayk" ;
r2 => mkR "Bay " "BaW" "BT" "Bae't" "Ba" "Ba" "Bah' " "Byy" "Byy" ;
r3 => mkR "Tyr " "TyW " "TyT" "Tyt" "Ty" "Ty" "Tyh' " "Ty" "ty" ;
r4 => mkR "cWD' " "cWW " "cWT" "cWe't " "cW" "cW" "cWh' " "cWr " "cWr" ;
r5 => mkR "pnd'r " "pnjW " "pnjT" "pnjyt" "pnj" "pnj" "pnjh'" "pnj" "pnj" ;
r6 => mkR "sWr " "c'W" "c'Ty" "c'ae't" "c'a" "c'a" "c'ah'" "c'" "c'" ;
r7 => mkR "str" "staW" "stT " "styt" "st" "st" "st" "st" "st" ;
r8 => mkR "arR" "aT!aW " "aT!T" "aT!y" "aT!" "aT!" "aT!a" "aT!" "aT!" ;
r9 => table {sg => "at'Wyh' " ; r2 => "at'Tyh' " ; r3 => "at'ytalyh' " ;
r4 => "at'Wnjah' " ; r5 => "at'h'T! " ; r6 => "at'tr " ;
r7 => "at'asy " ;
r8 => "at'anWy " ; r9 => "nWanWy" }
} ;
oper ss : Str -> {s : Str} = \s -> {s = s} ;
lin pot01 = {s = table {unit => "h'k" ; _ => "dmy" } ; size = sg ; n = Sg} ;
lin pot0 d = d ;
lin pot110 = {s = "D'h' " ; size = less100 ; n = Pl} ;
lin pot111 = {s = rows ! sg ! sg ; size = less100 ; n = Pl} ;
lin pot1to19 d = {s = rows ! d.size ! sg ; size = less100 ; n = d.n} ;
lin pot0as1 n = {s = n.s ! unit ; size = table {sg => singl ; _ => less100} ! n.size ; n = n.n } ;
lin pot1 d = {s = d.s ! ten ; size = less100 ; n = d.n} ;
lin pot1plus d e = {s = rows ! e.size ! d.size ; size = less100 ; n = d.n} ;
lin pot1as2 n = {s = n.s ; s2 = "dmy" ; size = n.size ; n = n.n} ;
lin pot2 d = {s = (mksau (d.s ! unit) d.size) ;
s2 = d.s ! unit ++ "lk' " ; size = more100 ; n = d.n} ;
lin pot2plus d e =
{s = (mksau (d.s ! unit) d.size) ++ e.s ;
s2 = (d.s ! unit) ++ "lk' " ++ (mkhazar e.s e.size) ;
size = more100 ; n = d.n} ;
lin pot2as3 n = {s = n.s ; n = n.n} ;
lin pot3 n = {s = table { singl => ekhazar ;
less100 => n.s ++ "h'zar" ;
more100 => n.s2 } ! n.size ; n = n.n} ;
lin pot3plus n m =
{s = table {singl => ekhazar ;
less100 => n.s ++ "h'zar" ;
more100 => n.s2 } ! n.size ++ m.s ; n = n.n} ;
lin D_0 = { s = "N0" ; n = Sg};
lin D_1 = { s = "N1" ; n = Sg};
lin D_2 = { s = "N2" ; n = Pl};
lin D_3 = { s = "N3" ; n = Pl};
lin D_4 = { s = "N4" ; n = Pl};
lin D_5 = { s = "N5" ; n = Pl};
lin D_6 = { s = "N6" ; n = Pl};
lin D_7 = { s = "N7" ; n = Pl};
lin D_8 = { s = "N8" ; n = Pl};
lin D_9 = { s = "N9" ; n = Pl};
lin IDig d = { s = \\_ => d.s ; n = d.n} ;
lin IIDig d dg = { s = \\df => Prelude.glue (dg.s ! df) d.s ; n = Pl };
oper ekhazar : Str = variants {"h'zar" ; "h'k" ++ "h'zar"} ;
oper mkhazar : Str -> Size -> Str = \s -> \sz -> table {singl => ekhazar ; _ => s ++ "h'zar"} ! sz ;
oper mksau : Str -> DSize -> Str = \s -> \sz -> table {sg => "h'k" ++ "sW" ; _ => s ++ "sW"} ! sz ;
}

View File

@@ -0,0 +1,75 @@
concrete QuestionSnd of Question = CatSnd ** open ResSnd, Prelude in {
flags optimize=all_subs ;
coding = utf8;
lin
QuestCl cl = {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! OQuest;
QIndir => "jykD'h'n" ++ cl.s ! t! p ! ODir
}
};
QuestVP qp vp =
let cl = mkSClause ("") (Ag qp.g qp.n Pers3_Near) vp;
qp1 = qp.s ! Dir;
qp2 = qp.s ! Obl ++ "jy"
in { s = \\t,p,o => case t of {
VPImpPast => case vp.subj of {VIntrans => qp1 ++ cl.s ! t ! p ! ODir; _ => qp2 ++ cl.s ! t ! p ! ODir};
_ => qp1 ++ cl.s ! t ! p ! ODir
}
};
QuestSlash ip slash =
let ip1 = ip.s ! Dir;
ip2 = ip.s ! Obl ++ "jy"
in {
s = \\t,p,o => case t of {
VPImpPast => ip2 ++ slash.s ! t ! p ! ODir;
_ => ip1 ++ slash.s ! t ! p ! ODir
}
};
QuestIAdv iadv cl = {
s = \\t,p,_ => iadv.s ++ cl.s ! t ! p ! ODir;
};
QuestIComp icomp np =
let cl = mkSClause (np.s ! NPC Dir ++ icomp.s) np.a (predAux auxBe);
in {
s = \\t,p,qf => case qf of {
QDir => cl.s ! t ! p ! ODir;
QIndir => cl.s ! t! p ! ODir
}
};
PrepIP p ip = {s = ip.s ! ResSnd. Voc ++ p.s } ;
AdvIP ip adv = {
s = \\c => adv.s ! ip.g ++ ip.s ! c ;
n = ip.n;
g = ip.g;
} ;
IdetCN idet cn = {
s = \\c => idet.s ! cn.g ++ cn.s ! idet.n ! c ;
g = cn.g;
n = idet.n;
} ;
IdetIP idet = {
s = \\_ => idet.s ! Masc ;
n = idet.n;
g = Masc;
} ;
IdetQuant iqant num = {
s = \\g => iqant.s ! num.n ! g ++ num.s ;
n = num.n
} ;
CompIAdv a = a ;
CompIP p = ss (p.s ! Dir) ;
AdvIAdv i a = {s = i.s ++ a.s ! Masc} ;
}

View File

@@ -0,0 +1,90 @@
concrete RelativeSnd of Relative = CatSnd ** open ResSnd in {
flags optimize=all_subs ;
coding = utf8;
lin
RelCl cl = {
s = \\t,p,o,agr => case <t,giveNumber agr,giveGender agr> of {
<VPImpPast,Sg,_> => "jh'nk'y" ++ cl.s ! t ! p ! o ;
<VPImpPast,Pl,_> => "jh'njW" ++ cl.s ! t ! p ! o ;
<_,Sg,Masc> => "jyh'RW" ++ cl.s ! t ! p ! o ;
<_,Sg,Fem> => "jyh'Ra" ++ cl.s ! t ! p ! o ;
<_,Pl,Masc> => "jyh'Ra" ++ cl.s ! t ! p ! o ;
<_,Pl,Fem> => "jyh'RyWn" ++ cl.s ! t ! p ! o
};
c = Dir
} ;
-- RelVP and RelSlash slows the linking process a lot this is why it is commented for test purposes
RelVP rp vp = {
s = \\t,p,o,ag =>
let
agr = case rp.a of {
RNoAg => ag ;
RAg a => a
} ;
cl = mkSClause (rp.s ! (giveNumber agr) ! (giveGender agr) ! Dir) agr vp;
-- cl = case t of {
-- VPImpPast => mkSClause (rp.s ! (giveNumber agr) ! Obl) agr vp;
-- _ => mkSClause (rp.s ! (giveNumber agr) ! Dir) agr vp
-- };
in
cl.s ! t ! p ! ODir ;
c = Dir
} ;
---- Pied piping: "at which we are looking". Stranding and empty
---- relative are defined in $ExtraHin.gf$ ("that we are looking at",
---- "we are looking at").
--
RelSlash rp slash = {
s = \\t,p,o,agr => rp.s ! (giveNumber agr) ! (giveGender agr) ! Obl ++ slash.c2.s ++ slash.s ! t ! p ! o ;
c = Dir
} ;
FunRP p np rp = {
s = \\n,g,c => rp.s ! n ! g ! c ++ np.s ! NPC c ++ p.s ;
a = RAg np.a
} ;
IdRP = {
s = table {
Sg => table {
Masc => table {
ResSnd.Dir => "jh'Ra" ;
ResSnd.Obl => "jnh'n" ;
ResSnd.Voc => "jh'Ry" ;
ResSnd.Abl => "jh'Ry"
};
Fem => table {
ResSnd.Dir => "jh'Ry" ;
ResSnd.Obl => "jnh'n" ;
ResSnd.Voc => "jh'Ry" ;
ResSnd.Abl => "jh'Ry"
}
};
Pl => table {
Masc => table {
ResSnd.Dir => "jh'Ry" ;
ResSnd.Obl => "jh'Ry" ;
ResSnd.Voc => "jh'Ry" ;
ResSnd.Abl => "jh'Ry"
};
Fem => table {
ResSnd.Dir => "jh'Ry" ;
ResSnd.Obl => "jh'Ry" ;
ResSnd.Voc => "jh'Ry" ;
ResSnd.Abl => "jh'Ry"
}
}
};
a = RNoAg
} ;
}

View File

@@ -0,0 +1,673 @@
--# -path=.:../abstract:../common:../../prelude
--
--1 Sndu auxiliary operations.
--
-- This module contains operations that are needed to make the
-- resource syntax work.
resource ResSnd = ParamX ** open Prelude,Predef in {
flags optimize=all ;
coding = utf8;
param
Case = Dir | Obl | Voc | Abl ;
Gender = Masc | Fem ;
VTense = Subj | Perf | Imperf;
PPerson = Pers1
| Pers2_Casual
| Pers2_Respect
| Pers3_Near
| Pers3_Distant;
Order = ODir | OQuest ;
--2 For $Relative$
RAgr = RNoAg | RAg Agr ;
RCase = RC Number Case ;
-- for Numerial
CardOrd = NCard | NOrd ;
VerbForm4 =
VF VTense PPerson Number Gender
| Inf | Inf_Fem | Inf_Obl | Ablative
| Root ;
oper
Noun = {s : Number => Case => Str ; g : Gender} ;
Verb = {s : VerbForm4 => Str} ;
Preposition = {s : Str};
DemPronForm = {s : Number => Gender => Case => Str};
-- PossPronForm = {s : Number => Gender => Case => Str};
Determiner = {s : Number => Gender => Str ; n : Number};
-----------------------------------------------
-- Snd Adjectives
-----------------------------------------------
Adjective1 = {s : Number => Gender => Case => Str} ;
mkAdj1 : Str -> Adjective1 ;
mkAdj1 nyrw = let end = last (nyrw) ;
--nyr = if_then_else Str (eq end "y") nyrw (tk 1 nyrw)
nyr = (tk 1 nyrw)
in adj1 (nyrw) (nyr+"y") ( nyr+"a") (nyr+"a") (nyrw) (nyr+"y") (nyr+"y") (nyr+"y")
(nyr+"a") (nyr+"n") ( nyr+"a") (nyr+"a") (nyr+"yWn") (nyr+"yn") (nyr+"yn") (nyr+"yWn") ;
adj1 :(x1,_,_,_,_,_,_, _,_,_,_,_,_,_,_, x16 : Str) -> {s : Number => Gender => Case => Str} =
\msd,mso,msv,msa, fsd,fso,fsv,fsa, mpd,mpo,mpv,mpa, fpd,fpo,fpv,fpa -> {
s = table {
Sg => (cmnAdj msd mso msv msa fsd fso fsv fsa).s ;
Pl => (cmnAdj mpd mpo mpv mpa fpd fpo fpv fpa).s
}
};
mkAdj2 : Str -> Adjective1 ;
mkAdj2 young = adj1 (young) (young) (young ) (young) (young) (young) (young) (young)
(young) (young) (young ) (young) (young+"yn") (young+"yn") (young+"yn") (young+"yn") ;
mkAdj3 : Str -> Adjective1 ;
mkAdj3 acank = adj1 acank acank acank acank acank acank acank acank acank acank acank acank acank acank acank acank ;
cmnAdj : (x1,_,_,_,_,_,_,x8 : Str) -> {s : Gender => Case => Str} =
\sd,so,sv,sa, pd,po,pv,pa -> {
s = table {
Masc => table {
Dir => sd ;
Obl => so ;
Voc => sv ;
Abl => sa
} ;
Fem => table {
Dir => pd ;
Obl => po ;
Voc => pv ;
Abl => pa
}
}
} ;
RefPron : Str;
RefPron = "pat'";
----------------------------------------------------------
-- Grammar part
----------------------------------------------------------
param
Agr = Ag Gender Number PPerson ;
NPCase = NPC Case | NPObj | NPErg ;
oper
np2pronCase : (Case => Str) -> NPCase -> Agr -> Str = \ppf,npc,a -> case npc of {
NPC c => ppf ! c;
NPObj => ppf ! Obl ;
NPErg => case (fromAgr a).p of {
(Pers3_Near|Pers3_Distant) => ppf ! Dir ++ "jy" ;
_ => ppf ! Dir
}
} ;
toNP : ( Case => Str) -> NPCase -> Str = \pn, npc -> case npc of {
NPC c => pn ! c ;
NPObj => pn ! Dir ;
NPErg => pn ! Obl
} ;
detcn2NP : (Determiner) -> Noun -> NPCase -> Number -> Str = \dt,cn,npc,nn -> case npc of {
NPC c => dt.s ! Sg ! Masc ++ cn.s ! nn ! c ;
NPObj => dt.s ! Sg ! Masc ++ cn.s ! nn ! Dir ;
NPErg => dt.s ! Sg ! Masc ++ cn.s ! nn ! Obl
} ;
det2NP : (Determiner) -> NPCase -> Str = \dt,npc -> case npc of {
NPC c => dt.s ! Sg ! Masc ;
NPObj => dt.s ! Sg ! Masc ;
NPErg => dt.s ! Sg ! Masc
} ;
oper
------------------------------------------
-- Agreement transformations
-----------------------------------------
toAgr : Number -> PPerson -> Gender -> Agr = \n,p,g ->
Ag g n p;
fromAgr : Agr -> {n : Number ; p : PPerson ; g : Gender} = \a -> case a of {
Ag g n p => {n = n ; p = p ; g = g}
} ;
conjAgr : Agr -> Agr -> Agr = \a0,b0 ->
let a = fromAgr a0 ; b = fromAgr b0
in
toAgr
(conjNumber a.n b.n)
b.p a.g;
giveNumber : Agr -> Number =\a -> case a of {
Ag _ n _ => n
};
giveGender : Agr -> Gender =\a -> case a of {
Ag g _ _ => g
};
defaultAgr : Agr = agrP3 Masc Sg ;
agrP3 : Gender -> Number -> Agr = \g,n -> Ag g n Pers3_Distant ;
personalAgr : Agr = agrP1 Masc Sg ;
agrP1 : Gender -> Number -> Agr = \g,n -> Ag g n Pers1 ;
param
CPolarity =
CPos
| CNeg Bool ; -- contracted or not
oper
contrNeg : Bool -> Polarity -> CPolarity = \b,p -> case p of {
Pos => CPos ;
Neg => CNeg b
} ;
NP : Type = {s : NPCase => Str ; a : Agr ; isPron : Bool} ;
param
CTense = CPresent | CPast | CFuture | CContinuous;
oper
copula : CTense -> Number -> PPerson -> Gender -> Str = \t,n,p,g ->
case <t,n,p,g> of {
<CPresent,Sg,Pers1,Masc > => "T'W";
<CPresent,Sg,Pers1,Fem > => "T'y" ;
<CPresent,Sg,Pers2_Casual,Masc > => "T'W" ;
<CPresent,Sg,Pers2_Casual,Fem > => "T'y" ;
<CPresent,Sg,Pers2_Respect,Masc > => "T'a" ;
<CPresent,Sg,Pers2_Respect,Fem > => "T'yWn" ;
<CPresent,Sg,Pers3_Near,Masc > => "T'W" ;
<CPresent,Sg,Pers3_Near,Fem > => "T'y" ;
<CPresent,Sg,Pers3_Distant,Masc > => "T'W" ;
<CPresent,Sg,Pers3_Distant,Fem > => "T'y" ;
<CPresent,Pl,Pers1,Masc > => "T'a" ;
<CPresent,Pl,Pers1,Fem > => "T'yWn" ;
<CPresent,Pl,Pers2_Casual,Masc > => "T'a" ;
<CPresent,Pl,Pers2_Casual,Fem > => "T'y" ;
<CPresent,Pl,Pers2_Respect,Masc > => "T'a" ;
<CPresent,Pl,Pers2_Respect,Fem > => "T'yWn" ;
<CPresent,Pl,Pers3_Near,Masc > => "T'a" ;
<CPresent,Pl,Pers3_Near,Fem > => "T'yWn" ;
<CPresent,Pl,Pers3_Distant,Masc > => "T'a" ;
<CPresent,Pl,Pers3_Distant,Fem > => "T'yWn" ;
<CPast,Sg,Pers1,Masc > => "h'ym" ;
<CPast,Sg,Pers1,Fem > => "h'ym" ;
<CPast,Sg,Pers2_Casual,Masc > => "h'e'yn" ;
<CPast,Sg,Pers2_Casual,Fem > => "h'e'yn" ;
<CPast,Sg,Pers2_Respect,Masc > => "h'e'W" ;
<CPast,Sg,Pers2_Respect,Fem > => "h'e'yWn" ;
<CPast,Sg,Pers3_Near,_ > => "ah'y" ;
-- <CPast,Sg,Pers3_Near,Fem > => "ah'e'" ;
<CPast,Sg,Pers3_Distant,Masc > => "h'yW" ;
<CPast,Sg,Pers3_Distant,Fem > => "h'e'y" ;
<CPast,Pl,Pers1,Masc > => "h'e'asyn" ;
<CPast,Pl,Pers1,Fem > => "h'yWsyn" ;
<CPast,Pl,Pers2_Casual,_ > => "h'e'a" ;
<CPast,Pl,Pers2_Respect,_ > => "h'yW" ;
<CPast,Pl,Pers3_Near,Masc > => "h'e'a" ;
<CPast,Pl,Pers3_Near,Fem > => "h'e'yWn" ;
<CPast,Pl,Pers3_Distant,Masc > => "h'e'a" ;
<CPast,Pl,Pers3_Distant,Fem > => "h'yWn" ;
<CFuture,Sg,Pers1,Masc > => "h'Wnds" ;
<CFuture,Sg,Pers1,Fem > => "h'Wnds" ;
<CFuture,Sg,Pers2_Casual,Masc > => "h'Wndyn" ;
<CFuture,Sg,Pers2_Casual,Fem > => "h'Wndyn" ;
<CFuture,Sg,Pers2_Respect,Masc > => "h'WndWe' " ;
<CFuture,Sg,Pers2_Respect,Fem > => "h'WndWe' " ;
<CFuture,Sg,Pers3_Near,Masc > => "h'WndW " ;
<CFuture,Sg,Pers3_Near,Fem > => "h'Wndy" ;
<CFuture,Sg,Pers3_Distant,Masc > => "h'WndW " ;
<CFuture,Sg,Pers3_Distant,Fem > => "h'Wndy" ;
<CFuture,Pl,Pers1,Masc > => "h'Wndasyn" ;
<CFuture,Pl,Pers1,Fem > => "h'WndyWnsyn" ;
<CFuture,Pl,Pers2_Casual,Masc > => "h'WndWe' " ;
<CFuture,Pl,Pers2_Casual,Fem > => "h'WndyWyn" ;
<CFuture,Pl,Pers2_Respect,Masc > => "h'WndWe' " ;
<CFuture,Pl,Pers2_Respect,Fem > => "h'WndyWyn" ;
<CFuture,Pl,Pers3_Near,Masc > => "h'Wnda" ;
<CFuture,Pl,Pers3_Near,Fem > => "h'WndyWn" ;
<CFuture,Pl,Pers3_Distant,Masc > => "h'Wnda" ;
<CFuture,Pl,Pers3_Distant,Fem > => "h'WndyWn" ;
<CContinuous,Sg,Pers1,Masc > => "ah'yan" ;
<CContinuous,Sg,Pers1,Fem > => "ah'yan" ;
<CContinuous,Sg,Pers2_Casual,Masc > => "ah'yn" ;
<CContinuous,Sg,Pers2_Casual,Fem > => "ah'yn" ;
<CContinuous,Sg,Pers2_Respect,Masc > => "ah'yW " ;
<CContinuous,Sg,Pers2_Respect,Fem > => "ah'yW " ;
<CContinuous,Sg,Pers3_Near,Masc > => "ah'y " ;
<CContinuous,Sg,Pers3_Near,Fem > => "ah'y" ;
<CContinuous,Sg,Pers3_Distant,Masc > => "ah'y " ;
<CContinuous,Sg,Pers3_Distant,Fem > => "ah'y" ;
<CContinuous,Pl,Pers1,Masc > => "ah'yWn" ;
<CContinuous,Pl,Pers1,Fem > => "ah'yWn" ;
<CContinuous,Pl,Pers2_Casual,Masc > => "ah'yW " ;
<CContinuous,Pl,Pers2_Casual,Fem > => "ah'yW " ;
<CContinuous,Pl,Pers2_Respect,Masc > => "ah'yW " ;
<CContinuous,Pl,Pers2_Respect,Fem > => "ah'yW " ;
<CContinuous,Pl,Pers3_Near,Masc > => "ah'n" ;
<CContinuous,Pl,Pers3_Near,Fem > => "ah'n" ;
<CContinuous,Pl,Pers3_Distant,Masc > => "ah'n" ;
<CContinuous,Pl,Pers3_Distant,Fem > => "ah'n"
} ;
param
VPPTense =
VPPres
|VPPast
|VPFutr
|VPPerf;
VPHTense =
VPGenPres -- impf hum nahim "I go"
| VPImpPast -- impf Ta nahim "I went"
| VPFut -- fut na/nahim "I shall go"
| VPContPres -- stem raha hum nahim "I am going"
| VPContPast -- stem raha Ta nahim "I was going"
| VPContFut
| VPPerfPres -- perf hum na/nahim "I have gone"
| VPPerfPast -- perf Ta na/nahim "I had gone"
| VPPerfFut
| VPPerfPresCont
| VPPerfPastCont
| VPPerfFutCont
| VPSubj -- subj na "I may go"
;
VPHForm =
VPTense VPPTense Agr -- 9 * 12
| VPReq
| VPImp
| VPReqFut
| VPInf
| VPStem
;
VType = VIntrans | VTrans | VTransPost ;
oper
objVType : VType -> NPCase = \vt -> case vt of {
VTrans => NPObj ;
_ => NPC Obl
} ;
VPH : Type = {
s : VPHForm => {fin, inf : Str} ;
obj : {s : Str ; a : Agr} ;
subj : VType ;
comp : Agr => Str;
inf : Str;
ad : Str;
embComp : Str ;
prog : Bool ;
} ;
VPHSlash = VPH ** {c2 : Compl} ;
oper
Compl : Type = {s : Str ; c : VType} ;
predV : Verb -> VPH = \verb -> {
s = \\vh =>
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CPresent n p g ; inf = verb.s ! VF Subj p n g } ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf =verb.s ! VF Perf p n g} ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = verb.s ! VF Imperf p n g } ;
VPTense VPPerf (Ag g n p) => { fin = [] ; inf = verb.s ! Root ++ cka g n } ;
VPStem => {fin = [] ; inf = verb.s ! Root};
VPInf => {fin = verb.s!Inf_Obl ; inf = verb.s ! Root};
VPImp => {fin = verb.s!VF Subj Pers3_Near Pl Masc ; inf = verb.s ! Root};
VPReq => {fin = [] ; inf = verb.s!VF Subj Pers1 Pl Masc};
_ => {fin = [] ; inf = verb.s ! Root}
};
obj = {s = [] ; a = defaultAgr} ;
subj = VIntrans ;
inf = verb.s ! Inf;
ad = [];
embComp = [];
prog = False ;
comp = \\_ => []
} ;
predVc : (Verb ** {c2,c1 : Str}) -> VPHSlash = \verb ->
predV verb ** {c2 = {s = verb.c1 ; c = VTrans} } ;
-------------------------
-- added for cauitives
predVcc : (Verb **{c2:Compl}) -> VPHSlash = \verb ->
predV verb ** {c2 = {s = "" ; c = VTrans} } ;
------------------------
raha : Gender -> Number -> Str = \g,n ->
(mkAdj1 "rya").s ! n ! g ! Dir ;
rahanDa : Gender -> Number -> Str = \g,n ->
(mkAdj1 "rh'nda").s ! n ! g ! Dir ;
pya : Gender -> Number -> Str = \g,n ->
(mkAdj1 "pya").s ! n ! g ! Dir ;
cka : Gender -> Number -> Str = \g,n ->
(mkAdj1 "gya").s ! n ! g ! Dir ;
hw : PPerson -> Number -> Str = \pp,n ->
case <pp,n> of {
<Pers1,_> => "hwwaN";
<Pers2_Casual,Sg> => "hwwyN";
<Pers2_Casual,Pl> => "hww";
<Pers2_Respect,_> => "hww";
<Pers3_Distant,Sg> => "hwwE";
<Pers3_Distant,Pl> => "hwn";
<Pers3_Near,Sg> => "hwwE";
<Pers3_Near,Pl> => "hwn"
};
predAux : Aux -> VPH = \verb -> {
s = \\vh =>
let
inf = verb.inf ;
part = verb.ppart ;
in
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CContinuous n p g ; inf = part } ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf = part } ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = part ++ hw p n } ;
VPStem => {fin = [] ; inf = "rh" };
_ => {fin = part ; inf = inf }
};
obj = {s = [] ; a = defaultAgr} ;
subj = VIntrans ;
inf = verb.inf;
ad = [];
embComp = [];
prog = False ;
comp = \\_ => []
} ;
Aux = {
inf,ppart,prpart : Str
} ;
auxBe : Aux = {
inf = "" ;
ppart = "" ;
prpart = ""
} ;
predProg : VPH -> VPH = \verb -> {
s = \\vh =>
case vh of {
VPTense VPPres (Ag g n p) => {fin = copula CPresent n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ pya g n} ;
VPTense VPPast (Ag g n p) => {fin = copula CPast n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ pya g n} ;
VPTense VPFutr (Ag g n p) => {fin = copula CFuture n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf } ;
VPTense VPPerf (Ag g n p) => {fin = copula CPast n p g ; inf = (verb.s!VPTense VPPres (Ag g n p)).inf ++ raha g n } ;
VPStem => {fin = [] ; inf = (verb.s!VPStem).inf };
_ => {fin = [] ; inf = [] }
};
obj = verb.obj ;
subj = VIntrans ;
inf = verb.inf;
ad = verb.ad;
embComp = verb.embComp;
prog = True ;
comp = verb.comp
} ;
Clause : Type = {s : VPHTense => Polarity => Order => Str} ;
mkClause : NP -> VPH -> Clause = \np,vp -> {
s = \\vt,b,ord =>
let
subjagr : NPCase * Agr = case vt of {
VPImpPast => case vp.subj of {
VTrans => <NPErg, vp.obj.a> ;
VTransPost => <NPErg, defaultAgr> ;
_ => <NPC Dir, np.a>
} ;
_ => <NPC Dir, np.a>
} ;
subj = subjagr.p1 ;
agr = subjagr.p2 ;
n = (fromAgr agr).n;
p = (fromAgr agr).p;
g = (fromAgr agr).g;
vps = case vt of {
VPGenPres => vp.s ! VPTense VPPres agr ;
VPImpPast => vp.s ! VPTense VPPast agr ;
VPFut => case vp.prog of { True => {fin = (vp.s ! VPTense VPFutr agr).fin ; inf = (vp.s ! VPTense VPFutr agr).inf ++ hw p n} ;
_ => vp.s ! VPTense VPFutr agr } ;
VPContPres =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPContPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPContFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPPres agr).inf ++ raha g n } ;
VPPerfPres =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
-- {fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfPast =>
-- {fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
VPPerfFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPPast agr).inf } ;
VPPerfPresCont =>
{fin = copula CContinuous n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ raha g n} ;
VPPerfPastCont =>
{fin = copula CPast n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ rahanDa g n} ;
VPPerfFutCont =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPTense VPFutr agr).inf ++ rahanDa g n} ;
VPSubj => case vp.prog of { True => {fin = (vp.s ! VPTense VPFutr agr).inf ++ hw p n ; inf = "Xayd" } ;
_ => {fin = (vp.s ! VPTense VPFutr agr).inf ; inf = "Xayd" } }
};
quest =
case ord of
{ ODir => [];
OQuest => "c'a" };
na =
case b of
{ Pos => [];
Neg => "n" };
nahim =
case b of
{ Pos => [];
Neg => "n" };
in
case vt of {
VPSubj => quest ++ np.s ! subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! np.a ++ vps.inf ++ na ++ vps.fin ++ vp.embComp ;
_ => quest ++ np.s ! subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! np.a ++ vps.inf ++ nahim ++ vps.fin ++ vp.embComp};
} ;
mkSClause : Str -> Agr -> VPH -> Clause =
\subj,agr,vp -> {
s = \\t,b,ord =>
let
n = (fromAgr agr).n;
p = (fromAgr agr).p;
g = (fromAgr agr).g;
vps = case t of {
VPGenPres => vp.s ! VPTense VPPres agr ;
VPImpPast => vp.s ! VPTense VPPast agr ;
VPFut => vp.s ! VPTense VPFutr agr ;
VPContPres =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPContPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPContFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ pya g n ++ hw p n } ;
VPPerfPres =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfPast =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ cka g n } ;
VPPerfFut =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ cka g n ++ hw p n } ;
VPPerfPresCont =>
{fin = copula CPresent n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPPerfPastCont =>
{fin = copula CPast n p g ; inf = (vp.s ! VPStem).inf ++ pya g n } ;
VPPerfFutCont =>
{fin = copula CFuture n p g ; inf = (vp.s ! VPStem).inf ++ pya g n ++ hw p n } ;
VPSubj => {fin = (vp.s ! VPTense VPPres agr).inf ; inf = "Xayd" }
};
quest =
case ord of
{ ODir => [];
OQuest => "c'a" };
na =
case b of
{ Pos => [];
Neg => "n" };
nahim =
case b of
{ Pos => [];
Neg => "n" };
in
case t of {
VPSubj => quest ++ subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! agr ++ vps.inf ++ na ++ vps.fin ++ vp.embComp;
_ => quest ++ subj ++ vp.obj.s ++ vp.ad ++ vp.comp ! agr ++ vps.inf ++ nahim ++ vps.fin ++ vp.embComp};
} ;
insertSubj : PPerson -> Str -> Str = \p,s ->
case p of { Pers1 => s ++ "wN" ; _ => s ++ ""};
insertObj : (Agr => Str) -> VPH -> VPH = \obj1,vp -> {
s = vp.s ;
obj = vp.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp;
prog = vp.prog ;
comp = \\a => vp.comp ! a ++ obj1 ! a
} ;
insertVV : Str -> VPH -> Str -> VPH -> VPH = \obj1,vp,emb,vp2 -> {
s = vp.s ;
obj = vp2.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp ++ emb; -- this should be covered in urdu as well
prog = vp.prog ;
comp = \\a => vp.comp ! a ++ obj1
} ;
insertObj2 : (Str) -> VPH -> VPH = \obj1,vp -> {
s = vp.s;
obj = vp.obj ;
subj = vp.subj ;
inf = vp.inf;
ad = vp.ad;
embComp = vp.embComp ++ obj1;
prog = vp.prog ;
comp = vp.comp
} ;
insertObjc : (Agr => Str) -> VPHSlash -> VPHSlash = \obj,vp ->
insertObj obj vp ** {c2 = vp.c2} ;
insertObjc2 : Str -> VPHSlash -> VPHSlash = \obj,vp ->
insertObj2 obj vp ** {c2 = vp.c2} ;
infVP : Bool -> VPH -> Agr -> Str = \isAux,vp,a ->
vp.obj.s ++ vp.inf ++ vp.comp ! a ;
infVV : Bool -> VPH -> Str = \isAux,vp ->
case isAux of {False => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ vp.inf ; True => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ (vp.s ! VPImp).fin }; -- need to be checked and should be covered in urdu as well
infV2V : Bool -> VPH -> Str = \isAux,vp ->
case isAux of {False => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ vp.inf ++ "dy" ; True => (vp.comp ! (toAgr Sg Pers1 Masc)) ++ (vp.s ! VPImp).fin ++ "dy"}; -- need to be checked and should be covered in urdu as well
insertObject : NP -> VPHSlash -> VPH = \np,vps -> {
s = vps.s ;
obj = case np.isPron of {
False => {s = vps.obj.s ++ np.s ! objVType vps.c2.c ++ vps.c2.s ; a = np.a} ;
_ => {s = vps.obj.s ++ np.s ! objVType vps.c2.c ++ vps.c2.s ; a = np.a}
};
subj = vps.c2.c ;
inf = vps.inf;
ad = vps.ad;
embComp = vps.embComp;
prog = vps.prog ;
comp = vps.comp
} ;
insertObjPre : (Agr => Str) -> VPHSlash -> VPH = \obj,vp -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj ;
ad = vp.ad ;
embComp = vp.embComp;
prog = vp.prog ;
comp = \\a => obj ! a ++ vp.c2.s ++ vp.comp ! a
} ;
insertAdV : Str -> VPH -> VPH = \ad,vp -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj;
ad = vp.ad ++ ad ;
embComp = vp.embComp;
prog = vp.prog ;
comp = vp.comp
} ;
conjThat : Str = "t" ;
checkPron : NP -> Str -> Str = \np,str -> case (np.isPron) of {
True => np.s ! NPC Obl;
False => np.s ! NPC Obl ++ str} ;
insertEmbCompl : VPH -> Str -> VPH = \vp,emb -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = vp.subj;
ad = vp.ad;
embComp = vp.embComp ++ emb;
prog = vp.prog ;
comp = vp.comp
} ;
insertTrans : VPH -> VType -> VPH = \vp,vtype -> {
s = vp.s ;
obj = vp.obj ;
inf = vp.inf ;
subj = case vtype of {VIntrans => VTransPost ; VTrans => VTrans ; _ => vtype} ; -- still some problem not working properly
ad = vp.ad;
embComp = vp.embComp ;
prog = vp.prog ;
comp = vp.comp
} ;
}

View File

@@ -0,0 +1,104 @@
concrete SentenceSnd of Sentence = CatSnd ** open Prelude, ResSnd in {
flags optimize=all_subs ;
coding = utf8;
lin
PredVP np vp = mkClause np vp ;
PredSCVP sc vp = mkSClause sc.s (defaultAgr) vp ;
ImpVP vp = {
s = \\pol,n =>
let
agr = Ag Masc (numImp n) Pers2_Casual ;
-- verb = infVP True vp agr ;
verb = (vp.s ! VPImp).inf ++ vp.comp ! agr ;
dont = case pol of {
CNeg True => "n" ;
CNeg False => "n" ;
_ => []
}
in
dont ++ verb
} ;
SlashVP np vp =
mkClause np vp ** {c2 = vp.c2} ;
AdvSlash slash adv = {
s = \\t,p,o => adv.s ! Masc ++ slash.s ! t ! p ! o ;
c2 = slash.c2
} ;
SlashPrep cl prep = cl ** {c2 = { s = prep.s ; c = VIntrans}} ;
SlashVS np vs slash =
mkClause np
(insertObj2 (conjThat ++ slash.s) (predV vs)) **
{c2 = slash.c2} ;
EmbedS s = {s = conjThat ++ s.s} ;
EmbedQS qs = {s = qs.s ! QIndir} ;
EmbedVP vp = {s = infVP False vp defaultAgr} ; --- agr
UseCl temp p cl =
{ s = case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ cl.s ! VPGenPres ! p.p ! ODir;
<Pres,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPres ! p.p ! ODir;
<Past,Simul> => temp.s ++ p.s ++ cl.s ! VPImpPast ! p.p ! ODir;
<Past,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPast ! p.p ! ODir;
<Fut,Simul> => temp.s ++ p.s ++ cl.s ! VPFut ! p.p ! ODir;
<Fut,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfFut ! p.p ! ODir;
<Cond,Simul> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! ODir;
<Cond,Anter> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! ODir -- this needs to be fixed by making SubjPerf in ResPnb
};
} ;
UseQCl temp p cl = {
s = \\q => case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ cl.s ! VPGenPres ! p.p ! q;
<Pres,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPres ! p.p ! q;
<Past,Simul> => temp.s ++ p.s ++ cl.s ! VPImpPast ! p.p ! q;
<Past,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfPast ! p.p ! q;
<Fut,Simul> => temp.s ++ p.s ++ cl.s ! VPFut ! p.p ! q;
<Fut,Anter> => temp.s ++ p.s ++ cl.s ! VPPerfFut ! p.p ! q;
<Cond,Simul> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! q;
<Cond,Anter> => temp.s ++ p.s ++ cl.s ! VPSubj ! p.p ! q
};
} ;
UseRCl temp p rcl = {
s = \\q => case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ rcl.s ! VPGenPres ! p.p ! ODir ! q;
<Pres,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfPres ! p.p ! ODir ! q;
<Past,Simul> => temp.s ++ p.s ++ rcl.s ! VPImpPast ! p.p ! ODir ! q;
<Past,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfPast ! p.p ! ODir ! q;
<Fut,Simul> => temp.s ++ p.s ++ rcl.s ! VPFut ! p.p ! ODir ! q;
<Fut,Anter> => temp.s ++ p.s ++ rcl.s ! VPPerfFut ! p.p ! ODir ! q;
<Cond,Simul> => temp.s ++ p.s ++ rcl.s ! VPSubj ! p.p ! ODir ! q;
<Cond,Anter> => temp.s ++ p.s ++ rcl.s ! VPSubj ! p.p ! ODir ! q
};
c = rcl.c
} ;
UseSlash temp p clslash = {
s = case <temp.t,temp.a> of {
<Pres,Simul> => temp.s ++ p.s ++ clslash.s ! VPGenPres ! p.p ! ODir;
<Pres,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfPres ! p.p ! ODir;
<Past,Simul> => temp.s ++ p.s ++ clslash.s ! VPImpPast ! p.p ! ODir ;
<Past,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfPast ! p.p ! ODir;
<Fut,Simul> => temp.s ++ p.s ++ clslash.s ! VPFut ! p.p ! ODir;
<Fut,Anter> => temp.s ++ p.s ++ clslash.s ! VPPerfFut ! p.p ! ODir;
<Cond,Simul> => temp.s ++ p.s ++ clslash.s ! VPSubj ! p.p ! ODir;
<Cond,Anter> => temp.s ++ p.s ++ clslash.s ! VPSubj ! p.p ! ODir
};
c2 = clslash.c2
} ;
AdvS a s = {s = a.s ! Masc ++ s.s} ;
RelS s r = {s = s.s ++ r.s ! agrP3 Masc Sg} ;
SSubjS s sj s = { s = s.s ++ sj.s ++ s.s};
}

View File

@@ -0,0 +1,132 @@
concrete StructuralSnd of Structural = CatSnd **
open MorphoSnd, ParadigmsSnd, Prelude in {
flags optimize=all ;
coding = utf8;
lin
above_Prep = mkPrep "mT'y " ;
after_Prep = mkPrep "k'an pWe' " ;
all_Predet = ss "sB' " ;
almost_AdA, almost_AdN = mkAdN "gh't'W kry " ;
although_Subj = ss "jytWt'yk " ;
always_AdV = ss "h'myXh' " ;
and_Conj = sd2 [] "A" ** {n = Pl} ;
because_Subj = ss "c'akat' ty " ;
before_Prep = mkPrep "pyh'ryn" ;
behind_Prep = mkPrep "pT!ty " ;
between_Prep = mkPrep " jy Wc my " ;
both7and_DConj = sd2 "Be'y " "A" ** {n = Pl} ;
but_PConj = ss "pr" ;
by8agent_Prep = mkPrep "h'T'an " ;
by8means_Prep = mkPrep "kan" ;
can8know_VV,can_VV = mkV "sgh't' " ** { isAux = True} ;
during_Prep = mkPrep "Wc M" ;
either7or_DConj = sd2 "kWe'y ByW " "ya" ** {n = Sg} ;
--everybody_NP = MassNP (UseN (ParadigmsSnd.mkN "h'r kWe'y" "h'r kWe'y" "h'r kWe'y" "h'r kWe'y" Masc )); -- not a good way coz need to include NounSnd
every_Det = mkDet "h'r h'k " "h'r h'k " "h'r h'k " "h'r h'k " Sg;
--everything_NP = MassNP (UseN (ParadigmsSnd.mkN "h'r Xy " "h'r Xy " "h'r Xy " "sB' kjh' " Masc ));
everywhere_Adv = mkAdv "h'r h'nd' " ;
few_Det = mkDet "kjh' " "kjh' " "kjh' " "kjh' " Pl ;
first_Ord = {s = "ph'ryWn" ; n = Sg} ; --DEPRECATED
for_Prep = mkPrep "Lae'y ";
from_Prep = mkPrep "WTan" ;
he_Pron = personalPN "h'W" "h'W" "" ["h'W "] ["h'W"] Sg Masc Pers3_Distant ;
here_Adv = mkAdv "h'ty" ;
here7to_Adv = mkAdv "ajh'W" ;
here7from_Adv = mkAdv ["h'yD'anh'n"] ;
how_IAdv = ss "ke'yn" ;
how8many_IDet = makeIDet "kytra" "kytra" Pl ;
how8much_IAdv = ss "kytra";
if_Subj = ss "jykD'h'n" ;
in8front_Prep = mkPrep ["jy samh'Wn"] ;
i_Pron = personalPN "man" "mh'nja " "mh'njW " "man" " " Sg Masc Pers1;
in_Prep = mkPrep "M" ;
it_Pron = personalPN "ah'a" "h'n" "ah'W" "ah'a" "" Sg Masc Pers3_Near;
less_CAdv = {s = "gh'T" ; p = ""} ;
many_Det = mkDet "gh't'a" "gh't'y" "kafy" "kytra" Pl ;
more_CAdv = {s = "Wd'yk"; p = "gh't'a" } ;
most_Predet = ss "sB' k'an gh't'W" ;
much_Det = mkDet "gh't'W" "gh't'W" "gh't'W" "gh't'W" Sg ;
--must_VV = {
-- s = table {
-- VVF VInf => ["have to"] ;
-- VVF VPres => "must" ;
-- VVF VPPart => ["had to"] ;
-- VVF VPresPart => ["having to"] ;
-- VVF VPast => ["had to"] ; --# notpresent
-- VVPastNeg => ["hadn't to"] ; --# notpresent
-- VVPresNeg => "mustn't"
-- } ;
-- isAux = True
-- } ;
-----b
no_Phr = ss "no" ;
no_Utt = ss "na" ;
on_Prep = mkPrep "mT'an" ;
one_Quant = demoPN "h'k" "h'k" "h'k" ; -- DEPRECATED
only_Predet = ss "Srf" ;
or_Conj = sd2 [] "ya" ** {n = Sg} ;
otherwise_PConj = ss "n t pWe'y" ;
part_Prep = mkPrep "HsW" ;
possess_Prep = mkPrep[ "jW ya jy"] ;
please_Voc = ss "mh'rbany" ;
quite_Adv = ss "c'D't' " ;
she_Pron = personalPN "h'We'" "h'W" "h'W" ["h'We'"] ["h'We'"] Sg Fem Pers3_Distant ;
so_AdA = ss "an kry" ;
--somebody_NP = MassNP (UseN (ParadigmsSnd.mkN "kWe'y" "kWe'y" "kWe'y" "kWe'y" Masc ));
someSg_Det = mkDet "kjh' " "kjh' " "kjh' " "kjh' " Sg ;
somePl_Det = mkDet "kjh' " "kjh' " "kjh' " "kjh' " Pl ;
--something_NP = MassNP (UseN (ParadigmsSnd.mkN "kWe'y Xy" "kWe'y Xy" "kWe'y Xy" "kWe'y XyWn" Masc ));
somewhere_Adv = mkAdv "kT'y" ;
that_Quant = demoPN "jykW" "" "" ;
that_Subj = ss "ah'a" ;
there_Adv = mkAdv "aty" ;
there7to_Adv = mkAdv ["h'ty"] ;
there7from_Adv = mkAdv ["h'tan"] ;
therefore_PConj = ss "an kry" ;
they_Pron = personalPN "ah'y" "ah'y" "ah'y" ["ah'y jW"] ["ah'y jW"] Pl Masc Pers3_Distant ; ----
this_Quant = demoPN "h'y" "h'n" "";
through_Prep = mkPrep "mnjh'an" ;
under_Prep = mkPrep " h'yT!an" ; -- ** {lock_Prep = <>};
too_AdA = ss "byHd";
to_Prep = mkPrep "D'anh'n" ; -- ** {lock_Prep = <>};
very_AdA = ss "tmam" ;
want_VV = mkV "cah't' " ** { isAux = False} ;
we_Pron = personalPN "asan" "asan" "asan" "asanjo" "asanjo" Pl Masc Pers1 ;
whatSg_IP = mkIP "c'a" "c'W" "" "" Sg Masc ;
whatPl_IP = mkIP "c'a" "c'W " " " "" Pl Masc ;
when_IAdv = ss "kD'h'n" ;
when_Subj = ss "jD'h'n" ;
where_IAdv = ss "kT'y" ;
--which_IQuant = {s = \\_ => "kh'RW"} ;
which_IQuant = mkIQuant "jykW" "jyky" "jyka" "jh'RW" ;
whichPl_IDet = makeDet "jykY" "jnh'n" ;
whichSg_IDet = makeDet "jykW " "jyka" ;
whoSg_IP = mkIP "kyr" "kh'njy" "kh'njo" "" Sg Masc ;
whoPl_IP = mkIP "kyr" "kh'nja" "kh'nja" "" Pl Masc ;
why_IAdv = ss "c'W" ;
without_Prep = mkPrep "k'an sWae' " ;
with_Prep = mkPrep "san" ;
yes_Phr = ss "h'a" ;
yes_Utt = ss "h'a" ;
youSg_Pron = personalPN "tWn" "tWn" "tWn" "th'njW" "th'njy" Sg Masc Pers2_Casual ;
youPl_Pron = personalPN "tWh'an" "tWh'an" "tWh'an" "tWh'anjW" "tWh'anjy" Pl Masc Pers2_Casual ;
youPol_Pron = personalPN "tWh'an" "tWh'an" "tWh'an" "tWh'an jW" "tWh'an jy" Pl Masc Pers2_Respect ;
no_Quant = demoPN " c'W n" "c'W n" "c'W n " ;
not_Predet = {s="n"} ;
if_then_Conj = sd2 "jykD'h'n" "t" ** {n = Sg} ;
at_least_AdN = mkAdN ["gh'T my gh'T"] ;
at_most_AdN = mkAdN ["gh't'y k'an gh't'W"];
--nothing_NP = MassNP (UseN (ParadigmsSnd.mkN "kjh' Xy n" "kjh' Xy n" "kjh' Xy n" "kjh' Xy n" "kjh' Xy n" "kjh' Xy n" Masc ));
except_Prep = mkPrep "sWae' " ;
--nobody_NP = MassNP (UseN (ParadigmsSnd.mkN "kW b n" "kW b n" "kW b n" "kW b n" "kW b n" "kW b n" Masc ));
as_CAdv = {s = "jye'n" ; p = "jh'RW"} ;
have_V2 = mkV2 (mkV "rk't' ") "" ;
language_title_Utt = ss "BWly" ;
}

View File

@@ -0,0 +1,50 @@
--# -path=.:../abstract:../common
concrete SymbolSnd of Symbol = CatSnd ** open Prelude, ResSnd in {
flags coding = utf8;
lin
-- SymbPN i = {s = \\_ => i.s ; g = Masc} ;
SymbPN i = {s = addGenitiveS i.s ; g = Masc} ;
IntPN i = {s = addGenitiveS i.s ; g = Masc} ;
FloatPN i = {s = addGenitiveS i.s ; g = Masc} ;
NumPN i = {s = \\_ =>i.s ; g = Masc} ;
CNIntNP cn i = {
s = \\c => cn.s ! Sg ! Dir ++ i.s ;
a = agrP3 cn.g Sg ;
isPron = False
} ;
CNSymbNP det cn xs = {
s = \\c => det.s!Sg!Masc ++ cn.s ! det.n ! Dir ++ xs.s ;
a = agrP3 cn.g det.n;
isPron = False
} ;
CNNumNP cn i = {
s = \\c => cn.s ! Sg ! Dir ++ i.s ;
a = agrP3 cn.g Sg;
isPron = False
} ;
SymbS sy = sy ;
SymbNum sy = { s = sy.s ; n = Pl } ;
SymbOrd sy = { s = sy.s ++ "waN" ; n = Pl} ;
lincat
Symb, [Symb] = SS ;
lin
MkSymb s = s ;
BaseSymb = infixSS "tE" ;
ConsSymb = infixSS "" ;
oper
-- Note: this results in a space before 's, but there's
-- not mauch we can do about that.
addGenitiveS : Str -> Case => Str = \s ->
table {_ => s ++ "da" } ;
}

View File

@@ -0,0 +1,44 @@
concrete VerbSnd of Verb = CatSnd ** open ResSnd in {
flags coding = utf8;
flags optimize=all_subs ;
lin
UseV v = predV v ;
SlashV2a v = predV v ** {c2 = {s = v.c2.s ; c = VTrans}} ;
Slash2V3 v np =
insertObjc (\\_ => np.s ! NPObj ++ v.c3 ) (predV v ** {c2 = {s = v.c2 ; c = VTrans}}) ;
Slash3V3 v np =
insertObjc (\\_ => checkPron np v.c2) (predV v ** {c2 = {s = v.c3 ; c = VTrans}}) ;
ComplVV v vp = insertTrans (insertVV (infVV v.isAux vp) (predV v) vp.embComp vp) vp.subj;
ComplVS v s = insertTrans (insertObj2 (conjThat ++ s.s) (predV v)) VTransPost ;
ComplVQ v q = insertObj2 (conjThat ++ q.s ! QIndir) (predV v) ;
ComplVA v ap = insertObj (\\a => ap.s ! giveNumber a ! giveGender a ! Dir ) (predV v) ;
SlashV2V v vp = insertVV (infV2V v.isAux vp) (predV v) vp.embComp vp **{c2 = {s = "twN" ; c = VTransPost}} ; -- should creat a form at VP level which can be used in VP like 'swn da kyna' also check the c=VTransPost it is correct in case if second v is intrasitive, but not if trans like begged me to ead bread
SlashV2S v s = insertObjc2 (conjThat ++ s.s) (predV v ** {c2 = {s = "k'y" ; c = VTransPost}}) ;
SlashV2Q v q = insertObjc2 (conjThat ++ q.s ! QIndir) (predV v ** {c2 = {s = "k'an" ; c = VTransPost}}) ; -- chek for VTransPost, as in this case , case should be ergative but agrement should be default
SlashV2A v ap = insertObjc (\\a => ap.s ! giveNumber a ! giveGender a ! Dir ) (predV v ** {c2 = {s = "k'y" ; c = VTransPost}}) ; ----
ComplSlash vp np = insertObject np vp ;
SlashVV vv vp =
insertEmbCompl (insertObj (\\a => infVP vv.isAux vp a) (predV vv)) vp.embComp **
{c2 = vp.c2} ;
SlashV2VNP vv np vp =
insertObjPre (\\_ => np.s ! NPObj )
(insertObjc (\\a => infVP vv.isAux vp a) (predVc vv)) **
{c2 = vp.c2} ;
UseComp comp = insertObj comp.s (predAux auxBe) ;
AdvVP vp adv = insertObj (\\a => adv.s ! (fromAgr a).g) vp ;
AdVVP adv vp = insertAdV adv.s vp ;
ReflVP v = insertObjPre (\\_ => RefPron) v ;
PassV2 v = predV v ; -- need to be fixed
CompAP ap ={s = \\a => ap.s ! giveNumber a ! giveGender a ! Dir } ;
CompNP np = {s = \\_ => np.s ! NPObj} ;
CompAdv adv = {s = \\a => adv.s ! (fromAgr a).g } ;
CompCN cn = {s = \\a => cn.s ! giveNumber a ! Dir} ;
}