summaryrefslogtreecommitdiff
path: root/next-lib/src/bulgarian/NumeralBul.gf
blob: 021c8566aa4df074ede52bf74bc9334b40590c2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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 DMascIndef          => "åäèí" ;
                          NCard DMascDef            => "åäèíèÿ" ;
                          NCard DMascDefNom         => "åäèíèÿò" ;
                          NCard DMascPersonalIndef  => "åäèí" ;
                          NCard DMascPersonalDef    => "åäèíèÿ" ;
                          NCard DMascPersonalDefNom => "åäèíèÿò" ;
                          NCard DFemIndef           => "åäíà" ;
                          NCard DFemDef             => "åäíàòà" ;
                          NCard DNeutIndef          => "åäíî" ;
                          NCard DNeutDef            => "åäíîòî" ;
                          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 DMascIndef ++ "è" ++ 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 DMascIndef ++ 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 DFemIndef ! nf ++ mkCardOrd100 "õèëÿäè" "õèëÿäåí" ! c
                } ;
  n = Pl
  } ;
lin pot3plus n m = {
  s = \\c,nf => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard DMascIndef ! 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 DMascIndef ++ 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
    } ;
}