diff --git a/src/abstract/Extend.gf b/src/abstract/Extend.gf index 8298ee001..4e641d7df 100644 --- a/src/abstract/Extend.gf +++ b/src/abstract/Extend.gf @@ -109,6 +109,12 @@ abstract Extend = Cat ** { ExistsNP : NP -> Cl ; -- there exists a number / there exist numbers +-- existentials with a/no variation + + ExistCN : CN -> Cl ; -- there is a car / there is no car + ExistMassCN : CN -> Cl ; -- there is beer / there is no beer + ExistPluralCN : CN -> Cl ; -- there are trees / there are no trees + -- infinitive for purpose AR 21/8/2013 PurposeVP : VP -> Adv ; -- to become happy diff --git a/src/api/libraryBrowser/LibraryBrowserIta.gf b/src/api/libraryBrowser/LibraryBrowserIta.gf new file mode 100644 index 000000000..e0e6f616d --- /dev/null +++ b/src/api/libraryBrowser/LibraryBrowserIta.gf @@ -0,0 +1,24 @@ +--# -path=.:alltenses + +concrete LibraryBrowserIta of LibraryBrowser = + GrammarIta - [ + UseCopula + ], + LexiconIta + ** open (S = SyntaxIta) in { + + lin + i_NP = S.i_NP ; + you_NP = S.you_NP ; + he_NP = S.he_NP ; + she_NP = S.she_NP ; + we_NP = S.we_NP ; + youPl_NP = S.youPl_NP ; + youPol_NP = S.youPol_NP ; + they_NP = S.they_NP ; + + a_Det = S.mkDet S.a_Quant ; + the_Det = S.mkDet S.the_Quant ; + aPl_Det = S.mkDet S.a_Quant S.plNum ; + thePl_Det = S.mkDet S.the_Quant S.plNum ; +} diff --git a/src/common/ExtendFunctor.gf b/src/common/ExtendFunctor.gf index 4fa91f8a2..cabc9730f 100644 --- a/src/common/ExtendFunctor.gf +++ b/src/common/ExtendFunctor.gf @@ -51,7 +51,10 @@ lin PastPartAP = variants {} ; -- VPSlash -> AP ; -- lost (opportunity) ; (opportunity) lost in space PastPartAgentAP = variants {} ; -- VPSlash -> NP -> AP ; -- (opportunity) lost by the company NominalizeVPSlashNP = variants {} ; -- VPSlash -> NP -> NP ; - ExistsNP = variants {} ; -- NP -> Cl ; -- there exists a number / there exist numbers + ExistsNP = ExistNP ; -- NP -> Cl ; -- there exists a number / there exist numbers + ExistCN cn = ExistNP (DetCN (DetQuant IndefArt NumSg) cn) ; + ExistMassCN cn = ExistNP (MassNP cn) ; + ExistPluralCN cn = ExistNP (DetCN (DetQuant IndefArt NumPl) cn) ; PurposeVP = variants {} ; -- VP -> Adv ; -- to become happy ComplBareVS = ComplVS ; -- VS -> S -> VP ; -- say she runs ; DEFAULT say that she runs SlashBareV2S = SlashV2S ; -- V2S -> S -> VPSlash ; -- answer (to him) it is good ; DEFAULT answer that it is good diff --git a/src/dutch/StructuralDut.gf b/src/dutch/StructuralDut.gf index 0254222e4..409d9b408 100644 --- a/src/dutch/StructuralDut.gf +++ b/src/dutch/StructuralDut.gf @@ -68,7 +68,7 @@ concrete StructuralDut of Structural = CatDut, Prelude ** so_AdA = ss "zo" ; somebody_NP = mkNP "iemand" Utr Sg ; somePl_Det = mkDet "sommige" "sommige" Pl ; - someSg_Det = mkDet "sommige" "sommige" Sg ; + someSg_Det = mkDet "enige" "enig" Sg ; something_NP = mkNP "iets" Utr Sg ; somewhere_Adv = ss "ergens" ; that_Quant = mkQuant "die" "dat" ; diff --git a/src/english/DictEng.gf b/src/english/DictEng.gf index 2e3df4925..3f993cf8e 100644 --- a/src/english/DictEng.gf +++ b/src/english/DictEng.gf @@ -14607,7 +14607,7 @@ lin deed_N = mkN "deed" "deeds"; lin deed_box_N = mkN "deed-box" "deed-boxes"; lin deedpoll_N = mkN "deedpoll" "deedpolls"; lin deem_V2 = mkV2 (mkV "deem" "deems" "deemed" "deemed" "deeming"); -lin deem_V2A = mkV2V (mkV "deem") noPrep to_Prep; +lin deem_V2A = mkV2A (mkV "deem") noPrep ; lin deem_V2V = mkV2V (mkV "deem") noPrep to_Prep; lin deep_A = mkA "deep" "deeper"; lin deep_Adv = mkAdv "deep"; diff --git a/src/english/ExtendEng.gf b/src/english/ExtendEng.gf index d44ae4dfc..e9d9fbd92 100644 --- a/src/english/ExtendEng.gf +++ b/src/english/ExtendEng.gf @@ -11,7 +11,8 @@ concrete ExtendEng of Extend = Base_nr_RNP, Base_rn_RNP, Base_rr_RNP, ByVP, CompBareCN, CompIQuant, CompQS, CompS, CompVP, ComplBareVS, ComplGenVV, ComplSlashPartLast, ComplVPSVV, CompoundAP, CompoundN, ConjRNP, ConjVPS, ConsVPS, Cons_nr_RNP, Cons_rr_RNP, DetNPFem, EmbedPresPart, EmptyRelSlash, - ExistsNP, FocusAP, FocusAdV, FocusAdv, FocusObj, GenIP, GenModIP, GenModNP, GenNP, GenRP, + ExistsNP, ExistCN, ExistMassCN, ExistPluralCN, + FocusAP, FocusAdV, FocusAdv, FocusObj, GenIP, GenModIP, GenModNP, GenNP, GenRP, GerundAdv, GerundCN, GerundNP, IAdvAdv, ICompAP, InOrderToVP, MkVPS, NominalizeVPSlashNP, PassAgentVPSlash, PassVPSlash, PastPartAP, PastPartAgentAP, PositAdVAdj, PredVPS, PredVPSVV, PredetRNP, PrepCN, PresPartAP, PurposeVP, ReflPoss, ReflPron, ReflRNP, SlashBareV2S, SlashV2V, StrandQuestSlash, StrandRelSlash, @@ -220,6 +221,22 @@ concrete ExtendEng of Extend = mkClause "there" (agrP3 (fromAgr np.a).n) (insertObj (\\_ => np.s ! NPAcc) (predV (regV "exist"))) ; + ExistCN cn = + let + pos = ExistNP (DetCN (DetQuant IndefArt NumSg) cn) ; + neg = ExistNP (DetCN (DetQuant no_Quant NumSg) cn) ; + in posNegClause pos neg ; + ExistMassCN cn = + let + pos = ExistNP (MassNP cn) ; + neg = ExistNP (DetCN (DetQuant no_Quant NumSg) cn) ; + in posNegClause pos neg ; + ExistPluralCN cn = + let + pos = ExistNP (DetCN (DetQuant IndefArt NumPl) cn) ; + neg = ExistNP (DetCN (DetQuant no_Quant NumPl) cn) ; + in posNegClause pos neg ; + ComplBareVS v s = insertExtra s.s (predV v) ; SlashBareV2S v s = insertExtrac s.s (predVc v) ; diff --git a/src/english/ParadigmsEng.gf b/src/english/ParadigmsEng.gf index 8b56736e0..58af6195f 100644 --- a/src/english/ParadigmsEng.gf +++ b/src/english/ParadigmsEng.gf @@ -313,7 +313,11 @@ oper mkVV : V -> VV ; -- e.g. want (to VP) infVV : V -> VV ; -- e.g. want (to VP) ingVV : V -> VV ; -- e.g. start (VPing) - mkV2V : V -> Prep -> Prep -> V2V ; -- e.g. want (noPrep NP) (to VP) + mkV2V : overload { + mkV2V : Str -> V2V ; + mkV2V : V -> V2V ; + mkV2V : V -> Prep -> Prep -> V2V ; -- e.g. want (noPrep NP) (to VP) + } ; ingV2V : V -> Prep -> Prep -> V2V ; -- e.g. prevent (noPrep NP) (from VP-ing) mkVA : V -> VA ; -- e.g. become (AP) mkV2A : V -> Prep -> V2A ; -- e.g. paint (NP) (AP) @@ -502,12 +506,14 @@ mkInterj : Str -> Interj cries = (regN cry).s ! Pl ! Nom ; -- ! cried : Str = case cries of { _ + "es" => init cries + "d" ; + _ + "ers" => init cries + "ed" ; _ => duplFinal cry + "ed" } ; crying : Str = case cry of { _ + "ee" => cry + "ing" ; d + "ie" => d + "ying" ; us + "e" => us + "ing" ; + ent + "er" => ent + "ered" ; _ => duplFinal cry + "ing" } in mk5V cry cries cried cried crying ; @@ -582,7 +588,12 @@ mkInterj : Str -> Interj mkV0 v = v ; mkV2S v p = lin V2S (prepV2 v p) ; - mkV2V v p t = lin V2V (prepV2 v p ** {c3 = t.s ; typ = VVAux}) ; + mkV2V = overload { + mkV2V : Str -> V2V = \s -> lin V2V (dirV2 (regV s) ** {c3 = [] ; typ = VVAux}) ; + mkV2V : V -> V2V = \v -> lin V2V (dirV2 v ** {c3 = [] ; typ = VVAux}) ; + mkV2V : V -> Prep -> Prep -> V2V = \v,p,t -> lin V2V (prepV2 v p ** {c3 = t.s ; typ = VVAux}) ; + } ; + ingV2V v p t = lin V2V (prepV2 v p ** {c3 = t.s ; typ = VVPresPart}) ; mkVA v = lin VA v ; mkV2A v p = lin V2A (prepV2 v p) ; diff --git a/src/english/ResEng.gf b/src/english/ResEng.gf index 88fc774d0..3409a9af0 100644 --- a/src/english/ResEng.gf +++ b/src/english/ResEng.gf @@ -556,6 +556,14 @@ param } } ; +-- for pos/neg variation other than negation word, e.g. "there is a car"/"there is no car" + posNegClause : Clause -> Clause -> Clause = \pos,neg -> { + s = \\t,a,b,o => case b of { + CPos => pos.s ! t ! a ! b ! o ; + _ => neg.s ! t ! a ! CPos ! o + } + } ; + -- For $Numeral$. diff --git a/src/finnish/ExtendFin.gf b/src/finnish/ExtendFin.gf new file mode 100644 index 000000000..cc6ac85b5 --- /dev/null +++ b/src/finnish/ExtendFin.gf @@ -0,0 +1,112 @@ +--# -path=.:../common:../abstract + +concrete ExtendFin of Extend = + CatFin ** ExtendFunctor - [ + VPI2,VPS2,MkVPS2,ConjVPS2,ComplVPS2,MkVPI2,ConjVPI2,ComplVPI2,ComplVPIVV + ,ExistCN, ExistMassCN + ] + with + (Grammar = GrammarFin) ** + + open + GrammarFin, + ResFin, + (S=StemFin), + IdiomFin, + Coordination, + Prelude, + MorphoFin, + ParadigmsFin in { + +lin + ExistCN cn = + let + pos = ExistNP (DetCN (DetQuant IndefArt NumSg) cn) ; + neg = ExistNP (partCN cn) ; + in posNegClause pos neg ; + ExistMassCN cn = ExistNP (partCN cn) ; + +oper + partCN : CN -> GrammarFin.NP ; + partCN cn = + let + acn = DetCN (DetQuant IndefArt NumSg) cn + in acn ** { + s = table { + NPCase Nom | NPAcc => acn.s ! NPCase ResFin.Part ; + c => acn.s ! c + } + } ; + + + lincat + VPS = {s : Agr => Str } ; + [VPS] = {s1,s2 : Agr => Str } ; + VPI = {s : VVType => Agr => Str ; sc : SubjCase } ; -- Agr needed for possessive suffix: + [VPI] = {s1,s2 : VVType => Agr => Str ; sc : SubjCase } ; -- e.g. toivon nukkuva+ni + + lin + BaseVPS = twoTable Agr ; + ConsVPS = consrTable Agr comma ; + + BaseVPI = twoTable2 VVType Agr ; + ConsVPI = consrTable2 VVType Agr comma ; + + MkVPS t p vp = mkVPS t p (lin VP vp) ; + ConjVPS c xs = conjunctDistrTable Agr c xs ; + PredVPS np vps = {s = np.s ! npNom ++ vps.s ! np.a} ; + + + MkVPI vp = mkVPI vp ; + ConjVPI c xs = conjunctDistrTable2 VVType Agr c xs ; + ComplVPIVV vv vpi = + S.insertObj (\\_,_,a => vpi.s ! vv.vi ! a) + (S.predV (vv ** {sc = case vpi.sc of { + SCNom => vv.sc ; -- minun täytyy pestä auto + c => c }}) -- minulla täytyy olla auto + ) ; + + +-------- two-place verb conjunction + + lincat + -- Polarity needed to pick the right object case + VPS2 = {s : Agr => Str ; c2 : Compl ; p : Polarity } ; + [VPS2] = {s1,s2 : Agr => Str ; c2 : Compl ; p : Polarity } ; + -- A version with + VPI2 = {s : VVType => Agr => Str ; c2 : Compl ; sc : SubjCase } ; + [VPI2] = {s1,s2 : VVType => Agr => Str ; c2 : Compl ; sc : SubjCase } ; + + lin + -- : Temp -> Pol -> VPSlash -> VPS2 ; -- has loved + MkVPS2 t p vpsl = mkVPS t p (lin VP vpsl) ** {c2 = vpsl.c2 ; p = p.p } ; + + -- : VPSlash -> VPI2 ; -- to love + MkVPI2 vpsl = mkVPI (lin VP vpsl) ** {c2 = vpsl.c2} ; + + BaseVPS2 x y = twoTable Agr x y ** {c2 = y.c2 ; p = xs.p } ; ---- just remembering the compl. case of the latter verb + ConsVPS2 x xs = consrTable Agr comma x xs ** {c2 = xs.c2 ; p = xs.p } ; + + BaseVPI2 x y = twoTable2 VVType Agr x y ** {c2 = y.c2} ; ---- just remembering the compl. case of the latter verb + ConsVPI2 x xs = consrTable2 VVType Agr comma x xs ** {c2 = xs.c2} ; + + + ConjVPS2 c xs = conjunctDistrTable Agr c xs ** {c2 = xs.c2 ; p = xs.p } ; + ConjVPI2 c xs = conjunctDistrTable2 VVType Agr c xs ** {c2 = xs.c2 ; p = xs.p ; sc = xs.sc } ; + + + -- appCompl : Bool -> Polarity -> Compl -> ResFin.NP -> Str + ComplVPS2 v np = { s = \\agr => v.s ! agr ++ appCompl True v.p v.c2 np } ; + + -- TODO: Version with variable polarity? + ComplVPI2 v np = v ** { s = \\vt,a => v.s ! vt ! a ++ appCompl True Pos v.c2 np }; + +oper + mkVPS : Temp -> Pol -> VP -> VPS = \tem,pol,vp -> lin VPS { + s = \\agr => (UseCl tem pol (S.mkClause (\_ -> []) agr vp)).s } ; + + mkVPI : VP -> VPI = \vp -> lin VPI { + s = \\vt,agr => S.infVP vp.s.sc Pos agr vp (vvtype2infform vt) ; + sc = vp.s.sc } ; + +} \ No newline at end of file diff --git a/src/finnish/ResFin.gf b/src/finnish/ResFin.gf index 3f9296470..aac5568a0 100644 --- a/src/finnish/ResFin.gf +++ b/src/finnish/ResFin.gf @@ -305,7 +305,13 @@ oper glueTok : Str -> Str = \s -> "&+" ++ s ; - +-- for pos/neg variation other than just negation word, e.g. case in "on ongelma"/"ei ole ongelmaa" + posNegClause : Clause -> Clause -> Clause = \pos,neg -> { + s = \\t,a,b,o => case b of { + Pos => pos.s ! t ! a ! b ! o ; + _ => neg.s ! t ! a ! b ! o + } + } ; -- This is used for subjects of passives: therefore isFin in False. subjForm : NP -> SubjCase -> Polarity -> Str = \np,sc,b -> diff --git a/src/french/AllFre.gf b/src/french/AllFre.gf index 3ce0e6e3f..9fc759a89 100644 --- a/src/french/AllFre.gf +++ b/src/french/AllFre.gf @@ -3,5 +3,5 @@ concrete AllFre of AllFreAbs = LangFre, IrregFre, - ExtraFre + ExtendFre ---- ExtraFre ** {} ; diff --git a/src/french/ExtendFre.gf b/src/french/ExtendFre.gf new file mode 100644 index 000000000..d03498d06 --- /dev/null +++ b/src/french/ExtendFre.gf @@ -0,0 +1,43 @@ +--# -path=alltenses:../common:../abstract + +concrete ExtendFre of Extend = + CatFre ** ExtendFunctor - + [ +---- iFem_Pron, youFem_Pron, weFem_Pron, youPlFem_Pron, theyFem_Pron, youPolFem_Pron, youPolPl_Pron, youPolPlFem_Pron, + ExistCN, ExistMassCN, ExistPluralCN + ] -- put the names of your own definitions here + with + (Grammar = GrammarFre) ** + open + GrammarFre, + ResFre, + MorphoFre, + PhonoFre, + Coordination, + Prelude, + ParadigmsFre in { + -- put your own definitions here + +lin + ExistCN cn = + let + pos = ExistNP (DetCN (DetQuant IndefArt NumSg) cn) ; + neg = ExistNP (DetCN (DetQuant de_Quant NumSg) cn) ; + in posNegClause pos neg PNeg.p ; + ExistMassCN cn = + let + pos = ExistNP (MassNP cn) ; + neg = ExistNP (DetCN (DetQuant de_Quant NumSg) cn) ; + in posNegClause pos neg PNeg.p ; + ExistPluralCN cn = + let + pos = ExistNP (DetCN (DetQuant IndefArt NumPl) cn) ; + neg = ExistNP (DetCN (DetQuant de_Quant NumPl) cn) ; + in posNegClause pos neg PNeg.p ; + +oper + de_Quant : Quant = IndefArt ** {s = \\_,_,_,_ => elisDe} ; + + + + } \ No newline at end of file diff --git a/src/french/ExtraFre.gf b/src/french/ExtraFre.gf index 050ee4873..8cf08fcb7 100644 --- a/src/french/ExtraFre.gf +++ b/src/french/ExtraFre.gf @@ -99,9 +99,21 @@ concrete ExtraFre of ExtraFreAbs = ExtraRomanceFre ** let cls = cl.s ! DInv ! t ! a ! p in table { QDir => cls ! Indic ; - QIndir => subjIf ++ cls ! Indic + QIndir => subjIf ++ cl.s ! DDir ! t ! a ! p ! Indic } } ; + InvQuestIAdvCl iadv cl = {s = \\t,a,p => -- dort-il ? + let cls = cl.s ! DInv ! t ! a ! p + in table { + QDir => iadv.s ++ cls ! Indic ; + QIndir => iadv.s ++ cl.s ! DDir ! t ! a ! p ! Indic + } + } ; + + quel_IComp = { + s = aagrForms "quel" "quelle" "quels" "quelles" ; + cop = <> ; + } ; --- in ExtraRomance -- PassAgentVPSlash vps np = passVPSlash diff --git a/src/french/ExtraFreAbs.gf b/src/french/ExtraFreAbs.gf index 66cd107a1..00b1d847e 100644 --- a/src/french/ExtraFreAbs.gf +++ b/src/french/ExtraFreAbs.gf @@ -56,6 +56,9 @@ abstract ExtraFreAbs = ExtraRomanceAbs - [ProDrop] ** { EstcequeQuestCl : Cl -> QCl ; -- est-ce qu'il dort InvQuestCl : Cl -> QCl ; -- dort-il + InvQuestIAdvCl : IAdv -> Cl -> QCl ; -- dort-il + + quel_IComp : IComp ; -- quelle est votre nationalité } diff --git a/src/french/MarkupFre.gf b/src/french/MarkupFre.gf new file mode 100644 index 000000000..d3f01c8b6 --- /dev/null +++ b/src/french/MarkupFre.gf @@ -0,0 +1,3 @@ +--# -path=.:../abstract:../common:../romance + +concrete MarkupFre of Markup = CatFre, MarkHTMLX ** MarkupRomance with (ResRomance = ResFre) ; \ No newline at end of file diff --git a/src/german/ConjunctionGer.gf b/src/german/ConjunctionGer.gf index 272a2d1b2..0a9ae9445 100644 --- a/src/german/ConjunctionGer.gf +++ b/src/german/ConjunctionGer.gf @@ -20,6 +20,10 @@ concrete ConjunctionGer of Conjunction = c = ss.c } ; + ConjCN conj ss = conjunctDistrTable3 Adjf Number Case conj ss ** { + rc = \\_ => [] ; ext = [] ; adv = [] ; g = ss.g + } ; + -- These fun's are generated from the list cat's. @@ -56,6 +60,17 @@ concrete ConjunctionGer of Conjunction = ext = []} ; BaseRS x y = twoTable RelGenNum x y ** {c = y.c} ; ConsRS xs x = consrTable RelGenNum comma xs x ** {c = xs.c} ; + BaseCN x y = { + s1 = bigCN x ; + s2 = bigCN y ; + g = x.g ; --- gender of first CN, used e.g. in articles + } ; + ConsCN x xs = { + s1 = \\a,n,c => bigCN x ! a ! n ! c ++ comma ++ xs.s1 ! a ! n ! c ; + s2 = xs.s2 ; + g = x.g ; --- gender of first CN, used e.g. in articles + } ; + lincat [S] = {s1,s2 : Order => Str} ; @@ -63,8 +78,12 @@ concrete ConjunctionGer of Conjunction = [NP] = {s1,s2 : PCase => Str ; a : Agr} ; [AP] = {s1,s2 : AForm => Str ; isPre : Bool; c : Str * Str ; ext : Str} ; [RS] = {s1,s2 : RelGenNum => Str ; c : Case} ; + [CN] = {s1,s2 : Adjf => Number => Case => Str ; g : Gender} ; oper bigAP : AP -> AForm => Str = \ap -> \\a => ap.c.p1 ++ ap.s ! a ++ ap.c.p2 ++ ap.ext; + bigCN : CN -> Adjf => Number => Case => Str = \cn -> + \\a,n,c => cn.s ! a ! n ! c ++ cn.adv ++ cn.ext ++ cn.rc ! n ; + } diff --git a/src/german/DictGer.gf b/src/german/DictGer.gf index c1557cb13..1b0289a27 100644 --- a/src/german/DictGer.gf +++ b/src/german/DictGer.gf @@ -35875,7 +35875,7 @@ lin ss_mann_N = mkN "SS-Mann" "SS-Männer" masculine ; ss_N = mkN "ẞ" "ẞ" neuter ; st_vincent_undgrenadinen_N = mkN "St. Vincent undGrenadinen" "St. Vincent undGrenadinen" neuter ; - staat_N = mkN "Staat" "Staaten" masculine ; + staat_N = mkN "Staat" "Staat" "Staat" "Staats" "Staaten" "Staaten" masculine ; staatlich_A = regA "staatlich" ; staatsanleihe_N = mkN "Staatsanleihe" "Staatsanleihen" feminine ; staatsanwaeltin_N = mkN "Staatsanwältin" "Staatsanwältinnen" feminine ; diff --git a/src/german/MarkupGer.gf b/src/german/MarkupGer.gf new file mode 100644 index 000000000..79fe7c95e --- /dev/null +++ b/src/german/MarkupGer.gf @@ -0,0 +1,16 @@ +--# -path=.:../abstract:../common + +concrete MarkupGer of Markup = CatGer, MarkHTMLX ** { + +lin + MarkupCN m cn = cn ** {s = \\a,n,c => appMark m (cn.s ! a ! n ! c)} ; --- other fields e.g ext intact + MarkupNP m np = np ** {s = \\c => appMark m (np.s ! c)} ; + MarkupAP m ap = ap ** {s = \\a => appMark m (ap.s ! a)} ; + MarkupAdv m adv = {s = appMark m adv.s} ; + MarkupS m s = {s = \\o => appMark m (s.s ! o)} ; + MarkupUtt m utt = {s = appMark m utt.s} ; + MarkupPhr m phr = {s = appMark m phr.s} ; + MarkupText m txt = {s = appMark m txt.s} ; + +} + diff --git a/src/german/NounGer.gf b/src/german/NounGer.gf index 6a63ba34e..58b75ac6f 100644 --- a/src/german/NounGer.gf +++ b/src/german/NounGer.gf @@ -192,10 +192,11 @@ concrete NounGer of Noun = CatGer ** open ResGer, MorphoGer, Prelude in { } ; - RelCN cn rs = cn ** {rc = \\n => embedInCommas (rs.s ! RGenNum (gennum cn.g n))} ; - + RelCN cn rs = cn ** {rc = \\n => (cn.rc ! n ++ embedInCommas (rs.s ! RGenNum (gennum cn.g n)))} ; + ---- another layer of embedInCommas needed if there is a non-empty rc + RelNP np rs = np ** { - rc = embedInCommas (rs.s ! RGenNum (gennum (genderAgr np.a) (numberAgr np.a))) ; + rc = (np.rc ++ embedInCommas (rs.s ! RGenNum (gennum (genderAgr np.a) (numberAgr np.a)))) ; isPron = False } ; SentCN cn s = cn ** {ext = embedInCommas s.s} ; diff --git a/src/german/ResGer.gf b/src/german/ResGer.gf index 8a8a09df6..c6571ca1f 100644 --- a/src/german/ResGer.gf +++ b/src/german/ResGer.gf @@ -755,14 +755,14 @@ resource ResGer = ParamX ** open Prelude in { infVP : Bool -> VP -> ((Agr => Str) * Str * Str * Str) = \isAux, vp -> let vps = useVP vp in < \\agr => (vp.nn ! agr).p1 ++ (vp.nn ! agr).p2 ++ vp.a2, - vp.a1 ! Pos ++ (vps.s ! (notB isAux) ! agrP3 Sg ! VPInfinit Simul).inf, + vp.a1 ! Pos ++ vp.adj ++ (vps.s ! (notB isAux) ! agrP3 Sg ! VPInfinit Simul).inf, vp.inf, - vp.ext + vp.infExt ++ vp.ext > ; useInfVP : Bool -> VP -> Str = \isAux,vp -> let vpi = infVP isAux vp in - vpi.p1 ! agrP3 Sg ++ vpi.p3 ++ vpi.p2 ; + vpi.p1 ! agrP3 Sg ++ vpi.p3 ++ vpi.p2 ++ vpi.p4 ; -- The nominative case is not used as reflexive, but defined here -- so that we can reuse this in personal pronouns. diff --git a/src/italian/MakeStructuralIta.gf b/src/italian/MakeStructuralIta.gf index 1dfe9197a..2d4718e29 100644 --- a/src/italian/MakeStructuralIta.gf +++ b/src/italian/MakeStructuralIta.gf @@ -2,12 +2,12 @@ resource MakeStructuralIta = open CatIta, ParadigmsIta, MorphoIta, Prelude in { -oper - mkConj : Str -> Str -> ParadigmsIta.Number -> Conj = \x,y,n -> +oper + mkConj : Str -> Str -> ParadigmsIta.Number -> Conj = \x,y,n -> {s1 = x ; s2 = y ; n = n ; lock_Conj = <>} ; - mkSubj : Str -> Subj = \x -> + mkSubj : Str -> Subj = \x -> {s = x ; m = Indic ; lock_Subj = <>} ; - mkSubjSubj : Str -> Subj = \x -> + mkSubjSubj : Str -> Subj = \x -> {s = x ; m = Conjunct ; lock_Subj = <>} ; mkIQuant : Str -> IQuant = \s -> @@ -21,9 +21,62 @@ oper } ; mkPredet : Str -> Str -> Prep -> Bool -> Predet = \m,f,c,p -> lin Predet { s = \\g,k => prepCase k ++ case g.g of {Masc => m ; Fem => f} ; ---- number? - c = c.c ; + c = c.c ; a = if_then_else PAgr p (PAg Sg) PNoAg ---- e,g, "chacun de"; other possibilities? } ; } ; + mkQuant = overload { + -- Does not inflect for number or gender + mkQuant : Str -> Quant = \s -> + let + questo : Number => Gender => Case => Str = \\n,g,c => prepCase c ++ s ; + in lin Quant { + s = \\b => questo ; + sp = questo ; + s2 = [] ; + isNeg = False + } ; + -- Inflects for number and gender + mkQuant : Str -> Str -> Str -> Str -> Quant = \tutto,tutta,tutti,tutte -> + let + questo : Number => Gender => Case => Str = table { + Sg => table { + Masc => \\c => prepCase c ++ tutto ; + Fem => \\c => prepCase c ++ tutta + } ; + Pl => table { + Masc => \\c => prepCase c ++ tutti ; + Fem => \\c => prepCase c ++ tutte + } + } + in lin Quant { + s = \\b => questo ; + sp = questo ; + s2 = [] ; + isNeg = False + } ; + } ; + + mkDet = overload { + -- Does not inflect for number + mkDet : Str -> Number -> Det = \piu,n -> lin Det { + s,sp = \\_,_ => piu ; + n = n ; + s2 = [] ; + isNeg = False + } ; + -- Inflects for number + mkDet : Str -> Str -> Number -> Det = \alcuni,alcune,n -> lin Det { + s,sp = table { + Masc => \\_ => alcuni ; + Fem => \\_ => alcune + } ; + n = n ; + s2 = [] ; + isNeg = False + } ; + } ; + + } diff --git a/src/italian/MarkupIta.gf b/src/italian/MarkupIta.gf new file mode 100644 index 000000000..4d4ef48b7 --- /dev/null +++ b/src/italian/MarkupIta.gf @@ -0,0 +1,3 @@ +--# -path=.:../abstract:../common:../romance + +concrete MarkupIta of Markup = CatIta, MarkHTMLX ** MarkupRomance with (ResRomance = ResIta) ; \ No newline at end of file diff --git a/src/italian/MorphoIta.gf b/src/italian/MorphoIta.gf index ece6554ac..a81917bea 100644 --- a/src/italian/MorphoIta.gf +++ b/src/italian/MorphoIta.gf @@ -8,7 +8,7 @@ -- syntax. To build a lexicon, it is better to use $ParadigmsIta$, which -- gives a higher-level access to this module. -resource MorphoIta = CommonRomance, ResIta ** +resource MorphoIta = CommonRomance, ResIta ** open PhonoIta, Prelude, Predef in { flags optimize=all ; @@ -23,7 +23,7 @@ resource MorphoIta = CommonRomance, ResIta ** oper numForms : (_,_ : Str) -> Number => Str = \vino, vini -> - table {Sg => vino ; Pl => vini} ; + table {Sg => vino ; Pl => vini} ; -- For example: @@ -41,19 +41,23 @@ oper -- Common nouns are inflected in number and have an inherent gender. - mkNoun : (Number => Str) -> Gender -> Noun = \mecmecs,gen -> + mkNoun : (Number => Str) -> Gender -> Noun = \mecmecs,gen -> {s = mecmecs ; g = gen} ; - mkNounIrreg : Str -> Str -> Gender -> Noun = \mec,mecs -> + mkNounIrreg : Str -> Str -> Gender -> Noun = \mec,mecs -> mkNoun (numForms mec mecs) ; - mkNomReg : Str -> Noun = \vino -> + mkNomReg : Str -> Noun = \vino -> let o = last vino ; vin = init vino ; n = last vin in case vino of { + _ + "ico" => {s = numForms vino (vin + "i") -- amico -> amici + ; g = Masc} ; + _ + "ccia" => {s = numForms vino (init vin + "e") -- doccia -> docce + ; g = Fem} ; _ + "o" => {s = case n of { "c" | "g" => numForms vino (vin + "hi") ; "i" => numForms vino vin ; @@ -90,22 +94,22 @@ oper -- Then the regular and invariant patterns. - adjSolo : Str -> Adj = \solo -> - let + adjSolo : Str -> Adj = \solo -> + let sol = Predef.tk 1 solo in mkAdj solo (sol + "a") (sol + "i") (sol + "e") (sol + "amente") ; - adjTale : Str -> Adj = \tale -> - let + adjTale : Str -> Adj = \tale -> + let tal = Predef.tk 1 tale ; tali = tal + "i" ; tala = if_then_Str (pbool2bool (Predef.occur (Predef.dp 1 tal) "lr")) tal tale in mkAdj tale tale tali tali (tala + "mente") ; - adjBlu : Str -> Adj = \blu -> - mkAdj blu blu blu blu blu ; --- + adjBlu : Str -> Adj = \blu -> + mkAdj blu blu blu blu blu ; --- mkAdjReg : Str -> Adj = \solo -> @@ -117,7 +121,12 @@ oper in case o of { "o" => case l of { - "c" | "g" => mkAdj solo (sol + "a") (sol + "hi") (sol + "he") solamente ; + -- "c" | "g" => mkAdj solo (sol + "a") (sol + "hi") (sol + "he") solamente ; + "c" => case last (init sol) of { + "i" => mkAdj solo (sol + "a") (sol + "i") (sol + "he") solamente ; -- pubblico -> pubblici + _ => mkAdj solo (sol + "a") (sol + "hi") (sol + "he") solamente -- ricco -> ricchi + } ; + "g" => mkAdj solo (sol + "a") (sol + "hi") (sol + "he") solamente ; "i" => mkAdj solo (sol + "a") sol (sol + "e") solamente ; _ => mkAdj solo (sol + "a") (sol + "i") (sol + "e") solamente } ; @@ -138,7 +147,7 @@ oper -- given in $DiffIta.argPron$ and therefore wouldn't be needed in the -- pronoun itself.) - mkPronoun : (_,_,_,_,_,_,_,_,_ : Str) -> + mkPronoun : (_,_,_,_,_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pronoun = \il,le,lui,glie,Lui,son,sa,ses,see,g,n,p -> let @@ -155,14 +164,14 @@ oper => son ; => sa ; => ses ; - => see + => see } ; a = Ag g n p ; hasClit = True ; isPol = False } ; {- --e - mkPronoun : (_,_,_,_,_,_,_,_,_ : Str) -> + mkPronoun : (_,_,_,_,_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pronoun = \il,le,lui,glie,Lui,son,sa,ses,see,g,n,p -> {s = table { diff --git a/src/persian/SymbolPes.gf b/src/persian/SymbolPes.gf index 602547a3b..b6a37e93a 100644 --- a/src/persian/SymbolPes.gf +++ b/src/persian/SymbolPes.gf @@ -7,8 +7,8 @@ concrete SymbolPes of Symbol = CatPes ** open Prelude, ResPes in { lin -- SymbPN i = {s = \\_ => i.s ; g = Masc} ; SymbPN i = {s = i.s ; animacy = Inanimate} ; -- "از" is removed for Phrasebook - IntPN i = {s = i.s ++ "از" ; animacy = Inanimate} ; - FloatPN i = {s = i.s ++ "از" ; animacy = Inanimate} ; + IntPN i = {s = i.s ; animacy = Inanimate} ; + FloatPN i = {s = i.s ; animacy = Inanimate} ; NumPN i = {s = i.s ; animacy = Inanimate} ; CNIntNP cn i = { s = \\ez => cn.s ! aEzafa ! Sg ++ i.s ; diff --git a/src/romance/MarkupRomance.gf b/src/romance/MarkupRomance.gf new file mode 100644 index 000000000..26b40efc3 --- /dev/null +++ b/src/romance/MarkupRomance.gf @@ -0,0 +1,21 @@ +--# -path=.:../abstract:../common + +incomplete concrete MarkupRomance of Markup = CatRomance, MarkHTMLX ** { + +lin + MarkupCN m cn = cn ** {s = \\n => appMark m (cn.s ! n)} ; + MarkupNP m np = np ** {s = \\c => { + c1 = appMark m (np.s ! c).c1 ; + c2 = appMark m (np.s ! c).c2 ; + comp = appMark m (np.s ! c).comp ; + ton = appMark m (np.s ! c).ton + } + } ; + MarkupAP m ap = ap ** {s = \\a => appMark m (ap.s ! a)} ; + MarkupAdv m adv = {s = appMark m adv.s} ; + MarkupS m s = {s = \\md => appMark m (s.s ! md)} ; + MarkupUtt m utt = {s = appMark m utt.s} ; + MarkupPhr m phr = {s = appMark m phr.s} ; + MarkupText m txt = {s = appMark m txt.s} ; + +} \ No newline at end of file diff --git a/src/romance/ResRomance.gf b/src/romance/ResRomance.gf index 214765475..5e928d786 100644 --- a/src/romance/ResRomance.gf +++ b/src/romance/ResRomance.gf @@ -178,6 +178,16 @@ oper mkVPSlash : Compl -> VP -> VP ** {c2 : Compl} = \c,vp -> vp ** {c2 = c} ; + Clause : Type = {s : Direct => RTense => Anteriority => RPolarity => Mood => Str} ; + +-- for pos/neg variation other than negation word, e.g. "il y a du vin" / "il n'y a pas de vin" + posNegClause : Clause -> Clause -> RPolarity -> Clause = \pos,neg,pol -> { + s = \\d,t,a,b,m => case b of { + RPos => pos.s ! d ! t ! a ! b ! m ; + _ => neg.s ! d ! t ! a ! pol ! m + } + } ; + mkClause : Str -> Bool -> Bool -> Agr -> VP -> {s : Direct => RTense => Anteriority => RPolarity => Mood => Str} = mkClausePol False ; diff --git a/src/spanish/DiffSpa.gf b/src/spanish/DiffSpa.gf index 3812175e4..ce847a365 100644 --- a/src/spanish/DiffSpa.gf +++ b/src/spanish/DiffSpa.gf @@ -1,6 +1,6 @@ --# -path=.:../romance:../abstract:../common:prelude -instance DiffSpa of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRomance, PhonoSpa, BeschSpa, Prelude in { +instance DiffSpa of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits,contractInf] = open CommonRomance, PhonoSpa, BeschSpa, Prelude in { flags optimize=noexpand ; coding=utf8 ; @@ -10,7 +10,7 @@ instance DiffSpa of DiffRomance - [partAgr,vpAgrSubj,vpAgrClits] = open CommonRo partAgr : VType -> Bool = \vtyp -> False ; vpAgrSubj : Verb -> VPAgrType = \v -> ; vpAgrClits : Verb -> AAgr -> VPAgrType = \v,a -> ; - + contractInf : Bool -> Bool -> Bool = orB ; --- the effect of this is that the clitic is bound to the infinitive: matarte -------------------------------- param diff --git a/src/spanish/ExtraSpa.gf b/src/spanish/ExtraSpa.gf index f8bc683a3..edad4a0a4 100644 --- a/src/spanish/ExtraSpa.gf +++ b/src/spanish/ExtraSpa.gf @@ -80,4 +80,10 @@ concrete ExtraSpa of ExtraSpaAbs = ExtraRomanceSpa ** UseComp_estar comp = insertComplement comp.s (predV I.estar_V) ; + cual_IComp = { + s = aagrForms "cual" "cual" "cuáles" "cuáles" ; + cop = serCopula ; + } ; + + } diff --git a/src/spanish/ExtraSpaAbs.gf b/src/spanish/ExtraSpaAbs.gf index 847b92510..7cab8f283 100644 --- a/src/spanish/ExtraSpaAbs.gf +++ b/src/spanish/ExtraSpaAbs.gf @@ -34,4 +34,6 @@ abstract ExtraSpaAbs = ExtraRomanceAbs ** { UseComp_estar : Comp -> VP ; -- esta lleno, as opposed to es lleno + cual_IComp : IComp ; -- cual es ... + } diff --git a/src/spanish/MakeStructuralSpa.gf b/src/spanish/MakeStructuralSpa.gf index 4caa705e1..235cefe8a 100644 --- a/src/spanish/MakeStructuralSpa.gf +++ b/src/spanish/MakeStructuralSpa.gf @@ -20,4 +20,56 @@ oper } ; + mkQuant = overload { + -- Does not inflect for number or gender + mkQuant : Str -> Quant = \s -> + let + questo : Number => Gender => Case => Str = \\n,g,c => prepCase c ++ s ; + in lin Quant { + s = \\b => questo ; + sp = questo ; + s2 = [] ; + isNeg = False + } ; + -- Inflects for number and gender + mkQuant : Str -> Str -> Str -> Str -> Quant = \tutto,tutta,tutti,tutte -> + let + questo : Number => Gender => Case => Str = table { + Sg => table { + Masc => \\c => prepCase c ++ tutto ; + Fem => \\c => prepCase c ++ tutta + } ; + Pl => table { + Masc => \\c => prepCase c ++ tutti ; + Fem => \\c => prepCase c ++ tutte + } + } + in lin Quant { + s = \\b => questo ; + sp = questo ; + s2 = [] ; + isNeg = False + } ; + } ; + + mkDet = overload { + -- Does not inflect for number + mkDet : Str -> Number -> Det = \piu,n -> lin Det { + s,sp = \\_,_ => piu ; + n = n ; + s2 = [] ; + isNeg = False + } ; + -- Inflects for number + mkDet : Str -> Str -> Number -> Det = \alcuni,alcune,n -> lin Det { + s,sp = table { + Masc => \\_ => alcuni ; + Fem => \\_ => alcune + } ; + n = n ; + s2 = [] ; + isNeg = False + } ; + } ; + } diff --git a/src/spanish/MarkupSpa.gf b/src/spanish/MarkupSpa.gf new file mode 100644 index 000000000..4a2f00ebc --- /dev/null +++ b/src/spanish/MarkupSpa.gf @@ -0,0 +1,3 @@ +--# -path=.:../abstract:../common:../romance + +concrete MarkupSpa of Markup = CatSpa, MarkHTMLX ** MarkupRomance with (ResRomance = ResSpa) ; \ No newline at end of file diff --git a/src/spanish/StructuralSpa.gf b/src/spanish/StructuralSpa.gf index 0af0d0440..ce2467531 100644 --- a/src/spanish/StructuralSpa.gf +++ b/src/spanish/StructuralSpa.gf @@ -139,8 +139,8 @@ lin when_Subj = ss "cuando" ** {m = Indic} ; where_IAdv = ss "dónde" ; which_IQuant = {s = table { - Sg => \\g,c => prepCase c ++ "qué" ; --- cual - Pl => \\g,c => prepCase c ++ "qué" + Sg => \\g,c => prepCase c ++ "cual" ; + Pl => \\g,c => prepCase c ++ "cuales" } } ; whoPl_IP = {s = \\c => prepCase c ++ "quién" ; a = aagr Masc Pl} ; diff --git a/src/translator/DictionaryEng.gf b/src/translator/DictionaryEng.gf index e5b1fc4ed..96447e204 100644 --- a/src/translator/DictionaryEng.gf +++ b/src/translator/DictionaryEng.gf @@ -15125,7 +15125,7 @@ lin deed_N = mkN "deed" "deeds"; lin deed_box_N = variants {mkN "deed-box" "deed-boxes"; mkN "deedbox" "deedboxes"}; lin deedpoll_N = mkN "deedpoll" "deedpolls"; lin deem_V2 = mkV2 (mkV "deem" "deems" "deemed" "deemed" "deeming"); -lin deem_V2A = mkV2V (mkV "deem") noPrep to_Prep; +lin deem_V2A = mkV2A (mkV "deem") noPrep; lin deem_V2V = mkV2V (mkV "deem") noPrep to_Prep; lin deep_A = mkA "deep" "deeper"; lin deep_Adv = mkAdv "deep"; diff --git a/src/turkish/LexiconTur.gf b/src/turkish/LexiconTur.gf index fd6440a02..43c97ddef 100644 --- a/src/turkish/LexiconTur.gf +++ b/src/turkish/LexiconTur.gf @@ -347,6 +347,35 @@ concrete LexiconTur of Lexicon = CatTur ** watch_V2 = mkV2 (mkV "izlemek") ; win_V2 = mkV2 (mkV "kazanmak") ; wipe_V2 = mkV2 (mkV "silmek") ; - wonder_VQ = mkV "merak" et_Aux ; write_V2 = mkV2 (mkV "yazmak") ; + + wonder_VQ = mkV "merak" et_Aux ; + know_VQ = mkV "bilmek" SgSylConIrreg ; + + alas_Interj = { s = "ne yazık ki" } ; + + already_Adv = mkAdv "zaten" ; + far_Adv = mkAdv "uzak" ; + now_Adv = mkAdv "şimdi" ; + today_Adv = mkAdv "bugün" ; + + -- TODO: should `linearize easy_A2V` be (A) "kolay" (Eng "easy") or (B) + -- ("için kolay") (Eng "easy for")? I got the latter from the English + -- linearization but the following seems to be the correct way using the + -- paradigms. I might need to do something so that the resulting + -- linearization is (B). + easy_A2V = mkA2 (mkA "kolay") icinP ; + + -- TODO: It is not obvious to me why these are inflected so putting + -- this here as an implementation stub. + left_Ord = { s = \\_,_ => "sol" } ; + right_Ord = { s = \\_,_ => "sağ" } ; + + probable_AS = mkAS (mkA "olası") ; + + fun_AV = mkAV (mkA "neşe") ; + + + oper + icinP = mkPrep "için" Gen ; } diff --git a/src/turkish/ParadigmsTur.gf b/src/turkish/ParadigmsTur.gf index 1b7dbd9eb..e99663f81 100644 --- a/src/turkish/ParadigmsTur.gf +++ b/src/turkish/ParadigmsTur.gf @@ -13,8 +13,9 @@ resource ParadigmsTur = open coding=utf8 ; optimize=noexpand ; oper - -- Paradigms for verb + AS, AV : Type = A ; + -- Paradigms for verb mkV : overload { -- make regular verbs, one form is enough mkV : (esmek : Str) -> V ; @@ -155,6 +156,9 @@ resource ParadigmsTur = open mkA : Str -> Str -> HarVowP -> A ; } ; + mkAS : A -> AS ; + mkAV : A -> AV ; + mkA2 : overload { -- (biri) ile evli mkA2 : A -> Prep -> A2 ; @@ -184,6 +188,10 @@ resource ParadigmsTur = open makeDigit : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} ; + -- Adverbs + + mkAdv : Str -> Adv ; + --Implementation of verb paradigms mkV = overload { @@ -425,6 +433,9 @@ resource ParadigmsTur = open mkN3 base = (mkN base) ** lin N3 {c1,c2 = lin Prep {s=[]; c=Gen}} ; + -- Implementation for adverb paradigms. + mkAdv s = lin Adv { s = s } ; + -- Implementation of adjactive paradigms mkA = overload { -- güzel @@ -441,6 +452,9 @@ resource ParadigmsTur = open mkA : (base, base1 : Str) -> (ih_har : HarVowP) -> A = \base,base1,ih_har -> (irregN_h base base ih_har) ** lin A {adv = addSuffix base (mkHar ih_har (getHarConP base)) adjAdvSuffix}; } ; + mkAS v = v ; + mkAV v = v ; + mkA2 = overload { mkA2 : A -> Prep -> A2 = \base,c -> base ** lin A2 {c = c} ;