forked from GitHub/gf-rgl
Icelandic added to RGL by Bjarki Traustason
This commit is contained in:
224
src/icelandic/NumeralIce.gf
Normal file
224
src/icelandic/NumeralIce.gf
Normal file
@@ -0,0 +1,224 @@
|
||||
concrete NumeralIce of Numeral = CatIce [Numeral,Digits] ** open Prelude, ResIce in {
|
||||
|
||||
param
|
||||
DForm = unit | teen | ten ;
|
||||
Size = sg | less10 | pl ;
|
||||
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str ; size : Size} ;
|
||||
Sub100, Sub1000, Sub1000000 = {s : CardOrd => Str ; size : Size} ;
|
||||
|
||||
lin
|
||||
num x = {
|
||||
s = \\ngc => x.s ! ngc ;
|
||||
n = sizeToNumber x.size
|
||||
} ;
|
||||
|
||||
n2 = {s = table {
|
||||
unit => table {
|
||||
NCard _ Masc c => caseList "tveir" "tvo" "tveimur" "tveggja" ! c ;
|
||||
NCard _ Fem c => caseList "tvær" "tvær" "tveimur" "tveggja" ! c ;
|
||||
NCard _ Neutr c => caseList "tvö" "tvö" "tveimur" "tveggja" ! c ;
|
||||
NOrd Sg Masc c => caseList "annar" "annan" "öðrum" "annars" ! c ;
|
||||
NOrd Sg Fem c => caseList "önnur" "aðra" "annarri" "annarrar" ! c ;
|
||||
NOrd Sg Neutr c => caseList "annað" "annað" "öðru" "annars" ! c ;
|
||||
NOrd Pl Masc c => caseList "aðrir" "aðra" "öðrum" "annarra" ! c ;
|
||||
NOrd Pl Fem c => caseList "aðrar" "aðrar" "öðrum" "annarra" ! c ;
|
||||
NOrd Pl Neutr c => caseList "önnur" "önnur" "öðrum" "annarra" ! c
|
||||
} ;
|
||||
teen => table {
|
||||
NCard _ _ _ => "tólf" ;
|
||||
NOrd n g c => (mkRegOrd "tólft" "tólft") ! n ! g ! c
|
||||
} ;
|
||||
ten => table {
|
||||
NCard _ _ _ => "tuttugu" ;
|
||||
NOrd n g c => (mkRegOrd "tuttugast" "tuttugust") ! n ! g ! c
|
||||
}}};
|
||||
n3 = {s = table {
|
||||
unit => table {
|
||||
NCard _ Masc c => caseList "þrír" "þrjá" "þremur" "þriggja" ! c ;
|
||||
NCard _ Fem c => caseList "þrjár" "þrjár" "þremur" "þriggja" ! c ;
|
||||
NCard _ Neutr c => caseList "þrjú" "þrjú" "þremur" "þriggja" ! c ;
|
||||
NOrd n g c => (mkRegOrd "þriðj" "þriðj") ! n ! g ! c
|
||||
} ;
|
||||
teen => table {
|
||||
NCard _ _ _ => "þrettán" ;
|
||||
NOrd n g c => (mkRegOrd "þráttánd" "þrettánd") ! n ! g ! c
|
||||
} ;
|
||||
ten => table {
|
||||
NCard _ _ _ => "þrjátíu" ;
|
||||
NOrd n g c => (mkRegOrd "þrítugast" "þrítugust") ! n ! g ! c
|
||||
}}};
|
||||
n4 = {s = table {
|
||||
unit => table {
|
||||
NCard _ Masc c => caseList "fjórir" "fjóra" "fjórum" "fjögurra" ! c ;
|
||||
NCard _ Fem c => caseList "fjórar" "fjórar" "fjórum" "fjögurra" ! c ;
|
||||
NCard _ Neutr c => caseList "fjögur" "fjögur" "fjórum" "fjögurra" ! c ;
|
||||
NOrd n g c => (mkRegOrd "fjórð" "fjórð") ! n ! g ! c
|
||||
} ;
|
||||
teen => table {
|
||||
NCard _ _ _ => "fjórtán" ;
|
||||
NOrd n g c => (mkRegOrd "fjórtánd" "fjórtánd") ! n ! g ! c
|
||||
} ;
|
||||
ten => table {
|
||||
NCard _ _ _ => "fjörutíu" ;
|
||||
NOrd n g c => (mkRegOrd "fertugast" "fertugust") ! n ! g ! c
|
||||
}}};
|
||||
n5 = mkRegNum "fimm" "fimmtán" "fimmtíu" "fimmti" ;
|
||||
n6 = mkRegNum "sex" "sextán" "sextíu" "sjötti" ;
|
||||
n7 = mkRegNum "sjö" "sautján" "sjötíu" "sjöundi" ;
|
||||
n8 = mkRegNum "átta" "átján" "áttatíu" "áttundi" ;
|
||||
n9 = mkRegNum "níu" "nítján" "níutíu" "níundi" ;
|
||||
|
||||
pot01 = {s = table {
|
||||
unit => table {
|
||||
NCard Sg Masc c => caseList "einn" "einn" "einum" "eins" ! c ;
|
||||
NCard Sg Fem c => caseList "ein" "eina" "einni" "einnar" ! c ;
|
||||
NCard Sg Neutr c => caseList "eitt" "eitt" "einu" "eins" ! c ;
|
||||
NCard Pl Masc c => caseList "einir" "eina" "einum" "einna" ! c ;
|
||||
NCard Pl Fem c => caseList "einar" "einar" "einum" "einna" ! c ;
|
||||
NCard Pl Neutr c => caseList "ein" "ein" "einum" "einna" ! c ;
|
||||
NOrd n g c => (mkRegOrd "fyrst" "fyrst") ! n ! g ! c
|
||||
} ;
|
||||
teen => table {
|
||||
NCard _ _ _ => "ellefu" ;
|
||||
NOrd n g c => (mkRegOrd "elleft" "elleft") ! n ! g ! c
|
||||
} ;
|
||||
ten => table {
|
||||
NCard _ _ _ => "tíu" ;
|
||||
NOrd n g c => (mkRegOrd "tíund" "tíund") ! n ! g ! c
|
||||
}
|
||||
} ;
|
||||
size = sg
|
||||
} ;
|
||||
pot0 d = d ** {size = less10} ;
|
||||
pot110 = {s = pot01.s ! ten ; size = pl} ;
|
||||
pot111 = {s = pot01.s ! teen ; size = pl} ;
|
||||
pot1to19 d = {s = d.s ! teen ; size = pl} ;
|
||||
pot0as1 n = {s = n.s ! unit ; size = n.size} ;
|
||||
pot1 d = {s = d.s ! ten ; size = pl} ;
|
||||
pot1plus d e = { s = \\ngc => d.s ! ten ! ngc ++ "og" ++ e.s ! unit ! ngc ; size = pl} ;
|
||||
pot1as2 n = n ;
|
||||
pot2 d = { s = \\ngc => (omitsg (d.s ! unit ! NCard Sg Neutr Nom) d.size) ++ hundrað ! ngc ; size = pl} ;
|
||||
pot2plus d e = {
|
||||
s = table {
|
||||
NCard n g c => (omitsg (d.s ! unit ! NCard Sg Neutr Nom) d.size) ++ "hundrað" ++ (maybeog e.size) ++ e.s ! NCard n g c ;
|
||||
NOrd n g c => (omitsg (d.s ! unit ! NCard Sg Neutr Nom) d.size) ++ (omitOrd (hundrað ! NOrd n g c) "hundrað" e.size) ++ e.s ! NOrd n g c
|
||||
} ;
|
||||
size = pl
|
||||
} ;
|
||||
pot2as3 n = n ;
|
||||
pot3 d = { s = \\ngc => (omitsg (d.s ! NCard Sg Neutr Nom) d.size) ++ þúsund ! ngc ; size = pl} ;
|
||||
pot3plus d e = {
|
||||
s = table {
|
||||
NCard n g c => (omitsg (d.s ! NCard Sg Neutr Nom) d.size) ++ "þúsund" ++ (maybeog e.size) ++ e.s ! NCard n g c ;
|
||||
NOrd n g c => (omitsg (d.s ! NCard Sg Neutr Nom) d.size) ++ (omitOrd (þúsund ! NOrd n g c) "þúsund" e.size) ++ e.s ! NOrd n g c
|
||||
} ;
|
||||
size = pl
|
||||
} ;
|
||||
|
||||
oper
|
||||
|
||||
mkRegNum : (_,_,_,_ : Str) -> {s : DForm => CardOrd => Str} = --Digit =
|
||||
\sex,sextán,sextíu,sjötti -> {s = table {
|
||||
unit => regCardOrd sex sjötti ;
|
||||
teen => regCardOrd sextán (sextán + "di") ;
|
||||
ten => table {
|
||||
NOrd n g c => (mkRegOrd (mkTenOrd sex).p1 (mkTenOrd sex).p2) ! n ! g ! c ;
|
||||
NCard _ _ _ => sextíu
|
||||
}
|
||||
}};
|
||||
|
||||
regCardOrd : (_,_ : Str) -> CardOrd => Str = \sex,sjötti ->
|
||||
let
|
||||
sjött = init sjötti
|
||||
in table {
|
||||
NOrd n g c => (mkRegOrd sjött sjött) ! n ! g ! c ;
|
||||
NCard _ _ _ => sex
|
||||
} ;
|
||||
|
||||
mkRegOrd : (_,_ : Str) -> Number => Gender => Case => Str = \stem,stemu -> table {
|
||||
Sg => table {
|
||||
Masc => caseList (stem + "i") (stem + "a") (stem + "a") (stem + "a") ;
|
||||
Fem => caseList (stem + "a") (stemu + "u") (stemu + "u") (stemu + "u") ;
|
||||
Neutr => caseList (stem + "a") (stem + "a") (stem + "a") (stem + "a")
|
||||
} ;
|
||||
Pl => table {
|
||||
_ => caseList (stemu + "u") (stemu + "u") (stemu + "u") (stemu + "u")
|
||||
}
|
||||
} ;
|
||||
|
||||
mkTenOrd : Str -> Str * Str = \sex -> case sex of {
|
||||
"átta" => <"átttugast","átttugust"> ;
|
||||
"níu" => <"nítugast","nítugust"> ;
|
||||
_ => <sex + "tugast",sex + "tugust">
|
||||
} ;
|
||||
|
||||
hundrað : CardOrd => Str = table {
|
||||
NCard _ _ _ => "hundrað" ;
|
||||
NOrd n g c => (mkRegOrd "hundraðast" "hundruðust") ! n ! g ! c
|
||||
} ;
|
||||
|
||||
þúsund : CardOrd => Str = table {
|
||||
NCard _ _ _ => "þúsund" ;
|
||||
NOrd n g c => (mkRegOrd "þúsundast" "þúsundust") ! n ! g ! c
|
||||
} ;
|
||||
|
||||
sizeToNumber : Size -> Number = \size -> case size of {
|
||||
sg => Sg ;
|
||||
_ => Pl
|
||||
} ;
|
||||
|
||||
omitOrd : (_,_ : Str) -> Size -> Str = \ord,card,size -> case size of {
|
||||
pl => card ;
|
||||
_ => ord
|
||||
} ;
|
||||
|
||||
maybeog : Size -> Str = \sz -> table {pl => [] ; _ => "og" } ! sz ;
|
||||
omitsg : Str -> Size -> Str = \s -> \sz -> table {sg => [] ; _ => s } ! sz ;
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
lin
|
||||
-- Dig -> Digits
|
||||
IDig d = d ;
|
||||
|
||||
-- Dig -> Digits -> Digits
|
||||
IIDig d ds = {
|
||||
s = table {
|
||||
NCard _ _ _ => d.s ! NCard Sg Masc Nom ++ BIND ++ ds.s ! NCard Sg Masc Nom ;
|
||||
NOrd _ _ _ => d.s ! NCard Sg Masc Nom ++ BIND ++ ds.s ! NCard Sg Masc Nom ++ "."
|
||||
} ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
D_0 = mkDig "0" ;
|
||||
D_1 = mk3Dig "1" "1." Sg ;
|
||||
D_2 = mkDig "2" ;
|
||||
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
|
||||
|
||||
mkDig : Str -> TDigit = \c -> mk2Dig c (c + ".") ;
|
||||
|
||||
mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
|
||||
|
||||
mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
|
||||
s = table {
|
||||
NCard _ _ _ => c ;
|
||||
NOrd _ _ _ => o
|
||||
} ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
TDigit = {
|
||||
s : CardOrd => Str ;
|
||||
n : Number
|
||||
} ;
|
||||
}
|
||||
Reference in New Issue
Block a user