From aa80b55f2a805590493b22fdf029eb597f652fe2 Mon Sep 17 00:00:00 2001 From: normundsg Date: Fri, 10 May 2013 12:03:42 +0000 Subject: [PATCH] Latvian: code refactoring (an intermediate step) and few bugfixes --- lib/src/latvian/AdjectiveLav.gf | 6 +- lib/src/latvian/AdverbLav.gf | 10 +- lib/src/latvian/CatLav.gf | 134 ++++++--- lib/src/latvian/CompatibilityLav.gf | 2 +- lib/src/latvian/ConjunctionLav.gf | 17 +- lib/src/latvian/ExtraLav.gf | 29 +- lib/src/latvian/IdiomLav.gf | 46 ++- lib/src/latvian/LexiconLav.gf | 4 +- lib/src/latvian/MorphoLav.gf | 3 +- lib/src/latvian/NounLav.gf | 291 ++++++++++-------- lib/src/latvian/NumeralLav.gf | 58 ++-- lib/src/latvian/ParadigmsAdjectivesLav.gf | 24 +- lib/src/latvian/ParadigmsLav.gf | 81 ++--- lib/src/latvian/ParadigmsNounsLav.gf | 43 ++- lib/src/latvian/ParadigmsPronounsLav.gf | 107 +++---- lib/src/latvian/ParadigmsVerbsLav.gf | 54 ++-- lib/src/latvian/PhraseLav.gf | 14 +- lib/src/latvian/QuestionLav.gf | 27 +- lib/src/latvian/RelativeLav.gf | 30 +- lib/src/latvian/ResLav.gf | 106 ++++--- lib/src/latvian/SentenceLav.gf | 56 ++-- lib/src/latvian/StructuralLav.gf | 86 +++--- lib/src/latvian/SymbolLav.gf | 21 +- lib/src/latvian/VerbLav.gf | 346 ++++++++++++---------- 24 files changed, 862 insertions(+), 733 deletions(-) diff --git a/lib/src/latvian/AdjectiveLav.gf b/lib/src/latvian/AdjectiveLav.gf index 0dd786296..9282b6854 100644 --- a/lib/src/latvian/AdjectiveLav.gf +++ b/lib/src/latvian/AdjectiveLav.gf @@ -18,10 +18,10 @@ lin UseComparA a = { s = \\d,g,n,c => a.s ! (AAdj Compar d g n c) } ; ComplA2 a np = { - s = \\d,g,n,c => a.s ! (AAdj Posit d g n c) ++ a.p.s ++ np.s ! (a.p.c ! (fromAgr np.a).num) + s = \\d,g,n,c => a.s ! (AAdj Posit d g n c) ++ a.prep.s ++ np.s ! (a.prep.c ! (fromAgr np.agr).num) } ; - ReflA2 a = { s = \\d,g,n,c => a.s ! (AAdj Posit d g n c) ++ a.p.s ++ reflPron ! (a.p.c ! n) } ; + ReflA2 a = { s = \\d,g,n,c => a.s ! (AAdj Posit d g n c) ++ a.prep.s ++ reflPron ! (a.prep.c ! n) } ; AdAP ada ap = { s = \\d,g,n,c => ada.s ++ ap.s ! d ! g ! n ! c } ; @@ -32,7 +32,7 @@ lin AdjOrd ord = { s = \\d,g,n,c => ord.s ! g ! c } ; --TODO: nominatīvs var ne vienmēr būt, pie CAdv jāliek parametrs par locījumu - CAdvAP cadv ap np = { s = \\d,g,n,c => cadv.s ++ ap.s ! d ! g ! n ! c ++ cadv.p ++ np.s ! Nom } ; + CAdvAP cadv ap np = { s = \\d,g,n,c => cadv.s ++ ap.s ! d ! g ! n ! c ++ cadv.prep ++ np.s ! Nom } ; UseA2 a = { s = \\d,g,n,c => a.s ! (AAdj Posit d g n c) } ; diff --git a/lib/src/latvian/AdverbLav.gf b/lib/src/latvian/AdverbLav.gf index 164862013..3abe330e3 100644 --- a/lib/src/latvian/AdverbLav.gf +++ b/lib/src/latvian/AdverbLav.gf @@ -13,20 +13,20 @@ lin -- TODO: vajag arī 'ātrāks par Jāni' un 'ātrāks nekā Jānis' pie more_CAdv -- TODO: vai te tiešām veido 'ātrāk par Jāni'? kurš ir pareizais adverbs? nevis 'ātrāks par Jāni'? - ComparAdvAdj cadv a np = { s = cadv.s ++ a.s ! (AAdv cadv.d) ++ cadv.p ++ np.s ! Nom } ; + ComparAdvAdj cadv a np = { s = cadv.s ++ a.s ! (AAdv cadv.deg) ++ cadv.prep ++ np.s ! Nom } ; - ComparAdvAdjS cadv a s = { s = cadv.s ++ a.s ! (AAdv cadv.d) ++ cadv.p ++ s.s } ; + ComparAdvAdjS cadv a s = { s = cadv.s ++ a.s ! (AAdv cadv.deg) ++ cadv.prep ++ s.s } ; -- FIXME: postpozīcijas prievārdi - PrepNP prep np = { s = prep.s ++ np.s ! (prep.c ! (fromAgr np.a).num) } ; + PrepNP prep np = { s = prep.s ++ np.s ! (prep.c ! (fromAgr np.agr).num) } ; AdAdv = cc2 ; SubjS = cc2 ; AdnCAdv cadv = { - s = case cadv.d of { - Posit => cadv.s ++ cadv.p ; + s = case cadv.deg of { + Posit => cadv.s ++ cadv.prep ; _ => NON_EXISTENT } } ; diff --git a/lib/src/latvian/CatLav.gf b/lib/src/latvian/CatLav.gf index 225a21dc2..02259aeb2 100644 --- a/lib/src/latvian/CatLav.gf +++ b/lib/src/latvian/CatLav.gf @@ -1,89 +1,127 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -concrete CatLav of Cat = CommonX - [CAdv, Voc] ** open Prelude, ResLav in { +concrete CatLav of Cat = CommonX - [CAdv, Voc] ** open ResLav, Prelude in { flags + coding = utf8 ; optimize = all_subs ; lincat - -- Tensed / Untensed + -- Sentences and clauses S, QS = { s : Str } ; - RS = { s : Agr => Str } ; - SSlash = { s : Str ; p : ResLav.Prep } ; - -- Sentence + RS = { s : Agreement => Str } ; Cl = { s : VMood => Polarity => Str } ; - ClSlash = { s : VMood => Polarity => Str ; p : ResLav.Prep } ; + + ClSlash = { s : VMood => Polarity => Str ; prep : Preposition } ; + + SSlash = { s : Str ; prep : Preposition } ; + Imp = { s : Polarity => Number => Str } ; - -- Question + -- Questions and interrogatives QCl = { s : VMood => Polarity => Str } ; - IP = { s : Case => Str ; n : Number } ; - IDet = { s : Gender => Str ; n : Number } ; + + IP = { s : Case => Str ; num : Number } ; + + -- TODO: IComp = { s : Str ; agr : Agreement } ; + + IDet = { s : Gender => Str ; num : Number } ; + IQuant = { s : Gender => Number => Str } ; - --IComp = { s : Str ; a : ResLav.Agr } ; - -- Relative clause + -- Relative clauses and pronouns + + RCl = { s : VMood => Polarity => Agreement => Str } ; - RCl = { s : VMood => Polarity => Agr => Str } ; RP = { s : Gender => Case => Str } ; - -- Verb + -- Verb phrases VP = ResLav.VP ; - VPSlash = ResLav.VP ** { p : ResLav.Prep } ; -- the object agreement - Comp = { s : ResLav.Agr => Str } ; - -- Adjective + VPSlash = ResLav.VPSlash ; + + Comp = { s : Agreement => Str } ; + + -- Adjectival phrases AP = { s : Definiteness => Gender => Number => Case => Str } ; - -- Noun + -- Nouns and noun phrases + + CN = { s : Definiteness => Number => Case => Str ; gend : Gender } ; + + NP = { s : Case => Str ; agr : Agreement ; pol : Polarity } ; + + Pron = Pronoun ; + + Det = { + s : Gender => Case => Str ; + num : Number ; + defin : Definiteness ; + pol : Polarity + } ; - CN = { s : Definiteness => Number => Case => Str ; g : Gender } ; - NP = { s : Case => Str ; a : ResLav.Agr } ; - Pron = { s : Case => Str ; a : ResLav.Agr ; poss : Gender => Number => Case => Str } ; - Det = { s : Gender => Case => Str ; n : Number ; d : Definiteness ; pol : Polarity } ; Predet = { s : Gender => Str } ; + + Quant = { + s : Gender => Number => Case => Str ; + defin : Definiteness ; + pol : Polarity + } ; + + Num = { s : Gender => Case => Str ; num : Number ; hasCard : Bool } ; + + Card = { s : Gender => Case => Str ; num : Number } ; + Ord = { s : Gender => Case => Str } ; - Num = { s : Gender => Case => Str ; n : Number ; hasCard : Bool } ; - Card = { s : Gender => Case => Str ; n : Number } ; - Quant = { s : Gender => Number => Case => Str ; d : Definiteness ; pol : Polarity } ; - -- Numeral + -- Numerals - Numeral = { s : CardOrd => Gender => Case => Str ; n : Number } ; - Digits = { s : CardOrd => Str ; n : Number } ; + Numeral = { s : CardOrd => Gender => Case => Str ; num : Number } ; - -- Structural + Digits = { s : CardOrd => Str ; num : Number } ; + + -- Structural words + + Conj = { s1, s2 : Str ; num : Number } ; - Conj = { s1, s2 : Str ; n : Number } ; Subj = { s : Str } ; - Prep = ResLav.Prep ; - - -- Open lexical classes (lexicon) - N = { s : Number => Case => Str ; g : Gender } ; - N2 = { s : Number => Case => Str ; g : Gender } ** { p : ResLav.Prep ; isPre : Bool } ; -- If isPre then located before the noun - N3 = { s : Number => Case => Str ; g : Gender } ** { p1, p2 : ResLav.Prep ; isPre1, isPre2 : Bool } ; - PN = { s : Case => Str ; g : Gender ; n : Number } ; + Prep = Preposition ; - A = { s : ResLav.AForm => Str } ; - A2 = A ** { p : ResLav.Prep } ; + -- Words of open classes - V, VA = Verb ; - VV, VQ = Verb ** { topic : Case } ; - VS = Verb ** { subj : Subj ; topic : Case } ; - V2A, V2Q, V2V = Verb ** { p : ResLav.Prep } ; - V2S = Verb ** { p : ResLav.Prep ; subj : Subj } ; - - V2 = Verb ** { p : ResLav.Prep ; topic : Case } ; - V3 = Verb ** { p1, p2 : ResLav.Prep ; topic : Case } ; + V, VV, VQ, VA = Verb ; + + V2, V2V, V2Q, V2A = Verb ** { focus : Preposition } ; + + V3 = Verb ** { focus1, focus2 : Preposition } ; + + VS = Verb ** { conj : Subj } ; + + V2S = Verb ** { conj : Subj ; focus : Preposition } ; + + A = Adjective ; + + A2 = Adjective ** { prep : Preposition } ; + + N = Noun ; + + N2 = Noun ** { prep : Preposition ; isPre : Bool } ; + + N3 = Noun ** { prep1, prep2 : Preposition ; isPre1, isPre2 : Bool } ; + + PN = ProperNoun ; + + -- Overriden from CommonX + + CAdv = { s, prep : Str ; deg : Degree } ; - CAdv = { s, p : Str ; d : Degree } ; } diff --git a/lib/src/latvian/CompatibilityLav.gf b/lib/src/latvian/CompatibilityLav.gf index cceedd7bc..074c71e63 100644 --- a/lib/src/latvian/CompatibilityLav.gf +++ b/lib/src/latvian/CompatibilityLav.gf @@ -10,7 +10,7 @@ flags lin -- TODO: kāpēc citās valodās (piem., Eng, Bul) kategorijai Num (NumInt) ir lauks isNum (= True)? - NumInt n = { s = \\_,_ => n.s ; n = Pl ; hasCard = False } ; + NumInt n = { s = \\_,_ => n.s ; num = Pl ; hasCard = False } ; OrdInt n = { s = \\_,_ => n.s ++ "." } ; } diff --git a/lib/src/latvian/ConjunctionLav.gf b/lib/src/latvian/ConjunctionLav.gf index b1ed9b30a..d3712e768 100644 --- a/lib/src/latvian/ConjunctionLav.gf +++ b/lib/src/latvian/ConjunctionLav.gf @@ -17,12 +17,13 @@ lin ConjAdv = conjunctDistrSS ; ConjNP conj ss = conjunctDistrTable Case conj ss ** { - a = toAgr (fromAgr ss.a).pers (conjNumber (fromAgr ss.a).num conj.n) (fromAgr ss.a).gend Pos + agr = toAgr (fromAgr ss.agr).pers (conjNumber (fromAgr ss.agr).num conj.num) (fromAgr ss.agr).gend; + pol = Pos } ; ConjAP conj ss = conjunctDistrTable4 Definiteness Gender Number Case conj ss ; - ConjRS conj ss = conjunctDistrTable Agr conj ss ; + ConjRS conj ss = conjunctDistrTable Agreement conj ss ; -- These fun's are generated from the list cat's: BaseS = twoSS ; @@ -30,21 +31,21 @@ lin BaseAdv = twoSS ; ConsAdv = consrSS comma ; - BaseNP x y = twoTable Case x y ** { a = conjAgr x.a y.a } ; - ConsNP xs x = consrTable Case comma xs x ** { a = conjAgr xs.a x.a } ; + BaseNP x y = twoTable Case x y ** { agr = conjAgr x.agr y.agr } ; + ConsNP xs x = consrTable Case comma xs x ** { agr = conjAgr xs.agr x.agr } ; BaseAP x y = twoTable4 Definiteness Gender Number Case x y ; ConsAP xs x = consrTable4 Definiteness Gender Number Case comma xs x ; - BaseRS x y = twoTable Agr x y ; - ConsRS xs x = consrTable Agr comma xs x ; + BaseRS x y = twoTable Agreement x y ; + ConsRS xs x = consrTable Agreement comma xs x ; lincat [S] = { s1, s2 : Str } ; [Adv] = { s1, s2 : Str } ; - [NP] = { s1, s2 : Case => Str ; a : Agr } ; + [NP] = { s1, s2 : Case => Str ; agr : Agreement } ; [AP] = { s1, s2 : Definiteness => Gender => Number => Case => Str } ; - [RS] = { s1, s2 : Agr => Str } ; + [RS] = { s1, s2 : Agreement => Str } ; } diff --git a/lib/src/latvian/ExtraLav.gf b/lib/src/latvian/ExtraLav.gf index 3a0f84467..f6ca4b617 100644 --- a/lib/src/latvian/ExtraLav.gf +++ b/lib/src/latvian/ExtraLav.gf @@ -14,7 +14,7 @@ lin -- NP -> CN -> CN GenCN np cn = { s = \\d,n,c => np.s ! Gen ++ cn.s ! d ! n ! c ; - g = cn.g + gend = cn.gend } ; aiz_Prep = mkPrep "aiz" Gen Dat ; @@ -38,7 +38,7 @@ lin they8fem_Pron = mkPronoun_They Fem ; it8fem_Pron = mkPronoun_It_Sg Fem ; - have_V3 = mkV3 (mkV "būt") nom_Prep dat_Prep Dat ; + have_V3 = mkV3 (mkV "būt" Dat) nom_Prep dat_Prep ; {- empty_Det num def pol = \num,def,pol -> { @@ -54,8 +54,8 @@ lin -- NP -> Quant GenNP np = { s = \\_,_,_ => np.s ! Gen ; - d = Def ; - pol = (fromAgr np.a).pol + defin = Def ; + pol = np.pol } ; --ICompAP ap = { s = \\g,n => "cik" ++ ap.s ! Indef ! g ! n ! Nom } ; @@ -65,25 +65,28 @@ lin -- VP conjunction: lincat - VPS = { s : Agr => Str } ; - [VPS] = { s1,s2 : Agr => Str } ; + VPS = { s : AgrAgr => Str } ; + [VPS] = { s1,s2 : AgrAgr => Str } ; lin - BaseVPS = twoTable Agr ; - ConsVPS = consrTable Agr comma ; + BaseVPS = twoTable AgrAgr ; + ConsVPS = consrTable AgrAgr comma ; -- NP -> VPS -> S - PredVPS np vps = { s = np.s ! Nom ++ vps.s ! np.a } ; + PredVPS np vps = { s = np.s ! Nom ++ vps.s ! { agr = np.agr ; pol = np.pol } } ; -- Temp -> Pol -> VP -> VPS MkVPS temp pol vp = { - s = \\subjAgr => + s = \\agrAgr => temp.s ++ -- TODO: verb moods other than Ind - buildVerb vp.v (Ind temp.a temp.t) pol.p subjAgr (fromAgr subjAgr).pol vp.objNeg ++ - vp.compl ! subjAgr + buildVerb vp.v (Ind temp.a temp.t) pol.p agrAgr.agr agrAgr.pol vp.agr.focus ++ + vp.compl ! agrAgr.agr } ; -- Conj -> [VPS] -> VPS - ConjVPS = conjunctDistrTable Agr ; + ConjVPS = conjunctDistrTable AgrAgr ; + + oper AgrAgr : Type = { agr : Agreement ; pol : Polarity } ; + } diff --git a/lib/src/latvian/IdiomLav.gf b/lib/src/latvian/IdiomLav.gf index cc891f3f6..67c1804ad 100644 --- a/lib/src/latvian/IdiomLav.gf +++ b/lib/src/latvian/IdiomLav.gf @@ -1,59 +1,49 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude concrete IdiomLav of Idiom = CatLav ** open - Prelude, - ResLav, VerbLav, - ParadigmsVerbsLav + ParadigmsLav, + ResLav, + Prelude in { flags + coding = utf8 ; optimize = all_subs ; lin + ImpersCl vp = - let agr = AgP3 Sg Masc Pos + let agr = AgrP3 Sg Masc in { s = \\mood,pol => - buildVerb vp.v mood pol agr Pos vp.objNeg ++ -- Verb + buildVerb vp.v mood pol agr Pos vp.agr.focus ++ -- Verb vp.compl ! agr -- Object(s), complements, adverbial modifiers } ; GenericCl vp = - let agr = AgP3 Sg Masc Pos + let agr = AgrP3 Sg Masc in { s = \\mood,pol => - buildVerb vp.v mood pol agr Pos vp.objNeg ++ + buildVerb vp.v mood pol agr Pos vp.agr.focus ++ vp.compl ! agr } ; - ExistNP np = - let - v = lin V mkVerb_Irreg_Be ; - agr = np.a - in { - s = \\mood,pol => - buildVerb v mood pol agr (fromAgr np.a).pol Pos ++ - np.s ! Nom - } ; + ExistNP np = { + s = \\mood,pol => buildVerb (mkV "būt") mood pol np.agr np.pol Pos ++ np.s ! Nom + } ; - ExistIP ip = - let - v = lin V mkVerb_Irreg_Be ; - agr = AgP3 ip.n Masc Pos - in { - s = \\mood,pol => - ip.s ! Nom ++ - buildVerb v mood pol agr Pos Pos - } ; + ExistIP ip = { + s = \\mood,pol => ip.s ! Nom ++ buildVerb (mkV "būt") mood pol (AgrP3 ip.num Masc) Pos Pos + } ; -- FIXME: needs restriction so that only VMood Indicative _ _ Present is allowed; -- can't do that on VP level... ProgrVP v = v ; ImpPl1 vp = - let agr = AgP1 Pl Masc + let agr = AgrP1 Pl Masc in { s = vp.v.s ! Pos ! (VInd P1 Pl Pres) ++ -- Verb @@ -63,7 +53,7 @@ lin ; ImpP3 np vp = { - s = "lai" ++ np.s ! Nom ++ buildVerb vp.v (Ind Simul Pres) Pos np.a (fromAgr np.a).pol vp.objNeg ++ vp.compl ! np.a ; + s = "lai" ++ np.s ! Nom ++ buildVerb vp.v (Ind Simul Pres) Pos np.agr np.pol vp.agr.focus ++ vp.compl ! np.agr ; } ; -- FIXME: placeholder diff --git a/lib/src/latvian/LexiconLav.gf b/lib/src/latvian/LexiconLav.gf index 3e9880836..b5756326a 100644 --- a/lib/src/latvian/LexiconLav.gf +++ b/lib/src/latvian/LexiconLav.gf @@ -14,7 +14,7 @@ flags lin airplane_N = mkN "lidmašīna" ; - answer_V2S = mkV2S (mkV "atbildēt" third_conjugation) dat_Prep that_Subj ; -- toP = 'answer to [Person]' = 'atbildēt [kam?]' + answer_V2S = mkV2S (mkV "atbildēt" third_conjugation) that_Subj dat_Prep ; -- toP = 'answer to [Person]' = 'atbildēt [kam?]' apartment_N = mkN "dzīvoklis" ; apple_N = mkN "ābols" ; art_N = mkN "māksla" ; @@ -115,7 +115,7 @@ lin learn_V2 = mkV2 (mkV "mācīties" third_conjugation) acc_Prep ; leather_N = mkN "āda" ; leave_V2 = mkV2 (mkV "atstāt" "atstāju" "atstāju") acc_Prep ; - like_V2 = mkV2 (mkV "patikt" "patīku" "patiku") nom_Prep Dat ; + like_V2 = mkV2 (mkV "patikt" "patīku" "patiku" Dat) nom_Prep ; listen_V2 = mkV2 (mkV "klausīties" third_conjugation) acc_Prep ; live_V = mkV "dzīvot" second_conjugation ; long_A = mkA "garš" ; diff --git a/lib/src/latvian/MorphoLav.gf b/lib/src/latvian/MorphoLav.gf index 45debcb4d..c447565ff 100644 --- a/lib/src/latvian/MorphoLav.gf +++ b/lib/src/latvian/MorphoLav.gf @@ -6,7 +6,6 @@ resource MorphoLav = ResLav ** { -flags - optimize = all ; +flags optimize = all ; } diff --git a/lib/src/latvian/NounLav.gf b/lib/src/latvian/NounLav.gf index 3694aff41..ce5b2ad04 100644 --- a/lib/src/latvian/NounLav.gf +++ b/lib/src/latvian/NounLav.gf @@ -1,170 +1,229 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -concrete NounLav of Noun = CatLav ** open - MorphoLav, - ResLav, - Prelude -in { +concrete NounLav of Noun = CatLav ** open ResLav, Prelude in { flags + coding = utf8 ; optimize = all_subs ; lin - UseN n = { s = \\_ => n.s ; g = n.g } ; + -- Noun phrases - UsePN pn = { s = pn.s ; a = AgP3 pn.n pn.g Pos } ; - - UsePron p = { s = p.s ; a = p.a } ; - - PredetNP pred np = { - s = \\c => pred.s ! (fromAgr np.a).gend ++ np.s ! c ; - a = np.a + -- Det -> CN -> NP + -- e.g. 'the man' + DetCN det cn = { + s = \\c => det.s ! cn.gend ! c ++ cn.s ! det.defin ! det.num ! c ; + agr = AgrP3 det.num cn.gend ; + pol = det.pol } ; - UseN2 n = { s = \\_ => n.s ; g = n.g } ; - - --UseN3 n = n ; + -- PN -> NP + -- e.g. 'John' + UsePN pn = { s = pn.s ; agr = AgrP3 pn.num pn.gend ; pol = Pos } ; - ComplN2 f x = { - s = \\_,n,c => preOrPost f.isPre (f.p.s ++ x.s ! (f.p.c ! (fromAgr x.a).num)) (f.s ! n ! c) ; - g = f.g + -- Pron -> NP + -- e.g. 'he' + UsePron pron = { s = pron.s ; agr = pron.agr ; pol = pron.pol } ; + + -- Predet -> NP -> NP + -- e.g. 'only the man' + PredetNP predet np = { + s = \\c => predet.s ! (fromAgr np.agr).gend ++ np.s ! c ; + agr = np.agr ; + pol = np.pol } ; - ComplN3 f x = { - s = \\n,c => preOrPost f.isPre1 (f.p1.s ++ x.s ! (f.p1.c ! (fromAgr x.a).num)) (f.s ! n ! c) ; - g = f.g ; - p = f.p2 ; - isPre = f.isPre2 + -- NP -> V2 -> NP + -- e.g. 'the man seen' + PPartNP np v2 = { + s = \\c => v2.s ! Pos ! (VPart Pass (fromAgr np.agr).gend (fromAgr np.agr).num c) ++ np.s ! c ; + agr = np.agr ; + pol = np.pol } ; - Use2N3 n = { s = n.s ; g = n.g ; p = n.p1 ; isPre = n.isPre1 } ; - - Use3N3 n = { s = n.s ; g = n.g ; p = n.p2 ; isPre = n.isPre2 } ; - + -- NP -> Adv -> NP + -- e.g. 'Paris today' AdvNP np adv = { s = \\c => np.s ! c ++ adv.s ; - a = np.a + agr = np.agr ; + pol = np.pol } ; + -- NP -> RS -> NP + -- e.g. 'Paris, which is here' RelNP np rs = { - s = \\c => np.s ! c ++ "," ++ rs.s ! np.a ; - a = np.a - } ; - - DetCN det cn = { - s = \\c => det.s ! cn.g ! c ++ cn.s ! det.d ! det.n ! c ; - a = AgP3 det.n cn.g det.pol - } ; - - DetQuant quant num = { - s = \\g,c => quant.s ! g ! num.n ! c ++ num.s ! g ! c ; - n = num.n ; - d = quant.d ; -- FIXME: ja ir kārtas skaitļa vārds, tad tikai noteiktās formas drīkst būt - pol = quant.pol - } ; - - DetQuantOrd quant num ord = { - s = \\g,c => quant.s ! g ! num.n ! c ++ num.s ! g ! c ++ ord.s ! g ! c ; - n = num.n ; - d = quant.d ; --FIXME: ja ir kārtas skaitļa vārds, tad tikai noteiktās formas drīkst būt - pol = quant.pol + s = \\c => np.s ! c ++ "," ++ rs.s ! np.agr ; + agr = np.agr ; + pol = np.pol } ; + -- Det -> NP + -- e.g. 'these five' DetNP det = { s = \\c => det.s ! Masc ! c ; - a = AgP3 det.n Masc det.pol + agr = AgrP3 det.num Masc ; + pol = det.pol } | { s = \\c => det.s ! Fem ! c ; - a = AgP3 det.n Fem det.pol + agr = AgrP3 det.num Fem ; + pol = det.pol } ; - AdjCN ap cn = { - s = \\d,n,c => ap.s ! d ! cn.g ! n ! c ++ cn.s ! d ! n ! c ; - g = cn.g + -- Determiners + + -- Quant -> Num -> Det + -- e.g. 'these five' + DetQuant quant num = { + s = \\gend,c => quant.s ! gend ! num.num ! c ++ num.s ! gend ! c ; + num = num.num ; + defin = quant.defin ; -- FIXME: ja ir kārtas skaitļa vārds, tad tikai noteiktās formas + pol = quant.pol } ; - DefArt = { - s = \\_,_,_ => [] ; - d = Def ; - pol = Pos + -- Quant -> Num -> Ord -> Det + -- e.g. 'these five best' + DetQuantOrd quant num ord = { + s = \\gend,c => quant.s ! gend ! num.num ! c ++ num.s ! gend ! c ++ ord.s ! gend ! c ; + num = num.num ; + defin = quant.defin ; --FIXME: ja ir kārtas skaitļa vārds, tad tikai noteiktās formas + pol = quant.pol } ; - IndefArt = { - s = \\_,_,_ => [] ; - d = Indef ; - pol = Pos + -- Num + NumSg = { s = \\_,_ => [] ; num = Sg ; hasCard = False } ; + + -- Num + NumPl = { s = \\_,_ => [] ; num = Pl ; hasCard = False } ; + + -- Card -> Num + NumCard card = card ** { hasCard = True } ; + + -- Digits -> Card + -- e.g. '51' + NumDigits digits = { s = \\_,_ => digits.s ! NCard ; num = digits.num } ; + + -- Numeral -> Card + -- e.g. 'fifty-one' + NumNumeral numeral = { s = numeral.s ! NCard ; num = numeral.num } ; + + -- AdN -> Card -> Card + -- e.g. 'almost 51' + AdNum adn card = { + s = \\gend,c => adn.s ++ card.s ! gend ! c ; + num = card.num } ; - PossPron p = { - s = p.poss ; - d = Def ; - pol = Pos - } ; + -- Digits -> Ord + -- e.g. '51st' + OrdDigits digits = { s = \\_,_ => digits.s ! NOrd } ; - MassNP cn = { - s = cn.s ! Indef ! Sg ; -- FIXME: a 'šis alus'? der tak gan 'zaļš alus' gan 'zaļais alus' - a = AgP3 Sg cn.g Pos - } ; - - NumSg = { s = \\_,_ => [] ; n = Sg ; hasCard = False } ; - - NumPl = { s = \\_,_ => [] ; n = Pl ; hasCard = False } ; - - NumCard n = n ** { hasCard = True } ; - - NumDigits n = { s = \\g,c => n.s ! NCard ; n = n.n } ; - - OrdDigits n = { s = \\g,c => n.s ! NOrd } ; - - NumNumeral numeral = { s = numeral.s ! NCard ; n = numeral.n } ; - + -- Numeral -> Ord + -- e.g. 'fifty-first' OrdNumeral numeral = { s = numeral.s ! NOrd } ; - OrdSuperl a = { s = \\g,c => a.s ! (AAdj Superl Def g Sg c) } ; + -- A -> Ord + -- e.g. 'warmest' + OrdSuperl a = { s = \\gend,c => a.s ! (AAdj Superl Def gend Sg c) } ; - AdNum adn num = { - s = \\g,c => adn.s ++ num.s ! g ! c ; - n = num.n ; - hasCard = num.n + -- Quant + IndefArt = { s = \\_,_,_ => [] ; defin = Indef ; pol = Pos } ; + + -- Quant + DefArt = { s = \\_,_,_ => [] ; defin = Def ; pol = Pos } ; + + -- CN -> NP + MassNP cn = { + s = cn.s ! Indef ! Sg ; -- FIXME: bet 'šis alus'? un 'zaļš alus' vs. 'zaļais alus'? + agr = AgrP3 Sg cn.gend ; + pol = Pos } ; - AdvCN cn ad = { - s = \\d,n,c => cn.s ! d ! n ! c ++ ad.s ; - g = cn.g + -- Pron -> Quant + PossPron pron = { s = pron.poss ; defin = Def ; pol = Pos } ; + + -- Common nouns + + -- N -> CN + -- e.g. 'house' + UseN n = { s = \\_ => n.s ; gend = n.gend } ; + + -- N2 -> NP -> CN + -- e.g. 'mother of the king' + ComplN2 n2 np = { + s = \\_,num,c => preOrPost n2.isPre (n2.prep.s ++ np.s ! (n2.prep.c ! (fromAgr np.agr).num)) (n2.s ! num ! c) ; + gend = n2.gend } ; - -- 'Pielikums' - ApposCN cn np = { - s = \\d,n,c => case (fromAgr np.a).num of { - n => cn.s ! d ! n ! c ++ np.s ! c ; -- FIXME: comparison not working - _ => NON_EXISTENT -- FIXME: pattern never reached - } ; - g = cn.g + -- N3 -> NP -> N2 + -- e.g. 'distance from this city (to Paris)' + ComplN3 n3 np = { + s = \\num,c => preOrPost n3.isPre1 (n3.prep1.s ++ np.s ! (n3.prep1.c ! (fromAgr np.agr).num)) (n3.s ! num ! c) ; + gend = n3.gend ; + prep = n3.prep2 ; + isPre = n3.isPre2 } ; + -- N2 -> CN + -- e.g. 'mother' + UseN2 n2 = { s = \\_ => n2.s ; gend = n2.gend } ; + + -- N3 -> N2 + -- e.g. 'distance (from this city)' + Use2N3 n3 = { s = n3.s ; gend = n3.gend ; prep = n3.prep1 ; isPre = n3.isPre1 } ; + + -- N3 -> N2 + -- e.g. 'distance (to Paris)' + Use3N3 n3 = { s = n3.s ; gend = n3.gend ; prep = n3.prep2 ; isPre = n3.isPre2 } ; + + -- AP -> CN -> CN + -- e.g. 'big house' + AdjCN ap cn = { + s = \\defin,num,c => ap.s ! defin ! cn.gend ! num ! c ++ cn.s ! defin ! num ! c ; + gend = cn.gend + } ; + + -- CN -> RS -> CN + -- e.g. 'house that John bought' RelCN cn rs = { - s = \\d,n,c => cn.s ! d ! n ! c ++ "," ++ rs.s ! AgP3 n cn.g Pos ; - g = cn.g + s = \\defin,num,c => cn.s ! defin ! num ! c ++ "," ++ rs.s ! AgrP3 num cn.gend ; + gend = cn.gend } ; + -- CN -> Adv -> CN + -- e.g. 'house on the hill' + AdvCN cn adv = { + s = \\defin,num,c => cn.s ! defin ! num ! c ++ adv.s ; + gend = cn.gend + } ; + + -- CN -> SC -> CN + -- e.g. 'question where she sleeps' SentCN cn sc = { - s = \\d,n,c => cn.s ! d ! n ! c ++ "," ++ sc.s ; - g = cn.g + s = \\defin,num,c => cn.s ! defin ! num ! c ++ "," ++ sc.s ; + gend = cn.gend } ; - -- FIXME: vajag šķirot noteikto/nenoteikto galotni..? - PPartNP np v2 = { - s = \\c => v2.s ! Pos ! (VPart Pass (fromAgr np.a).gend (fromAgr np.a).num c) ++ np.s ! c ; - a = np.a - } ; + -- Apposition - -- TODO: šim vajag -ts -ta divdabjus (+ noteiktās formas tiem) - --PPartNP np v2 = { - -- s = \\c => np.s ! c ++ v2.s ! VPPart ; - -- a = np.a - --} ; - --SentCN cn sc = { s = \\n,c => cn.s ! n ! c ++ sc.s ; g = cn.g } ; + -- CN -> NP -> CN + -- e.g. 'city Paris', 'numbers x and y' + ApposCN cn np = + let num : Number = (fromAgr np.agr).num in { + s = \\defin,num,c => cn.s ! defin ! num ! c ++ np.s ! c ; + gend = cn.gend + } ; + + -- TODO: Possessive and partitive constructs + + -- PossNP : CN -> NP -> CN + -- e.g. 'house of Paris', 'house of mine' + + -- PartNP : CN -> NP -> CN + -- e.g. 'glass of wine' + + -- CountNP : Det -> NP -> NP + -- e.g. 'three of them', 'some of the boys' } diff --git a/lib/src/latvian/NumeralLav.gf b/lib/src/latvian/NumeralLav.gf index 2ce845724..d9d62792f 100644 --- a/lib/src/latvian/NumeralLav.gf +++ b/lib/src/latvian/NumeralLav.gf @@ -1,22 +1,20 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -concrete NumeralLav of Numeral = CatLav ** open - ResLav, - ParadigmsLav - in { +concrete NumeralLav of Numeral = CatLav ** open ResLav, ParadigmsLav in { -flags - coding = utf8 ; +flags coding = utf8 ; lincat + -- TODO: formas, kas pieprasa ģenitīvu - tūkstotis grāmatu, trīs simti meiteņu Digit = { s : DForm => CardOrd => Gender => Case => Str } ; - Sub10 = { s : CardOrd => Gender => Case => Str ; n : Number } ; - Sub100 = { s : CardOrd => Gender => Case => Str ; n : Number } ; - Sub1000 = { s : CardOrd => Gender => Case => Str ; n : Number } ; - Sub1000000 = { s : CardOrd => Gender => Case => Str ; n : Number } ; + Sub10 = { s : CardOrd => Gender => Case => Str ; num : Number } ; + Sub100 = { s : CardOrd => Gender => Case => Str ; num : Number } ; + Sub1000 = { s : CardOrd => Gender => Case => Str ; num : Number } ; + Sub1000000 = { s : CardOrd => Gender => Case => Str ; num : Number } ; lin + num x = x ; n2 = mkNumReg "divi" "otrais" Pl ; @@ -44,55 +42,55 @@ lin n8 = mkNumReg "astoņi" "astotais" Pl ; n9 = mkNumReg "deviņi" "devītais" Pl ; - pot01 = { s = viens.s ! DUnit } ** { n = Sg } ; - pot0 d = { s = d.s ! DUnit } ** { n = Pl } ; - pot110 = { s = viens.s ! DTen } ** { n = Pl } ; - pot111 = { s = viens.s ! DTeen } ** { n = Pl } ; - pot1to19 d = { s = d.s ! DTeen } ** { n = Pl } ; - pot0as1 n = { s = n.s ; n = n.n } ; - pot1 d = { s = d.s ! DTen } ** { n = Pl } ; + pot01 = { s = viens.s ! DUnit } ** { num = Sg } ; + pot0 d = { s = d.s ! DUnit } ** { num = Pl } ; + pot110 = { s = viens.s ! DTen } ** { num = Pl } ; + pot111 = { s = viens.s ! DTeen } ** { num = Pl } ; + pot1to19 d = { s = d.s ! DTeen } ** { num = Pl } ; + pot0as1 n = { s = n.s ; num = n.num } ; + pot1 d = { s = d.s ! DTen } ** { num = Pl } ; pot1plus d e = { s = \\o,g,c => d.s ! DTen ! NCard ! Masc ! Nom ++ e.s ! o ! g ! c ; - n = e.n + num = e.num } ; pot1as2 n = n ; -- FIXME: nav īsti labi, kārtas skaitlim ir jābūt 'trīssimtais' utml pot2 d = { - s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ simts ! o ! g ! d.n ! c ; - n = Pl + s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ simts ! o ! g ! d.num ! c ; + num = Pl } ; pot2plus d e = { - s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ simts ! NCard ! Masc ! d.n ! Nom ++ e.s ! o ! g ! c ; - n = e.n + s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ simts ! NCard ! Masc ! d.num ! Nom ++ e.s ! o ! g ! c ; + num = e.num } ; pot2as3 n = n ; pot3 d = { - s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ tuukstotis ! o ! g ! d.n ! c ; - n = Pl + s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ tuukstotis ! o ! g ! d.num ! c ; + num = Pl } ; pot3plus d e = { - s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ tuukstotis ! NCard ! Masc ! d.n ! Nom ++ e.s ! o ! g ! c ; - n = e.n + s = \\o,g,c => d.s ! NCard ! Masc ! Nom ++ tuukstotis ! NCard ! Masc ! d.num ! Nom ++ e.s ! o ! g ! c ; + num = e.num } ; -- Numerals as sequences of digits: lincat - Dig = { n : Number ; s : CardOrd => Str } ; + Dig = { num : Number ; s : CardOrd => Str } ; lin IDig d = d ; IIDig d i = { s = \\o => d.s ! NCard ++ i.s ! o ; - n = Pl ; -- FIXME: 1 cilvēks, 11 cilvēki, 21 cilvēks, ... + num = Pl ; -- FIXME: 1 cilvēks, 11 cilvēki, 21 cilvēks, ... } ; D_0 = mkDig "0" ; @@ -111,7 +109,7 @@ oper mk2Dig : Str -> Number -> Dig = \c,n -> lin Dig { s = table { NCard => c ; NOrd => c + "." } ; - n = n + num = n } ; } diff --git a/lib/src/latvian/ParadigmsAdjectivesLav.gf b/lib/src/latvian/ParadigmsAdjectivesLav.gf index 0eb662a6a..8cc5cf9ad 100644 --- a/lib/src/latvian/ParadigmsAdjectivesLav.gf +++ b/lib/src/latvian/ParadigmsAdjectivesLav.gf @@ -1,18 +1,10 @@ --# -path=.:../abstract:../common:../prelude -resource ParadigmsAdjectivesLav = open - (Predef=Predef), - Prelude, - ResLav, - CatLav - in { +resource ParadigmsAdjectivesLav = open ResLav, CatLav, Predef, Prelude in { -flags - coding = utf8; +flags coding = utf8 ; oper - --Adj : Type = {s : Degree => Definite => Gender => Number => Case => Str} ; - Adj : Type = {s : AForm => Str} ; -- ADJECTIVES @@ -21,7 +13,7 @@ oper -- To keep the code and user interface (parameters) simple, Masc lemmas are expected. -- No parameters - default assumptions (type) - mkAdjective : Str -> Adj = \lemma -> + mkAdjective : Str -> Adjective = \lemma -> case lemma of { s + "ais" => mkAdjective_Rel lemma ; s + ("s"|"š") => mkAdjective_Qual lemma ; @@ -29,7 +21,7 @@ oper } ; -- Specified type - no defaults - mkAdjectiveByType : Str -> AType -> Adj = \lemma,type -> + mkAdjectiveByType : Str -> AType -> Adjective = \lemma,type -> case type of { AQual => mkAdjective_Qual lemma ; ARel => mkAdjective_Rel lemma ; @@ -37,7 +29,7 @@ oper } ; -- Indeclinable adjective: theoretically, any #vowel ending - mkAdjective_Indecl : Str -> Adj = \lemma -> { + mkAdjective_Indecl : Str -> Adjective = \lemma -> { s = table{ AAdj Superl Indef _ _ _ => NON_EXISTENT ; AAdj _ _ _ _ _ => lemma ; @@ -46,7 +38,7 @@ oper } ; -- Qualitative adjective: -s, -š - mkAdjective_Qual : Str -> Adj = \lemma -> { + mkAdjective_Qual : Str -> Adjective = \lemma -> { s = table { AAdj Posit d g n c => mkAdjective_Pos lemma d ! g ! n ! c ; AAdj Compar d g n c => mkAdjective_Comp lemma d ! g ! n ! c ; @@ -57,7 +49,7 @@ oper } ; -- Relative adjective: -ais (Def only); -s, -š (Indef and Def) - mkAdjective_Rel : Str -> Adj = \lemma -> { + mkAdjective_Rel : Str -> Adjective = \lemma -> { s = table { AAdj Posit Def g n c => mkAdjective_Pos lemma Def ! g ! n ! c ; AAdj Posit Indef g n c => case lemma of { @@ -74,7 +66,7 @@ oper -- TODO: Jāpieliek parametrs Tense: present = ziedošs, izsalkstošs; past = ziedējis, izsalcis. -- Vai arī jāpadod Str "-is"/"-ošs" un pa tiešo jāizsauc mkParticiple, bet -- kā šis mkA(Str) atšķirsies no citiem mkA(Str)? - mkAdjective_Participle : Verb -> Voice -> Adj = \v,p -> { + mkAdjective_Participle : Verb -> Voice -> Adjective = \v,p -> { s = table { AAdj Posit Indef g n c => v.s ! Pos ! (VPart p g n c) ; _ => NON_EXISTENT diff --git a/lib/src/latvian/ParadigmsLav.gf b/lib/src/latvian/ParadigmsLav.gf index ceeac0480..c44be3024 100644 --- a/lib/src/latvian/ParadigmsLav.gf +++ b/lib/src/latvian/ParadigmsLav.gf @@ -1,19 +1,20 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude resource ParadigmsLav = open - (Predef=Predef), - Prelude, + ResLav, + CatLav, ParadigmsNounsLav, + ParadigmsPronounsLav, ParadigmsAdjectivesLav, ParadigmsVerbsLav, - ParadigmsPronounsLav, - ResLav, - CatLav + Prelude, + Predef in { flags coding = utf8 ; oper + masculine : Gender = Masc ; feminine : Gender = Fem ; @@ -53,12 +54,12 @@ oper } ; mkN2 = overload { - mkN2 : N -> ResLav.Prep -> N2 = \n,p -> lin N2 n ** { p = p ; isPre = True } ; - mkN2 : N -> ResLav.Prep -> Bool -> N2 = \n,p,isPre -> lin N2 n ** { p = p ; isPre = isPre } ; + mkN2 : N -> Preposition -> N2 = \n,p -> lin N2 n ** { prep = p ; isPre = True } ; + mkN2 : N -> Preposition -> Bool -> N2 = \n,p,pp -> lin N2 n ** { prep = p ; isPre = pp } ; } ; - mkN3 : N -> ResLav.Prep -> ResLav.Prep -> N3 = \n,p1,p2 -> - lin N3 n ** { p1 = p1 ; p2 = p2 ; isPre1 = False ; isPre2 = False } ; + mkN3 : N -> Preposition -> Preposition -> N3 = \n,p1,p2 -> + lin N3 n ** { prep1 = p1 ; prep2 = p2 ; isPre1 = False ; isPre2 = False } ; mkA = overload { mkA : (lemma : Str) -> A = \s -> lin A (mkAdjective s) ; @@ -71,29 +72,35 @@ oper mkA : (v : Verb) -> Voice -> A = \v,p -> lin A (mkAdjective_Participle v p) ; } ; - mkA2 : A -> ResLav.Prep -> A2 = \a,p -> lin A2 (a ** { p = p }) ; -- precējies ar ... - mkAS : A -> AS =\a -> lin A a ; - mkA2S : A -> ResLav.Prep -> A2S =\a,p -> lin A2 (a ** { p = p }) ; - mkAV : A -> AV = \a -> lin A a ; - mkA2V : A -> ResLav.Prep -> A2V = \a,p -> lin A2 (a ** { p = p }) ; + AS, AV = A ; + mkAS : A -> AS = \a -> lin A a ; + mkAV : A -> AV = \a -> lin A a ; + + mkA2 : A -> Prep -> A2 = \a,p -> lin A2 (a ** { prep = p }) ; + + A2S, A2V = A2 ; + mkA2S : A -> Prep -> A2S =\a,p -> lin A2 (a ** { prep = p }) ; + mkA2V : A -> Prep -> A2V = \a,p -> lin A2 (a ** { prep = p }) ; - AS, AV : Type = { s : AForm => Str } ; - A2S, A2V : Type = { s : AForm => Str ; p : ResLav.Prep }; + -- Verbs mkV = overload { - mkV : (lemma : Str) -> V = \l -> lin V (mkVerb_Irreg l) ; - mkV : (lemma : Str) -> Conjugation -> V = \l,c -> lin V (mkVerb l c) ; - mkV : (lemma : Str) -> Str -> Str -> V = \l1,l2,l3 -> lin V (mkVerbC1 l1 l2 l3) ; + mkV : Str -> V = \s -> lin V (mkVerb_Irreg s Nom) ; + mkV : Str -> Case -> V = \s,c -> lin V (mkVerb_Irreg s c) ; + mkV : Str -> Conjugation -> V = \s,c -> lin V (mkVerb s c Nom) ; + mkV : Str -> Conjugation -> Case -> V = \s,conj,c -> lin V (mkVerb s conj c) ; + mkV : Str -> Str -> Str -> V = \s1,s2,s3 -> lin V (mkVerbC1 s1 s2 s3 Nom) ; + mkV : Str -> Str -> Str -> Case -> V = \s1,s2,s3,c -> lin V (mkVerbC1 s1 s2 s3 c) ; } ; mkV2 = overload { - mkV2 : V -> ResLav.Prep -> V2 = \v,p -> lin V2 v ** { p = p ; topic = Nom } ; - mkV2 : V -> ResLav.Prep -> Case -> V2 = \v,p,c -> lin V2 v ** { p = p ; topic = c } ; + mkV2 : V -> V2 = \v -> lin V2 v ** { focus = acc_Prep } ; + mkV2 : V -> Preposition -> V2 = \v,p -> lin V2 v ** { focus = p } ; } ; - + mkVS = overload { - mkVS : V -> Subj -> VS = \v,s -> lin VS v ** { subj = s ; topic = Nom } ; - mkVS : V -> Subj -> Case -> VS = \v,s,c -> lin VS v ** { subj = s ; topic = c } ; + mkVS : V -> Subj -> VS = \v,c -> lin VS v ** { conj = c ; topic = Nom } ; + mkVS : V -> Subj -> Case -> VS = \v,c,s -> lin VS v ** { conj = c ; topic = s } ; } ; mkVQ = overload { @@ -107,25 +114,25 @@ oper } ; mkV3 = overload { - mkV3 : V -> ResLav.Prep -> ResLav.Prep -> V3 = \v,p1,p2 -> - lin V3 v ** { p1 = p1 ; p2 = p2 ; topic = Nom } ; - mkV3 : V -> ResLav.Prep -> ResLav.Prep -> Case -> V3 = \v,p1,p2,c -> - lin V3 v ** { p1 = p1 ; p2 = p2 ; topic = c } ; + mkV3 : V -> Preposition -> Preposition -> V3 = \v,p1,p2 -> + lin V3 v ** { topic = Nom ; focus1 = p1 ; focus2 = p2 } ; + mkV3 : V -> Case -> Preposition -> Preposition -> V3 = \v,c,p1,p2 -> + lin V3 v ** { topic = c ; focus1 = p1 ; focus2 = p2 } ; } ; mkVA : V -> VA = \v -> lin VA v ; - mkV2S : V -> ResLav.Prep -> Subj -> V2S = \v,p,s -> lin V2S v ** { p = p ; subj = s } ; - mkV2A : V -> ResLav.Prep -> V2A = \v,p -> lin V2A v ** { p = p } ; - mkV2Q : V -> ResLav.Prep -> V2Q = \v,p -> lin V2Q v ** { p = p } ; - mkV2V : V -> ResLav.Prep -> V2V = \v,p -> lin V2V v ** { p = p } ; + mkV2S : V -> Subj -> Preposition -> V2S = \v,c,o -> lin V2S v ** { conj = c ; focus = o } ; + mkV2A : V -> Preposition -> V2A = \v,o -> lin V2A v ** { focus = o } ; + mkV2Q : V -> Preposition -> V2Q = \v,o -> lin V2Q v ** { focus = o } ; + mkV2V : V -> Preposition -> V2V = \v,o -> lin V2V v ** { focus = o } ; - mkCAdv : Str -> Str -> Degree -> CAdv = \s,p,d -> { s = s ; p = p ; d = d ; lock_CAdv = <> } ; + mkCAdv : Str -> Str -> Degree -> CAdv = \s,p,d -> lin CAdv { s = s ; prep = p ; deg = d } ; mkPrep = overload { - mkPrep : Str -> Case -> Case -> ResLav.Prep = \prep,sg,pl -> + mkPrep : Str -> Case -> Case -> Preposition = \prep,sg,pl -> lin Prep { s = prep ; c = table { Sg => sg ; Pl => pl } } ; - mkPrep : Case -> ResLav.Prep = \c -> lin Prep { s = [] ; c = table { _ => c } } ; + mkPrep : Case -> Preposition = \c -> lin Prep { s = [] ; c = table { _ => c } } ; } ; -- empty fake prepositions for valences @@ -148,7 +155,7 @@ oper mkConj : Str -> Str -> Number -> Conj = mk2Conj ; } ; - mk2Conj : Str -> Str -> Number -> Conj = \x,y,n -> lin Conj (sd2 x y ** { n = n }) ; + mk2Conj : Str -> Str -> Number -> Conj = \x,y,n -> lin Conj (sd2 x y ** { num = n }) ; viens = mkNumSpec "viens" "pirmais" "vien" "" Sg ; diff --git a/lib/src/latvian/ParadigmsNounsLav.gf b/lib/src/latvian/ParadigmsNounsLav.gf index e2e3a1226..5085dcca5 100644 --- a/lib/src/latvian/ParadigmsNounsLav.gf +++ b/lib/src/latvian/ParadigmsNounsLav.gf @@ -1,18 +1,10 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -resource ParadigmsNounsLav = open - (Predef=Predef), - Prelude, - ResLav, - CatLav - in { +resource ParadigmsNounsLav = open ResLav, CatLav, Prelude, Predef in { -flags - coding = utf8 ; +flags coding = utf8 ; oper - Noun : Type = { s : Number => Case => Str ; g : Gender } ; - PNoun : Type = { s : Case => Str ; g : Gender ; n : Number } ; masculine : Gender = Masc ; feminine : Gender = Fem ; @@ -21,13 +13,12 @@ oper mkNoun : Str -> Noun = \lemma -> mkNounByPal lemma True ; - mkProperNoun : Str -> Number -> PNoun = \lemma,number -> - let noun = mkNoun lemma - in { - s = \\c => noun.s ! number ! c ; - g = noun.g ; - n = number - } ; + mkProperNoun : Str -> Number -> ProperNoun = \lemma,num -> + let n = mkNoun lemma in { + s = \\c => n.s ! num ! c ; + gend = n.gend ; + num = num + } ; {- mkCardinalNumeral : Str -> CardinalNumeral = \lemma -> @@ -113,7 +104,7 @@ oper -- Expected endings: #vowel mkNoun_D0 : Str -> Gender -> Noun = \lemma,gend -> { s = \\_,_ => lemma ; - g = gend + gend = gend } ; -- Expected endings of a D1 lemma: @@ -143,7 +134,7 @@ oper Voc => stem + "i" } } ; - g = Masc + gend = Masc } ; -- Expected endings of a D2 lemma: @@ -174,7 +165,7 @@ oper Voc => palatalize stem pal + "i" } } ; - g = Masc + gend = Masc } ; -- Expected endings of a D3 lemma: @@ -201,7 +192,7 @@ oper Voc => stem + "i" } } ; - g = Masc + gend = Masc } ; -- Expected endings of a D4 lemma: @@ -228,7 +219,7 @@ oper Voc => stem + "as" } } ; - g = gend + gend = gend } ; -- Expected endings of a D5 lemma: @@ -255,7 +246,7 @@ oper Voc => stem + "es" } } ; - g = gend + gend = gend } ; -- Expected endings of a D6 lemma: @@ -285,7 +276,7 @@ oper Voc => stem + "is" } } ; - g = gend + gend = gend } ; -- Reflexive noun @@ -311,7 +302,7 @@ oper Voc => stem + "šanās" } } ; - g = Fem + gend = Fem } ; -- Exceptions diff --git a/lib/src/latvian/ParadigmsPronounsLav.gf b/lib/src/latvian/ParadigmsPronounsLav.gf index 61b202293..c2e1d87cc 100644 --- a/lib/src/latvian/ParadigmsPronounsLav.gf +++ b/lib/src/latvian/ParadigmsPronounsLav.gf @@ -1,31 +1,25 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -resource ParadigmsPronounsLav = open - (Predef=Predef), - Prelude, - ResLav, - CatLav - in { +resource ParadigmsPronounsLav = open ResLav, CatLav, Prelude, Predef in { -flags - coding = utf8 ; +flags coding = utf8 ; oper + PronGend : Type = { s : Gender => Number => Case => Str } ; - Pron : Type = { s : Case => Str ; a : ResLav.Agr ; poss : Gender => Number => Case => Str } ; --- PRONOUNS (incl. 'determiners') + -- Pronouns (incl. "determiners") - mkPronoun_I : Gender -> Pron = \g -> { + mkPronoun_I : Gender -> Pronoun = \gend -> { s = table { Nom => "es" ; Gen => "manis" ; Dat => "man" ; Acc => "mani" ; Loc => "manī" ; - ResLav.Voc => NON_EXISTENT + Voc => NON_EXISTENT } ; - a = AgP1 Sg g ; + agr = AgrP1 Sg gend ; poss = table { Masc => table { Sg => table { @@ -34,7 +28,7 @@ oper Dat => "manam" ; Acc => "manu" ; Loc => "manā" ; - ResLav.Voc => "mans" + Voc => "mans" } ; Pl => table { Nom => "mani" ; @@ -42,7 +36,7 @@ oper Dat => "maniem" ; Acc => "manus" ; Loc => "manos" ; - ResLav.Voc => "mani" + Voc => "mani" } } ; Fem => table { @@ -52,7 +46,7 @@ oper Dat => "manai" ; Acc => "manu" ; Loc => "manā" ; - ResLav.Voc => "mana" + Voc => "mana" } ; Pl => table { Nom => "manas" ; @@ -60,35 +54,37 @@ oper Dat => "manām" ; Acc => "manas" ; Loc => "manās" ; - ResLav.Voc => "manas" + Voc => "manas" } } - } + } ; + pol = Pos } ; - mkPronoun_We : Gender -> Pron = \g -> { + mkPronoun_We : Gender -> Pronoun = \gend -> { s = table { Nom => "mēs" ; Gen => "mūsu" ; Dat => "mums" ; Acc => "mūs" ; Loc => "mūsos" ; - ResLav.Voc => NON_EXISTENT + Voc => NON_EXISTENT } ; - a = AgP1 Pl g ; - poss = \\_,_,_ => "mūsu" + agr = AgrP1 Pl gend ; + poss = \\_,_,_ => "mūsu" ; + pol = Pos } ; - mkPronoun_You_Sg : Gender -> Pron = \g -> { + mkPronoun_You_Sg : Gender -> Pronoun = \gend -> { s = table { Nom => "tu" ; Gen => "tevis" ; Dat => "tev" ; Acc => "tevi" ; Loc => "tevī" ; - ResLav.Voc => "tu" + Voc => "tu" } ; - a = AgP2 Sg g ; + agr = AgrP2 Sg gend ; poss = table { Masc => table { Sg => table { @@ -97,7 +93,7 @@ oper Dat => "tavam" ; Acc => "tavu" ; Loc => "tavā" ; - ResLav.Voc => "tavs" + Voc => "tavs" }; Pl => table { Nom => "tavi" ; @@ -105,7 +101,7 @@ oper Dat => "taviem" ; Acc => "tavus" ; Loc => "tavos" ; - ResLav.Voc => "tavi" + Voc => "tavi" } } ; Fem => table { @@ -115,7 +111,7 @@ oper Dat => "tavai" ; Acc => "tavu" ; Loc => "tavā" ; - ResLav.Voc => "tava" + Voc => "tava" }; Pl => table { Nom => "tavas" ; @@ -123,48 +119,53 @@ oper Dat => "tavām" ; Acc => "tavas" ; Loc => "tavās" ; - ResLav.Voc => "tavas" + Voc => "tavas" } } - } + } ; + pol = Pos } ; - mkPronoun_You_Pol : Gender -> Pron = \g -> { + mkPronoun_You_Pol : Gender -> Pronoun = \gend -> { s = table { Nom => "Jūs" ; Gen => "Jūsu" ; Dat => "Jums" ; Acc => "Jūs" ; Loc => "Jūsos" ; - ResLav.Voc => "Jūs" + Voc => "Jūs" } ; - a = AgP2 Pl g ; -- FIXME: in the case of a predicate nominal: copula=Pl, complement=Sg - poss = \\_,_,_ => "Jūsu" + agr = AgrP2 Pl gend ; -- FIXME: in the case of a predicate nominal: copula=Pl, complement=Sg + poss = \\_,_,_ => "Jūsu" ; + pol = Pos } ; - mkPronoun_You_Pl : Gender -> Pron = \g -> { + mkPronoun_You_Pl : Gender -> Pronoun = \gend -> { s = table { Nom => "jūs" ; Gen => "jūsu" ; Dat => "jums" ; Acc => "jūs" ; Loc => "jūsos" ; - ResLav.Voc => "jūs" + Voc => "jūs" } ; - a = AgP2 Pl g ; - poss = \\_,_,_ => "jūsu" + agr = AgrP2 Pl gend ; + poss = \\_,_,_ => "jūsu" ; + pol = Pos } ; - mkPronoun_They : Gender -> Pron = \g -> { - s = \\c => (mkPronoun_Gend "viņš").s ! g ! Pl ! c ; - a = AgP3 Pl g Pos ; - poss = \\_,_,_ => "viņu" + mkPronoun_They : Gender -> Pronoun = \gend -> { + s = \\c => (mkPronoun_Gend "viņš").s ! gend ! Pl ! c ; + agr = AgrP3 Pl gend ; + poss = \\_,_,_ => "viņu" ; + pol = Pos } ; - mkPronoun_It_Sg : Gender -> Pron = \g -> { - s = \\c => (mkPronoun_ThisThat That).s ! g ! Sg ! c ; - a = AgP3 Sg g Pos ; - poss = \\_,_,_ => case g of { Masc => "tā" ; Fem => "tās" } + mkPronoun_It_Sg : Gender -> Pronoun = \gend -> { + s = \\c => (mkPronoun_ThisThat That).s ! gend ! Sg ! c ; + agr = AgrP3 Sg gend ; + poss = \\_,_,_ => case gend of { Masc => "tā" ; Fem => "tās" } ; + pol = Pos } ; -- Gender=>Number=>Case P3 pronouns @@ -268,7 +269,7 @@ oper } ; -- Everything, something, nothing, i.e., all that end with "kas" - mkPronoun_Thing : Str -> Polarity -> Pron = \lemma,pol -> + mkPronoun_Thing : Str -> Polarity -> Pronoun = \lemma,pol -> let stem : Str = Predef.tk 3 lemma in { s = \\c => table { @@ -279,15 +280,17 @@ oper Loc => case stem of { "kaut" => stem ++ "kur" ; _ => stem + "kur" } ; Voc => NON_EXISTENT } ! c ; - a = AgP3 Sg Masc pol ; - poss = \\_,_,_ => case stem of { "kaut" => stem ++ "kā" ; _ => stem + "kā" } + agr = AgrP3 Sg Masc ; + poss = \\_,_,_ => case stem of { "kaut" => stem ++ "kā" ; _ => stem + "kā" } ; + pol = pol } ; -- Everybody, somebody, nobody - mkPronoun_Body : Str -> Polarity -> Pron = \lemma,pol -> { + mkPronoun_Body : Str -> Polarity -> Pronoun = \lemma,pol -> { s = \\c => (mkPronoun_Gend lemma).s ! Masc ! Sg ! c ; - a = AgP3 Sg Masc pol ; + agr = AgrP3 Sg Masc ; poss = \\_,_,_ => (mkPronoun_Gend lemma).s ! Masc ! Sg ! Gen ; + pol = pol } ; } ; diff --git a/lib/src/latvian/ParadigmsVerbsLav.gf b/lib/src/latvian/ParadigmsVerbsLav.gf index 896961713..30c5ac68f 100644 --- a/lib/src/latvian/ParadigmsVerbsLav.gf +++ b/lib/src/latvian/ParadigmsVerbsLav.gf @@ -1,32 +1,29 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -resource ParadigmsVerbsLav = open - (Predef=Predef), - Prelude, - ResLav, - CatLav - in { +resource ParadigmsVerbsLav = open ResLav, CatLav, Prelude, Predef in { -flags - coding = utf8 ; +flags coding = utf8 ; oper + Verb_TMP : Type = {s : VForm => Str} ; -- Second and third conjugations - mkVerb : Str -> Conjugation -> Verb = \lemma,conj -> { + mkVerb : Str -> Conjugation -> Case -> Verb = \lemma,conj,topic -> { s = table { Pos => (mkVerb_Pos lemma conj).s ; Neg => (filter_Neg (mkVerb_Pos ("ne"+lemma) conj)).s - } + } ; + topic = topic } ; -- First conjugation - mkVerbC1 : Str -> Str -> Str -> Verb = \lemma,lemma2,lemma3 -> { + mkVerbC1 : Str -> Str -> Str -> Case -> Verb = \lemma,lemma2,lemma3,topic -> { s = table { Pos => (mkVerbC1_Pos lemma lemma2 lemma3).s ; Neg => (filter_Neg (mkVerbC1_Pos ("ne"+lemma) ("ne"+lemma2) ("ne"+lemma3))).s - } + } ; + topic = topic } ; mkVerb_Pos : Str -> Conjugation -> Verb_TMP = \lemma,conj -> @@ -347,18 +344,19 @@ oper } } ; - mkVerb_Irreg : Str -> Verb = \lemma -> + mkVerb_Irreg : Str -> Case -> Verb = \lemma,topic -> case lemma of { - "būt" => mkVerb_Irreg_Be ; - "iet" => mkVerb_Irreg_Go ; - #prefix + "iet" => mkVerb_Irreg_Go_Prefix (Predef.tk 3 lemma) ; - "gulēt" => mkVerb_Irreg_Sleep -- FIXME: Should be treated as a regular verb (C3: gulēt, sēdēt etc.) + "būt" => mkVerb_Irreg_Be topic ; + "iet" => mkVerb_Irreg_Go topic ; + #prefix + "iet" => mkVerb_Irreg_Go_Prefix (Predef.tk 3 lemma) topic ; + "gulēt" => mkVerb_Irreg_Sleep topic + -- FIXME: "gulēt" should be treated as a regular verb (C3: gulēt, sēdēt etc.) -- TODO: add "dot"/Give (+prefix, +refl) -- TODO: multiple prefixes -- TODO: move to IrregLav? } ; - mkVerb_Irreg_Be : Verb = { + mkVerb_Irreg_Be : Case -> Verb = \topic -> { s = table { Pos => table { VInd P1 Sg Pres => "esmu" ; @@ -374,18 +372,18 @@ oper VInd P2 Sg Pres => "neesi" ; VInd P3 _ Pres => "nav" ; - VDeb => NON_EXISTENT ; - + VDeb => NON_EXISTENT ; VDebRel => NON_EXISTENT ; x => (mkVerb_C1 "nebūt" "neesu" "nebiju").s ! x -- the incorrect 'neesu' will be overriden } - } + } ; + topic = topic } ; - mkVerb_Irreg_Go : Verb = mkVerb_Irreg_Go_Prefix "" ; + mkVerb_Irreg_Go : Case -> Verb = \topic -> mkVerb_Irreg_Go_Prefix "" topic ; - mkVerb_Irreg_Go_Prefix : Str -> Verb = \pref -> { + mkVerb_Irreg_Go_Prefix : Str -> Case -> Verb = \pref,topic -> { s = table { Pos => table { VInd P3 _ Pres => pref + "iet" ; @@ -398,10 +396,11 @@ oper VDebRel => NON_EXISTENT ; x => (mkVerb_C1 ("ne" + pref + "iet") ("ne" + pref + "eju") ("ne" + pref + "gāju")).s ! x } - } + } ; + topic = topic } ; - mkVerb_Irreg_Sleep : Verb = { + mkVerb_Irreg_Sleep : Case -> Verb = \topic -> { s = table { Pos => table { VInd P2 Sg Pres => (mkVerb_C3 "gulēt").s ! VInd P2 Sg Pres ; @@ -429,7 +428,8 @@ oper x => (mkVerb_C3 "negulēt").s ! x } - } + } ; + topic = topic } ; -- Auxiliaries: palatalization rules diff --git a/lib/src/latvian/PhraseLav.gf b/lib/src/latvian/PhraseLav.gf index a8ff39be1..de81ba609 100644 --- a/lib/src/latvian/PhraseLav.gf +++ b/lib/src/latvian/PhraseLav.gf @@ -1,14 +1,11 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -concrete PhraseLav of Phrase = CatLav ** open - ResLav, - VerbLav - in { +concrete PhraseLav of Phrase = CatLav ** open ResLav in { -flags - coding = utf8 ; +flags coding = utf8 ; lin + PhrUtt pconj utt voc = { s = pconj.s ++ utt.s ++ voc.s } ; UttS s = { s = s.s } ; @@ -22,8 +19,7 @@ lin UttAP ap = { s = ap.s ! Indef ! Masc ! Sg ! Nom } ; UttAdv adv = adv ; - -- FIXME: neesmu līdz galam drošs vai agreement ir tieši (AgPr Pl) - UttVP vp = { s = build_VP vp Pos VInf (AgP3 Pl Masc Pos) } ; + UttVP vp = { s = buildVP vp Pos VInf (AgrP3 Pl Masc) } ; UttIP ip = { s = ip.s ! Nom } ; UttIAdv iadv = iadv ; diff --git a/lib/src/latvian/QuestionLav.gf b/lib/src/latvian/QuestionLav.gf index 0d463ef7f..99b61bba1 100644 --- a/lib/src/latvian/QuestionLav.gf +++ b/lib/src/latvian/QuestionLav.gf @@ -1,30 +1,31 @@ --# -path=.:../abstract:../common:../prelude concrete QuestionLav of Question = CatLav ** open - ResLav, VerbLav, - Prelude, - ParadigmsVerbsLav + ParadigmsLav, + ResLav, + Prelude in { flags + optimize = all_subs ; coding = utf8 ; lin QuestCl cl = { s = \\m,p => "vai" ++ cl.s ! m ! p } ; - QuestVP ip vp = { s = \\m,p => ip.s ! Nom ++ buildVerb vp.v m p (AgP3 ip.n Masc Pos) Pos vp.objNeg } ; + QuestVP ip vp = { s = \\m,p => ip.s ! Nom ++ buildVerb vp.v m p (AgrP3 ip.num Masc) Pos vp.agr.focus } ; - QuestSlash ip slash = { s = \\m,p => slash.p.s ++ ip.s ! (slash.p.c ! ip.n) ++ slash.s ! m ! p } ; + QuestSlash ip slash = { s = \\m,p => slash.prep.s ++ ip.s ! (slash.prep.c ! ip.num) ++ slash.s ! m ! p } ; QuestIAdv iadv cl = { s = \\m,p => iadv.s ++ cl.s ! m ! p } ; - QuestIComp icomp np = { s = \\m,p => icomp.s ++ buildVerb mkVerb_Irreg_Be m p np.a (fromAgr np.a).pol Pos ++ np.s ! Nom } ; + QuestIComp icomp np = { s = \\m,p => icomp.s ++ buildVerb (mkV "būt") m p np.agr np.pol Pos ++ np.s ! Nom } ; IdetQuant idet num = { - s = \\g => idet.s ! g ! num.n ++ num.s ! g ! Nom ; - n = num.n + s = \\g => idet.s ! g ! num.num ++ num.s ! g ! Nom ; + num = num.num } ; -- FIXME: quick&dirty - lai kompilētos pret RGL API @@ -34,19 +35,19 @@ lin AdvIP ip adv = { s = \\c => ip.s ! c ++ adv.s ; - n = ip.n + num = ip.num } ; - PrepIP p ip = { s = p.s ++ ip.s ! (p.c ! ip.n) } ; + PrepIP p ip = { s = p.s ++ ip.s ! (p.c ! ip.num) } ; IdetCN idet cn = { - s = \\c => idet.s ! cn.g ++ cn.s ! Def ! idet.n ! c ; - n = idet.n + s = \\c => idet.s ! cn.gend ++ cn.s ! Def ! idet.num ! c ; + num = idet.num } ; IdetIP idet = { s = \\c => (idet.s ! Masc) | (idet.s ! Fem) ; - n = idet.n + num = idet.num } ; CompIAdv a = a ; diff --git a/lib/src/latvian/RelativeLav.gf b/lib/src/latvian/RelativeLav.gf index b9f7663b8..9fee422c9 100644 --- a/lib/src/latvian/RelativeLav.gf +++ b/lib/src/latvian/RelativeLav.gf @@ -17,35 +17,39 @@ lin RelVP rp vp = mkRelClause rp vp ; oper - -- TODO: PassV2 verbs jāsaskaņo ar objektu, nevis subjektu (by8means_Prep: AgP3 Sg Masc) + + -- TODO: PassV2 verbs jāsaskaņo ar objektu, nevis subjektu (by8means_Prep: AgP3 Sg Masc) - done? mkRelClause : RP -> CatLav.VP -> RCl = \rp,vp -> - let subj : Case = case vp.voice of { - Act => vp.val.subj ; - Pass => vp.val.obj - } in lin RCl { + let subjInTopic : Bool = case of { + => True ; + => False ; + => False ; + => True + } + in lin RCl { s = \\mood,pol,agr => - case mood of { -- Subject + case mood of { -- subject Deb _ _ => rp.s ! Masc ! Dat ; --# notpresent - _ => rp.s ! Masc ! vp.val.subj + _ => rp.s ! Masc ! vp.topic } ++ - case subj of { -- Verb - Nom => buildVerb vp.v mood pol (AgP3 (fromAgr agr).num (fromAgr agr).gend Pos) Pos vp.objNeg ; -- TODO: kāpēc P3 nevis agr, kāds tas ir? - _ => buildVerb vp.v mood pol vp.val.agr Pos vp.objNeg -- TODO: test me + case subjInTopic of { -- verb + True => buildVerb vp.v mood pol (AgrP3 (fromAgr agr).num (fromAgr agr).gend) Pos vp.agr.focus ; + False => buildVerb vp.v mood pol vp.agr.subj Pos vp.agr.focus } ++ - vp.compl ! agr -- Object(s), complements, adverbial modifiers + vp.compl ! agr -- object(s), complements, adverbial modifiers } ; lin -- FIXME: vārdu secība - nevis 'kas mīl viņu' bet 'kas viņu mīl' (?) -- FIXME: Masc varētu nebūt labi RelSlash rp slash = { - s = \\m,p,ag => slash.p.s ++ rp.s ! Masc ! (slash.p.c ! Sg) ++ slash.s ! m ! p + s = \\m,p,ag => slash.prep.s ++ rp.s ! Masc ! (slash.prep.c ! Sg) ++ slash.s ! m ! p } ; -- FIXME: placeholder -- TODO: jātestē, kautkas nav labi ar testpiemēru FunRP p np rp = { - s = \\g,c => p.s ++ rp.s ! g ! c ++ np.s ! (p.c ! (fromAgr np.a).num) + s = \\g,c => p.s ++ rp.s ! g ! c ++ np.s ! (p.c ! (fromAgr np.agr).num) } ; IdRP = { diff --git a/lib/src/latvian/ResLav.gf b/lib/src/latvian/ResLav.gf index fd848b657..25303e5b3 100644 --- a/lib/src/latvian/ResLav.gf +++ b/lib/src/latvian/ResLav.gf @@ -1,4 +1,4 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude resource ResLav = ParamX ** open Prelude in { @@ -29,7 +29,7 @@ param Voice = Act | Pass ; Conjugation = C2 | C3 ; -- C1 - "irregular" verbs - -- Verb mood: + -- Verb moods: -- Ind - indicative -- Rel - relative (http://www.isocat.org/rest/dc/3836) -- Deb - debitive (http://www.isocat.org/rest/dc/3835) @@ -50,14 +50,11 @@ param | VDebRel -- the relative subtype of debitive | VPart Voice Gender Number Case ; - -- Verb agreement: - -- Number depends on Subject.Person - -- Subject.Gender has to be agreed in predicative nominal clauses, and in participle forms - -- Polarity - double negation, if the subject/object NP has a negated determiner - Agr = - AgP1 Number Gender - | AgP2 Number Gender - | AgP3 Number Gender Polarity ; + -- Number and Gender has to be agreed in predicative nominal clauses + Agreement = + AgrP1 Number Gender + | AgrP2 Number Gender + | AgrP3 Number Gender ; -- Other @@ -68,38 +65,70 @@ param oper - Verb : Type = { s : Polarity => VForm => Str } ; + Noun : Type = { s : Number => Case => Str ; gend : Gender } ; - Valence : Type = { subj : Case ; obj : Case ; agr : Agr } ; - -- TODO: jāpāriet uz vienotu TopicFocus parametru - -- TODO: ieraksta tips (c:CaseCase, p:Prep; kam ir agr?) vai algebr. param.? + ProperNoun : Type = { s : Case => Str ; gend : Gender ; num : Number } ; + + Pronoun : Type = { s : Case => Str ; agr : Agreement ; poss : Gender => Number => Case => Str ; pol : Polarity } ; - Prep : Type = { s : Str ; c : Number => Case } ; + Adjective : Type = { s : AForm => Str } ; + + Preposition : Type = { s : Str ; c : Number => Case } ; -- For simple case-based valences, the preposition is empty ([]) - -- TODO: position of prepositions (pre or post) + -- TODO: position of prepositions (pre or post) ? - VP = { v : Verb ; compl : Agr => Str ; val : Valence ; objNeg : Polarity ; voice : Voice } ; - -- compl: objects, complements, adverbial modifiers - -- TODO: lai varētu spēlēties ar vārdu secību, compl vēlāk būs jāskalda pa daļām + Verb : Type = { s : Polarity => VForm => Str ; topic : Case } ; - VPSlash = VP ** { p : Prep } ; - -- TODO: p pārklājas ar val.obj un val.agr / vai vp.p = v.p? + VP : Type = { + v : Verb ; + agr : { + subj : Agreement ; -- the verb-subject agreement (the subject can be in the focus part of a clause) + focus : Polarity -- the verb-focus agreement (for the double negation) -- TODO: jāpārsauc par pol, lai nejūk citur + } ; + compl : Agreement => Str ; -- the complement-subject agreement + voice : Voice ; + topic : Case -- the valence of the topic NP (typically, the subject) + } ; - toAgr : Person -> Number -> Gender -> Polarity -> Agr = \pers,num,gend,pol -> + VPSlash : Type = VP ** { focus : Preposition } ; -- the valence of the focus NP (typically, the object) + + insertObj : (Agreement => Str) -> VP -> VP = \obj,vp -> { + v = vp.v ; + agr = vp.agr ; + compl = \\agr => vp.compl ! agr ++ obj ! agr ; + voice = vp.voice ; + topic = vp.topic + } ; + + insertObjC : (Agreement => Str) -> VPSlash -> VPSlash = \obj,vp -> + insertObj obj vp ** { focus = vp.focus } ; + + insertObjPre : (Agreement => Str) -> VP -> VP = \obj,vp -> { + v = vp.v ; + agr = vp.agr ; + compl = \\agr => obj ! agr ++ vp.compl ! agr ; + voice = vp.voice ; + topic = vp.topic + } ; + + buildVP : VP -> Polarity -> VForm -> Agreement -> Str = \vp,pol,vf,agr -> + vp.v.s ! pol ! vf ++ vp.compl ! agr ; + + toAgr : Person -> Number -> Gender -> Agreement = \pers,num,gend -> case pers of { - P1 => AgP1 num gend ; - P2 => AgP2 num gend ; - P3 => AgP3 num gend pol + P1 => AgrP1 num gend ; + P2 => AgrP2 num gend ; + P3 => AgrP3 num gend } ; - fromAgr : Agr -> { pers : Person ; num : Number ; gend : Gender ; pol : Polarity } = \agr -> + fromAgr : Agreement -> { pers : Person ; num : Number ; gend : Gender } = \agr -> case agr of { - AgP1 num gend => { pers = P1 ; num = num ; gend = gend ; pol = Pos } ; - AgP2 num gend => { pers = P2 ; num = num ; gend = gend ; pol = Pos } ; - AgP3 num gend pol => { pers = P3 ; num = num ; gend = gend ; pol = pol } + AgrP1 num gend => { pers = P1 ; num = num ; gend = gend } ; + AgrP2 num gend => { pers = P2 ; num = num ; gend = gend } ; + AgrP3 num gend => { pers = P3 ; num = num ; gend = gend } } ; - conjAgr : Agr -> Agr -> Agr = \agr1,agr2 -> + conjAgr : Agreement -> Agreement -> Agreement = \agr1,agr2 -> let a1 = fromAgr agr1 ; a2 = fromAgr agr2 @@ -107,8 +136,7 @@ oper toAgr (conjPerson a1.pers a2.pers) -- FIXME: personu apvienošana ir tricky un ir jāuztaisa korekti (conjNumber a1.num a2.num) - (conjGender a1.gend a2.gend) - (conjPolarity a1.pol a2.pol) ; + (conjGender a1.gend a2.gend) ; conjGender : Gender -> Gender -> Gender = \gend1,gend2 -> case gend1 of { @@ -116,20 +144,6 @@ oper _ => Masc } ; - conjPolarity : Polarity -> Polarity -> Polarity = \pol1,pol2 -> - case pol1 of { - Neg => Neg ; - _ => pol2 - } ; - - toVal : Case -> Case -> Agr -> Valence = \subj,obj,agr -> { - subj = subj ; - obj = obj ; - agr = agr - } ; - - toVal_Reg : Case -> Valence = \subj -> toVal subj Nom (AgP3 Sg Masc Pos) ; - vowel : pattern Str = #("a"|"ā"|"e"|"ē"|"i"|"ī"|"o"|"u"|"ū") ; simpleCons : pattern Str = #("c"|"d"|"l"|"n"|"s"|"t"|"z") ; diff --git a/lib/src/latvian/SentenceLav.gf b/lib/src/latvian/SentenceLav.gf index f327f9db9..e945bee01 100644 --- a/lib/src/latvian/SentenceLav.gf +++ b/lib/src/latvian/SentenceLav.gf @@ -16,27 +16,30 @@ lin PredSCVP sc vp = mkClauseSC sc vp ; - ImpVP vp = { s = \\pol,n => vp.v.s ! pol ! (VImp n) ++ vp.compl ! (AgP2 n Masc) } ; + ImpVP vp = { s = \\pol,num => vp.v.s ! pol ! (VImp num) ++ vp.compl ! (AgrP2 num Masc) } ; - SlashVP np vp = mkClause np vp ** { p = vp.p } ; + SlashVP np vp = mkClause np vp ** { prep = vp.focus } ; AdvSlash slash adv = { s = \\m,p => slash.s ! m ! p ++ adv.s ; - p = slash.p + prep = slash.prep } ; - SlashPrep cl prep = cl ** { p = prep } ; + SlashPrep cl prep = cl ** { prep = prep } ; - SlashVS np vs sslash = - mkClause np (lin VP { + -- NP -> VS -> SSlash -> ClSlash + -- e.g. '(whom) she says that he loves' + SlashVS np vs sslash = mkClause + np + (lin VP { v = vs ; - compl = \\_ => "," ++ vs.subj.s ++ sslash.s ; - val = toVal_Reg vs.topic ; - objNeg = Pos ; - voice = Act - }) ** { p = sslash.p } ; + agr = { subj = variants {} ; focus = Pos } ; + compl = \\_ => "," ++ vs.conj.s ++ sslash.s ; + voice = Act ; + topic = vs.topic + }) ** { prep = sslash.prep } ; - ComplVS v s = { v = v ; compl = \\_ => "," ++ v.subj.s ++ s.s } ; + -- ComplVS v s = { v = v ; compl = \\_ => "," ++ v.subj.s ++ s.s } ; -- TODO: nočekot kāpēc te ir tieši 'ka' EmbedS s = { s = "ka" ++ s.s } ; @@ -44,7 +47,7 @@ lin EmbedQS qs = { s = qs.s } ; -- FIXME: vai agr ir Pl? - EmbedVP vp = { s = build_VP vp Pos VInf (AgP3 Pl Masc Pos) } ; + EmbedVP vp = { s = buildVP vp Pos VInf (AgrP3 Pl Masc) } ; UseCl t p cl = { s = t.s ++ p.s ++ cl.s ! (Ind t.a t.t) ! p.p } ; UseQCl t p cl = { s = t.s ++ p.s ++ cl.s ! (Ind t.a t.t) ! p.p } ; @@ -54,7 +57,7 @@ lin | { s = \\ag => t.s ++ p.s ++ cl.s ! (Rel t.a t.t) ! p.p ! ag } --# notpresent ; - UseSlash t p slash = { s = t.s ++ p.s ++ slash.s ! (Ind t.a t.t) ! p.p ; p = slash.p } ; + UseSlash t p slash = { s = t.s ++ p.s ++ slash.s ! (Ind t.a t.t) ! p.p ; prep = slash.prep } ; -- FIXME: placeholder AdvS a s = { s = NON_EXISTENT } ; @@ -62,28 +65,27 @@ lin oper -- TODO: PassV2 verbs jāsaskaņo ar objektu, nevis subjektu (by8means_Prep: AgP3 Sg Masc) mkClause : NP -> CatLav.VP -> Cl = \np,vp -> - let subj : Case = case vp.voice of { - Act => vp.val.subj ; - Pass => vp.val.obj - } in lin Cl { + let agr : Agreement = case of { + => np.agr ; + => vp.agr.subj ; + => vp.agr.subj ; + => np.agr + } + in lin Cl { s = \\mood,pol => - case mood of { -- Subject + case mood of { -- subject Deb _ _ => np.s ! Dat ; --# notpresent - _ => np.s ! vp.val.subj + _ => np.s ! vp.topic } ++ - case subj of { -- Verb - -- TODO: vai np.a un np.a.pol argumentus nevar apvienot? - Nom => buildVerb vp.v mood pol np.a (fromAgr np.a).pol vp.objNeg ; - _ => buildVerb vp.v mood pol vp.val.agr (fromAgr np.a).pol vp.objNeg -- TESTME - } ++ - vp.compl ! np.a -- Object(s), complements, adverbial modifiers + buildVerb vp.v mood pol agr np.pol vp.agr.focus ++ -- verb + vp.compl ! np.agr -- object(s), complements, adverbial modifiers } ; -- FIXME: quick&dirty - lai kompilētos pret RGL API -- Eng: PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp -- Ar SC nav iespējams neko saskaņot (sk. Cat.gf un Common.gf) mkClauseSC : SC -> CatLav.VP -> Cl = \sc,vp -> lin Cl { - s = \\mood,pol => sc.s ++ buildVerb vp.v mood pol (AgP3 Sg Masc Pos) Pos vp.objNeg ++ vp.compl ! (AgP3 Sg Masc Pos) + s = \\mood,pol => sc.s ++ buildVerb vp.v mood pol (AgrP3 Sg Masc) Pos vp.agr.focus ++ vp.compl ! (AgrP3 Sg Masc) } ; } diff --git a/lib/src/latvian/StructuralLav.gf b/lib/src/latvian/StructuralLav.gf index 0e3be4146..e92d4590f 100644 --- a/lib/src/latvian/StructuralLav.gf +++ b/lib/src/latvian/StructuralLav.gf @@ -1,80 +1,82 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude concrete StructuralLav of Structural = CatLav ** open - Prelude, ResLav, ParadigmsLav, ParadigmsPronounsLav, - NounLav - in { + NounLav, + Prelude +in { flags + optimize = all ; coding = utf8 ; lin + language_title_Utt = ss "latviešu valoda" ; yes_Utt = ss "jā" ; no_Utt = ss "nē" ; every_Det = { - s = (\\g,c => (mkPronoun_Gend "ikviens").s ! g ! Sg ! c) ; - n = Sg ; - d = Indef ; + s = (\\gend,c => (mkPronoun_Gend "ikviens").s ! gend ! Sg ! c) ; + num = Sg ; + defin = Indef ; pol = Pos } ; someSg_Det = { - s = (\\g,c => (mkPronoun_Gend "kāds").s ! g ! Sg ! c) ; -- TODO: lai atļautu arī tukšo, jāpieliek alternatīva: (\\_,_ => []) - n = Sg ; - d = Indef ; + s = (\\gend,c => (mkPronoun_Gend "kāds").s ! gend ! Sg ! c) ; -- TODO: lai atļautu arī tukšo, jāpieliek alternatīva: (\\_,_ => []) + num = Sg ; + defin = Indef ; pol = Pos } ; somePl_Det = { - s = (\\g,c => (mkPronoun_Gend "kāds").s ! g ! Pl ! c) ; -- TODO: lai atļautu arī tukšo, jāpieliek alternatīva: (\\_,_ => []) - n = Pl ; - d = Indef ; + s = (\\gend,c => (mkPronoun_Gend "kāds").s ! gend ! Pl ! c) ; -- TODO: lai atļautu arī tukšo, jāpieliek alternatīva: (\\_,_ => []) + num = Pl ; + defin = Indef ; pol = Pos } ; few_Det = { - s = (\\g,c => (mkPronoun_Gend "dažs").s ! g ! Pl ! c) ; - n = Pl ; - d = Indef ; + s = (\\gend,c => (mkPronoun_Gend "dažs").s ! gend ! Pl ! c) ; + num = Pl ; + defin = Indef ; pol = Pos } ; many_Det = { - s = (\\g,c => (mkPronoun_Gend "daudzs").s ! g ! Pl ! c) ; -- 'daudzs' izlocīsies korekti uz daudzskaitļa 'daudzi'; tomēr nesmuki... - n = Pl ; - d = Indef ; + s = (\\gend,c => (mkPronoun_Gend "daudzs").s ! gend ! Pl ! c) ; -- 'daudzs' izlocīsies korekti uz daudzskaitļa 'daudzi'; tomēr nesmuki... + num = Pl ; + defin = Indef ; pol = Pos } ; much_Det = { - s = (\\g,c => "daudz") ; -- FIXME: piesaista ģenitīvu - n = Sg ; - d = Indef ; + s = (\\gend,c => "daudz") ; -- FIXME: piesaista ģenitīvu + num = Sg ; + defin = Indef ; pol = Pos } ; this_Quant = { s = (mkPronoun_ThisThat This).s ; - d = Def ; + defin = Def ; pol = Pos } ; that_Quant = { s = (mkPronoun_ThisThat That).s ; - d = Def ; + defin = Def ; pol = Pos } ; no_Quant = { s = (mkPronoun_Gend "neviens").s ; - d = Indef ; + defin = Indef ; pol = Neg } ; @@ -96,14 +98,16 @@ lin he_Pron = { s = \\c => (mkPronoun_Gend "viņš").s ! Masc ! Sg ! c ; - a = AgP3 Sg Masc Pos ; - poss = \\_,_,_ => "viņa" + agr = AgrP3 Sg Masc ; + poss = \\_,_,_ => "viņa" ; + pol = Pos } ; she_Pron = { s = \\c => (mkPronoun_Gend "viņš").s ! Fem ! Sg ! c ; - a = AgP3 Sg Fem Pos ; - poss = \\_,_,_ => "viņas" + agr = AgrP3 Sg Fem ; + poss = \\_,_,_ => "viņas" ; + pol = Pos } ; they_Pron = mkPronoun_They Masc ; -- See also: ExtraLav.they8fem_Pron @@ -174,7 +178,7 @@ lin Loc => "kurā" ; ResLav.Voc => NON_EXISTENT } ; - n = Sg + num = Sg } ; whoPl_IP = { -- FIXME: Fem @@ -186,7 +190,7 @@ lin Loc => "kuros" ; ResLav.Voc => NON_EXISTENT } ; - n = Pl + num = Pl } ; whatSg_IP = { @@ -198,7 +202,7 @@ lin Loc => "kur" ; ResLav.Voc => NON_EXISTENT } ; - n = Sg + num = Sg } ; whatPl_IP = { @@ -210,7 +214,7 @@ lin Loc => "kur" ; ResLav.Voc => NON_EXISTENT } ; - n = Pl + num = Pl } ; why_IAdv = ss "kāpēc" ; @@ -228,7 +232,7 @@ lin how8many_IDet = { s = table { _ => "cik" } ; - n = Pl + num = Pl } ; when_Subj = ss "kad" ; @@ -254,13 +258,13 @@ lin nobody_NP = UsePron (mkPronoun_Body "neviens" Neg) ; nothing_NP = UsePron (mkPronoun_Thing "nekas" Neg) ; - have_V2 = mkV2 (mkV "būt") nom_Prep Dat ; - --have_V3 = mkV3 (mkV "būt") nom_Prep dat_Prep Dat ; + have_V2 = mkV2 (mkV "būt" Dat) nom_Prep ; + --have_V3 = mkV3 (mkV "būt") Dat nom_Prep dat_Prep ; want_VV = mkVV (mkV "vēlēties" third_conjugation) ; can_VV = mkVV (mkV "varēt" third_conjugation) ; can8know_VV = mkVV (mkV "varēt" third_conjugation) ; - must_VV = mkVV (mkV "vajadzēt" third_conjugation) Dat ; + must_VV = mkVV (mkV "vajadzēt" third_conjugation Dat) ; please_Voc = ss "lūdzu" ; @@ -281,13 +285,13 @@ oper {- Netiek izmantoti; to vietā sk. ExtraLav emptyPl_Det = { s : Gender => Case => Str = \\_,_ => [] ; - n = Pl ; - d = Indef + num = Pl ; + defin = Indef } ; emptySg_Det = { -- TODO: analoģiski kā emptyPl_Det s : Gender => Case => Str = \\_,_ => [] ; - n = Sg ; - d = Indef + num = Sg ; + defin = Indef } ; -} diff --git a/lib/src/latvian/SymbolLav.gf b/lib/src/latvian/SymbolLav.gf index 5632c3eb3..1a919c131 100644 --- a/lib/src/latvian/SymbolLav.gf +++ b/lib/src/latvian/SymbolLav.gf @@ -10,29 +10,32 @@ flags lin - SymbPN i = {s = \\_ => i.s ; g = Masc ; n = Sg} ; - IntPN i = {s = \\_ => i.s ; g = Masc ; n = Pl} ; - FloatPN i = {s = \\_ => i.s ; g = Masc ; n = Pl} ; - NumPN i = {s = \\_ => i.s ! Masc ! Nom ; g = Masc ; n = Pl} ; + SymbPN i = {s = \\_ => i.s ; gend = Masc ; num = Sg} ; + IntPN i = {s = \\_ => i.s ; gend = Masc ; num = Pl} ; + FloatPN i = {s = \\_ => i.s ; gend = Masc ; num = Pl} ; + NumPN i = {s = \\_ => i.s ! Masc ! Nom ; gend = Masc ; num = Pl} ; CNIntNP cn i = { s = \\_ => cn.s ! Indef ! Sg ! Nom ++ i.s ; - a = AgP3 Sg cn.g Pos + agr = AgrP3 Sg cn.gend ; + pol = Pos } ; CNSymbNP det cn xs = { - s = \\_ => det.s ! cn.g ! Nom ++ cn.s ! det.d ! det.n ! Nom ++ xs.s ; - a = AgP3 det.n cn.g Pos + s = \\_ => det.s ! cn.gend ! Nom ++ cn.s ! det.defin ! det.num ! Nom ++ xs.s ; + agr = AgrP3 det.num cn.gend ; + pol = Pos } ; CNNumNP cn i = { s = \\_ => cn.s ! Indef ! Sg ! Nom ++ i.s ! Masc ! Nom ; - a = AgP3 Sg cn.g Pos + agr = AgrP3 Sg cn.gend ; + pol = Pos } ; SymbS sy = sy ; - SymbNum sy = { s = \\_,_ => sy.s ; n = Pl } ; + SymbNum sy = { s = \\_,_ => sy.s ; num = Pl } ; SymbOrd sy = { s = \\_,_ => sy.s ++ "."} ; lincat diff --git a/lib/src/latvian/VerbLav.gf b/lib/src/latvian/VerbLav.gf index 1320b477a..75c3b4078 100644 --- a/lib/src/latvian/VerbLav.gf +++ b/lib/src/latvian/VerbLav.gf @@ -1,14 +1,13 @@ ---# -path=.:../abstract:../common:../prelude +--# -path=.:abstract:common:prelude -- TODO: module relations. --- VerbLav is included in many places because of buildVerb (SentenceLav, QuestionLav, RelativeLav, IdiomLav), --- and includes ParadigmsVerbsLav because of mkVerb_Irreg_Be. --- They need to be reallocated somehow to ResLav.or something similar (e.g. 'be' => IrregLav). +-- VerbLav is included in many modules because of buildVerb. +-- It needs to be reallocated somehow to ResLav.or something similar. -- Not so simple since morphology itself needs ResLav & friends. -concrete VerbLav of Verb = CatLav ** open - StructuralLav, - ParadigmsVerbsLav, +concrete VerbLav of Verb = CatLav ** open + StructuralLav, + ParadigmsLav, ResLav, ParamX, Prelude @@ -21,74 +20,80 @@ flags lin + -- Complementization rules + -- V -> VP + -- e.g. 'sleep' UseV v = { - v = v ; - compl = \\_ => [] ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act + v = v ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => [] ; + voice = Act ; + topic = v.topic } ; -- VV -> VP -> VP + -- e.g. 'want to run' ComplVV vv vp = { - v = vv ; - compl = \\agr => build_VP vp Pos VInf agr ; - val = toVal_Reg vv.topic ; - objNeg = Pos ; - voice = Act + v = vv ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => buildVP vp Pos VInf agr ; + voice = Act ; + topic = vv.topic } ; -- VS -> S -> VP + -- e.g. 'say that she runs' ComplVS vs s = { - v = vs ; - compl = \\_ => "," ++ vs.subj.s ++ s.s ; - val = toVal_Reg vs.topic ; - objNeg = Pos ; - voice = Act + v = vs ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => "," ++ vs.conj.s ++ s.s ; + voice = Act ; + topic = vs.topic } ; -- VQ -> QS -> VP + -- e.g. 'wonder who runs' ComplVQ vq qs = { - v = vq ; - compl = \\_ => "," ++ qs.s ; - val = toVal_Reg vq.topic ; - objNeg = Pos ; - voice = Act + v = vq ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => "," ++ qs.s ; + voice = Act ; + topic = vq.topic } ; -- VA -> AP -> VP + -- e.g. '(they) become red' ComplVA va ap = { - v = va ; - compl = \\agr => ap.s ! Indef ! (fromAgr agr).gend ! (fromAgr agr).num ! Nom ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act + v = va ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => ap.s ! Indef ! (fromAgr agr).gend ! (fromAgr agr).num ! Nom ; + voice = Act ; + topic = va.topic } ; -- V2 -> VPSlash -- e.g. 'love (it)' SlashV2a v2 = { - v = v2 ; - compl = \\_ => [] ; -- overriden in ComplSlash - val = toVal v2.topic (v2.p.c ! Sg) (AgP3 Sg Masc Pos) ; - objNeg = Pos ; -- overriden in ComplSlash - voice = Act ; - p = v2.p ; + v = v2 ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => [] ; + voice = Act ; + topic = v2.topic ; + focus = v2.focus } ; - -- TODO: val other than P3 Sg Masc -- V3 -> NP -> VPSlash -- e.g. 'give it (to her)' Slash2V3 v3 np = insertObjC - (\\_ => v3.p1.s ++ np.s ! (v3.p1.c ! (fromAgr np.a).num)) + (\\_ => v3.focus2.s ++ np.s ! (v3.focus2.c ! (fromAgr np.agr).num)) { - v = v3 ; - compl = \\_ => [] ; - val = toVal v3.topic (v3.p1.c ! Sg) np.a ; - objNeg = (fromAgr np.a).pol ; - voice = Act ; - p = v3.p2 + v = v3 ; + agr = { subj = np.agr ; focus = np.pol } ; + compl = \\_ => [] ; + voice = Act ; + topic = v3.topic ; + focus = v3.focus1 } ; -- FIXME: "vīrietis runā par ābolus ar sievieti" ("a man talks to a woman about apples") -- FIXME: the order of objects (?) @@ -97,194 +102,213 @@ lin -- V3 -> NP -> VPSlash -- e.g. 'give (it) to her' Slash3V3 v3 np = insertObjC - (\\_ => v3.p2.s ++ np.s ! (v3.p2.c ! (fromAgr np.a).num)) + (\\_ => v3.focus2.s ++ np.s ! (v3.focus2.c ! (fromAgr np.agr).num)) { - v = v3 ; - compl = \\_ => [] ; - val = toVal v3.topic (v3.p2.c ! Sg) (AgP3 Sg Masc Pos) ; - objNeg = (fromAgr np.a).pol ; - voice = Act ; - p = v3.p1 + v = v3 ; + agr = { subj = np.agr ; focus = np.pol } ; + compl = \\_ => [] ; + voice = Act ; + topic = v3.topic ; + focus = v3.focus1 } ; -- TODO: val other than P3 Sg Masc -- TODO: test objNeg -- V2V -> VP -> VPSlash + -- e.g. 'beg (her) to go' SlashV2V v2v vp = { - v = v2v ; - compl = \\agr => build_VP vp Pos VInf agr ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act ; - p = v2v.p + v = v2v ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => buildVP vp Pos VInf agr ; + voice = Act ; + topic = v2v.topic ; + focus = v2v.focus } ; -- V2S -> S -> VPSlash + -- e.g. 'answer (to him) that it is good' SlashV2S v2s s = { - v = v2s ; - compl = \\_ => "," ++ v2s.subj.s ++ s.s ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act ; - p = v2s.p + v = v2s ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => "," ++ v2s.conj.s ++ s.s ; + voice = Act ; + topic = v2s.topic ; + focus = v2s.focus } ; -- V2Q -> QS -> VPSlash + -- e.g. 'ask (him) who came' SlashV2Q v2q qs = { - v = v2q ; - compl = \\_ => "," ++ qs.s ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act ; - p = v2q.p + v = v2q ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => "," ++ qs.s ; + voice = Act ; + topic = v2q.topic ; + focus = v2q.focus } ; -- V2A -> AP -> VPSlash + -- e.g. 'paint (it) red' SlashV2A v2a ap = { - v = v2a ; - compl = \\agr => ap.s ! Indef ! (fromAgr agr).gend ! (fromAgr agr).num ! Nom ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act ; - p = v2a.p + v = v2a ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => ap.s ! Indef ! (fromAgr agr).gend ! (fromAgr agr).num ! Nom ; + voice = Act ; + topic = v2a.topic ; + focus = v2a.focus } ; + -- VPSlash -> NP -> VP + -- e.g. 'love it' + ComplSlash vpslash np = + let agr : Agreement = np.agr in { + v = vpslash.v ; + agr = { subj = agr ; focus = np.pol } ; + compl = \\agr => case vpslash.voice of { + Act => vpslash.focus.s ++ np.s ! (vpslash.focus.c ! (fromAgr agr).num) ; + Pass => case vpslash.focus.c ! (fromAgr agr).num of { + Nom => np.s ! (vpslash.focus.c ! Sg) ; + _ => vpslash.focus.s ++ np.s ! (vpslash.focus.c ! (fromAgr agr).num) + } + } ++ vpslash.compl ! agr ; + voice = vpslash.voice ; + topic = vpslash.topic ; + focus = vpslash.focus + } ; + -- VV -> VPSlash -> VPSlash - SlashVV vv vp = { - v = vv ; - compl = \\agr => build_VP vp Pos VInf agr ; - val = toVal_Reg vv.topic ; - objNeg = Pos ; - voice = Act ; - p = vp.p + -- e.g. 'want to buy' + SlashVV vv vpslash = { + v = vv ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => buildVP vpslash Pos VInf agr ; + voice = Act ; + topic = vv.topic ; + focus = defaultPrep } ; -- V2V -> NP -> VPSlash -> VPSlash - SlashV2VNP v2v np vp = insertObjC - (\\_ => v2v.p.s ++ np.s ! (v2v.p.c ! (fromAgr np.a).num)) + -- e.g. '-- beg me to buy' + SlashV2VNP v2v np vpslash = insertObjC + (\\_ => v2v.focus.s ++ np.s ! (v2v.focus.c ! (fromAgr np.agr).num)) { - v = v2v ; - compl = \\agr => build_VP vp Pos VInf agr ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act ; - p = vp.p + v = v2v ; + agr = { subj = np.agr ; focus = np.pol } ; + compl = \\agr => buildVP vpslash Pos VInf agr ; + voice = Act ; + topic = v2v.topic ; + focus = v2v.focus } ; - -- VP -> Prep -> VPSlash - VPSlashPrep vp prep = vp ** {p = prep} ; - -- TODO: šajā brīdī ir jāignorē prep (by8agent_Prep); tas jāaizstāj ar v2.topic (?) - -- Tad varēs dzēst ārā komentāru pie StructuralLav.by8agent_Prep (?) + -- Other ways of forming verb phrases - -- VPSlash -> NP -> VP - ComplSlash vp np = let agr : Agr = np.a in { - v = vp.v ; - compl = \\agr => case vp.voice of { - Act => vp.p.s ++ np.s ! (vp.p.c ! (fromAgr agr).num) ; - Pass => case vp.p.c ! (fromAgr agr).num of { - Nom => np.s ! vp.val.obj ; - _ => vp.p.s ++ np.s ! (vp.p.c ! (fromAgr agr).num) - } - } ++ vp.compl ! agr ; - val = vp.val ; - objNeg = (fromAgr np.a).pol ; - voice = vp.voice + -- VPSlash -> VP + -- e.g. 'love himself' + ReflVP vpslash = insertObjPre + (\\agr => vpslash.focus.s ++ reflPron ! (vpslash.focus.c ! (fromAgr agr).num)) + vpslash ; + + -- Comp -> VP + -- e.g. 'be warm' + UseComp comp = { + v = mkV "būt" ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\agr => comp.s ! agr ; + voice = Act ; + topic = Nom } ; -- V2 -> VP + -- e.g. 'be loved' PassV2 v2 = { - v = v2 ; - compl = \\_ => [] ; - val = toVal (v2.p.c ! Sg) v2.topic (AgP3 Sg Masc Pos) ; - objNeg = Pos ; - voice = Pass + v = v2 ; + agr = { subj = defaultAgr ; focus = Pos } ; + compl = \\_ => [] ; + voice = Pass ; + topic = v2.focus.c ! Sg ; + focus = mkPrep v2.topic } ; -- TODO: val - should not be overriden in ComplSlash etc.? -- TODO: val - P3 Sg Masc restriction - never used? -- TODO: notestēt objNeg (kur tas tiek pārrakstīts - ComplSlash, AdvVP u.c.?) -- VP -> Adv -> VP + -- e.g. 'sleep here' AdvVP vp adv = insertObj (\\_ => adv.s) vp ; -- AdV -> VP -> VP + -- e.g. 'always sleep' AdVVP adv vp = insertObjPre (\\_ => adv.s) vp ; - -- VPSlash -> VP - ReflVP vp = insertObjPre (\\agr => vp.p.s ++ reflPron ! (vp.p.c ! (fromAgr agr).num)) vp ; + -- TODO: AdvVPSlash : VPSlash -> Adv -> VPSlash + -- e.g. 'use (it) here' - -- Comp -> VP - UseComp comp = { - v = lin V mkVerb_Irreg_Be ; - compl = \\agr => comp.s ! agr ; - val = toVal_Reg Nom ; - objNeg = Pos ; - voice = Act - } ; + -- TODO: AdVVPSlash : AdV -> VPSlash -> VPSlash + -- e.g. 'always use (it)' + + -- VP -> Prep -> VPSlash + -- e.g. 'live in (it)' + VPSlashPrep vp prep = vp ** { focus = prep } ; + -- TODO: šajā brīdī ir jāignorē prep (by8agent_Prep); tas jāaizstāj ar v2.topic (?) + -- Tad varēs dzēst ārā komentāru pie StructuralLav.by8agent_Prep (?) + + -- Complements to copula -- AP -> Comp + -- e.g. '(be) small' CompAP ap = { s = \\agr => ap.s ! Indef ! (fromAgr agr).gend ! (fromAgr agr).num ! Nom } ; -- NP -> Comp + -- e.g. '(be) the man' CompNP np = { s = \\_ => np.s ! Nom } ; -- Adv -> Comp + -- e.g. '(be) here' CompAdv a = { s = \\_ => a.s } ; -- CN -> Comp + -- e.g. '(be) a man/men' CompCN cn = { s = \\agr => cn.s ! Indef ! (fromAgr agr).num ! Nom } ; + -- TODO: UseCopula : VP + -- e.g. 'be' + oper - build_VP : ResLav.VP -> Polarity -> VForm -> Agr -> Str = \vp,pol,vf,agr -> - vp.v.s ! pol ! vf ++ vp.compl ! agr ; - insertObjC : (Agr => Str) -> ResLav.VPSlash -> ResLav.VPSlash = \obj,vp -> - insertObj obj vp ** { p = vp.p } ; - - insertObj : (Agr => Str) -> ResLav.VP -> ResLav.VP = \obj,vp -> { - v = vp.v ; - compl = \\agr => vp.compl ! agr ++ obj ! agr ; - val = vp.val ; - objNeg = vp.objNeg ; - voice = vp.voice - } ; - - insertObjPre : (Agr => Str) -> ResLav.VP -> ResLav.VP = \obj,vp -> { - v = vp.v ; - compl = \\agr => obj ! agr ++ vp.compl ! agr ; - val = vp.val ; - objNeg = vp.objNeg ; - voice = vp.voice - } ; + defaultAgr : Agreement = AgrP3 Sg Masc ; -- variants {} + defaultPrep : Preposition = nom_Prep ; -- FIXME: the type of the participle form - depending on what?! (currently fixed) - buildVerb : Verb -> VMood -> Polarity -> Agr -> Polarity -> Polarity -> Str = - \v,mood,pol,subjAgr,subjNeg,objNeg -> + buildVerb : Verb -> VMood -> Polarity -> Agreement -> Polarity -> Polarity -> Str = + \v,mood,pol,agr,polTopic,polFocus -> let - pol_prim : Polarity = case of { + polFinal : Polarity = case of { + -- double negation, if the topic/focus NP has a negated determiner => Neg ; <_, Neg> => Neg ; _ => pol } ; - agr = fromAgr subjAgr + agr = fromAgr agr ; --# notpresent - part = v.s ! ResLav.Pos ! (VPart Pass agr.gend agr.num Nom) --# notpresent + part = v.s ! Pos ! (VPart Pass agr.gend agr.num Nom) --# notpresent in case mood of { - Ind Simul tense => v.s ! pol_prim ! (VInd agr.pers agr.num tense) + Ind Simul tense => v.s ! polFinal ! (VInd agr.pers agr.num tense) ; --# notpresent - Ind Anter tense => mkVerb_Irreg_Be.s ! pol_prim ! (VInd agr.pers agr.num tense) ++ part ; --# notpresent + Ind Anter tense => (mkV "būt").s ! polFinal ! (VInd agr.pers agr.num tense) ++ part ; --# notpresent -- FIXME(?): Rel _ Past => ... - Rel _ Past => ResLav.NON_EXISTENT ; --# notpresent - Rel Simul tense => v.s ! pol_prim ! (VRel tense) ; --# notpresent - Rel Anter tense => mkVerb_Irreg_Be.s ! pol_prim ! (VRel tense) ++ part ; --# notpresent + Rel _ Past => NON_EXISTENT ; --# notpresent + Rel Simul tense => v.s ! polFinal ! (VRel tense) ; --# notpresent + Rel Anter tense => (mkV "būt").s ! polFinal ! (VRel tense) ++ part ; --# notpresent - Deb Simul tense => mkVerb_Irreg_Be.s ! pol_prim ! (VInd P3 Sg tense) ++ --# notpresent - v.s ! ResLav.Pos ! VDeb ; --# notpresent - Deb Anter tense => mkVerb_Irreg_Be.s ! pol_prim ! (VInd P3 Sg tense) ++ --# notpresent - mkVerb_Irreg_Be.s ! ResLav.Pos ! (VPart Pass Masc Sg Nom) ++ --# notpresent - v.s ! ResLav.Pos ! VDeb ; --# notpresent + Deb Simul tense => (mkV "būt").s ! polFinal ! (VInd P3 Sg tense) ++ --# notpresent + v.s ! Pos ! VDeb ; --# notpresent + Deb Anter tense => (mkV "būt").s ! polFinal ! (VInd P3 Sg tense) ++ --# notpresent + (mkV "būt").s ! Pos ! (VPart Pass Masc Sg Nom) ++ --# notpresent + v.s ! Pos ! VDeb ; --# notpresent - Condit Simul => v.s ! pol_prim ! (VInd agr.pers agr.num ParamX.Cond) ; --# notpresent - Condit Anter => mkVerb_Irreg_Be.s ! pol_prim ! (VInd agr.pers agr.num ParamX.Cond) ++ part --# notpresent + Condit Simul => v.s ! polFinal ! (VInd agr.pers agr.num ParamX.Cond) ; --# notpresent + Condit Anter => (mkV "būt").s ! polFinal ! (VInd agr.pers agr.num ParamX.Cond) ++ part --# notpresent } ; + }