mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-05-27 08:58:55 -06:00
version of ResHrv heavily using table extension ; requires GF from 4 Oct therefore not standard
This commit is contained in:
660
src/croatian/TableExtResHrv.gf
Normal file
660
src/croatian/TableExtResHrv.gf
Normal file
@@ -0,0 +1,660 @@
|
|||||||
|
resource TableExtResHrv = open Prelude in {
|
||||||
|
|
||||||
|
-- AR September 2022
|
||||||
|
-- sources:
|
||||||
|
-- Wiki = https://en.wikipedia.org/wiki/Serbo-Croatian_grammar
|
||||||
|
-- BCMS = Bosnian, Croatian, Montenegrin and Serbian:
|
||||||
|
-- An Essential Grammar (Routledge Essential Grammars) 1st Edition, by Željko Vrabec
|
||||||
|
|
||||||
|
-- parameters
|
||||||
|
|
||||||
|
param
|
||||||
|
Number = Sg | Pl ;
|
||||||
|
|
||||||
|
Animacy = Anim | Inanim ;
|
||||||
|
Gender = Masc Animacy | Fem | Neutr ;
|
||||||
|
|
||||||
|
Case = Nom | Gen | Dat | Acc | Voc | Loc | Ins ; -- traditional order
|
||||||
|
|
||||||
|
Person = P1 | P2 | P3 ;
|
||||||
|
|
||||||
|
VForm =
|
||||||
|
VInf
|
||||||
|
| VPres Number Person
|
||||||
|
| VPastPart Gender Number
|
||||||
|
;
|
||||||
|
---- TODO aorist, imperfect
|
||||||
|
|
||||||
|
Agr = Ag Gender Number Person ;
|
||||||
|
|
||||||
|
CTense = CTPres | CTPast ; ----- TODO complete the tense system to match BCS verb morphology
|
||||||
|
|
||||||
|
-- phonology
|
||||||
|
|
||||||
|
oper
|
||||||
|
softConsonant : pattern Str = #("c"|"č"|"ć"|"đ"|"j"|"lj"|"nj"|"š"|"ž"|"št") ;
|
||||||
|
--- wiki "and sometimes r"; BCMS slightly different
|
||||||
|
|
||||||
|
ifSoft : Str -> (soft,hard : Str) -> Str = \word, ssoft, shard ->
|
||||||
|
case word of {
|
||||||
|
_ + #softConsonant => ssoft ;
|
||||||
|
_ => shard
|
||||||
|
} ;
|
||||||
|
|
||||||
|
animate = Masc Anim ;
|
||||||
|
inanimate = Masc Inanim ;
|
||||||
|
feminine = Fem ;
|
||||||
|
neuter = Neutr ;
|
||||||
|
|
||||||
|
palatalize : Str -> Str = \s -> case s of {
|
||||||
|
x + "ki" => x + "ci" ;
|
||||||
|
x + "ke" => x + "če" ;
|
||||||
|
x + "gi" => x + "zi" ;
|
||||||
|
x + "ge" => x + "že" ;
|
||||||
|
x + "hi" => x + "si" ;
|
||||||
|
x + "he" => x + "še" ;
|
||||||
|
x + "ce" => x + "če" ;
|
||||||
|
_ => s
|
||||||
|
} ;
|
||||||
|
|
||||||
|
voicing : Str -> Str = \s -> case s of {
|
||||||
|
x + "b" => x + "p" ;
|
||||||
|
x + "d" => x + "t" ;
|
||||||
|
x + "đ" => x + "ć" ;
|
||||||
|
x + "z" => x + "s" ;
|
||||||
|
x + "dž" => x + "č" ;
|
||||||
|
x + "ž" => x + "š" ;
|
||||||
|
_ => s
|
||||||
|
} ;
|
||||||
|
|
||||||
|
---------------
|
||||||
|
-- Nouns
|
||||||
|
---------------
|
||||||
|
|
||||||
|
-- novel idea (for RGL): lexical items stored as records rather than tables
|
||||||
|
-- advantages:
|
||||||
|
-- - easier to make exceptions to paradigms (by ** {})
|
||||||
|
-- - easier to keep the number of forms minimal
|
||||||
|
-- - easier to see what is happening than with lots of anonymous arguments to mkN, mkA, mkV
|
||||||
|
-- Starting from GF 2022-10-04: this can now be done with table extension, which gives
|
||||||
|
-- type safety and more powerful pattern matching
|
||||||
|
|
||||||
|
param
|
||||||
|
NForm = snom | sgen | sdat | sacc | svoc | sins | pnom | pgen | pdat | pacc ;
|
||||||
|
|
||||||
|
oper
|
||||||
|
NounForms : Type = NForm => Str ;
|
||||||
|
|
||||||
|
-- But traditional tables make agreement easier to handle in syntax
|
||||||
|
-- so this is the lincat of CN
|
||||||
|
|
||||||
|
Noun : Type = {s : Number => Case => Str ; g : Gender} ;
|
||||||
|
|
||||||
|
-- for lexical nouns N, we also need the gender but keep the minimal set of forms
|
||||||
|
|
||||||
|
LexNoun : Type = {s : NounForms ; g : Gender} ;
|
||||||
|
|
||||||
|
-- this is used in UseN
|
||||||
|
|
||||||
|
nounFormsNoun : NounForms -> Gender -> Noun
|
||||||
|
= \forms, g -> {
|
||||||
|
s = table {
|
||||||
|
Sg => table {
|
||||||
|
Nom => forms ! snom ;
|
||||||
|
Gen => forms ! sgen ;
|
||||||
|
Dat => forms ! sdat ;
|
||||||
|
Acc => case g of {
|
||||||
|
Masc Anim | Fem => forms ! sacc ;
|
||||||
|
_ => forms ! snom
|
||||||
|
} ;
|
||||||
|
Voc => forms ! svoc ;
|
||||||
|
Loc => forms ! sdat ;
|
||||||
|
Ins => forms ! sins
|
||||||
|
} ;
|
||||||
|
Pl => table {
|
||||||
|
Nom => forms ! pnom ;
|
||||||
|
Gen => forms ! pgen ;
|
||||||
|
Dat => forms ! pdat ;
|
||||||
|
Acc => forms ! pacc ;
|
||||||
|
Voc => forms ! pnom ;
|
||||||
|
Loc => forms ! pdat ;
|
||||||
|
Ins => forms ! pdat
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
g = g
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- a declension type produces these forms from a string
|
||||||
|
|
||||||
|
DeclensionType : Type = Str -> NounForms ;
|
||||||
|
|
||||||
|
-- smart paradigms
|
||||||
|
|
||||||
|
smartLexNoun : Str -> LexNoun = \s -> case s of {
|
||||||
|
_ + "a" => {s = zenaN s ; g = feminine} ;
|
||||||
|
_ + "i" => {s = ziriN s ; g = inanimate} ; ---- TODO feminine i
|
||||||
|
_ + "e" => {s = poljeN s ; g = neuter} ; ---- TODO sunce, uze, zvonce, rame
|
||||||
|
_ + "ao" => {s = ugaoN s ; g = inanimate} ;
|
||||||
|
_ + "eo" => {s = pepeoN s ; g = inanimate} ;
|
||||||
|
_ + "o" => {s = koljenoN s ; g = neuter} ; ---- TODO jedro
|
||||||
|
_ + "lac" => {s = posjetilacN s ; g = inanimate} ;
|
||||||
|
_ + "anj" => {s = suzanjN s ; g = inanimate} ;
|
||||||
|
_ + "nj" => {s = panjN s ; g = inanimate} ;
|
||||||
|
_ + "št" => {s = pristN s ; g = inanimate} ;
|
||||||
|
_ + "ac" => {s = klinacN s ; g = neuter} ;
|
||||||
|
_ + "c" => {s = stricN s ; g = inanimate} ;
|
||||||
|
_ + "in" => {s = gradaninN s ; g = neuter} ;
|
||||||
|
_ + "ak" => {s = cvorakN s ; g = inanimate} ;
|
||||||
|
_ + "a" + ? => {s = nokatN s ; g = inanimate} ;
|
||||||
|
_ + "g" => {s = bubregN s ; g = inanimate} ;
|
||||||
|
_ + "h" => {s = trbuhN s ; g = inanimate} ;
|
||||||
|
_ + "k" => {s = vojnikN s ; g = inanimate} ;
|
||||||
|
_ => {s = izvorN s ; g = inanimate}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
mkgLexNoun : Str -> Gender -> LexNoun = \s,g -> case <s,g> of {
|
||||||
|
<_ + "i", Masc _> => {s = ziriN s ; g = g} ;
|
||||||
|
<_ + "e", Masc _> => {s = bifeN s ; g = g} ;
|
||||||
|
<_ + "o", Masc _> => {s = bifeN s ; g = g} ;
|
||||||
|
<_, g> => smartLexNoun s ** {g = g}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
-- the traditional declensions, following Wiki
|
||||||
|
-- they are also exported in ParadigmsHrv with names izvorN etc
|
||||||
|
|
||||||
|
izvorN : DeclensionType = \izvor ->
|
||||||
|
table {
|
||||||
|
snom => izvor ;
|
||||||
|
sgen => izvor + "a" ;
|
||||||
|
sdat => izvor + "u" ;
|
||||||
|
sacc => izvor + "a" ;
|
||||||
|
svoc => ifSoft izvor
|
||||||
|
(izvor + "u")
|
||||||
|
(palatalize (izvor + "e")) ;
|
||||||
|
sins => ifSoft izvor
|
||||||
|
(izvor + "em")
|
||||||
|
(izvor + "om") ;
|
||||||
|
|
||||||
|
pnom => palatalize (izvor + "i") ;
|
||||||
|
pgen => izvor + "a" ;
|
||||||
|
pdat => ifSoft izvor
|
||||||
|
(palatalize (izvor + "e") + "vima")
|
||||||
|
(palatalize (izvor + "i") + "ma") ;
|
||||||
|
pacc => izvor + "e"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
nokatN : DeclensionType = \nokat ->
|
||||||
|
let
|
||||||
|
nokt = Predef.tk 2 nokat + last nokat
|
||||||
|
in izvorN nokt ** {
|
||||||
|
snom => nokat ;
|
||||||
|
sacc => nokt + "a" ;
|
||||||
|
pgen => nokat + "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
gradaninN : DeclensionType = \gradanin ->
|
||||||
|
let
|
||||||
|
gradan = Predef.tk 2 gradanin ;
|
||||||
|
gradanN = izvorN gradan
|
||||||
|
in numbersNounForms (izvorN gradanin) gradanN ;
|
||||||
|
|
||||||
|
numbersNounForms : (sg, pl : NounForms) -> NounForms =
|
||||||
|
\sg, pl -> sg ** {
|
||||||
|
pnom => pl ! pnom ;
|
||||||
|
pgen => pl ! pgen ;
|
||||||
|
pdat => pl ! pdat ;
|
||||||
|
pacc => pl ! pacc
|
||||||
|
} ;
|
||||||
|
|
||||||
|
vojnikN : DeclensionType = izvorN ;
|
||||||
|
bubregN : DeclensionType = izvorN ;
|
||||||
|
trbuhN : DeclensionType = izvorN ;
|
||||||
|
cvorakN : DeclensionType = nokatN ;
|
||||||
|
|
||||||
|
panjN : DeclensionType = \panj ->
|
||||||
|
numbersNounForms (izvorN panj) (izvorN (palatalize (panj + "e") + "v")) ;
|
||||||
|
|
||||||
|
suzanjN : DeclensionType = \suzanj ->
|
||||||
|
let
|
||||||
|
suznj = Predef.tk 3 suzanj + Predef.dp 2 suzanj
|
||||||
|
in
|
||||||
|
numbersNounForms
|
||||||
|
(izvorN suzanj)
|
||||||
|
(izvorN suznj ** {
|
||||||
|
pgen => "sužanja" ;
|
||||||
|
pdat => "sužnjima"
|
||||||
|
}) ;
|
||||||
|
|
||||||
|
pristN : DeclensionType = panjN ;
|
||||||
|
|
||||||
|
stricN : DeclensionType = \stric ->
|
||||||
|
panjN stric ** {
|
||||||
|
svoc => palatalize (stric + "e")
|
||||||
|
} ;
|
||||||
|
|
||||||
|
klinacN : DeclensionType = \klinac ->
|
||||||
|
let
|
||||||
|
klinc = Predef.tk 2 klinac + last klinac
|
||||||
|
in nokatN klinac ** {
|
||||||
|
svoc => palatalize (klinc + "e") ;
|
||||||
|
pdat => klinc + "ima"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
posjetilacN : DeclensionType = \posjetilac ->
|
||||||
|
let
|
||||||
|
posjetioc = Predef.tk 3 posjetilac + "oc"
|
||||||
|
in izvorN posjetioc ** {
|
||||||
|
snom => posjetilac ;
|
||||||
|
svoc => palatalize (posjetioc + "e") ;
|
||||||
|
sins => palatalize (posjetioc + "e") + "m" ;
|
||||||
|
pgen => posjetilac + "a" ;
|
||||||
|
pdat => palatalize (posjetioc + "i") + "ma"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
pepeoN : DeclensionType = \pepeo ->
|
||||||
|
let
|
||||||
|
pepel = init pepeo + "l"
|
||||||
|
in izvorN pepel ** {snom => pepeo} ;
|
||||||
|
|
||||||
|
ugaoN : DeclensionType = \ugao ->
|
||||||
|
let
|
||||||
|
ugal = init ugao + "l" ;
|
||||||
|
ugl = Predef.tk 2 ugal + last ugal
|
||||||
|
in numbersNounForms
|
||||||
|
(nokatN ugal ** {snom => ugao})
|
||||||
|
(izvorN (ugl + "ov")) ;
|
||||||
|
|
||||||
|
bifeN : DeclensionType = \bife ->
|
||||||
|
izvorN bife ** {svoc => bife + "u"} ;
|
||||||
|
|
||||||
|
ziriN : DeclensionType = \ziri ->
|
||||||
|
bifeN (ziri + "j") ** {
|
||||||
|
snom => ziri ;
|
||||||
|
pdat => ziri + "jima"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
taksiN : DeclensionType = ziriN ;
|
||||||
|
|
||||||
|
---- Danilo, Hrvoje, raščupànko skipped
|
||||||
|
|
||||||
|
koljenoN : DeclensionType = \koljeno ->
|
||||||
|
let
|
||||||
|
koljen = init koljeno
|
||||||
|
in izvorN koljen ** {
|
||||||
|
snom | sacc | svoc => koljeno ;
|
||||||
|
pnom | pacc => koljen + "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
jedroN : DeclensionType = \jedro ->
|
||||||
|
let
|
||||||
|
jed = Predef.tk 2 jedro ;
|
||||||
|
r = last (init jedro) ;
|
||||||
|
in koljenoN jedro ** {
|
||||||
|
pgen => jed + "a" + r + "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
---- drvo - drveta skipped, can also decline as koljeno
|
||||||
|
---- oči, čudo skipped
|
||||||
|
|
||||||
|
poljeN : DeclensionType = \polje ->
|
||||||
|
koljenoN polje ** {
|
||||||
|
pdat => init polje + "ima"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
---- sunce, uže, zvonce, rame, podne, doba
|
||||||
|
|
||||||
|
---- no tables given in the sources for feminine nouns, so guessing from ending tables
|
||||||
|
|
||||||
|
zenaN : DeclensionType = \zena ->
|
||||||
|
let
|
||||||
|
zen = init zena
|
||||||
|
in table {
|
||||||
|
snom => zena ;
|
||||||
|
sgen => zen + "e" ;
|
||||||
|
sdat => zen + "i" ;
|
||||||
|
sacc => zen + "u" ;
|
||||||
|
svoc => zen + "o" ; ---- o/a in Wiki ; o in https://sh.wiktionary.org/wiki/%C5%BEena
|
||||||
|
sins => zen + "om" ;
|
||||||
|
pnom | pacc => zen + "e" ;
|
||||||
|
pdat => zen + "ama" ;
|
||||||
|
pgen => zen + "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
-- Adjectives
|
||||||
|
|
||||||
|
-- to be used for AP: 56 forms for each degree
|
||||||
|
Adjective : Type = {s : Gender => Number => Case => Str} ;
|
||||||
|
|
||||||
|
-- to be used for A, in three degrees: 12 forms in each
|
||||||
|
---- TODO other degrees than positive
|
||||||
|
|
||||||
|
param AForm =
|
||||||
|
msnom | fsnom | nsnom |
|
||||||
|
msgen | fsgen | -- nsgen = msgen
|
||||||
|
msdat | -- msloc,nsdat,nsloc = msdat
|
||||||
|
fsdat | -- fsloc = fsdat
|
||||||
|
fsacc | --
|
||||||
|
msins | -- nsins, pdat, ploc, pins = msins
|
||||||
|
fsins | -- no o/e variation like in msdat
|
||||||
|
mpnom | -- mpvoc = mpnom
|
||||||
|
mpgen -- fpgen, npgen = mpgen
|
||||||
|
;
|
||||||
|
|
||||||
|
oper
|
||||||
|
AdjForms : Type = AForm => Str ;
|
||||||
|
|
||||||
|
invarAdjForms : Str -> AdjForms = \s -> \\a => s ;
|
||||||
|
|
||||||
|
-- used in PositA but will also work in Compar and Superl by calling their record fields
|
||||||
|
|
||||||
|
adjFormsAdjective : AdjForms -> Adjective = \afs -> {
|
||||||
|
s = \\g,n,c => case <n,c,g> of {
|
||||||
|
|
||||||
|
<Sg, Nom|Voc, Masc _>
|
||||||
|
| <Sg, Acc, Masc Inanim> => afs ! msnom ;
|
||||||
|
<Sg, Nom|Voc, Fem>
|
||||||
|
| <Pl, Nom|Acc|Voc, Neutr> => afs ! fsnom ;
|
||||||
|
<Sg, Nom|Acc|Voc, Neutr> => afs ! nsnom ;
|
||||||
|
<Sg, Gen, Masc _ | Neutr>
|
||||||
|
| <Sg, Acc, Masc Anim> => afs ! msgen ;
|
||||||
|
<Sg, Gen, Fem>
|
||||||
|
| <Pl, Nom|Acc|Voc, Fem>
|
||||||
|
| <Pl, Acc, Masc _> => afs ! fsgen ;
|
||||||
|
<Sg, Dat|Loc, Masc _|Neutr> => afs ! msdat ;
|
||||||
|
<Sg, Dat|Loc, Fem> => afs ! fsdat ;
|
||||||
|
<Sg, Acc, Fem> => afs ! fsacc ;
|
||||||
|
<Sg, Ins, Masc _|Neutr>
|
||||||
|
| <Pl,Dat|Loc|Ins, _> => afs ! msins ;
|
||||||
|
<Sg, Ins, Fem> => afs ! fsins ;
|
||||||
|
<Pl, Nom|Voc, Masc _> => afs ! mpnom ;
|
||||||
|
<Pl, Gen,_> => afs ! mpgen
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
velikA : Str -> AdjForms = \velik ->
|
||||||
|
let
|
||||||
|
velk : Str = case velik of {
|
||||||
|
vel + "stan" => vel + "sn" ;
|
||||||
|
vel + "ao" => vel + "l" ;
|
||||||
|
vel + "ak" => voicing vel + "k" ;
|
||||||
|
vel + "a" + k@? => vel + k ;
|
||||||
|
vel + "i" => vel ;
|
||||||
|
_ => velik
|
||||||
|
} ;
|
||||||
|
oe : Str = ifSoft velik "e" "o"
|
||||||
|
in table {
|
||||||
|
msnom => velik ;
|
||||||
|
fsnom => velk + "a" ;
|
||||||
|
nsnom => velk + oe ;
|
||||||
|
msgen => velk + oe + "g" ;
|
||||||
|
fsgen => velk + "e" ;
|
||||||
|
msdat => velk + oe + "m" ;
|
||||||
|
fsdat => velk + "oj" ;
|
||||||
|
fsacc => velk + "u" ;
|
||||||
|
msins => velk + "im" ;
|
||||||
|
fsins => velk + "om" ;
|
||||||
|
mpnom => velk + "i" ;
|
||||||
|
mpgen => velk + "ih"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
regComparAForms : AdjForms -> AdjForms
|
||||||
|
= \aposit -> case init (aposit ! fsnom) of {
|
||||||
|
grub@(_ + "b"|"p"|"v"|"h") => velikA (grub + "lji") ;
|
||||||
|
star => velikA (star + "iji")
|
||||||
|
} ;
|
||||||
|
|
||||||
|
superlAForms : AdjForms -> AdjForms
|
||||||
|
= \acompar -> velikA ("naj" + acompar ! msnom) ;
|
||||||
|
|
||||||
|
od_Str = "od" ;
|
||||||
|
|
||||||
|
---------------------
|
||||||
|
-- Verbs
|
||||||
|
-- Wiki
|
||||||
|
|
||||||
|
VerbForms : Type = VForm => Str ;
|
||||||
|
|
||||||
|
ComplementCase : Type = {s : Str ; c : Case ; hasPrep : Bool} ;
|
||||||
|
|
||||||
|
verbAgr : VerbForms -> Agr -> CTense -> Str ---- TODO tenses
|
||||||
|
= \vf,a,b -> case <a,b> of {
|
||||||
|
<Ag _ n p, CTPres> => vf ! VPres n p ;
|
||||||
|
<Ag g n _, CTPast> => vf ! VPastPart g n
|
||||||
|
} ;
|
||||||
|
|
||||||
|
smartVerbForms : Str -> VerbForms = \s -> case s of {
|
||||||
|
cit + "ati" => aeiVerbForms s (cit + "am") (cit + "ao") ;
|
||||||
|
vid + "jeti" => aeiVerbForms s (vid + "im") (vid + "io") ;
|
||||||
|
radi + "ti" => aeiVerbForms s (init radi + "em") (radi + "o") ;
|
||||||
|
_ => Predef.error ("expect infinitive form \"-ti\", found" ++ s)
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- an traditional paradigm type, with a slight abstraction
|
||||||
|
---- TODO other traditional paradigms
|
||||||
|
|
||||||
|
aeiVerbForms : Str -> Str -> Str -> VerbForms = \citati, citam, citao ->
|
||||||
|
let
|
||||||
|
cita = init citam ;
|
||||||
|
u = case last cita of {
|
||||||
|
"a" => "aju" ;
|
||||||
|
"e" => "u" ;
|
||||||
|
"i" => "e"
|
||||||
|
} ;
|
||||||
|
cital = init citao + "l" ;
|
||||||
|
in table {
|
||||||
|
VInf => citati ;
|
||||||
|
VPres Sg P1 => cita + "m" ;
|
||||||
|
VPres Sg P2 => cita + "š" ;
|
||||||
|
VPres Sg P3 => cita ;
|
||||||
|
VPres Pl P1 => cita + "mo" ;
|
||||||
|
VPres Pl P2 => cita + "te" ;
|
||||||
|
VPres pl P3 => init cita + u ;
|
||||||
|
VPastPart (Masc _) Sg => citao ;
|
||||||
|
VPastPart Fem Sg => cital + "a" ;
|
||||||
|
VPastPart Neutr Sg => cital + "o" ;
|
||||||
|
VPastPart (Masc _) Pl => cital + "i" ;
|
||||||
|
VPastPart Fem Pl => cital + "e" ;
|
||||||
|
VPastPart Neutr Pl => cital + "a"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
-- copula
|
||||||
|
|
||||||
|
jesam_Copula : {short, long, negative : Number => Person => Str} =
|
||||||
|
let
|
||||||
|
sam : Number => Person => Str = table {
|
||||||
|
Sg => table {
|
||||||
|
P1 => "sam" ;
|
||||||
|
P2 => "si" ;
|
||||||
|
P3 => "je"
|
||||||
|
} ;
|
||||||
|
Pl => table {
|
||||||
|
P1 => "smo" ;
|
||||||
|
P2 => "ste" ;
|
||||||
|
P3 => "su"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in {
|
||||||
|
short = sam ;
|
||||||
|
long = \\n,p => case <n,p> of {
|
||||||
|
<Sg,P3> => "jeste" ; --- wiki: jest(e)
|
||||||
|
_ => sam ! n ! p
|
||||||
|
} ;
|
||||||
|
negative = \\n,p => "ni" + sam ! n ! p
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- Wiki: some grammars (chiefly Serbian ones) treat jesam as a defective verb
|
||||||
|
-- having only present tense. Others treat these forms as two realizations
|
||||||
|
-- of the same irregular verb biti, jesam being imperfective and budem perfective.
|
||||||
|
|
||||||
|
copula_VerbForms : VerbForms = table {
|
||||||
|
VPres n p => jesam_Copula.short ! n ! p ;
|
||||||
|
v => biti_VerbForms ! v
|
||||||
|
} ;
|
||||||
|
|
||||||
|
biti_VerbForms : VerbForms = aeiVerbForms "biti" "budem" "bio" ;
|
||||||
|
|
||||||
|
imati_VerbForms : VerbForms = aeiVerbForms "imati" "imam" "imao" ;
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
-- Pronouns
|
||||||
|
|
||||||
|
PronForms : Type = {
|
||||||
|
nom,
|
||||||
|
gen, cgen, -- bare, clitic (also as Acc)
|
||||||
|
dat, cdat, -- also as Loc
|
||||||
|
ins : Str ;
|
||||||
|
a : Agr
|
||||||
|
} ;
|
||||||
|
|
||||||
|
personalPron : Agr -> PronForms = \a ->
|
||||||
|
{a = a ; cnom = []} **
|
||||||
|
case a of {
|
||||||
|
Ag _ Sg P1 => {
|
||||||
|
nom = "ja" ;
|
||||||
|
gen = "mene" ;
|
||||||
|
cgen = "ma" ;
|
||||||
|
dat = "meni" ;
|
||||||
|
cdat = "mi" ;
|
||||||
|
ins = "mnom"
|
||||||
|
} ;
|
||||||
|
Ag _ Sg P2 => {
|
||||||
|
nom = "ti" ;
|
||||||
|
gen = "tebe" ;
|
||||||
|
cgen = "te" ;
|
||||||
|
dat = "tebi" ;
|
||||||
|
cdat = "ti" ;
|
||||||
|
ins = "tobom"
|
||||||
|
} ;
|
||||||
|
Ag Fem Sg P3 => {
|
||||||
|
nom = "ona" ;
|
||||||
|
gen = "nje" ;
|
||||||
|
cgen = "je" ;
|
||||||
|
dat = "njoj" ;
|
||||||
|
cdat = "joj" ;
|
||||||
|
ins = "njom"
|
||||||
|
} ;
|
||||||
|
Ag g Sg P3 => {
|
||||||
|
nom = case g of {
|
||||||
|
Masc _ => "on" ;
|
||||||
|
_ => "ono"
|
||||||
|
} ;
|
||||||
|
gen = "njega" ;
|
||||||
|
cgen = "ga" ;
|
||||||
|
dat = "njemu" ;
|
||||||
|
cdat = "mu" ;
|
||||||
|
ins = "njim"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
Ag _ Pl P1 => {
|
||||||
|
nom = "mi" ;
|
||||||
|
gen, cgen = "nas" ;
|
||||||
|
dat, ins = "nama" ;
|
||||||
|
cdat = "nam"
|
||||||
|
} ;
|
||||||
|
Ag _ Pl P2 => {
|
||||||
|
nom = "vi" ;
|
||||||
|
gen, cgen = "vas" ;
|
||||||
|
dat, ins = "vama" ;
|
||||||
|
cdat = "vam"
|
||||||
|
} ;
|
||||||
|
Ag g Pl P3 => {
|
||||||
|
nom = case g of {
|
||||||
|
Masc _ => "oni" ;
|
||||||
|
Fem => "one" ;
|
||||||
|
Neutr => "ona"
|
||||||
|
} ;
|
||||||
|
gen = "njih" ;
|
||||||
|
cgen = "ih" ;
|
||||||
|
dat, ins = "njima" ;
|
||||||
|
cdat = "im"
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
possessivePron : Agr -> AdjForms = \a -> case a of {
|
||||||
|
Ag _ Sg P1 => velikA "moj" ;
|
||||||
|
Ag _ Sg P2 => velikA "tvoj" ;
|
||||||
|
Ag (Masc _) Sg P3 => velikA "njegov" ;
|
||||||
|
Ag (Fem|Neutr) Sg P3 => velikA "njezin" ; -- BCMS: Hrv: otherwise njen
|
||||||
|
Ag _ Pl P1 => velikA "naš" ;
|
||||||
|
Ag _ Pl P2 => velikA "vaš" ;
|
||||||
|
Ag _ Pl P3 => velikA "njihov"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
{-
|
||||||
|
reflPossessivePron : DemPronForms = otcovA "svoj" ** {
|
||||||
|
msnom = "svoj" ; msgen = "svojho" ; msdat = "svojmu" ;
|
||||||
|
msins = "svojím" ;
|
||||||
|
ampnom = "svoji" ;
|
||||||
|
nsnom, fpnom = "svoje" ;
|
||||||
|
pgen = "svojich" ;
|
||||||
|
pdat = "svojim" ;
|
||||||
|
pins = "svojimi" ;
|
||||||
|
} ;
|
||||||
|
-}
|
||||||
|
|
||||||
|
mkPron : Agr -> PronForms ** {poss : AdjForms} = \a ->
|
||||||
|
personalPron a ** {poss = possessivePron a} ;
|
||||||
|
|
||||||
|
|
||||||
|
param NumSize = NS_1 | NS_2_4 | NS_5_20 | NS_20_ ;
|
||||||
|
|
||||||
|
oper
|
||||||
|
Determiner : Type = {
|
||||||
|
s : Gender => Case => Str ;
|
||||||
|
size : NumSize
|
||||||
|
} ;
|
||||||
|
|
||||||
|
{-
|
||||||
|
-- interrogatives TODO
|
||||||
|
|
||||||
|
ktoForms : Case => Str = table {
|
||||||
|
Nom => "kto" ;
|
||||||
|
Gen | Acc => "koho" ;
|
||||||
|
Dat => "komu" ;
|
||||||
|
Loc => "kom" ;
|
||||||
|
Ins => "kým"
|
||||||
|
} ;
|
||||||
|
|
||||||
|
coForms : Case => Str = table {
|
||||||
|
Nom|Acc => "čo" ;
|
||||||
|
Gen => "čoho" ;
|
||||||
|
Dat => "čomu" ;
|
||||||
|
Loc => "čom" ;
|
||||||
|
Ins => "čím"
|
||||||
|
} ;
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------
|
||||||
|
-- combining nouns with numerals
|
||||||
|
|
||||||
|
oper
|
||||||
|
numSizeForm : (Number => Case => Str) -> NumSize -> Case -> Str
|
||||||
|
= \cns,n,c -> case n of {
|
||||||
|
NS_1 => cns ! Sg ! c ;
|
||||||
|
NS_2_4 => cns ! Pl ! c ;
|
||||||
|
_ => case c of {
|
||||||
|
Nom | Acc => cns ! Pl ! Gen ;
|
||||||
|
_ => cns ! Pl ! c
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
numSizeAgr : Gender -> NumSize -> Person -> Agr
|
||||||
|
= \g,ns,p -> case ns of {
|
||||||
|
NS_1 => Ag g Sg p ;
|
||||||
|
NS_2_4 => Ag g Pl p ;
|
||||||
|
_ => Ag Neutr Sg p ---- TODO verify
|
||||||
|
} ;
|
||||||
|
|
||||||
|
numSizeNumber : NumSize -> Number = \ns -> case ns of {
|
||||||
|
NS_1 => Sg ;
|
||||||
|
_ => Pl ---- TO CHECK
|
||||||
|
} ;
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user