From 7ac3d7d05dbee8df004f5a768ae0a0abb9491ddd Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Mon, 19 Oct 2026 20:27:25 +0200 Subject: [PATCH] extensions by Codex --- src/korean/AdjectiveKor.gf | 8 +- src/korean/AdverbKor.gf | 8 +- src/korean/ConjunctionKor.gf | 15 ++-- src/korean/ConstructionKor.gf | 151 +++++++++++----------------------- src/korean/ExtendKor.gf | 72 +++++++++++++++- src/korean/Hangul.gf | 3 + src/korean/IdiomKor.gf | 33 ++++---- src/korean/NamesKor.gf | 4 +- src/korean/NounKor.gf | 71 +++++++++------- src/korean/NumeralKor.gf | 29 ++++++- src/korean/ParadigmsKor.gf | 93 ++++++++++++++++----- src/korean/PhraseKor.gf | 2 +- src/korean/QuestionKor.gf | 22 +++++ src/korean/RelativeKor.gf | 10 +-- src/korean/ResKor.gf | 110 +++++++++++++++++++++---- src/korean/SentenceKor.gf | 17 ++-- src/korean/SymbolKor.gf | 9 +- src/korean/VerbKor.gf | 97 ++++++++++++---------- 18 files changed, 489 insertions(+), 265 deletions(-) diff --git a/src/korean/AdjectiveKor.gf b/src/korean/AdjectiveKor.gf index d5a69c739..66e6566d6 100644 --- a/src/korean/AdjectiveKor.gf +++ b/src/korean/AdjectiveKor.gf @@ -48,9 +48,9 @@ concrete AdjectiveKor of Adjective = CatKor ** -- phrases, although the semantics is only clear for some adjectives. -- : AP -> SC -> AP ; -- good that she is here - -- SentAP ap sc = ap ** { - -- s = \\af => ap.s ! af ++ sc.s - -- } ; + SentAP ap sc = ap ** { + compar = sc.s ++ ap.compar + } ; -- An adjectival phrase can be modified by an *adadjective*, such as "very". @@ -61,6 +61,6 @@ concrete AdjectiveKor of Adjective = CatKor ** -- It can also be postmodified by an adverb, typically a prepositional phrase. -- : AP -> Adv -> AP ; -- warm by nature - -- AdvAP ap adv = ap ** {} ; + AdvAP ap adv = ap ** {compar = adv.s ++ ap.compar} ; } diff --git a/src/korean/AdverbKor.gf b/src/korean/AdverbKor.gf index b012f43e0..8f1a58f4c 100644 --- a/src/korean/AdverbKor.gf +++ b/src/korean/AdverbKor.gf @@ -3,7 +3,7 @@ concrete AdverbKor of Adverb = CatKor ** open ResKor, ParamKor, ParadigmsKor, Pr lin -- : A -> Adv ; - --PositAdvAdj adj = { } ; + PositAdvAdj adj = {s = glue (adj.s ! VStem Pos) "게"} ; -- : CAdv -> A -> NP -> Adv ; -- more warmly than John -- ComparAdvAdj cadv a np = { } ; @@ -16,15 +16,15 @@ lin -- Adverbs can be modified by 'adadjectives', just like adjectives. --AdAdv : AdA -> Adv -> Adv ; -- very quickly - -- AdAdv ada adv = adv ** + AdAdv ada adv = {s = ada.s ++ adv.s} ; -- Like adverbs, adadjectives can be produced by adjectives. -- : A -> AdA ; -- extremely --- PositAdAAdj a = { } ; + PositAdAAdj a = {s = glue (a.s ! VStem Pos) "게"} ; -- Subordinate clauses can function as adverbs. -- : Subj -> S -> Adv ; - -- SubjS subj s = + SubjS subj s = {s = s.s ! Subord ++ subj.s} ; -- Comparison adverbs also work as numeral adverbs. diff --git a/src/korean/ConjunctionKor.gf b/src/korean/ConjunctionKor.gf index 9102d5326..d8e533087 100644 --- a/src/korean/ConjunctionKor.gf +++ b/src/korean/ConjunctionKor.gf @@ -106,15 +106,20 @@ oper False => glue (ap.s ! VStem Neg) (conjTable ! VStar ! conj ! ap.pNeg) } ; -{- lincat - [CN] = { } ; + [CN] = ResKor.CNoun ** {firstCN : ConjType => Str} ; lin - BaseCN = {} ; - ConsCN = {} ; - ConjCN co cs = conjunctDistrTable Agr co cs ** cs ; + BaseCN x y = y ** {firstCN = \\c => glue (x.rs ++ x.s ! Bare) + (conjTable ! NStar ! c ! x.p)} ; + ConsCN x xs = xs ** {firstCN = \\c => glue (x.rs ++ x.s ! Bare) + (conjTable ! NStar ! c ! x.p) ++ xs.firstCN ! c} ; + ConjCN co xs = xs ** { + s = \\nf => co.s1 ++ xs.firstCN ! co.c ++ xs.rs ++ xs.s ! nf ; + rs = [] + } ; +{- lincat [DAP] = diff --git a/src/korean/ConstructionKor.gf b/src/korean/ConstructionKor.gf index 48660f46c..701d038d7 100644 --- a/src/korean/ConstructionKor.gf +++ b/src/korean/ConstructionKor.gf @@ -1,4 +1,5 @@ -concrete ConstructionKor of Construction = CatKor ** open ParadigmsKor in { +concrete ConstructionKor of Construction = CatKor ** + open Prelude, ResKor, (P=ParadigmsKor), (G=GrammarKor) in { lincat Timeunit = N ; @@ -6,114 +7,54 @@ lincat Monthday = NP ; Month = N ; Year = NP ; -{- -lin - - timeunitAdv n time = - let n_card : Card = n ; - n_hours_NP : NP = mkNP n_card time ; - in SyntaxKor.mkAdv for_Prep n_hours_NP | mkAdv (n_hours_NP.s ! R.npNom) ; - - weekdayPunctualAdv w = ; -- on Sunday - weekdayHabitualAdv w = ; -- on Sundays - weekdayNextAdv w = -- next Sunday - weekdayLastAdv w = -- last Sunday - - monthAdv m = mkAdv in_Prep (mkNP m) ; - yearAdv y = mkAdv in_Prep y ; - dayMonthAdv d m = ; -- on 17 May - monthYearAdv m y = ; -- in May 2012 - dayMonthYearAdv d m y = ; -- on 17 May 2013 - - intYear = symb ; - intMonthday = symb ; - -lincat Language = N ; - -lin InLanguage l = mkAdv ???_Prep (mkNP l) ; lin + ready_VP = useV (mkVerb "준비되다") ; + has_age_VP card = + let age = glue (card.s ! SK ! Attrib) "살" in + useV copula ** { + s = \\vf => glue age (copula.s ! vf) ; + past = \\p => glue age (copula.past ! p) ; + pastAttr = \\p => glue age (copula.pastAttr ! p) ; + futureAttr = \\p => glue age (copula.futureAttr ! p) + } ; + + n_units_AP card unit adj = adj ** { + s = \\vf => card.s ! unit.c.origin ! Attrib ++ unit.s ! Bare ++ adj.s ! vf ; + compar = [] + } ; + n_units_of_NP card unit np = np ** { + s = \\nf => card.s ! unit.c.origin ! Attrib ++ unit.s ! Bare ++ np.s ! nf + } ; + cup_of_CN np = useN (P.mkN "컵") ** {rs = np.s ! Bare} ; + + weekdayPunctualAdv w = {s = glue (w.s ! Bare) "에"} ; + weekdayHabitualAdv w = {s = "매주" ++ glue (w.s ! Bare) "에"} ; + yearAdv y = {s = glue (y.s ! Bare) "에"} ; + intYear i = lin NP {s = \\_ => glue i.s "년" ; p = Consonant} ; + intMonthday i = lin NP {s = \\_ => glue i.s "일" ; p = Consonant} ; + weekdayN w = w ; monthN m = m ; - weekdayPN w = mkPN w ; - monthPN m = mkPN m ; + monday_Weekday = P.mkN "월요일" ; + tuesday_Weekday = P.mkN "화요일" ; + wednesday_Weekday = P.mkN "수요일" ; + thursday_Weekday = P.mkN "목요일" ; + friday_Weekday = P.mkN "금요일" ; + saturday_Weekday = P.mkN "토요일" ; + sunday_Weekday = P.mkN "일요일" ; - languageCN l = mkCN l ; - languageNP l = mkNP l ; - - -oper mkLanguage : Str -> N = \s -> mkN s ; - ----------------------------------------------- ----- lexicon of special names - -lin second_Timeunit = mkN "second" ; -lin minute_Timeunit = mkN "minute" ; -lin hour_Timeunit = mkN "hour" ; -lin day_Timeunit = mkN "day" ; -lin week_Timeunit = mkN "week" ; -lin month_Timeunit = mkN "month" ; -lin year_Timeunit = mkN "year" ; - -lin monday_Weekday = mkN "Monday" ; -lin tuesday_Weekday = mkN "Tuesday" ; -lin wednesday_Weekday = mkN "Wednesday" ; -lin thursday_Weekday = mkN "Thursday" ; -lin friday_Weekday = mkN "Friday" ; -lin saturday_Weekday = mkN "Saturday" ; -lin sunday_Weekday = mkN "Sunday" ; - -lin january_Month = mkN "January" ; -lin february_Month = mkN "February" ; -lin march_Month = mkN "March" ; -lin april_Month = mkN "April" ; -lin may_Month = mkN "May" ; -lin june_Month = mkN "June" ; -lin july_Month = mkN "July" ; -lin august_Month = mkN "August" ; -lin september_Month = mkN "September" ; -lin october_Month = mkN "October" ; -lin november_Month = mkN "November" ; -lin december_Month = mkN "December" ; - -lin afrikaans_Language = mkLanguage "Afrikaans" ; -lin amharic_Language = mkLanguage "Amharic" ; -lin arabic_Language = mkLanguage "Arabic" ; -lin bulgarian_Language = mkLanguage "Bulgarian" ; -lin catalan_Language = mkLanguage "Catalan" ; -lin chinese_Language = mkLanguage "Chinese" ; -lin danish_Language = mkLanguage "Danish" ; -lin dutch_Language = mkLanguage "Dutch" ; -lin english_Language = mkLanguage "Euslish" ; -lin estonian_Language = mkLanguage "Estonian" ; -lin finnish_Language = mkLanguage "Finnish" ; -lin french_Language = mkLanguage "French" ; -lin german_Language = mkLanguage "German" ; -lin greek_Language = mkLanguage "Greek" ; -lin hebrew_Language = mkLanguage "Hebrew" ; -lin hindi_Language = mkLanguage "Hindi" ; -lin japanese_Language = mkLanguage "Japanese" ; -lin italian_Language = mkLanguage "Italian" ; -lin latin_Language = mkLanguage "Latin" ; -lin latvian_Language = mkLanguage "Latvian" ; -lin maltese_Language = mkLanguage "Maltese" ; -lin nepali_Language = mkLanguage "Nepali" ; -lin norwegian_Language = mkLanguage "Norwegian" ; -lin persian_Language = mkLanguage "Persian" ; -lin polish_Language = mkLanguage "Polish" ; -lin punjabi_Language = mkLanguage "Punjabi" ; -lin romanian_Language = mkLanguage "Romanian" ; -lin russian_Language = mkLanguage "Russian" ; -lin sindhi_Language = mkLanguage "Sindhi" ; -lin spanish_Language = mkLanguage "Spanish" ; -lin swahili_Language = mkLanguage "Swahili" ; -lin swedish_Language = mkLanguage "Swedish" ; -lin thai_Language = mkLanguage "Thai" ; -lin turkish_Language = mkLanguage "Turkish" ; -lin urdu_Language = mkLanguage "Urdu" ; - -—} -} --} + january_Month = P.mkN "1월" ; + february_Month = P.mkN "2월" ; + march_Month = P.mkN "3월" ; + april_Month = P.mkN "4월" ; + may_Month = P.mkN "5월" ; + june_Month = P.mkN "6월" ; + july_Month = P.mkN "7월" ; + august_Month = P.mkN "8월" ; + september_Month = P.mkN "9월" ; + october_Month = P.mkN "10월" ; + november_Month = P.mkN "11월" ; + december_Month = P.mkN "12월" ; } diff --git a/src/korean/ExtendKor.gf b/src/korean/ExtendKor.gf index 4484a702c..453c22935 100644 --- a/src/korean/ExtendKor.gf +++ b/src/korean/ExtendKor.gf @@ -3,7 +3,11 @@ concrete ExtendKor of Extend = CatKor -- ** ExtendFunctor - [ApposNP] -- with (Grammar=GrammarKor) - ** open Prelude, ResKor, NounKor, Coordination, TenseX in { + ** open Prelude, ResKor, NounKor, Coordination, TenseX, + (G=GrammarKor) in { + + lincat + VPS, [VPS], VPI, [VPI], RNP, [Comp], [Imp] = SS ; lin UttAdV adv = {s = adv.s} ; @@ -11,5 +15,71 @@ concrete ExtendKor of Extend = CatKor -- : NP -> NP -> NP ApposNP np1 np2 = np1 ** {s = \\nf => np1.s ! nf ++ np2.s ! nf} ; + EmptyRelSlash cl = cl ; + + ReflPron = {s="자신"} ; + ReflPoss n cn = {s="자신의" ++ cn.rs ++ cn.s ! Bare} ; + AdvRNP np prep rnp = {s=np.s ! Bare ++ rnp.s ++ prep.s ! Vowel} ; + AdvRVP vp prep rnp = insertAdv vp {s=rnp.s ++ prep.s ! Vowel} ; + AdvRAP ap prep rnp = ap ** {compar=rnp.s ++ prep.s ! Vowel ++ ap.compar} ; + PossPronRNP pron n cn rnp = G.DetCN (G.DetQuant (G.PossPron pron) n) + (cn ** {rs=glue rnp.s "의" ++ cn.rs}) ; + + GenModNP n np cn = G.DetCN (G.DetQuant G.DefArt n) + (cn ** {rs=glue (np.s ! Bare) "의" ++ cn.rs}) ; + CompoundN first head = head ** { + s = \\nf => first.s ! Bare ++ head.s ! nf + } ; + CompoundAP n a = a ** {s=\\vf=>n.s ! Bare ++ a.s ! vf; compar=[]} ; + PresPartAP vp = do_A ** {s=\\vf=>linVP vf vp; compar=[]} ; + PastPartAP slash = do_A ** { + s=\\vf=>slash.adv ++ slash.s ! vf; compar=[] + } ; + PastPartAgentAP slash agent = do_A ** { + s=\\vf=>glue (agent.s ! Bare) "에게" ++ slash.adv ++ + slash.s ! vf; compar=[] + } ; + PassVPSlash slash = useV slash ** {adv=slash.adv} ; + PassAgentVPSlash slash agent = insertAdv (PassVPSlash slash) + {s=glue (agent.s ! Bare) "에게"} ; + ProgrVPSlash slash = slash ** { + s=\\vf=>glue (slash.s ! VStem Pos) "고" ++ have_V.s ! vf + } ; + GerundCN vp = useN (stringN (linVP (VAttr Pos) vp ++ "것")) ; + GerundNP vp = stringNP (linVP (VAttr Pos) vp ++ "것") ; + GerundAdv vp = {s=glue (linVP (VStem Pos) vp) "면서"} ; + ByVP vp = {s=linVP (VAttr Pos) vp ++ "것으로써"} ; + PositAdVAdj a = {s=glue (a.s ! VStem Pos) "게"} ; + ComplBareVS vs s = useV vs ** {adv=s.s ! Subord ++ "고"} ; + ComplSlashPartLast = G.ComplSlash ; + UttVPShort = G.UttVP ; + + UseDAP d = d ** {s=d.sp} ; + UseDAPMasc = UseDAP ; + UseDAPFem = UseDAP ; + + MkVPS t pol vp = {s=t.s ++ pol.s ++ + vp.nObj ! DeclObj ++ vp.adv ++ + tenseVP t.t t.a (Statement Formal) pol.p vp} ; + BaseVPS x y = {s=x.s ++ y.s} ; + ConsVPS x xs = {s=x.s ++ xs.s} ; + ConjVPS co xs = {s=co.s1 ++ xs.s} ; + PredVPS np vps = {s=\\_=>np.s ! Subject ++ vps.s; p=Vowel} ; + MkVPI vp = {s=linVP (VAttr Pos) vp ++ "것"} ; + BaseVPI x y = {s=x.s ++ y.s} ; + ConsVPI x xs = {s=x.s ++ xs.s} ; + ConjVPI co xs = {s=co.s1 ++ xs.s} ; + ComplVPIVV vv vpi = useV vv ** {adv=glue vpi.s "을"} ; + BaseImp x y = {s=x.s ! Pos ++ y.s ! Pos} ; + ConsImp x xs = {s=x.s ! Pos ++ xs.s} ; + ConjImp co xs = {s=\\_=>co.s1 ++ xs.s} ; + BaseComp x y = {s=x.s ! VAttr Pos ++ y.s ! VAttr Pos} ; + ConsComp x xs = {s=x.s ! VAttr Pos ++ xs.s} ; + ConjComp co xs = emptyComp ** {s=\\_=>co.s1 ++ xs.s} ; + TPastSimple = TPast ; + + oper + stringNP : Str -> NounPhrase = \s -> {s=\\_=>s; p=Consonant} ; + stringN : Str -> Noun = \s -> stringNP s ** {c=baseCounter} ; } ; diff --git a/src/korean/Hangul.gf b/src/korean/Hangul.gf index 42793d561..ea10b78e2 100644 --- a/src/korean/Hangul.gf +++ b/src/korean/Hangul.gf @@ -20,6 +20,9 @@ oper addSuffix : Str -> Str = \stem -> case stem of { + -- 하다 and all productive 하다 compounds contract 하+여 to 해. + start + "하" => start + "해" ; + -- Final ㅏ or ㅓ does not repeat itself. _ + #a|#eo => stem ; diff --git a/src/korean/IdiomKor.gf b/src/korean/IdiomKor.gf index 3eec44d49..473dde908 100644 --- a/src/korean/IdiomKor.gf +++ b/src/korean/IdiomKor.gf @@ -6,42 +6,39 @@ concrete IdiomKor of Idiom = CatKor ** open Prelude, ResKor, VerbKor, NounKor, S -- This module defines constructions that are formed in fixed ways, -- often different even in closely related languages. -{- lin + lin - -- ImpersCl : VP -> Cl ; -- it is hot - -- GenericCl : VP -> Cl ; -- one sleeps - ImpersCl, - GenericCl = \vp -> predVP impersNP (passVP vp) ; + ImpersCl vp = predVP' [] vp ; + GenericCl vp = predVP' "사람이" vp ; - CleftNP : NP -> RS -> Cl ; -- it is I who did it - CleftAdv : Adv -> S -> Cl ; -- it is here she slept + -- CleftNP : NP -> RS -> Cl ; -- it is I who did it + -- CleftAdv : Adv -> S -> Cl ; -- it is here she slept - -- : NP -> Cl ; -- there is a house - ExistNP np = + ExistNP np = predVP np (useV have_V) ; - ExistIP : IP -> QCl ; -- which houses are there + -- ExistIP : IP -> QCl ; -- which houses are there -- 7/12/2012 generalizations of these - ExistNPAdv : NP -> Adv -> Cl ; -- there is a house in Paris - ExistIPAdv : IP -> Adv -> QCl ; -- which houses are there in Paris + ExistNPAdv np adv = predVP np (insertAdv (useV have_V) adv) ; + -- ExistIPAdv : IP -> Adv -> QCl ; -- which houses are there in Paris -- : VP -> VP ; ProgrVP vp = vp ** { + s = \\vf => glue (vp.s ! VStem Pos) "고" ++ have_V.s ! vf } ; -- : VP -> Utt ; -- let's go - ImpPl1 vp = { } ; + ImpPl1 vp = {s = vp.nObj ! ImpObj ++ vp.adv ++ vp.s ! VF Polite Pos} ; - ImpP3 : NP -> VP -> Utt ; -- let John walk + -- ImpP3 : NP -> VP -> Utt ; -- let John walk -- 3/12/2013 non-reflexive uses of "self" - SelfAdvVP : VP -> VP ; -- is at home himself - SelfAdVVP : VP -> VP ; -- is himself at home - SelfNP : NP -> NP ; -- the president himself (is at home) --} + -- SelfAdvVP : VP -> VP ; -- is at home himself + -- SelfAdVVP : VP -> VP ; -- is himself at home + -- SelfNP : NP -> NP ; -- the president himself (is at home) } diff --git a/src/korean/NamesKor.gf b/src/korean/NamesKor.gf index f6c6069ab..43807a9a1 100644 --- a/src/korean/NamesKor.gf +++ b/src/korean/NamesKor.gf @@ -1,4 +1,4 @@ -concrete NamesKor of Names = CatKor ** open ResKor in { +concrete NamesKor of Names = CatKor ** open Prelude, ResKor in { lin GivenName, MaleSurname, FemaleSurname = \n -> n ; lin FullName gn sn = { @@ -7,5 +7,7 @@ lin FullName gn sn = { } ; UseLN pn = pn ; + InLN pn = {s = glue (pn.s ! Bare) "에서"} ; + AdjLN ap pn = pn ** {s = \\nf => ap.compar ++ ap.s ! VAttr Pos ++ pn.s ! nf} ; } diff --git a/src/korean/NounKor.gf b/src/korean/NounKor.gf index e446fb6c7..59993d017 100644 --- a/src/korean/NounKor.gf +++ b/src/korean/NounKor.gf @@ -20,6 +20,13 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { in case isNum det of { True => cn.rs ++ cns ++ detnum ; False => cn.rs ++ detnum ++ cns } + ; p = case isNum det of { + True => cn.c.p ; + False => case det.n of { + Pl => Consonant ; + Sg => cn.p + } + } } ; -- : PN -> NP ; @@ -30,13 +37,7 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { -- : Predet -> NP -> NP ; -- only the man PredetNP predet np = np ** {s = - let sakwa = np.s ! Bare ; - man = predet.s ! np.p ; - un = table {Vowel => "는"; Consonant => "은"} ! predet.p - in table { -- TODO: do particles combine? - Topic => glue (glue sakwa man) un ; - _ => glue sakwa man - } + \\nf => predet.s ! np.p ++ np.s ! nf } ; -- A noun phrase can also be postmodified by the past participle of a @@ -52,8 +53,7 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { s = \\nf => adv.s ++ np.s ! nf } ; -- TODO test - -- : NP -> Adv -> NP ; -- boys, such as .. - -- ExtAdvNP np adv = np ** {} ; + ExtAdvNP np adv = np ** {s = \\nf => adv.s ++ np.s ! nf} ; -- : NP -> RS -> NP ; -- Paris, which is here -- RelNP np rs = np ** { @@ -67,6 +67,11 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { c = baseCounter } ; + QuantityNP dec unit = { + s = \\_ => dec.s ! NCard ++ unit.s ; + p = Consonant + } ; + -- MassNP : CN -> NP ; MassNP cn = cn ** { s = \\nf => cn.rs ++ cn.s ! nf @@ -83,9 +88,11 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { } ; -- : Quant -> Num -> Ord -> Det ; -- these five best - -- DetQuantOrd quant num ord = - -- let theseFive = DetQuant quant num in theseFive ** { - -- } ; + DetQuantOrd quant num ord = + let det = DetQuant quant num in det ** { + s = \\origin => det.s ! origin ++ ord.s ! VAttr Pos ; + sp = \\nf => ord.s ! VAttr Pos ++ det.sp ! nf + } ; -- Whether the resulting determiner is singular or plural depends on the -- cardinal. @@ -116,17 +123,20 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { -- : Numeral -> Card ; NumNumeral num = num ; -{- -- : AdN -> Card -> Card ; - AdNum adn card = card ** { s = adn.s ++ card.s } ; + AdNum adn card = card ** {s = \\o,f => adn.s ++ card.s ! o ! f} ; -- : Digits -> Ord ; - OrdDigits digs = digs ** { s = digs.s ! NOrd } ; --} + OrdDigits digs = do_A ** { + s = \\_ => digs.s ! NOrd ; + n = digs.n + } ; + -- : Numeral -> Ord ; - -- OrdNumeral num = num ** { - -- s = \\_ => num.ord - -- } ; + OrdNumeral num = do_A ** { + s = \\_ => num.ord ; + n = num.n + } ; -- : A -> Ord ; OrdSuperl a = a ** { @@ -153,7 +163,9 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { UseN,UseN2 = ResKor.useN ; -- : N2 -> NP -> CN ; - -- ComplN2 n2 np = + ComplN2 n2 np = useN n2 ** { + rs = (prepNP Bare n2.p2 np).s + } ; -- : N3 -> NP -> N2 ; -- distance from this city (to Paris) -- ComplN3 n3 np = @@ -202,28 +214,29 @@ concrete NounKor of Noun = CatKor ** open ResKor, Prelude in { --2 Possessive and partitive constructs -- : PossNP : CN -> NP -> CN ; - -- PossNP cn np = cn ** { - -- } ; + PossNP cn np = cn ** { + rs = glue (np.s ! Bare) "의" ++ cn.rs + } ; -- : CN -> NP -> CN ; -- glass of wine / two kilos of red apples - -- PartNP cn np = cn ** { - -- } ; - -{- + PartNP cn np = cn ** { + rs = np.s ! Bare ++ cn.rs + } ; -- This is different from the partitive, as shown by many languages. -- : Det -> NP -> NP ; CountNP det np = np ** - { } ; -- Nonsense for DefArt or IndefArt + {s = \\nf => det.s ! NK ++ np.s ! nf} ; -- Nonsense for DefArt or IndefArt --3 Conjoinable determiners and ones with adjectives -- : DAP -> AP -> DAP ; -- the large (one) - AdjDAP dap ap = dap ** { } ; + AdjDAP dap ap = dap ** { + sp = \\nf => ap.compar ++ ap.s ! VAttr Pos ++ dap.sp ! nf + } ; -- : Det -> DAP ; -- this (or that) DetDAP det = det ; --} } diff --git a/src/korean/NumeralKor.gf b/src/korean/NumeralKor.gf index 7b7d979d6..893c87362 100644 --- a/src/korean/NumeralKor.gf +++ b/src/korean/NumeralKor.gf @@ -75,19 +75,25 @@ lin pot2 = potTimes "백" "백" ; -- : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n - pot2plus m n = TODO ; + pot2plus m n = combineNum "백" m n ; -- : Sub1000 -> Sub1000000 ; -- coercion of 1..999 pot2as3 x = x ; -- : Sub1000 -> Sub1000000 ; -- m * 1000 - pot3 m = TODO ; + pot3 m = scaleNum "천" m ; -- : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n - pot3plus m n = TODO ; + pot3plus m n = combineNum "천" m n ; pot3as4 x = x ; + pot41 = fixedNum "백만" ; + pot4 m = scaleNum "백만" m ; + pot4plus m n = combineNum "백만" m n ; pot4as5 x = x ; + pot51 = fixedNum "십억" ; + pot5 m = scaleNum "십억" m ; + pot5plus m n = combineNum "십억" m n ; oper LinDigit : Type = ResKor.Numeral ** {isTwo : Bool ; ten : Str} ; @@ -128,6 +134,23 @@ oper TODO : ResKor.Numeral = mkNum2 "TODO" "TODO" ; + fixedNum : Str -> ResKor.Numeral = \s -> { + s = \\_,_ => s ; n = numNumber ; numtype = IsNum ; ord = s ++ "번째" + } ; + + scaleNum : Str -> ResKor.Numeral -> ResKor.Numeral = \unit,m -> m ** { + s = \\_,_ => m.s ! SK ! Indep ++ unit ; + n = numNumber ; + ord = m.s ! SK ! Indep ++ unit ++ "번째" + } ; + + combineNum : Str -> ResKor.Numeral -> ResKor.Numeral -> ResKor.Numeral = + \unit,m,n -> n ** { + s = \\_,_ => m.s ! SK ! Indep ++ unit ++ n.s ! SK ! Indep ; + n = numNumber ; + ord = m.s ! SK ! Indep ++ unit ++ n.s ! SK ! Indep ++ "번째" + } ; + -- numerals as sequences of digits diff --git a/src/korean/ParadigmsKor.gf b/src/korean/ParadigmsKor.gf index b9109a6b7..959e45e3f 100644 --- a/src/korean/ParadigmsKor.gf +++ b/src/korean/ParadigmsKor.gf @@ -27,6 +27,12 @@ oper mkN : (noun,counter : Str) -> NumOrigin -> N ; -- Noun, classifier and origin of numerals. E.g. `mkN "사람" "명" nativeKorean` } ; + mkN2 : overload { + mkN2 : Str -> N2 ; + mkN2 : N -> N2 ; + mkN2 : N -> Prep -> N2 ; + } ; + --2 Adjectives mkA : overload { @@ -58,27 +64,30 @@ oper mkV2 : overload { mkV2 : (plain : Str) -> V2 ; -- Regular verb. Takes plain, uninflected -다 form, subject particle is 가/이 and object particle is 를/을. mkV2 : V -> V2 ; -- Takes preconstructed V, subject particle is 가/이 and object particle is 를/을. + mkV2 : V -> CaseParticle -> V2 ; -- Takes preconstructed V and a case particle for its complement. + mkV2 : V -> Prep -> V2 ; -- Takes preconstructed V and a postposition for its complement. mkV2 : V -> (subj,obj : CaseParticle) -> V2 ; -- Takes preconstructed V, and subject and object particles. E.g. `mkV2 좋다_V topic subject` for "as for 는, 가 is good". } ; -- mkV3 : overload { -- } ; - -- mkVV : overload { - -- } ; + mkVA : V -> VA ; + mkVV : overload { + mkVV : V -> VV ; + mkVV : V -> CaseParticle -> VV ; + mkVV : V -> Prep -> VV ; + } ; + mkVS : V -> VS ; + mkVQ : V -> VQ ; + mkV2A : V -> V2A ; + mkV2V : overload { + mkV2V : V -> V2V ; + mkV2V : V -> CaseParticle -> V2V ; + mkV2V : V -> Prep -> V2V ; + } ; + mkV2S : V -> V2S ; - -- - -- mkVA : Str -> VA - -- = \s -> lin VA (regV s) ; - -- mkVQ : Str -> VQ - -- = \s -> lin VQ (regV s) ; - -- mkVS : Str -> VS - -- = \s -> lin VS (regV s) ; - -- - -- mkV2A : Str -> V2A - -- = \s -> lin V2A (regV s ** {c2 = noPrep}) ; - -- mkV2V : Str -> V2V - -- = \s -> lin V2V (regV s ** {c2 = noPrep}) ; -- mkV2Q : Str -> V2Q -- = \s -> lin V2Q (regV s ** {c2 = noPrep}) ; @@ -107,6 +116,8 @@ oper mkAdA : Str -> AdA = \s -> lin AdA {s = s} ; + mkAdN : Str -> AdN ; + --. ------------------------------------------------------------------------------- @@ -135,8 +146,9 @@ oper in lin N (noun ** {c = counter}) ; mkN2 = overload { - mkN2 : Str -> N2 = \s -> lin N2 (mkNoun s) ; - mkN2 : N -> N2 = \n -> lin N2 n ; + mkN2 : Str -> N2 = \s -> lin N2 (mkNoun s ** {p2 = emptyPP}) ; + mkN2 : N -> N2 = \n -> lin N2 (n ** {p2 = emptyPP}) ; + mkN2 : N -> Prep -> N2 = \n,p -> lin N2 (n ** {p2 = p}) ; } ; -- mkPN = overload { @@ -145,11 +157,21 @@ oper mkA = overload { mkA : (adj : Str) -> A = \s -> lin A (mkAdj s) ; mkA : (kiga : Str) -> (jakda : A) -> A = \kiga,jakda -> - jakda ** {s = \\af => kiga ++ jakda.s ! af} ; + jakda ** { + s = \\af => kiga ++ jakda.s ! af ; + past = \\p => kiga ++ jakda.past ! p ; + pastAttr = \\p => kiga ++ jakda.pastAttr ! p ; + futureAttr = \\p => kiga ++ jakda.futureAttr ! p + } ; mkA : (plain,polite,formal,attr : Str) -> A = \x1,x2,x3,x4 -> lin A (mkAdjReg x1 x2 x3 x4) ; mkA : (jaemi : Str) -> (itda : V) -> A - = \jaemi,itda -> lin A (itda ** {s = \\vf => jaemi ++ itda.s ! vf}) ; + = \jaemi,itda -> lin A (itda ** { + s = \\vf => jaemi ++ itda.s ! vf ; + past = \\p => jaemi ++ itda.past ! p ; + pastAttr = \\p => jaemi ++ itda.pastAttr ! p ; + futureAttr = \\p => jaemi ++ itda.futureAttr ! p + }) ; } ; mkA2 = overload { @@ -164,7 +186,11 @@ oper mkV = overload { mkV : (plain : Str) -> V = \v -> lin V (mkVerb v) ; mkV : (nore : Str) -> (hada : V) -> V = \nore,hada -> hada ** { - s = \\vf => nore + hada.s ! vf} ; + s = \\vf => nore + hada.s ! vf ; + past = \\p => nore + hada.past ! p ; + pastAttr = \\p => nore + hada.pastAttr ! p ; + futureAttr = \\p => nore + hada.futureAttr ! p + } ; mkV : (plain,polite,formal,attr : Str) -> V = \x1,x2,x3,x4 -> lin V (mkVerbReg x1 x2 x3 x4) ; } ; @@ -177,16 +203,39 @@ oper mkV2 = overload { mkV2 : (plain : Str) -> V2 = \v2 -> lin V2 (mkVerb2 v2) ; mkV2 : V -> V2 = \v -> lin V2 (vtov2 v) ; + mkV2 : V -> CaseParticle -> V2 = \v,c2 -> + lin V2 (vtov2 v ** {c2 = c2}) ; mkV2 : V -> (subj,obj : CaseParticle) -> V2 = \v,sc,c2 -> lin V2 (vtov2 v ** {sc = sc ; c2 = c2}) ; + mkV2 : V -> Prep -> V2 = \v,p2 -> + lin V2 (vtov2 v ** {c2 = Bare ; p2 = p2}) ; } ; mkV3 = overload { mkV3 : (plain : Str) -> V3 = \v3 -> lin V3 (mkVerb3 v3) ; } ; - -- - -- mkVV = overload { - -- } ; + + mkVA = \v -> lin VA v ; + mkVV = overload { + mkVV : V -> VV = \v -> lin VV (vtov2 v) ; + mkVV : V -> CaseParticle -> VV = \v,c2 -> + lin VV (vtov2 v ** {c2 = c2}) ; + mkVV : V -> Prep -> VV = \v,p2 -> + lin VV (vtov2 v ** {c2 = Bare ; p2 = p2}) ; + } ; + mkVS = \v -> lin VS v ; + mkVQ = \v -> lin VQ v ; + mkV2A = \v -> lin V2A (v ** {c2=Object; p2={s=\\_=>""; attaches=False}}) ; + mkV2V = overload { + mkV2V : V -> V2V = \v -> lin V2V (vtov2 v) ; + mkV2V : V -> CaseParticle -> V2V = \v,c2 -> + lin V2V (vtov2 v ** {c2 = c2}) ; + mkV2V : V -> Prep -> V2V = \v,p2 -> + lin V2V (vtov2 v ** {c2 = Bare ; p2 = p2}) ; + } ; + mkV2S = \v -> lin V2S (v ** {c2=Object; p2={s=\\_=>""; attaches=False}}) ; + + mkAdN = \s -> lin AdN {s=s} ; mkPrep = overload { mkPrep : (e : Str) -> Prep -- Particle like 에, attaches to the NP. diff --git a/src/korean/PhraseKor.gf b/src/korean/PhraseKor.gf index 0c17deb3d..759e6545b 100644 --- a/src/korean/PhraseKor.gf +++ b/src/korean/PhraseKor.gf @@ -25,6 +25,6 @@ concrete PhraseKor of Phrase = CatKor ** open Prelude, ResKor in { -- PConjConj conj = {s = conj.s1 ++ conj.s2 ! …} ; NoVoc = {s = []} ; --- VocNP np = { s = "," ++ np.s ! … } ; -} + VocNP np = {s = SOFT_BIND ++ "," ++ np.s ! Bare} ; } diff --git a/src/korean/QuestionKor.gf b/src/korean/QuestionKor.gf index fd1f4f130..f22e0b98a 100644 --- a/src/korean/QuestionKor.gf +++ b/src/korean/QuestionKor.gf @@ -74,5 +74,27 @@ concrete QuestionKor of Question = CatKor ** open QuestQVP : IP -> QVP -> QCl ; -- who buys what where -} + lin + QuestCl cl = cl ; + QuestVP ip vp = predVP ip vp ; + QuestSlash ip cl = cl ** { + s = \\t,a,p,c => ip.s ! Object ++ cl.s ! t ! a ! p ! c + } ; + QuestIAdv adv cl = cl ** { + s = \\t,a,p,c => adv.s ++ cl.s ! t ! a ! p ! c + } ; + QuestIComp comp np = predVP np (VS.UseComp (emptyComp ** { + s = \\_ => comp.s + })) ; + + IdetCN = NS.DetCN ; + IdetIP = NS.DetNP ; + AdvIP = NS.AdvNP ; + IdetQuant = NS.DetQuant ; + PrepIP prep ip = prepNP Bare prep ip ; + AdvIAdv a b = {s = a.s ++ b.s} ; + CompIAdv adv = adv ; + CompIP ip = {s = ip.s ! Bare} ; + } diff --git a/src/korean/RelativeKor.gf b/src/korean/RelativeKor.gf index a16b997d9..cab3a1533 100644 --- a/src/korean/RelativeKor.gf +++ b/src/korean/RelativeKor.gf @@ -6,12 +6,12 @@ lin RelCl = relSlash (ss "") ; -- : RP -> VP -> RCl ; - RelVP rp vp = vp ** { -- TODO no tenses yet in the grammar + RelVP rp vp = vp ** { s = \\t,a,p,cltyp => - rp.s ++ vp.adv ++ vp.nObj ! DeclObj ++ - case cltyp of { - WithConj => vp.s ! VStem p ; - _ => vp.s ! VAttr p } ; + rp.s ++ vp.nObj ! DeclObj ++ vp.adv ++ + tenseVP t a cltyp p (vp ** { + nObj = \\_ => [] ; adv = [] + }) ; } ; -- : RP -> ClSlash -> RCl ; -- whom John loves diff --git a/src/korean/ResKor.gf b/src/korean/ResKor.gf index 6d01f3ee3..82ffe9c36 100644 --- a/src/korean/ResKor.gf +++ b/src/korean/ResKor.gf @@ -5,17 +5,20 @@ resource ResKor = ParamKor ** open Prelude, Predef, ParamKor in { oper Counter : Type = { s : Str ; - origin : NumOrigin + origin : NumOrigin ; + p : Phono } ; baseCounter : Counter = { s = "개" ; - origin = NK + origin = NK ; + p = Vowel } ; mkCounter : Str -> NumOrigin -> Counter = \s,o -> baseCounter ** { s = s ; origin = o ; + p = if_then_else Phono (vowFinal s) Vowel Consonant ; } ; BaseNoun : Type = { @@ -26,7 +29,7 @@ oper Noun : Type = BaseNoun ** { c : Counter ; } ; - Noun2 : Type = Noun ; -- TODO eventually more parameters? + Noun2 : Type = Noun ** {p2 : Postposition} ; Noun3 : Type = Noun ; CNoun : Type = Noun ** { @@ -145,6 +148,7 @@ oper Adjective : Type = { s : VForm => Str ; -- Adjectives are verbs p, pNeg : Phono ; -- needed for attaching conjunction + past, pastAttr, futureAttr : Polarity => Str ; } ; Adjective2 : Type = Adjective ** {c2 : NForm ; p2 : Postposition} ; @@ -172,6 +176,7 @@ oper BaseVerb : Type = { sc : NForm ; -- subject case p, pNeg : Phono ; -- needed for attaching conjunction + past, pastAttr, futureAttr : Polarity => Str ; } ; Verb : Type = BaseVerb ** { s : VForm => Str ; @@ -206,7 +211,7 @@ oper planeg = neg ++ negForms ! Plain ; polneg = neg ++ negForms ! Polite ; formneg = neg ++ negForms ! Formal ; - impneg = neg ++ "마새요" ; + impneg = neg ++ "마세요" ; in mkVerbFull stem attrpos attrneg plain polite formal planeg polneg formneg impneg ; mkVerbFull : (x1,_,_,_,_,_,_,_,_,x10 : Str) -> Verb = @@ -225,6 +230,18 @@ oper VImpNeg => impneg } ; sc = Subject ; + past = table { + Pos => pastBase stem ; + Neg => pastBase (init planeg) + } ; + pastAttr = table { + Pos => add_N stem ; + Neg => add_N (init planeg) + } ; + futureAttr = table { + Pos => futureAttrForm stem ; + Neg => futureAttrForm (init planeg) + } ; p = if_then_else Phono (vowFinal stem) Vowel Consonant ; pNeg = if_then_else Phono (vowFinal (init planeg)) Vowel Consonant ; } ; @@ -239,14 +256,17 @@ oper "아니다" "아니에요" "아닙니다" - "있지마세요" ; + "있지 마세요" ; copulaAfterVowel : Verb = copula ** { s = \\vf => case vf of { VAttr Pos => "는" ; -- TODO just guessing VF Plain Pos => "다" ; VF Polite Pos => "예요" ; - _ => copula.s ! vf } + _ => copula.s ! vf } ; + past = table {Pos => "였" ; Neg => copula.past ! Neg} ; + pastAttr = table {Pos => "였던" ; Neg => copula.pastAttr ! Neg} ; + futureAttr = table {Pos => "일" ; Neg => copula.futureAttr ! Neg} } ; have_V : Verb = mkVerbFull @@ -259,7 +279,7 @@ oper "없다" "없어요" "없습니다" - "없지 마새요" ; + "없지 마세요" ; -- For building an adjective. Different attr from do_V. do_A : Verb = mkVerbReg @@ -312,10 +332,12 @@ oper Complement : Type = { s : VForm => Str ; + past, pastAttr, futureAttr : Polarity => Str ; } ; emptyComp : Complement = { s = \\_ => [] ; + past, pastAttr, futureAttr = \\_ => [] ; } ; BaseVP : Type = { @@ -371,15 +393,75 @@ oper let npstr : Str = np.s ! vp.sc in predVP' npstr vp ; predVP' : (np : Str) -> VerbPhrase -> ClSlash = \np,vp -> vp ** { - s = \\t,a,p,cltyp => - let vf = case cltyp of { - Subord => VAttr p ; - WithConj => VStem p ; - Statement st => VF st p } -- TODO: more tenses - in np + s = \\t,a,p,cltyp => np ++ vp.nObj ! DeclObj -- an object, not copula complement ++ vp.adv - ++ vp.s ! vf + ++ tenseVP t a cltyp p vp + } ; + + -- Korean marks tense on the final predicate. Deriving the marked forms + -- here also makes tense work for VPs assembled from auxiliaries. + tenseVP : Tense -> Anteriority -> ClType -> Polarity -> VerbPhrase -> Str = + \t,a,ct,p,vp -> + let stem = vp.s ! VStem p in + case of { + => vp.s ! VF st p ; + => finishFinite st (glue stem "겠") ; + => conditional st (vp.past ! p) ; + => finishFinite st (vp.past ! p) ; + + => vp.s ! VAttr p ; + => vp.futureAttr ! p ; + => glue (vp.past ! p) "을" ; + => vp.pastAttr ! p ; + + => stem ; + => glue stem "겠" ; + => vp.past ! p ; + => vp.past ! p + } ; + + finishFinite : Style -> Str -> Str = \st,base -> case st of { + Formal => glue base "습니다" ; + Polite => glue base "어요" ; + Plain => glue base "다" + } ; + + conditional : Style -> Str -> Str = \st,base -> case st of { + Formal => base ++ "을 것입니다" ; + Polite => base ++ "을 거예요" ; + Plain => base ++ "을 것이다" + } ; + + -- Past -았/었- contracts after the common vowel-final stems. Consonant + -- stems only need the harmony-sensitive suffix and cover most regular + -- Korean verbs; 하다 compounds are by far the largest lexical class. + pastBase : Str -> Str = \stem -> case stem of { + x + "하" => x + "했" ; + x + "가" => x + "갔" ; x + "나" => x + "났" ; + x + "오" => x + "왔" ; x + "보" => x + "봤" ; + x + "주" => x + "줬" ; x + "두" => x + "뒀" ; + x + "되" => x + "됐" ; x + "돼" => x + "됐" ; + x + "서" => x + "섰" ; x + "자" => x + "잤" ; + x + "사" => x + "샀" ; x + "차" => x + "찼" ; + x + "켜" => x + "켰" ; x + "펴" => x + "폈" ; + x + "여" => x + "였" ; x + "해" => x + "했" ; + _ => case vowFinal stem of { + -- The uncontracted form (e.g. 버리었습니다, 추었습니다) is + -- grammatical and avoids producing duplicated *-어었습니다. + True => stem + "었" ; + False => case stem of { + _ + #a_o => stem + "았" ; + _ => stem + "었" + } + } } ; + + futureAttrForm : Str -> Str = \stem -> case stem of { + x + "가" => x + "갈" ; x + "나" => x + "날" ; + x + "오" => x + "올" ; x + "보" => x + "볼" ; + x + "주" => x + "줄" ; x + "하" => x + "할" ; + x + "되" => x + "될" ; x + "서" => x + "설" ; + _ => stem + "을" } ; -------------------------------------------------------------------------------- diff --git a/src/korean/SentenceKor.gf b/src/korean/SentenceKor.gf index daa6c0589..533236e24 100644 --- a/src/korean/SentenceKor.gf +++ b/src/korean/SentenceKor.gf @@ -15,12 +15,13 @@ lin --2 Clauses missing object noun phrases -- : NP -> VPSlash -> ClSlash ; - -- SlashVP = predVP ; -{- + SlashVP = predVP ; -- : ClSlash -> Adv -> ClSlash ; -- (whom) he sees today - AdvSlash cls adv = cls ** insertAdv adv cls ; + AdvSlash cls adv = cls ** { + s = \\t,a,p,c => adv.s ++ cls.s ! t ! a ! p ! c + } ; --- SlashPrep : Cl -> Prep -> ClSlash ; -- (with whom) he walks + SlashPrep cl prep = cl ; -- : NP -> VS -> SSlash -> ClSlash ; -- (whom) she says that he loves -- SlashVS np vs ss = {} ; @@ -28,11 +29,13 @@ lin -- : Temp -> Pol -> ClSlash -> SSlash ; -- (that) she had not seen UseSlash t p cls = { + s = \\c => t.s ++ p.s ++ cls.s ! t.t ! t.a ! p.p ! c ; + p = case p.p of {Pos => cls.p ; Neg => cls.pNeg} } ; --} --2 Imperatives -- : VP -> Imp ; ImpVP vp = {s = \\pol => linImp pol vp} ; + AdvImp adv imp = {s = \\pol => adv.s ++ imp.s ! pol} ; --2 Embedded sentences @@ -40,7 +43,7 @@ lin EmbedS s = {s = s.s ! Subord ++ "것이"} ; -- TODO check subject case -- : QS -> SC ; - -- EmbedQS qs = { } ; + EmbedQS qs = {s = qs.s ! Plain ++ "것이"} ; -- : VP -> SC ; EmbedVP vp = {s = linVP (VAttr Pos) vp ++ "것이"} ; @@ -74,7 +77,7 @@ lin ExtAdvS = advS (SOFT_BIND ++ ","); -- : S -> Subj -> S -> S ; - -- SSubjS s1 subj s2 = AdvS (AK.SubjS subj s2) s1 ; + SSubjS s1 subj s2 = AdvS (AK.SubjS subj s2) s1 ; -- : S -> RS -> S ; -- she sleeps, which is good -- RelS sent rs = advS {s = rs.s ! Sg3 Masc ++ SOFT_BIND ++ ","} sent ; diff --git a/src/korean/SymbolKor.gf b/src/korean/SymbolKor.gf index a90f4c4c9..33ff5d0c6 100644 --- a/src/korean/SymbolKor.gf +++ b/src/korean/SymbolKor.gf @@ -47,7 +47,14 @@ lin -- : Symb -> Ord ; SymbOrd sy = let comp : Comp = VK.CompAdv (lin Adv sy) - in {s = comp.s ; n = Pl ; p,pNeg = Vowel} ; + in { + s = comp.s ; + past = comp.past ; + pastAttr = comp.pastAttr ; + futureAttr = comp.futureAttr ; + n = Pl ; + p,pNeg = Vowel + } ; lincat Symb, [Symb] = SS ; diff --git a/src/korean/VerbKor.gf b/src/korean/VerbKor.gf index 6e93b691b..0baeadc88 100644 --- a/src/korean/VerbKor.gf +++ b/src/korean/VerbKor.gf @@ -15,71 +15,70 @@ lin -- ReflVP = ResKor.insertRefl ; -- : VV -> VP -> VP ; - -- ComplVV vv vp = let vc = vp.vComp in case vv.vvtype of { - -- - -- } ; + ComplVV vv vp = useV vv ** { + adv = vp.adv ; + nObj = vp.nObj ; + s = \\vf => vp.s ! VAttr Pos ++ "것을" ++ vv.s ! vf + } ; -- : VS -> S -> VP ; - -- ComplVS vs s = - -- let vps = useV vs ; - -- subord = SubjS {s=""} s ; - -- in vps ** {} ; + ComplVS vs sent = useV vs ** { + adv = sent.s ! Subord ++ "고" ; + } ; -{- -- : VQ -> QS -> VP ; - ComplVQ vq qs = ; + ComplVQ vq qs = useV vq ** {adv = qs.s ! Plain ++ "고"} ; -- : VA -> AP -> VP ; -- they become red - ComplVA va ap = ResKor.insertComp (CompAP ap).s (useV va) ; - --} + ComplVA va ap = useV va ** { + adv = ap.compar ++ ap.s ! VAttr Pos + } ; -------- -- Slash -- : V2 -> VPSlash SlashV2a = ResKor.useVc ; -{- - -- : V3 -> NP -> VPSlash ; -- give it (to her) -- : V3 -> NP -> VPSlash ; -- give (it) to her - Slash2V3, - Slash3V3 = \v3 -> insertComp (useVc3 v3) ; + Slash2V3 v3 np = useVc v3 ** { + nObj = \\_ => (prepNP v3.c3 v3.p3 np).s + } ; + Slash3V3 v3 np = useVc (v3 ** {c2=v3.c3; p2=v3.p3}) ** { + nObj = \\_ => (prepNP v3.c2 v3.p2 np).s + } ; -- : V2S -> S -> VPSlash ; -- answer (to him) that it is good SlashV2S v2s s = let vps = useVc v2s ; - subord = SubjS {s=""} s ; - in vps ** {obj = } ; + in vps ** {adv = s.s ! Subord ++ "고"} ; -- : V2V -> VP -> VPSlash ; -- beg (her) to go - SlashV2V v2v vp = ; + SlashV2V v2v vp = useVc v2v ** { + adv = vp.nObj ! DeclObj ++ vp.adv ++ vp.s ! VAttr Pos ++ "것을" + } ; -- : V2Q -> QS -> VPSlash ; -- ask (him) who came - SlashV2Q v2q qs = ; + SlashV2Q v2q qs = useVc v2q ** {adv = qs.s ! Plain ++ "고"} ; -- : V2A -> AP -> VPSlash ; -- paint (it) red SlashV2A v2a ap = useVc v2a ** { - aComp = \\_ => (CompAP ap).aComp ! Sg3 Masc + adv = ap.compar ++ glue (ap.s ! VStem Pos) "게" } ; --} -- : VPSlash -> NP -> VP ComplSlash = ResKor.insertComp ; -{- -- : VV -> VPSlash -> VPSlash ; - -- Just like ComplVV except missing subject! - SlashVV vv vps = ComplVV vv vps ** { missing = vps.missing ; - post = vps.post } ; + SlashVV vv vps = vps ** { + s = \\vf => vps.s ! VAttr Pos ++ "것을" ++ vv.s ! vf + } ; -- : V2V -> NP -> VPSlash -> VPSlash ; -- beg me to buy SlashV2VNP v2v np vps = - ComplVV v2v vps ** - { missing = vps.missing ; - post = vps.post ; - iobj = np ** { s = np.s ! Dat } } ; - --} + vps ** { + adv = (prepNP v2v.c2 v2v.p2 np).s ++ vps.adv ; + s = \\vf => vps.s ! VAttr Pos ++ "것을" ++ v2v.s ! vf + } ; -- : Comp -> VP ; UseComp comp = UseCopula ** comp ; @@ -91,7 +90,7 @@ lin -- : VP -> Adv -> VP ; -- sleep , even though ... - -- ExtAdvVP vp adv = ; + ExtAdvVP = insertAdv ; -- : AdV -> VP -> VP ; -- always sleep AdVVP adv vp = vp ** {adv = vp.adv ++ adv.s} ; @@ -100,9 +99,7 @@ lin AdVVPSlash adv vps = vps ** { adv = vps.adv ++ adv.s} ; -- : VP -> Prep -> VPSlash ; -- live in (it) - -- VPSlashPrep vp prep = - -- let adv = prepNP prep emptyNP - -- in insertAdv vp adv ; + VPSlashPrep vp prep = vp ** {c2=Bare; p2=prep} ; --2 Complements to copula @@ -110,26 +107,36 @@ lin -- : AP -> Comp ; CompAP ap = emptyComp ** { - s = \\vf => ap.compar ++ ap.s ! vf + s = \\vf => ap.compar ++ ap.s ! vf ; + past = \\p => ap.compar ++ ap.past ! p ; + pastAttr = \\p => ap.compar ++ ap.pastAttr ! p ; + futureAttr = \\p => ap.compar ++ ap.futureAttr ! p } ; -- : CN -> Comp ; -- : NP -> Comp ; CompCN, - CompNP = \n -> emptyComp ** { + CompNP = \n -> + let cop = case n.p of { + Vowel => copulaAfterVowel ; + Consonant => copula } + in emptyComp ** { s = \\vf => - let cop = case n.p of { - Vowel => copulaAfterVowel.s ; - Consonant => copula.s } - in case vf of { - VF _ Neg => n.s ! Bare ++ cop ! vf ; - _ => glue (n.s ! Bare) (cop ! vf) - } + case vf of { + VF _ Neg => n.s ! Bare ++ cop.s ! vf ; + _ => glue (n.s ! Bare) (cop.s ! vf) + } ; + past = \\p => glue (n.s ! Bare) (cop.past ! p) ; + pastAttr = \\p => glue (n.s ! Bare) (cop.pastAttr ! p) ; + futureAttr = \\p => glue (n.s ! Bare) (cop.futureAttr ! p) } ; -- : Adv -> Comp ; CompAdv adv = emptyComp ** { s = \\vf => adv.s ++ have_V.s ! vf ; + past = \\p => adv.s ++ have_V.past ! p ; + pastAttr = \\p => adv.s ++ have_V.pastAttr ! p ; + futureAttr = \\p => adv.s ++ have_V.futureAttr ! p } ; -- : VP -- Copula alone;