diff --git a/lib/resource-1.0/german/ParamGer.gf b/lib/resource-1.0/german/ParamGer.gf index 806bd68c4..dafaf2127 100644 --- a/lib/resource-1.0/german/ParamGer.gf +++ b/lib/resource-1.0/german/ParamGer.gf @@ -18,6 +18,15 @@ resource ParamGer = ParamX ** { Adjf = Strong | Weak ; +-- Gender distinctions are only made in the singular. + + GenNum = GSg Gender | GPl ; + +-- The predicative form of adjectives is not inflected further. + + AForm = APred | AMod Adjf GenNum Case ; + + ---- Agreement of $NP$ is a record. We'll add $Gender$ later. -- -- oper @@ -26,8 +35,19 @@ resource ParamGer = ParamX ** { -- param -- Gender = Neutr | Masc | Fem ; -- -----2 For $Verb$ --- +--2 For $Verb$ + + VForm = + VInf + | VPresInd Number Person + | VPresSubj Number Person + | VImper Number + | VImpfInd Number Person + | VImpfSubj Number Person + | VPresPart AForm + | VPastPart AForm ; + + ---- Only these five forms are needed for open-lexicon verbs. -- -- param diff --git a/lib/resource-1.0/german/ResGer.gf b/lib/resource-1.0/german/ResGer.gf index f173ac1d2..a04cfcf9b 100644 --- a/lib/resource-1.0/german/ResGer.gf +++ b/lib/resource-1.0/german/ResGer.gf @@ -48,23 +48,133 @@ resource ResGer = ParamGer ** open Prelude in { -- we need just two or four forms. mkNoun4 : (x1,_,_,x4 : Str) -> Gender -> Noun = \wein,weines,weine,weinen -> - mkNoun wein wein wein weines weine weinen ; + mkNoun wein wein wein weines weine weinen ; mkNoun2 : (x1,x2 : Str) -> Gender -> Noun = \frau,frauen -> - mkNoun frau frau frau frau frauen frauen ; + mkNoun4 frau frau frauen frauen ; + +-- Adjectives need four forms: two for the positive and one for the other degrees. + + Adjective : Type = {s : Degree => AForm => Str} ; + + mkAdjective : (x1,_,_,x4 : Str) -> Adjective = \gut,gute,besser,best -> + {s = table { + Posit => adjForms gut gute ; + Compar => adjForms besser besser ; + Superl => adjForms best best + } + } ; + + regAdjective : Str -> Adjective = \blau -> + mkAdjective blau blau (blau + "er") (blau + "est") ; + +-- This auxiliary gives the forms in each degree. + + adjForms : (x1,x2 : Str) -> AForm => Str = \teuer,teur -> + table { + APred => teuer ; + AMod Strong (GSg Masc) c => + caselist (teur+"er") (teur+"en") (teur+"em") (teur+"es") ! c ; + AMod Strong (GSg Fem) c => + caselist (teur+"e") (teur+"e") (teur+"er") (teur+"er") ! c ; + AMod Strong (GSg Neut) c => + caselist (teur+"es") (teur+"es") (teur+"em") (teur+"es") ! c ; + AMod Strong GPl c => + caselist (teur+"e") (teur+"e") (teur+"en") (teur+"er") ! c ; + AMod Weak (GSg g) c => case of { + <_,Nom> => teur+"e" ; + => teur+"en" ; + <_,Acc> => teur+"e" ; + _ => teur+"en" } ; + AMod Weak GPl c => teur+"en" + } ; + + Verb : Type = {s : VForm => Str} ; + + mkVerb : (x1,_,_,_,_,x6 : Str) -> Verb = \geben,gibt,gib,gab,gaebe,gegeben -> + let + ifSibilant : Str -> Str -> Str -> Str = \u,b1,b2 -> + case u of { + "s" => b1 ; + "x" => b1 ; + "z" => b1 ; + "ß" => b1 ; + _ => b2 + } ; + en = Predef.dp 2 geben ; + geb = case Predef.tk 1 en of { + "e" => Predef.tk 2 geben ; + _ => Predef.tk 1 geben + } ; + gebt = geb + (adde geb) + "t" ; + gebte = ifTok Tok (Predef.dp 1 gab) "e" gab (gab + "e") ; + gibst = ifSibilant (Predef.dp 1 gib) (gib + "t") (gib + "st") ; + gegebener = (regAdjective gegeben).s ; + in {s = table { + VInf => geben ; + VInd Sg P1 => geb + "e" ; + VInd Sg P2 => gibst ; + VInd Sg P3 => gibt ; + VInd Pl P2 => gebt ; + VInd Pl _ => geben ; -- the famous law + VImp Sg => gib + (impe gib) ; + VImp Pl => gebt ; + VSubj Sg P1 => geb + "e" ; + VSubj Sg P2 => geb + "est" ; + VSubj Sg P3 => geb + "e" ; + VSubj Pl P2 => geb + "et" ; + VSubj Pl _ => geben ; + VPresPart a => (regAdjective (geben + "d")).s ! a ; + + VImpfInd Sg P1 => gab ; + VImpfInd Sg P2 => gab + (adde gab) + "st" ; + VImpfInd Sg P3 => gab ; + VImpfInd Pl P2 => gab + (adde gab) + "t" ; + VImpfInd Pl _ => gebte + "n" ; + + VImpfSubj Sg P1 => gaebe ; + VImpfSubj Sg P2 => gaebe + "st" ; + VImpfSubj Sg P3 => gaebe ; + VImpfSubj Pl P2 => gaebe + "t" ; + VImpfSubj Pl _ => gaebe + "n" ; + + VPart a => gegebener ! a + } + } ; + +-- Weak verbs: + regVerb : Str -> Verb = \legen -> + let + leg = Predef.tk 2 legen ; + legte = leg + "te" ; + in + mkVerb legen (leg+(adde leg)+"t") leg legte legte ("ge"+leg+"t") ; + + + adde : Str -> Str = \stem -> + let + eVowelorLiquid : Str -> Str = \u -> + case u of { + "l" | "r" | "a" | "o" | "u" | "e" | "i" | "ü" | "ä" | "ö" => "e" ; + _ => [] + } ; + + eConsonantmn : Str -> Str -> Str = \nl,l -> + case l of { + "m" | "n" => eVowelorLiquid nl ; + _ => [] + } ; + + nl = init (Predef.dp 2 stem) ; + l = last stem ; + e = case l of { + "d" | t => "e" ; + _ => eConsonantmn nl l + } ; + in + e ; --- --- mkAdjective : (_,_,_,_ : Str) -> {s : AForm => Str} = --- \good,better,best,well -> { --- s = table { --- AAdj Posit => good ; --- AAdj Compar => better ; --- AAdj Superl => best ; --- AAdv => well --- } --- } ; --- -- mkVerb : (_,_,_,_,_ : Str) -> {s : VForm => Str} = -- \go,goes,went,gone,going -> { -- s = table {