From 7cd09c88db784b5296713390fe1bfc3ea6821537 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 9 Feb 2011 16:42:15 +0000 Subject: [PATCH] more general discourse particles in Finnish --- src/finnish/AllFin.gf | 4 +-- src/finnish/ExtraFin.gf | 69 +++++++++++++++++++++++++------------- src/finnish/ExtraFinAbs.gf | 34 +++++++++++++------ src/finnish/IdiomFin.gf | 2 ++ src/finnish/LangFin.gf | 4 +-- src/finnish/LexiconFin.gf | 4 +-- src/finnish/ResFin.gf | 59 +++++++++++++++++++++++++++++--- src/finnish/VerbFin.gf | 5 +-- 8 files changed, 136 insertions(+), 45 deletions(-) diff --git a/src/finnish/AllFin.gf b/src/finnish/AllFin.gf index b79a50b30..0d3f47011 100644 --- a/src/finnish/AllFin.gf +++ b/src/finnish/AllFin.gf @@ -1,6 +1,6 @@ --# -path=.:../abstract:../common:prelude concrete AllFin of AllFinAbs = - LangFin, - ExtraFin + LangFin - [SlashV2VNP,SlashVV, TFut], ---- to speed up linking; to remove spurious parses + ExtraFin - [ProDrop, ProDropPoss, S_OSV, S_VSO, S_ASV] -- to exclude spurious parses ** {} ; diff --git a/src/finnish/ExtraFin.gf b/src/finnish/ExtraFin.gf index 5d4760d51..52cf7af64 100644 --- a/src/finnish/ExtraFin.gf +++ b/src/finnish/ExtraFin.gf @@ -1,7 +1,7 @@ --# -path=.:abstract:common:prelude concrete ExtraFin of ExtraFinAbs = CatFin ** - open ResFin, MorphoFin, Coordination, Prelude, NounFin, StructuralFin in { + open ResFin, MorphoFin, Coordination, Prelude, NounFin, StructuralFin, (R = ParamX) in { lin GenNP np = { @@ -48,7 +48,7 @@ concrete ExtraFin of ExtraFinAbs = CatFin ** mkClause (\_ -> adv.s) np.a (insertObj (\\_,b,_ => np.s ! NPCase Nom) (predV v)) ; - i_implicPron = mkPronoun [] "minun" "minua" "minuna" "minuun" Sg P1 ; +-- i_implicPron = mkPronoun [] "minun" "minua" "minuna" "minuun" Sg P1 ; whatPart_IP = { s = table { NPCase Nom | NPAcc => "mitä" ; @@ -104,35 +104,58 @@ concrete ExtraFin of ExtraFinAbs = CatFin ** isDef = True --- "minun kolme autoani ovat" ; thus "...on" is missing } ; - lincat ClPlus = ClausePlus ; + lincat + ClPlus, ClPlusObj, ClPlusAdv = ClausePlus ; + Part = {s : Bool => Str} ; lin - S_SVO t p clp = - let cl = clp.s ! t.t ! t.a ! p.p + S_SVO part t p clp = + let + cl = clp.s ! t.t ! t.a ! p.p ; + pa = part.s ! True ---- in - {s = t.s ++ p.s ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.ext} ; - S_SOV t p clp = - let cl = clp.s ! t.t ! t.a ! p.p + {s = t.s ++ p.s ++ cl.subj ++ pa ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.adv ++ cl.ext} ; + S_OSV part t p clp = + let + cl = clp.s ! t.t ! t.a ! p.p ; + pa = part.s ! True ---- in - {s = t.s ++ p.s ++ cl.subj ++ cl.compl ++ cl.fin ++ cl.inf ++ cl.ext} ; - S_OSV t p clp = - let cl = clp.s ! t.t ! t.a ! p.p + {s = t.s ++ p.s ++ cl.compl ++ pa ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.adv ++ cl.ext} ; + S_VSO part t p clp = + let + cl = clp.s ! t.t ! t.a ! p.p ; + pa = part.s ! cl.qp in - {s = t.s ++ p.s ++ cl.compl ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.ext} ; - S_OVS t p clp = - let cl = clp.s ! t.t ! t.a ! p.p + {s = t.s ++ p.s ++ cl.fin ++ pa ++ cl.subj ++ cl.inf ++ cl.compl ++ cl.adv ++ cl.ext} ; + S_ASV part t p clp = + let + cl = clp.s ! t.t ! t.a ! p.p ; + pa = part.s ! cl.qp in - {s = t.s ++ p.s ++ cl.compl ++ cl.fin ++ cl.inf ++ cl.subj ++ cl.ext} ; - S_VSO t p clp = - let cl = clp.s ! t.t ! t.a ! p.p - in - {s = t.s ++ p.s ++ cl.fin ++ cl.subj ++ cl.inf ++ cl.compl ++ cl.ext} ; - S_VOS t p clp = - let cl = clp.s ! t.t ! t.a ! p.p - in - {s = t.s ++ p.s ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.subj ++ cl.ext} ; + {s = t.s ++ p.s ++ cl.adv ++ pa ++ cl.subj ++ cl.fin ++ cl.inf ++ cl.compl ++ cl.ext} ; PredClPlus np vp = mkClausePlus (subjForm np vp.sc) np.a vp ; + PredClPlusFocSubj np vp = insertKinClausePlus 0 (mkClausePlus (subjForm np vp.sc) np.a vp) ; + PredClPlusFocVerb np vp = insertKinClausePlus 1 (mkClausePlus (subjForm np vp.sc) np.a vp) ; + PredClPlusObj np vps obj = + insertObjClausePlus 0 False (\\b => appCompl True b vps.c2 obj) (mkClausePlus (subjForm np vps.sc) np.a vps) ; + PredClPlusFocObj np vps obj = + insertObjClausePlus 0 True (\\b => appCompl True b vps.c2 obj) (mkClausePlus (subjForm np vps.sc) np.a vps) ; + PredClPlusAdv np vp adv = + insertObjClausePlus 1 False (\\_ => adv.s) (mkClausePlus (subjForm np vp.sc) np.a vp) ; + PredClPlusFocAdv np vp adv = + insertObjClausePlus 1 True (\\_ => adv.s) (mkClausePlus (subjForm np vp.sc) np.a vp) ; + ClPlusWithObj c = c ; + ClPlusWithAdv c = c ; + + noPart = {s = \\_ => []} ; + han_Part = mkPart "han" "hän" ; + pa_Part = mkPart "pa" "pä" ; + pas_Part = mkPart "pas" "päs" ; + ko_Part = mkPart "ko" "kö" ; + kos_Part = mkPart "kos" "kös" ; + kohan_Part = mkPart "kohan" "köhän" ; + pahan_Part = mkPart "pahan" "pähän" ; } diff --git a/src/finnish/ExtraFinAbs.gf b/src/finnish/ExtraFinAbs.gf index ea7798f75..386c0a99b 100644 --- a/src/finnish/ExtraFinAbs.gf +++ b/src/finnish/ExtraFinAbs.gf @@ -8,7 +8,7 @@ abstract ExtraFinAbs = Extra [ RelExistNP : Prep -> RP -> NP -> RCl ; -- jossa on jazzia - i_implicPron : Pron ; -- (minä), minut, ... +-- i_implicPron : Pron ; -- (minä), minut, ... whatPart_IP : IP ; PartCN : CN -> NP ; -- olutta @@ -21,19 +21,33 @@ abstract ExtraFinAbs = Extra [ cat ClPlus ; -- clause with more variation + ClPlusObj ; -- which has a focusable object + ClPlusAdv ; -- which has a focusable adverb Part ; -- discourse particle fun - S_SVO : Temp -> Pol -> ClPlus -> S ; -- mepäs juomme maitoa - S_SOV : Temp -> Pol -> ClPlus -> S ; -- mepäs maitoa juomme - S_OSV : Temp -> Pol -> ClPlus -> S ; -- maitoapas me juomme - S_OVS : Temp -> Pol -> ClPlus -> S ; -- maitoapas juomme me - S_VSO : Temp -> Pol -> ClPlus -> S ; -- juommepas me maitoa - S_VOS : Temp -> Pol -> ClPlus -> S ; -- juommepas maitoa me + S_SVO : Part -> Temp -> Pol -> ClPlus -> S ; -- mepäs juomme maitoa nyt + S_OSV : Part -> Temp -> Pol -> ClPlusObj -> S ; -- maitoapas me juomme nyt + S_VSO : Part -> Temp -> Pol -> ClPlus -> S ; -- juommepas me maitoa nyt + S_ASV : Part -> Temp -> Pol -> ClPlusAdv -> S ; -- nytpäs me juomme maitoa - PredClPlus : NP -> VP -> ClPlus ; +-- S_SOV : Part -> Temp -> Pol -> ClPlus -> S ; -- mepäs maitoa juomme +-- S_OVS : Part -> Temp -> Pol -> ClPlus -> S ; -- maitoapas juomme me +-- S_VOS : Part -> Temp -> Pol -> ClPlus -> S ; -- juommepas maitoa me ----- noPart, han_Part, pa_Part, pas_Part, ko_Part, kos_Part, ----- kohan_Part, pahan_Part : Part ; + + PredClPlus : NP -> VP -> ClPlus ; -- me nukumme + PredClPlusFocSubj : NP -> VP -> ClPlus ; -- mekin nukumme + PredClPlusFocVerb : NP -> VP -> ClPlus ; -- me nukummekin + PredClPlusObj : NP -> VPSlash -> NP -> ClPlusObj ; -- maitoa me juomme + PredClPlusFocObj : NP -> VPSlash -> NP -> ClPlusObj ; -- maitoakin me juomme + PredClPlusAdv : NP -> VP -> Adv -> ClPlusAdv ; -- nyt me nukumme + PredClPlusFocAdv : NP -> VP -> Adv -> ClPlusAdv ; -- nytkin me nukumme + + ClPlusWithObj : ClPlusObj -> ClPlus ; -- to make non-fronted obj focusable + ClPlusWithAdv : ClPlusAdv -> ClPlus ; -- to make non-fronted adv focusable + + noPart, han_Part, pa_Part, pas_Part, ko_Part, kos_Part, + kohan_Part, pahan_Part : Part ; } diff --git a/src/finnish/IdiomFin.gf b/src/finnish/IdiomFin.gf index 90c8e3d58..373f76317 100644 --- a/src/finnish/IdiomFin.gf +++ b/src/finnish/IdiomFin.gf @@ -40,6 +40,7 @@ concrete IdiomFin of Idiom = CatFin ** GenericCl vp = mkClause noSubj (agrP3 Sg) { s = \\_ => vp.s ! VIPass ; s2 = vp.s2 ; + adv = vp.adv ; ext = vp.ext ; sc = vp.sc ; qp = vp.qp @@ -52,6 +53,7 @@ concrete IdiomFin of Idiom = CatFin ** in { s = on.s ; s2 = \\b,p,a => inf ++ vp.s2 ! b ! p ! a ; + adv = vp.adv ; ext = vp.ext ; sc = vp.sc ; qp = vp.qp diff --git a/src/finnish/LangFin.gf b/src/finnish/LangFin.gf index 53eca61e4..3d95b1ef7 100644 --- a/src/finnish/LangFin.gf +++ b/src/finnish/LangFin.gf @@ -1,8 +1,8 @@ --# -path=.:../abstract:../common:../prelude concrete LangFin of Lang = - GrammarFin - [SlashV2VNP,SlashVV], ---- to speed up compilation --- GrammarFin, +-- GrammarFin - [SlashV2VNP,SlashVV], ---- to speed up compilation + GrammarFin, LexiconFin ** { diff --git a/src/finnish/LexiconFin.gf b/src/finnish/LexiconFin.gf index 484bb3969..6f5973825 100644 --- a/src/finnish/LexiconFin.gf +++ b/src/finnish/LexiconFin.gf @@ -67,10 +67,10 @@ lin doctor_N = mk2N "tohtori" "tohtoreita" ; dog_N = mkN "koira" ; door_N = mkN "ovi" "ovia" ; - drink_V2 = mkV2 (mkV "juoda") ; + drink_V2 = mkV2 (mkV "juoda") (casePrep partitive) ; easy_A2V = mkA2 (mkA (mkN "helppo") "helpompi" "helpoin") (casePrep allative) ; - eat_V2 = mkV2 (mkV "syödä") ; + eat_V2 = mkV2 (mkV "syödä") (casePrep partitive) ; empty_A = mkA (mkN "tyhjä") "tyhjempi" "tyhjin" ; enemy_N = mkN "vihollinen" ; factory_N = mkN "tehdas" ; diff --git a/src/finnish/ResFin.gf b/src/finnish/ResFin.gf index 15cc038ce..5176d2433 100644 --- a/src/finnish/ResFin.gf +++ b/src/finnish/ResFin.gf @@ -185,6 +185,7 @@ oper VP = { s : VIForm => Anteriority => Polarity => Agr => {fin, inf : Str} ; s2 : Bool => Polarity => Agr => Str ; -- talo/talon/taloa + adv : Polarity => Str ; -- ainakin/ainakaan ext : Str ; sc : NPForm ; qp : Bool -- True = back vowel @@ -248,6 +249,7 @@ oper } ; s2 = \\_,_,_ => [] ; + adv = \\_ => [] ; ext = [] ; sc = verb.sc ; qp = verb.qp @@ -256,6 +258,7 @@ oper insertObj : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> { s = vp.s ; s2 = \\fin,b,a => vp.s2 ! fin ! b ! a ++ obj ! fin ! b ! a ; + adv = vp.adv ; ext = vp.ext ; sc = vp.sc ; qp = vp.qp @@ -264,15 +267,26 @@ oper insertObjPre : (Bool => Polarity => Agr => Str) -> VP -> VP = \obj,vp -> { s = vp.s ; s2 = \\fin,b,a => obj ! fin ! b ! a ++ vp.s2 ! fin ! b ! a ; + adv = vp.adv ; ext = vp.ext ; sc = vp.sc ; qp = vp.qp } ; + insertAdv : (Polarity => Str) -> VP -> VP = \adv,vp -> { + s = vp.s ; + s2 = vp.s2 ; + ext = vp.ext ; + adv = \\b => vp.adv ! b ++ adv ! b ; + sc = vp.sc ; + qp = vp.qp + } ; + insertExtrapos : Str -> VP -> VP = \obj,vp -> { s = vp.s ; s2 = vp.s2 ; ext = vp.ext ++ obj ; + adv = vp.adv ; sc = vp.sc ; qp = vp.qp } ; @@ -284,15 +298,15 @@ oper } ; ClausePlus : Type = { - s : Tense => Anteriority => Polarity => {subj,fin,inf,compl,ext : Str ; qp : Bool} + s : Tense => Anteriority => Polarity => {subj,fin,inf,compl,adv,ext : Str ; qp : Bool} } ; mkClause : (Polarity -> Str) -> Agr -> VP -> Clause = \sub,agr,vp -> { s = \\t,a,b => let c = (mkClausePlus sub agr vp).s ! t ! a ! b in table { - SDecl => c.subj ++ c.fin ++ c.inf ++ c.compl ++ c.ext ; - SQuest => c.fin ++ BIND ++ questPart c.qp ++ c.subj ++ c.inf ++ c.compl ++ c.ext + SDecl => c.subj ++ c.fin ++ c.inf ++ c.compl ++ c.adv ++ c.ext ; + SQuest => c.fin ++ BIND ++ questPart c.qp ++ c.subj ++ c.inf ++ c.compl ++ c.adv ++ c.ext } } ; @@ -308,12 +322,49 @@ oper in {subj = sub b ; fin = verb.fin ; inf = verb.inf ; - compl = vp.s2 ! agrfin.p2 ! b ! agr ; + compl = vp.s2 ! agrfin.p2 ! b ! agr ; + adv = vp.adv ! b ; ext = vp.ext ; qp = selectPart vp a b } } ; + insertKinClausePlus : Predef.Ints 1 -> ClausePlus -> ClausePlus = \p,cl -> { + s = \\t,a,b => + let + c = cl.s ! t ! a ! b + in + case p of { + 0 => {subj = c.subj ++ kin b True ; fin = c.fin ; inf = c.inf ; -- Jussikin nukkuu + compl = c.compl ; adv = c.adv ; ext = c.ext ; qp = c.qp} ; + 1 => {subj = c.subj ; fin = c.fin ++ kin b c.qp ; inf = c.inf ; -- Jussi nukkuukin + compl = c.compl ; adv = c.adv ; ext = c.ext ; qp = c.qp} + } + } ; + + insertObjClausePlus : Predef.Ints 1 -> Bool -> (Polarity => Str) -> ClausePlus -> ClausePlus = + \p,ifKin,obj,cl -> { + s = \\t,a,b => + let + c = cl.s ! t ! a ! b ; + co = obj ! b ++ if_then_Str ifKin (kin b True) [] ; + in case p of { + 0 => {subj = c.subj ; fin = c.fin ; inf = c.inf ; + compl = co ; adv = c.compl ++ c.adv ; ext = c.ext ; qp = c.qp} ; -- Jussi juo maitoakin + 1 => {subj = c.subj ; fin = c.fin ; inf = c.inf ; + compl = c.compl ; adv = co ; ext = c.adv ++ c.ext ; qp = c.qp} -- Jussi nukkuu nytkin + } + } ; + + kin : Polarity -> Bool -> Str = + \p,b -> case p of {Pos => (mkPart "kin" "kin").s ! b ; Neg => (mkPart "kaan" "kään").s ! b} ; + + mkPart : Str -> Str -> {s : Bool => Str} = \ko,koe -> + {s = table {True => glueTok ko ; False => glueTok koe}} ; + + glueTok : Str -> Str = \s -> "&+" ++ s ; + + -- This is used for subjects of passives: therefore isFin in False. subjForm : NP -> NPForm -> Polarity -> Str = \np,sc,b -> diff --git a/src/finnish/VerbFin.gf b/src/finnish/VerbFin.gf index 3e96327bf..04b973a5b 100644 --- a/src/finnish/VerbFin.gf +++ b/src/finnish/VerbFin.gf @@ -73,15 +73,16 @@ concrete VerbFin of Verb = CatFin ** open Prelude, ResFin in { infVP v.sc b a vp v.vi) (predV v) ** {c2 = vp.c2} ; - AdvVP vp adv = insertObj (\\_,_,_ => adv.s) vp ; + AdvVP vp adv = insertAdv (\\_ => adv.s) vp ; - AdVVP adv vp = insertObj (\\_,_,_ => adv.s) vp ; + AdVVP adv vp = insertAdv (\\_ => adv.s) vp ; ReflVP v = insertObjPre (\\fin,b,agr => appCompl fin b v.c2 (reflPron agr)) v ; PassV2 v = let vp = predV v in { s = \\_ => vp.s ! VIPass ; s2 = \\_,_,_ => [] ; + adv = \\_ => [] ; ext = [] ; qp = v.qp ; sc = v.c2.c -- minut valitaan ; minua rakastetaan ; minulle kuiskataan