mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-18 01:09:32 -06:00
135 lines
5.2 KiB
Plaintext
135 lines
5.2 KiB
Plaintext
concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in {
|
|
flags coding=cp1251 ;
|
|
|
|
|
|
lincat
|
|
Digit = {s : DForm => CardOrd => Str} ;
|
|
Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
|
|
Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
|
Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
|
Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ;
|
|
|
|
lin num x = {s = \\c => x.s ! c ! Formal; n=x.n} ;
|
|
lin n2 = mkDigit "äâà" "äâàìà" "äâå" "âòîðè" "äâàéñåò" "äâåñòà" ;
|
|
lin n3 = mkDigit "òðè" "òðèìà" "òðè" "òðåòè" "òðèéñåò" "òðèñòà" ;
|
|
lin n4 = mkDigit "÷åòèðè" "÷åòèðèìà" "÷åòèðè" "÷åòâúðòè" "÷åòèðèéñåò" "÷åòèðèñòîòèí" ;
|
|
lin n5 = mkDigit "ïåò" "ïåòèìà" "ïåò" "ïåòè" "ïåòäåñåò" "ïåòñòîòèí" ;
|
|
lin n6 = mkDigit "øåñò" "øåñòèìà" "øåñò" "øåñòè" "øåéñåò" "øåñòñòîòèí" ;
|
|
lin n7 = mkDigit "ñåäåì" "ñåäìèíà" "ñåäåì" "ñåäìè" "ñåäåìäåñåò" "ñåäåìñòîòèí" ;
|
|
lin n8 = mkDigit "îñåì" "îñìèíà" "îñåì" "îñìè" "îñåìäåñåò" "îñåìñòîòèí" ;
|
|
lin n9 = mkDigit "äåâåò" "äåâåòèìà" "äåâåò" "äåâåòè" "äåâåòäåñåò" "äåâåòñòîòèí" ;
|
|
|
|
lin pot01 =
|
|
{s = table {
|
|
unit => table {
|
|
NCard (CFMasc Indef _) => "åäèí" ;
|
|
NCard (CFMasc Def _) => "åäèíèÿ" ;
|
|
NCard (CFMascDefNom _) => "åäèíèÿò" ;
|
|
NCard (CFFem Indef) => "åäíà" ;
|
|
NCard (CFFem Def) => "åäíàòà" ;
|
|
NCard (CFNeut Indef) => "åäíî" ;
|
|
NCard (CFNeut Def) => "åäíîòî" ;
|
|
NOrd aform => case aform of {
|
|
ASg Masc Indef => "ïúðâè" ;
|
|
ASg Masc Def => "ïúðâèÿ" ;
|
|
ASgMascDefNom => "ïúðâèÿò" ;
|
|
ASg Fem Indef => "ïúðâà" ;
|
|
ASg Fem Def => "ïúðâàòà" ;
|
|
ASg Neut Indef => "ïúðâî" ;
|
|
ASg Neut Def => "ïúðâîòî" ;
|
|
APl Indef => "ïúðâè" ;
|
|
APl Def => "ïúðâèòå"
|
|
}
|
|
} ;
|
|
teen nf => case nf of {
|
|
Formal => mkCardOrd "åäèíàäåñåò" "åäèíàäåñåòèìà" "åäèíàäåñåò" "åäèíàäåñåòè" ;
|
|
Informal => mkCardOrd "åäèíàéñåò" "åäèíàéñåò" "åäèíàéñåò" "åäèíàéñòè"
|
|
} ;
|
|
ten nf => mkCardOrd "äåñåò" "äåñåòèìà" "äåñåò" "äåñåòè" ;
|
|
hundred => mkCardOrd100 "ñòî" "ñòîòåí"
|
|
}
|
|
;n = Sg
|
|
} ;
|
|
lin pot0 d = d ** {n = Pl} ;
|
|
|
|
lin pot110 = {s=\\c,nf => pot01.s ! ten nf ! c; n = Pl; i = True} ;
|
|
lin pot111 = {s=\\c,nf => pot01.s ! teen nf ! c; n = Pl; i = True} ;
|
|
lin pot1to19 d = {s = \\c,nf => d.s ! teen nf ! c; n = Pl; i = True} ;
|
|
lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ;
|
|
lin pot1 d = {s = \\c,nf => d.s ! ten nf ! c; n = Pl; i = True} ;
|
|
lin pot1plus d e = {
|
|
s = \\c,nf => d.s ! ten nf ! NCard (CFMasc Indef NonHuman) ++ "è" ++ e.s ! unit ! c ; n = Pl; i = False} ;
|
|
|
|
lin pot1as2 n = n ;
|
|
lin pot2 n = {s = \\c,nf => n.s ! hundred ! c; n = Pl; i = True} ;
|
|
lin pot2plus d e = {
|
|
s = \\c,nf => d.s ! hundred ! NCard (CFMasc Indef NonHuman) ++ case e.i of {False => []; True => "è"} ++ e.s ! c ! nf ;
|
|
n = Pl ;
|
|
i = False
|
|
} ;
|
|
|
|
lin pot2as3 n = n ;
|
|
lin pot3 n = {
|
|
s = \\c,nf => case n.n of {
|
|
Sg => mkCardOrd100 "õèëÿäà" "õèëÿäåí" ! c ;
|
|
Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "õèëÿäè" "õèëÿäåí" ! c
|
|
} ;
|
|
n = Pl
|
|
} ;
|
|
lin pot3plus n m = {
|
|
s = \\c,nf => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard (CFMasc Indef NonHuman) ! nf ++ case m.i of {False => []; True => "è"} ++ m.s ! c ! nf ;
|
|
n = Pl
|
|
} ;
|
|
|
|
|
|
-- numerals as sequences of digits
|
|
|
|
lincat
|
|
Dig = TDigit ;
|
|
|
|
lin
|
|
IDig d = d ** {tail = T1} ;
|
|
|
|
IIDig d i = {
|
|
s = \\o => d.s ! NCard (CFMasc Indef NonHuman) ++ commaIf i.tail ++ i.s ! o ;
|
|
n = Pl ;
|
|
tail = inc i.tail
|
|
} ;
|
|
|
|
D_0 = mk2Dig "0" "0â" ;
|
|
D_1 = mk3Dig "1" "1âè" Sg ;
|
|
D_2 = mk2Dig "2" "2ðè" ;
|
|
D_3 = mkDig "3" ;
|
|
D_4 = mkDig "4" ;
|
|
D_5 = mkDig "5" ;
|
|
D_6 = mkDig "6" ;
|
|
D_7 = mk2Dig "7" "7ìè" ;
|
|
D_8 = mk2Dig "8" "8ìè" ;
|
|
D_9 = mkDig "9" ;
|
|
|
|
oper
|
|
commaIf : DTail -> Str = \t -> case t of {
|
|
T3 => "," ;
|
|
_ => []
|
|
} ;
|
|
|
|
inc : DTail -> DTail = \t -> case t of {
|
|
T1 => T2 ;
|
|
T2 => T3 ;
|
|
T3 => T1
|
|
} ;
|
|
|
|
mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
|
|
mkDig : Str -> TDigit = \c -> mk2Dig c (c + "òè") ;
|
|
|
|
mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
|
|
s = table {NCard _ => c ; NOrd aform => regAdjective o ! aform} ;
|
|
n = n
|
|
} ;
|
|
|
|
TDigit = {
|
|
n : Number ;
|
|
s : CardOrd => Str
|
|
} ;
|
|
}
|