summaryrefslogtreecommitdiff
path: root/next-lib/src/danish/MorphoDan.gf
diff options
context:
space:
mode:
Diffstat (limited to 'next-lib/src/danish/MorphoDan.gf')
-rw-r--r--next-lib/src/danish/MorphoDan.gf164
1 files changed, 164 insertions, 0 deletions
diff --git a/next-lib/src/danish/MorphoDan.gf b/next-lib/src/danish/MorphoDan.gf
new file mode 100644
index 000000000..a5ee90a48
--- /dev/null
+++ b/next-lib/src/danish/MorphoDan.gf
@@ -0,0 +1,164 @@
+--1 A Simple Danish Resource Morphology
+--
+-- Aarne Ranta 2002
+--
+-- This resource morphology contains definitions needed in the resource
+-- syntax. It moreover contains copies of the most usual inflectional patterns
+-- as defined in functional morphology (in the Haskell file $RulesSw.hs$).
+--
+-- We use the parameter types and word classes defined for morphology.
+
+resource MorphoDan = CommonScand, ResDan ** open Prelude, Predef in {
+
+oper
+
+-- type synonyms
+
+ Subst : Type = {s : Number => Species => Case => Str} ;
+ Adj = Adjective ;
+
+-- nouns
+
+ mkSubstantive : (_,_,_,_ : Str) -> Subst =
+ \dreng, drengen, drenger, drengene ->
+ {s = nounForms dreng drengen drenger drengene} ;
+
+ extNGen : Str -> Gender = \s -> case last s of {
+ "n" => Utr ;
+ _ => Neutr
+ } ;
+
+ nDreng : Str -> Subst = \dreng ->
+ mkSubstantive dreng (dreng + "en") (dreng + "e") (dreng + "ene") **
+ {h1 = Utr} ;
+
+ nBil : Str -> Subst = \bil ->
+ mkSubstantive bil (bil + "en") (bil + "er") (bil + "erne") **
+ {h1 = Utr} ;
+
+ nUge : Str -> Subst = \uge ->
+ mkSubstantive uge (uge + "n") (uge + "r") (uge + "rne") **
+ {h1 = Utr} ;
+
+ nHus : Str -> Subst = \hus ->
+ mkSubstantive hus (hus + "et") hus (hus + "ene") **
+ {h1 = Neutr} ;
+
+-- adjectives
+
+ mkAdject : (_,_,_,_,_ : Str) -> Adj =
+ \stor,stort,store,storre,storst -> {s = table {
+ AF (APosit (Strong SgUtr )) c => mkCase c stor ;
+ AF (APosit (Strong SgNeutr)) c => mkCase c stort ;
+ AF (APosit _) c => mkCase c store ;
+ AF ACompar c => mkCase c storre ;
+ AF (ASuperl SupStrong) c => mkCase c storst ;
+ AF (ASuperl SupWeak) c => mkCase c (storst + "e")
+ }
+ } ;
+
+ aRod : Str -> Adj = \rod ->
+ mkAdject rod (rod + "t") (rod + "e") (rod + "ere") (rod + "est") ;
+
+ aAbstrakt : Str -> Adj = \abstrakt ->
+ mkAdject abstrakt abstrakt (abstrakt + "e") (abstrakt + "ere") (abstrakt + "est") ;
+
+ aRask : Str -> Adj = \rask ->
+ mkAdject rask rask (rask + "e") (rask + "ere") (rask + "est") ;
+
+
+-- verbs
+
+ Verbum : Type = {s : VForm => Str} ;
+
+ mkVerb6 : (_,_,_,_,_,_ : Str) -> Verbum =
+ \spise,spiser,spises,spiste,spist,spis -> {s = table {
+ VI (VInfin v) => mkVoice v spise ;
+ VF (VPres Act) => spiser ;
+ VF (VPres Pass) => spises ;
+ VF (VPret v) => mkVoice v spiste ; --# notpresent
+ VI (VSupin v) => mkVoice v spist ; --# notpresent
+ VI (VPtPret (Strong (SgUtr | SgNeutr)) c) => mkCase c spist ;
+ VI (VPtPret _ c) => mkCase c (spist + "e") ;
+ VF (VImper v) => mkVoice v spis
+ }
+ } ;
+
+ irregVerb : (drikke,drakk,drukket : Str) -> Verbum =
+ \drikke,drakk,drukket ->
+ let
+ drikk = init drikke ;
+ drikker = case last (init drikke) of {
+ "r" => drikk ;
+ _ => drikke + "r"
+ }
+ in
+ mkVerb6 drikke drikker (drikke + "s") drakk drukket (mkImper drikk) ;
+
+ regVerb : Str -> Str -> Verbum = \spise, spiste ->
+ let
+ spis = init spise ;
+ te = Predef.dp 2 spiste
+ in
+ case te of {
+ "te" => vSpis spis ;
+ "de" => case last spise of {
+ "e" => vHusk spis ;
+ _ => vBo spise
+ } ;
+ _ => vHusk spis
+ } ;
+
+ vHusk : Str -> Verbum = \husk ->
+ mkVerb6 (husk + "e") (husk + "er") (husk + "es") (husk + "ede") (husk + "et")
+ (mkImper husk) ;
+
+ vSpis : Str -> Verbum = \spis ->
+ mkVerb6 (spis + "e") (spis + "er") (spis + "es") (spis + "te") (spis + "t")
+ (mkImper spis) ;
+
+ vBo : Str -> Verbum = \bo ->
+ mkVerb6 bo (bo + "r") (bo + "es") (bo + "ede") (bo + "et") (mkImper bo) ;
+
+-- Remove consonant duplication: "passe - pas"
+
+ mkImper : Str -> Str = \s ->
+ if_then_Str (pbool2bool (Predef.eqStr (last s) (last (init s)))) (init s) s ;
+
+-- For $Numeral$.
+
+param DForm = ental | ton | tiotal ;
+
+oper
+ LinDigit = {s : DForm => CardOrd => Str} ;
+
+ cardOrd : Str -> Str -> CardOrd => Str = \tre,tredje ->
+ table {
+ NCard _ => tre ;
+ NOrd a => tredje ---- a
+ } ;
+
+ cardReg : Str -> CardOrd => Str = \syv ->
+ cardOrd syv (syv + case last syv of {
+ "n" => "de" ;
+ "e" => "nde" ;
+ _ => "ende"
+ }) ;
+
+
+ mkTal : (x1,_,_,_,x5 : Str) -> LinDigit =
+ \två, tolv, tjugo, andra, tyvende ->
+ {s = table {
+ ental => cardOrd två andra ;
+ ton => cardReg tolv ;
+ tiotal => cardOrd tjugo tyvende
+ }
+ } ;
+
+ numPl : (CardOrd => Str) -> {s : CardOrd => Str ; n : Number} = \n ->
+ {s = n ; n = Pl} ;
+
+ invNum : CardOrd = NCard Neutr ;
+
+
+}