Commit bf2d090d authored by Tino Didriksen's avatar Tino Didriksen

Imported Upstream version 0.1.0~r81872

parents
This diff is collapsed.
###############################################################################
## Makefile for apertium-crh
###############################################################################
RELEASE=0.1
VERSION=0.1.0
LANG1=crh
BASENAME=apertium-$(LANG1)
TARGETS_COMMON = \
$(LANG1).automorf.hfst \
$(LANG1).automorf.bin \
$(LANG1).automorf.att.gz \
$(LANG1).autogen.hfst \
$(LANG1).autogen.bin \
$(LANG1).autogen.att.gz \
$(LANG1).autopgen.bin \
$(LANG1).rlx.bin
# This include defines goals for install-modes, .deps/.d and .mode files:
@ap_include@
###############################################################################
## Crimean Tatar transducer
###############################################################################
.deps/$(LANG1).err.hfst: $(BASENAME).err.twol .deps/.d
hfst-twolc $< -o $@
.deps/$(LANG1).twol.hfst: $(BASENAME).$(LANG1).twol .deps/.d
hfst-twolc $< -o $@
.deps/$(LANG1).RL.lexc: $(BASENAME).$(LANG1).lexc .deps/.d
cat $< | grep -v -e 'Dir/LR' -e 'Err/Orth' > $@
.deps/$(LANG1).LR.lexc: $(BASENAME).$(LANG1).lexc .deps/.d
cat $< | grep -v -e 'Dir/RL' > $@
.deps/$(LANG1).EL.lexc: $(BASENAME).$(LANG1).lexc .deps/.d
cat $< | grep -v -e 'Err/Orth' > $@
.deps/$(LANG1).RL.lexc.hfst: .deps/$(LANG1).RL.lexc
hfst-lexc --Werror $< -o $@ -v
.deps/$(LANG1).LR.lexc.hfst: .deps/$(LANG1).LR.lexc
hfst-lexc --Werror $< -o $@ -v
.deps/$(LANG1).EL.lexc.hfst: .deps/$(LANG1).EL.lexc
hfst-lexc --Werror $< -o $@ -v
.deps/$(LANG1).RL.hfst: .deps/$(LANG1).RL.lexc.hfst .deps/$(LANG1).twol.hfst
hfst-compose-intersect -1 .deps/$(LANG1).RL.lexc.hfst -2 .deps/$(LANG1).twol.hfst -o $@
# We make an crh.LR.err.hfst by taking the transducer produced from the
# twol file with error rules (apertium-crh.err.twol), we then remove all the
# strings from that which are in the normative orthography transducer.
# After that we append <err_orth> to the tag string.
.deps/$(LANG1).LR.err.hfst: .deps/$(LANG1).LR.lexc.hfst .deps/$(LANG1).err.hfst .deps/$(LANG1).LR.hfst
# lexc + error model twol
hfst-compose-intersect -1 .deps/$(LANG1).LR.lexc.hfst -2 .deps/$(LANG1).err.hfst | hfst-minimise -o .deps/$(LANG1).LR.err.hfst.tmp
# extract valid surface forms
hfst-project -p output .deps/crh.LR.hfst | hfst-minimise -o .deps/$(LANG1).LR.corr.hfst.tmp
# get the valid surface forms that are in the error model
hfst-invert .deps/$(LANG1).LR.err.hfst.tmp | hfst-compose -1 .deps/$(LANG1).LR.corr.hfst.tmp -2 - | hfst-invert -o .deps/$(LANG1).LR.err.hfst.tmp2
# subtract the valid surface forms from the error model
hfst-subtract -1 .deps/$(LANG1).LR.err.hfst.tmp -2 .deps/$(LANG1).LR.err.hfst.tmp2 -o .deps/$(LANG1).LR.err.hfst.tmp3
# append the error tag to the error model strings
echo "<err_orth>:0" | hfst-strings2fst -e 0 -S | hfst-concatenate -1 .deps/$(LANG1).LR.err.hfst.tmp3 -2 - -o $@
# This is the normative transducer, using the standard lexc and the full twol file
.deps/$(LANG1).LR.hfst: .deps/$(LANG1).LR.lexc.hfst .deps/$(LANG1).EL.lexc.hfst .deps/$(LANG1).twol.hfst
hfst-compose-intersect -1 .deps/$(LANG1).EL.lexc.hfst -2 .deps/$(LANG1).twol.hfst | hfst-minimise -o $@
# The final analyser is a combination of the normative analyser and the error analyser.
$(LANG1).automorf.hfst: .deps/$(LANG1).LR.hfst .deps/$(LANG1).LR.err.hfst
hfst-union -1 .deps/$(LANG1).LR.hfst -2 .deps/$(LANG1).LR.err.hfst | hfst-invert | hfst-fst2fst -w -o $@
$(LANG1).autogen.hfst: .deps/$(LANG1).RL.hfst
hfst-fst2fst -w $< -o $@
$(LANG1).autogen.att.gz: $(LANG1).autogen.hfst
hfst-fst2txt $< | gzip -9 -c -n > $@
$(LANG1).automorf.att.gz: $(LANG1).automorf.hfst
hfst-fst2txt $< | gzip -9 -c -n > $@
$(LANG1).autogen.bin: $(LANG1).autogen.att.gz .deps/.d
zcat < $< > .deps/$(LANG1).autogen.att
lt-comp lr .deps/$(LANG1).autogen.att $@
$(LANG1).automorf.bin: $(LANG1).automorf.att.gz .deps/.d
zcat < $< > .deps/$(LANG1).automorf.att
lt-comp lr .deps/$(LANG1).automorf.att $@
$(LANG1).autopgen.bin: $(BASENAME).post-$(LANG1).dix
lt-comp lr $< $@
###############################################################################
## Debugging transducers (for testvoc)
###############################################################################
debug: .deps/$(LANG1).LR-debug.hfst .deps/$(LANG1).lexc.hfst
.deps/$(LANG1).LR-debug.hfst: $(BASENAME).$(LANG1).lexc .deps/.d
cat $< | grep -v 'Dir/RL' | grep -v 'Use/Circ' > .deps/$(LANG1).LR-debug.lexc
hfst-lexc --Werror .deps/$(LANG1).LR-debug.lexc -o .deps/$(LANG1).LR-debug.lexc.hfst -v
hfst-compose-intersect -1 .deps/$(LANG1).LR-debug.lexc.hfst -2 .deps/$(LANG1).twol.hfst -o $@
.deps/$(LANG1).lexc.hfst: .deps/$(LANG1).RL.lexc.hfst
hfst-fst2fst -w -i $< -o $@
###############################################################################
## Disambiguation rules
###############################################################################
$(LANG1).rlx.bin: $(BASENAME).$(LANG1).rlx $(CGCOMP)
$(CGCOMP) $< $@
###############################################################################
## Spell checker
###############################################################################
$(LANG1).zhfst: .deps/acceptor.default.hfst .deps/errmodel.default.hfst
rm -f $@
zip -j $@ .deps/acceptor.default.hfst .deps/errmodel.default.hfst speller/index.xml
.deps/errmodel.default.hfst: .deps/words.default.hfst .deps/strings.default.hfst
python dev/editdist.py -v -s -d 1 -e '@0@' -i speller/editdist.default.txt -a .deps/acceptor.default.hfst \
| hfst-txt2fst -e '@0@' -o .deps/editdist.default.hfst
hfst-disjunct .deps/strings.default.hfst .deps/editdist.default.hfst \
| hfst-minimise | hfst-repeat -f 1 -t 2 -o .deps/editstrings.default.hfst
hfst-disjunct .deps/words.default.hfst .deps/editstrings.default.hfst \
| hfst-fst2fst -f olw -o $@
.deps/words.default.hfst: speller/words.default.txt
grep -v -e "^#" -e "^$$" $< | hfst-strings2fst -j -o $@
.deps/strings.default.hfst: speller/strings.default.txt .deps/anystar.hfst
grep -v -e "^#" -e "^$$" $< | hfst-strings2fst -j | hfst-concatenate .deps/anystar.hfst - |\
hfst-concatenate - .deps/anystar.hfst -o $@
.deps/anystar.hfst:
echo "?*;" | hfst-regexp2fst -S -o $@
.deps/acceptor.default.hfst: $(LANG1).autogen.hfst
cat $< | hfst-fst2fst -t | hfst-project --project=lower | hfst-minimise |hfst-fst2fst -f olw -o $@
###############################################################################
## Distribution
###############################################################################
EXTRA_DIST=$(BASENAME).$(LANG1).lexc \
$(BASENAME).$(LANG1).twol \
$(BASENAME).$(LANG1).rlx \
$(BASENAME).post-$(LANG1).dix \
$(LANG1).prob \
modes.xml
###############################################################################
## Installation stuff
###############################################################################
#
# apertium_crh_dir: This is where the compiled binaries go
# apertium_crh_srcdir: This is where the source files go
apertium_crhdir=$(prefix)/share/apertium/$(BASENAME)/
apertium_crh_srcdir=$(prefix)/share/apertium/$(BASENAME)/
EXTRA_TARGETS=
if HAVE_HFSTOSPELL
EXTRA_TARGETS += $(LANG1).zhfst
endif # HAVE_HFSTOSPELL
apertium_crh_DATA=$(TARGETS_COMMON) $(EXTRA_TARGETS) $(LANG1).prob
pkgconfigdir = $(prefix)/share/pkgconfig
pkgconfig_DATA = $(BASENAME).pc
noinst_DATA=modes/$(LANG1)-morph.mode
install-data-local: install-modes
test -d $(DESTDIR)$(apertium_crh_srcdir) || mkdir -p $(DESTDIR)$(apertium_crh_srcdir)
$(INSTALL_DATA) $(BASENAME).$(LANG1).lexc $(DESTDIR)$(apertium_crh_srcdir)
$(INSTALL_DATA) $(BASENAME).$(LANG1).twol $(DESTDIR)$(apertium_crh_srcdir)
$(INSTALL_DATA) $(BASENAME).$(LANG1).rlx $(DESTDIR)$(apertium_crh_srcdir)
$(INSTALL_DATA) $(BASENAME).post-$(LANG1).dix $(DESTDIR)$(apertium_crh_srcdir)
###############################################################################
## Cleanup
###############################################################################
CLEANFILES = $(TARGETS_COMMON)
clean-local:
-rm -rf .deps modes
###############################################################################
## Test
###############################################################################
test: all
echo "TODO test sentence" | apertium -d . crh-morph | tee .test-mt
@echo "TODO test analysis results" > .test-ref
@diff .test-ref .test-mt
@rm .test-ref .test-mt
Crimean Turkish
apertium-crh
===============================================================================
This is an Apertium monolingual language package for Crimean Turkish. What
you can use this language package for:
* Morphological analysis of Crimean Turkish
* Morphological generation of Crimean Turkish
* Part-of-speech tagging of Crimean Turkish
Requirements
===============================================================================
You will need the following software installed:
* lttoolbox (>= 3.3.0)
* apertium (>= 3.3.0)
* vislcg3 (>= 0.9.9.10297)
* hfst (>= 3.8.2)
If this does not make any sense, we recommend you look at: www.apertium.org
Compiling
===============================================================================
Given the requirements being installed, you should be able to just run:
$ ./configure
$ make
You can use ./autogen.sh instead of ./configure if you're compiling
from SVN.
If you're doing development, you don't have to install the data, you
can use it directly from this directory.
If you are installing this language package as a prerequisite for an
Apertium translation pair, then do (typically as root / with sudo):
# make install
You can give a --prefix to ./configure to install as a non-root user,
but make sure to use the same prefix when installing the translation
pair and any other language packages.
Testing
===============================================================================
If you are in the source directory after running make, the following
commands should work:
$ echo "TODO: test sentence" | apertium -d . crh-morph
TODO: test analysis result
$ echo "TODO: test sentence" | apertium -d . crh-tagger
TODO: test tagger result
Files and data
===============================================================================
* apertium-crh.crh.dix - Monolingual dictionary
* apertium-crh.crh.lexc - Morphotactic dictionary
* apertium-crh.crh.twol - Morphophonological rules
* apertium-crh.crh.rlx - Constraint Grammar disambiguation rules
* apertium-crh.post-crh.dix - Post-generator
* crh.prob - Tagger model
* modes.xml - Translation modes
For more information
===============================================================================
* http://wiki.apertium.org/wiki/Installation
* http://wiki.apertium.org/wiki/apertium-crh
* http://wiki.apertium.org/wiki/Using_an_lttoolbox_dictionary
Help and support
===============================================================================
If you need help using this language pair or data, you can contact:
* Mailing list: apertium-stuff@lists.sourceforge.net
* IRC: #apertium on irc.freenode.net
See also the file AUTHORS included in this distribution.
This diff is collapsed.
# Firstly, we need to define what tags should be considered sentence delimiters. For this example, only full stop is set as delimiter.
DELIMITERS = "<.>" ;
SUBREADINGS = LTR ;
LIST EOS = <<< sent ;
LIST BOS = >>> sent ;
# We can define sets for common tag clusters
LIST Cop = cop;
LIST Post = post;
LIST Px3sp = px3sp;
LIST Px1Sg = px1sg;
LIST N = n;
LIST CA = cnjadv ;
LIST CS = cnjsub ;
LIST CC = cnjcoo ;
LIST Cog = cog ;
LIST Ant = ant ;
LIST Abl = abl;
LIST Aor = aor ;
LIST A = adj ;
LIST Sim = sim ;
LIST Qst = qst ;
LIST Nom = nom ;
LIST Acc = acc ;
LIST Evid = evid ;
LIST Gen = gen ;
LIST Dat = dat ;
LIST Loc = loc ;
LIST Ins = ins ;
LIST Aux = vaux ;
LIST V = v cop ;
LIST Num = num;
LIST Prop = np ;
LIST Son = "soñ" ;
LIST Sene = "sene";
LIST Perc = "fayız";
LIST Ref = ref ;
LIST Nec = nec ;
LIST Loc = loc ;
LIST Adv = adv;
LIST Det = det ;
LIST Prc/perf = prc_perf ;
LIST Prc/impf = prc_impf ;
LIST Prc/fut = prc_fut ;
LIST Prc/past = prc_past ;
LIST Prc/cond = prc_cond ;
LIST Gna/perf = gna_perf ;
LIST Ger/past = ger_past ;
LIST Ger/fut2 = ger_fut2 ;
LIST Ger/fut = ger_fut ;
LIST Gna/when = gna_when ;
LIST Imper = imp ;
LIST Gpr/fut = gpr_fut ;
LIST Gpr/fut2 = gpr_fut2 ;
LIST Gpr/past = gpr_past ;
LIST Past = past ;
LIST Fut2 = fut2 ;
LIST Fut = fut ;
LIST Pers = pers ;
LIST Pass = pass ;
LIST Coop = coop ;
LIST Caus = caus ;
LIST Attr = attr ;
LIST Subst = subst ;
LIST Pl = pl ;
LIST Sg = sg ;
LIST Sg1 = (p1 sg);
LIST Sg2 = (p2 sg) ;
LIST Sg3 = (p3 sg) ;
LIST Pl1 = (p1 pl);
LIST Pl2 = (p2 pl) ;
LIST Pl3 = (p3 pl) ;
LIST Cm = "," ;
LIST Lı = ".*l[ıüiu]"ri ;
LIST Sız = ".*s[ıüiu]z"ri ;
LIST Malı = ".*m[ae]l[iı]"ri ;
LIST Ğan = ".*[ğgkq][ae]n"ri ;
LIST Post/Lı = ("lı" post) ;
LIST Post/Sız = ("sız" post) ;
LIST Meslek = ".*[çc][ıüiu]"r "alim" ;
LIST Title = "<[A-Z].*>"r ;
LIST Terek = "Terek" ;
LIST Kerek = "kerek" ;
LIST Eken = "<eken>"i ;
LIST Bil = "bil";
LIST Faqat = "faqat" ;
LIST Dep = "<dep>"i ;
LIST Qara = "<qara>"i ;
LIST Anda = "<anda>"i ;
LIST Laş = "laş" ;
LIST Err/Orth = err_orth ;
# SET Pers = Sg1 | Sg2 | Sg3 | Pl1 | Pl2 | Pl3 ;
SET Prc = Prc/perf | Prc/impf | Prc/fut | Prc/past | Prc/cond ;
SET Gpr = Gpr/fut | Gpr/fut2 | Gpr/past ;
SET Gna = Gna/perf | Gna/when ;
SET Ger = Ger/past | Ger/fut2 | Ger/fut ;
REMOVE Sim IF (0 Prop);
SET Ant/Cog = Ant | Cog ;
SET NGADLAI = Nom | Gen | Acc | Dat | Loc | Abl | Ins ;
SET Nonfin = Prc | Gna | Gpr | Ger ;
# SET Fin = Past | Fut | Fut2 ;
SET Fin = V - Nonfin | Aux - Nonfin ;
SET Deriv = Sız | Lı ;
SECTION
#SELECT Prc/impf IF (1 Cop);
REMOVE SUB:1 Laş ;
REMOVE SUB:1 Post/Lı IF (0 Nec) ;
SELECT N IF (0 Nonfin) ;
SELECT Post/Sız IF (1* Fin);
REMOVE SUB:1 Cop IF (1C N) ;
REMOVE SUB:1 Deriv ;
SELECT A IF (0 Dat) (1 Cop);
SELECT A IF (0 Acc) (1 Cop);
SELECT Aor IF (0 Aor OR Prc/impf) (-1 Prc/impf);
SELECT N IF (0C N OR Cop) (1* Fin);
SELECT Prop IF (0C N OR Prop) ;
REMOVE Subst IF (0 Gpr) ;
REMOVE SUB:1 Subst IF (0 Gpr) ;
SELECT Adv IF (0 Adv OR A) (1 Adv) ;
SELECT Prop IF (0 Title) ;
SELECT N IF (0 Post/Lı);
SELECT Prc/impf IF (1C Bil);
SELECT Fin IF (0C Bil) (-1 Prc/impf);
SELECT Post IF (0 Post OR Prc/perf) (-1 Dat) (1* Fin);
SELECT Prc IF (0 Prc OR Fin) (NOT 0 N)(1* Fin BARRIER CC) (1* Fin BARRIER Cm);
SELECT Gna/perf IF (0 Dep) (NOT 1 Aux) ;
SELECT Fin IF (0 Prc/impf OR Fin) (-1* Gna/perf BARRIER Cm);
SELECT Subst IF (0 Num) (1 Perc);
REMOVE SUB:1 Err/Orth ;
REMOVE Err/Orth ;
SELECT Evid IF (-1 Prc) (0 Eken) (1 EOS) ;
REMOVE Ger IF (0 Ger OR Fin) (1 EOS) ;
SECTION
SELECT V IF (0 N OR V) (NOT -1* Fin) (1 BOS) ;
SELECT N IF (0 N OR V) (-1C A);
SELECT Adv IF (0 Anda) (NOT -1 Det) ;
REMOVE Det IF (1C Cop OR Aux) ;
REMOVE Imper IF (0 Kerek) ;
# Remove zero copula if it is third person singular [MT]
REMOVE SUB:1 Cop IF (0/* Sg3) (NOT 1 EOS) ;
REMOVE SUB:1 Cop IF (0 Nom) (1 Px3sp);
REMOVE SUB:1 Cop IF (0/* Post/Sız) ;
REMOVE N IF (0 Faqat) (-1 BOS) ;
REMOVE N IF (0 Faqat) (1 Cm) ;
REMOVE Px1Sg IF (1 Px3sp);
REMOVE SUB:1 Cop IF (0/* Cop + Sg1) (0 Pl) ;
SELECT Cop IF (NOT 0* V);
SELECT Post IF (0 Post OR N) (-1 Abl);
SELECT Prop IF (0 Terek) (0 Title);
SELECT Adv IF (0 Son) (1 Num) (2 Sene + Loc);
REMOVE Adv IF (0 Det) (NOT 1* V);
REMOVE Prc/perf IF (0 Gna/perf) (NOT 1* Aux) ;
REMOVE Prc IF (NOT 1 Aux) ;
REMOVE Imper IF (1C Cop) ;
# REMOVE Pers IF (1C Pers) ;
REMOVE Aux (NOT -1 Prc) ;
REMOVE SUB:1 Post/Lı (0/* Lı) ;
REMOVE SUB:1 Post/Sız (0/* Sız) ;
SELECT Attr (0 Meslek) (1 Ant/Cog) ;
REMOVE Pass IF (0 Pass) (0 V - Pass) (0C V) ;
SELECT Det IF (0 Ref) (1 N) ;
REMOVE SUB:1 Qst IF (0 Px3sp) ;
REMOVE Sim IF (0C N) ;
REMOVE Sim IF (0C Prop) ;
REMOVE Sim IF (0 Gna/when) ;
REMOVE Subst IF (0 Subst - Pl) (0 Subst + Nom) ;
REMOVE Attr IF (0 Attr) (NOT 1 N) ;
REMOVE A + Subst + $$NGADLAI IF (0 N + $$NGADLAI) ;
SELECT Aux IF (0C Aux OR Cop) (-1 Prc) ;
REMOVE Prc IF (1C N OR Prop) ;
REMOVE Gpr IF (1 EOS) ;
SELECT Fin IF (0C V) (1 EOS) ;
SELECT SUB:1 Cop + Sg1 IF (0C N) (0 Px1Sg) (-1* Pers + Sg1) ;
REMOVE Prc IF (1 Cm) ;
SECTION
REMOVE Imper IF (0 Qara) ;
# Resources:
# http://visl.sdu.dk/cg3.html
# http://groups.google.com/group/constraint-grammar
# http://kevindonnelly.org.uk/2010/05/constraint-grammar-tutorial/
# http://wiki.apertium.org/wiki/Constraint_Grammar
# http://wiki.apertium.org/wiki/Apertium_and_Constraint_Grammar
Alphabet
a â b c ç d e f g ğ h ı i j k l m n ñ o ö p q r s ş t u ü v y z
A Â B C Ç D E F G Ğ H I J K L M N Ñ O Ö P Q R S Ş T U Ü V Y Z
%{i%}:i ! %{i%}:ı %{i%}:u %{i%}:ü
%{y%}:0 ! %{y%}:i %{y%}:ı %{y%}:u %{y%}:ü
%{I%}:i ! %{I%}:ı
%{Y%}:i ! %{Y%}:ı %{Y%}:u %{Y%}:ü
%{A%}:a ! %{A%}:e
%{C%}:c %{C%}:ç
%{D%}:d ! %{D%}:t
%{G%}:g ! %{G%}:q %{G%}:ğ %{G%}:k
%{E%}:a ! %{E%}:e %{E%}:y
%{s%}:0 ! %{s%}:s
%{n%}:0 ! %{n%}:n
%{l%}:l ! %{l%}:n
%{j%}:0 %{j%}:y
%{U%}:u
%{ö%}:0 %{o%}:0 %{e%}:0 %{ı%}:0
%{b%}:0 %{p%}:0
%{ь%}:0
%{ъ%}:0
%{☭%}:0
%-
%%
%>:0 ;
Sets
Vow = a â e ı i o u ö ü
A Â E I O U Ö Ü ;
Cns = b c ç d f g ğ h j k l m n ñ r p q r s ş t v y z
B C Ç D F G Ğ H J K L M N Ñ R P Q R S Ş T V Y Z ;
NasalCns = m n ñ
M N Ñ ;
VoicelessCns = ç f h k p q s ş t
Ç F H K P Q S Ş T ;
VoicedCns = c d g ğ j l m n ñ r v y z
C D G Ğ J L M N Ñ R V Y Z ;
FrontVow = e i ö ü
E İ Ö Ü ;
BackVow = a â ı o u
A Â I O U ;
AbstractVow = %{ö%} %{o%} %{e%} %{ı%} ;
Rules
!"Voicing at morpheme boundary"
!Cx:Cy <=> Vow _ %>: %{s%}:0 :Vow ;
! _ %>: %{I%}: ;
! except
! _ %{☭%}: %>: ;
! where Cx in ( k p ) ! t
! Cy in ( g b ) ! d
! matched ;
!"Devoicing of non-coronal stem-final voiceless consonants"
!Cx:Cy <=> _ .#. ;
! _ %>: :Cns/:0* ;
! except
! _ %{☭%}: %>: ;
! where Cx in ( b g ğ )
! Cy in ( p k q )
! matched ;
"Voicing of non-coronal stem-final voiceless consonants"
!Cx:Cy <=> :Cns _ %>: [ \:Cns ]/:0* ;
! changed this because cf. mülküñüz
Cx:Cy <=> :Vow/:0* _ %>: :Vow/:0* ;
except
_ %{☭%}: %>: ;
where Cx in ( p k q )
Cy in ( b g ğ )
matched ;
! k e r e k:g >:0 {I}:i m
! k l a s s i k >:0 {s}:0 {I}:i {n}:0
! k i t a p:b >:0 {s}:0 {I}:ı {n}:0
! y a p >:0 {E}:a
! t a p >:0 {i}:ı p
"Devoicing of coronal stem-final voiceless consonants"
Cx:Cy <=> :Vow _ .#. ;
!! _ %>: [ :Cns - %{D%}: ]/:0* ; !! FMT: See maqsatta
_ %>: [ :Cns :? - [ %{D%}: %{I%}: ] ]/:0* ;
except
_ %{☭%}: %>: ;
where Cx in ( d c j )
Cy in ( t ç ş )
matched ;
! m a q s a d:t >:0 {D}:t {A}:a
! m a q s a d:d >:0 {s}:0 {I}:ı {n}:0
! q a y d
"Deletion of dative {G} after px1sg, px2sg"
%{G%}:0 <=> [ %{I%}: | %{i%}: ] :NasalCns %>: _ %{A%}: .#. ;
! ö z b a ş >:0 {i}:ı {n}:n >:0 {G}:0 {A}:a
!-! %{G%}: %>:0 _ ;
!-! y a p >:0 m {A}:a {G}:ğ >:0 {G}:0 {A}:a
"Epenthesis in some stems"
%{y%}:0 <=> _ [ :Cns :Vow ]/[ :0 | %>: ] ;
"Voicing assimilation of {D}"
%{D%}:t <=> [ :VoicelessCns ]/[ :0 ]* _ ;
!!!!! VOWEL HARMONY !!!!!
"Vowel harmony for {A}"
%{A%}:e <=> [ :FrontVow :Cns :Cns* ]/[ :0 - %{ъ%}: ]* _ ;
[ :BackVow :Cns :Cns* %{ь%}:0 :Cns* ]/[ :0 ]* _ ;
[ %{e%}:0 | %{ö%}:0 ]/[ :0 | :Cns | %- | %% ]* _ ;
! 1939{o}{b}>{G}{A}
"Vowel harmony for {E}"
%{E%}:e <=> [ :FrontVow :Cns :Cns* ]/[ :0 - %{ъ%}: ]* _ ;
[ :BackVow :Cns :Cns* %{ь%}:0 :Cns* ]/[ :0 ]* _ ;
[ %{e%}:0 | %{ö%}:0 ]/[ :0 | :Cns | %- | %% ]* _ ;
"Vowel harmony for {U}"
%{U%}:ü <=> [ :FrontVow :Cns :Cns* ]/:0* _ ;
"No {U} or {i} after vowels"
Vx:0 <=> :Vow/:0* _ ;
where Vx in ( %{U%} %{i%} ) ;
"Vowel harmony for {Y} in >2nd σ"
%{Y%}:Vy <=> :Vx :Cns+/:0* _ ;
where Vx in ( i e ü ö a â ı o u )
Vy in ( i i i i ı ı ı ı ı )
matched ;
"Vowel harmony for {I} in >2nd σ"
%{I%}:Vy <=> :Vx :Cns+/:0* _ ;
except
.#. :Cns* :Vx :Cns+/:0* _ ;
where Vx in ( i e ü ö a â ı o u )
Vy in ( i i i i ı ı ı ı ı )
matched ;
"Vowel harmony for {i} in >2nd σ"
%{i%}:Vy <=> :Vx :Cns+/:0* _ ;
except
.#. :Cns* :Vx :Cns+/:0* _ ;
where Vx in ( i e ü ö a â ı o u )
Vy in ( i i i i ı ı ı ı ı )
matched ;
"Vowel harmony for {I} in ≤2nd σ"
%{I%}:Vy <=> .#. :Cns* :Vx :Cns+/:0* _ ;
where Vx in ( i e ü ö a â ı o u )
Vy in ( i i ü ü ı ı ı u u )
matched ;
"Vowel harmony for {i} in ≤2nd σ"
%{i%}:Vy <=> .#. :Cns* :Vx :Cns+/:0* _ ;
where Vx in ( i e ü ö a â ı o u )
Vy in ( i i ü ü ı ı ı u u )
matched ;
"Vowel harmony for {y} unless next C starts a syllable"
%{y%}:Vy <=> .#. :Cns* :Vx :Cns+/:0* _ [ :Cns [ :Cns | .#. ] ]/:0* ;