diff options
| author | aarne <aarne@cs.chalmers.se> | 2008-09-22 11:49:15 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2008-09-22 11:49:15 +0000 |
| commit | 98665df78b8018af30051cb4a9a31f845e0ba19d (patch) | |
| tree | 67ba30b09e2b9590a00a4b193bf7611caa935af8 /next-lib/src/scandinavian/CommonScand.gf | |
| parent | 4862018f140a1bdcc7961d445ed9aa92facd742f (diff) | |
moved lib/next-resource to next-lib/src, to enable linking with next-lib as value of GF_LIB_PATH
Diffstat (limited to 'next-lib/src/scandinavian/CommonScand.gf')
| -rw-r--r-- | next-lib/src/scandinavian/CommonScand.gf | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/next-lib/src/scandinavian/CommonScand.gf b/next-lib/src/scandinavian/CommonScand.gf new file mode 100644 index 000000000..487082305 --- /dev/null +++ b/next-lib/src/scandinavian/CommonScand.gf @@ -0,0 +1,310 @@ +--1 Auxiliary operations common for Scandinavian languages. +-- +-- This module contains operations that are shared by the Scandinavian +-- languages. The complete set of auxiliary operations needed to +-- implement [Test Test.html] is defined in [ResScandinavian ResScandinavian.html], +-- which depends on [DiffScandinavian DiffScandinavian.html]. + +resource CommonScand = ParamX ** open Prelude in { + + flags optimize=all ; + +param + Species = Indef | Def ; + Case = Nom | Gen ; + Voice = Act | Pass ; + + Order = Main | Inv | Sub ; + + DetSpecies = DIndef | DDef Species ; + + GenNum = SgUtr | SgNeutr | Plg ; + + AForm = AF AFormGrad Case ; + + AFormGrad = + APosit AFormPos + | ACompar + | ASuperl AFormSup ; + +-- The $Number$ in $Weak$ only matters in "lilla"/"små". + + AFormPos = Strong GenNum | Weak Number ; + AFormSup = SupStrong | SupWeak ; + + VForm = + VF VFin + | VI VInf ; + + VFin = + VPres Voice + | VPret Voice --# notpresent + | VImper Voice + ; + + VInf = + VInfin Voice + | VSupin Voice --# notpresent + | VPtPret AFormPos Case + ; + + VPForm = + VPFinite Tense Anteriority + | VPImperat + | VPInfinit Anteriority ; + + VType = VAct | VPass | VRefl ; + + NPForm = NPNom | NPAcc | NPPoss GenNum ; +--- AdjPronForm = APron GenNum Case ; +--- AuxVerbForm = AuxInf | AuxPres | AuxPret | AuxSup ; + + RCase = RNom | RGen | RPrep Bool ; + + RAgr = RNoAg | RAg {gn : GenNum ; p : Person} ; + +oper + Complement : Type = {s : Str ; hasPrep : Bool} ; + + Agr : PType = {gn : GenNum ; p : Person} ; + + nominative : NPForm = NPNom ; + accusative : NPForm = NPAcc ; + + caseNP : NPForm -> Case = \np -> case np of { + NPPoss _ => Gen ; + _ => Nom + } ; + + specDet : DetSpecies -> Species = \d -> case d of { + DDef Def => Def ; + _ => Indef + } ; + + mkComplement : Str -> Complement = \s -> { + s = s ; + hasPrep = case s of { + "" => False ; + _ => True + } + } ; +-- Used in $Noun.AdjCN$. + +----- agrAdj : GenNum -> DetSpecies -> AFormPos = \gn,d -> Strong gn ; --- debug + agrAdj : GenNum -> DetSpecies -> AFormPos = \gn,d -> + case <<gn,d> : GenNum * DetSpecies> of { + <_, DIndef> => Strong gn ; + <Plg,DDef _> => Weak Pl ; + _ => Weak Sg + } ; + +-- Used in $DiffScand.predV$. + + vFin : Tense -> Voice -> VForm = \t,v -> case t of { + Pres => VF (VPres v) ; + Past => VF (VPret v) ; --# notpresent + _ => VI (VInfin v) --- not to be used? + } ; + +-- Used in $ConjunctionScand$. + + conjGenNum : (_,_ : GenNum) -> GenNum = \g,h -> case <g,h> of { + <SgUtr,SgUtr> => SgUtr ; + <Plg, _> => Plg ; + <_, Plg> => Plg ; + _ => SgNeutr + } ; + + conjAgr : (_,_ : Agr) -> Agr = \a,b -> { + gn = conjGenNum a.gn b.gn ; + p = conjPerson a.p b.p + } ; + +--- + +-- For $Lex$. + +-- For each lexical category, here are the worst-case constructors. +-- +-- But $mkNoun$ is fully defined only for each language, since +-- $Gender$ varies. + + nounForms : (x1,_,_,x4 : Str) -> (Number => Species => Case => Str) = + \man,mannen,men,mennen -> \\n,d,c => case <n,d> of { + <Sg,Indef> => mkCase c man ; + <Sg,Def> => mkCase c mannen ; + <Pl,Indef> => mkCase c men ; + <Pl,Def> => mkCase c mennen + } ; + + Adjective : Type = {s : AForm => Str} ; + + mkAdjective : (x1,_,_,_,_,_,x7 : Str) -> {s : AForm => Str} = + \liten, litet, lilla, sma, mindre, minst, minsta -> { + s = table { + AF (APosit a) c => mkCase c (mkAdjPos a liten litet lilla sma) ; + AF ACompar c => mkCase c mindre ; + AF (ASuperl SupStrong) c => mkCase c minst ; + AF (ASuperl SupWeak) c => mkCase c minsta + } + } ; + + mkVerb : (x1,_,_,_,_,_,_,x8 : Str) -> {s : VForm => Str ; vtype : VType} = + \finna,finner,finn,fann,funnit,funnen,funnet,funna -> { + s = table { + VF (VPres Act) => finner ; + VF (VPres Pass) => mkVoice Pass finn ; + VF (VPret v) => mkVoice v fann ; --# notpresent + VF (VImper v) => mkVoice v finn ; + VI (VInfin v) => mkVoice v finna ; + VI (VSupin v) => mkVoice v funnit ; --# notpresent + VI (VPtPret a c)=> mkCase c (mkAdjPos a funnen funnet funna funna) + } ; + vtype = VAct + } ; + +-- These are useful auxiliaries. + + mkCase : Case -> Str -> Str = \c,f -> case c of { + Nom => f ; + Gen => f + case last f of { + "s" | "x" => [] ; + _ => "s" + } + } ; + + mkAdjPos : AFormPos -> (s1,_,_,s4 : Str) -> Str = + \a, liten, litet, lilla, sma -> + case a of { + Strong gn => case gn of { + SgUtr => liten ; + SgNeutr => litet ; + Plg => sma + } ; + Weak Sg => lilla ; + Weak Pl => sma + } ; + + mkVoice : Voice -> Str -> Str = \v,s -> case v of { + Act => s ; + Pass => s + case last s of { + "s" => "es" ; + _ => "s" + } + } ; + + +-- For $Noun$. + + artDef : GenNum -> Str = \gn -> gennumForms "den" "det" "de" ! gn ; + + mkNP : (x1,_,_,_,x5 : Str) -> GenNum -> Person -> + {s : NPForm => Str ; a : Agr} = \du,dig,din,ditt,dina,gn,p -> { + s = table { + NPNom => du ; + NPAcc => dig ; + NPPoss g => gennumForms din ditt dina ! g + } ; + a = { + gn = gn ; + p = p + } + } ; + + gennumForms : (x1,x2,x3 : Str) -> GenNum => Str = \den,det,de -> + table { + SgUtr => den ; + SgNeutr => det ; + _ => de + } ; + + regNP : Str -> Str -> GenNum -> {s : NPForm => Str ; a : Agr} = + \det,dess,gn -> + mkNP det det dess dess dess gn P3 ; + + +-- For $Verb$. + + VP = { + s : VPForm => { + fin : Str ; -- V1 har ---s1 + inf : Str -- V2 sagt ---s4 + } ; + a1 : Polarity => Str ; -- A1 inte ---s3 + n2 : Agr => Str ; -- N2 dig ---s5 + a2 : Str ; -- A2 idag ---s6 + ext : Str ; -- S-Ext att hon går ---s7 + --- ea1,ev2, --- these depend on params of v and a1 + en2,ea2,eext : Bool -- indicate if the field exists + } ; + + + insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = \\a => obj ! a ++ vp.n2 ! a ; + a2 = vp.a2 ; + ext = vp.ext ; + en2 = True ; + ea2 = vp.ea2 ; + eext = vp.eext + } ; + + insertObjPost : (Agr => Str) -> VP -> VP = \obj,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = \\a => vp.n2 ! a ++ obj ! a ; + a2 = vp.a2 ; + ext = vp.ext ; + en2 = True ; + ea2 = vp.ea2 ; + eext = vp.eext + } ; + + insertAdv : Str -> VP -> VP = \adv,vp -> { + s = vp.s ; + a1 = vp.a1 ; + n2 = vp.n2 ; + a2 = vp.a2 ++ adv ; + ext = vp.ext ; + en2 = vp.en2 ; + ea2 = True ; + eext = vp.eext + } ; + + insertAdV : Str -> VP -> VP = \adv,vp -> { + s = vp.s ; + a1 = \\b => vp.a1 ! b ++ adv ; + n2 = vp.n2 ; + a2 = vp.a2 ; + ext = vp.ext ; + en2 = vp.en2 ; + ea2 = vp.ea2 ; + eext = vp.eext + } ; + + infVP : VP -> Agr -> Str = \vp,a -> + vp.a1 ! Pos ++ (vp.s ! VPInfinit Simul).inf ++ vp.n2 ! a ++ vp.a2 ++ vp.ext ; --- a1 + + +-- For $Sentence$. + + Clause : Type = { + s : Tense => Anteriority => Polarity => Order => Str + } ; + + mkClause : Str -> Agr -> VP -> Clause = \subj,agr,vp -> { + s = \\t,a,b,o => + let + verb = vp.s ! VPFinite t a ; + neg = vp.a1 ! b ; + compl = vp.n2 ! agr ++ vp.a2 ++ vp.ext + in + case o of { + Main => subj ++ verb.fin ++ neg ++ verb.inf ++ compl ; + Inv => verb.fin ++ subj ++ neg ++ verb.inf ++ compl ; + Sub => subj ++ neg ++ verb.fin ++ verb.inf ++ compl + } + } ; + +} |
