From eb6769c87f48981cabb39b6f50a53cf1b47b3ac1 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Mon, 12 Oct 2026 16:11:21 +0200 Subject: [PATCH] extensions by Codex --- src/norwegian/DiffNor.gf | 1 + src/norwegian/ExtendNor.gf | 412 ++++++++++++++++++++++++++++++++- src/norwegian/IdiomNor.gf | 15 ++ src/norwegian/IrregNor.gf | 10 +- src/norwegian/NumeralNor.gf | 20 ++ src/norwegian/ParadigmsNor.gf | 21 +- src/norwegian/StructuralNor.gf | 12 +- 7 files changed, 478 insertions(+), 13 deletions(-) diff --git a/src/norwegian/DiffNor.gf b/src/norwegian/DiffNor.gf index 0c807c6ac..41b16860a 100644 --- a/src/norwegian/DiffNor.gf +++ b/src/norwegian/DiffNor.gf @@ -16,6 +16,7 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in { neutrum = NNeutr ; detDef : Species = Def ; + artDef : GenNum -> Str = \gn -> gennumForms "den" "det" "de" ! gn ; Verb : Type = { s : VForm => Str ; diff --git a/src/norwegian/ExtendNor.gf b/src/norwegian/ExtendNor.gf index c5b4f33fd..9bbefa47d 100644 --- a/src/norwegian/ExtendNor.gf +++ b/src/norwegian/ExtendNor.gf @@ -14,19 +14,427 @@ concrete ExtendNor of Extend = CatNor ** RNP, RNPList, ReflRNP, ReflPron, ReflPoss, PredetRNP, ConjRNP, Base_rr_RNP, Base_nr_RNP, Base_rn_RNP, Cons_rr_RNP, Cons_nr_RNP, ReflPossPron, CompoundN, CompoundAP, AdvIsNP, + UttAccNP, A2VPSlash, N2VPSlash, CardCNCard, GenRP ] with (Grammar = GrammarNor) - ** open Prelude in { + ** + open CommonScand, ResNor, ParamX, VerbNor, Prelude, DiffNor, StructuralNor, MorphoNor, + NounNor, Coordination, AdjectiveNor, SentenceNor, AdverbNor, RelativeNor, (P = ParadigmsNor) +in { flags coding=utf8 ; -lin CompoundN n1 n2 = { + lin + GenNP np = { + s,sp = \\n,_,_,g => np.s ! NPPoss (gennum (ngen2gen g) n) Nom ; + det = DDef Indef + } ; + + GenModNP num np cn = DetCN (DetQuant (GenNP (lin NP np)) num) cn ; + + ComplBareVS v s = insertObj (\\_ => s.s ! Sub) (predV v) ; + + CompBareCN cn = {s = \\a => case a.n of { + Sg => cn.s ! Sg ! DIndef ! Nom ; + Pl => cn.s ! Pl ! DIndef ! Nom + } + } ; + + StrandRelSlash rp slash = { + s = \\t,a,p,ag,_ => + rp.s ! ag.g ! ag.n ! RNom ++ slash.s ! t ! a ! p ! Sub ++ slash.n3 ! ag ++ slash.c2.s ; + c = NPAcc + } ; + EmptyRelSlash slash = { + s = \\t,a,p,ag,_ => + slash.s ! t ! a ! p ! Sub ++ slash.n3 ! ag ++ slash.c2.s ; + c = NPAcc + } ; + + StrandQuestSlash ip slash = { + s = \\t,a,p => + let + cls = slash.s ! t ! a ! p ; + who = ip.s ! accusative ; + agr = agrP3 ip.g ip.n ; + in table { + QDir => who ++ cls ! Inv ++ slash.n3 ! agr ++ slash.c2.s ; + QIndir => who ++ cls ! Sub ++ slash.n3 ! agr ++ slash.c2.s + } + } ; + + lin + PassVPSlash vps = + insertObj (\\a => vps.c2.s ++ vps.n3 ! a) (passiveVP vps) ; + PassAgentVPSlash vps np = + insertObjPost (\\a => vps.c2.s ++ vps.n3 ! a) (insertObj (\\_ => (PrepNP by8agent_Prep np).s) (passiveVP vps)) ; + ProgrVPSlash vp = + insertObj (\\a => infMark ++ infVP vp a) (predV (P.partV I.holde_V "på")) ** + { n3 = vp.n3 ; + c2 = vp.c2 + } ; + + + N2VPSlash n2 = + let vp : CatNor.VP = UseComp (CompCN (UseN2 n2)) ; + dummyVPS : VPSlash = SlashV2a (P.mkV2 "dummy") ; + in dummyVPS ** -- has necessary fields for VPSlash + vp ** -- has all the right fields except for c2 + {c2 = n2.c2} ; -- has the right c2 + + + + A2VPSlash a2 = + let vp : CatNor.VP = UseComp (CompAP (UseA2 a2)) ; + dummyVPS : VPSlash = SlashV2a (P.mkV2 "dummy") ; + in dummyVPS ** -- has necessary fields for VPSlash + vp ** -- has all the right fields except for c2 + {c2 = a2.c2} ; -- has the right c2 + + + lin UttVPShort vp = {s = infVP vp (agrP3 Utr Sg)} ; + + lincat + VPI = {s : VPIForm => Agr => Str} ; + [VPI] = {s1,s2 : VPIForm => Agr => Str} ; + + lin + BaseVPI = twoTable2 VPIForm Agr ; + ConsVPI = consrTable2 VPIForm Agr comma ; + + MkVPI vp = { + s = \\v,a => infVP vp a ---- no sup + } ; + ConjVPI = conjunctDistrTable2 VPIForm Agr ; + ComplVPIVV vv vpi = insertObj (\\a => vv.c2.s ++ vpi.s ! VPIInf ! a) (predV vv) ; + + lincat + VPS = {s : Order => Agr => {verb, compl : Str}} ; + [VPS] = {s : Order => Agr => {s1, s2, s3 : Str}} ; -- älskar, (jag) dig, (och) är lycklig + + lin + BaseVPS v w = { + s = \\ord, agr => + let + vs = v.s ! ord ! agr ; + ws = w.s ! ord ! agr ; + in { + s1 = vs.verb ; + s2 = vs.compl ; + s3 = ws.verb ++ ws.compl + } + } ; + + ConsVPS v vv = { + s = \\ord, agr => + let + vs = v.s ! ord ! agr ; + vvs = vv.s ! ord ! agr ; + in { + s1 = vs.verb ; + s2 = vs.compl ++ comma ++ vvs.s1 ++ vvs.s2 ; + s3 = vvs.s3 + } + } ; + + ConjVPS conj vv = { + s = \\ord, agr => + let + vvs = vv.s ! ord ! agr + in { + verb = vvs.s1 ; + compl = conj.s1 ++ vvs.s2 ++ conj.s2 ++ vvs.s3 + } + } ; + + PredVPS np vps = + let + subj = np.s ! nominative ; + agr = np.a ; + in { + s = \\o => + let verb = vps.s ! o ! agr + in case o of { + Main => subj ++ verb.verb ++ verb.compl ; + Inv => verb.verb ++ subj ++ verb.compl ; -- älskar jag henne och sover + Sub => subj ++ verb.verb ++ verb.compl --- not quite correct in ConjVPS + } + } ; + + RelVPS rp vps = { + s = \\ag,rcase => + let agr = case rp.a of { -- RP's agr may override in the regular RelativeScand, is this true with VPS too? + RNoAg => ag ; + RAg g n p => {g = g ; n = n ; p = p} + } ; + verb = vps.s ! Sub ! agr + in + rp.s ! ag.g ! ag.n ! rcase ++ verb.verb ++ verb.compl ; + c = NPNom + } ; + + MkVPS t p vp = { + s = \\o,a => + let + verb = vp.s ! Act ! VPFinite t.t t.a ; + neg = verb.a1 ! p.p ! a ; + compl = vp.n2 ! a ++ vp.a2 ++ vp.ext ; + pron = vp.n1 ! a ; + verbf = t.s ++ p.s ++ verb.fin + in + case o of { + Main => {verb = verbf ; compl = neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl} ; + Inv => {verb = verbf ; compl = neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl} ; + Sub => {verb = neg.p1 ++ neg.p2 ++ verbf ; compl = verb.inf ++ pron ++ compl} + } + } ; + + lincat + VPS2 = {s : Order => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ; + [VPS2] = {s1,s2 : Order => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ; + + lin + BaseVPS2 x y = twoTable2 Order Agr x y ** {c2 = y.c2} ; + ConsVPS2 x xs = consrTable2 Order Agr comma x xs ** {c2 = xs.c2}; + + + MkVPS2 t p vp = { + s = \\o,a => + let + verb = vp.s ! Act ! VPFinite t.t t.a ; + neg = verb.a1 ! p.p ! a ; + compl = vp.n2 ! a ++ vp.a2 ++ vp.ext ; + pron = vp.n1 ! a + in t.s ++ p.s ++ case o of { + Main => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ; + Inv => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ; ---- + Sub => neg.p1 ++ neg.p2 ++ verb.fin ++ verb.inf ++ pron ++ compl + } ; + c2 = vp.c2 + } ; + + ComplVPS2 vps2 np = { + s = \\o,a => {verb = vps2.s !o ! a ; compl = vps2.c2.s ++ np.s ! NPAcc} + } ; + ReflVPS2 vps2 rnp = { + s = \\o,a => {verb = vps2.s ! o ! a ; compl = vps2.c2.s ++ rnp.s ! a} + } ; + + ConjVPS2 c xs = conjunctDistrTable2 Order Agr c xs ** {c2 = xs.c2} ; + + lincat + VPI2 = {s : VPIForm => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ; + [VPI2] = {s1,s2 : VPIForm => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ; + + lin + BaseVPI2 x y = twoTable2 VPIForm Agr x y ** {c2 = y.c2} ; + ConsVPI2 x xs = consrTable2 VPIForm Agr comma x xs ** {c2 = xs.c2} ; + + MkVPI2 vp = { + s = \\v,a => infVP vp a ; ---- no sup + c2 = vp.c2 + } ; + ConjVPI2 c xs = conjunctDistrTable2 VPIForm Agr c xs ** {c2 = xs.c2} ; + + ComplVPI2 vpi2 np = { + s = \\t,a => vpi2.s ! t ! a ++ vpi2.c2.s ++ np.s ! NPAcc + } ; + +lincat [Comp] = {s1,s2 : Agr => Str} ; +lin BaseComp x y = twoTable Agr x y ; + ConsComp xs x = consrTable Agr comma xs x ; + ConjComp conj ss = conjunctDistrTable Agr conj ss ; + +lincat ListImp = {s1,s2 : Polarity => Number => Str} ; +lin BaseImp = twoTable2 Polarity Number ; + ConsImp = consrTable2 Polarity Number comma ; + ConjImp conj ss = conjunctDistrTable2 Polarity Number conj ss ; + +----------- + + ICompAP ap = {s = \\a => hur_IAdv.s ++ ap.s ! a} ; + + ProDrop pro = pro ** {s = \\_ => []} ; + + lincat + RNP = {s : Agr => Str ; isPron : Bool} ; ---- inherent Agr needed: han färgar sitt hår vitt. But also depends on subject + RNPList = {s1,s2 : Agr => Str} ; + + lin + ReflRNP vps rnp = + insertObjPost (\\a => vps.n3 ! a) + (insertObjPron (andB rnp.isPron (notB vps.c2.hasPrep)) (\\a => vps.c2.s ++ rnp.s ! a) + vps) ; + + ReflPron = {s = \\a => reflPron a ; isPron = True} ; ---- agr ?? + ReflPoss num cn = { + s = \\a => possPron a.n a.p num.n (ngen2gen cn.g) ++ num.s ! cn.g ++ cn.s ! num.n ! DDef Indef ! Nom ; + isPron = False + } ; + PredetRNP predet rnp = { + s = \\a => predet.s ! Utr ! Pl ++ predet.p ++ rnp.s ! a ; ---- agr needed here as well +---- s = \\a => predet.s ! np.a.g ! np.a.n ++ predet.p ++ np.s ! a ; +---- a = case pred.a of {PAg n => agrP3 np.a.g n ; _ => np.a} ; + isPron = False + } ; + + AdvRNP np prep rnp = {s = \\a => np.s ! NPAcc ++ prep.s ++ rnp.s ! a; isPron = False} ; + AdvRVP vp prep rnp = insertObjPost (\\a => prep.s ++ rnp.s ! a) vp ; + AdvRAP ap prep rnp = { + s = \\a => let agr = case a of { + Strong (GSg g) => agrP3 g Sg ; + Strong GPl => agrP3 Utr Pl ; + Weak n => agrP3 Utr n + } + in ap.s ! a ++ prep.s ++ rnp.s ! agr ; + isPre = ap.isPre + } ; + + ReflA2RNP a rnp = { + s = \\ap => let agr = case ap of { + Strong (GSg g) => agrP3 g Sg ; + Strong GPl => agrP3 Utr Pl ; + Weak n => agrP3 Utr n + } + in a.s ! AF (APosit ap) Nom ++ a.c2.s ++ rnp.s ! agr ; + isPre = False + } ; + + PossPronRNP pron num cn rnp = DetCN (DetQuant (PossPron pron) num) (PossNP cn (lin NP {s = \\_ => rnp.s ! pron.a; a = pron.a; isPron=False})) ; + + ConjRNP conj rpns = conjunctDistrTable Agr conj rpns ** {isPron = False} ; + + Base_rr_RNP x y = twoTable Agr x y ; + Base_nr_RNP x y = twoTable Agr {s = \\a => x.s ! NPAcc} y ; + Base_rn_RNP x y = twoTable Agr x {s = \\a => y.s ! NPAcc} ; + Cons_rr_RNP x xs = consrTable Agr comma x xs ; + Cons_nr_RNP x xs = consrTable Agr comma {s = \\a => x.s ! NPAcc} xs ; + + ReflPossPron = { + s,sp = table { + Sg => \\_,_ => genderForms "sin" "sitt" ; + Pl => \\_,_,_ => "sine" + } ; + det = DIndef + } ; + + lin + ApposNP np1 np2 = {s = \\nform => np1.s ! nform ++ comma ++ np2.s ! nform; a = np1.a; isPron = False} ; + + DetNPMasc, DetNPFem = \det -> + let + g = utrum ; ---- + m = True ; ---- is this needed for other than Art? + in { + s = \\c => det.sp ! m ! g ; ---- case of det! + a = agrP3 (ngen2gen g) det.n ; + isPron = False + } ; + + CompoundN n1 n2 = { s = \\n,s,c => n1.co ++ BIND ++ n2.s ! n ! s ! c ; co = n1.co ++ BIND ++ n2.co ; g = n2.g } ; + CompoundAP noun adj = { + s = \\ap => noun.co ++ BIND ++ adj.s ! AF (APosit ap) Nom ; + isPre = True + } ; + + lin + AdAdV = cc2 ; + + PositAdVAdj a = {s = a.s ! AAdv} ; + + PresPartAP vp = { + s = \\af => case vp.isSimple of { + True => partVPPlus vp (PartPres Sg Indef Nom) (aformpos2agr af) Pos ; + False => partVPPlusPost vp (PartPres Sg Indef Nom) (aformpos2agr af) Pos + } ; + isPre = vp.isSimple + } ; + + PastPartAP vp = { + s = \\af => let vp' = vp**{n2 : Agr => Str =\\a => vp.n2 ! a ++ vp.n3 ! a} + in case vp.isSimple of { + True => partVPPlus vp' (PartPret af Nom) (aformpos2agr af) Pos ; + False => partVPPlusPost vp' (PartPret af Nom) (aformpos2agr af) Pos + } ; + isPre = vp.isSimple + } ; + + PastPartAgentAP vp np = { + s = \\af => let vp' = vp**{n2 : Agr => Str =\\a => vp.n2 ! a ++ vp.n3 ! a} + in partVPPlusPost vp' (PartPret af Nom) (aformpos2agr af) Pos ++ "av" ++ np.s ! accusative ; + isPre = False + } ; + + GerundCN vp = { + s = \\_,_,_ => infMark ++ infVP vp {g = Utr ; n = Sg ; p = P3} ; + g = neutrum ; + isMod = False + } ; + + GerundNP vp = { + s = \\_ => infMark ++ infVP vp {g = Utr ; n = Sg ; p = P3} ; + a = {g = Neutr ; n = Sg ; p = P3} ; + isPron = False + } ; + + GerundAdv vp = { + s = partVPPlusPost vp (PartPres Sg Indef (Nom|Gen)) {g = Utr ; n = Sg ; p = P3} Pos -- sovande(s) i sängen + } ; + + ByVP vp = { + s = "ved" ++ infMark ++ infVP vp {g = Utr ; n = Sg ; p = P3} + } ; + + InOrderToVP vp = { + s = "for" ++ infMark ++ infVP vp {g = Utr ; n = Sg ; p = P3} + } ; + + AdvIsNP adv np = PredVP {s = \\_ => adv.s ; a = np.a ; isPron = False} (UseComp (CompNP np)) ; + + EmbedSSlash ss = {s = "det" ++ ss.s ! Main ++ ss.c2.s ++ ss.n3 ! agrUSgP3} ; + + UttAccNP np = {s = np.s ! NPAcc} ; + +lin UseDAP dap = + let + g = neutrum ; ---- + m = True ; ---- is this needed for other than Art? + in { + s = table { + NPPoss _ _ => dap.sp ! m ! g ++ BIND ++ "s" ; + _ => dap.sp ! m ! g + } ; + a = agrP3 (ngen2gen g) dap.n ; + isPron = False + } ; + +lin UseDAPMasc, UseDAPFem = \dap -> + let + g = utrum ; ---- + m = True ; ---- is this needed for other than Art? + in { + s = table { + NPPoss _ _ => dap.sp ! m ! g ++ BIND ++ "s" ; + _ => dap.sp ! m ! g + } ; + a = agrP3 (ngen2gen g) dap.n ; + isPron = False + } ; + +lin CardCNCard card cn = + {s = \\g => card.s ! cn.g ++ cn.s ! card.n ! DIndef ! Nom ; n = Pl} ; + + GenRP num cn = { + s = \\g_,n,c => "hvis" ++ cn.s ! num.n ! DDef Indef ! Nom ; --- c ? + a = RAg (ngen2gen cn.g) num.n P3 + } ; + } diff --git a/src/norwegian/IdiomNor.gf b/src/norwegian/IdiomNor.gf index 415219709..ac58dd4d1 100644 --- a/src/norwegian/IdiomNor.gf +++ b/src/norwegian/IdiomNor.gf @@ -31,6 +31,21 @@ concrete IdiomNor of Idiom = CatNor ** } } ; + ExistNPAdv np adv = + mkClause "det" (agrP3 Neutr Sg) (insertObj + (\\_ => np.s ! accusative ++ adv.s) (predV (depV finne_V))) ; + + ExistIPAdv ip adv = { + s = \\t,a,p => + let cls = (mkClause "det" (agrP3 Neutr Sg) + (insertAdv adv.s (predV (depV finne_V)))).s ! t ! a ! p ; + who = ip.s ! accusative + in table { + QDir => who ++ cls ! Inv ; + QIndir => who ++ cls ! Sub + } + } ; + ProgrVP vp = insertObj (\\a => ["ved å"] ++ infVP vp a) (predV verbBe) ; diff --git a/src/norwegian/IrregNor.gf b/src/norwegian/IrregNor.gf index 87a376c94..1cd4bc4f6 100644 --- a/src/norwegian/IrregNor.gf +++ b/src/norwegian/IrregNor.gf @@ -13,7 +13,7 @@ concrete IrregNor of IrregNorAbs = CatNor ** open ParadigmsNor in { --- lin bli_V = irregV "bli" (variants {"ble" ; "blei"}) "blitt" ; lin brenne_V = irregV "brenne" (variants {"brant" ; "brente"}) "brent" ; lin bringe_V = irregV "bringe" "brakte" "brakt" ; - lin burde_V = irregV "burde" "burde" "burdet" ; + lin burde_V = mkV "burde" "bør" "bør" "burde" "burdet" "burde" ; lin bære_V = irregV "bære" "bar" "båret" ; lin dra_V = mkV "dra" "drar" "dras" "drog" (variants {"dradd" ; "dratt"}) "dra" ; lin drikke_V = irregV "drikke" "drakk" "drukket" ; @@ -41,12 +41,12 @@ concrete IrregNor of IrregNorAbs = CatNor ** open ParadigmsNor in { lin hjelpe_V = irregV "hjelpe" "hjalp" "hjulpet" ; lin holde_V = irregV "holde" "holdt" "holdt" ; lin komme_V = irregV "komme" "kom" "kommet" ; - lin kunne_V = irregV "kunne" "kunne" "kunnet" ; + lin kunne_V = mkV "kunne" "kan" "kan" "kunne" "kunnet" "kunne" ; lin la_V = irregV "la" "lot" "latt" ; lin legge_V = irregV "legge" "la" "lagt" ; lin ligge_V = irregV "ligge" "lå" "ligget" ; lin løpe_V = irregV "løpe" "løp" (variants {"løpt" ; "løpet"}) ; - lin måtte_V = irregV "måtte" "måtte" "måttet" ; + lin måtte_V = mkV "måtte" "må" "må" "måtte" "måttet" "måtte" ; lin renne_V = irregV "renne" "rant" "rent" ; lin se_V = mkV "se" "ser" "ses" "så" "sett" "se" ; lin selge_V = irregV "selge" "solgte" "solgt" ; @@ -55,7 +55,7 @@ concrete IrregNor of IrregNorAbs = CatNor ** open ParadigmsNor in { lin sitte_V = irregV "sitte" "satt" "sittet" ; lin skjære_V = irregV "skjære" "skar" "skåret" ; lin skrive_V = irregV "skrive" "skrev" "skrevet" ; - lin skulle_V = irregV "skulle" "skulle" "skullet" ; + lin skulle_V = mkV "skulle" "skal" "skal" "skulle" "skullet" "skulle" ; lin slå_V = irregV "slå" "slo" "slått" ; lin slåss_V = mkV "slåss" "slåss" "slåss" "sloss" "slåss" "slåss" ; lin sove_V = irregV "sove" "sov" "sovet" ; @@ -69,6 +69,6 @@ concrete IrregNor of IrregNorAbs = CatNor ** open ParadigmsNor in { lin ta_V = irregV "ta" "tok" "tatt" ; lin treffe_V = irregV "treffe" "traff" "truffet" ; lin trives_V = irregV "trives" "trivdes" (variants {"trives" ; "trivs"}) ; - lin ville_V = irregV "ville" "ville" "villet" ; + lin ville_V = mkV "ville" "vil" "vil" "ville" "villet" "ville" ; lin vite_V = mkV "vite" "vet" "vetes" "visste" "visst" "vit" ; } diff --git a/src/norwegian/NumeralNor.gf b/src/norwegian/NumeralNor.gf index fb66dc3f2..830dabb4f 100644 --- a/src/norwegian/NumeralNor.gf +++ b/src/norwegian/NumeralNor.gf @@ -34,19 +34,39 @@ lin pot1 d = numPl (d.s ! tiotal) ; pot1plus d e = {s = \\g => d.s ! tiotal ! invNum ++ e.s ! ental ! g ; n = Pl} ; pot1as2 n = n ; + pot21 = numPl (cardOrd "hundre" "hundrede") ; pot2 d = numPl (\\g => d.s ! ental ! invNum ++ cardOrd "hundre" "hundrede" ! g) ; pot2plus d e = {s = \\g => d.s ! ental ! invNum ++ "hundre" ++ "og" ++ e.s ! g ; n = Pl} ; pot2as3 n = n ; + pot31 = numPl (cardOrd "tusen" "tusende") ; pot3 n = numPl (\\g => n.s ! invNum ++ cardOrd "tusen" "tusende" ! g) ; pot3plus n m = {s = \\g => n.s ! invNum ++ "tusen" ++ "og" ++ m.s ! g ; n = Pl} ; pot3as4 n = n ; + + pot41 = numPl (cardOrd "en million" "millionte") ; + pot4 n = numPl (\\g => n.s ! NCard masc ++ + cardOrd (case n.n of {Sg => "million" ; Pl => "millioner"}) "millionte" ! g) ; + pot4plus n m = { + s = \\g => n.s ! NCard masc ++ case n.n of {Sg => "million" ; Pl => "millioner"} ++ m.s ! g ; + n = Pl + } ; + pot4decimal d = numPl (\\g => d.s ! NCard masc ++ cardOrd "millioner" "millionte" ! g) ; pot4as5 n = n ; + pot51 = numPl (cardOrd "en milliard" "milliardte") ; + pot5 n = numPl (\\g => n.s ! NCard masc ++ + cardOrd (case n.n of {Sg => "milliard" ; Pl => "milliarder"}) "milliardte" ! g) ; + pot5plus n m = { + s = \\g => n.s ! NCard masc ++ case n.n of {Sg => "milliard" ; Pl => "milliarder"} ++ m.s ! g ; + n = Pl + } ; + pot5decimal d = numPl (\\g => d.s ! NCard masc ++ cardOrd "milliarder" "milliardte" ! g) ; + -- Numerals from sequences of digits. lincat diff --git a/src/norwegian/ParadigmsNor.gf b/src/norwegian/ParadigmsNor.gf index bf948cf3e..26aaf9a72 100644 --- a/src/norwegian/ParadigmsNor.gf +++ b/src/norwegian/ParadigmsNor.gf @@ -372,11 +372,22 @@ oper mkA2 a p = a ** {c2 = mkComplement p.s ; lock_A2 = <>} ; mkADeg a b c d e = mkAdject a b c d e ** {isComp = False ; lock_A = <>} ; - regADeg a = case Predef.dp 2 a of { - "ig" => aBillig a ; - "sk" => aRask a ; - _ => aRod a - } ** {isComp = False ; lock_A = <>} ; + regADeg a = case a of { + -- These endings already contain the positive-form inflection. Applying + -- the productive -t/-e suffixes generated forms such as *levendee. + _ + "ende" => mkAdject a a a a a ** + {isComp = True ; lock_A = <>} ; + _ + "e" => mkAdject a a a (a + "re") (a + "st") ** + {isComp = False ; lock_A = <>} ; + _ => case Predef.dp 2 a of { + "ig" => aBillig a ** {isComp = False ; lock_A = <>} ; + "sk" => aRask a ** {isComp = False ; lock_A = <>} ; + _ => case last a of { + "t" => aAbstrakt a ** {isComp = False ; lock_A = <>} ; + _ => aRod a ** {isComp = False ; lock_A = <>} + } + } + } ; irregADeg a b c = mkAdject a (a + "t") (a + "e") b c ** {isComp = False ; lock_A = <>} ; mk3ADeg a b c = mkAdject a b c (a + "ere") (a + "est") ** diff --git a/src/norwegian/StructuralNor.gf b/src/norwegian/StructuralNor.gf index 2e024ecb9..73f9dd3dc 100644 --- a/src/norwegian/StructuralNor.gf +++ b/src/norwegian/StructuralNor.gf @@ -11,6 +11,8 @@ concrete StructuralNor of Structural = CatNor ** all_Predet = {s = detForms "all" "alt" "alle" ; p = [] ; a = PNoAg} ; almost_AdA, almost_AdN = ss "nesten" ; although_Subj = ss ["selv om"] ; + as_CAdv = X.mkCAdv "like" "som" ; + at_least_AdN = ss "minst" ; always_AdV = ss "altid" ; and_Conj = {s1 = [] ; s2 = "og" ; n = Pl ; isDiscont = False} ; because_Subj = ss "fordi" ; @@ -55,6 +57,13 @@ concrete StructuralNor of Structural = CatNor ** mkV "måtte" "må" "må" "måtte" "måttet" "mått" ** {c2 = mkComplement [] ; lock_VV = <>} ; no_Utt = ss ["nei"] ; + no_Quant = + {s,sp = table { + Sg => \\_,_ => genderForms "ingen" "intet" ; + Pl => \\_,_,_ => "ingen" + } ; + det = DIndef + } ; on_Prep = ss "på" ; only_Predet = {s = \\_,_ => "kun" ; p = [] ; a = PNoAg} ; @@ -78,11 +87,12 @@ concrete StructuralNor of Structural = CatNor ** } ; det = DDef Def } ; + that_Subj = ss "at" ; there_Adv = ss "der" ; there7to_Adv = ss "dit" ; there7from_Adv = ss "derfra" ; therefore_PConj = ss "derfor" ; - they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Utr Pl P1 ; + they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Utr Pl P3 ; this_Quant = {s,sp = table { Sg => \\_,_ => genderForms ["denne"] ["dette"] ;