packages feed

gf-3.6: lib/src/bulgarian/NumeralBul.gf

--# -coding=cp1251
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 => case n.n of {
                  Sg => mkCardOrd100 "õèëÿäà" "õèëÿäåí" ! NCard (CFMasc Indef NonHuman) ;
                  Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "õèëÿäè" "õèëÿäåí" ! NCard (CFMasc Indef NonHuman)
                }
                ++ 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) ++ spaceIf i.tail ++ i.s ! o ;
      n = Pl ;
      tail = inc i.tail
    } ;

    D_0 = mk3Dig "0" "0" "0åâ" Pl ;
    D_1 = mk3Dig "1" "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 = mk3Dig "7" "7íà" "7ìè" Pl ;
    D_8 = mk3Dig "8" "8íà" "8ìè" Pl ;
    D_9 = mk3Dig "9" "9èìà" "9òè" Pl ;

  oper
    spaceIf : DTail -> Str = \t -> case t of {
      T3 => SOFT_BIND ;
      _  => BIND
      } ;

    inc : DTail -> DTail = \t -> case t of {
      T1 => T2 ;
      T2 => T3 ;
      T3 => T1
      } ;

    mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c (c+"ìà") o Pl ;
    mkDig : Str -> TDigit = \c -> mk2Dig c (c + "òè") ;

    mk3Dig : Str -> Str -> Str -> Number -> TDigit = \c1,c2,o,n -> {
      s = mkCardOrd c1 c2 c1 o ;
      n = n
      } ;

    TDigit = {
      n : Number ;
      s : CardOrd => Str
    } ;
}