1
0
forked from GitHub/gf-rgl
Files
gf-rgl/src/mongolian/NumeralMon.gf
Krasimir Angelov fb398c603e The new Decimal API
2023-08-21 20:14:26 +02:00

193 lines
5.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--# -path=.:../abstract:../common:../prelude
concrete NumeralMon of Numeral = CatMon [Numeral,Digits,Decimal] ** open ResMon, MorphoMon, Prelude in {
flags coding=utf8 ;
lincat
Digit = {s : Place => DForm => CardOrd => Str} ;
Sub10 = {s : Place => DForm => CardOrd => Str ; n : Number} ;
Sub100, Sub1000 = {s : Place => CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str; n : Number} ;
oper
mkCardOrd : Str -> CardOrd => Str = \unit ->
let
vt = MorphoMon.vowelType unit
in
table {
NCard => unit ;
NOrd => unit + dugaar2 ! vt
} ;
mkNum : Str -> Str -> {s : Place => DForm => CardOrd => Str} = \unit,unitten ->
let
vt = MorphoMon.vowelType unit
in {
s = table {
Indep => table {
Unit => mkCardOrd unit ;
Teen => mkCardOrd ("арван" ++ unit) ;
Ten => mkCardOrd unitten ;
Hundred => mkCardOrd (unitToattrUnit unit ++ "зуу")
} ;
Attr => table {
Unit => table {
NCard => unitToattrUnit unit ;
NOrd => unit + dugaar2 ! vt
} ;
Teen => table {
NCard => "арван" + (unitToattrUnit unit) ;
NOrd => ("арван" ++ unit) + dugaar2 ! vt
} ;
Ten => table {
NCard => tenToattrTen unitten ;
NOrd => unitten + dugaar2 ! vt
} ;
Hundred => table {
NCard => (unitToattrUnit unit ++ "зуу" + "н") ;
NOrd => (unitToattrUnit unit ++ "зуу")+ dugaar2 ! vt
}
}
}
} ;
unitToattrUnit : Str -> Str = \unit -> case unit of {
"нэг" => "нэгэн" ;
"хоёр" => "хоёр" ;
"гурав" => "гурван" ;
"дөрөв" => "дөрвөн" ;
"тав" => "таван" ;
"зургаа" => "зургаан" ;
"долоо" => "долоон" ;
"найм" => "найман" ;
"ес" => "есөн"
} ;
tenToattrTen : Str -> Str = \ten -> case ten of {
"арав" => "арван" ;
"хорь" => "хорин" ;
"гуч" => "гучин" ;
"дөч" => "дөчин" ;
"тавь" => "тавин" ;
"жар" => "жаран" ;
"дал" => "далан" ;
"ная" => "наян" ;
"ер" => "ерэн"
} ;
lin
num x = x ;
n2 = mkNum "хоёр" "хорь" ;
n3 = mkNum "гурав" "гуч" ;
n4 = mkNum "дөрөв" "дөч" ;
n5 = mkNum "тав" "тавь" ;
n6 = mkNum "зургаа" "жар" ;
n7 = mkNum "долоо" "дал" ;
n8 = mkNum "найм" "ная" ;
n9 = mkNum "ес" "ер" ;
pot01 = mkNum "нэг" "арав" ** {n = Sg} ;
pot0 d = d ** {n = Pl} ;
pot110 = {
s = \\p,co => pot01.s ! p ! Ten ! co ; n = Pl
} ;
pot111 = {
s = \\p,co => pot01.s ! p ! Teen ! co ; n = Pl
} ;
pot1to19 d = {
s = \\p => d.s ! p ! Teen
} ** {n = Pl} ;
pot0as1 n = {
s = \\p => n.s ! p ! Unit ; n = n.n
} ;
pot1 d = {
s = \\p => d.s ! p ! Ten ; n = Pl
} ;
pot1plus d e = {
s = \\p,co => d.s ! Attr ! Ten ! NCard ++ e.s ! Indep ! Unit ! co ; n = Pl
} ;
pot1as2 n = n ;
pot2 d = {
s = \\p => d.s ! p ! Hundred ; n = Pl
} ;
pot2plus d e = {
s = \\p,co => d.s ! Attr ! Hundred ! NCard ++ e.s ! Indep ! co ; n = Pl
} ;
pot2as3 n = {
s = n.s ! Indep ; n = n.n
} ;
pot3 n = {
s = \\co => n.s ! Attr ! NCard ++ mkCardOrd "мянга" ! co ; n = Pl
} ;
pot3plus n m = {
s = \\co => n.s ! Attr ! NCard ++ "мянга" ++ m.s ! Indep ! co ; n = Pl
} ;
lincat
Dig = TDigit ;
lin
IDig d = d ;
IIDig d i = {
s = \\co => d.s ! NCard ++ BIND ++ i.s ! co ;
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" ;
PosDecimal d = d ** {hasDot=False} ;
NegDecimal d = {
s = \\co => "-" ++ BIND ++ d.s ! co ;
n = Pl ;
hasDot=False
} ;
IFrac d i = {
s = \\co => d.s ! NCard ++
if_then_Str d.hasDot BIND (BIND++"."++BIND) ++
i.s ! co;
n = Pl ;
hasDot=True
} ;
oper
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 => o
} ;
n = n
} ;
TDigit = {
s : CardOrd => Str ;
n : Number
} ;
}