diff --git a/src/somali/CatSom.gf b/src/somali/CatSom.gf index ee325a075..01204f5ff 100644 --- a/src/somali/CatSom.gf +++ b/src/somali/CatSom.gf @@ -72,7 +72,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { Predet = {s : Str} ; Quant = ResSom.Quant ; Num = ResSom.Num ; - Card, Ord = {s : Str ; n : Number} ; + Ord = {s : Str ; n : Number} ; DAP = ResSom.Determiner ; @@ -80,7 +80,8 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { -- Constructed in NumeralSom. - Numeral = {s : Str ; n : Number} ; + Card = {s : State => Str ; n : Number} ; + Numeral = {s : CardOrd => State => Str ; n : Number} ; Digits = {s : CardOrd => Str ; n : Number} ; diff --git a/src/somali/LexiconSom.gf b/src/somali/LexiconSom.gf index d4399cb95..8b8e05333 100644 --- a/src/somali/LexiconSom.gf +++ b/src/somali/LexiconSom.gf @@ -176,7 +176,7 @@ lin go_V = mkV "tag" ; -- lin horn_N = mkN "" ; -- lin horse_N = mkN "" ; -- lin hot_A = mkA "" ; -lin house_N = mkN "aqal" ; +lin house_N = mkN "guri" ; -- lin hunt_V2 = mkV2 "" ; -- lin husband_N = mkN "" ; @@ -360,7 +360,7 @@ lin speak_V2 = mkV2 "hadlo" ; -- lin table_N = mkN "" ; -- lin tail_N = mkN "" ; -- lin talk_V3 = mkV3 "" ; -lin teach_V2 = mkV2 "baray" ku ; -- I suppose this creates progressive forms? TODO implement all forms of verbs properly. +lin teach_V2 = mkV2 "bar" ku ; -- lin teacher_N = mkN "" ; -- lin television_N = mkN "" ; -- lin thick_A = mkA "" ; diff --git a/src/somali/NounSom.gf b/src/somali/NounSom.gf index 32b925b8b..17446f025 100644 --- a/src/somali/NounSom.gf +++ b/src/somali/NounSom.gf @@ -23,14 +23,19 @@ DetCN det cn = useN cn ** { => {nf=det.d ; c=Abs} ; _ => {nf=det.d ; c=c} } ; - nf : NForm = case det.isNum of {True => Numerative ; _ => nfc.nf} ; detStr : Str = - case of { - => det.shortPoss ; - _ => det.s ! nfc.c + case of { + => det.sp ! cn.g ! nfc.c ; -- CN has undergone ComplN2 and is already quantified + <_,Numerative,_,_> => [] ; -- s is in pref + <_,_, True,True> => det.shortPoss ; + _ => det.s ! cn.g ! nfc.c } ; - in det.pref -- if det is numeral. TODO find out if gender/case/other distinction. - ++ cn.s ! nf + pref : Str = case det.d of { + Numerative => det.s ! cn.g ! nfc.c ; + _ => [] + } ; + in pref -- if det is numeral. + ++ cn.s ! nfc.nf ++ detStr -- non-numeral det ++ cn.mod ! getNum (getAgr det.d Masc) ! c } ; @@ -87,23 +92,29 @@ DetCN det cn = useN cn ** { -- : Quant -> Num -> Det ; DetQuant quant num = quant ** { - pref = num.s ; - sp = \\g => case of { - => quant.sp ! SgMasc ; - => quant.sp ! SgFem ; - => quant.sp ! PlInv } ; + s = \\g,c => case of { + => num.s ! quant.st ++ quant.s ! SgMasc ! c ; + => num.s ! quant.st ++ quant.s ! SgFem ! c ; + -- gender-flipped allomorphs in plural; TODO needs more fine-grained rules + => num.s ! quant.st ++ quant.s ! SgMasc ! c ; + => num.s ! quant.st ++ quant.s ! SgFem ! c } ; + + sp = \\g,c => case of { + => num.s ! quant.st ++ quant.sp ! SgMasc ! c ; + => num.s ! quant.st ++ quant.sp ! SgFem ! c ; + -- Independent form uses plural morpheme, not gender-flipped allomorph + => num.s ! quant.st ++ quant.sp ! PlInv ! c } ; d = case of { => Numerative ; => Def num.n quant.v ; => Indef num.n } ; - isNum = num.isNum ; } ; -- : Quant -> Num -> Ord -> Det ; -- these five best DetQuantOrd quant num ord = let theseFive = DetQuant quant num in theseFive ** { - s = \\c => theseFive.s ! c ++ ord.s ; + s = \\g,c => theseFive.s ! g ! c ++ ord.s ; sp = \\g,c => theseFive.sp ! g ! c ++ ord.s } ; @@ -114,27 +125,29 @@ DetCN det cn = useN cn ** { -- the "kernel" of a determiner. It is, however, the $Num$ that determines -- the inherent number. - NumSg = {s = [] ; n = Sg ; isNum = False} ; - NumPl = {s = [] ; n = Pl ; isNum = False} ; -{- + NumSg = {s = \\_ => [] ; n = Sg ; isNum = False} ; + NumPl = {s = \\_ => [] ; n = Pl ; isNum = False} ; + -- : Card -> Num ; - NumCard card = (card ** { isNum = True }) ; + NumCard card = card ** {isNum = True} ; -- : Digits -> Card ; - NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ; +-- NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ; -- : Numeral -> Card ; - NumNumeral num = num ; + NumNumeral num = num ** {s = num.s ! NCard}; +{- -- : AdN -> Card -> Card ; AdNum adn card = card ** { s = adn.s ++ card.s } ; -- : Digits -> Ord ; OrdDigits digs = digs ** { s = digs.s ! NOrd } ; - +-} -- : Numeral -> Ord ; - OrdNumeral num = num ; + OrdNumeral num = num ** {s = num.s ! NOrd ! Indefinite} ; +{- -- : A -> Ord ; OrdSuperl a = { } ; @@ -159,10 +172,10 @@ DetCN det cn = useN cn ** { in DefArt ** { shortPoss = BIND ++ p.s ; isPoss = True ; - s = \\c => let casevow = case c of {Nom => "u" ; Abs => "a" ; _ => "TODO:case"} - in gntbl ! SgMasc ++ BIND ++ casevow ; + s = \\gn,c => let casevow = case c of {Nom => "u" ; Abs => "a"} + in gntbl ! gn ++ BIND ++ casevow ; sp = \\gn,c => let prefix = case gn of {SgFem => "t" ; _ => "k"} ; - casevow = case c of {Nom => "u" ; Abs => "a"; _ => "TODO:case"} + casevow = case c of {Nom => "u" ; Abs => "a"} in prefix ++ gntbl ! gn ++ BIND ++ casevow ; v = p.v } ; @@ -175,15 +188,20 @@ DetCN det cn = useN cn ** { -- : N2 -> NP -> CN ; -- Sahra hooyadeed ComplN2 n2 np = let cn = useN n2 in cn ** {s = \\nf => - let det = PossPron (pronTable ! np.a) ; - detStr = case cn.shortPoss of { - True => det.shortPoss ; - _ => det.s ! Abs } ; + let qnt = PossPron (pronTable ! np.a) ; + + det = case cn.shortPoss of { + True => qnt.shortPoss ; + _ => qnt.s ! nf2gennum nf cn.g ! Abs } ; num = case nf of { - Indef n => n ; - Def n v => n ; - _ => Sg } ; - in np.s ! Abs ++ cn.s ! Def num det.v ++ detStr } ; + Indef n => n ; + Def n v => n ; + _ => Sg } ; + noun = case np.isPron of { + True => (pronTable ! np.a).sp ; -- long subject pronoun + False => np.s ! Abs } + in noun ++ cn.s ! Def num qnt.v ++ det ; + isPoss = True} ; {- -- : N3 -> NP -> N2 ; -- distance from this city (to Paris) @@ -202,6 +220,9 @@ DetCN det cn = useN cn ** { s = table { NomSg => cn.s ! Indef Sg ; -- When an adjective is added, noun loses case marker. x => cn.s ! x } ; mod = \\n,c => cn.mod ! n ! Abs -- If there was something before, it is now in Abs + ++ case cn.hasMod of { + True => "oo" ; + False => [] } ++ ap.s ! AF n c ; hasMod = True } ; diff --git a/src/somali/NumeralSom.gf b/src/somali/NumeralSom.gf index 7440347dd..2bf06d183 100644 --- a/src/somali/NumeralSom.gf +++ b/src/somali/NumeralSom.gf @@ -1,88 +1,91 @@ concrete NumeralSom of Numeral = CatSom [Numeral,Digits] ** - open Prelude, ResSom in { + open Prelude, ResSom, ParamSom in { -oper LinDigit : Type = { s : DForm => Str ; - n : Number ; - even20 : Even20 } ; +oper + LinDigit : Type = { + s : DForm => CardOrd => State => Str -- TODO: for 1, hal and mid. variation kow-koob implemented with pre. + } ; -oper mk20Ten : Str -> Str -> Str -> Str -> LinDigit = \tri,t,fiche,h -> - { s = table { Unit => tri ; - Teen => t ; - Twenty => fiche ; - Hund => h + "TODO"} ; - even20 = Ten ; - n = Pl } ; + mkNum3 : (ucard,tcard,uord : Str) -> Gender -> LinDigit = \uc,tc,uo,g -> {s = + \\df,co,s => case of { + => uo ; + => tc + "aad" ; + => nf2state (mkNg uc g) ! s ; + => nf2state (mkN1 tc) ! s } + } ; -oper mkeven20 : Str -> Str -> Str -> Str -> LinDigit = \se,t,trifichid,h -> - { s = table { Unit => se ; - Teen => t ; - Twenty => trifichid ; - Hund => h + "TODO" } ; - even20 = Even ; - n = Pl } ; + mkNum2 : (ucard,tcard : Str) -> LinDigit = \uc,tc -> + let uo : Str = case uc of { + x + "a" => x + "aad" ; -- ?? + x + #v + c@#c => x + c + "aad" ; + _ => uc + "aad" } ; + in mkNum3 uc tc uo Fem ; -param Even20 = Ten | Even ; -param DForm = Unit | Teen | Twenty | Hund ; + mkNum2Masc : (ucard,tcard : Str) -> LinDigit = \uc,tc -> + let uo : Str = case uc of { + x + "a" => x + "aad" ; -- ?? + x + #v + c@#c => x + c + "aad" ; + _ => uc + "aad" } ; + in mkNum3 uc tc uo Masc ; ---lincat Numeral = {s : Str} ; -lincat Digit = LinDigit ; -lincat Sub10 = LinDigit ; -lincat Sub100 = {s : Str ; n : Number } ; -lincat Sub1000 = {s : Str ; n : Number ; isHundred : Bool } ; -lincat Sub1000000 = {s : Str ; n : Number } ; +lincat + Digit = LinDigit ; + Sub10, Sub100, Sub1000, Sub1000000 = + {s : CardOrd => State => Str ; n : Number} ; ---------------------------------------------------------------------------- -- num : Sub1000000 -> Numeral ; -lin num x0 = lin Numeral x0 ; +lin num x = x ; -lin n2 = mkeven20 "TODO" "TODO" "TODO" "TODO" ; -lin n3 = mk20Ten "TODO" "TODO" "TODO" "TODO"; -lin n4 = mkeven20 "TODO" "TODO" "TODO" "TODO"; -lin n5 = mk20Ten "TODO" "TODO" "TODO" "TODO"; -lin n6 = mkeven20 "TODO" "TODO" "TODO" "TODO" ; -lin n7 = mk20Ten "TODO" "TODO" "TODO" "TODO" ; -lin n8 = mkeven20 "TODO" "TODO" "TODO" "TODO" ; -lin n9 = mk20Ten "TODO" "TODO" "TODO" "TODO" ; +oper kow : Str = "kow" ; --pre {"iyo" => "koob" ; _ => "kow"} ; -lin pot01 = - {s = table {Unit => "TODO" ; Hund => "TODO" ; _ => []} ; even20 = Ten ; n = Sg }; -lin pot0 d = d ; -lin pot110 = {s = "TODO" ; n = Pl} ; -lin pot111 = {s = variants {"TODO" ; "TODO"} ; n = Pl} ; -lin pot1to19 d = {s = d.s ! Teen ; n = Pl} ; -lin pot0as1 n = {s = n.s ! Unit ; n = n.n} ; -lin pot1 d = - {s = case d.even20 of { - Even => d.s ! Twenty ; - Ten => glue (d.s ! Twenty) "TODO" } ; - n = Pl} ; -lin pot1plus d e = - {s = case d.even20 of { - Even => d.s ! Twenty ++ "TODO" ++ e.s ! Unit ; - Ten => d.s ! Twenty ++ "TODO" ++ e.s ! Teen } ; - n = Pl} ; +oper n1 = mkNum3 kow "toban" "kowaad" Fem ; +lin n2 = mkNum2 "laba" "labaatan" ; +lin n3 = mkNum2 "saddex" "soddon" ; +lin n4 = mkNum2 "afar" "afartan"; +lin n5 = mkNum2 "shan" "konton"; +lin n6 = mkNum2 "lix" "lixdan" ; +lin n7 = mkNum2 "toddoba" "toddobaatan" ; +lin n8 = mkNum2Masc "siddeed" "siddeetan" ; +lin n9 = mkNum2Masc "sagaal" "sagaaashan" ; -lin pot1as2 n = n ** { isHundred = False } ; -lin pot2 d = {s = d.s ! Hund ; n = Pl ; isHundred = True } ; -lin pot2plus d e = - { s = d.s ! Hund ++ "TODO" ++ e.s ; - n = Pl ; - isHundred = True } ; +lin pot01 = {s = n1.s ! Unit ; n = Sg} ; + +lin pot0 d = {s = d.s ! Unit ; n = Pl} ; + +lin pot110 = {s = n1.s ! Ten ; n = Pl} ; +lin pot111 = {s = \\co,s => "koob iyo" ++ n1.s ! Ten ! co ! s ; n = Pl} ; +lin pot1to19 d = {s = \\co,s => d.s ! Unit ! co ! s ++ n1.s ! Ten ! co ! s ; n=Pl} ; +lin pot0as1 n = n ; +lin pot1 d = {s = d.s ! Ten ; n=Pl}; + -- {s = d.s ! Unit ; + -- n = Pl} ; +lin pot1plus d e = { + s = \\co,s => e.s ! co ! Indefinite ++ "iyo" ++ d.s ! Ten ! co ! s ; + n = Pl} ; + +lin pot1as2 n = n ; +lin pot2 d = d ** {s = \\co,s => d.s ! co ! s ++ "boqol"} ; -- TODO +lin pot2plus d e = { + s = \\co,s => d.s ! co ! Indefinite ++ "boqol iyo" ++ e.s ! co ! s ; + n = Pl} ; lin pot2as3 n = n ; -lin pot3 n = - {s = table {Sg => [] ; Pl => n.s } ! n.n ++ "TODO" ; - n = n.n } ; +lin pot3 n = n ; + +lin pot3plus n m = { + s = \\co,s => n.s ! co ! s ++ "iyo" ++ m.s ! co ! s ; + n = n.n } ; -lin pot3plus n m = - let ta = if_then_Str m.isHundred [] "TODO" ; --no `ta' between 1000 and 100 - in - { s = table {Sg => [] ; Pl => n.s } ! n.n ++ "TODO" ++ ta ++ m.s ; - n = n.n } ; - +--TODO: +-- my three cats +-- * saddexd &+ ayg &+ a bisadood +-- => saddexd &+ ayd &+ a bisadood +-- my *two* thousand small cats +-- => laba kun oo bisadood oo yar (kun is an attribute, bisadood is an attribute) ---------------------------------------------------------------------------- lincat Dig = TDigit ; @@ -93,7 +96,7 @@ oper mk2Dig : Str -> Number -> TDigit = \c,num -> { s = table { NCard => c ; - NOrd => c + "TODO" } ; + NOrd => c + "aan" } ; n = num } ; diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index 8a2ce585c..d378ac23c 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -99,19 +99,40 @@ oper agr2agrplus : (isPron : Bool) -> Agreement -> AgreementPlus = \isPron,a -> case isPron of {True => IsPron a ; False => NotPronP3} ; + nf2state : {s:NForm=>Str} -> State=>Str = \ss -> table { + Definite => ss.s ! Def Sg vA ; + Indefinite => ss.s ! Indef Sg + } ; + + gn2gennum : Gender -> Number -> GenNum = \g,n -> + case of { + => SgMasc ; + => SgFem ; + _ => PlInv } ; + + nf2gennum : NForm -> Gender -> GenNum = \nf,g -> + gn2gennum g (getNum (getAgr nf g)) ; + +-------------------------------------------------------------------------------- +-- Numerals + +param + + DForm = Unit | Ten ; + + -- If need to optimise: can remove one multiple of 2, but harder to understand + -- CardOrdDFS = Odfs DForm | Cdfs DForm State ; + -- + -- CardOrdState = Ost | Cst State ; + + CardOrd = NOrd | NCard ; + -------------------------------------------------------------------------------- -- Adjectives param AForm = AF Number Case ; ---- TODO: past tense --------------------------------------------------------------------------------- --- Numerals - --- TODO: is this necessary? -param - CardOrd = NCard | NOrd ; - -------------------------------------------------------------------------------- -- Prepositions diff --git a/src/somali/PhraseSom.gf b/src/somali/PhraseSom.gf index 37374a8ca..33fdced8d 100644 --- a/src/somali/PhraseSom.gf +++ b/src/somali/PhraseSom.gf @@ -18,7 +18,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { UttVP vp = { s = linVP vp } ; UttAdv adv = adv ; UttCN n = {s = linCN n } ; - UttCard n = n ; + UttCard n = {s = n.s ! Indefinite} ; UttAP ap = { s = ap.s ! AF Sg Abs } ; UttInterj i = i ; diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 5882e4512..6604b1681 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -8,7 +8,11 @@ oper Noun2 : Type = Noun ; -- TODO eventually more parameters? Noun3 : Type = Noun ; - CNoun : Type = Noun ** {mod : Number => Case => Str ; hasMod : Bool} ; + CNoun : Type = Noun ** { + mod : Number => Case => Str ; + hasMod : Bool ; + isPoss : Bool -- to prevent impossible forms in ComplN2 with Ns that have short possessive, e.g. "the father of NP". + } ; PNoun : Type = {s : Str ; a : Agreement} ; @@ -107,7 +111,7 @@ oper _ => nXayawaan n } ; mkNg : Str -> Gender -> Noun = \n,g -> case n of { - _ + ("r"|"n"|"l"|"g") + _ -- + ("r"|"n"|"l"|"g") => case g of { Fem => nUl n ; Masc => mkN1 n } ; @@ -126,7 +130,7 @@ oper useN : Noun -> CNoun ** BaseNP = \n -> n ** { mod = \\_,_ => [] ; hasMod = False ; - a = Sg3 n.g ; isPron = False ; sp = [] + a = Sg3 n.g ; isPron,isPoss = False ; } ; emptyNP : NounPhrase = { @@ -147,58 +151,58 @@ oper poss : { -- for PossPron : Pron -> Quant sp : GenNum => Str ; -- independent forms, e.g. M:kayga F:tayda Pl:kuwayga s : Str ; -- short possessive suffix: e.g. family members, my/your name - v : Vowel} + v : Vowel} ; + sp : Str ; } ; pronTable : Agreement => Pronoun = table { Sg1 => { - s = table {Nom => "aan" ; {-Voc => "aniga" ;-} Abs => "i"} ; - a = Sg1 ; isPron = True ; + s = table {Nom => "aan" ; Abs => "i"} ; + a = Sg1 ; isPron = True ; sp = "aniga" ; poss = {s = "ay" ; v = vA ; sp = gnTable "ayg" "ayd" "uwayg"} } ; Sg2 => { - s = table {Nom => "aad" ; {-Voc => "adiga" ;-} Abs => "ku"} ; - a = Sg2 ; isPron = True ; + s = table {Nom => "aad" ; Abs => "ku"} ; + a = Sg2 ; isPron = True ; sp ="adiga" ; poss = {s = "aa" ; v = vA ; sp = gnTable "aag" "aad" "uwaag"} } ; Sg3 Masc => { - s = table {Nom => "uu" ; {-Voc => "isaga" ;-} Abs => []} ; - a = Sg3 Masc ; isPron = True ; + s = table {Nom => "uu" ; Abs => []} ; + a = Sg3 Masc ; isPron = True ; sp ="isaga" ; poss = {s = "iis" ; v = vI ; sp = gnTable "iis" "iis" "uwiis"} } ; Sg3 Fem => { - s = table {Nom => "ay" ; {-Voc => "iyada" ;-} Abs => []} ; - a = Sg3 Fem ; isPron = True ; + s = table {Nom => "ay" ; Abs => []} ; + a = Sg3 Fem ; isPron = True ; sp = "iyada" ; poss = {s = "eed" ; v = vE ; sp = gnTable "eed" "eed" "uweed"} } ; Pl1 Excl => { - s = table {Nom => "aan" ; {-Voc => "annaga" ;-} Abs => "na"} ; - a = Pl1 Incl ; isPron = True ; + s = table {Nom => "aan" ; Abs => "na"} ; + a = Pl1 Incl ; isPron = True ; sp ="annaga" ; poss = {s = "een" ; v = vE ; sp = gnTable "eenn" "eenn" "uweenn"} } ; Pl1 Incl => { - s = table {Nom => "aynu" ; {-Voc => "innaga" ;-} Abs => "ina"} ; - a = Pl1 Incl ; isPron = True ; + s = table {Nom => "aynu" ; Abs => "ina"} ; + a = Pl1 Incl ; isPron = True ; sp ="innaga" ; poss = {s = "een" ; v = vE ; sp = gnTable "eenn" "eenn" "uweenn"} } ; Pl2 => { - s = table {Nom => "aad" ; {-Voc => "idinka" ;-} Abs => "idin"} ; - a = Pl2 ; isPron = True ; + s = table {Nom => "aad" ; Abs => "idin"} ; + a = Pl2 ; isPron = True ; sp ="idinka" ; poss = {s = "iin" ; v = vI ; sp = gnTable "iinn" "iinn" "uwiinn"} } ; Pl3 => { - s = table {Nom => "ay" ; {-Voc => "iyaga" ;-} Abs => []} ; - a = Pl3 ; isPron = True ; + s = table {Nom => "ay" ; Abs => []} ; + a = Pl3 ; isPron = True ; sp = "iyaga" ; poss = {s = "ood" ; v = vO ; sp = gnTable "ood" "ood" "uwood"} } ; Impers => { s = table {Nom => "la" ; Abs => "??"} ; - a = Impers ; isPron = True ; - poss = {s = "??" ; v = vO ; sp = gnTable "??" "??" "??"} + a = Impers ; isPron = True ; sp = "??" ; + poss = {s = "??" ; v = vA ; sp = gnTable "??" "??" "??"} } } ; - -- Second series object pronouns, Sayeed p. 74-75 -- For two non-3rd person object pronouns, e.g. "They took you away from me" secondObject : Agreement => Str = table { @@ -214,32 +218,31 @@ oper -- Det, Quant, Card, Ord BaseQuant : Type = { - s : Case => Str ; isPoss : Bool ; shortPoss : Str ; -- short form of possessive, e.g. family members } ; Determiner : Type = BaseQuant ** { - pref : Str ; -- Numerals ? + s, sp : Gender => Case => Str ; - d : NForm ; -- combination of number, state and vowel - isNum : Bool ; -- whether to choose Numerative as the value of NForm + d : NForm ; -- combination of number, state and vowel +-- isNum : Bool ; -- placement in NP + whether to choose Numerative from CN } ; Quant : Type = BaseQuant ** { + s, sp : GenNum => Case => Str ; st : State ; v : Vowel ; } ; Num : Type = { - s : Str ; -- TODO check if enough + s : State => Str ; -- TODO check if enough n : Number ; -- singular or plural isNum : Bool -- whether to choose Numerative as the value of NForm } ; baseQuant : BaseQuant = { - s = \\_ => [] ; isPoss = False ; shortPoss = [] } ; @@ -249,7 +252,7 @@ oper defQuantBind : (bind : Bool) -> (s, kan, tan, kuwan : Str) -> Vowel -> Quant = \b,s,spm,spf,spp,v -> let bind : Str -> Str = \x -> case b of {False => x ; True => BIND ++ x} ; in baseQuant ** { - s = \\c => + s = \\gn,c => let nom = case v of {NA => "u" ; _ => s + "i"} in case c of {Nom => bind nom ; _ => bind s} ; sp = \\gn,c => @@ -263,6 +266,7 @@ oper table {SgMasc => m ; SgFem => f ; _ => p} ; indefQuant : Quant = baseQuant ** { + s, sp = \\gn,c => [] ; st = Indefinite ; v = NA ; -- Will be ignored in DetQuant @@ -295,8 +299,8 @@ oper la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ; u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ; noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ; - -- impersonal subject clitic combining with object clitics. TODO find out the rest of the forms. - passive => mkPrep [] "la <1sg.obj>" "lagu" "la <1pl.obj>" "la <2pl.obj>" "la" + -- impersonal subject clitic combining with object clitics. + passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la" } ; prepCombTable : Agreement => PrepCombination => Str = table { @@ -626,7 +630,10 @@ oper in prepCombTable ! agr ! combine vp.c2 vp.c3 ; insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np -> - let noun = if_then_Str np.isPron [] (np.s ! Abs) ; + let noun = case of { + => np.s ! Abs ; + => (pronTable ! np.a).sp ; -- long object pronoun for 3rd person object + _ => [] } -- no long object for other pronouns in case vp.obj2.a of { Unassigned => vp ** {obj2 = { @@ -652,7 +659,6 @@ oper } ; passV2 : Verb2 -> VerbPhrase = \v2 -> useVc v2 ** { - --s = forceAgr Impers v2.s ; c2 = passive ; c3 = v2.c2 ; } ;