diff --git a/lib/src/danish/DiffDan.gf b/lib/src/danish/DiffDan.gf index 0973cedb1..7b0401e9b 100644 --- a/lib/src/danish/DiffDan.gf +++ b/lib/src/danish/DiffDan.gf @@ -2,20 +2,12 @@ instance DiffDan of DiffScand = open CommonScand, Prelude in { -- Parameters. - param - Gender = Utr | Neutr ; - oper + NGender = Gender ; + ngen2gen g = g ; utrum = Utr ; neutrum = Neutr ; - gennum : Gender -> Number -> GenNum = \g,n -> - case < : Gender * Number> of { - => SgUtr ; - => SgNeutr ; - _ => Plg - } ; - detDef : Species = Indef ; Verb : Type = { @@ -37,7 +29,7 @@ instance DiffDan of DiffScand = open CommonScand, Prelude in { subjIf = "hvis" ; - artIndef : Gender => Str = table { + artIndef : NGender => Str = table { Utr => "en" ; Neutr => "et" } ; @@ -62,26 +54,26 @@ instance DiffDan of DiffScand = open CommonScand, Prelude in { Neg => "ikke" } ; - genderForms : (x1,x2 : Str) -> Gender => Str = \all,allt -> + genderForms : (x1,x2 : Str) -> NGender => Str = \all,allt -> table { Utr => all ; Neutr => allt } ; - relPron : GenNum => RCase => Str = \\gn,c => case c of { + relPron : Gender => Number => RCase => Str = \\g,n,c => case c of { RNom | RPrep False => "som" ; RGen => "hvis" ; - RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gn + RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gennum g n } ; pronSuch = gennumForms "sådan" "sådant" "sådanne" ; - reflPron : Agr -> Str = \a -> case a of { - {gn = Plg ; p = P1} => "oss" ; - {gn = Plg ; p = P2} => "jer" ; - {p = P1} => "mig" ; - {p = P2} => "dig" ; - {p = P3} => "sig" + reflPron : Agr -> Str = \a -> case of { + => "os" ; + => "jer" ; + => "mig" ; + => "dig" ; + <_, P3> => "sig" } ; } diff --git a/lib/src/danish/IdiomDan.gf b/lib/src/danish/IdiomDan.gf index 91c46af12..dd0bee9f7 100644 --- a/lib/src/danish/IdiomDan.gf +++ b/lib/src/danish/IdiomDan.gf @@ -32,7 +32,7 @@ concrete IdiomDan of Idiom = CatDan ** ProgrVP vp = insertObj (\\a => ["ved å"] ++ infVP vp a) (predV verbBe) ; - ImpPl1 vp = {s = ["lad os"] ++ infVP vp {gn = Plg ; p = P1}} ; + ImpPl1 vp = {s = ["lad os"] ++ infVP vp {g = Utr ; n = Pl ; p = P1}} ; } diff --git a/lib/src/danish/MorphoDan.gf b/lib/src/danish/MorphoDan.gf index a5ee90a48..4b2af88a9 100644 --- a/lib/src/danish/MorphoDan.gf +++ b/lib/src/danish/MorphoDan.gf @@ -78,7 +78,7 @@ oper 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 (Strong (GSg _)) c) => mkCase c spist ; VI (VPtPret _ c) => mkCase c (spist + "e") ; VF (VImper v) => mkVoice v spis } diff --git a/lib/src/danish/StructuralDan.gf b/lib/src/danish/StructuralDan.gf index 0eca266c7..3d328f729 100644 --- a/lib/src/danish/StructuralDan.gf +++ b/lib/src/danish/StructuralDan.gf @@ -7,7 +7,7 @@ concrete StructuralDan of Structural = CatDan ** above_Prep = ss "ovenfor" ; after_Prep = ss "efter" ; by8agent_Prep = ss "af" ; - all_Predet = {s = gennumForms "all" "alt" "alle"} ; + all_Predet = {s = detForms "all" "alt" "alle" ; p = [] ; a = PNoAg} ; almost_AdA, almost_AdN = ss "næsten" ; although_Subj = ss ["selv om"] ; always_AdV = ss "altid" ; @@ -24,15 +24,15 @@ concrete StructuralDan of Structural = CatDan ** {c2 = mkComplement [] ; lock_VV = <>} ; during_Prep = ss "under" ; either7or_DConj = sd2 "enten" "eller" ** {n = Sg} ; - everybody_NP = regNP "alle" "alles" Plg ; + everybody_NP = regNP "alle" "alles" Utr Pl ; every_Det = {s = \\_,_ => "hver" ; sp = \\_,_ => "enhver" ; n = Sg ; det = DDef Indef} ; - everything_NP = regNP "alt" "alts" SgNeutr ; + everything_NP = regNP "alt" "alts" Neutr Sg ; everywhere_Adv = ss "overalt" ; few_Det = {s,sp = \\_,_ => "få" ; n = Pl ; det = DDef Indef} ; --- first_Ord = {s = "første" ; isDet = True} ; for_Prep = ss "for" ; from_Prep = ss "fra" ; - he_Pron = MorphoDan.mkNP "han" "ham" "hans" "hans" "hans" SgUtr P3 ; + he_Pron = MorphoDan.mkNP "han" "ham" "hans" "hans" "hans" Utr Sg P3 ; here_Adv = ss "her" ; here7to_Adv = ss "hit" ; here7from_Adv = ss "herfra" ; @@ -41,32 +41,32 @@ concrete StructuralDan of Structural = CatDan ** if_Subj = ss "hvis" ; in8front_Prep = ss "foran" ; i_Pron = - MorphoDan.mkNP "jeg" "mig" "min" "mit" "mine" SgUtr P1 ; + MorphoDan.mkNP "jeg" "mig" "min" "mit" "mine" Utr Sg P1 ; in_Prep = ss "i" ; - it_Pron = MorphoDan.regNP "det" "dets" SgNeutr ; + it_Pron = MorphoDan.regNP "det" "dets" Neutr Sg ; less_CAdv = X.mkCAdv "mindre" conjThan ; many_Det = {s,sp = \\_,_ => "mange" ; n = Pl ; det = DDef Indef} ; more_CAdv = X.mkCAdv "mer" conjThan ; - most_Predet = {s = gennumForms ["den meste"] ["det meste"] ["de fleste"]} ; + most_Predet = {s = detForms ["den meste"] ["det meste"] ["de fleste"] ; p = [] ; a = PNoAg} ; much_Det = {s,sp = \\_,_ => "meget" ; n = Pl ; det = DDef Indef} ; must_VV = mkV "måtte" "må" "må" "måtte" "måttet" "mått" ** {c2 = mkComplement [] ; lock_VV = <>} ; no_Utt = ss ["nej"] ; on_Prep = ss "på" ; - only_Predet = {s = \\_ => "kun"} ; + only_Predet = {s = \\_,_ => "kun" ; p = [] ; a = PNoAg} ; or_Conj = {s1 = [] ; s2 = "eller" ; n = Pl} ; otherwise_PConj = ss "anderledes" ; part_Prep = ss "af" ; please_Voc = ss "tak" ; --- possess_Prep = ss "af" ; quite_Adv = ss "temmelig" ; - she_Pron = MorphoDan.mkNP "hun" "hende" "hendes" "hendes" "hendes" SgUtr P3 ; + she_Pron = MorphoDan.mkNP "hun" "hende" "hendes" "hendes" "hendes" Utr Sg P3 ; so_AdA = ss "så" ; someSg_Det = {s,sp = \\_ => genderForms "nogen" "noget" ; n = Sg ; det = DIndef} ; somePl_Det = {s,sp = \\_,_ => "nogle" ; n = Pl ; det = DIndef} ; - somebody_NP = regNP "nogen" "nogens" SgUtr ; - something_NP = regNP "noget" "nogets" SgNeutr ; + somebody_NP = regNP "nogen" "nogens" Utr Sg ; + something_NP = regNP "noget" "nogets" Neutr Sg ; somewhere_Adv = ss ["et eller annet sted"] ; ---- ? that_Quant = {s,sp = table { @@ -79,7 +79,7 @@ concrete StructuralDan of Structural = CatDan ** there7to_Adv = ss "dit" ; there7from_Adv = ss "derfra" ; therefore_PConj = ss "derfor" ; - they_Pron = MorphoDan.mkNP "de" "dem" "deres" "deres" "deres" Plg P1 ; + they_Pron = MorphoDan.mkNP "de" "dem" "deres" "deres" "deres" Utr Pl P1 ; this_Quant = {s,sp = table { Sg => \\_,_ => genderForms ["denne"] ["dette"] ; @@ -95,9 +95,9 @@ concrete StructuralDan of Structural = CatDan ** want_VV = mkV "ville" "vil" "vil" "ville" "villet" "villed" ** {c2 = mkComplement [] ; lock_VV = <>} ; - we_Pron = MorphoDan.mkNP "vi" "os" "vores" "vores" "vores" Plg P1 ; - whatSg_IP = {s = \\_ => "hvad" ; gn = SgUtr} ; ---- infl - whatPl_IP = {s = \\_ => "hvilke" ; gn = Plg} ; ---- infl + we_Pron = MorphoDan.mkNP "vi" "os" "vores" "vores" "vores" Utr Pl P1 ; + whatSg_IP = {s = \\_ => "hvad" ; g = Utr ; n = Sg} ; ---- infl + whatPl_IP = {s = \\_ => "hvilke" ; g = Utr ; n = Pl} ; ---- infl when_IAdv = ss "hvornår" ; when_Subj = ss "når" ; where_IAdv = ss "hver" ; @@ -108,22 +108,22 @@ concrete StructuralDan of Structural = CatDan ** } ; det = DIndef } ; - whoSg_IP = {s = vem.s ; gn = SgUtr} ; - whoPl_IP = {s = \\_ => "hvilke" ; gn = Plg} ; + whoSg_IP = {s = vem.s ; g = Utr ; n = Sg} ; + whoPl_IP = {s = \\_ => "hvilke" ; g = Utr ; n = Pl} ; why_IAdv = ss "hvorfor" ; without_Prep = ss "uden" ; with_Prep = ss "med" ; yes_Utt = ss ["ja"] ; youSg_Pron = - MorphoDan.mkNP "du" "dig" "din" "dit" "dine" SgUtr P2 ; ---- - youPl_Pron = MorphoDan.mkNP "i" "jer" "jeres" "jeres" "jeres" Plg P2 ; - youPol_Pron = MorphoDan.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" SgUtr P2 ; --- wrong in refl + MorphoDan.mkNP "du" "dig" "din" "dit" "dine" Utr Sg P2 ; ---- + youPl_Pron = MorphoDan.mkNP "i" "jer" "jeres" "jeres" "jeres" Utr Pl P2 ; + youPol_Pron = MorphoDan.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" Utr Sg P2 ; --- wrong in refl have_V2 = dirV2 have_V ; -- Auxiliaries that are used repeatedly. oper - vem = MorphoDan.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" SgUtr P3 ; + vem = MorphoDan.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" Utr Sg P3 ; lin language_title_Utt = ss "dansk" ; diff --git a/lib/src/norwegian/DiffNor.gf b/lib/src/norwegian/DiffNor.gf index 6cfdf6fa4..b8ccefd70 100644 --- a/lib/src/norwegian/DiffNor.gf +++ b/lib/src/norwegian/DiffNor.gf @@ -2,20 +2,18 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in { -- Parameters. + oper + NGender = NGenderNor ; + + ngen2gen g = case g of {NUtr _ => Utr ; NNeutr => Neutr} ; + param - Gender = Utr Sex | Neutr ; + NGenderNor = NUtr Sex | NNeutr ; Sex = Masc | Fem ; oper - utrum = Utr Masc ; - neutrum = Neutr ; - - gennum : Gender -> Number -> GenNum = \g,n -> - case < : Gender * Number> of { - => SgUtr ; - => SgNeutr ; - _ => Plg - } ; + utrum = NUtr Masc ; + neutrum = NNeutr ; detDef : Species = Def ; @@ -38,10 +36,10 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in { subjIf = "hvis" ; - artIndef : Gender => Str = table { - Utr Masc => "en" ; - Utr Fem => "ei" ; - Neutr => "et" + artIndef : NGender => Str = table { + NUtr Masc => "en" ; + NUtr Fem => "ei" ; + NNeutr => "et" } ; detIndefPl = "noen" ; @@ -66,26 +64,26 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in { Neg => "ikke" } ; - genderForms : (x1,x2 : Str) -> Gender => Str = \all,allt -> + genderForms : (x1,x2 : Str) -> NGender => Str = \all,allt -> table { - Utr _ => all ; - Neutr => allt + NUtr _ => all ; + NNeutr => allt } ; - relPron : GenNum => RCase => Str = \\gn,c => case c of { + relPron : Gender => Number => RCase => Str = \\g,n,c => case c of { RNom | RPrep False => "som" ; RGen => "hvis" ; - RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gn + RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gennum g n } ; pronSuch = gennumForms "sådan" "sådant" "sådanne" ; - reflPron : Agr -> Str = \a -> case a of { - {gn = Plg ; p = P1} => "oss" ; - {gn = Plg ; p = P2} => "jer" ; - {p = P1} => "meg" ; - {p = P2} => "deg" ; - {p = P3} => "seg" + reflPron : Agr -> Str = \a -> case of { + => "oss" ; + => "jer" ; + => "meg" ; + => "deg" ; + <_, P3> => "seg" } ; } diff --git a/lib/src/norwegian/ExtraNor.gf b/lib/src/norwegian/ExtraNor.gf index 1cfd1008b..6bcd7a19a 100644 --- a/lib/src/norwegian/ExtraNor.gf +++ b/lib/src/norwegian/ExtraNor.gf @@ -2,7 +2,7 @@ concrete ExtraNor of ExtraNorAbs = ExtraScandNor ** open CommonScand, ResNor in lin PossNP np pro = { - s = \\c => np.s ! NPNom ++ pro.s ! NPPoss np.a.gn ; ---- c + s = \\c => np.s ! NPNom ++ pro.s ! NPPoss (gennumAgr np.a) ; ---- c a = np.a } ; } diff --git a/lib/src/norwegian/IdiomNor.gf b/lib/src/norwegian/IdiomNor.gf index 998d8fa8d..b9c9dfdfe 100644 --- a/lib/src/norwegian/IdiomNor.gf +++ b/lib/src/norwegian/IdiomNor.gf @@ -5,24 +5,24 @@ concrete IdiomNor of Idiom = CatNor ** lin - ImpersCl vp = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) vp ; - GenericCl vp = mkClause "man" (agrP3 utrum Sg) vp ; + ImpersCl vp = mkClause "det" (agrP3 Neutr Sg) vp ; + GenericCl vp = mkClause "man" (agrP3 Utr Sg) vp ; - CleftNP np rs = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) + CleftNP np rs = mkClause "det" (agrP3 Neutr Sg) (insertObj (\\_ => np.s ! rs.c ++ rs.s ! np.a) (predV verbBe)) ; - CleftAdv ad s = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) + CleftAdv ad s = mkClause "det" (agrP3 Neutr Sg) (insertObj (\\_ => ad.s ++ s.s ! Sub) (predV verbBe)) ; ExistNP np = - mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) (insertObj + mkClause "det" (agrP3 Neutr Sg) (insertObj (\\_ => np.s ! accusative) (predV (depV finne_V))) ; ExistIP ip = { s = \\t,a,p => let cls = - (mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) (predV (depV finne_V))).s ! t ! a ! p ; + (mkClause "det" (agrP3 Neutr Sg) (predV (depV finne_V))).s ! t ! a ! p ; who = ip.s ! accusative in table { QDir => who ++ cls ! Inv ; @@ -33,7 +33,7 @@ concrete IdiomNor of Idiom = CatNor ** ProgrVP vp = insertObj (\\a => ["ved å"] ++ infVP vp a) (predV verbBe) ; - ImpPl1 vp = {s = ["lat oss"] ++ infVP vp {gn = Plg ; p = P1}} ; + ImpPl1 vp = {s = ["lat oss"] ++ infVP vp {g = Utr ; n = Pl ; p = P1}} ; } diff --git a/lib/src/norwegian/MorphoNor.gf b/lib/src/norwegian/MorphoNor.gf index 13a87125a..f7f37d7ae 100644 --- a/lib/src/norwegian/MorphoNor.gf +++ b/lib/src/norwegian/MorphoNor.gf @@ -13,9 +13,9 @@ resource MorphoNor = CommonScand, ResNor ** open Prelude, Predef in { -- genders oper - masc = Utr Masc ; - fem = Utr Fem ; - neutr = Neutr ; + masc = NUtr Masc ; + fem = NUtr Fem ; + neutr = NNeutr ; -- type synonyms @@ -28,10 +28,10 @@ oper \dreng, drengen, drenger, drengene -> {s = nounForms dreng drengen drenger drengene} ; - extNGen : Str -> Gender = \s -> case last s of { - "n" => Utr Masc ; - "a" => Utr Fem ; - _ => Neutr + extNGen : Str -> NGender = \s -> case last s of { + "n" => masc ; + "a" => fem ; + _ => neutr } ; nBil : Str -> Subst = \bil -> @@ -57,8 +57,8 @@ oper 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 (Strong (GSg Utr ))) c => mkCase c stor ; + AF (APosit (Strong (GSg Neutr))) c => mkCase c stort ; AF (APosit _) c => mkCase c store ; AF ACompar c => mkCase c storre ; AF (ASuperl SupStrong) c => mkCase c storst ; @@ -89,7 +89,7 @@ oper 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 (Strong (GSg _)) c) => mkCase c spist ; VI (VPtPret _ c) => case last spist of { "a" => mkCase c spist ; _ => mkCase c (spist + "e") @@ -165,7 +165,7 @@ oper numPl : (CardOrd => Str) -> {s : CardOrd => Str ; n : Number} = \n -> {s = n ; n = Pl} ; - invNum : CardOrd = NCard Neutr ; + invNum : CardOrd = NCard NNeutr ; } diff --git a/lib/src/norwegian/NumeralNor.gf b/lib/src/norwegian/NumeralNor.gf index 0d0a6e907..b6e293dbb 100644 --- a/lib/src/norwegian/NumeralNor.gf +++ b/lib/src/norwegian/NumeralNor.gf @@ -20,7 +20,7 @@ lin pot01 = { s = \\f => table { - NCard g => case g of {Neutr => "ett" ; _ => "en"} ; + NCard g => case g of {NNeutr => "ett" ; NUtr _ => "en"} ; ---- ei ? _ => "første" } ; n = Sg diff --git a/lib/src/norwegian/ParadigmsNor.gf b/lib/src/norwegian/ParadigmsNor.gf index 67ad4d8d2..9917de38a 100644 --- a/lib/src/norwegian/ParadigmsNor.gf +++ b/lib/src/norwegian/ParadigmsNor.gf @@ -272,12 +272,12 @@ oper -- The definitions should not bother the user of the API. So they are -- hidden from the document. - Gender = MorphoNor.Gender ; + Gender = MorphoNor.NGender ; Number = MorphoNor.Number ; Case = MorphoNor.Case ; - masculine = Utr Masc ; - feminine = Utr Fem ; - neutrum = Neutr ; + masculine = NUtr Masc ; + feminine = NUtr Fem ; + neutrum = NNeutr ; singular = Sg ; plural = Pl ; nominative = Nom ; @@ -287,21 +287,21 @@ oper regN x = regGenN x g where { g = case of { - _ + "e" => Utr Fem ; - _ => Utr Masc + _ + "e" => fem ; + _ => masc } } ; regGenN x g = case last x of { "e" => case g of { - Utr Masc => mk4N x (x + "n") (x + "r") (x + "ne") ; - Utr Fem => mk4N x (init x + "a") (x + "r") (x + "ne") ; - Neutr => mk4N x (x + "t") (x + "r") (init x + "a") + NUtr Masc => mk4N x (x + "n") (x + "r") (x + "ne") ; + NUtr Fem => mk4N x (init x + "a") (x + "r") (x + "ne") ; + NNeutr => mk4N x (x + "t") (x + "r") (init x + "a") } ; _ => case g of { - Utr Masc => mk4N x (x + "en") (x + "er") (x + "ene") ; - Utr Fem => mk4N x (x + "a") (x + "er") (x + "ene") ; - Neutr => mk4N x (x + "et") (x + "") (x + "a") + NUtr Masc => mk4N x (x + "en") (x + "er") (x + "ene") ; + NUtr Fem => mk4N x (x + "a") (x + "er") (x + "ene") ; + NNeutr => mk4N x (x + "et") (x + "") (x + "a") } } ; @@ -316,16 +316,16 @@ oper regN2 n g = mkN2 (regGenN n g) (mkPrep "av") ; mkN3 = \n,p,q -> n ** {lock_N3 = <> ; c2 = mkComplement p.s ; c3 = mkComplement q.s} ; - regGenPN n g = {s = \\c => mkCase c n ; g = g} ** {lock_PN = <>} ; + regGenPN n g = {s = \\c => mkCase c n ; g = ngen2gen g} ** {lock_PN = <>} ; regPN n = regGenPN n utrum ; - nounPN n = {s = n.s ! singular ! Indef ; g = n.g ; lock_PN = <>} ; + nounPN n = {s = n.s ! singular ! Indef ; g = ngen2gen n.g ; lock_PN = <>} ; -- To form a noun phrase that can also be plural and have an irregular -- genitive, you can use the worst-case function. makeNP : Str -> Str -> Number -> Gender -> NP ; makeNP x y n g = - {s = table {NPPoss _ => x ; _ => y} ; a = agrP3 g n ; + {s = table {NPPoss _ => x ; _ => y} ; a = agrP3 (ngen2gen g) n ; lock_NP = <>} ; mk3A = mk3ADeg ; ---- (mkAdject a b c [] []) ** {isComp = False ; lock_A = <>} ; diff --git a/lib/src/norwegian/StructuralNor.gf b/lib/src/norwegian/StructuralNor.gf index 314c362eb..25ef457a8 100644 --- a/lib/src/norwegian/StructuralNor.gf +++ b/lib/src/norwegian/StructuralNor.gf @@ -7,7 +7,7 @@ concrete StructuralNor of Structural = CatNor ** above_Prep = ss "ovenfor" ; after_Prep = ss "etter" ; by8agent_Prep = ss "av" ; - all_Predet = {s = gennumForms "all" "alt" "alle"} ; + all_Predet = {s = detForms "all" "alt" "alle" ; p = [] ; a = PNoAg} ; almost_AdA, almost_AdN = ss "nesten" ; although_Subj = ss ["selv om"] ; always_AdV = ss "altid" ; @@ -24,15 +24,15 @@ concrete StructuralNor of Structural = CatNor ** {c2 = mkComplement [] ; lock_VV = <>} ; during_Prep = ss "under" ; either7or_DConj = sd2 "enten" "eller" ** {n = Sg} ; - everybody_NP = regNP "alle" "alles" Plg ; + everybody_NP = regNP "alle" "alles" Utr Pl ; every_Det = {s = \\_,_ => "hver" ; sp = \\_,_ =>"enhver" ; n = Sg ; det = DDef Indef} ; - everything_NP = regNP "alt" "alts" SgNeutr ; + everything_NP = regNP "alt" "alts" Neutr Sg ; everywhere_Adv = ss "overalt" ; few_Det = {s,sp = \\_,_ => "få" ; n = Pl ; det = DDef Indef} ; --- first_Ord = {s = "første" ; isDet = True} ; DEPREC for_Prep = ss "for" ; from_Prep = ss "fra" ; - he_Pron = MorphoNor.mkNP "han" "ham" "hans" "hans" "hans" SgUtr P3 ; + he_Pron = MorphoNor.mkNP "han" "ham" "hans" "hans" "hans" Utr Sg P3 ; here_Adv = ss "her" ; here7to_Adv = ss "hit" ; here7from_Adv = ss "herfra" ; @@ -41,33 +41,33 @@ concrete StructuralNor of Structural = CatNor ** if_Subj = ss "hvis" ; in8front_Prep = ss "foran" ; i_Pron = - MorphoNor.mkNP "jeg" "meg" (variants {"min" ; "mi"}) "mit" "mine" SgUtr P1 ; --- mi + MorphoNor.mkNP "jeg" "meg" (variants {"min" ; "mi"}) "mit" "mine" Utr Sg P1 ; --- mi in_Prep = ss "i" ; - it_Pron = MorphoNor.regNP "det" "dets" SgNeutr ; + it_Pron = MorphoNor.regNP "det" "dets" Neutr Sg ; less_CAdv = X.mkCAdv "mindre" conjThan ; many_Det = {s,sp = \\_,_ => "mange" ; n = Pl ; det = DDef Indef} ; more_CAdv = X.mkCAdv "mer" conjThan ; - most_Predet = {s = gennumForms ["den meste"] ["det meste"] ["de fleste"]} ; + most_Predet = {s = detForms ["den meste"] ["det meste"] ["de fleste"] ; p = [] ; a = PNoAg} ; much_Det = {s,sp = \\_,_ => "mye" ; n = Pl ; det = DDef Indef} ; must_VV = mkV "måtte" "må" "må" "måtte" "måttet" "mått" ** {c2 = mkComplement [] ; lock_VV = <>} ; no_Utt = ss ["nei"] ; on_Prep = ss "på" ; ---- one_Quant = {s = \\_ => genderForms ["en"] ["et"] ; n = Sg ; det = DIndef} ; DEPREC - only_Predet = {s = \\_ => "kun"} ; + + only_Predet = {s = \\_,_ => "kun" ; p = [] ; a = PNoAg} ; or_Conj = {s1 = [] ; s2 = "eller" ; n = Pl} ; otherwise_PConj = ss "annarledes" ; part_Prep = ss "av" ; please_Voc = ss "takk" ; --- possess_Prep = ss "av" ; quite_Adv = ss "temmelig" ; - she_Pron = MorphoNor.mkNP "hun" "henne" "hennes" "hennes" "hennes" SgUtr P3 ; + she_Pron = MorphoNor.mkNP "hun" "henne" "hennes" "hennes" "hennes" Utr Sg P3 ; so_AdA = ss "så" ; someSg_Det = {s,sp = \\_ => genderForms "noen" "noe" ; n = Sg ; det = DIndef} ; somePl_Det = {s,sp = \\_,_ => "noen" ; n = Pl ; det = DIndef} ; - somebody_NP = regNP "noen" "noens" SgUtr ; - something_NP = regNP "noe" "noes" SgNeutr ; + somebody_NP = regNP "noen" "noens" Utr Sg ; + something_NP = regNP "noe" "noes" Neutr Sg ; somewhere_Adv = ss ["et eller annet sted"] ; ---- ? that_Quant = {s,sp = table { @@ -80,7 +80,7 @@ concrete StructuralNor of Structural = CatNor ** there7to_Adv = ss "dit" ; there7from_Adv = ss "derfra" ; therefore_PConj = ss "derfor" ; - they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Plg P1 ; + they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Utr Pl P1 ; this_Quant = {s,sp = table { Sg => \\_,_ => genderForms ["denne"] ["dette"] ; @@ -96,9 +96,9 @@ concrete StructuralNor of Structural = CatNor ** want_VV = mkV "ville" "vil" "vill" "ville" "villet" "villed" ** {c2 = mkComplement [] ; lock_VV = <>} ; - we_Pron = MorphoNor.mkNP "vi" "oss" "vår" "vårt" "våre" Plg P1 ; - whatSg_IP = {s = \\_ => "hva" ; gn = SgUtr} ; ---- infl - whatPl_IP = {s = \\_ => "hva" ; gn = Plg} ; ---- infl + we_Pron = MorphoNor.mkNP "vi" "oss" "vår" "vårt" "våre" Utr Pl P1 ; + whatSg_IP = {s = \\_ => "hva" ; g = Neutr ; n = Sg} ; ---- infl + whatPl_IP = {s = \\_ => "hva" ; g = Neutr ; n = Pl} ; ---- infl when_IAdv = ss "når" ; when_Subj = ss "når" ; where_IAdv = ss "hver" ; @@ -109,22 +109,22 @@ concrete StructuralNor of Structural = CatNor ** } ; det = DIndef } ; - whoSg_IP = {s = vem.s ; gn = SgUtr} ; - whoPl_IP = {s = \\_ => "hvilke" ; gn = Plg} ; + whoSg_IP = {s = vem.s ; g = Utr ; n = Sg} ; + whoPl_IP = {s = \\_ => "hvilke" ; g = Utr ; n = Pl} ; why_IAdv = ss "hvorfor" ; without_Prep = ss "uten" ; with_Prep = ss "med" ; yes_Utt = ss ["ja"] ; youSg_Pron = - MorphoNor.mkNP "du" "deg" (variants {"din" ; "di"}) "dit" "dine" SgUtr P2 ; ---- - youPl_Pron = MorphoNor.mkNP "dere" "dere" "deres" "deres" "deres" Plg P2 ; - youPol_Pron = MorphoNor.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" SgUtr P2 ; --- wrong in refl + MorphoNor.mkNP "du" "deg" (variants {"din" ; "di"}) "dit" "dine" Utr Sg P2 ; ---- + youPl_Pron = MorphoNor.mkNP "dere" "dere" "deres" "deres" "deres" Utr Pl P2 ; + youPol_Pron = MorphoNor.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" Utr Sg P2 ; --- wrong in refl have_V2 = dirV2 IrregNor.ha_V ; -- Auxiliaries that are used repeatedly. oper - vem = MorphoNor.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" SgUtr P3 ; + vem = MorphoNor.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" Utr Sg P3 ; lin language_title_Utt = ss "norsk" ; diff --git a/lib/src/scandinavian/AdjectiveScand.gf b/lib/src/scandinavian/AdjectiveScand.gf index f6243e4a5..59580d135 100644 --- a/lib/src/scandinavian/AdjectiveScand.gf +++ b/lib/src/scandinavian/AdjectiveScand.gf @@ -40,7 +40,7 @@ incomplete concrete AdjectiveScand of Adjective = ReflA2 a = { s = \\ap => a.s ! AF (APosit ap) Nom ++ a.c2.s ++ - reflPron (agrP3 utrum Sg) ; ---- + reflPron (agrP3 Utr Sg) ; ---- isPre = False } ; diff --git a/lib/src/scandinavian/AdverbScand.gf b/lib/src/scandinavian/AdverbScand.gf index ba25954ef..6d44ae63f 100644 --- a/lib/src/scandinavian/AdverbScand.gf +++ b/lib/src/scandinavian/AdverbScand.gf @@ -22,6 +22,6 @@ incomplete concrete AdverbScand of Adverb = CatScand ** open CommonScand, ResSca AdnCAdv cadv = {s = cadv.s ++ conjThan} ; oper - adverbForm : AForm = AF (APosit (Strong SgNeutr)) Nom ; + adverbForm : AForm = AF (APosit (Strong (GSg Neutr))) Nom ; } diff --git a/lib/src/scandinavian/CatScand.gf b/lib/src/scandinavian/CatScand.gf index 6b9b34b47..6839ef2bf 100644 --- a/lib/src/scandinavian/CatScand.gf +++ b/lib/src/scandinavian/CatScand.gf @@ -25,15 +25,15 @@ incomplete concrete CatScand of Cat = -- Question QCl = {s : R.Tense => Anteriority => Polarity => QForm => Str} ; - IP = {s : NPForm => Str ; gn : GenNum} ; + IP = {s : NPForm => Str ; g : Gender ; n : Number} ; IComp = {s : AFormPos => Str} ; - IDet = {s : Gender => Str ; n : Number ; det : DetSpecies} ; - IQuant = {s : Number => Gender => Str ; det : DetSpecies} ; + IDet = {s : NGender => Str ; n : Number ; det : DetSpecies} ; + IQuant = {s : Number => NGender => Str ; det : DetSpecies} ; -- Relative; the case $c$ is for "det" clefts. RCl = {s : R.Tense => Anteriority => Polarity => Agr => Str ; c : NPForm} ; - RP = {s : GenNum => RCase => Str ; a : RAgr} ; + RP = {s : Gender => Number => RCase => Str ; a : RAgr} ; -- Verb @@ -66,13 +66,13 @@ incomplete concrete CatScand of Cat = -- permits treating definite articles "huset - de fem husen - det gamla huset" -- as $Quant$. - CN = {s : Number => DetSpecies => Case => Str ; g : Gender ; isMod : Bool} ; + CN = {s : Number => DetSpecies => Case => Str ; g : NGender ; isMod : Bool} ; NP,Pron = {s : NPForm => Str ; a : Agr} ; - Det = {s,sp : Bool => Gender => Str ; n : Number ; det : DetSpecies} ; - Quant = {s,sp : Number => Bool => Bool => Gender => Str ; det : DetSpecies} ; - Predet = {s : GenNum => Str} ; - Num = {s : Gender => Str ; isDet : Bool ; n : Number} ; - Card = {s : Gender => Str ; n : Number} ; + Det = {s,sp : Bool => NGender => Str ; n : Number ; det : DetSpecies} ; + Quant = {s,sp : Number => Bool => Bool => NGender => Str ; det : DetSpecies} ; + Predet = {s : Gender => Number => Str ; p : Str ; a : PredetAgr} ; + Num = {s : NGender => Str ; isDet : Bool ; n : Number} ; + Card = {s : NGender => Str ; n : Number} ; Ord = {s : Str} ; -- Numeral diff --git a/lib/src/scandinavian/CommonScand.gf b/lib/src/scandinavian/CommonScand.gf index aa1220338..e860518a6 100644 --- a/lib/src/scandinavian/CommonScand.gf +++ b/lib/src/scandinavian/CommonScand.gf @@ -1,9 +1,7 @@ --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]. +-- languages, without dependence on parameters. resource CommonScand = ParamX ** open Prelude in { @@ -14,11 +12,23 @@ param Case = Nom | Gen ; Voice = Act | Pass ; +-- The principal word orders in predication: main clause, inverted, subordinate. + Order = Main | Inv | Sub ; +-- The types of noun definiteness required by determiners. Examples: +-- "ett stort hus" (DIndef), "mitt stora hus" (DDef Indef), +-- "det stora huset" (DDed Def). + DetSpecies = DIndef | DDef Species ; - GenNum = SgUtr | SgNeutr | Plg ; +-- These are the gender-number combinations needed for adjective inflection, +-- minimizing the number of forms in the lexicon: there is no gender dependency +-- in the plural, and only two genders in the singular even in Norwegian. + + GenNum = GSg Gender | GPl ; + + Gender = Utr | Neutr ; AForm = AF AFormGrad Case ; @@ -56,17 +66,17 @@ param 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} ; + RAgr = RNoAg | RAg Gender Number Person ; + + PredetAgr = PNoAg | PAg Number ; oper Complement : Type = {s : Str ; hasPrep : Bool} ; - Agr : PType = {gn : GenNum ; p : Person} ; + Agr : PType = {g : Gender ; n : Number ; p : Person} ; nominative : NPForm = NPNom ; accusative : NPForm = NPAcc ; @@ -88,16 +98,27 @@ oper _ => True } } ; + -- Used in $Noun.AdjCN$. ------ agrAdj : GenNum -> DetSpecies -> AFormPos = \gn,d -> Strong gn ; --- debug + agrAdjNP : Agr -> DetSpecies -> AFormPos = \a -> + agrAdj (gennumAgr a) ; + agrAdj : GenNum -> DetSpecies -> AFormPos = \gn,d -> case < : GenNum * DetSpecies> of { <_, DIndef> => Strong gn ; - => Weak Pl ; + => Weak Pl ; _ => Weak Sg } ; + gennum : Gender -> Number -> GenNum = \g,n -> + case n of { + Sg => GSg g ; + Pl => GPl + } ; + + gennumAgr : Agr -> GenNum = \a -> gennum a.g a.n ; + -- Used in $DiffScand.predV$. vFin : Tense -> Voice -> VForm = \t,v -> case t of { @@ -109,16 +130,15 @@ oper -- Used in $ConjunctionScand$. - conjGenNum : (_,_ : GenNum) -> GenNum = \g,h -> case of { - => SgUtr ; - => Plg ; - <_, Plg> => Plg ; - _ => SgNeutr + conjGender : Gender -> Gender -> Gender = \g,h -> case g of { + Utr => h ; + _ => Neutr } ; conjAgr : (_,_ : Agr) -> Agr = \a,b -> { - gn = conjGenNum a.gn b.gn ; - p = conjPerson a.p b.p + g = conjGender a.g b.g ; + n = conjNumber a.n b.n ; + p = conjPerson a.p b.p } ; --- @@ -178,9 +198,9 @@ oper \a, liten, litet, lilla, sma -> case a of { Strong gn => case gn of { - SgUtr => liten ; - SgNeutr => litet ; - Plg => sma + GSg Utr => liten ; + GSg Neutr => litet ; + GPl => sma } ; Weak Sg => lilla ; Weak Pl => sma @@ -199,29 +219,33 @@ oper 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 -> { + mkNP : (x1,_,_,_,x5 : Str) -> Gender -> Number -> Person -> + {s : NPForm => Str ; a : Agr} = \du,dig,din,ditt,dina,g,n,p -> { s = table { NPNom => du ; NPAcc => dig ; - NPPoss g => gennumForms din ditt dina ! g + NPPoss h => gennumForms din ditt dina ! h } ; a = { - gn = gn ; - p = p + g = g ; + n = n ; + p = p } } ; gennumForms : (x1,x2,x3 : Str) -> GenNum => Str = \den,det,de -> table { - SgUtr => den ; - SgNeutr => det ; + GSg Utr => den ; + GSg Neutr => det ; _ => de } ; - regNP : Str -> Str -> GenNum -> {s : NPForm => Str ; a : Agr} = - \det,dess,gn -> - mkNP det det dess dess dess gn P3 ; + detForms : (x1,x2,x3 : Str) -> Gender => Number => Str = \den,det,de -> + \\g,n => gennumForms den det de ! gennum g n ; + + regNP : Str -> Str -> Gender -> Number -> {s : NPForm => Str ; a : Agr} = + \det,dess,g,n -> + mkNP det det dess dess dess g n P3 ; -- For $Verb$. diff --git a/lib/src/scandinavian/ConjunctionScand.gf b/lib/src/scandinavian/ConjunctionScand.gf index 6a85a74cb..7f63d7f6b 100644 --- a/lib/src/scandinavian/ConjunctionScand.gf +++ b/lib/src/scandinavian/ConjunctionScand.gf @@ -10,7 +10,7 @@ incomplete concrete ConjunctionScand of Conjunction = ConjAdv conj ss = conjunctDistrSS conj ss ; ConjNP conj ss = conjunctDistrTable NPForm conj ss ** { - a = {gn = conjGenNum (gennum utrum conj.n) ss.a.gn ; p = ss.a.p} + a = {g = ss.a.g ; n = conjNumber conj.n ss.a.n ; p = ss.a.p} } ; ConjAP conj ss = conjunctDistrTable AFormPos conj ss ** { diff --git a/lib/src/scandinavian/DiffScand.gf b/lib/src/scandinavian/DiffScand.gf index 7b1e6b319..7a17732bf 100644 --- a/lib/src/scandinavian/DiffScand.gf +++ b/lib/src/scandinavian/DiffScand.gf @@ -4,13 +4,14 @@ interface DiffScand = open CommonScand, Prelude in { -- Norway has three genders, Danish and Swedish have two. - param - Gender ; - oper - neutrum, utrum : Gender ; + NGender : PType ; + + ngen2gen : NGender -> Gender ; - gennum : Gender -> Number -> GenNum ; + neutrum, utrum : NGender ; + +--- gennum : Gender -> Number -> GenNum ; -- This is the form of the noun in "det stora berget"/"det store berg". @@ -33,7 +34,7 @@ interface DiffScand = open CommonScand, Prelude in { subjIf : Str ; - artIndef : Gender => Str ; + artIndef : NGender => Str ; detIndefPl : Str ; verbHave : Verb ; @@ -48,11 +49,11 @@ interface DiffScand = open CommonScand, Prelude in { -- For determiners; mostly two-valued even in Norwegian. - genderForms : (x1,x2 : Str) -> Gender => Str ; + genderForms : (x1,x2 : Str) -> NGender => Str ; -- The forms of a relative pronoun ("som", "vars", "i vilken"). - relPron : GenNum => RCase => Str ; + relPron : Gender => Number => RCase => Str ; -- Pronoun "sådan" used in $Relative.RelCl$. diff --git a/lib/src/scandinavian/ExtraScand.gf b/lib/src/scandinavian/ExtraScand.gf index 56bbeedcc..12c5fbd7d 100644 --- a/lib/src/scandinavian/ExtraScand.gf +++ b/lib/src/scandinavian/ExtraScand.gf @@ -2,7 +2,7 @@ incomplete concrete ExtraScand of ExtraScandAbs = CatScand ** open CommonScand,Coordination,ResScand in { lin GenNP np = { - s,sp = \\n,_,_,g => np.s ! NPPoss (gennum g n) ; + s,sp = \\n,_,_,g => np.s ! NPPoss (gennum (ngen2gen g) n) ; det = DDef Indef } ; @@ -10,7 +10,7 @@ incomplete concrete ExtraScand of ExtraScandAbs = CatScand ** StrandRelSlash rp slash = { s = \\t,a,p,ag => - rp.s ! ag.gn ! RNom ++ slash.s ! t ! a ! p ! Sub ++ slash.c2.s ; + rp.s ! ag.g ! ag.n ! RNom ++ slash.s ! t ! a ! p ! Sub ++ slash.c2.s ; c = NPAcc } ; EmptyRelSlash slash = { diff --git a/lib/src/scandinavian/NounScand.gf b/lib/src/scandinavian/NounScand.gf index 4cd697eae..037662f19 100644 --- a/lib/src/scandinavian/NounScand.gf +++ b/lib/src/scandinavian/NounScand.gf @@ -20,7 +20,7 @@ incomplete concrete NounScand of Noun = in { s = \\c => det.s ! m ! g ++ cn.s ! det.n ! dd ! caseNP c ; - a = agrP3 g det.n + a = agrP3 (ngen2gen g) det.n } ; UsePN pn = { @@ -31,12 +31,12 @@ incomplete concrete NounScand of Noun = UsePron p = p ; PredetNP pred np = { - s = \\c => pred.s ! np.a.gn ++ np.s ! c ; - a = np.a + s = \\c => pred.s ! np.a.g ! np.a.n ++ pred.p ++ np.s ! c ; + a = case pred.a of {PAg n => agrP3 np.a.g n ; _ => np.a} } ; PPartNP np v2 = { - s = \\c => np.s ! c ++ v2.s ! (VI (VPtPret (agrAdj np.a.gn DIndef) Nom)) ; + s = \\c => np.s ! c ++ v2.s ! (VI (VPtPret (agrAdjNP np.a DIndef) Nom)) ; a = np.a } ; @@ -72,15 +72,15 @@ incomplete concrete NounScand of Noun = DetNP det = let - g = Neutr ; ---- + g = neutrum ; ---- m = True ; ---- is this needed for other than Art? in { s = \\c => det.sp ! m ! g ; - a = agrP3 g det.n + a = agrP3 (ngen2gen g) det.n } ; PossPron p = { - s,sp = \\n,_,_,g => p.s ! NPPoss (gennum g n) ; + s,sp = \\n,_,_,g => p.s ! NPPoss (gennum (ngen2gen g) n) ; det = DDef Indef } ; @@ -106,8 +106,8 @@ incomplete concrete NounScand of Noun = } ; DefArt = { - s = \\n,bm,bn,g => if_then_Str (orB bm bn) (artDef (gennum g n)) [] ; - sp = \\n,bm,bn,g => artDef (gennum g n) ; + s = \\n,bm,bn,g => if_then_Str (orB bm bn) (artDef (gennum (ngen2gen g) n)) [] ; + sp = \\n,bm,bn,g => artDef (gennum (ngen2gen g) n) ; det = DDef Def } ; @@ -125,7 +125,7 @@ incomplete concrete NounScand of Noun = MassNP cn = { s = \\c => cn.s ! Sg ! DIndef ! caseNP c ; - a = agrP3 cn.g Sg + a = agrP3 (ngen2gen cn.g) Sg } ; UseN, UseN2 = \noun -> { @@ -166,14 +166,14 @@ incomplete concrete NounScand of Noun = AdjCN ap cn = let g = cn.g in { s = \\n,d,c => preOrPost ap.isPre - (ap.s ! agrAdj (gennum g n) d) + (ap.s ! agrAdj (gennum (ngen2gen g) n) d) (cn.s ! n ! d ! c) ; g = g ; isMod = True } ; RelCN cn rs = let g = cn.g in { - s = \\n,d,c => cn.s ! n ! d ! c ++ rs.s ! agrP3 g n ; + s = \\n,d,c => cn.s ! n ! d ! c ++ rs.s ! agrP3 (ngen2gen g) n ; g = g ; isMod = cn.isMod } ; diff --git a/lib/src/scandinavian/PhraseScand.gf b/lib/src/scandinavian/PhraseScand.gf index f417b6041..abcf0750c 100644 --- a/lib/src/scandinavian/PhraseScand.gf +++ b/lib/src/scandinavian/PhraseScand.gf @@ -13,7 +13,7 @@ incomplete concrete PhraseScand of Phrase = UttIP ip = {s = ip.s ! nominative} ; --- Acc also UttIAdv iadv = iadv ; UttNP np = {s = np.s ! accusative} ; - UttVP vp = {s = infMark ++ infVP vp (agrP3 utrum Sg)} ; + UttVP vp = {s = infMark ++ infVP vp (agrP3 Utr Sg)} ; UttAdv adv = adv ; NoPConj = {s = []} ; diff --git a/lib/src/scandinavian/QuestionScand.gf b/lib/src/scandinavian/QuestionScand.gf index f053e71cc..23379df4a 100644 --- a/lib/src/scandinavian/QuestionScand.gf +++ b/lib/src/scandinavian/QuestionScand.gf @@ -21,7 +21,7 @@ incomplete concrete QuestionScand of Question = QIndir => <"som",Sub> ; _ => <[], Main> } ; - cl = mkClause (qp.s ! nominative ++ somo.p1) {gn = qp.gn ; p = P3} vp + cl = mkClause (qp.s ! nominative ++ somo.p1) {g = qp.g ; n = qp.n ; p = P3} vp in cl.s ! t ! a ! b ! somo.p2 } ; @@ -29,7 +29,7 @@ incomplete concrete QuestionScand of Question = QuestSlash ip slash = { s = \\t,a,p => let - agr = {gn = ip.gn ; p = P3} ; + agr = agrP3 ip.g ip.n ; cls : Order => Str = \\o => slash.s ! t ! a ! p ! o ++ slash.n3 ! agr ; who = slash.c2.s ++ ip.s ! accusative --- stranding in ExtScand in table { @@ -54,7 +54,7 @@ incomplete concrete QuestionScand of Question = let cls = (mkClause (np.s ! nominative) np.a (predV verbBe)).s ! t ! a ! p ; - why = icomp.s ! agrAdj np.a.gn DIndef + why = icomp.s ! agrAdjNP np.a DIndef in table { QDir => why ++ cls ! Inv ; QIndir => why ++ cls ! Sub @@ -67,22 +67,25 @@ incomplete concrete QuestionScand of Question = AdvIP ip adv = { s = \\c => ip.s ! c ++ adv.s ; - gn = ip.gn + g = ip.g ; + n = ip.n } ; IdetCN idet cn = let g = cn.g in { - s = \\c => + s = \\c => idet.s ! g ++ cn.s ! idet.n ! idet.det ! caseNP c ; - gn = gennum g idet.n + g = ngen2gen g ; + n = idet.n } ; IdetIP idet = let - g = Neutr ; + g = neutrum ; ---- g in { - s = \\c => idet.s ! g ; - gn = (agrP3 g idet.n).gn - } ; + s = \\c => idet.s ! g ; + g = ngen2gen g ; + n = idet.n + } ; IdetQuant idet num = { s = \\g => idet.s ! num.n ! g ++ num.s ! g ; diff --git a/lib/src/scandinavian/RelativeScand.gf b/lib/src/scandinavian/RelativeScand.gf index c5c0abc17..33446f2ca 100644 --- a/lib/src/scandinavian/RelativeScand.gf +++ b/lib/src/scandinavian/RelativeScand.gf @@ -6,7 +6,8 @@ incomplete concrete RelativeScand of Relative = lin RelCl cl = { - s = \\t,a,p,ag => pronSuch ! ag.gn ++ conjThat ++ cl.s ! t ! a ! p ! Sub ; + s = \\t,a,p,ag => + pronSuch ! gennumAgr ag ++ conjThat ++ cl.s ! t ! a ! p ! Sub ; c = NPAcc } ; @@ -15,9 +16,9 @@ incomplete concrete RelativeScand of Relative = let agr = case rp.a of { RNoAg => ag ; - RAg a => a + RAg g n p => {g = g ; n = n ; p = p} } ; - cl = mkClause (rp.s ! ag.gn ! RNom) agr vp + cl = mkClause (rp.s ! ag.g ! ag.n ! RNom) agr vp in cl.s ! t ! ant ! b ! Sub ; c = NPNom @@ -32,10 +33,10 @@ incomplete concrete RelativeScand of Relative = let agr = case rp.a of { RNoAg => ag ; - RAg agg => agg + RAg g n pr => {g = g ; n = n ; p = pr} } in - slash.c2.s ++ rp.s ! ag.gn ! RPrep slash.c2.hasPrep ++ + slash.c2.s ++ rp.s ! ag.g ! ag.n ! RPrep slash.c2.hasPrep ++ slash.s ! t ! a ! p ! Sub ++ slash.n3 ! agr ; c = NPAcc } ; @@ -43,8 +44,8 @@ incomplete concrete RelativeScand of Relative = --- The case here could be genitive. FunRP p np rp = { - s = \\gn,c => np.s ! nominative ++ p.s ++ rp.s ! gn ! RPrep True ; - a = RAg np.a + s = \\g,n,c => np.s ! nominative ++ p.s ++ rp.s ! g ! n ! RPrep True ; + a = RAg np.a.g np.a.n np.a.p } ; IdRP = {s = relPron ; a = RNoAg} ; diff --git a/lib/src/scandinavian/ResScand.gf b/lib/src/scandinavian/ResScand.gf index bcd1c7497..8ad8f4f83 100644 --- a/lib/src/scandinavian/ResScand.gf +++ b/lib/src/scandinavian/ResScand.gf @@ -5,15 +5,16 @@ interface ResScand = DiffScand ** open CommonScand, Prelude in { --2 Constants uniformly defined in terms of language-dependent constants param - CardOrd = NCard Gender | NOrd AFormSup ; -- sic! (AFormSup) + CardOrd = NCard NGender | NOrd AFormSup ; -- sic! (AFormSup) oper agrP3 : Gender -> Number -> Agr = \g,n -> { - gn = gennum g n ; + g = g ; + n = n ; p = P3 } ; - Noun = {s : Number => Species => Case => Str ; g : Gender} ; + Noun = {s : Number => Species => Case => Str ; g : NGender} ; -- This function is here because it depends on $verbHave, auxFut, auxCond$. @@ -58,7 +59,7 @@ interface ResScand = DiffScand ** open CommonScand, Prelude in { VPInfinit Simul => vf [] vinf } ; a1 : Polarity => Str = negation ; - n2 : Agr => Str = \\a => case verb.vtype of { + n2 : Agr => Str = \\a => case verb.vtype of { VRefl => reflPron a ; _ => [] } ; diff --git a/lib/src/scandinavian/SentenceScand.gf b/lib/src/scandinavian/SentenceScand.gf index 16bcd0b94..0be938cbb 100644 --- a/lib/src/scandinavian/SentenceScand.gf +++ b/lib/src/scandinavian/SentenceScand.gf @@ -6,12 +6,12 @@ incomplete concrete SentenceScand of Sentence = lin PredVP np vp = mkClause (np.s ! nominative) np.a vp ; - PredSCVP sc vp = mkClause sc.s (agrP3 neutrum Sg) vp ; + PredSCVP sc vp = mkClause sc.s (agrP3 Neutr Sg) vp ; ImpVP vp = { s = \\pol,n => let - agr = {gn = gennum utrum n ; p = P2} ; + agr = {g = Utr ; n = n ; p = P2} ; verb = vp.s ! VPImperat ; in verb.fin ++ vp.a1 ! pol ++ verb.inf ++ vp.n2 ! agr ++ vp.a2 ++ vp.ext @@ -39,7 +39,7 @@ incomplete concrete SentenceScand of Sentence = EmbedS s = {s = conjThat ++ s.s ! Sub} ; EmbedQS qs = {s = qs.s ! QIndir} ; - EmbedVP vp = {s = infMark ++ infVP vp (agrP3 utrum Sg)} ; --- agr + EmbedVP vp = {s = infMark ++ infVP vp (agrP3 Utr Sg)} ; --- agr UseCl t p cl = { s = \\o => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! o diff --git a/lib/src/scandinavian/SymbolScand.gf b/lib/src/scandinavian/SymbolScand.gf index 8bde4e1a4..d27401f49 100644 --- a/lib/src/scandinavian/SymbolScand.gf +++ b/lib/src/scandinavian/SymbolScand.gf @@ -8,15 +8,15 @@ lin NumPN i = {s = \\c => i.s!neutrum ; g = Neutr} ; --- c CNIntNP cn i = { s = \\c => (cn.s ! Sg ! DIndef ! Nom ++ i.s) ; - a = agrP3 cn.g Sg + a = agrP3 (ngen2gen cn.g) Sg } ; CNSymbNP det cn xs = let g = cn.g in { s = \\c => det.s ! cn.isMod ! g ++ cn.s ! det.n ! det.det ! caseNP c ++ xs.s ; - a = agrP3 g det.n + a = agrP3 (ngen2gen g) det.n } ; CNNumNP cn i = { s = \\c => (cn.s ! Sg ! DIndef ! Nom ++ i.s ! neutrum) ; - a = agrP3 cn.g Sg + a = agrP3 (ngen2gen cn.g) Sg } ; SymbS sy = {s = \\_ => sy.s} ; diff --git a/lib/src/scandinavian/VerbScand.gf b/lib/src/scandinavian/VerbScand.gf index 5ec40157c..c2e89a900 100644 --- a/lib/src/scandinavian/VerbScand.gf +++ b/lib/src/scandinavian/VerbScand.gf @@ -18,7 +18,7 @@ incomplete concrete VerbScand of Verb = CatScand ** open CommonScand, ResScand i ComplVV v vp = insertObj (\\a => v.c2.s ++ infVP vp a) (predV v) ; ComplVS v s = insertObj (\\_ => conjThat ++ s.s ! Sub) (predV v) ; ComplVQ v q = insertObj (\\_ => q.s ! QIndir) (predV v) ; - ComplVA v ap = insertObj (\\a => ap.s ! agrAdj a.gn DIndef) (predV v) ; + ComplVA v ap = insertObj (\\a => ap.s ! agrAdjNP a DIndef) (predV v) ; SlashV2V v vp = predV v ** { n3 = \\a => v.c3.s ++ infVP vp a ; @@ -33,7 +33,7 @@ incomplete concrete VerbScand of Verb = CatScand ** open CommonScand, ResScand i c2 = v.c2 } ; SlashV2A v ap = predV v ** { - n3 = \\a => ap.s ! agrAdj a.gn DIndef ; + n3 = \\a => ap.s ! agrAdjNP a DIndef ; c2 = v.c2 } ; @@ -49,7 +49,8 @@ incomplete concrete VerbScand of Verb = CatScand ** open CommonScand, ResScand i (\\a => v.c2.s ++ np.s ! accusative ++ v.c3.s ++ infVP vp a) (predV v) ** {n3 = vp.n3 ; c2 = v.c2} ; - UseComp comp = insertObj (\\a => comp.s ! agrAdj a.gn DIndef) (predV verbBe) ; + UseComp comp = insertObj + (\\a => comp.s ! agrAdjNP a DIndef) (predV verbBe) ; CompAP ap = ap ; CompNP np = {s = \\_ => np.s ! accusative} ; @@ -63,7 +64,7 @@ incomplete concrete VerbScand of Verb = CatScand ** open CommonScand, ResScand i PassV2 v = insertObj - (\\a => v.s ! VI (VPtPret (agrAdj a.gn DIndef) Nom)) + (\\a => v.s ! VI (VPtPret (agrAdjNP a DIndef) Nom)) (predV verbBecome) ; } diff --git a/lib/src/swedish/DiffSwe.gf b/lib/src/swedish/DiffSwe.gf index 307df2ccb..1ad42006f 100644 --- a/lib/src/swedish/DiffSwe.gf +++ b/lib/src/swedish/DiffSwe.gf @@ -2,31 +2,12 @@ instance DiffSwe of DiffScand = open CommonScand, Prelude in { -- Parameters. - param - Gender = Utr | Neutr ; - oper + NGender = Gender ; + ngen2gen g = g ; utrum = Utr ; neutrum = Neutr ; - gennumN : Gender -> Number -> GenNum = \g,n -> Plg ; ----- - gennum : Gender -> Number -> GenNum = \g,n -> -{- ---- debugging Compute 9/11/2007 - case n of { - Sg => case g of { - Utr => SgUtr ; - Neutr => SgNeutr - } ; - _ => Plg - } ; --} - case < : Gender * Number> of { - => SgUtr ; - => SgNeutr ; - _ => Plg - } ; - detDef : Species = Def ; Verb : Type = { @@ -48,7 +29,7 @@ instance DiffSwe of DiffScand = open CommonScand, Prelude in { subjIf = "om" ; - artIndef : Gender => Str = table { + artIndef : NGender => Str = table { Utr => "en" ; Neutr => "ett" } ; @@ -74,26 +55,26 @@ instance DiffSwe of DiffScand = open CommonScand, Prelude in { Neg => "inte" } ; - genderForms : (x1,x2 : Str) -> Gender => Str = \all,allt -> + genderForms : (x1,x2 : Str) -> NGender => Str = \all,allt -> table { Utr => all ; Neutr => allt } ; - relPron : GenNum => RCase => Str = \\gn,c => case c of { + relPron : Gender => Number => RCase => Str = \\g,n,c => case c of { RNom | RPrep False => "som" ; RGen => "vars" ; - RPrep True => gennumForms "vilken" "vilket" "vilka" ! gn + RPrep True => gennumForms "vilken" "vilket" "vilka" ! gennum g n } ; pronSuch = gennumForms "sådan" "sådant" "sådana" ; - reflPron : Agr -> Str = \a -> case a of { - {gn = Plg ; p = P1} => "oss" ; - {gn = Plg ; p = P2} => "er" ; - {p = P1} => "mig" ; - {p = P2} => "dig" ; - {p = P3} => "sig" + reflPron : Agr -> Str = \a -> case of { + => "oss" ; + => "er" ; + => "mig" ; + => "dig" ; + <_, P3> => "sig" } ; } diff --git a/lib/src/swedish/IdiomSwe.gf b/lib/src/swedish/IdiomSwe.gf index 65ebf9b30..78b1d69be 100644 --- a/lib/src/swedish/IdiomSwe.gf +++ b/lib/src/swedish/IdiomSwe.gf @@ -33,11 +33,10 @@ concrete IdiomSwe of Idiom = CatSwe ** } } ; - ProgrVP vp = insertObj (\\a => "att" ++ infVP vp a) (predV (partV hålla_V "på")) ; - ImpPl1 vp = {s = ["låt oss"] ++ infVP vp {gn = Plg ; p = P1}} ; + ImpPl1 vp = {s = ["låt oss"] ++ infVP vp {g = Utr ; n = Pl ; p = P1}} ; } diff --git a/lib/src/swedish/MakeStructuralSwe.gf b/lib/src/swedish/MakeStructuralSwe.gf index 1da7840df..63c753334 100644 --- a/lib/src/swedish/MakeStructuralSwe.gf +++ b/lib/src/swedish/MakeStructuralSwe.gf @@ -1,6 +1,6 @@ --# -path=.:../scandinavian:../common:../abstract -resource MakeStructuralSwe = open CatSwe, ParadigmsSwe, +resource MakeStructuralSwe = open CatSwe, (P=ParadigmsSwe), MorphoSwe, Prelude in { oper @@ -16,4 +16,18 @@ oper dDefIndef : DetSpecies = DDef Indef ; ---- other DetSpecies + mkPredet = overload { + mkPredet : Str -> Str -> Str -> Predet = \a,b,c -> + lin Predet { + s = detForms a b c ; + p = [] ; + a = PNoAg + } ; + mkPredet : Str -> Str -> Str -> Number -> Predet = \a,b,p,n -> + lin Predet { + s = table {Utr => \\_ => a ; _ => \\_ => b} ; + p = p ; + a = PAg n ; + } + } ; } diff --git a/lib/src/swedish/MorphoSwe.gf b/lib/src/swedish/MorphoSwe.gf index 48180b781..2f2467fec 100644 --- a/lib/src/swedish/MorphoSwe.gf +++ b/lib/src/swedish/MorphoSwe.gf @@ -32,8 +32,8 @@ oper funfun = ptPretAll funnen in mkCase c (case a of { - (Strong (SgUtr)) => funnen ; - (Strong (SgNeutr)) => funfun.p1 ; + (Strong (GSg Utr)) => funnen ; + (Strong (GSg Neutr)) => funfun.p1 ; _ => funfun.p2 } ) ; diff --git a/lib/src/swedish/ParadigmsSwe.gf b/lib/src/swedish/ParadigmsSwe.gf index f414ef468..74a1ba7f6 100644 --- a/lib/src/swedish/ParadigmsSwe.gf +++ b/lib/src/swedish/ParadigmsSwe.gf @@ -295,7 +295,7 @@ oper -- The definitions should not bother the user of the API. So they are -- hidden from the document. - Gender = ResSwe.Gender ; + Gender = ResSwe.NGender ; Number = CommonScand.Number ; Case = CommonScand.Case ; utrum = Utr ; @@ -501,8 +501,8 @@ oper mk6V = \finna,finner,finn,fann,funnit,funnen -> let funn = ptPretForms funnen ; - funnet = funn ! Strong SgNeutr ! Nom ; - funna = funn ! Strong Plg ! Nom + funnet = funn ! Strong (GSg Neutr) ! Nom ; + funna = funn ! Strong GPl ! Nom in mkVerb finna finner finn fann funnit funnen funnet funna ** {part = [] ; vtype=VAct ; lock_V = <>} ; diff --git a/lib/src/swedish/StructuralSwe.gf b/lib/src/swedish/StructuralSwe.gf index 6e6d9d5b7..23f83e1d1 100644 --- a/lib/src/swedish/StructuralSwe.gf +++ b/lib/src/swedish/StructuralSwe.gf @@ -8,7 +8,7 @@ concrete StructuralSwe of Structural = CatSwe ** above_Prep = ss "ovanför" ; after_Prep = ss "efter" ; by8agent_Prep = ss "av" ; - all_Predet = {s = gennumForms "all" "allt" "alla"} ; + all_Predet = {s = detForms "all" "allt" "alla" ; p = [] ; a = PNoAg} ; almost_AdA, almost_AdN = ss "nästan" ; although_Subj = ss "fast" ; always_AdV = ss "alltid" ; @@ -25,20 +25,20 @@ concrete StructuralSwe of Structural = CatSwe ** {c2 = mkComplement [] ; lock_VV = <>} ; during_Prep = ss "under" ; either7or_DConj = sd2 "antingen" "eller" ** {n = Sg} ; - everybody_NP = regNP "alla" "allas" Plg ; + everybody_NP = regNP "alla" "allas" Utr Pl ; every_Det = { s = \\_,_ => "varje" ; sp = \\_,_ => "var och en" ; ---- n = Sg ; det = DIndef } ; - everything_NP = regNP "allting" "alltings" SgNeutr ; + everything_NP = regNP "allting" "alltings" Neutr Sg ; everywhere_Adv = ss "överallt" ; few_Det = {s,sp = \\_,_ => "få" ; n = Pl ; det = DDef Indef} ; --- first_Ord = {s = "första" ; isDet = True} ; for_Prep = ss "för" ; from_Prep = ss "från" ; - he_Pron = MorphoSwe.mkNP "han" "honom" "hans" "hans" "hans" SgUtr P3 ; + he_Pron = MorphoSwe.mkNP "han" "honom" "hans" "hans" "hans" Utr Sg P3 ; here_Adv = ss "här" ; here7to_Adv = ss "hit" ; here7from_Adv = ss "härifrån" ; @@ -46,13 +46,13 @@ concrete StructuralSwe of Structural = CatSwe ** how8many_IDet = {s = \\_ => ["hur många"] ; n = Pl ; det = DDef Indef} ; if_Subj = ss "om" ; in8front_Prep = ss "framför" ; - i_Pron = MorphoSwe.mkNP "jag" "mig" "min" "mitt" "mina" SgUtr P1 ; + i_Pron = MorphoSwe.mkNP "jag" "mig" "min" "mitt" "mina" Utr Sg P1 ; in_Prep = ss "i" ; - it_Pron = MorphoSwe.regNP "det" "dess" SgNeutr ; + it_Pron = MorphoSwe.regNP "det" "dess" Neutr Sg ; less_CAdv = X.mkCAdv "mindre" "än" ; many_Det = {s,sp = \\_,_ => "många" ; n = Pl ; det = DDef Indef} ; more_CAdv = X.mkCAdv "mer" "än" ; - most_Predet = {s = gennumForms ["den mesta"] ["det mesta"] ["de flesta"]} ; + most_Predet = {s = detForms ["den mesta"] ["det mesta"] ["de flesta"] ; p = [] ; a = PNoAg} ; much_Det = {s,sp = \\_,_ => "mycket" ; n = Pl ; det = DDef Indef} ; must_VV = mkV "få" "måste" "få" "fick" "måst" "måst" ** @@ -60,19 +60,19 @@ concrete StructuralSwe of Structural = CatSwe ** no_Utt = ss ["nej"] ; on_Prep = ss "på" ; --- one_Quant = {s = \\_,_ => genderForms ["en"] ["ett"] ; n = Sg ; det = DIndef} ; - only_Predet = {s = \\_ => "bara"} ; + only_Predet = {s = \\_,_ => "bara" ; p = [] ; a = PNoAg} ; or_Conj = {s1 = [] ; s2 = "eller" ; n = Sg} ; otherwise_PConj = ss "annars" ; part_Prep = ss "av" ; please_Voc = ss "tack" ; --- possess_Prep = ss "av" ; quite_Adv = ss "ganska" ; - she_Pron = MorphoSwe.mkNP "hon" "henne" "hennes" "hennes" "hennes" SgUtr P3 ; + she_Pron = MorphoSwe.mkNP "hon" "henne" "hennes" "hennes" "hennes" Utr Sg P3 ; so_AdA = ss "så" ; someSg_Det = {s,sp = \\_ => genderForms "någon" "något" ; n = Sg ; det = DIndef} ; somePl_Det = {s,sp = \\_,_ => "några" ; n = Pl ; det = DIndef} ; - somebody_NP = regNP "någon" "någons" SgUtr ; - something_NP = regNP "något" "någots" SgNeutr ; + somebody_NP = regNP "någon" "någons" Utr Sg ; + something_NP = regNP "något" "någots" Neutr Sg ; somewhere_Adv = ss "någonstans" ; that_Quant = {s,sp = table { @@ -85,7 +85,7 @@ concrete StructuralSwe of Structural = CatSwe ** there7to_Adv = ss "dit" ; there7from_Adv = ss "därifrån" ; therefore_PConj = ss "därför" ; - they_Pron = MorphoSwe.mkNP "de" "dem" "deras" "deras" "deras" Plg P1 ; + they_Pron = MorphoSwe.mkNP "de" "dem" "deras" "deras" "deras" Utr Pl P1 ; this_Quant = {s,sp = table { Sg => \\_,_ => genderForms ["den här"] ["det här"] ; @@ -101,11 +101,12 @@ concrete StructuralSwe of Structural = CatSwe ** want_VV = mkV "vilja" "vill" "vilj" "ville" "velat" "velad" ** {c2 = mkComplement [] ; lock_VV = <>} ; - we_Pron = MorphoSwe.mkNP "vi" "oss" "vår" "vårt" "våra" Plg P1 ; - whatSg_IP = {s = \\_ => "vad" ; gn = SgUtr} ; ---- infl - whatPl_IP = {s = \\_ => "vad" ; gn = Plg} ; ---- infl + we_Pron = MorphoSwe.mkNP "vi" "oss" "vår" "vårt" "våra" Utr Pl P1 ; + whatSg_IP = {s = \\_ => "vad" ; g = Neutr ; n = Sg} ; ---- infl, g + whatPl_IP = {s = \\_ => "vad" ; g = Neutr ; n = Pl} ; ---- infl, g when_IAdv = ss "när" ; when_Subj = ss "när" ; + that_Subj = ss "att" ; where_IAdv = ss "var" ; which_IQuant = { s = table { @@ -114,23 +115,23 @@ concrete StructuralSwe of Structural = CatSwe ** } ; det = DIndef } ; - whoSg_IP = {s = vem.s ; gn = SgUtr} ; - whoPl_IP = {s = \\_ => "vilka" ; gn = Plg} ; + whoSg_IP = {s = vem.s ; g = Utr ; n = Sg} ; + whoPl_IP = {s = \\_ => "vilka" ; g = Utr ; n = Pl} ; why_IAdv = ss "varför" ; without_Prep = ss "utan" ; with_Prep = ss "med" ; yes_Utt = ss ["ja"] ; - youSg_Pron = MorphoSwe.mkNP "du" "dig" "din" "ditt" "dina" SgUtr P2 ; - youPl_Pron = MorphoSwe.mkNP "ni" "er" "er" "ert" "era" Plg P2 ; - youPol_Pron = MorphoSwe.mkNP "ni" "er" "er" "ert" "era" SgUtr P2 ; --- wrong in refl + youSg_Pron = MorphoSwe.mkNP "du" "dig" "din" "ditt" "dina" Utr Sg P2 ; + youPl_Pron = MorphoSwe.mkNP "ni" "er" "er" "ert" "era" Utr Pl P2 ; + youPol_Pron = MorphoSwe.mkNP "ni" "er" "er" "ert" "era" Utr Sg P2 ; --- wrong in refl -- Auxiliaries that are used repeatedly. oper - vem = MorphoSwe.mkNP "vem" "vem" "vems" "vems" "vems" SgUtr P3 ; + vem = MorphoSwe.mkNP "vem" "vem" "vems" "vems" "vems" Utr Sg P3 ; lin - not_Predet = {s = \\_ => "inte"} ; + not_Predet = {s = \\_,_ => "inte" ; p = [] ; a = PNoAg} ; no_Quant = {s,sp = table { Sg => \\_,_ => genderForms "ingen" "inget" ; @@ -140,8 +141,8 @@ lin } ; if_then_Conj = {s1 = "om" ; s2 = "så" ; n = singular} ; - nobody_NP = regNP "ingen" "ingens" SgUtr ; - nothing_NP = regNP "inget" "ingets" SgNeutr ; + nobody_NP = regNP "ingen" "ingens" Utr Sg ; + nothing_NP = regNP "inget" "ingets" Neutr Sg ; at_least_AdN = ss "minst" ; at_most_AdN = ss "högst" ;