# hfst-xfst skript
# kompileerimiseks e. muunduri silbitaja.hfst tegemiseks tee nii:
# echo 'save stack silbitaja.hfst' | hfst-xfst -l silbita.xfscript
# kasutamine: echo 'leaanika' | hfst-lookup silbitaja.hfst
# tulemus: le.aa.ni.ka
#
# Silbitusreeglid «Eesti keele käsiraamatust» ja nende modifikatsioonid siin:
#
# 1. üksik kaashäälik täishäälikute vahel kuulub järgmisse silpi: ka-la, lu-ge-mi-ne, e-la-gu;
#
# 2. kui täishäälikute vahel on mitu kaashäälikut kõrvuti, siis kuulub ainult viimane neist
# järgmisse silpi: tul-la, kur-vad, kind-lam, mars-si-ma, mürts-ti;
# --> juhul, kui selle reegli järgimisel oleks silbipiir ebaloomulikus kohas sulghääliku järel,
# siis kuulub järgmisse silpi klusiiliga algav kaashäälikuühend: eks-tra, vels-kri, vints-kleb
#
# 3. (üli)pikk täishäälik või diftong kuulub tavaliselt ühte silpi: pii-lub, suu-bu-ma, lau-lud,
# toa, lui-tu-nud; kui kahe vokaali vahelt läheb morfeemipiir, siis kuuluvad nad ka eri
# silpidesse: ava-us – ava on tüvi, us on tuletusliide;
# --> (üli)pikk täishäälik või diftong kuulub ALATI ühte silpi - kui kaks kõrvutiolevat
# täishäälikut ei kuulu ühte silpi, siis nad ei moodustagi diftongi; diftongi mitte moodustavate
# vokaalijärjendite leidmine on küllalt keeruline, sõltudes nii häälikutest endist kui ka järjendi
# naabriks olevatest silpidest (ja nende pikkustest, rõhust ja arvust)
#
# 4. kolme täishääliku järjendist kuulub viimane teise silpi: põu-a-ne, luu-ad, lai-ad, rii-u,
# hoi-us-te;
# --> aga kui viimased kaks moodustavad pika täishääliku, siis kuuluvad hoopis viimased kaks
# teise silpi: li-aan
#
# 5. liitsõnades silbitatakse iga koostisosa eraldi: tä-he-tea-dus, va-na-e-ma, las-te-ai-a-laps;
#
# 6. võõrsõnu silbitatakse üldiselt nagu eesti omasõnu: dü-na-mo (1. reegel), bar-rel, port-fell
# (2. reegel), faa-san (3. reegel), muu-se-um (muuse on tüvi, um tuletusliide – 3. reegli
# erijuhtum), o-aas, mah-hi-nat-si-oon (4. reegel, kuid eri silpi võib kuuluda ka esimene vokaal);
# --> muuseum silbitatakse muu-seum
#
# 7. liitvõõrsõnu võib silbitada kahte moodi: kas nagu liitsõnu või nagu lihtsõnu, nt
# fo-to-graaf ~ fo-tog-raaf, te-le-skoop ~ te-les-koop, de-pres-si-oon ~ dep-res-si-oon; kui
# võõrsõna järelosa on eesti keeles iseseisva sõnana tarvitusel, on soovitatav liigendada
# liitsõnana, nt des-in-fekt-si-oon (mitte de-sin-fekt-si-oon), sub-troo-pi-ka (mitte
# subt-roo-pi-ka), mo-no-gramm (mitte mo-nog-ramm).
#
# Võõrnimede poolitamisel on soovitatav mitte lahutada tähejärjendit, mis hääldub ühe häälikuna,
# nt ck, ch, sch, sh, th, tz, sz: Bro-cken, Man-ches-ter, Rem-scheid, Pemb-roke-shire, Sou-thern,
# Ko-tze-bue, Báta-szek. Liitvõõrnimesid võib poolitada kas nagu liitsõnu või nagu lihtsõnu:
# Pet-ro-grad ~ Pet-rog-rad, Neu-stadt ~ Neus-tadt, Gold-smith ~ Golds-mith.
# --> siin võõrnimede hääldust ei järgita
#
define V [a|e|i|o|u|õ|ä|ö|ü];
define C [b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|š|z|ž|t|v|w|x|y];
define Letter [V|C];
define Vh [i|u|ü]; # high vowels
define Vr [u|ü|o|ö]; # round vowels
# long vowels
define V2 [a^2 | e^2 | i^2 | o^2 | u^2 | õ^2 | ä^2 | ö^2 | ü^2];
define Stop [g|b|d|k|p|t] ;
define CNotStop [C - Stop] ;
# (1) --- eesti silbitamise põhireeglid
! Karttunenilt
define MarkCVSyll [C* V+ C* @-> ... "." || _ C V ];
! kui on rohkem kui 2 vokaali järjest
define MarkV2plusV [[. .] -> "." \/ V2 _ V] ; ! kuu.e ; ja et oleks aaaaaa -> aa.aa.aa
define MarkVplusV2 [[. .] -> "." \/ V _ V2] ; ! li.aan
define MarkV2 [MarkV2plusV .o. MarkVplusV2] ;
define MarkVVhplusV [[. .] -> "." \/ V Vh _ V] ; ! sau.e ; ui.ui.ui
define MarkVplusVVh [[. .] -> "." \/ V _ V Vh] ; ! mi.au
define MarkVVplusV [[. .] -> "." \/ V V _ V] ; ! poe.a
define MarkVVV [MarkVVhplusV .o. MarkVplusVVh .o. MarkVVplusV] ;
# võõrsõnad:
# y võib olla vokaal või j
# w võib olla vokaal või v
# oleta konteksti järgi, kas on vokaal või konsonant:
# kui on üksi vokaalide vahel, siis on vist konsonant
define MarkCVSyllYW [[. .] -> "." ||
V _ w V ,
V _ y V ] .o.
[[. .] -> "." ||
V C* _ C y [\V | .#.] ,
y C* _ C [V | y] ] ;
# (2) silbi tuumaks on üks või kaks vokaali.
# kui need kaks on erinevad, siis mõnikord nad ei moodustagi diftongi, vaid
# silbipiir jookseb nende vahelt
! diftongid vokaaliruumis; paigut. esimese vokaali põhjal
! sulud tähendavad, et diftongina ainult esisilbis (e. rõhulises silbis)
! kõrge i | (u) (e) (o) (a) | ü | i (e) (o) (a) | | u | i (e) (o) (a)
! kesk e | i |u| (o) (a) | ö | i (u) e a | õ | i u e o a | o | i u e a
! madal | ä | i u e o | | a | i u e o
!
! tingimused, millal kahe eri vokaali järjend pole diftong:
! (1) täpi-vokaal ei saa millelegi järgneda (v.a. iseendale)
! (2) tagavokaal ei saa järgneda samal kõrgusel olevale sarnasele eespoolsele vokaalile
! (3) kõrgele vokaalile ei saa järgneda mitte-kõrge
! (4) esivokaalile (e, i) ei saa järgneda ei temaga samal tasemel olevat ega temast tagapool olevat
! = esivokaalile (e, i) saab järgneda ainult temast kõrgemal olev vokaal
! (5) mitte-taga-ümarvokaalile ei saa järgneda ümarvokaali
! tingimused võivad kattuda, nt. iä pole diftong, sest kõrgele vokaalile ei saa järgneda mittekõrget,
! aga ka sellepärast, et täpi-vokaal ei saa olla järgnev osa
! ka ülipika silbi järel on i.on, nt pen.si.on; võib-olla peaks seda mingi hilisema reegliga muutma?
! mitmel juhul on lisatingimuseks, et silp pole sõnas esimene
! (nt müokardiit puhul müo on diftong); aga sel juhul (imelikult) ka nt müont, mitte mü.ont
! |eu| peaks olema (eu), aga praktilistel kaalutlustel käsitletakse teda eraldi, vt allpool
define MarkNonDiphtong [[. .] -> "."
|| [V - õ] _ õ , ! (1)
[V - ä] _ ä ,
[V - ö] _ ö ,
[V - ü] _ ü ,
ä _ a , ! (2)
ö _ o ,
ü _ u ,
"." C+ Vh _ [V - Vh] , ! (3) i.e, u.a etc
"." C+ e _ [V - Vh - e] , ! (4) e.o, e.a
"." C+ i _ [V - i] , ! i.o, i.u etc
"." C+ ö _ [Vr - ö]]; ! (5) ö.u
define NonDiphVõäöü [[. .] -> "."
|| [V - õ] _ õ , [V - ä] _ ä , [V - ö] _ ö , [V - ü] _ ü];
define NonDiphäaöoüu [[. .] -> "." || ä _ a , ö _ o , ü _ u] ;
! mis saab järgenda iuü-le?
! i-le järgnemist def-b NonDiphFr nagunii
! see ütleb, et võimalikud on ui ja üi
! eelnevate reeglite tõttu on iü, uü võimatu, üu võimatu
define NonDiphHigh [[. .] -> "." || "." C+ Vh _ [V - Vh] ];
! kui eesvokaalile järgneb miski, mis on temast allpool või tagapool
! i on kirdenurgas, s.t. kõik on temast allpool või tagapool
! e-st üleval ja sama ees on ainult i
define NonDiphFr [[. .] -> "." ||
"." C+ e _ [V - e - i] ,
"." C+ i _ [V - i] ];
! see on tegelt vigane, sest Vh = i|ü|u
! aga teen nii, et oleks samasugune kui artiklis
define NonDiphFr [[. .] -> "." ||
"." C+ e _ [V - e - Vh] , ! (4) e.o, e.a NonDiphHigh
"." C+ i _ [V - i] ]; ! i.o, i.u etc
define NonDiphRound [[. .] -> "." || "." C+ ö _ [Vr - ö]];
# järgsilbi e.u aga mitte muuse.um ega petroole.um
# (mida hääldatakse muusjum ja petrooljum)
# seda seaduspära võiks ju kajastada MarkNonDiphtong,
# aga tegelikus elus on eu-ga silp sageli rõhuline (terapeut) ja selliste arvestamine
# tähendaks suuri erandiloendeid
define MarkEU [ [. .] -> "." || "." C+ e _ u (".") [m|s] ] .o.
["." -> "" || m u u (".") s e _ u (".") m ,
p e t (".") r o o (".") l e _ u (".") m ] ;
# kolmesilbiline sõna, millel võiks olla rõhk viimasel silbil:
# viimases silbis võiks olla diftong
# bartolomeus, amadeus, jubileum, mausoleum; asalea, (mitte panatsea)
define DiphtongInFinalSyll ["." -> "" || V "." C+ V "." C e _ u (".") [m|s] ,
V "." C+ V "." C e _ a ] ;
define MarkNonDi [NonDiphVõäöü .o. NonDiphäaöoüu .o. NonDiphHigh .o. NonDiphFr .o. MarkEU .o. DiphtongInFinalSyll .o. NonDiphRound];
# ülipikk silp võib muuta
# 1) eelneva i.o i.a i.u i.e häälduse jo ja ju je-ks, s.t. silbipiir i ja vokaali vahelt kaob
# 2) järgneva -- ,, --
define FixIU ["." -> "" ||
V V "." C+ i _ u [\V | .#.] ,
V C+ "." C+ i _ u [\V | .#.] ,
V "." C+ V "." c i _ u (".") s , ! leedu nimi
"." C i _ u (".") n a (".") s , ! leedu nimi
"." C i _ u (".") t e ] ; ! leedu nimi
define FixIOC ["." -> "" ||
"." C+ i _ o C* "." C V V , ! sot.sio.loog
t "." s i _ a C* "." C V V , ! i.nit.sia.tiiv
"." C+ i _ a C* "." l i s (".") [t|m] , ! sot.sia.list
C i _ e C* "." C V V , ! o.rien.tiir
"." C i _ e "." n e , ! pruns.kie.ne
"." C+ i _ o C* "." n i s (".") [t|m] ] .o. ! sio.nist
["." -> "" || V V "." C+ i _ o C* "." C V ,
V C+ "." C+ i _ o C* "." C V ] ;
# sõnad, milles tegelt io hääldatakse jo ka juhul, kui io-le ei järgne silpi
define FixIOCWord ["." -> "" || a "." k o r "." d i _ o n ,
b a s "." t i _ o n ,
j u u "." n i _ o r ,
l e e "." g i _ o n ,
m i l "." l i _ o n ,
p a n "." s i _ o n ,
p e n "." s i _ o n ,
r a a "." d i _ o [\V | .#.] ,
s k o r "." p i _ o n ,
s t u u "." d i _ o [\V | .#.] ,
t š e m "." p i _ o n ] ;
# kokku
define FixI [FixIU .o. FixIOC .o. FixIOCWord];
# EKI keelnõuanne arvab, et nii ei tohi silbitada,
# s.t. sioon peab olema si.oon
# ... ja seda siinolevat ma ei kasutagi; ta on siin lihtsalt selleks, et vajadusel saaks kasutusele võtta
define FixIOV ["." -> "" || t "." s i _ a a (".") l , ! spet.siaal
"." Letter+ "." C+ i _ a a (".") l , ! ad.ver.biaal
"." C+ i _ o o ]; ! rat.sioon
# täishäälikuga algavad liited nagu -us, -ism, -ist;
# kusjuures välista ilma sellise liiteta sõnad
# teismeline, seismine, sesmiline, päismik, suisman
define MarkDerivBorder [[. .] -> "." || Letter [V - i] _ i s (".") m [.#. | i ],
a "." v a _ u (".") s ] .o.
["." -> "" || s e _ i s "." m i ,
_ i s "." m i (".") k [.#. | u | k]] ;
# katse minimaalsega, kas see üldse teeb asja halvemaks? EKI silbibaasis teeb küll...
# define MarkDerivBorder [[. .] -> "." || a "." v a _ u (".") s ];
# üksikud sõnad
# milles silbipiir on erandlikult vokaalide vahel
define NonDiphtongInLoanWords [[. .] -> "." || {kli} _ e n [d|t] ,
a _ o i d ,
.#. a _ o r [t|d] ,
b i _ o p s i a ,
b r i _ o š ,
d e m i _ u r g ,
p a _ e l l ,
u _ e l l , ! du.ell, cru.el.la
d u _ e t [t|i] ,
g a s t r o _ e ,
k a r a _ u l ,
s s i _ o p e i a ,
m e _ a n d (e) r ,
m i _ a s m ,
n ü _ a n s ,
p r e _ a m b u ,
p r o t o _ a ,
r e _ a k t o ,
s e _ a n s ,
z o _ o i d ,
t r i _ o ,
a l t r u _ i s t ,
a r h a _ i s t ,
.#. a t e _ i s t ,
d a d a _ i s t ,
.#. d e _ i s t ,
e g o _ i s t ,
e s s e _ i s t ,
e u r o p e _ i s t ,
h e b r a _ i s t ,
h i n d u _ i s t ,
k a s u _ i s t ,
o b o _ i s t ,
p a n "_" t e _ i s t ,
p o l ü "_" t e _ i s t ,
p r o s a _ i s t ] ;
# üksikud sõnad
# milles vokaalide vahel silbipiiri polegi (ehkki tavaliselt sellistes kohtades on)
define DiphtongInLoanWords ["." -> "" || m a "." r i _ o "." n e (".") t ,
k o "." r e _ a ,
p e o "." l e _ o ] ;
# (3) konsonantühendid
! võõrliited ja -sõnad, millel on justkui läbinähtav tähendus
! ja mis algavad mitme kaashäälikuga
! nihuta silbituskoht klusiili järelt tema ette
! + arvesta üksiksõnadu-erandeid
# seda siin tegelikult ei kasuta; oleks vajalik poolitamise jaoks, kui
# eesmärk oleks sõnu tähenduslikult tükeldada
define ConsClusterLoanComponents [[. .] -> "." || V C* o _ k l a s t ,
V C* o _ t s e e n ,
v e l s k _ r i ,
s a n s k _ r i t ,
e k s _ t a a ,
a d _ s t r a a [t|d] ,
k a t a s t _ r o ,
a p o _ s t r o ,
b ö f s _ t r o g ,
m e t _ s e e n ,
d e f i t _ s i i d] .o.
[V C* -> ... "." || _ b r a h h ,
_ d r o o ,
_ f r e e n ,
_ g l ü ü f ,
_ g n o (o) s ,
_ g r a (a) f ,
_ g r a d ,
_ g r a m ,
_ g l o b ,
_ h t o o n ,
_ k l i i n ,
_ k l i n a a l ,
_ k r a a [t|d] ,
_ k r a t i s e e r ,
_ k r a t i s m ,
_ k r o o m ,
_ k r o m a a ,
_ k r o o n ,
_ k r o n o ,
_ k r o n i s ,
_ p l a a n ,
_ p l a a s i a ,
_ p l e e g ,
_ p l o i d ,
_ p t ü h h o n ,
_ s k a a f ,
_ s k o o [p|b] ,
_ s k r i p t ,
_ s k r i b e e r ,
_ s p e r m ,
_ s t a a s ,
_ s t a a t i ,
_ s t e e n ,
_ s t r i k a t s ,
_ t r o o f ,
_ t r o f e e r ,
_ t r o o [p|b] ,
_ t s e e n ,
_ t s i i d ,
_ t s ü ü [t|d] ] .o.
[[. .] -> "." || V C* s _ k r C* V] .o.
[[. .] -> "." || V C* s _ p r C* V] .o.
[[. .] -> "." || V C* [g|b|d|k|p|t] s _ t r C* V] ;
# liiga keerulised, s.t. mitte-eestipärased kaashäälikuühendid
# silbi piir võiks seal olla sulghääliku ees
# nt. s-kr s-pr k-ps
# see on häälduspärane alternatiiv ConsClusterLoanComponents-ile
# probleemid: lik, mine, ne, jas vms liide võiks jääda ikkagi silbi alustajaks,
# st. ars-tlik oleks halb silbitus
define ComplexConsCluster [[. .] -> "." || V C* [Stop - k] _ k r C* V ,
V C* [Stop - p] _ p r C* V ,
V C* [Stop - t] _ t r C* V ,
V C* x _ Stop C* V ,
V C* Stop s _ Stop C* V ,
V C* s _ Stop r C* V ,
V C* [C - Stop] s _ Stop s C* V ,
V C* [k|p|t|s|f|h|š] _ [g|b|d] CNotStop+ V] ;
#define ComplexConsCluster [[. .] -> "." || V C* [Stop - k] _ k r C* V ,
# V C* [Stop - p] _ p r C* V ,
# V C* [g|b] _ t r C* V ,
# V C* s _ k r C* V ,
# V C* s _ p r C* V ,
# V C* x _ k r C* V ,
# V C* x _ p r C* V ,
# V C* C s _ k [l|m|n] C* V ,
# V C* C s _ p [l|m|n] C* V ,
# V C* [C - n] s _ t r C* V ,
# V C* C s _ t s C* V ,
# V C* [k|p|t|s|f|h|š] _ [g|b|d] CNotStop+ V] ;
define Syllabify [MarkCVSyllYW .o.
NonDiphtongInLoanWords .o.
ComplexConsCluster .o.
MarkCVSyll .o. MarkV2 .o. MarkVVV .o. MarkNonDi .o.
FixI .o.
MarkDerivBorder .o.
DiphtongInLoanWords ];
regex Syllabify ;