From 766852a64c9816f073100ff720cf7bafab39c043 Mon Sep 17 00:00:00 2001 From: aarne Date: Mon, 22 Sep 2008 12:24:28 +0000 Subject: [PATCH] adapted German to 1.5 --- next-lib/src/german/AdjectiveGer.gf | 40 ++ next-lib/src/german/AdverbGer.gf | 23 + next-lib/src/german/AllGer.gf | 7 + next-lib/src/german/AllGerAbs.gf | 7 + next-lib/src/german/CatGer.gf | 102 +++++ next-lib/src/german/ConjunctionGer.gf | 59 +++ next-lib/src/german/ExtGer.gf | 26 ++ next-lib/src/german/ExtraGer.gf | 34 ++ next-lib/src/german/ExtraGerAbs.gf | 11 + next-lib/src/german/GrammarGer.gf | 21 + next-lib/src/german/IdiomGer.gf | 46 ++ next-lib/src/german/IrregGer.gf | 228 ++++++++++ next-lib/src/german/IrregGerAbs.gf | 185 ++++++++ next-lib/src/german/LangGer.gf | 10 + next-lib/src/german/LexiconGer.gf | 366 +++++++++++++++ next-lib/src/german/MorphoGer.gf | 96 ++++ next-lib/src/german/NounGer.gf | 176 +++++++ next-lib/src/german/NumeralGer.gf | 86 ++++ next-lib/src/german/ParadigmsGer.gf | 507 +++++++++++++++++++++ next-lib/src/german/PhraseGer.gf | 26 ++ next-lib/src/german/QuestionGer.gf | 101 ++++ next-lib/src/german/RelativeGer.gf | 48 ++ next-lib/src/german/ResGer.gf | 633 ++++++++++++++++++++++++++ next-lib/src/german/SentenceGer.gf | 67 +++ next-lib/src/german/StructuralGer.gf | 133 ++++++ next-lib/src/german/VerbGer.gf | 82 ++++ 26 files changed, 3120 insertions(+) create mode 100644 next-lib/src/german/AdjectiveGer.gf create mode 100644 next-lib/src/german/AdverbGer.gf create mode 100644 next-lib/src/german/AllGer.gf create mode 100644 next-lib/src/german/AllGerAbs.gf create mode 100644 next-lib/src/german/CatGer.gf create mode 100644 next-lib/src/german/ConjunctionGer.gf create mode 100644 next-lib/src/german/ExtGer.gf create mode 100644 next-lib/src/german/ExtraGer.gf create mode 100644 next-lib/src/german/ExtraGerAbs.gf create mode 100644 next-lib/src/german/GrammarGer.gf create mode 100644 next-lib/src/german/IdiomGer.gf create mode 100644 next-lib/src/german/IrregGer.gf create mode 100644 next-lib/src/german/IrregGerAbs.gf create mode 100644 next-lib/src/german/LangGer.gf create mode 100644 next-lib/src/german/LexiconGer.gf create mode 100644 next-lib/src/german/MorphoGer.gf create mode 100644 next-lib/src/german/NounGer.gf create mode 100644 next-lib/src/german/NumeralGer.gf create mode 100644 next-lib/src/german/ParadigmsGer.gf create mode 100644 next-lib/src/german/PhraseGer.gf create mode 100644 next-lib/src/german/QuestionGer.gf create mode 100644 next-lib/src/german/RelativeGer.gf create mode 100644 next-lib/src/german/ResGer.gf create mode 100644 next-lib/src/german/SentenceGer.gf create mode 100644 next-lib/src/german/StructuralGer.gf create mode 100644 next-lib/src/german/VerbGer.gf diff --git a/next-lib/src/german/AdjectiveGer.gf b/next-lib/src/german/AdjectiveGer.gf new file mode 100644 index 000000000..6f174bb1e --- /dev/null +++ b/next-lib/src/german/AdjectiveGer.gf @@ -0,0 +1,40 @@ +concrete AdjectiveGer of Adjective = CatGer ** open ResGer, Prelude in { + + flags optimize=all_subs ; + + lin + + PositA a = { + s = a.s ! Posit ; + isPre = True + } ; + ComparA a np = { + s = \\af => a.s ! Compar ! af ++ conjThan ++ np.s ! Nom ; + isPre = True + } ; + +-- $SuperlA$ belongs to determiner syntax in $Noun$. + + ComplA2 a np = { + s = \\af => a.s ! Posit ! af ++ appPrep a.c2 np.s ; + isPre = True + } ; + + ReflA2 a = { + s = \\af => a.s ! Posit ! APred ++ appPrep a.c2 (reflPron ! agrP3 Sg) ; --- agr + isPre = True + } ; + + SentAP ap sc = { + s = \\a => ap.s ! a ++ sc.s ; + isPre = False + } ; + + AdAP ada ap = { + s = \\a => ada.s ++ ap.s ! a ; + isPre = ap.isPre + } ; + + UseA2 a = a ; + +} diff --git a/next-lib/src/german/AdverbGer.gf b/next-lib/src/german/AdverbGer.gf new file mode 100644 index 000000000..4bac57a98 --- /dev/null +++ b/next-lib/src/german/AdverbGer.gf @@ -0,0 +1,23 @@ +concrete AdverbGer of Adverb = CatGer ** open ResGer, Prelude in { + + lin + PositAdvAdj a = {s = a.s ! Posit ! APred} ; + + ComparAdvAdj cadv a np = { + s = cadv.s ++ a.s ! Posit ! APred ++ conjThan ++ np.s ! Nom + } ; + ComparAdvAdjS cadv a s = { + s = cadv.s ++ a.s ! Posit ! APred ++ conjThan ++ s.s ! Sub + } ; + + PrepNP prep np = {s = appPrep prep np.s} ; + + AdAdv = cc2 ; + + SubjS subj s = {s = subj.s ++ s.s ! Sub} ; + + AdnCAdv cadv = {s = cadv.s ++ conjThan} ; + +} + +---b AdvSC s = s ; diff --git a/next-lib/src/german/AllGer.gf b/next-lib/src/german/AllGer.gf new file mode 100644 index 000000000..7795174e4 --- /dev/null +++ b/next-lib/src/german/AllGer.gf @@ -0,0 +1,7 @@ +--# -path=.:../abstract:../common:prelude + +concrete AllGer of AllGerAbs = + LangGer, + IrregGer, + ExtraGer + ** {} ; diff --git a/next-lib/src/german/AllGerAbs.gf b/next-lib/src/german/AllGerAbs.gf new file mode 100644 index 000000000..85ef801a4 --- /dev/null +++ b/next-lib/src/german/AllGerAbs.gf @@ -0,0 +1,7 @@ +--# -path=.:../abstract:../common:prelude + +abstract AllGerAbs = + Lang, + IrregGerAbs, + ExtraGerAbs + ** {} ; diff --git a/next-lib/src/german/CatGer.gf b/next-lib/src/german/CatGer.gf new file mode 100644 index 000000000..17a8fe12e --- /dev/null +++ b/next-lib/src/german/CatGer.gf @@ -0,0 +1,102 @@ +concrete CatGer of Cat = + CommonX - [Tense,TPres,TPast,TFut,TCond,TTAnt,Temp] ** + open ResGer, Prelude in { + + flags optimize=all_subs ; + + lincat + +-- Tensed/Untensed + + S = {s : Order => Str} ; + QS = {s : QForm => Str} ; + RS = {s : GenNum => Str ; c : Case} ; + SSlash = {s : Order => Str} ** {c2 : Preposition} ; + +-- Sentence + + Cl = {s : Mood => ResGer.Tense => Anteriority => Polarity => Order => Str} ; + ClSlash = { + s : Mood => ResGer.Tense => Anteriority => Polarity => Order => Str ; + c2 : Preposition + } ; + Imp = {s : Polarity => ImpForm => Str} ; + +-- Question + + QCl = {s : Mood => ResGer.Tense => Anteriority => Polarity => QForm => Str} ; + IP = {s : Case => Str ; n : Number} ; + IComp = {s : Agr => Str} ; + IDet = {s : Gender => Case => Str ; n : Number} ; + IQuant = {s : Number => Gender => Case => Str} ; + +-- Relative + + RCl = {s : Mood => ResGer.Tense => Anteriority => Polarity => GenNum => Str ; c : Case} ; + RP = {s : GenNum => Case => Str ; a : RAgr} ; + +-- Verb + + VP = ResGer.VP ; + VPSlash = ResGer.VP ** {c2 : Preposition} ; + Comp = {s : Agr => Str} ; + +-- Adjective + + AP = {s : AForm => Str ; isPre : Bool} ; + +-- Noun + + CN = {s : Adjf => Number => Case => Str ; g : Gender} ; + NP = {s : Case => Str ; a : Agr} ; + Pron = {s : NPForm => Str ; a : Agr} ; + Det = {s,sp : Gender => Case => Str ; n : Number ; a : Adjf} ; + Quant = { + s : Bool => Number => Gender => Case => Str ; + sp : Number => Gender => Case => Str ; + a : Adjf + } ; + Art = {s : Bool => Number => Gender => Case => Str ; a : Adjf} ; + Predet = {s : Number => Gender => Case => Str} ; + Num = {s : Gender => Case => Str ; n : Number ; isNum : Bool} ; + Card = {s : Gender => Case => Str ; n : Number} ; + Ord = {s : AForm => Str} ; + +-- Numeral + + Numeral = {s : CardOrd => Str ; n : Number } ; + Digits = {s : CardOrd => Str ; n : Number } ; + +-- Structural + + Conj = {s1,s2 : Str ; n : Number} ; + Subj = {s : Str} ; + Prep = {s : Str ; c : Case} ; + +-- Open lexical classes, e.g. Lexicon + + V, VS, VQ, VA = ResGer.Verb ; -- = {s : VForm => Str} ; + VV = Verb ** {isAux : Bool} ; + V2, V2A, V2S, V2Q = Verb ** {c2 : Preposition} ; + V2V = Verb ** {c2 : Preposition ; isAux : Bool} ; + V3 = Verb ** {c2, c3 : Preposition} ; + + A = {s : Degree => AForm => Str} ; + A2 = {s : Degree => AForm => Str ; c2 : Preposition} ; + + N = {s : Number => Case => Str ; g : Gender} ; + N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Preposition} ; + N3 = {s : Number => Case => Str ; g : Gender} ** {c2,c3 : Preposition} ; + PN = {s : Case => Str} ; + +-- tense with possibility to choose conjunctive forms + + Temp = {s : Str ; t : ResGer.Tense ; a : Anteriority ; m : Mood} ; + Tense = {s : Str ; t : ResGer.Tense ; m : Mood} ; + + lin + TPres = {s = [] ; t = Pres ; m = MIndic} ; + TPast = {s = [] ; t = Past ; m = MIndic} ; --# notpresent + TFut = {s = [] ; t = Fut ; m = MIndic} ; --# notpresent + TCond = {s = [] ; t = Cond ; m = MIndic} ; --# notpresent +} diff --git a/next-lib/src/german/ConjunctionGer.gf b/next-lib/src/german/ConjunctionGer.gf new file mode 100644 index 000000000..d46a32839 --- /dev/null +++ b/next-lib/src/german/ConjunctionGer.gf @@ -0,0 +1,59 @@ +concrete ConjunctionGer of Conjunction = + CatGer ** open ResGer, Coordination, Prelude in { + + flags optimize=all_subs ; + + lin + + ConjS conj ss = conjunctDistrTable Order conj ss ; + + ConjAdv conj ss = conjunctDistrSS conj ss ; + + ConjNP conj ss = conjunctDistrTable Case conj ss ** { + a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} + } ; + + ConjAP conj ss = conjunctDistrTable AForm conj ss ** { + isPre = ss.isPre + } ; + +{- ---b + ConjS conj ss = conjunctTable Order conj ss ; + DConjS conj ss = conjunctDistrTable Order conj ss ; + + ConjAdv conj ss = conjunctSS conj ss ; + DConjAdv conj ss = conjunctDistrSS conj ss ; + + ConjNP conj ss = conjunctTable Case conj ss ** { + a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} + } ; + DConjNP conj ss = conjunctDistrTable Case conj ss ** { + a = {g = Fem ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} + } ; + + ConjAP conj ss = conjunctTable AForm conj ss ** { + isPre = ss.isPre + } ; + DConjAP conj ss = conjunctDistrTable AForm conj ss ** { + isPre = ss.isPre + } ; +-} + +-- These fun's are generated from the list cat's. + + BaseS = twoTable Order ; + ConsS = consrTable Order comma ; + 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} ; + BaseAP x y = twoTable AForm x y ** {isPre = andB x.isPre y.isPre} ; + ConsAP xs x = consrTable AForm comma xs x ** {isPre = andB xs.isPre x.isPre} ; + + lincat + [S] = {s1,s2 : Order => Str} ; + [Adv] = {s1,s2 : Str} ; + [NP] = {s1,s2 : Case => Str ; a : Agr} ; + [AP] = {s1,s2 : AForm => Str ; isPre : Bool} ; + +} diff --git a/next-lib/src/german/ExtGer.gf b/next-lib/src/german/ExtGer.gf new file mode 100644 index 000000000..b87b483e6 --- /dev/null +++ b/next-lib/src/german/ExtGer.gf @@ -0,0 +1,26 @@ +--concrete ExtGer of ExtGerAbs = CatGer ** open ResGer in { +-- +-- lincat +-- +-- Aux = {s : Polarity => Str} ; +-- +-- lin +-- +-- PredAux np aux vp = mkClause (np.s ! Nom) np.a { +-- s = \\t,ant,b,ord,agr => +-- let +-- fin = aux.s ! b ; +-- vf : Str -> Str -> {fin, inf : Str} = \x,y -> +-- {fin = x ; inf = y} ; +-- in +-- case ant of { +-- Simul => vf fin [] ; +-- Anter => vf fin "have" +-- } ; +-- s2 = \\agr => infVP vp agr +-- } ; +-- +-- can_Aux = {s = \\p => posneg p "can"} ; ---- cannt +-- must_Aux = {s = \\p => posneg p "must"} ; +-- +--} diff --git a/next-lib/src/german/ExtraGer.gf b/next-lib/src/german/ExtraGer.gf new file mode 100644 index 000000000..518fe1713 --- /dev/null +++ b/next-lib/src/german/ExtraGer.gf @@ -0,0 +1,34 @@ +concrete ExtraGer of ExtraGerAbs = CatGer ** + open ResGer, Coordination, Prelude, IrregGer in { + + lincat + VPI = {s : Bool => Str} ; + [VPI] = {s1,s2 : Bool => Str} ; + lin + BaseVPI = twoTable Bool ; + ConsVPI = consrTable Bool comma ; + + MkVPI vp = {s = \\b => useInfVP b vp} ; + ConjVPI = conjunctDistrTable Bool ; + + ComplVPIVV v vpi = + insertInf (vpi.s ! v.isAux) ( + predVGen v.isAux v) ; ---- +{- + insertExtrapos vpi.p3 ( + insertInf vpi.p2 ( + insertObj vpi.p1 ( + predVGen v.isAux v))) ; +-} + + PPzuAdv cn = {s = case cn.g of { + Masc | Neutr => "zum" ; + Fem => "zur" + } ++ cn.s ! adjfCase Weak Dat ! Sg ! Dat + } ; + + TImpfSubj = {s = [] ; t = Past ; m = MConjunct} ; --# notpresent + + moegen_VV = auxVV mögen_V ; + +} diff --git a/next-lib/src/german/ExtraGerAbs.gf b/next-lib/src/german/ExtraGerAbs.gf new file mode 100644 index 000000000..886b666c3 --- /dev/null +++ b/next-lib/src/german/ExtraGerAbs.gf @@ -0,0 +1,11 @@ +abstract ExtraGerAbs = Extra [ + VPI,ListVPI,BaseVPI,ConsVPI,MkVPI,ComplVPIVV,ConjVPI, + VV,VP,Conj] ** { + + fun + PPzuAdv : CN -> Adv ; -- zum Lied, zur Flasche + TImpfSubj : Tense ; -- ich möchte... --# notpresent + + moegen_VV : VV ; -- ich mag/möchte singen + +} diff --git a/next-lib/src/german/GrammarGer.gf b/next-lib/src/german/GrammarGer.gf new file mode 100644 index 000000000..2df4bf203 --- /dev/null +++ b/next-lib/src/german/GrammarGer.gf @@ -0,0 +1,21 @@ +--# -path=.:../abstract:../common:prelude + +concrete GrammarGer of Grammar = + NounGer, + VerbGer, + AdjectiveGer, + AdverbGer, + NumeralGer, + SentenceGer, + QuestionGer, + RelativeGer, + ConjunctionGer, + PhraseGer, + TextX - [Tense,TPres,TPast,TFut,TCond,TTAnt,Temp], + IdiomGer, + StructuralGer + ** { + +flags startcat = Phr ; unlexer = text ; lexer = text ; + +} ; diff --git a/next-lib/src/german/IdiomGer.gf b/next-lib/src/german/IdiomGer.gf new file mode 100644 index 000000000..4392a38b5 --- /dev/null +++ b/next-lib/src/german/IdiomGer.gf @@ -0,0 +1,46 @@ +concrete IdiomGer of Idiom = CatGer ** + open MorphoGer, ParadigmsGer, Prelude in { + + flags optimize=all_subs ; + + lin + ImpersCl vp = mkClause "es" (agrP3 Sg) vp ; + GenericCl vp = mkClause "man" (agrP3 Sg) vp ; + + CleftNP np rs = mkClause "es" (agrP3 Sg) + (insertExtrapos (rs.s ! gennum np.a.g np.a.n) ---- + (insertObj (\\_ => np.s ! rs.c) (predV MorphoGer.sein_V))) ; + + CleftAdv ad s = mkClause "es" (agrP3 Sg) + (insertExtrapos (conjThat ++ s.s ! Sub) + (insertObj (\\_ => ad.s) (predV MorphoGer.sein_V))) ; + + + ExistNP np = + mkClause "es" (agrP3 Sg) + (insertObj (\\_ => appPrep geben.c2 np.s) + (predV geben)) ; + + ExistIP ip = { + s = \\m,t,a,p => + let + cls = + (mkClause "es" (agrP3 Sg) (predV geben)).s ! m ! t ! a ! p ; + who = ip.s ! Acc + in table { + QDir => who ++ cls ! Inv ; + QIndir => who ++ cls ! Sub + } + } ; + + ProgrVP = insertAdv "eben" ; ---- + + ImpPl1 vp = {s = + (mkClause "wir" {g = Fem ; n = Pl ; p = P1} vp).s ! + MConjunct ! Pres ! Simul ! Pos ! Inv + } ; + + oper + geben = dirV2 (mk6V "geben" "gibt" "gib" "gab" "gäbe" "gegeben") ; +} + diff --git a/next-lib/src/german/IrregGer.gf b/next-lib/src/german/IrregGer.gf new file mode 100644 index 000000000..35f85aafb --- /dev/null +++ b/next-lib/src/german/IrregGer.gf @@ -0,0 +1,228 @@ +--# -path=.:prelude:../abstract:../common + +-- adapted from verb list in +-- http://www.iee.et.tu-dresden.de/~wernerr/grammar/verben_dt.html + +concrete IrregGer of IrregGerAbs = CatGer ** open + ParadigmsGer, + (M = MorphoGer) +in { + + flags optimize=values ; + + lin backen_V = irregV "backen" "bäckt" (variants {"backt" ; "buk"}) (variants {"backt" ; "buke"}) "gebacken" ; + lin befehlen_V = irregV "befehlen" "befiehlt" "befahl" "beföhle" "befähle)" ; + lin beginnen_V = irregV "beginnen" "beginnt" "begann" "begönne" "begänne)" ; + lin beißen_V = irregV "beißen" "beißt" "biß" "biße" "gebissen" ; + lin bergen_V = irregV "bergen" "birgt" "barg" "bärge" "geborgen" ; + lin bersten_V = irregV "bersten" "birst" "barst" "bärste" "geborsten" ; + lin bewegen_V = irregV "bewegen" "bewegt" "bewog" "bewöge" "bewogen" ; + lin biegen_V = irregV "biegen" "biegt" "bog" "böge" "gebogen" ; + lin bieten_V = irregV "bieten" "bietet" "bot" "böte" "geboten" ; + lin binden_V = irregV "binden" "bindt" "band" "bände" "gebunden" ; + lin bitten_V = irregV "bitten" "bittet" "bat" "bäte" "gebeten" ; + lin blasen_V = irregV "blasen" "bläst" "blies" "bliese" "geblasen" ; + lin bleiben_V = irregV "bleiben" "bleibt" "blieb" "bliebe" "geblieben" ; + lin braten_V = irregV "braten" "brät" "briet" "briete" "gebraten" ; + lin brechen_V = irregV "brechen" "bricht" "brach" "bräche" "gebrochen" ; + lin brennen_V = irregV "brennen" "brennt" "brannte" "brennte" "gebrannt" ; + lin bringen_V = irregV "bringen" "bringt" "brachte" "brachte" "gebracht" ; + lin denken_V = irregV "denken" "denkt" "dachte" "dachte" "gedacht" ; + lin dingen_V = irregV "dingen" "dingt" "dingte" "dang" "gedungen" ; + lin dreschen_V = irregV "dreschen" "drischt" "drosch" "drösche" "gedroschen" ; + lin dringen_V = irregV "dringen" "dringt" "drang" "dränge" "gedrungen" ; + lin dürfen_V = M.mkV + "dürfen" "darf" "darfst" "darf" "dürft" "dürf" + "durfte" "durftest" "durften" "durftet" + "dürfte" "gedurft" [] + M.VHaben ** {lock_V = <>} ; + lin empfehlen_V = irregV "empfehlen" "empfiehlt" "empfahl" + (variants {"empföhle" ; "empfähle"}) "empfohlen" ; + lin erlöschen_V = irregV "erlöschen" "erlischt" "erlosch" "erlösche" "erloschen" ; + lin erkennen_V = irregV "erkennen" "erkennt" "erkannte" "erkannte" "erkannt" ; + lin erschrecken_V = irregV "erschrecken" "erschrickt" "erschrak" "erschräke" "erschrocken" ; + lin essen_V = irregV "essen" "ißt" "aß" "äße" "gegessen" ; + lin fahren_V = irregV "fahren" "fährt" "fuhr" "führe" "gefahren" ; + lin fallen_V = irregV "fallen" "fällt" "fiel" "fiele" "gefallen" ; + lin fangen_V = irregV "fangen" "fängt" "fing" "finge" "gefangen" ; + lin fechten_V = irregV "fechten" "fechtet" "focht" "föchte" "gefochten" ; + lin finden_V = irregV "finden" "findt" "fand" "fände" "gefunden" ; + lin flechten_V = irregV "flechten" "flicht" "flocht" "flöchte" "geflochten" ; + lin fliegen_V = irregV "fliegen" "fliegt" "flog" "flöge" "geflogen" ; + lin fliehen_V = irregV "fliehen" "flieht" "floh" "flöhe" "geflohen" ; + lin fließen_V = irregV "fließen" "fließt" "floß" "flösse" "geflossen" ; + lin fressen_V = irregV "fressen" "frißt" "fraß" "fräße" "gefressen" ; + lin frieren_V = irregV "frieren" "friert" "fror" "fröre" "gefroren" ; + lin gären_V = irregV "gären" "gärt" (variants {"gor" ; "gärte"}) "göre" "gegoren" ; + lin gebären_V = irregV "gebären" "gebiert" "gebar" "gebäre" "geboren" ; + lin geben_V = irregV "geben" "gibt" "gab" "gäbe" "gegeben" ; + lin gedeihen_V = irregV "gedeihen" "gedeiht" "gedieh" "gediehe" "gediehen" ; + lin gehen_V = irregV "gehen" "geht" "ging" "ginge" "gegangen" ; + lin gelingen_V = irregV "gelingen" "gelingt" "gelang" "gelange" "gelungen" ; + lin gelten_V = irregV "gelten" "gilt" "galt" (variants {"galte" ; "golte"}) "gegolten" ; + lin genesen_V = irregV "genesen" "genest" "genas" "genäse" "genesen" ; + lin genießen_V = irregV "genießen" "genießt" "genoß" "genösse" "genossen" ; + lin geschehen_V = irregV "geschehen" "geschieht" "geschah" "geschehen" "geschähe" ; + lin gewinnen_V = irregV "gewinnen" "gewinnt" "gewann" (variants {"gewönne" ; "gewänne"}) "gewonnen" ; + lin gießen_V = irregV "gießen" "gießt" "goß" "gösse" "gegossen" ; + lin gleichen_V = irregV "gleichen" "gleicht" "glich" "gliche" "geglichen" ; + lin gleiten_V = irregV "gleiten" "gleitet" "glitt" "glitte" "geglitten" ; + lin glimmen_V = irregV "glimmen" "glimmt" "glomm" "glimmte" "glömme" ; + lin graben_V = irregV "graben" "gräbt" "grub" "grübe" "gegraben" ; + lin greifen_V = irregV "greifen" "greift" "griff" "griffe" "gegriffen" ; + lin haben_V = irregV "haben" "hat" "hatte" "hatte" "gehabt" ; + lin halten_V = irregV "halten" "hält" "hielt" "hielte" "gehalten" ; + lin hängen_V = irregV "hängen" "hängt" "hing" "hinge" "gehangen" ; + lin hauen_V = irregV "hauen" "haut" (variants {"haute" ; "hieb"}) (variants {"haute" ; "hiebe"}) "gehauen" ; + lin heben_V = irregV "heben" "hebt" "hob" "höbe" "gehoben" ; + lin heißen_V = irregV "heißen" "heißt" "hieß" "hieße" "geheißen" ; + lin helfen_V = irregV "helfen" "hilft" "half" "hülfe" "geholfen" ; + lin kennen_V = irregV "kennen" "kennt" "kannte" "kennte" "gekannt" ; + lin klimmen_V = irregV "klimmen" "klimmt" "klomm" "klömme" "geklommen" ; + lin klingen_V = irregV "klingen" "klingt" "klang" "klänge" "geklungen" ; + lin kneifen_V = irregV "kneifen" "kneift" "kniff" "kniffe" "gekniffen" ; + lin kommen_V = irregV "kommen" "kommt" "kam" "käme" "gekommen" ; + lin können_V = M.mkV + "können" "kann" "kannst" "kann" "könnt" "könn" + "konnte" "konntest" "konnten" "konntet" + "könnte" "gekonnt" [] + M.VHaben ** {lock_V = <>} ; + lin kriechen_V = irregV "kriechen" "kriecht" "kroch" "kröche" "gekrochen" ; + lin küren_V = irregV "küren" "kürt" "kürte" "kor" "gekürt" ; + lin laden_V = irregV "laden" "lädt" "lud" "lüde" "geladen" ; + lin lassen_V = irregV "lassen" "läßt" "ließ" "ließe" "gelassen" ; + lin laufen_V = irregV "laufen" "läuft" "lief" "liefe" "gelaufen" ; + lin leiden_V = irregV "leiden" "leidt" "litt" "litte" "gelitten" ; + lin leihen_V = irregV "leihen" "leiht" "lieh" "liehe" "geliehen" ; + lin lesen_V = irregV "lesen" "liest" "las" "läse" "gelesen" ; + lin liegen_V = irregV "liegen" "liegt" "lag" "läge" "gelegen" ; + lin lügen_V = irregV "lügen" "lügt" "log" "löge" "gelogen" ; + lin mahlen_V = irregV "mahlen" "mahlt" "mahlte" "mahlte" "gemahlen" ; + lin meiden_V = irregV "meiden" "meidt" "mied" "miede" "gemieden" ; + lin melken_V = irregV "melken" (variants {"melkt" ; "milkt"}) (variants {"melkte" ; "molk"}) "gemolken" "gemelkt" ; + lin messen_V = irregV "messen" "mißt" "maß" "mäße" "gemessen" ; + lin mißlingen_V = irregV "mißlingen" "mißlingt" "mißlang" "mißlungen" "mißlänge" ; + lin mögen_V = M.mkV + "mögen" "mag" "magst" "mag" "mögt" "mög" + "mochte" "mochtest" "mochten" "mochtet" + "möchte" "gemocht" [] + M.VHaben ** {lock_V = <>} ; + lin müssen_V = M.mkV + "müssen" "muß" "mußt" "muß" "müßt" "müß" + "mußte" "mußtest" "mußten" "mußtet" + "müßte" "gemußt" [] + M.VHaben ** {lock_V = <>} ; + lin nehmen_V = mk6V "nehmen" "nimmt" "nimm" "nahm" "nähme" "genommen" ; + lin nennen_V = irregV "nennen" "nennt" "nannte" "nennte" "genannt" ; + lin pfeifen_V = irregV "pfeifen" "pfeift" "pfiff" "pfiffe" "gepfiffen" ; + lin preisen_V = irregV "preisen" "preist" "pries" "priese" "gepriesen" ; + lin quellen_V = irregV "quellen" "quillt" "quoll" "quölle" "gequollen" ; + lin raten_V = irregV "raten" "rät" "riet" "riete" "geraten" ; + lin reiben_V = irregV "reiben" "reibt" "rieb" "riebe" "gerieben" ; + lin reißen_V = irregV "reißen" "reißt" "riß" "riße" "gerissen" ; + lin reiten_V = irregV "reiten" "reitet" "ritt" "ritte" "geritten" ; + lin rennen_V = irregV "rennen" "rennt" "rannte" "rennte" "gerannt" ; + lin riechen_V = irregV "riechen" "riecht" "roch" "röche" "gerochen" ; + lin ringen_V = irregV "ringen" "ringt" "rang" "ränge" "gerungen" ; + lin rinnen_V = irregV "rinnen" "rinnt" "rann" "ränne" "geronnen" ; + lin rufen_V = irregV "rufen" "ruft" "rief" "riefe" "gerufen" ; + lin salzen_V = irregV "salzen" "salzt" "salzte" "salzte" "gesalzen" ; + lin saufen_V = irregV "saufen" "säuft" "soff" "söffe" "gesoffen" ; + lin saugen_V = irregV "saugen" "saugt" (variants {"saugte" ; "sog"}) (variants {"saugte" ; "soge"}) (variants {"gesaugt" ; "gesogen"}) ; + lin schaffen_V = irregV "schaffen" "schafft" "schuf" "schüfe" "geschaffen" ; + lin scheiden_V = irregV "scheiden" "scheidt" "schied" "schiede" "geschieden" ; + lin scheinen_V = irregV "scheinen" "scheint" "schien" "schiene" "geschienen" ; + lin scheißen_V = irregV "scheißen" "scheißt" "schiß" "schiße" "geschissen" ; + lin schelten_V = irregV "schelten" "schilt" "schalt" "schölte" "gescholten" ; + lin scheren_V = irregV "scheren" "schert" "schor" "schöre" "geschoren" ; + lin schieben_V = irregV "schieben" "schiebt" "schob" "schöbe" "geschoben" ; + lin schießen_V = irregV "schießen" "schießt" "schoß" "schösse" "geschossen" ; + lin schinden_V = irregV "schinden" "schindt" "schund" "schunde" "geschunden" ; + lin schlafen_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ; + lin schlagen_V = irregV "schlagen" "schlägt" "schlug" "schlüge" "geschlagen" ; + lin schleichen_V = irregV "schleichen" "schleicht" "schlich" "schliche" "geschlichen" ; + lin schleifen_V = irregV "schleifen" "schleift" "schliff" "schliffe" "geschliffen" ; + lin schleißen_V = irregV "schleißen" "schleißt" (variants {"schliß" ; "schleißte"}) (variants {"schliß" ; "schleißte"}) (variants {"geschlissen" ; "geschleißt"}) ; + lin schließen_V = irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen" ; + lin schlingen_V = irregV "schlingen" "schlingt" "schlang" "schlünge" "geschlungen" ; + lin schmeißen_V = irregV "schmeißen" "schmeißt" "schmiß" "schmiße" "geschmissen" ; + lin schmelzen_V = irregV "schmelzen" "schmilzt" "schmolz" "schmölze" "geschmolzen" ; + lin schneiden_V = irregV "schneiden" "schneidt" "schnitt" "schnitte" "geschnitten" ; + lin schreiben_V = irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben" ; + lin schreien_V = irregV "schreien" "schreit" "schrie" "schrie" "geschrien" ; + lin schreiten_V = irregV "schreiten" "schreitet" "schritt" "schritte" "geschritten" ; + lin schweigen_V = irregV "schweigen" "schweigt" "schwieg" "schwiege" "geschwiegen" ; + lin schwellen_V = irregV "schwellen" "schwillt" "schwoll" "schwölle" "geschwollen" ; + lin schwimmen_V = irregV "schwimmen" "schwimmt" "schwamm" (variants {"schwömme" ; "schwämme"}) "geschwommen" ; + lin schwinden_V = irregV "schwinden" "schwindt" "schwand" "schwände" "geschwunden" ; + lin schwingen_V = irregV "schwingen" "schwingt" "schwang" "schwänge" "geschwungen" ; + lin schwören_V = irregV "schwören" "schwört" "schwor" "schwüre" "geschworen" ; + lin sehen_V = irregV "sehen" "sieht" "sah" "sähe" "gesehen" ; + lin sein_V = irregV "sein" "ist" "war" "wäre" "gewesen" ; + lin senden_V = irregV "senden" "sendt" (variants {"sandte" ; "sendete"}) (variants {"sandte" ; "sendete"}) (variants {"gesandt" ; "gesendet"}) ; + lin sieden_V = irregV "sieden" "siedt" (variants {"siedete" ; "sott"}) (variants {"siedete" ; "sotte"}) (variants {"gesotten" ; "gesiedet"}) ; + lin singen_V = irregV "singen" "singt" "sang" "sänge" "gesungen" ; + lin sinken_V = irregV "sinken" "sinkt" "sank" "sänke" "gesunken" ; + lin sinnen_V = irregV "sinnen" "sinnt" "sann" "sänne" "gesonnen" ; + lin sitzen_V = irregV "sitzen" "sitzt" "saß" "säße" "gesessen" ; + lin sollen_V = M.mkV + "sollen" "soll" "sollst" "soll" "sollt" "soll" + "sollte" "solltest" "sollten" "solltet" + "sollte" "gesollt" [] + M.VHaben ** {lock_V = <>} ; + + lin speien_V = irregV "speien" "speit" "spie" "spie" "gespien" ; + lin spinnen_V = irregV "spinnen" "spinnt" "spann" (variants {"spönne" ; "spänne"}) "gesponnen" ; + lin spleißen_V = irregV "spleißen" "spleißt" "spliß" "spliße" "gesplissen" ; + lin sprechen_V = irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen" ; + lin sprießen_V = irregV "sprießen" "sprießt" "sproß" "sprösse" "gesprossen" ; + lin springen_V = irregV "springen" "springt" "sprang" "spränge" "gesprungen" ; + lin stechen_V = irregV "stechen" "sticht" "stach" "stäche" "gestochen" ; + lin stehen_V = irregV "stehen" "steht" "stand" (variants {"stünde" ; "stände"}) "gestanden" ; + lin stehlen_V = irregV "stehlen" "stiehlt" "stahl" "stähle" "gestohlen" ; + lin steigen_V = irregV "steigen" "steigt" "stieg" "stiege" "gestiegen" ; + lin sterben_V = irregV "sterben" "stirbt" "starb" "stürbe" "gestorben" ; + lin stieben_V = irregV "stieben" "stiebt" "stob" "stöbe" "gestoben" ; + lin stinken_V = irregV "stinken" "stinkt" "stank" "stänke" "gestunken" ; + lin stoßen_V = irregV "stoßen" "stößt" "stieß" "stieße" "gestoßen" ; + lin streichen_V = irregV "streichen" "streicht" "strich" "striche" "gestrichen" ; + lin streiten_V = irregV "streiten" "streitet" "stritt" "stritte" "gestritten" ; + lin tragen_V = irregV "tragen" "trägt" "trug" "trüge" "getragen" ; + lin treffen_V = irregV "treffen" "trifft" "traf" "träfe" "getroffen" ; + lin treiben_V = irregV "treiben" "treibt" "trieb" "triebe" "getrieben" ; + lin treten_V = irregV "treten" "tritt" "trat" "träte" "getreten" ; + lin trinken_V = irregV "trinken" "trinkt" "trank" "tränke" "getrunken" ; + lin trügen_V = irregV "trügen" "trügt" "trog" "tröge" "getrogen" ; + lin tun_V = irregV "tun" "tut" "tat" "täte" "getan" ; + lin verderben_V = irregV "verderben" "verdirbt" "verdarb" "verdarbe" "verdorben" ; + lin verlieren_V = irregV "verlieren" "verliert" "verlor" "verlöre" "verloren" ; + lin wachsen_V = irregV "wachsen" "wächst" "wuchs" "wüchse" "gewachsen" ; + lin wägen_V = irregV "wägen" "wägt" "wog" "woge" "gewogen" ; + lin waschen_V = irregV "waschen" "wäscht" "wusch" "wüsche" "gewaschen" ; + lin weben_V = irregV "weben" "webt" (variants {"wob" ; "webte"}) "wöbe" (variants {"gewoben" ; "gewebt"}) ; + lin weichen_V = irregV "weichen" "weicht" "wich" "wiche" "gewichen" ; + lin weisen_V = irregV "weisen" "weist" "wies" "wiese" "gewiesen" ; + lin wenden_V = irregV "wenden" "wendt" (variants {"wandte" ; "wendete"}) (variants {"wandte" ; "wendete"}) (variants {"gewandt" ; "gewendet"}) ; + lin werben_V = irregV "werben" "wirbt" "warb" "würbe" "geworben" ; + lin werden_V = M.mkV + "werden" "werde" "wirst" "wird" "werdet" "werd" + "wurde" "wurdest" "wurden" "wurdet" + "würde" "geworden" [] + M.VHaben ** {lock_V = <>} ; + lin werfen_V = irregV "werfen" "wirft" "warf" "würfe" "geworfen" ; + lin wiegen_V = irregV "wiegen" "wiegt" "wog" "wöge" "gewogen" ; + lin winden_V = irregV "winden" "windt" "wand" "wände" "gewunden" ; + lin wissen_V = irregV "wissen" "weiß" "wußte" "wüßte" "gewußt" ; + lin wollen_V = M.mkV + "wollen" "will" "willst" "will" "wollt" "woll" + "wollte" "wolltest" "wollten" "wolltet" + "wollte" "gewollt" [] + M.VHaben ** {lock_V = <>} ; + + + lin wringen_V = irregV "wringen" "wringt" "wrang" "wränge" "gewrungen" ; + lin zeihen_V = irregV "zeihen" "zeiht" "zieh" "ziehe" "geziehen" ; + lin ziehen_V = irregV "ziehen" "zieht" "zog" "zöge" "gezogen" ; + lin zwingen_V = irregV "zwingen" "zwingt" "zwang" "zwänge" "gezwungen" ; + +} diff --git a/next-lib/src/german/IrregGerAbs.gf b/next-lib/src/german/IrregGerAbs.gf new file mode 100644 index 000000000..0d68f94ed --- /dev/null +++ b/next-lib/src/german/IrregGerAbs.gf @@ -0,0 +1,185 @@ +abstract IrregGerAbs = Cat ** { + + fun backen_V : V ; + fun befehlen_V : V ; + fun beginnen_V : V ; + fun beißen_V : V ; + fun bergen_V : V ; + fun bersten_V : V ; + fun bewegen_V : V ; + fun biegen_V : V ; + fun bieten_V : V ; + fun binden_V : V ; + fun bitten_V : V ; + fun blasen_V : V ; + fun bleiben_V : V ; + fun braten_V : V ; + fun brechen_V : V ; + fun brennen_V : V ; + fun bringen_V : V ; + fun denken_V : V ; + fun dingen_V : V ; + fun dreschen_V : V ; + fun dringen_V : V ; + fun dürfen_V : V ; + fun empfehlen_V : V ; + fun erlöschen_V : V ; + fun erkennen_V : V ; + fun erschrecken_V : V ; + fun essen_V : V ; + fun fahren_V : V ; + fun fallen_V : V ; + fun fangen_V : V ; + fun fechten_V : V ; + fun finden_V : V ; + fun flechten_V : V ; + fun fliegen_V : V ; + fun fliehen_V : V ; + fun fließen_V : V ; + fun fressen_V : V ; + fun frieren_V : V ; + fun gären_V : V ; + fun gebären_V : V ; + fun geben_V : V ; + fun gedeihen_V : V ; + fun gehen_V : V ; + fun gelingen_V : V ; + fun gelten_V : V ; + fun genesen_V : V ; + fun genießen_V : V ; + fun geschehen_V : V ; + fun gewinnen_V : V ; + fun gießen_V : V ; + fun gleichen_V : V ; + fun gleiten_V : V ; + fun glimmen_V : V ; + fun graben_V : V ; + fun greifen_V : V ; + fun haben_V : V ; + fun halten_V : V ; + fun hängen_V : V ; + fun hauen_V : V ; + fun heben_V : V ; + fun heißen_V : V ; + fun helfen_V : V ; + fun kennen_V : V ; + fun klimmen_V : V ; + fun klingen_V : V ; + fun kneifen_V : V ; + fun kommen_V : V ; + fun können_V : V ; + fun kriechen_V : V ; + fun küren_V : V ; + fun laden_V : V ; + fun lassen_V : V ; + fun laufen_V : V ; + fun leiden_V : V ; + fun leihen_V : V ; + fun lesen_V : V ; + fun liegen_V : V ; + fun lügen_V : V ; + fun mahlen_V : V ; + fun meiden_V : V ; + fun melken_V : V ; + fun messen_V : V ; + fun mißlingen_V : V ; + fun mögen_V : V ; + fun müssen_V : V ; + fun nehmen_V : V ; + fun nennen_V : V ; + fun pfeifen_V : V ; + fun preisen_V : V ; + fun quellen_V : V ; + fun raten_V : V ; + fun reiben_V : V ; + fun reißen_V : V ; + fun reiten_V : V ; + fun rennen_V : V ; + fun riechen_V : V ; + fun ringen_V : V ; + fun rinnen_V : V ; + fun rufen_V : V ; + fun salzen_V : V ; + fun saufen_V : V ; + fun saugen_V : V ; + fun schaffen_V : V ; + fun scheiden_V : V ; + fun scheinen_V : V ; + fun scheißen_V : V ; + fun schelten_V : V ; + fun scheren_V : V ; + fun schieben_V : V ; + fun schießen_V : V ; + fun schinden_V : V ; + fun schlafen_V : V ; + fun schlagen_V : V ; + fun schleichen_V : V ; + fun schleifen_V : V ; + fun schleißen_V : V ; + fun schließen_V : V ; + fun schlingen_V : V ; + fun schmeißen_V : V ; + fun schmelzen_V : V ; + fun schneiden_V : V ; + fun schreiben_V : V ; + fun schreien_V : V ; + fun schreiten_V : V ; + fun schweigen_V : V ; + fun schwellen_V : V ; + fun schwimmen_V : V ; + fun schwinden_V : V ; + fun schwingen_V : V ; + fun schwören_V : V ; + fun sehen_V : V ; + fun sein_V : V ; + fun senden_V : V ; + fun sieden_V : V ; + fun singen_V : V ; + fun sinken_V : V ; + fun sinnen_V : V ; + fun sitzen_V : V ; + fun sollen_V : V ; + fun speien_V : V ; + fun spinnen_V : V ; + fun spleißen_V : V ; + fun sprechen_V : V ; + fun sprießen_V : V ; + fun springen_V : V ; + fun stechen_V : V ; + fun stehen_V : V ; + fun stehlen_V : V ; + fun steigen_V : V ; + fun sterben_V : V ; + fun stieben_V : V ; + fun stinken_V : V ; + fun stoßen_V : V ; + fun streichen_V : V ; + fun streiten_V : V ; + fun tragen_V : V ; + fun treffen_V : V ; + fun treiben_V : V ; + fun treten_V : V ; + fun trinken_V : V ; + fun trügen_V : V ; + fun tun_V : V ; + fun verderben_V : V ; + fun verlieren_V : V ; + fun wachsen_V : V ; + fun wägen_V : V ; + fun waschen_V : V ; + fun weben_V : V ; + fun weichen_V : V ; + fun weisen_V : V ; + fun wenden_V : V ; + fun werben_V : V ; + fun werden_V : V ; + fun werfen_V : V ; + fun wiegen_V : V ; + fun winden_V : V ; + fun wissen_V : V ; + fun wollen_V : V ; + fun wringen_V : V ; + fun zeihen_V : V ; + fun ziehen_V : V ; + fun zwingen_V : V ; +} diff --git a/next-lib/src/german/LangGer.gf b/next-lib/src/german/LangGer.gf new file mode 100644 index 000000000..260da090d --- /dev/null +++ b/next-lib/src/german/LangGer.gf @@ -0,0 +1,10 @@ +--# -path=.:../abstract:../common + +concrete LangGer of Lang = + GrammarGer, + LexiconGer + ** { + +flags startcat = Phr ; unlexer = text ; lexer = text ; + +} ; diff --git a/next-lib/src/german/LexiconGer.gf b/next-lib/src/german/LexiconGer.gf new file mode 100644 index 000000000..dd76b9c21 --- /dev/null +++ b/next-lib/src/german/LexiconGer.gf @@ -0,0 +1,366 @@ +--# -path=.:../common:../abstract:../../prelude + +-- work by Aarne Ranta, Andreas Priesnitz, and Henning Thielemann. + +concrete LexiconGer of Lexicon = CatGer ** + open Prelude, ParadigmsGer, (Mo = MorphoGer), IrregGer in { + +flags + optimize=all_subs ; + +lin + add_V3 = dirV3 (prefixV "hinzu" (regV "fügen")) zu_Prep ; + airplane_N = regN "Flugzeug" ; + already_Adv = mkAdv "schon" ; + answer_V2S = mkV2S (regV "antworten") datPrep ; + apartment_N = regN "Wohnung" ; + apple_N = reg2N "Apfel" "Äpfel" masculine ; + art_N = reg2N "Kunst" "Künste" feminine ; + ask_V2Q = mkV2Q (regV "fragen") accPrep ; + baby_N = reg2N "Baby" "Babies" neuter ; ---- + bad_A = regA "schlecht" ; + bank_N = reg2N "Bank" "Banken" feminine ; + beautiful_A = regA "schön" ; + become_VA = mkVA IrregGer.werden_V ; + beer_N = reg2N "Bier" "Biere" neuter ; + beg_V2V = mkV2V (mk6V "bitten" "bittet" "bitte" "bat" "bäte" "gebeten") accPrep ; + big_A = mk3A "groß" "größer" "größte" ; + bike_N = reg2N "Fahrrad" "Fahrräder" neuter ; + bird_N = reg2N "Vogel" "Vögel" masculine ; + black_A = regA "schwarz" ; + blue_A = regA "blau"; + boat_N = reg2N "Boot" "Boote" neuter ; + book_N = reg2N "Buch" "Bücher" neuter ; + boot_N = reg2N "Stiefel" "Stiefel" masculine ; + boss_N = reg2N "Chef" "Chefs" masculine ; ---- + boy_N = reg2N "Junge" "Jungen" masculine ; + bread_N = reg2N "Brot" "Brote" neuter ; + break_V2 = dirV2 + (irregV "zerschlagen" "zerschlägt" "zerschlug" "zerschlüge" "zerschlagen") ; + broad_A = regA "breit" ; + brother_N2 = mkN2 (reg2N "Bruder" "Brüder" masculine) von_Prep ; + brown_A = regA "braun" ; + butter_N = reg2N "Butter" "Butter" feminine ; ---- infl + buy_V2 = dirV2 (regV "kaufen") ; + camera_N = reg2N "Kamera" "Kameras" feminine ; + cap_N = regN "Mütze" ; + car_N = regN "Wagen" ; + carpet_N = regN "Teppich" ; + cat_N = regN "Katze" ; + ceiling_N = reg2N "Dach" "Dächer" neuter ; + chair_N = reg2N "Stuhl" "Stühle" masculine ; + cheese_N = regN "Käse" ; + child_N = reg2N "Kind" "Kinder" neuter ; + church_N = regN "Kirche" ; + city_N = reg2N "Stadt" "Städte" feminine ; + clean_A = regA "rein" ; + clever_A = mk3A "klug" "klüger" "klügste" ; + close_V2 = dirV2 (irregV "schließen" "schließt" "schloß" "schlösse" "geschlossen") ; + coat_N = regN "Jacke" ; + cold_A = regA "kalt" ; + come_V = seinV (mk6V "kommen" "kommt" "komm" "kam" "käme" "gekommen") ; + computer_N = reg2N "Rechner" "Rechner" masculine ; + country_N = reg2N "Land" "Länder" neuter ; + cousin_N = reg2N "Vetter" "Vetter" masculine ; --- Kusine + cow_N = reg2N "Kuh" "Kühe" feminine ; + die_V = seinV (irregV "sterben" "stirbt" "starb" "stürbe" "gestorben") ; + distance_N3 = mkN3 (regN "Entfernung") von_Prep zu_Prep ; + dirty_A = regA "schmutzig" ; + do_V2 = dirV2 (irregV "tun" "tut" "tat" "täte" "getan") ; + doctor_N = reg2N "Arzt" "Ärzte" masculine ; + dog_N = regN "Hund" ; + door_N = reg2N "Tür" "Türen" feminine ; + drink_V2 = dirV2 (irregV "trinken" "trinkt" "trank" "tränke" "getrunken") ; + easy_A2V = mkA2V (regA "leicht") (mkPrep "für" accusative) ; + eat_V2 = dirV2 (irregV "essen" "ißt" "aß" "äße" "gegessen") ; + empty_A = regA "leer" ; ---- check infl + enemy_N = regN "Feind" ; + factory_N = regN "Fabrik" ; + father_N2 = mkN2 (reg2N "Vater" "Väter" masculine) von_Prep ; + fear_VS = mkVS (regV "fürchten") ; + find_V2 = dirV2 (irregV "finden" "findet" "fand" "fände" "gefunden") ; + fish_N = regN "Fisch" ; + floor_N = reg2N "Fußboden" "Fußböden" masculine ; + forget_V2 = dirV2 (irregV "vergessen" "vergißt" "vergaß" "vergäße" "vergessen") ; + fridge_N = reg2N "Kühlschrank" "Kühlschränke" masculine ; + friend_N = regN "Freund" ; + fruit_N = reg2N "Frucht" "Früchte" feminine ; + fun_AV = mkAV (regA "toll") ; + garden_N = reg2N "Garten" "Gärten" masculine ; + girl_N = reg2N "Mädchen" "Mädchen" neuter ; + glove_N = regN "Handschuh" ; + gold_N = reg2N "Gold" "Golde" neuter ; ---- infl + good_A = mk3A "gut" "besser" "beste" ; + go_V = seinV (irregV "gehen" "geht" "ging" "ginge" "gegangen") ; + green_A = regA "grün" ; + harbour_N = reg2N "Hafen" "Häfen" masculine ; + hate_V2 = dirV2 (regV "hassen") ; + hat_N = reg2N "Hut" "Hüte" masculine ; + have_V2 = dirV2 IrregGer.haben_V ; + hear_V2 = dirV2 (regV "hören") ; + hill_N = regN "Hügel" ; + hope_VS = mkVS (regV "hoffen") ; + horse_N = reg2N "Pferd" "Pferde" neuter ; + hot_A = regA "heiß" ; + house_N = reg2N "Haus" "Häuser" neuter ; + important_A = regA "wichtig" ; + industry_N = regN "Industrie" ; + iron_N = reg2N "Eisen" "Eisen" neuter ; + jump_V = seinV (irregV "springen" "springt" "sprang" "spränge" "gesprungen") ; + king_N = regN "König" ; + know_V2 = dirV2 (irregV "wissen" "weiß" "wußte" "wüßte" "gewußt") ; ---- infl + lake_N = reg2N "See" "Seen" masculine ; --- infl + lamp_N = regN "Lampe"; + learn_V2 = dirV2 (regV "lernen") ; + leather_N = reg2N "Leder" "Leder" neuter ; + leave_V2 = dirV2 (irregV "verlassen" "verläßt" "verließ" "verließe" "verlassen") ; + like_V2 = dirV2 (irregV "mögen" "mag" "mochte" "möchte" "gemocht") ; + listen_V2 = prepV2 (prefixV "zu" (regV "hören")) datPrep ; ---- dat + live_V = regV "leben" ; + long_A = mk3A "lang" "länger" "längste" ; + lose_V2 = dirV2 (irregV "verlieren" "verliert" "verlor" "verlöre" "verloren") ; + love_N = regN "Liebe" ; + love_V2 = dirV2 (regV "lieben") ; + man_N = reg2N "Mann" "Männer" masculine ; + married_A2 = mkA2 (regA "verheiratet") (mkPrep "mit" dative) ; + meat_N = reg2N "Fleisch" "Fleische" neuter ; ---- infl + milk_N = reg2N "Milch" "Milche" feminine ; ---- infl + moon_N = regN "Mond" ; + mother_N2 = mkN2 (reg2N "Mutter" "Mütter" feminine) von_Prep ; + mountain_N = regN "Berg" ; + music_N = reg2N "Musik" "Musiken" feminine ; + narrow_A = regA "schmal" ; + new_A = regA "neu" ; + newspaper_N = regN "Zeitung" ; + now_Adv = mkAdv "jetzt" ; + number_N = reg2N "Zahl" "Zahlen" feminine ; + oil_N = reg2N "Öl" "Öle" neuter ; + old_A = mk3A "alt" "älter" "älteste" ; + open_V2 = dirV2 (regV "öffnen") ; + paint_V2A = mkV2A (regV "malen") accPrep ; + paper_N = reg2N "Papier" "Papiere" neuter ; + paris_PN = mkPN "Paris" "Paris" ; + peace_N = mk6N "Friede" "Frieden" "Frieden" "Friedens" "Frieden" "Frieden" masculine ; + pen_N = regN "Bleistift" ; ---- + planet_N = reg2N "Planet" "Planeten" masculine ; + plastic_N = reg2N "Plastik" "Plastiken" feminine ; ---- + play_V2 = dirV2 (regV "spielen") ; + policeman_N = reg2N "Polizist" "Polizisten" masculine ; + priest_N = regN "Priester" ; + probable_AS = mkAS (regA "wahrscheinlich") ; + put_V2 = dirV2 (regV "setzen") ; + queen_N = reg2N "Königin" "Königinnen" feminine ; + radio_N = reg2N "Radio" "Radios" neuter ; ---- + rain_V0 = mkV0 (regV "regnen") ; + read_V2 = dirV2 (irregV "lesen" "liest" "las" "läse" "gelesen") ; + red_A = regA "rot" ; + religion_N = regN "Religion" ; + restaurant_N = reg2N "Restaurant" "Restaurants" neuter ; + river_N = reg2N "Fluß" "Flüsse" masculine ; + rock_N = regN "Stein" ; + roof_N = reg2N "Dach" "Dächer" neuter ; + rubber_N = reg2N "Gummi" "Gummis" neuter ; + run_V = seinV (irregV "laufen" "läuft" "lief" "liefe" "gelaufen") ; + say_VS = mkVS (regV "sagen") ; + school_N = regN "Schule"; + science_N = reg2N "Wissenschaft" "Wissenschaften" feminine ; + sea_N = reg2N "Meer" "Meere" neuter ; + seek_V2 = dirV2 (regV "suchen") ; + see_V2 = dirV2 (irregV "sehen" "sieht" "sah" "sähe" "gesehen") ; + sell_V3 = accdatV3 (no_geV (regV "verkaufen")) ; + send_V3 = accdatV3 (regV "schicken") ; + sheep_N = reg2N "Schaf" "Schafe" neuter ; + ship_N = reg2N "Schiff" "Schiffe" neuter ; + shirt_N = reg2N "Hemd" "Hemden" neuter ; ---- infl + shoe_N = regN "Schuh" ; + shop_N = reg2N "Laden" "Läden" masculine ; + short_A = mk3A "kurz" "kürzer" "kürzeste" ; + silver_N = reg2N "Silber" "Silber" neuter ; ---- infl + sister_N = reg2N "Schwester" "Schwestern" feminine ; + sleep_V = irregV "schlafen" "schläft" "schlief" "schliefe" "geschlafen" ; + small_A = regA "klein" ; + snake_N = regN "Schlange" ; + sock_N = reg2N "Strumpf" "Strümpfe" masculine ; + song_N = reg2N "Lied" "Lieder" neuter ; + speak_V2 = dirV2 (irregV "sprechen" "spricht" "sprach" "spräche" "gesprochen") ; + star_N = regN "Sterne" ; + steel_N = regN "Stahl" ; + stone_N = regN "Stein" ; + stop_V = seinV (irregV "halten" "hält" "hielt" "hielte" "gehalten") ; + stove_N = regN "Herd" ; + student_N = reg2N "Student" "Studenten" masculine ; + stupid_A = mk3A "dumm" "dümmer" "dümmste" ; ---- + sun_N = regN "Sonne" ; + switch8off_V2 = dirV2 (prefixV "aus" (regV "schalten")) ; + switch8on_V2 = dirV2 (prefixV "ein" (regV "schalten")) ; + table_N = regN "Tisch" ; + talk_V3 = mkV3 (regV "reden") datPrep von_Prep ; + teacher_N = reg2N "Lehrer" "Lehrer" masculine ; + teach_V2 = dirV2 (no_geV (regV "unterrichten")) ; + television_N = reg2N "Fernsehen" "Fernsehen" neuter; + thick_A = regA "dick" ; + thin_A = regA "dünn" ; + train_N = reg2N "Zug" "Züge" masculine ; + travel_V = regV "reisen" ; + tree_N = reg2N "Baum" "Bäume" masculine ; + ---- trousers_N = regN "trousers" ; ---- pl t ! + ugly_A = regA "häßlich" ; + understand_V2 = + dirV2 (irregV "verstehen" "versteht" "verstand" "verstände" "verstanden") ; + university_N = reg2N "Universität" "Universitäten" feminine ; + village_N = reg2N "Dorf" "Dörfer" neuter ; + wait_V2 = prepV2 (regV "warten") (mkPrep "auf" accusative) ; + walk_V = seinV (irregV "gehen" "geht" "ging" "ginge" "gegangen") ; + warm_A = mk3A "warm" "wärmer" "wärmste" ; + war_N = regN "Krieg" ; + watch_V2 = prepV2 (regV "schauen") (mkPrep "an" accusative) ; + water_N = reg2N "Wasser" "Wasser" neuter ; + white_A = regA "weiß" ; + window_N = reg2N "Fenster" "Fenster" neuter ; + wine_N = regN "Wein" ; + win_V2 = dirV2 (irregV "gewinnen" "gewinnt" "gewann" "gewänne" "gewonnen") ; + woman_N = reg2N "Frau" "Frauen" feminine ; + wonder_VQ = mkVQ (reflV (regV "wundern") accusative) ; + wood_N = reg2N "Holz" "Hölzer" neuter ; + write_V2 = dirV2 (irregV "schreiben" "schreibt" "schrieb" "schriebe" "geschrieben") ; + yellow_A = regA "gelb" ; + young_A = mk3A "jung" "jünger" "jüngste" ; + left_Ord = Mo.mkOrd (regA "link") ; + right_Ord = Mo.mkOrd (regA "recht") ; + far_Adv = mkAdv "weit" ; + correct_A = regA "richtig" ; + dry_A = regA "trocken" ; + dull_A = regA "stumpf" ; + full_A = regA "voll" ; + heavy_A = regA "schwer" ; + near_A = mk3A "nahe" "näher" "nächste" ; + rotten_A = regA "verdorben" ; + round_A = regA "rund" ; + sharp_A = mk3A "scharf" "schärfer" "schärfste" ; + smooth_A = regA "glatt" ; + straight_A = regA "gerade" ; + wet_A = regA "naß" ; + wide_A = regA "breit" ; + animal_N = reg2N "Tier" "Tiere" neuter ; + ashes_N = regN "Asche" ; + back_N = reg2N "Rücken" "Rücken" masculine ; + bark_N = regN "Rinde" ; + belly_N = reg2N "Bauch" "Bäuche" masculine ; + blood_N = regN "Blut" ; + bone_N = reg2N "Knochen" "Knochen" masculine ; + breast_N = reg2N "Brust" "Brüste" feminine ; + cloud_N = regN "Wolke" ; + day_N = regN "Tag" ; + dust_N = reg2N "Staub" "Stäube" masculine ; + ear_N = regN "Ohr" ; + earth_N = regN "Erde" ; + egg_N = regN "Ei" ; + eye_N = regN "Auge" ; + fat_N = regN "Fett" ; + feather_N = regN "feather" ; + fingernail_N = reg2N "Fingernagel" "Fingernägel" masculine ; + fire_N = regN "Feuer" ; + flower_N = regN "Blume" ; + fog_N = regN "Nebel" ; + foot_N = reg2N "Fuß" "Füße" masculine ; + forest_N = reg2N "Wald" "Wälder" masculine ; + grass_N = regN "Gras" ; + guts_N = regN "Eingeweide" ; + hair_N = regN "Haar" ; + hand_N = regN "Hand" ; + head_N = regN "Kopf" ; + heart_N = regN "Herz" ; + horn_N = regN "Horn" ; + husband_N = regN "Ehemann" ; + ice_N = regN "Eis" ; + knee_N = regN "Knie" ; + leaf_N = reg2N "Blatt" "Blätter" neuter ; + leg_N = regN "Bein" ; + liver_N = regN "Leber" ; + louse_N = reg2N "Laus" "Läuse" feminine ; + mouth_N = regN "Mund" ; + name_N = regN "Name" ; + neck_N = regN "Nacken" ; + night_N = reg2N "Nacht" "Nächte" feminine ; + nose_N = regN "Nase" ; + person_N = regN "Person" ; + rain_N = regN "Regen" ; + road_N = regN "Straße" ; + root_N = regN "Wurzel" ; + rope_N = regN "Seil" ; + salt_N = regN "Salz" ; + sand_N = regN "Sand" ; + seed_N = regN "Same" ; + skin_N = regN "Haut" ; + sky_N = regN "Himmel" ; + smoke_N = regN "Rauch" ; + snow_N = regN "Schnee" ; + stick_N = regN "Stock" ; + tail_N = regN "Schwanz" ; + tongue_N = regN "Zunge" ; + tooth_N = regN "Zahn" ; + wife_N = regN "Ehefrau" ; + wind_N = regN "Wind" ; + wing_N = reg2N "Flügel" "Flügel" masculine ; + worm_N = regN "Wurm" ; + year_N = regN "Jahr" ; + blow_V = regV "blasen" ; + breathe_V = regV "atmen" ; + burn_V = regV "brennen" ; + dig_V = regV "graben" ; + fall_V = regV "fallen" ; + float_V = regV "treiben" ; + flow_V = regV "fließen" ; + fly_V = regV "fliegen" ; + freeze_V = regV "frieren" ; + give_V3 = accdatV3 (irregV "geben" "gibt" "gab" "gäbe" "gegeben") ; + laugh_V = regV "lachen" ; + lie_V = regV "lügen" ; + play_V = regV "spielen" ; + sew_V = regV "nähen" ; + sing_V = regV "singen" ; + sit_V = irregV "sitzen" "sitzt" "saß" "säße" "gesessen" ; + smell_V = regV "riechen" ; + spit_V = regV "spucken" ; + stand_V = regV "stehen" ; + swell_V = prefixV "an" (regV "schwellen") ; + swim_V = regV "schwimmen" ; + think_V = regV "denken" ; + turn_V = regV "drehen" ; + vomit_V = regV "kotzen" ; + + bite_V2 = dirV2 (irregV "beißen" "beißt" "biss" "bisse" "gebissen") ; + count_V2 = dirV2 (regV "zählen") ; + cut_V2 = dirV2 (irregV "schneiden" "schneidet" "schnitt" "schnitte" "geschnitten") ; + fear_V2 = dirV2 (regV "fürchten") ; + fight_V2 = dirV2 (regV "bekämpfen") ; + hit_V2 = dirV2 (irregV "schlagen" "schlägt" "schlug" "schlüge" "geschlagen") ; + hold_V2 = dirV2 (irregV "halten" "hält" "hielt" "hielte" "gehalten") ; + hunt_V2 = dirV2 (regV "jagen") ; + kill_V2 = dirV2 (regV "töten") ; + pull_V2 = dirV2 (irregV "ziehen" "zieht" "zog" "zöge" "gezogen") ; + push_V2 = dirV2 (irregV "schieben" "schiebt" "schub" "schübe" "geschoben") ; + rub_V2 = dirV2 (irregV "reiben" "reibt" "rieb" "riebe" "gerieben") ; + scratch_V2 = dirV2 (regV "kratzen") ; + split_V2 = dirV2 (prefixV "auf" (regV "teilen")) ; + squeeze_V2 = dirV2 (regV "pressen") ; + stab_V2 = dirV2 (irregV "stechen" "sticht" "stach" "stäche" "gestochen") ; + suck_V2 = dirV2 (regV "saugen") ; + throw_V2 = dirV2 (irregV "werfen" "wirft" "warf" "würfe" "geworfen") ; + tie_V2 = dirV2 (irregV "binden" "bindet" "band" "bände" "gebunden") ; + wash_V2 = dirV2 (irregV "waschen" "wäscht" "wusch" "wüsche" "gewaschen") ; + wipe_V2 = dirV2 (regV "wischen") ; + + grammar_N = reg2N "Grammatik" "Grammatiken" feminine ; + language_N = regN "Sprache" ; + rule_N = reg2N "Regel" "Regeln" feminine ; + + john_PN = regPN "Johann" ; + question_N = regN "Frage" ; + ready_A = regA "fertig" ; + reason_N = reg2N "Grund" "Gründe" masculine ; + today_Adv = mkAdv "heute" ; + uncertain_A = regA "unsicher" ; + + +} ; diff --git a/next-lib/src/german/MorphoGer.gf b/next-lib/src/german/MorphoGer.gf new file mode 100644 index 000000000..c4c28fa1e --- /dev/null +++ b/next-lib/src/german/MorphoGer.gf @@ -0,0 +1,96 @@ +--# -path=.:../common:../../prelude +-- +----1 A Simple German Resource Morphology +---- +---- Aarne Ranta & Harald Hammarström 2002 -- 2006 +---- +---- This resource morphology contains definitions needed in the resource +---- syntax. To build a lexicon, it is better to use $ParadigmsGer$, which +---- gives a higher-level access to this module. +-- +resource MorphoGer = ResGer ** open Prelude, (Predef=Predef) in { + + flags optimize=all ; + +oper + +-- For $StructuralGer$. + + mkPrep : Str -> Case -> Preposition = \s,c -> + {s = s ; c = c} ; + + nameNounPhrase : {s : Case => Str} -> {s : Case => Str ; a : Agr} = \name -> + name ** {a = agrP3 Sg} ; + + detLikeAdj : Number -> Str -> + {s,sp : Gender => Case => Str ; n : Number ; a : Adjf} = \n,dies -> + {s,sp = appAdj (regA dies) ! n ; n = n ; a = Weak} ; + + mkOrd : {s : Degree => AForm => Str} -> {s : AForm => Str} = \a -> + {s = a.s ! Posit} ; + +-- For $ParadigmsGer$. + + genitS : Str -> Str = \hund -> case hund of { + _ + ("el" | "en" | "er") => hund + "s" ; + _ + ("s" | "ß" | "sch" | "st" | "x" | "z") => hund + "es" ; + _ => hund + variants {"s" ; "es"} + } ; + pluralN : Str -> Str = \hund -> case hund of { + _ + ("el" | "er" | "e") => hund + "n" ; + _ + "en" => hund ; + _ => hund + "en" + } ; + dativE : Str -> Str = \hund -> case hund of { + _ + ("el" | "en" | "er" | "e") => hund ; + _ => variants {hund ; hund + "e"} + } ; + +-- Duden, p. 119 + + verbT : Str -> Str = \v -> case v of { + _ + ("t" | "d") => v + "et" ; -- gründen, reden, betten + _ + ("ch" | "k" | "p" | "t" | "g" | "b" | "d" | "f" | "s") + + ("m" | "n") => v + "et" ; -- atmen, widmen, öffnen, rechnen + _ => v + "t" -- lernen, lärmen, qualmen etc + } ; + + verbST : Str -> Str = \v -> case v of { + _ + ("s" | "ss" | "ß" | "sch" | "x" | "z") => v + "t" ; + _ => v + "st" + } ; + + stemVerb : Str -> Str = \v -> case v of { + _ + ("rn" | "ln") => init v ; + _ => Predef.tk 2 v + } ; + +-- For $Numeral$. + + LinDigit = {s : DForm => CardOrd => Str} ; + + cardOrd : Str -> Str -> CardOrd => Str = \drei,dritte -> + table { + NCard _ _ => drei ; + NOrd a => (regA (init dritte)).s ! Posit ! a + } ; + + cardReg : Str -> CardOrd => Str = \zehn -> + cardOrd zehn (zehn + "te") ; + + mkDigit : (x1,_,_,x4 : Str) -> LinDigit = + \drei,dreizehn,dreissig,dritte -> + {s = table { + DUnit => cardOrd drei dritte ; + DTeen => cardReg dreizehn ; + DTen => cardOrd dreissig (dreissig + "ste") + } + } ; + + regDigit : Str -> LinDigit = \vier -> + mkDigit vier (vier + "zehn") (vier + "zig") (vier + "te") ; + + invNum : CardOrd = NCard Masc Nom ; + +} ; + diff --git a/next-lib/src/german/NounGer.gf b/next-lib/src/german/NounGer.gf new file mode 100644 index 000000000..2ebdccd9e --- /dev/null +++ b/next-lib/src/german/NounGer.gf @@ -0,0 +1,176 @@ +concrete NounGer of Noun = CatGer ** open ResGer, Prelude in { + + flags optimize=all_subs ; + + lin + DetCN det cn = { + s = \\c => det.s ! cn.g ! c ++ cn.s ! adjfCase det.a c ! det.n ! c ; + a = agrP3 det.n ; + isPron = False + } ; + + DetNP det = { + s = \\c => det.s ! Neutr ! c ; ---- genders + a = agrP3 det.n ; + isPron = False + } ; + + UsePN pn = pn ** {a = agrP3 Sg} ; + + UsePron pron = { + s = \\c => pron.s ! NPCase c ; + a = pron.a + } ; + + PredetNP pred np = { + s = \\c => pred.s ! np.a.n ! Masc ! c ++ np.s ! c ; ---- g + a = np.a + } ; + + PPartNP np v2 = { + s = \\c => np.s ! c ++ v2.s ! VPastPart APred ; --- invar part + a = np.a + } ; + + AdvNP np adv = { + s = \\c => np.s ! c ++ adv.s ; + a = np.a + } ; + + DetQuantOrd quant num ord = + let + n = num.n ; + a = quant.a + in { + s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ + num.s!g!c ++ ord.s ! agrAdj g (adjfCase a c) n c ; + sp = \\g,c => quant.sp ! n ! g ! c ++ + num.s!g!c ++ ord.s ! agrAdj g (adjfCase a c) n c ; + n = n ; + a = a + } ; + + DetQuant quant num = + let + n = num.n ; + a = quant.a + in { + s = \\g,c => quant.s ! num.isNum ! n ! g ! c ++ num.s!g!c ; + sp = \\g,c => quant.sp ! n ! g ! c ++ num.s!g!c ; + n = n ; + a = a + } ; + + + PossPron p = { + s = \\_,n,g,c => p.s ! NPPoss (gennum g n) c ; + sp = \\n,g,c => p.s ! NPPoss (gennum g n) c ; + a = Strong --- need separately weak for Pl ? + } ; + + NumCard n = n ** {isNum = True} ; + + NumPl = {s = \\g,c => []; n = Pl ; isNum = False} ; + NumSg = {s = \\g,c => []; n = Sg ; isNum = False} ; + + NumDigits numeral = {s = \\g,c => numeral.s ! NCard g c; n = numeral.n } ; + OrdDigits numeral = {s = \\af => numeral.s ! NOrd af} ; + + NumNumeral numeral = {s = \\g,c => numeral.s ! NCard g c; n = numeral.n } ; + OrdNumeral numeral = {s = \\af => numeral.s ! NOrd af} ; + + AdNum adn num = {s = \\g,c => adn.s ++ num.s!g!c; n = num.n } ; + + OrdSuperl a = {s = a.s ! Superl} ; + + DefArt = { + s = \\_,n,g,c => artDef ! gennum g n ! c ; + sp = \\n,g,c => artDef ! gennum g n ! c ; ---- deren, denem... + a = Weak + } ; + + IndefArt = { + s = table { + True => \\_,_,_ => [] ; + False => table { + Sg => \\g,c => "ein" + pronEnding ! GSg g ! c ; + Pl => \\_,_ => [] + } + } ; + sp = \\_,g,c => "ein" + pronEnding ! GSg g ! c ; ---- plural ; einer + a = Strong + } ; + + MassNP cn = { + s = \\c => cn.s ! adjfCase Strong c ! Sg ! c ; + a = agrP3 Sg ; + isPron = False + } ; + + UseN, UseN2 = \n -> { + s = \\_ => n.s ; + g = n.g + } ; + + ComplN2 f x = { + s = \\_,n,c => f.s ! n ! c ++ appPrep f.c2 x.s ; + g = f.g + } ; + + ComplN3 f x = { + s = \\n,c => f.s ! n ! c ++ appPrep f.c2 x.s ; + g = f.g ; + c2 = f.c3 + } ; + + Use2N3 f = { + s = f.s ; + g = f.g ; + c2 = f.c2 + } ; + + Use3N3 f = { + s = f.s ; + g = f.g ; + c2 = f.c3 + } ; + + AdjCN ap cn = + let + g = cn.g + in { + s = \\a,n,c => + preOrPost ap.isPre + (ap.s ! agrAdj g a n c) + (cn.s ! a ! n ! c) ; + g = g + } ; + + RelCN cn rs = { + s = \\a,n,c => cn.s ! a ! n ! c ++ rs.s ! gennum cn.g n ; + g = cn.g + } ; + + RelNP np rs = { + s = \\c => np.s ! c ++ "," ++ rs.s ! gennum np.a.g np.a.n ; + a = np.a ; + isPron = False + } ; + + SentCN cn s = { + s = \\a,n,c => cn.s ! a ! n ! c ++ s.s ; + g = cn.g + } ; + + AdvCN cn s = { + s = \\a,n,c => cn.s ! a ! n ! c ++ s.s ; + g = cn.g + } ; + + ApposCN cn np = let g = cn.g in { + s = \\a,n,c => cn.s ! a ! n ! c ++ np.s ! c ; + g = g ; + isMod = cn.isMod + } ; + +} diff --git a/next-lib/src/german/NumeralGer.gf b/next-lib/src/german/NumeralGer.gf new file mode 100644 index 000000000..f12280131 --- /dev/null +++ b/next-lib/src/german/NumeralGer.gf @@ -0,0 +1,86 @@ +concrete NumeralGer of Numeral = CatGer ** open MorphoGer in { + +flags optimize = all_subs ; + +lincat + Digit = {s : DForm => CardOrd => Str} ; + Sub10 = {s : DForm => CardOrd => Str ; n : Number} ; + Sub100, Sub1000, Sub1000000 = + {s : CardOrd => Str ; n : Number} ; + +lin + num x = x ; + + n2 = mkDigit "zwei" "zwölf" "zwanzig" "zweite" ; + n3 = mkDigit "drei" "dreizehn" "dreissig" "dritte" ; + n4 = regDigit "vier" ; + n5 = regDigit "fünf" ; + n6 = regDigit "sechs" ; + n7 = mkDigit "sieben" "siebzehn" "siebzig" "siebte" ; + n8 = mkDigit "acht" "achzehn" "achzig" "achte" ; + n9 = regDigit "neun" ; + + pot01 = { + s = \\f => table { + NCard g c => "ein" + pronEnding ! GSg g ! c ; + NOrd af => (regA "erst").s ! Posit ! af + } ; + n = Sg + } ; + pot0 d = {s = \\f,g => d.s ! f ! g ; n = Pl} ; + pot110 = {s = cardReg "zehn"; n = Pl} ; + pot111 = {s = cardReg "elf"; n = Pl} ; + pot1to19 d = {s = d.s ! DTeen; n = Pl} ; + pot0as1 n = {s = n.s ! DUnit; n = n.n } ; + pot1 d = {s = d.s ! DTen; n = Pl} ; + pot1plus d e = {s = \\g => e.s ! DUnit ! invNum ++ "und" ++ d.s ! DTen ! g; n = Pl} ; + pot1as2 n = n ; + pot2 d = + {s = \\g => d.s ! DUnit ! invNum ++ cardOrd "hundert" "hunderte" ! g ; n = Pl} ; + pot2plus d e = + {s = \\g => d.s ! DUnit ! invNum ++ "hundert" ++ e.s ! g ; n = Pl} ; + pot2as3 n = n ; + pot3 n = + {s = \\g => n.s ! invNum ++ cardOrd "tausend" "tausendte" ! g ; n = Pl} ; ---- + pot3plus n m = + {s = \\g => n.s ! invNum ++ "tausend" ++ m.s ! g ; n = Pl} ; + + + lincat + Dig = TDigit ; + + lin + IDig d = d ; + + IIDig d i = { + s = \\o => d.s ! invNum ++ i.s ! o ; + n = Pl + } ; + + ---- TODO: case endings of ordinals + D_0 = mkDig "0" ; + D_1 = mk3Dig "1" "1e" Sg ; + D_2 = mk2Dig "2" "2e" ; + D_3 = mkDig "3" ; + D_4 = mkDig "4" ; + D_5 = mkDig "5" ; + D_6 = mkDig "6" ; + D_7 = mkDig "7" ; + D_8 = mkDig "8" ; + D_9 = mkDig "9" ; + + oper + mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ; + mkDig : Str -> TDigit = \c -> mk2Dig c (c + "e") ; + + mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> { + s = table {NCard _ _ => c ; NOrd _ => o} ; + n = n + } ; + + TDigit = { + n : Number ; + s : CardOrd => Str + } ; + +} diff --git a/next-lib/src/german/ParadigmsGer.gf b/next-lib/src/german/ParadigmsGer.gf new file mode 100644 index 000000000..446bbe07d --- /dev/null +++ b/next-lib/src/german/ParadigmsGer.gf @@ -0,0 +1,507 @@ +--# -path=.:../common:../abstract:../../prelude + +--1 German Lexical Paradigms +-- +-- Aarne Ranta, Harald Hammarström and Björn Bringert2003--2007 +-- +-- This is an API for the user of the resource grammar +-- for adding lexical items. It gives functions for forming +-- expressions of open categories: nouns, adjectives, verbs. +-- +-- Closed categories (determiners, pronouns, conjunctions) are +-- accessed through the resource syntax API, $Structural.gf$. +-- +-- The structure of functions for each word class $C$ is the following: +-- first we give a handful of patterns that aim to cover all +-- cases, from the most regular (with just one argument) to the worst. +-- The name of this function is $mkC$. +-- +-- There is also a module [``IrregGer`` ../../german/IrregGer.gf] +-- which covers irregular verbs. + + +resource ParadigmsGer = open + (Predef=Predef), + Prelude, + MorphoGer, + CatGer + in { + +--2 Parameters + +-- To abstract over gender names, we define the following identifiers. + +oper + Gender : Type ; + + masculine : Gender ; + feminine : Gender ; + neuter : Gender ; + +-- To abstract over case names, we define the following. + + Case : Type ; + + nominative : Case ; + accusative : Case ; + dative : Case ; + genitive : Case ; + +-- To abstract over number names, we define the following. + + Number : Type ; + + singular : Number ; + plural : Number ; + + +--2 Nouns + + +mkN : overload { +-- The regular heuristics recognizes some suffixes, from which it +-- guesses the gender and the declension: "e, ung, ion" give the +-- feminine with plural ending "-n, -en", and the rest are masculines +-- with the plural "-e" (without Umlaut). + + mkN : (Stufe : Str) -> N ; + +-- The 'almost regular' case is much like the information given in an ordinary +-- dictionary. It takes the singular and plural nominative and the +-- gender, and infers the other forms from these. + + mkN : (Bild,Bilder : Str) -> Gender -> N ; + +-- Worst case: give all four singular forms, two plural forms (others + dative), +-- and the gender. + + mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> N + -- mann, mann, manne, mannes, männer, männern + }; + + +-- Relational nouns need a preposition. The most common is "von" with +-- the dative, and there is a special case for regular nouns. + + mkN2 : overload { + mkN2 : Str -> N2 ; + mkN2 : N -> N2 ; + mkN2 : N -> Prep -> N2 + } ; + +-- Use the function $mkPrep$ or see the section on prepositions below to +-- form other prepositions. +-- Some prepositions are moreover constructed in [StructuralGer StructuralGer.html]. +-- +-- Three-place relational nouns ("die Verbindung von x nach y") need two prepositions. + + mkN3 : N -> Prep -> Prep -> N3 ; + + +--3 Proper names and noun phrases +-- +-- Proper names, with an "s" genitive and other cases like the +-- nominative, are formed from a string. Final "s" ("Johannes-Johannes") is +-- taken into account. + + mkPN : overload { + mkPN : Str -> PN ; + +-- If only the genitive differs, two strings are needed. + + mkPN : (nom,gen : Str) -> PN ; + +-- In the worst case, all four forms are needed. + + mkPN : (nom,acc,dat,gen : Str) -> PN + } ; + + + +--2 Adjectives + + mkA : overload { + +-- The regular adjective formation works for most cases, and includes +-- variations such as "teuer - teurer", "böse - böser". + + mkA : Str -> A ; + +-- In the worst case, adjectives need three forms - one for each degree. + + mkA : (gut,besser,beste : Str) -> A -- gut,besser,beste + + }; + +-- Invariable adjective are a special case. + + invarA : Str -> A ; -- prima + +-- Two-place adjectives are formed by adding a preposition to an adjective. + + mkA2 : A -> Prep -> A2 ; + +--2 Adverbs + +-- Adverbs are formed from strings. + + mkAdv : Str -> Adv ; + + +--2 Prepositions + +-- A preposition is formed from a string and a case. + + mkPrep : Str -> Case -> Prep ; + +-- Often just a case with the empty string is enough. + + accPrep : Prep ; + datPrep : Prep ; + genPrep : Prep ; + +-- A couple of common prepositions (always with the dative). + + von_Prep : Prep ; + zu_Prep : Prep ; + +--2 Verbs + +mkV : overload { + +-- Regular verbs ("weak verbs") need just the infinitive form. + + mkV : (führen : Str) -> V ; + +-- Irregular verbs use Ablaut and, in the worst cases, also Umlaut. + + mkV : (sehen,sieht,sah,sähe,gesehen : Str) -> V ; + +-- The worst-case constructor needs six forms: +-- - Infinitive, +-- - 3p sg pres. indicative, +-- - 2p sg imperative, +-- - 1/3p sg imperfect indicative, +-- - 1/3p sg imperfect subjunctive (because this uncommon form can have umlaut) +-- - the perfect participle +-- +-- + + mkV : (geben, gibt, gib, gab, gäbe, gegeben : Str) -> V ; + +-- To add a movable suffix e.g. "auf(fassen)". + + mkV : Str -> V -> V +}; + + +-- To remove the past participle prefix "ge", e.g. for the verbs +-- prefixed by "be-, ver-". + + no_geV : V -> V ; + +-- To change the auxiliary from "haben" (default) to "sein" and +-- vice-versa. + + seinV : V -> V ; + habenV : V -> V ; + +-- Reflexive verbs can take reflexive pronouns of different cases. + + reflV : V -> Case -> V ; + + +--3 Two-place verbs + +mkV2 : overload { + +-- Two-place verbs with a preposition. + + mkV2 : V -> Prep -> V2 ; + +-- Two-place verbs with direct object (accusative, transitive verbs). + + mkV2 : V -> V2 ; + +-- Two-place verbs with object in the given case. + + mkV2 : V -> Case -> V2 +}; + + +--3 Three-place verbs +-- +-- Three-place (ditransitive) verbs need two prepositions, of which +-- the first one or both can be absent. + + mkV3 : V -> Prep -> Prep -> V3 ; -- sprechen, mit, über + dirV3 : V -> Prep -> V3 ; -- senden,(accusative),nach + accdatV3 : V -> V3 ; -- give,accusative,dative + +--3 Other complement patterns +-- +-- Verbs and adjectives can take complements such as sentences, +-- questions, verb phrases, and adjectives. + + mkV0 : V -> V0 ; + mkVS : V -> VS ; + mkV2S : V -> Prep -> V2S ; + mkVV : V -> VV ; + mkV2V : V -> Prep -> V2V ; + mkVA : V -> VA ; + mkV2A : V -> Prep -> V2A ; + mkVQ : V -> VQ ; + mkV2Q : V -> Prep -> V2Q ; + + mkAS : A -> AS ; + mkA2S : A -> Prep -> A2S ; + mkAV : A -> AV ; + mkA2V : A -> Prep -> A2V ; + +-- Notice: categories $AS, A2S, AV, A2V$ are just $A$, +-- and the second argument is given as an adverb. Likewise +-- $V0$ is just $V$. + + V0 : Type ; + AS, A2S, AV, A2V : Type ; + + +--. +--2 Definitions of paradigms +-- +-- The definitions should not bother the user of the API. So they are +-- hidden from the document. + + + + Gender = MorphoGer.Gender ; + Case = MorphoGer.Case ; + Number = MorphoGer.Number ; + masculine = Masc ; + feminine = Fem ; + neuter = Neutr ; + nominative = Nom ; + accusative = Acc ; + dative = Dat ; + genitive = Gen ; + singular = Sg ; + plural = Pl ; + + mk6N a b c d e f g = MorphoGer.mkN a b c d e f g ** {lock_N = <>} ; + + regN : Str -> N = \hund -> case hund of { + _ + "e" => mk6N hund hund hund hund (hund + "n") (hund + "n") Fem ; + _ + ("ion" | "ung") => mk6N hund hund hund hund (hund + "en") (hund + "en") Fem ; + _ + ("er" | "en" | "el") => mk6N hund hund hund (genitS hund) hund (pluralN hund) Masc ; + _ => mk6N hund hund hund (genitS hund) (hund + "e") (pluralN hund) Masc + } ; + + reg2N : (x1,x2 : Str) -> Gender -> N = \hund,hunde,g -> + let + hunds = genitS hund ; + hundE = dativE hund ; + hunden = pluralN hunde + in + case of { -- Duden p. 223 + <_,_ + ("e" | "er"), Masc | Neutr> => -- I,IV + mk6N hund hund hundE hunds hunde hunden g ; + <_ + ("el"|"er"|"en"),_ + ("el"|"er"|"en"), Masc | Neutr> => -- II + mk6N hund hund hund hunds hunde hunden g ; + <_,_ + "s", Masc | Neutr> => -- V + mk6N hund hund hund (hund + "s") hunde hunde g ; + <_,_ + "en", Masc> => -- VI + mk6N hund hunde hunde hunde hunde hunde g ; + <_,_ + ("e" | "er"), Fem> => -- VII,VIII + mk6N hund hund hund hund hunde hunden g ; + <_,_ + ("n" | "s"), Fem> => -- IX,X + mk6N hund hund hund hund hunde hunde g ; + _ => regN hund + } ; + + mkN2 = overload { + mkN2 : Str -> N2 = \s -> vonN2 (regN s) ; + mkN2 : N -> N2 = vonN2 ; + mkN2 : N -> Prep -> N2 = mmkN2 + } ; + + + mmkN2 : N -> Prep -> N2 = \n,p -> n ** {c2 = p ; lock_N2 = <>} ; + vonN2 : N -> N2 = \n -> n ** {c2 = {s = "von" ; c = dative} ; lock_N2 = <>} ; + + mkN3 = \n,p,q -> n ** {c2 = p ; c3 = q ; lock_N3 = <>} ; + + mk2PN = \karolus, karoli -> + {s = table {Gen => karoli ; _ => karolus} ; lock_PN = <>} ; + regPN = \horst -> + mk2PN horst (ifTok Tok (Predef.dp 1 horst) "s" horst (horst + "s")) ; + + mkPN = overload { + mkPN : Str -> PN = regPN ; + mkPN : (nom,gen : Str) -> PN = mk2PN ; + mkPN : (nom,acc,dat,gen : Str) -> PN = \nom,acc,dat,gen -> + {s = table {Nom => nom ; Acc => acc ; Dat => dat ; Gen => gen} ; lock_PN = <>} + } ; + + mk2PN : (karolus, karoli : Str) -> PN ; -- karolus, karoli + regPN : (Johann : Str) -> PN ; + -- Johann, Johanns ; Johannes, Johannes + + + mk3A : (gut,besser,beste : Str) -> A = \a,b,c -> + let aa : Str = case a of { + teu + "er" => teu + "r" ; + mud + "e" => mud ; + _ => a + } in + MorphoGer.mkA a aa b (init c) ** {lock_A = <>} ; + + regA : Str -> A = \a -> case a of { + teu + "er" => mk3A a (teu + "rer") (teu + "reste") ; + _ + "e" => mk3A a (a + "r") (a + "ste") ; + _ => mk3A a (a + "er") (a + "este") + } ; + + invarA = \s -> {s = \\_,_ => s ; lock_A = <>} ; ---- comparison + + mkA2 = \a,p -> a ** {c2 = p ; lock_A2 = <>} ; + + mkAdv s = {s = s ; lock_Adv = <>} ; + + mkPrep s c = {s = s ; c = c ; lock_Prep = <>} ; + accPrep = mkPrep [] accusative ; + datPrep = mkPrep [] dative ; + genPrep = mkPrep [] genitive ; + von_Prep = mkPrep "von" dative ; + zu_Prep = mkPrep "zu" dative ; + + mk6V geben gibt gib gab gaebe gegeben = + let + geb = stemVerb geben ; + gebe = geb + "e" ; + gibst = verbST (init gibt) ; + gebt = verbT geb ; + gabst = verbST gab ; + gaben = pluralN gab ; + gabt = verbT gab + in + MorphoGer.mkV + geben gebe gibst gibt gebt gib gab gabst gaben gabt gaebe gegeben + [] VHaben ** {lock_V = <>} ; + + regV fragen = + let + frag = stemVerb fragen ; + fragt = verbT frag ; + fragte = fragt + "e" ; + gefragt = "ge" + fragt ; + in + mk6V fragen fragt (frag + "e") fragte fragte gefragt ; + + irregV singen singt sang saenge gesungen = + let + sing = stemVerb singen ; + in + mk6V singen singt sing sang saenge gesungen ; + + prefixV p v = MorphoGer.prefixV p v ** {lock_V = v.lock_V} ; + + habenV v = + {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VHaben ; vtype = v.vtype} ; + seinV v = + {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VSein ; vtype = v.vtype} ; + reflV v c = + {s = v.s ; prefix = v.prefix ; lock_V = v.lock_V ; aux = VHaben ; vtype = VRefl c} ; + + no_geV v = let vs = v.s in { + s = table { + p@(VPastPart _) => Predef.drop 2 (vs ! p) ; + p => vs ! p + } ; + prefix = v.prefix ; lock_V = v.lock_V ; aux = v.aux ; vtype = v.vtype + } ; + + haben_V = MorphoGer.haben_V ** {lock_V = <>} ; + sein_V = MorphoGer.sein_V ** {lock_V = <>} ; + werden_V = MorphoGer.werden_V ** {lock_V = <>} ; + + prepV2 v c = v ** {c2 = c ; lock_V2 = <>} ; + dirV2 v = prepV2 v (mkPrep [] accusative) ; + datV2 v = prepV2 v (mkPrep [] dative) ; + + mkV3 v c d = v ** {c2 = c ; c3 = d ; lock_V3 = <>} ; + dirV3 v p = mkV3 v (mkPrep [] accusative) p ; + accdatV3 v = dirV3 v (mkPrep [] dative) ; + + mkVS v = v ** {lock_VS = <>} ; + mkVQ v = v ** {lock_VQ = <>} ; + mkVV v = v ** {isAux = False ; lock_VV = <>} ; + + V0 : Type = V ; +-- V2S, V2V, V2Q : Type = V2 ; + AS, A2S, AV : Type = A ; + A2V : Type = A2 ; + + mkV0 v = v ** {lock_V = <>} ; + mkV2S v p = prepV2 v p ** {lock_V2S = <>} ; + mkV2V v p = prepV2 v p ** {isAux = False ; lock_V2V = <>} ; + mkVA v = v ** {lock_VA = <>} ; + mkV2A v p = prepV2 v p ** {lock_V2A = <>} ; + mkV2Q v p = prepV2 v p ** {lock_V2Q = <>} ; + + mkAS v = v ** {lock_A = <>} ; + mkA2S v p = mkA2 v p ** {lock_A = <>} ; + mkAV v = v ** {lock_A = <>} ; + mkA2V v p = mkA2 v p ** {lock_A2 = <>} ; + +-- pre-overload API and overload definitions + + regN : Str -> N ; + reg2N : (x1,x2 : Str) -> Gender -> N ; + mk6N : (x1,_,_,_,_,x6 : Str) -> Gender -> N ; + + mkN = overload { + mkN : Str -> N = regN ; + mkN : (x1,x2 : Str) -> Gender -> N = reg2N ; + mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> N = mk6N + }; + + + + regA : Str -> A ; + mk3A : (gut,besser,beste : Str) -> A ; + + mkA = overload { + mkA : Str -> A = regA ; + mkA : (gut,besser,beste : Str) -> A = mk3A + }; + + + + regV : Str -> V ; + irregV : (x1,_,_,_,x5 : Str) -> V ; + mk6V : (x1,_,_,_,_,x6 : Str) -> V ; + + prefixV : Str -> V -> V ; + + mkV = overload { + mkV : Str -> V = regV ; + mkV : (x1,_,_,_,x5 : Str) -> V = irregV ; + mkV : (x1,_,_,_,_,x6 : Str) -> V = mk6V ; + mkV : Str -> V -> V = prefixV + }; + + + prepV2 : V -> Prep -> V2 ; + + dirV2 : V -> V2 ; + + datV2 : V -> V2 ; + + mkV2 = overload { + mkV2 : V -> Prep -> V2 = prepV2; + mkV2 : V -> V2 = dirV2 ; + mkV2 : V -> Case -> V2 = \v,c -> prepV2 v (mkPrep [] c) + }; + + +} ; diff --git a/next-lib/src/german/PhraseGer.gf b/next-lib/src/german/PhraseGer.gf new file mode 100644 index 000000000..dc8cfe04e --- /dev/null +++ b/next-lib/src/german/PhraseGer.gf @@ -0,0 +1,26 @@ +concrete PhraseGer of Phrase = CatGer ** open Prelude, ResGer in { + + flags optimize=all_subs ; + + lin + PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; + + UttS s = {s = s.s ! Main} ; + UttQS qs = {s = qs.s ! QDir} ; + UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg False} ; + UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Pl False} ; + UttImpPol pol imp = {s = pol.s ++ imp.s ! pol.p ! ImpF Sg True} ; + + UttIP ip = {s = ip.s ! Nom} ; --- Acc also + UttIAdv iadv = iadv ; + UttNP np = {s = np.s ! Nom} ; + UttVP vp = {s = useInfVP True vp} ; -- without zu + UttAdv adv = adv ; + + NoPConj = {s = []} ; + PConjConj conj = ss (conj.s2) ; + + NoVoc = {s = []} ; + VocNP np = {s = "," ++ np.s ! Nom} ; + +} diff --git a/next-lib/src/german/QuestionGer.gf b/next-lib/src/german/QuestionGer.gf new file mode 100644 index 000000000..d94742c5f --- /dev/null +++ b/next-lib/src/german/QuestionGer.gf @@ -0,0 +1,101 @@ +concrete QuestionGer of Question = CatGer ** open ResGer in { + + flags optimize=all_subs ; + + lin + + QuestCl cl = { + s = \\m,t,a,p => + let cls = cl.s ! m ! t ! a ! p + in table { + QDir => cls ! Inv ; + QIndir => "ob" ++ cls ! Sub + } + } ; + + QuestVP qp vp = { + s = \\m,t,a,b,q => + let + cl = (mkClause (qp.s ! Nom) (agrP3 qp.n) vp).s ! m ! t ! a ! b + in + case q of { + QIndir => cl ! Sub ; + _ => cl ! Main + } + } ; + + QuestSlash ip slash = { + s = \\m,t,a,p => + let + cls = slash.s ! m ! t ! a ! p ; + who = appPrep slash.c2 ip.s + in table { + QDir => who ++ cls ! Inv ; + QIndir => who ++ cls ! Sub + } + } ; + + QuestIAdv iadv cl = { + s = \\m,t,a,p => + let + cls = cl.s ! m ! t ! a ! p ; + why = iadv.s + in table { + QDir => why ++ cls ! Inv ; + QIndir => why ++ cls ! Sub + } + } ; + + QuestIComp icomp np = { + s = \\m,t,a,p => + let + vp = predV sein_V ; + cls = (mkClause (np.s ! Nom) np.a vp).s ! m ! t ! a ! p ; + why = icomp.s ! np.a + in table { + QDir => why ++ cls ! Inv ; + QIndir => why ++ cls ! Sub + } + } ; + + PrepIP p ip = { + s = appPrep p ip.s + } ; + + AdvIP ip adv = { + s = \\c => ip.s ! c ++ adv.s ; + n = ip.n + } ; + + IdetCN idet cn = + let + g = cn.g ; + n = idet.n + in { + s = \\c => idet.s ! g ! c ++ cn.s ! Weak ! n ! c ; + n = n + } ; + + IdetIP idet = + let + g = Neutr ; ---- + n = idet.n + in { + s = idet.s ! g ; + n = n + } ; + + IdetQuant idet num = + let + n = num.n + in { + s = \\g,c => idet.s ! n ! g ! c ++ num.s!g!c ; + n = n + } ; + + CompIAdv a = {s = \\_ => a.s} ; + + CompIP ip = {s = \\_ => ip.s ! Nom} ; + +} + diff --git a/next-lib/src/german/RelativeGer.gf b/next-lib/src/german/RelativeGer.gf new file mode 100644 index 000000000..2605ed3a4 --- /dev/null +++ b/next-lib/src/german/RelativeGer.gf @@ -0,0 +1,48 @@ +concrete RelativeGer of Relative = CatGer ** open ResGer in { + + flags optimize=all_subs ; + + lin + + RelCl cl = { + s = \\m,t,a,b,_ => "derart" ++ conjThat ++ cl.s ! m ! t ! a ! b ! Sub ; + c = Nom + } ; + + RelVP rp vp = { + s = \\m,t,ant,b,gn => + let + agr = case rp.a of { + RNoAg => agrP3 (numGenNum gn) ; + RAg a => a ** {g = Neutr} + } ; + cl = mkClause (rp.s ! gn ! Nom) agr vp + in + cl.s ! m ! t ! ant ! b ! Sub ; + c = Nom + } ; + + RelSlash rp slash = { + s = \\m,t,a,p,gn => + appPrep slash.c2 (rp.s ! gn) ++ slash.s ! m ! t ! a ! p ! Sub ; + c = slash.c2.c + } ; + + FunRP p np rp = { + s = \\gn,c => np.s ! c ++ appPrep p (rp.s ! gn) ; + a = RAg {n = np.a.n ; p = np.a.p} + } ; + + IdRP = {s = relPron ; a = RNoAg} ; + + oper + relPron : GenNum => Case => Str = \\gn,c => + case of { + => "deren" ; + => "dessen" ; + => "denen" ; + => "deren" ; + _ => artDef ! gn ! c + } ; + +} diff --git a/next-lib/src/german/ResGer.gf b/next-lib/src/german/ResGer.gf new file mode 100644 index 000000000..219749b6f --- /dev/null +++ b/next-lib/src/german/ResGer.gf @@ -0,0 +1,633 @@ +--# -path=.:../abstract:../common:prelude + +--1 German auxiliary operations. +-- +-- (c) 2002-2006 Aarne Ranta and Harald Hammarström +-- +-- This module contains operations that are needed to make the +-- resource syntax work. To define everything that is needed to +-- implement $Test$, it moreover contains some lexical +-- patterns needed for $Lex$. + +resource ResGer = ParamX ** open Prelude in { + + flags optimize=all ; + +--2 For $Noun$ + +-- These are the standard four-value case and three-value gender. + + param + Case = Nom | Acc | Dat | Gen ; + Gender = Masc | Fem | Neutr ; + +-- Complex $CN$s, like adjectives, have strong and weak forms. + + Adjf = Strong | Weak ; + +-- Gender distinctions are only made in the singular. + + GenNum = GSg Gender | GPl ; + +-- Agreement of $NP$ is a record. + + oper Agr = {g : Gender ; n : Number ; p : Person} ; + +-- Pronouns are the worst-case noun phrases, which have both case +-- and possessive forms. + + param NPForm = NPCase Case | NPPoss GenNum Case ; + +--2 For $Adjective$ + +-- The predicative form of adjectives is not inflected further. + + param AForm = APred | AMod GenNum Case ; + + +--2 For $Verb$ + + param VForm = + VInf Bool -- True = with the particle "zu" + | VFin Bool VFormFin -- True = prefix glued to verb + | VImper Number -- prefix never glued + | VPresPart AForm -- prefix always glued + | VPastPart AForm ; + + param VFormFin = + VPresInd Number Person + | VPresSubj Number Person + | VImpfInd Number Person --# notpresent + | VImpfSubj Number Person --# notpresent + ; + + param VPForm = + VPFinite Mood Tense Anteriority + | VPImperat Bool + | VPInfinit Anteriority ; + + param VAux = VHaben | VSein ; + + param VType = VAct | VRefl Case ; + +-- The order of sentence is depends on whether it is used as a main +-- clause, inverted, or subordinate. + + param + Order = Main | Inv | Sub ; + +-- Main clause mood: "es sei, es wäre, es werde sein". +-- Not relevant for $Fut$. --- + + Mood = MIndic | MConjunct ; + +--2 For $Relative$ + + RAgr = RNoAg | RAg {n : Number ; p : Person} ; + +--2 For $Numeral$ + + CardOrd = NCard Gender Case | NOrd AForm ; + DForm = DUnit | DTeen | DTen ; + +--2 Transformations between parameter types + + oper + agrP3 : Number -> Agr = agrgP3 Neutr ; + + agrgP3 : Gender -> Number -> Agr = \g,n -> + {g = g ; n = n ; p = P3} ; + + gennum : Gender -> Number -> GenNum = \g,n -> + case n of { + Sg => GSg g ; + Pl => GPl + } ; + +-- Needed in $RelativeGer$. + + numGenNum : GenNum -> Number = \gn -> + case gn of { + GSg _ => Sg ; + GPl => Pl + } ; + +-- Used in $NounGer$. + + agrAdj : Gender -> Adjf -> Number -> Case -> AForm = \g,a,n,c -> + let + gn = gennum g n ; + e = AMod (GSg Fem) Nom ; + en = AMod (GSg Masc) Acc ; + in + case a of { + Strong => AMod gn c ; + _ => case of { + => e ; + => en ; + => e ; + _ => en + } + } ; + +-- This is used twice in NounGer. + + adjfCase : Adjf -> Case -> Adjf = \a,c -> case of { + => Strong ; + _ => Weak + } ; + + vFin : Bool -> Mood -> Tense -> Agr -> VForm = \b,m,t,a -> + case of { + => VFin b (VPresInd a.n a.p) ; + => VFin b (VPresSubj a.n a.p) ; + => VFin b (VImpfInd a.n a.p) ; --# notpresent + => VFin b (VImpfSubj a.n a.p) ; --# notpresent + _ => VInf False --- never used + } ; + + conjAgr : Agr -> Agr -> Agr = \a,b -> { + g = Neutr ; ---- + n = conjNumber a.n b.n ; + p = conjPerson a.p b.p + } ; + +-- For $Lex$. + +-- For conciseness and abstraction, we first define a method for +-- generating a case-dependent table from a list of four forms. + + oper + caselist : (x1,_,_,x4 : Str) -> Case => Str = \n,a,d,g -> + table { + Nom => n ; + Acc => a ; + Dat => d ; + Gen => g + } ; + +-- For each lexical category, here are the worst-case constructors and +-- some practical special cases. +-- More paradigms are given in $ParadigmsGer$. + +-- The worst-case constructor for common nouns needs six forms: all plural forms +-- are always the same except for the dative. Actually the six forms are never +-- needed at the same time, but just subsets of them. + + Noun : Type = {s : Number => Case => Str ; g : Gender} ; + + mkN : (x1,_,_,_,_,x6 : Str) -> Gender -> Noun = + \mann, mannen, manne, mannes, maenner, maennern, g -> { + s = table { + Sg => caselist mann mannen manne mannes ; + Pl => caselist maenner maenner maennern maenner + } ; + g = g + } ; + +-- Adjectives need four forms: two for the positive and one for the other degrees. + + Adjective : Type = {s : Degree => AForm => Str} ; + + mkA : (x1,_,_,x4 : Str) -> Adjective = \gut,gute,besser,best -> + {s = table { + Posit => adjForms gut gute ; + Compar => adjForms besser besser ; + Superl => adjForms best best + } + } ; + +-- Verbs need as many as 12 forms, to cover the variations with +-- suffixes "t" and "st". Auxiliaries like "sein" will have to +-- make extra cases even for this. + + Verb : Type = { + s : VForm => Str ; + prefix : Str ; + aux : VAux ; + vtype : VType + } ; + + mkV : (x1,_,_,_,_,_,_,_,_,_,_,x12 : Str) -> Str -> VAux -> Verb = + \geben,gebe,gibst,gibt,gebt,gib, + gab,gabst,gaben,gabt, + gaebe,gegeben,ein,aux -> + let + einb : Bool -> Str -> Str = \b,geb -> + if_then_Str b (ein + geb) geb ; + in + {s = table { + VInf False => ein + geben ; + VInf True => + if_then_Str (isNil ein) ("zu" ++ geben) (ein + "zu" + geben) ; + VFin b vf => einb b (case vf of { + VPresInd Sg P1 => gebe ; + VPresInd Sg P2 => gibst ; + VPresInd Sg P3 => gibt ; + VPresInd Pl P2 => gebt ; + VPresInd Pl _ => geben ; + VImpfInd Sg P2 => gabst ; --# notpresent + VImpfInd Sg _ => gab ; --# notpresent + VImpfInd Pl P2 => gabt ; --# notpresent + VImpfInd Pl _ => gaben ; --# notpresent + VImpfSubj Sg P2 => gaebe + "st" ; --# notpresent + VImpfSubj Sg _ => gaebe ; --# notpresent + VImpfSubj Pl P2 => gaebe + "t" ; --# notpresent + VImpfSubj Pl _ => gaebe + "n" ; --# notpresent + VPresSubj Sg P2 => init geben + "st" ; + VPresSubj Sg _ => init geben ; + VPresSubj Pl P2 => init geben + "t" ; + VPresSubj Pl _ => geben + }) ; + VImper Sg => gib ; + VImper Pl => gebt ; + VPresPart a => ein + (regA (geben + "d")).s ! Posit ! a ; + VPastPart a => ein + (regA gegeben).s ! Posit ! a + } ; + prefix = ein ; + aux = aux ; + vtype = VAct + } ; + +-- To add a prefix (like "ein") to an already existing verb. + + prefixV : Str -> Verb -> Verb = \ein,verb -> + let + vs = verb.s ; + geben = vs ! VInf False ; + einb : Bool -> Str -> Str = \b,geb -> + if_then_Str b (ein + geb) geb ; + in + {s = table { + VInf False => ein + geben ; + VInf True => + if_then_Str (isNil ein) ("zu" ++ geben) (ein + "zu" + geben) ; + VFin b vf => einb b (vs ! VFin b vf) ; + VImper n => vs ! VImper n ; + VPresPart a => ein + (regA (geben + "d")).s ! Posit ! a ; + VPastPart a => ein + vs ! VPastPart a + } ; + prefix = ein ; + aux = verb.aux ; + vtype = verb.vtype + } ; + + +-- These functions cover many regular cases; full coverage inflectional patterns are +-- defined in $MorphoGer$. + + mkN4 : (x1,_,_,x4 : Str) -> Gender -> Noun = \wein,weines,weine,weinen -> + mkN wein wein wein weines weine weinen ; + + regA : Str -> Adjective = \blau -> + mkA blau blau (blau + "er") (blau + "est") ; + + regV : Str -> Verb = \legen -> + let + lege = init legen ; + leg = init lege ; + legt = leg + "t" ; + legte = legt + "e" + in + mkV + legen lege (leg+"st") legt legt leg + legte (legte + "st") (legte + "n") (legte + "t") + legte ("ge" + legt) + [] VHaben ; + +-- Prepositions for complements indicate the complement case. + + Preposition : Type = {s : Str ; c : Case} ; + +-- To apply a preposition to a complement. + + appPrep : Preposition -> (Case => Str) -> Str = \prep,arg -> + prep.s ++ arg ! prep.c ; + +-- To build a preposition from just a case. + + noPreposition : Case -> Preposition = \c -> + {s = [] ; c = c} ; + +-- Pronouns and articles +-- Here we define personal and relative pronouns. +-- All personal pronouns, except "ihr", conform to the simple +-- pattern $mkPronPers$. + + mkPronPers : (x1,_,_,_,x5 : Str) -> Gender -> Number -> Person -> + {s : NPForm => Str ; a : Agr} = + \ich,mich,mir,meiner,mein,g,n,p -> { + s = table { + NPCase c => caselist ich mich mir meiner ! c ; + NPPoss gn c => mein + pronEnding ! gn ! c + } ; + a = {g = g ; n = n ; p = p} + } ; + + pronEnding : GenNum => Case => Str = table { + GSg Masc => caselist "" "en" "em" "es" ; + GSg Fem => caselist "e" "e" "er" "er" ; + GSg Neut => caselist "" "" "em" "es" ; + GPl => caselist "e" "e" "en" "er" + } ; + + artDef : GenNum => Case => Str = table { + GSg Masc => caselist "der" "den" "dem" "des" ; + GSg Fem => caselist "die" "die" "der" "der" ; + GSg Neut => caselist "das" "das" "dem" "des" ; + GPl => caselist "die" "die" "den" "der" + } ; + +-- This is used when forming determiners that are like adjectives. + + appAdj : Adjective -> Number => Gender => Case => Str = \adj -> + let + ad : GenNum -> Case -> Str = \gn,c -> + adj.s ! Posit ! AMod gn c + in + \\n,g,c => case n of { + Sg => ad (GSg g) c ; + _ => ad GPl c + } ; + +-- This auxiliary gives the forms in each degree of adjectives. + + adjForms : (x1,x2 : Str) -> AForm => Str = \teuer,teur -> + table { + APred => teuer ; + AMod (GSg Masc) c => + caselist (teur+"er") (teur+"en") (teur+"em") (teur+"es") ! c ; + AMod (GSg Fem) c => + caselist (teur+"e") (teur+"e") (teur+"er") (teur+"er") ! c ; + AMod (GSg Neut) c => + caselist (teur+"es") (teur+"es") (teur+"em") (teur+"es") ! c ; + AMod GPl c => + caselist (teur+"e") (teur+"e") (teur+"en") (teur+"er") ! c + } ; + +-- For $Verb$. + + VPC : Type = { + s : Bool => Agr => VPForm => { -- True = prefix glued to verb + fin : Str ; -- hat + inf : Str -- wollen + } + } ; + + VP : Type = { + s : Verb ; + a1 : Polarity => Str ; -- nicht + n2 : Agr => Str ; -- dich + a2 : Str ; -- heute + isAux : Bool ; -- is a double infinitive + inf : Str ; -- sagen + ext : Str -- dass sie kommt + } ; + + predV : Verb -> VP = predVGen False ; + + useVP : VP -> VPC = \vp -> + let + isAux = vp.isAux ; + verb = vp.s ; + vfin : Bool -> Mood -> Tense -> Agr -> Str = \b,m,t,a -> + verb.s ! vFin b m t a ; + vinf = verb.s ! VInf False ; + vpart = if_then_Str isAux vinf (verb.s ! VPastPart APred) ; + + vHaben = auxPerfect verb ; + hat : Mood -> Tense -> Agr -> Str = \m,t,a -> + vHaben ! vFin False m t a ; + haben : Str = vHaben ! VInf False ; + + wird : Mood -> Agr -> Str = \m,a -> case m of { + MIndic => werden_V.s ! VFin False (VPresInd a.n a.p) ; + MConjunct => werden_V.s ! VFin False (VPresSubj a.n a.p) + } ; + wuerde : Agr -> Str = \a -> --# notpresent + werden_V.s ! VFin False (VImpfSubj a.n a.p) ; --# notpresent + + auf = verb.prefix ; + + vf : Bool -> Str -> Str -> {fin,inf : Str} = \b,fin,inf -> { + fin = fin ; + inf = if_then_Str b [] auf ++ inf --- negation of main b + } ; + + in { + s = \\b,a => table { + VPFinite m t Simul => case t of { +-- Pres | Past => vf (vfin m t a) [] ; -- the general rule + Past => vf b (vfin b m t a) [] ; --# notpresent + Fut => vf True (wird m a) vinf ; --# notpresent + Cond => vf True (wuerde a) vinf ; --# notpresent + Pres => vf b (vfin b m t a) [] + } ; + VPFinite m t Anter => case t of { --# notpresent + Pres | Past => vf True (hat m t a) vpart ; --# notpresent + Fut => vf True (wird m a) (vpart ++ haben) ; --# notpresent + Cond => vf True (wuerde a) (vpart ++ haben) --# notpresent + } ; --# notpresent + VPImperat False => vf False (verb.s ! VImper a.n) [] ; + VPImperat True => vf False (verb.s ! VFin False (VPresSubj Pl P3)) [] ; + VPInfinit Anter => vf True [] (vpart ++ haben) ; --# notpresent + VPInfinit Simul => vf True [] (verb.s ! VInf b) + } + } ; + + + predVGen : Bool -> Verb -> VP = \isAux, verb -> { + s = { + s = verb.s ; + prefix = verb.prefix ; + aux = verb.aux ; + vtype = verb.vtype + } ; + + a1 : Polarity => Str = negation ; + n2 : Agr => Str = case verb.vtype of { + VAct => \\_ => [] ; + VRefl c => \\a => reflPron ! a ! c + } ; + a2 : Str = [] ; + isAux = isAux ; ---- + inf,ext : Str = [] + } ; + + auxPerfect : Verb -> VForm => Str = \verb -> + case verb.aux of { + VHaben => haben_V.s ; + VSein => sein_V.s + } ; + + haben_V : Verb = + mkV + "haben" "habe" "hast" "hat" "habt" "hab" + "hatte" "hattest" "hatten" "hattet" + "hätte" "gehabt" + [] VHaben ; + + werden_V : Verb = + mkV + "werden" "werde" "wirst" "wird" "werdet" "werd" + "wurde" "wurdest" "wurden" "wurdet" + "würde" "geworden" + [] VSein ; + + werdenPass : Verb = + mkV + "werden" "werde" "wirst" "wird" "werdet" "werd" + "wurde" "wurdest" "wurden" "wurdet" + "würde" "worden" + [] VSein ; + + sein_V : Verb = + let + sein = mkV + "sein" "bin" "bist" "ist" "seid" "sei" + "war" "warst" "waren" "wart" + "wäre" "gewesen" + [] VSein + in + {s = table { + VFin _ (VPresInd Pl (P1 | P3)) => "sind" ; + VFin _ (VPresSubj Sg P2) => (variants {"seiest" ; "seist"}) ; + VFin _ (VPresSubj Sg _) => "sei" ; + VFin _ (VPresSubj Pl P2) => "seiet" ; + VFin _ (VPresSubj Pl _) => "seien" ; + VPresPart a => (regA "seiend").s ! Posit ! a ; + v => sein.s ! v + } ; + prefix = [] ; + aux = VSein ; + vtype = VAct + } ; + + auxVV : Verb -> Verb ** {isAux : Bool} = \v -> v ** {isAux = True} ; + + negation : Polarity => Str = table { + Pos => [] ; + Neg => "nicht" + } ; + +-- Extending a verb phrase with new constituents. + + insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = \\a => obj ! a ++ vp.n2 ! a ; + a2 = vp.a2 ; + isAux = vp.isAux ; + inf = vp.inf ; + ext = vp.ext + } ; + + insertAdV : Str -> VP -> VP = \adv,vp -> { + s = vp.s ; + a1 = \\a => adv ++ vp.a1 ! a ; -- immer nicht + n2 = vp.n2 ; + a2 = vp.a2 ; + isAux = vp.isAux ; + inf = vp.inf ; + ext = vp.ext + } ; + + insertAdv : Str -> VP -> VP = \adv,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = vp.n2 ; + a2 = vp.a2 ++ adv ; + isAux = vp.isAux ; + inf = vp.inf ; + ext = vp.ext + } ; + + insertExtrapos : Str -> VP -> VP = \ext,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = vp.n2 ; + a2 = vp.a2 ; + isAux = vp.isAux ; + inf = vp.inf ; + ext = vp.ext ++ ext + } ; + + insertInf : Str -> VP -> VP = \inf,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = vp.n2 ; + a2 = vp.a2 ; + isAux = vp.isAux ; ---- + inf = inf ++ vp.inf ; + ext = vp.ext + } ; + +-- For $Sentence$. + + Clause : Type = { + s : Mood => Tense => Anteriority => Polarity => Order => Str + } ; + + mkClause : Str -> Agr -> VP -> Clause = \subj,agr,vp -> let vps = useVP vp in { + s = \\m,t,a,b,o => + let + ord = case o of { + Sub => True ; -- glue prefix to verb + _ => False + } ; + verb = vps.s ! ord ! agr ! VPFinite m t a ; + neg = vp.a1 ! b ; + obj = vp.n2 ! agr ; + compl = obj ++ neg ++ vp.a2 ; + inf = vp.inf ++ verb.inf ; + extra = vp.ext ; + inffin = + case of { --# notpresent + => verb.fin ++ inf ; -- double inf --# notpresent + _ => --# notpresent + inf ++ verb.fin --- or just auxiliary vp + } --# notpresent + in + case o of { + Main => subj ++ verb.fin ++ compl ++ inf ++ extra ; + Inv => verb.fin ++ subj ++ compl ++ inf ++ extra ; + Sub => subj ++ compl ++ inffin ++ extra + } + } ; + + infVP : Bool -> VP -> ((Agr => Str) * Str * Str) = \isAux, vp -> let vps = useVP vp in + < + \\agr => vp.n2 ! agr ++ vp.a2, + vp.a1 ! Pos ++ (vps.s ! (notB isAux) ! agrP3 Sg ! VPInfinit Simul).inf, + vp.inf ++ vp.ext + > ; + + useInfVP : Bool -> VP -> Str = \isAux,vp -> + let vpi = infVP isAux vp in + vpi.p1 ! agrP3 Sg ++ vpi.p3 ++ vpi.p2 ; + +-- The nominative case is not used as reflexive, but defined here +-- so that we can reuse this in personal pronouns. +-- The missing Sg "ihrer" shows that a dependence on gender would +-- be needed. + + reflPron : Agr => Case => Str = table { + {n = Sg ; p = P1} => caselist "ich" "mich" "mir" "meiner" ; + {n = Sg ; p = P2} => caselist "du" "dich" "dir" "deiner" ; + {g = Masc ; n = Sg ; p = P3} => caselist "er" "sich" "sich" "seiner" ; + {g = Fem ; n = Sg ; p = P3} => caselist "sie" "sich" "sich" "ihrer" ; + {g = Neutr ; n = Sg ; p = P3} => caselist "es" "sich" "sich" "seiner" ; + {n = Pl ; p = P1} => caselist "wir" "uns" "uns" "unser" ; + {n = Pl ; p = P2} => caselist "ihr" "euch" "euch" "euer" ; + {n = Pl ; p = P3} => caselist "sie" "sich" "sich" "ihrer" + } ; + + conjThat : Str = "daß" ; + + conjThan : Str = "als" ; + +-- The infinitive particle "zu" is used if and only if $vv.isAux = False$. + + infPart : Bool -> Str = \b -> if_then_Str b [] "zu" ; + +} diff --git a/next-lib/src/german/SentenceGer.gf b/next-lib/src/german/SentenceGer.gf new file mode 100644 index 000000000..b79938b1c --- /dev/null +++ b/next-lib/src/german/SentenceGer.gf @@ -0,0 +1,67 @@ +concrete SentenceGer of Sentence = CatGer ** open ResGer, Prelude in { + + flags optimize=all_subs ; + + lin + + PredVP np vp = mkClause (np.s ! Nom) np.a vp ; + + PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ; + + ImpVP vp = let vps = useVP vp in { + s = \\pol,n => + let + ps = case n of { + ImpF _ True => ; -- setzen Sie sich + _ => + } ; + agr = {g = Fem ; n = numImp n ; p = ps.p1} ; --- g does not matter + verb = vps.s ! False ! agr ! VPImperat ps.p3 ; + inf = vp.inf ++ verb.inf ; + in + verb.fin ++ ps.p2 ++ + vp.n2 ! agr ++ vp.a1 ! pol ++ vp.a2 ++ inf ++ vp.ext + } ; + + SlashVP np vp = + mkClause + (np.s ! Nom) np.a + vp ** + {c2 = vp.c2} ; + + AdvSlash slash adv = { + s = \\m,t,a,b,o => slash.s ! m ! t ! a ! b ! o ++ adv.s ; + c2 = slash.c2 + } ; + + SlashPrep cl prep = cl ** {c2 = prep} ; + + SlashVS np vs slash = + mkClause (np.s ! Nom) np.a + (insertExtrapos (conjThat ++ slash.s ! Sub) (predV vs)) ** + {c2 = slash.c2} ; + + EmbedS s = {s = conjThat ++ s.s ! Sub} ; + EmbedQS qs = {s = qs.s ! QIndir} ; + EmbedVP vp = {s = useInfVP False vp} ; + + UseCl t p cl = { + s = \\o => t.s ++ p.s ++ cl.s ! t.m ! t.t ! t.a ! p.p ! o + } ; + UseQCl t p cl = { + s = \\q => t.s ++ p.s ++ cl.s ! t.m ! t.t ! t.a ! p.p ! q + } ; + UseRCl t p cl = { + s = \\r => t.s ++ p.s ++ cl.s ! t.m ! t.t ! t.a ! p.p ! r ; + c = cl.c + } ; + UseSlash t p cl = { + s = \\o => t.s ++ p.s ++ cl.s ! t.m ! t.t ! t.a ! p.p ! o ; + c2 = cl.c2 + } ; + + AdvS a s = {s = \\o => a.s ++ s.s ! Inv} ; + + RelS s r = {s = \\o => s.s ! o ++ "," ++ r.s ! gennum Neutr Sg} ; --- "welches" + +} diff --git a/next-lib/src/german/StructuralGer.gf b/next-lib/src/german/StructuralGer.gf new file mode 100644 index 000000000..6ea52c7b0 --- /dev/null +++ b/next-lib/src/german/StructuralGer.gf @@ -0,0 +1,133 @@ +concrete StructuralGer of Structural = CatGer ** + + open MorphoGer, Prelude in { + + flags optimize=all ; + + lin + + above_Prep = mkPrep "über" Dat ; + after_Prep = mkPrep "nach" Dat ; + all_Predet = {s = appAdj (regA "all")} ; + almost_AdA, almost_AdN = ss "fast" ; + although_Subj = ss "obwohl" ; + always_AdV = ss "immer" ; + and_Conj = {s1 = [] ; s2 = "und" ; n = Pl} ; + because_Subj = ss "weil" ; + before_Prep = mkPrep "vor" Dat ; + behind_Prep = mkPrep "hinter" Dat ; + between_Prep = mkPrep "zwischen" Dat ; + both7and_DConj = sd2 "sowohl" ["als auch"] ** {n = Pl} ; + but_PConj = ss "aber" ; + by8agent_Prep = mkPrep "durch" Acc ; + by8means_Prep = mkPrep "mit" Dat ; + can8know_VV, can_VV = auxVV + (mkV + "können" "kann" "kannst" "kann" "könnt" "könn" + "konnte" "konntest" "konnten" "konntet" + "könnte" "gekonnt" [] + VHaben) ; + during_Prep = mkPrep "während" Gen ; + either7or_DConj = sd2 "entweder" "oder" ** {n = Sg} ; + everybody_NP = nameNounPhrase {s = caselist "jeder" "jeden" "jedem" "jedes"} ; + every_Det = detLikeAdj Sg "jed" ; + everything_NP = nameNounPhrase {s = caselist "alles" "alles" "allem" "alles"} ; + everywhere_Adv = ss "überall" ; + few_Det = detLikeAdj Pl "wenig" ; +---- first_Ord = {s = (regA "erst").s ! Posit} ; + for_Prep = mkPrep "für" Acc ; + from_Prep = mkPrep "aus" Dat ; + he_Pron = mkPronPers "er" "ihn" "ihm" "seiner" "sein" Masc Sg P3 ; + here7to_Adv = ss ["hierher"] ; + here7from_Adv = ss ["hieraus"] ; + here_Adv = ss "hier" ; + how_IAdv = ss "wie" ; + how8many_IDet = detLikeAdj Pl "wieviel" ; + if_Subj = ss "wenn" ; + in8front_Prep = mkPrep "vor" Dat ; + i_Pron = mkPronPers "ich" "mich" "mir" "meiner" "mein" Masc Sg P1 ; + in_Prep = mkPrep "in" Dat ; + it_Pron = mkPronPers "es" "es" "ihm" "seiner" "sein" Neutr Sg P3 ; + less_CAdv = ss "weniger" ; + many_Det = detLikeAdj Pl "viel" ; + more_CAdv = ss "mehr" ; + most_Predet = {s = appAdj (regA "meist")} ; + much_Det = detLikeAdj Sg "viel" ; + must_VV = auxVV + (mkV + "müssen" "muß" "mußt" "muß" "müßt" "müß" + "mußte" "mußtest" "mußten" "mußtet" + "müßte" "gemußt" [] + VHaben) ; +--- one_Quant = DEPREC + only_Predet = {s = \\_,_,_ => "nur"} ; + no_Utt = ss "nein" ; +---b no_Phr = ss "nein" ; + on_Prep = mkPrep "auf" Dat ; + or_Conj = {s1 = [] ; s2 = "oder" ; n = Sg} ; + otherwise_PConj = ss "sonst" ; + part_Prep = mkPrep "von" Dat ; + please_Voc = ss "bitte" ; + possess_Prep = mkPrep "von" Dat ; + quite_Adv = ss "ziemlich" ; + she_Pron = mkPronPers "sie" "sie" "ihr" "ihrer" "ihr" Fem Sg P3 ; + so_AdA = ss "so" ; + somebody_NP = nameNounPhrase {s = caselist "jemand" "jemanden" "jemandem" "jemands"} ; + somePl_Det = detLikeAdj Pl "einig" ; + someSg_Det = { + s,sp = \\g,c => "ein" + pronEnding ! GSg g ! c ; ---- einer,eines + n = Sg ; + a = Strong + } ; + something_NP = nameNounPhrase {s = \\_ => "etwas"} ; + somewhere_Adv = ss "irgendwo" ; + that_Quant = let + jener : Number => Gender => Case => Str = \\n => (detLikeAdj n "jen").s in + {s = \\_ => jener ; sp = jener ; a = Weak} ; +---b that_NP = nameNounPhrase {s = caselist "das" "das" "denem" "dessen"} ; ---- + there_Adv = ss "da" ; + there7to_Adv = ss "dahin" ; + there7from_Adv = ss ["daher"] ; + therefore_PConj = ss "deshalb" ; +---b these_NP = {s = caselist "diese" "diese" "diesen" "dieser" ; a = agrP3 Pl} ; + they_Pron = mkPronPers "sie" "sie" "ihnen" "ihrer" "ihr" Fem Pl P3 ; + this_Quant = let + dieser : Number => Gender => Case => Str = \\n => (detLikeAdj n "dies").s in + {s = \\_ => dieser ; sp = dieser ; a = Weak} ; +---b this_NP = nameNounPhrase {s = caselist "dies" "dies" "diesem" "dieses"} ; ---- +---b those_NP = {s = caselist "jene" "jene" "jenen" "jener" ; a = agrP3 Pl} ; + through_Prep = mkPrep "durch" Acc ; + too_AdA = ss "zu" ; + to_Prep = mkPrep "nach" Dat ; + under_Prep = mkPrep "unter" Dat ; + very_AdA = ss "sehr" ; + want_VV = auxVV + (mkV + "wollen" "will" "willst" "will" "wollt" "woll" + "wollte" "wolltest" "wollten" "wolltet" + "wollte" "gewollt" [] + VHaben) ; + we_Pron = mkPronPers "wir" "uns" "uns" "unser" "unser" Fem Pl P1 ; + + whatSg_IP = {s = caselist "was" "was" "was" "wessen" ; n = Sg} ; ---- + whatPl_IP = {s = caselist "was" "was" "was" "wessen" ; n = Pl} ; ---- + + when_IAdv = ss "wann" ; + when_Subj = ss "wenn" ; + where_IAdv = ss "wo" ; + which_IQuant = {s = \\n => (detLikeAdj n "welch").s} ; + +---b whichPl_IDet = detLikeAdj Pl "welch" ; +---b whichSg_IDet = detLikeAdj Sg "welch" ; + whoSg_IP = {s = caselist "wer" "wen" "wem" "wessen" ; n = Sg} ; + whoPl_IP = {s = caselist "wer" "wen" "wem" "wessen" ; n = Pl} ; + why_IAdv = ss "warum" ; + without_Prep = mkPrep "ohne" Acc ; + with_Prep = mkPrep "mit" Dat ; + youSg_Pron = mkPronPers "du" "dich" "dir" "deiner" "dein" Fem Sg P2 ; + youPl_Pron = mkPronPers "ihr" "euch" "euch" "eurer" "euer" Fem Pl P2 ; ---- poss + youPol_Pron = mkPronPers "Sie" "Sie" "Ihnen" "Ihrer" "Ihr" Fem Pl P3 ; + yes_Utt = ss "ja" ; +---b yes_Phr = ss "ja" ; + +} diff --git a/next-lib/src/german/VerbGer.gf b/next-lib/src/german/VerbGer.gf new file mode 100644 index 000000000..83b7ae9e5 --- /dev/null +++ b/next-lib/src/german/VerbGer.gf @@ -0,0 +1,82 @@ +concrete VerbGer of Verb = CatGer ** open Prelude, ResGer in { + + flags optimize=all_subs ; + + lin + UseV = predV ; + + ComplVV v vp = + let + vpi = infVP v.isAux vp + in + insertExtrapos vpi.p3 ( + insertInf vpi.p2 ( + insertObj vpi.p1 ( + predVGen v.isAux v))) ; + + ComplVS v s = + insertExtrapos (conjThat ++ s.s ! Sub) (predV v) ; + ComplVQ v q = + insertExtrapos (q.s ! QIndir) (predV v) ; + ComplVA v ap = insertObj (\\ _ => ap.s ! APred) (predV v) ; + + SlashV2a v = predV v ** {c2 = v.c2} ; + + Slash2V3 v np = + insertObj (\\_ => appPrep v.c2 np.s) (predV v) ** {c2 = v.c3} ; + Slash3V3 v np = + insertObj (\\_ => appPrep v.c3 np.s) (predV v) ** {c2 = v.c2} ; + + SlashV2S v s = + insertExtrapos (conjThat ++ s.s ! Sub) (predV v) ** {c2 = v.c2} ; + SlashV2Q v q = + insertExtrapos (q.s ! QIndir) (predV v) ** {c2 = v.c2} ; + SlashV2V v vp = + let + vpi = infVP False vp + in + insertExtrapos vpi.p3 ( + insertInf vpi.p2 ( + insertObj vpi.p1 ((predV v)))) ** {c2 = v.c2} ; + + SlashV2A v ap = + insertObj (\\_ => ap.s ! APred) (predV v) ** {c2 = v.c2} ; + + ComplSlash vp np = insertObj (\\_ => appPrep vp.c2 np.s) vp ; + + SlashVV v vp = + let + vpi = infVP v.isAux vp + in + insertExtrapos vpi.p3 ( + insertInf vpi.p2 ( + insertObj vpi.p1 ( + predVGen v.isAux v))) ** {c2 = vp.c2} ; + + SlashV2VNP v np vp = + let + vpi = infVP False vp + in + insertExtrapos vpi.p3 ( + insertInf vpi.p2 ( + insertObj vpi.p1 ( + insertObj (\\_ => appPrep v.c2 np.s) ( + predV v)))) ** {c2 = v.c2} ; + + UseComp comp = insertAdv (comp.s ! agrP3 Sg) (predV sein_V) ; -- agr not used + -- we want to say "ich liebe sie nicht" but not "ich bin alt nicht" + + CompAP ap = {s = \\_ => ap.s ! APred} ; + CompNP np = {s = \\_ => np.s ! Nom} ; + CompAdv a = {s = \\_ => a.s} ; + + AdvVP vp adv = insertAdv adv.s vp ; + AdVVP adv vp = insertAdV adv.s vp ; + + ReflVP vp = insertObj (\\a => appPrep vp.c2 (reflPron ! a)) vp ; + + PassV2 v = insertInf (v.s ! VPastPart APred) (predV werdenPass) ; + +---b UseVS, UseVQ = \v -> v ** {c2 = noPreposition Acc} ; + +}