1
0
forked from GitHub/gf-core
Files
gf-core/lib/src/mongolian/NumeralMon.gf
hallgren 72459b5158 lib/src/*/Numeral*.gf: fix inconsistent inheritance form Cat
While the abstract Numeral inherits only Cat[Numeral,Digits], some of the
concrete NumeralNNN of Numeral inherited everything from CatNNN.

Normally the compiler outputs a warning message when a concrete syntax 
contains superflous lincats, but apparently not when they get included
through inheritance...

This does not seem to cause problems in the Haskell run-time system, but the 
C run-time system fails to load PGFs with superflous lincats.

This problems shows up when creating application grammars that inherit Numeral.
The Phrasebook is an example of such a grammar.
2015-08-26 11:53:16 +00:00

179 lines
4.6 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] ** 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" ;
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
} ;
}