mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
add numerals
This commit is contained in:
@@ -39,6 +39,11 @@ concrete CatBul of Cat = CommonX ** open ResBul, Prelude in {
|
||||
Num = {s : Str; n : Number } ;
|
||||
Quant = {s : AForm => Str; spec : Species} ;
|
||||
|
||||
-- Numeral
|
||||
|
||||
Numeral = {s : CardOrd => Str; n : Number} ;
|
||||
Digits = {s : CardOrd => Str; n : Number; tail : DTail} ;
|
||||
|
||||
-- Structural
|
||||
|
||||
Subj = {s : Str} ;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
concrete GrammarBul of Grammar =
|
||||
NounBul,
|
||||
VerbBul,
|
||||
NumeralBul,
|
||||
SentenceBul,
|
||||
QuestionBul,
|
||||
PhraseBul,
|
||||
|
||||
128
lib/resource/bulgarian/NumeralBul.gf
Normal file
128
lib/resource/bulgarian/NumeralBul.gf
Normal file
@@ -0,0 +1,128 @@
|
||||
concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in {
|
||||
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str; n : Number } ;
|
||||
Sub100 = {s : CardOrd => Str; n : Number; i : Bool } ;
|
||||
Sub1000 = {s : CardOrd => Str; n : Number; i : Bool } ;
|
||||
Sub1000000 = {s : CardOrd => Str; n : Number} ;
|
||||
|
||||
lin num x = x ;
|
||||
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 DMasc Indef => "åäèí" ;
|
||||
NCard DMascPersonal Indef => "åäèí" ;
|
||||
NCard DFem Indef => "åäíà" ;
|
||||
NCard DNeut Indef => "åäíî" ;
|
||||
NCard DMasc Def => "åäèíèÿ" ;
|
||||
NCard DMascPersonal Def => "åäèíèÿ" ;
|
||||
NCard DFem Def => "åäíàòà" ;
|
||||
NCard DNeut Def => "åäíîòî" ;
|
||||
NOrd aform => (mkAdjective "ïúðâè"
|
||||
"ïúðâèÿ"
|
||||
"ïúðâèÿò"
|
||||
"ïúðâà"
|
||||
"ïúðâàòà"
|
||||
"ïúðâî"
|
||||
"ïúðâîòî"
|
||||
"ïúðâè"
|
||||
"ïúðâèòå").s ! aform
|
||||
} ;
|
||||
teen => mkCardOrd "åäèíàäåñåò" "åäèíàäåñåòèìà" "åäèíàäåñåò" "åäèíàäåñåòè" ;
|
||||
ten => mkCardOrd "äåñåò" "äåñåòèìà" "äåñåò" "äåñåòè" ;
|
||||
hundred => mkCardOrd "ñòî" "ñòîòèìà" "ñòî" "ñòîòåí"
|
||||
}
|
||||
;n = Sg
|
||||
} ;
|
||||
lin pot0 d = d ** {n = Pl} ;
|
||||
|
||||
lin pot110 = {s=pot01.s ! ten; n = Pl; i = True} ;
|
||||
lin pot111 = {s=pot01.s ! teen; n = Pl; i = True} ;
|
||||
lin pot1to19 d = {s = d.s ! teen; n = Pl; i = True} ;
|
||||
lin pot0as1 n = {s = n.s ! unit; n = n.n; i = True} ;
|
||||
lin pot1 d = {s = d.s ! ten; n = Pl; i = True} ;
|
||||
lin pot1plus d e = {
|
||||
s = \\c => d.s ! ten ! NCard DMasc Indef ++ "è" ++ e.s ! unit ! c ; n = Pl; i = False} ;
|
||||
|
||||
lin pot1as2 n = n ;
|
||||
lin pot2 n = {s = \\c => n.s ! hundred ! c; n = Pl; i = True} ;
|
||||
lin pot2plus d e = {
|
||||
s = \\c => d.s ! hundred ! NCard DMasc Indef ++ case e.i of {False => []; True => "è"} ++ e.s ! c ;
|
||||
n = Pl ;
|
||||
i = False
|
||||
} ;
|
||||
|
||||
lin pot2as3 n = n ;
|
||||
lin pot3 n = {
|
||||
s = \\c => case n.n of {
|
||||
Sg => mkCardOrd "õèëÿäà" "õèëÿäà" "õèëÿäà" "õèëÿäåí" ! c ;
|
||||
Pl => n.s ! NCard DFem Indef ++ mkCardOrd "õèëÿäè" "õèëÿäè" "õèëÿäè" "õèëÿäåí" ! c
|
||||
} ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot3plus n m = {
|
||||
s = \\c => (pot3 n).s ! NCard DMasc Indef ++ case m.i of {False => []; True => "è"} ++ m.s ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
|
||||
-- numerals as sequences of digits
|
||||
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
|
||||
lin
|
||||
IDig d = d ** {tail = T1} ;
|
||||
|
||||
IIDig d i = {
|
||||
s = \\o => d.s ! NCard DMasc Indef ++ 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).s ! aform} ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
TDigit = {
|
||||
n : Number ;
|
||||
s : CardOrd => Str
|
||||
} ;
|
||||
}
|
||||
@@ -60,6 +60,12 @@ resource ResBul = ParamX ** open Prelude in {
|
||||
| AFullDef
|
||||
;
|
||||
|
||||
--2 For $Numeral$
|
||||
|
||||
DGender = DMasc | DMascPersonal | DFem | DNeut ;
|
||||
CardOrd = NCard DGender Species | NOrd AForm ;
|
||||
DForm = unit | teen | ten | hundred ;
|
||||
|
||||
--2 Transformations between parameter types
|
||||
|
||||
oper
|
||||
@@ -293,6 +299,53 @@ resource ResBul = ParamX ** open Prelude in {
|
||||
OQuest => subj ++ verb ++ "ëè" ++ compl
|
||||
}
|
||||
} ;
|
||||
|
||||
-- For $Numeral$.
|
||||
|
||||
mkDigit : Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} =
|
||||
\dva, dvama, dve, vtori, dvesta ->
|
||||
{s = table {
|
||||
unit => mkCardOrd dva dvama dve vtori ;
|
||||
teen => mkCardOrd (dva+"íàäåñåò") (dva+"íàäåñåòèìà") (dva+"íàäåñåò") (dva+"íàäåñåòè") ;
|
||||
ten => mkCardOrd (dva+"äåñåò") (dva+"äåñåòèìà") (dva+"äåñåò") (dva+"äåñåòè") ;
|
||||
hundred => let dvesten : Str
|
||||
= case dvesta of {
|
||||
dvest+"à" => dvest+"åí" ;
|
||||
chetiristot+"èí" => chetiristot+"åí"
|
||||
}
|
||||
in mkCardOrd dvesta dvesta dvesta dvesten
|
||||
}
|
||||
} ;
|
||||
|
||||
mkCardOrd : Str -> Str -> Str -> Str -> CardOrd => Str =
|
||||
\dva, dvama, dve, vtori ->
|
||||
table {
|
||||
NCard dg Indef => digitGender dva dvama dve ! dg ;
|
||||
NCard dg Def => case digitGender dva dvama dve ! dg of {
|
||||
dves+"òà" => dves+"òàòå" ;
|
||||
dv+"à" => dv+"àòà" ;
|
||||
x => x+"òå"
|
||||
} ;
|
||||
NOrd aform => let vtora = init vtori + "à" ;
|
||||
vtoro = init vtori + "î"
|
||||
in (mkAdjective vtori
|
||||
(vtori+"ÿ")
|
||||
(vtori+"ÿò")
|
||||
vtora
|
||||
(vtora+"òà")
|
||||
vtoro
|
||||
(vtoro+"òî")
|
||||
vtori
|
||||
(vtori+"òå")).s ! aform
|
||||
} ;
|
||||
|
||||
digitGender : Str -> Str -> Str -> DGender => Str =
|
||||
\dva, dvama, dve
|
||||
-> table {
|
||||
DMasc => dva ;
|
||||
DMascPersonal => dvama ;
|
||||
_ => dve
|
||||
} ;
|
||||
|
||||
mkIP : Str -> GenNum -> {s : Str ; gn : GenNum} =
|
||||
\s,gn -> {
|
||||
|
||||
Reference in New Issue
Block a user