[indic/khmer/myanmar/use] Export categories from Ragel source

Not hooked up yet.

Part of alternative approach to
https://github.com/harfbuzz/harfbuzz/pull/2726
This commit is contained in:
Behdad Esfahbod 2021-01-28 19:47:53 -07:00
parent f94bf9f06f
commit 880fdb7460
8 changed files with 249 additions and 142 deletions

View File

@ -33,6 +33,26 @@
#line 36 "hb-ot-shape-complex-indic-machine.hh"
#define indic_syllable_machine_ex_A 10u
#define indic_syllable_machine_ex_C 1u
#define indic_syllable_machine_ex_CM 17u
#define indic_syllable_machine_ex_CS 19u
#define indic_syllable_machine_ex_DOTTEDCIRCLE 12u
#define indic_syllable_machine_ex_H 4u
#define indic_syllable_machine_ex_M 7u
#define indic_syllable_machine_ex_N 3u
#define indic_syllable_machine_ex_PLACEHOLDER 11u
#define indic_syllable_machine_ex_RS 13u
#define indic_syllable_machine_ex_Ra 16u
#define indic_syllable_machine_ex_Repha 15u
#define indic_syllable_machine_ex_SM 8u
#define indic_syllable_machine_ex_Symbol 18u
#define indic_syllable_machine_ex_V 2u
#define indic_syllable_machine_ex_ZWJ 6u
#define indic_syllable_machine_ex_ZWNJ 5u
#line 56 "hb-ot-shape-complex-indic-machine.hh"
static const unsigned char _indic_syllable_machine_trans_keys[] = {
8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u,
4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u,
@ -384,7 +404,7 @@ static const int indic_syllable_machine_error = -1;
static const int indic_syllable_machine_en_main = 39;
#line 36 "hb-ot-shape-complex-indic-machine.rl"
#line 37 "hb-ot-shape-complex-indic-machine.rl"
@ -407,7 +427,7 @@ find_syllables_indic (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
#line 411 "hb-ot-shape-complex-indic-machine.hh"
#line 431 "hb-ot-shape-complex-indic-machine.hh"
{
cs = indic_syllable_machine_start;
ts = 0;
@ -423,7 +443,7 @@ find_syllables_indic (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
#line 427 "hb-ot-shape-complex-indic-machine.hh"
#line 447 "hb-ot-shape-complex-indic-machine.hh"
{
int _slen;
int _trans;
@ -437,7 +457,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
#line 441 "hb-ot-shape-complex-indic-machine.hh"
#line 461 "hb-ot-shape-complex-indic-machine.hh"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@ -540,7 +560,7 @@ _eof_trans:
#line 89 "hb-ot-shape-complex-indic-machine.rl"
{act = 6;}
break;
#line 544 "hb-ot-shape-complex-indic-machine.hh"
#line 564 "hb-ot-shape-complex-indic-machine.hh"
}
_again:
@ -549,7 +569,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
#line 553 "hb-ot-shape-complex-indic-machine.hh"
#line 573 "hb-ot-shape-complex-indic-machine.hh"
}
if ( ++p != pe )

View File

@ -32,29 +32,29 @@
%%{
machine indic_syllable_machine;
alphtype unsigned char;
write exports;
write data;
}%%
%%{
# Same order as enum indic_category_t. Not sure how to avoid duplication.
C = 1;
V = 2;
N = 3;
H = 4;
ZWNJ = 5;
ZWJ = 6;
M = 7;
SM = 8;
A = 10;
PLACEHOLDER = 11;
DOTTEDCIRCLE = 12;
RS = 13;
Repha = 15;
Ra = 16;
CM = 17;
Symbol= 18;
CS = 19;
export C = 1;
export V = 2;
export N = 3;
export H = 4;
export ZWNJ = 5;
export ZWJ = 6;
export M = 7;
export SM = 8;
export A = 10;
export PLACEHOLDER = 11;
export DOTTEDCIRCLE = 12;
export RS = 13;
export Repha = 15;
export Ra = 16;
export CM = 17;
export Symbol= 18;
export CS = 19;
c = (C | Ra); # is_consonant
n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier

View File

@ -33,6 +33,24 @@
#line 36 "hb-ot-shape-complex-khmer-machine.hh"
#define khmer_syllable_machine_ex_C 1u
#define khmer_syllable_machine_ex_Coeng 14u
#define khmer_syllable_machine_ex_DOTTEDCIRCLE 12u
#define khmer_syllable_machine_ex_PLACEHOLDER 11u
#define khmer_syllable_machine_ex_Ra 16u
#define khmer_syllable_machine_ex_Robatic 20u
#define khmer_syllable_machine_ex_V 2u
#define khmer_syllable_machine_ex_VAbv 26u
#define khmer_syllable_machine_ex_VBlw 27u
#define khmer_syllable_machine_ex_VPre 28u
#define khmer_syllable_machine_ex_VPst 29u
#define khmer_syllable_machine_ex_Xgroup 21u
#define khmer_syllable_machine_ex_Ygroup 22u
#define khmer_syllable_machine_ex_ZWJ 6u
#define khmer_syllable_machine_ex_ZWNJ 5u
#line 54 "hb-ot-shape-complex-khmer-machine.hh"
static const unsigned char _khmer_syllable_machine_trans_keys[] = {
5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u,
5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u,
@ -215,7 +233,7 @@ static const int khmer_syllable_machine_error = -1;
static const int khmer_syllable_machine_en_main = 20;
#line 36 "hb-ot-shape-complex-khmer-machine.rl"
#line 37 "hb-ot-shape-complex-khmer-machine.rl"
@ -238,7 +256,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
#line 242 "hb-ot-shape-complex-khmer-machine.hh"
#line 260 "hb-ot-shape-complex-khmer-machine.hh"
{
cs = khmer_syllable_machine_start;
ts = 0;
@ -254,7 +272,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
#line 258 "hb-ot-shape-complex-khmer-machine.hh"
#line 276 "hb-ot-shape-complex-khmer-machine.hh"
{
int _slen;
int _trans;
@ -268,7 +286,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
#line 272 "hb-ot-shape-complex-khmer-machine.hh"
#line 290 "hb-ot-shape-complex-khmer-machine.hh"
}
_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@ -338,7 +356,7 @@ _eof_trans:
#line 76 "hb-ot-shape-complex-khmer-machine.rl"
{act = 3;}
break;
#line 342 "hb-ot-shape-complex-khmer-machine.hh"
#line 360 "hb-ot-shape-complex-khmer-machine.hh"
}
_again:
@ -347,7 +365,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
#line 351 "hb-ot-shape-complex-khmer-machine.hh"
#line 369 "hb-ot-shape-complex-khmer-machine.hh"
}
if ( ++p != pe )

View File

@ -32,27 +32,27 @@
%%{
machine khmer_syllable_machine;
alphtype unsigned char;
write exports;
write data;
}%%
%%{
# Same order as enum khmer_category_t. Not sure how to avoid duplication.
C = 1;
V = 2;
ZWNJ = 5;
ZWJ = 6;
PLACEHOLDER = 11;
DOTTEDCIRCLE = 12;
Coeng= 14;
Ra = 16;
Robatic = 20;
Xgroup = 21;
Ygroup = 22;
VAbv = 26;
VBlw = 27;
VPre = 28;
VPst = 29;
export C = 1;
export V = 2;
export ZWNJ = 5;
export ZWJ = 6;
export PLACEHOLDER = 11;
export DOTTEDCIRCLE = 12;
export Coeng= 14;
export Ra = 16;
export Robatic = 20;
export Xgroup = 21;
export Ygroup = 22;
export VAbv = 26;
export VBlw = 27;
export VPre = 28;
export VPst = 29;
c = (C | Ra | V);
cn = c.((ZWJ|ZWNJ)?.Robatic)?;

View File

@ -33,6 +33,34 @@
#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
#define myanmar_syllable_machine_ex_A 10u
#define myanmar_syllable_machine_ex_As 18u
#define myanmar_syllable_machine_ex_C 1u
#define myanmar_syllable_machine_ex_CS 19u
#define myanmar_syllable_machine_ex_D 32u
#define myanmar_syllable_machine_ex_D0 20u
#define myanmar_syllable_machine_ex_DB 3u
#define myanmar_syllable_machine_ex_GB 11u
#define myanmar_syllable_machine_ex_H 4u
#define myanmar_syllable_machine_ex_IV 2u
#define myanmar_syllable_machine_ex_MH 21u
#define myanmar_syllable_machine_ex_MR 22u
#define myanmar_syllable_machine_ex_MW 23u
#define myanmar_syllable_machine_ex_MY 24u
#define myanmar_syllable_machine_ex_P 31u
#define myanmar_syllable_machine_ex_PT 25u
#define myanmar_syllable_machine_ex_Ra 16u
#define myanmar_syllable_machine_ex_V 8u
#define myanmar_syllable_machine_ex_VAbv 26u
#define myanmar_syllable_machine_ex_VBlw 27u
#define myanmar_syllable_machine_ex_VPre 28u
#define myanmar_syllable_machine_ex_VPst 29u
#define myanmar_syllable_machine_ex_VS 30u
#define myanmar_syllable_machine_ex_ZWJ 6u
#define myanmar_syllable_machine_ex_ZWNJ 5u
#line 64 "hb-ot-shape-complex-myanmar-machine.hh"
static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u,
3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u,
@ -293,7 +321,7 @@ static const int myanmar_syllable_machine_error = -1;
static const int myanmar_syllable_machine_en_main = 0;
#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
#line 37 "hb-ot-shape-complex-myanmar-machine.rl"
@ -316,7 +344,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
#line 348 "hb-ot-shape-complex-myanmar-machine.hh"
{
cs = myanmar_syllable_machine_start;
ts = 0;
@ -332,7 +360,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
#line 336 "hb-ot-shape-complex-myanmar-machine.hh"
#line 364 "hb-ot-shape-complex-myanmar-machine.hh"
{
int _slen;
int _trans;
@ -346,7 +374,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
#line 350 "hb-ot-shape-complex-myanmar-machine.hh"
#line 378 "hb-ot-shape-complex-myanmar-machine.hh"
}
_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@ -396,7 +424,7 @@ _eof_trans:
#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
break;
#line 400 "hb-ot-shape-complex-myanmar-machine.hh"
#line 428 "hb-ot-shape-complex-myanmar-machine.hh"
}
_again:
@ -405,7 +433,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
#line 409 "hb-ot-shape-complex-myanmar-machine.hh"
#line 437 "hb-ot-shape-complex-myanmar-machine.hh"
}
if ( ++p != pe )

View File

@ -32,37 +32,37 @@
%%{
machine myanmar_syllable_machine;
alphtype unsigned char;
write exports;
write data;
}%%
%%{
# Same order as enum myanmar_category_t. Not sure how to avoid duplication.
A = 10;
As = 18;
C = 1;
D = 32;
D0 = 20;
DB = 3;
GB = 11;
H = 4;
IV = 2;
MH = 21;
MR = 22;
MW = 23;
MY = 24;
PT = 25;
V = 8;
VAbv = 26;
VBlw = 27;
VPre = 28;
VPst = 29;
VS = 30;
ZWJ = 6;
ZWNJ = 5;
Ra = 16;
P = 31;
CS = 19;
export A = 10;
export As = 18;
export C = 1;
export D = 32;
export D0 = 20;
export DB = 3;
export GB = 11;
export H = 4;
export IV = 2;
export MH = 21;
export MR = 22;
export MW = 23;
export MY = 24;
export PT = 25;
export V = 8;
export VAbv = 26;
export VBlw = 27;
export VPre = 28;
export VPst = 29;
export VS = 30;
export ZWJ = 6;
export ZWNJ = 5;
export Ra = 16;
export P = 31;
export CS = 19;
j = ZWJ|ZWNJ; # Joiners
k = (Ra As H); # Kinzi

View File

@ -35,6 +35,48 @@
#line 38 "hb-ot-shape-complex-use-machine.hh"
#define use_syllable_machine_ex_B 1u
#define use_syllable_machine_ex_CMAbv 31u
#define use_syllable_machine_ex_CMBlw 32u
#define use_syllable_machine_ex_CS 43u
#define use_syllable_machine_ex_FAbv 24u
#define use_syllable_machine_ex_FBlw 25u
#define use_syllable_machine_ex_FMAbv 45u
#define use_syllable_machine_ex_FMBlw 46u
#define use_syllable_machine_ex_FMPst 47u
#define use_syllable_machine_ex_FPst 26u
#define use_syllable_machine_ex_G 49u
#define use_syllable_machine_ex_GB 5u
#define use_syllable_machine_ex_H 12u
#define use_syllable_machine_ex_HN 13u
#define use_syllable_machine_ex_HVM 44u
#define use_syllable_machine_ex_J 50u
#define use_syllable_machine_ex_MAbv 27u
#define use_syllable_machine_ex_MBlw 28u
#define use_syllable_machine_ex_MPre 30u
#define use_syllable_machine_ex_MPst 29u
#define use_syllable_machine_ex_N 4u
#define use_syllable_machine_ex_O 0u
#define use_syllable_machine_ex_R 18u
#define use_syllable_machine_ex_S 19u
#define use_syllable_machine_ex_SB 51u
#define use_syllable_machine_ex_SE 52u
#define use_syllable_machine_ex_SMAbv 41u
#define use_syllable_machine_ex_SMBlw 42u
#define use_syllable_machine_ex_SUB 11u
#define use_syllable_machine_ex_Sk 48u
#define use_syllable_machine_ex_VAbv 33u
#define use_syllable_machine_ex_VBlw 34u
#define use_syllable_machine_ex_VMAbv 37u
#define use_syllable_machine_ex_VMBlw 38u
#define use_syllable_machine_ex_VMPre 23u
#define use_syllable_machine_ex_VMPst 39u
#define use_syllable_machine_ex_VPre 22u
#define use_syllable_machine_ex_VPst 35u
#define use_syllable_machine_ex_ZWNJ 14u
#line 80 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
1u, 1u, 1u, 1u, 0u, 51u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u,
24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u,
@ -303,11 +345,11 @@ static const int use_syllable_machine_error = -1;
static const int use_syllable_machine_en_main = 2;
#line 38 "hb-ot-shape-complex-use-machine.rl"
#line 39 "hb-ot-shape-complex-use-machine.rl"
#line 153 "hb-ot-shape-complex-use-machine.rl"
#line 152 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \
@ -350,7 +392,7 @@ find_syllables_use (hb_buffer_t *buffer)
unsigned int act HB_UNUSED;
int cs;
#line 354 "hb-ot-shape-complex-use-machine.hh"
#line 396 "hb-ot-shape-complex-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@ -358,12 +400,12 @@ find_syllables_use (hb_buffer_t *buffer)
act = 0;
}
#line 197 "hb-ot-shape-complex-use-machine.rl"
#line 196 "hb-ot-shape-complex-use-machine.rl"
unsigned int syllable_serial = 1;
#line 367 "hb-ot-shape-complex-use-machine.hh"
#line 409 "hb-ot-shape-complex-use-machine.hh"
{
int _slen;
int _trans;
@ -377,7 +419,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
#line 381 "hb-ot-shape-complex-use-machine.hh"
#line 423 "hb-ot-shape-complex-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@ -400,62 +442,62 @@ _eof_trans:
{te = p+1;}
break;
case 5:
#line 140 "hb-ot-shape-complex-use-machine.rl"
#line 139 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (independent_cluster); }}
break;
case 9:
#line 143 "hb-ot-shape-complex-use-machine.rl"
#line 142 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (standard_cluster); }}
break;
case 7:
#line 148 "hb-ot-shape-complex-use-machine.rl"
#line 147 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 6:
#line 149 "hb-ot-shape-complex-use-machine.rl"
#line 148 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (non_cluster); }}
break;
case 10:
#line 141 "hb-ot-shape-complex-use-machine.rl"
#line 140 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break;
case 11:
#line 142 "hb-ot-shape-complex-use-machine.rl"
#line 141 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
break;
case 8:
#line 143 "hb-ot-shape-complex-use-machine.rl"
#line 142 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (standard_cluster); }}
break;
case 13:
#line 144 "hb-ot-shape-complex-use-machine.rl"
#line 143 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break;
case 12:
#line 145 "hb-ot-shape-complex-use-machine.rl"
#line 144 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }}
break;
case 14:
#line 146 "hb-ot-shape-complex-use-machine.rl"
#line 145 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
case 17:
#line 147 "hb-ot-shape-complex-use-machine.rl"
#line 146 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (hieroglyph_cluster); }}
break;
case 15:
#line 148 "hb-ot-shape-complex-use-machine.rl"
#line 147 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 16:
#line 149 "hb-ot-shape-complex-use-machine.rl"
#line 148 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (non_cluster); }}
break;
case 1:
#line 148 "hb-ot-shape-complex-use-machine.rl"
#line 147 "hb-ot-shape-complex-use-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
#line 459 "hb-ot-shape-complex-use-machine.hh"
#line 501 "hb-ot-shape-complex-use-machine.hh"
}
_again:
@ -464,7 +506,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
#line 468 "hb-ot-shape-complex-use-machine.hh"
#line 510 "hb-ot-shape-complex-use-machine.hh"
}
if ( ++p != pe )
@ -480,7 +522,7 @@ _again:
}
#line 202 "hb-ot-shape-complex-use-machine.rl"
#line 201 "hb-ot-shape-complex-use-machine.rl"
}

View File

@ -34,55 +34,54 @@
%%{
machine use_syllable_machine;
alphtype unsigned char;
write exports;
write data;
}%%
%%{
# Same order as enum use_category_t. Not sure how to avoid duplication.
export O = 0; # OTHER
O = 0; # OTHER
export B = 1; # BASE
export N = 4; # BASE_NUM
export GB = 5; # BASE_OTHER
export SUB = 11; # CONS_SUB
export H = 12; # HALANT
B = 1; # BASE
N = 4; # BASE_NUM
GB = 5; # BASE_OTHER
SUB = 11; # CONS_SUB
H = 12; # HALANT
export HN = 13; # HALANT_NUM
export ZWNJ = 14; # Zero width non-joiner
export R = 18; # REPHA
export S = 19; # SYM
export CS = 43; # CONS_WITH_STACKER
export HVM = 44; # HALANT_OR_VOWEL_MODIFIER
export Sk = 48; # SAKOT
export G = 49; # HIEROGLYPH
export J = 50; # HIEROGLYPH_JOINER
export SB = 51; # HIEROGLYPH_SEGMENT_BEGIN
export SE = 52; # HIEROGLYPH_SEGMENT_END
HN = 13; # HALANT_NUM
ZWNJ = 14; # Zero width non-joiner
R = 18; # REPHA
S = 19; # SYM
CS = 43; # CONS_WITH_STACKER
HVM = 44; # HALANT_OR_VOWEL_MODIFIER
Sk = 48; # SAKOT
G = 49; # HIEROGLYPH
J = 50; # HIEROGLYPH_JOINER
SB = 51; # HIEROGLYPH_SEGMENT_BEGIN
SE = 52; # HIEROGLYPH_SEGMENT_END
FAbv = 24; # CONS_FINAL_ABOVE
FBlw = 25; # CONS_FINAL_BELOW
FPst = 26; # CONS_FINAL_POST
MAbv = 27; # CONS_MED_ABOVE
MBlw = 28; # CONS_MED_BELOW
MPst = 29; # CONS_MED_POST
MPre = 30; # CONS_MED_PRE
CMAbv = 31; # CONS_MOD_ABOVE
CMBlw = 32; # CONS_MOD_BELOW
VAbv = 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
VBlw = 34; # VOWEL_BELOW / VOWEL_BELOW_POST
VPst = 35; # VOWEL_POST UIPC = Right
VPre = 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
VMAbv = 37; # VOWEL_MOD_ABOVE
VMBlw = 38; # VOWEL_MOD_BELOW
VMPst = 39; # VOWEL_MOD_POST
VMPre = 23; # VOWEL_MOD_PRE
SMAbv = 41; # SYM_MOD_ABOVE
SMBlw = 42; # SYM_MOD_BELOW
FMAbv = 45; # CONS_FINAL_MOD UIPC = Top
FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom
FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable
export FAbv = 24; # CONS_FINAL_ABOVE
export FBlw = 25; # CONS_FINAL_BELOW
export FPst = 26; # CONS_FINAL_POST
export MAbv = 27; # CONS_MED_ABOVE
export MBlw = 28; # CONS_MED_BELOW
export MPst = 29; # CONS_MED_POST
export MPre = 30; # CONS_MED_PRE
export CMAbv = 31; # CONS_MOD_ABOVE
export CMBlw = 32; # CONS_MOD_BELOW
export VAbv = 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
export VBlw = 34; # VOWEL_BELOW / VOWEL_BELOW_POST
export VPst = 35; # VOWEL_POST UIPC = Right
export VPre = 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
export VMAbv = 37; # VOWEL_MOD_ABOVE
export VMBlw = 38; # VOWEL_MOD_BELOW
export VMPst = 39; # VOWEL_MOD_POST
export VMPre = 23; # VOWEL_MOD_PRE
export SMAbv = 41; # SYM_MOD_ABOVE
export SMBlw = 42; # SYM_MOD_BELOW
export FMAbv = 45; # CONS_FINAL_MOD UIPC = Top
export FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom
export FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable
h = H | HVM | Sk;