(* See [1] for the theory behind the analysis [1] https://fr.m.wiktionary.org/wiki/Annexe:Prononciation/fran%C3%A7ais#Structure_syllabique *) %parameter %{ module P = Process.M(T) %} %start main %% occlusiv: | P { T.p } | B { T.b } | T { T.t } | D { T.d } | K { T.k } | G { T.g } fricativ: | S { T.s } | SZ { T.sz } | Z { T.z } | F { T.f } | V { T.v } | X { T.ch } | J { T.j } obstruent: | occlusiv { $1 } | fricativ { $1 } liquid: | L { T.l } | L L { T.l } | R { T.r } nasal: | N { T.n } | M { T.m } consonant: | occlusiv { $1 } | fricativ { $1 } | liquid { $1 } | nasal { $1 } semi_voyel: | Y { T.semi_voyel_y } | W { T.semi_voyel_w } opening_consonant: | occlusiv { $1, None } | fricativ { $1, None } | nasal { $1, None } | liquid { $1, None } | obstruent liquid { $1, Some $2 } | occlusiv fricativ { $1, Some $2 } | consonant semi_voyel{ $1, Some $2 } | semi_voyel { $1, None } (* Each voyel as two associated sounds, depending there is a followng sound or not *) voyels: | A { T.a , T.a } | A I { T.voyel_ai , T.voyel_ai } | E I { T.e `Opened , T.e `Opened } | I { T.i , T.i } | E { T.e `Opened , T.schwa () } | E_ACUTE E? { T.e `Closed , T.e `Closed } | E_AGRAVE { T.e `Opened , T.e `Opened } | E U { T.eu , T.eu } | O { T.o , T.o } | U { T.voyel_y , T.voyel_y } | OU { T.voyel_u , T.voyel_u } | W A { T.diphtongue T.semi_voyel_w T.a, T.diphtongue T.semi_voyel_w T.a} | W I { T.diphtongue T.semi_voyel_w T.i, T.diphtongue T.semi_voyel_w T.i} | I E { T.diphtongue T.i (T.e `Opened), T.diphtongue T.i (T.e `Opened)} ending_consonant: | B { Some (T.b ) } | T { None } | liquid { Some $1 } | nasal { Some $1 } consonant_group: | f = fricativ o = opening_consonant { { ending = None ; opening = f::(fst o)::[] ; following = snd o } } | o = opening_consonant { { ending = None ; opening = [ fst o ] ; following = snd o } } | e = ending_consonant Sep? o = opening_consonant { { ending = Some e ; opening = [ fst o ] ; following = snd o } } | e = ending_consonant Sep? f = fricativ o = opening_consonant { { ending = Some e ; opening = f::[ fst o ] ; following = snd o } } syllable: | c = consonant_group? v = voyels Sep? { (v, c) } syllables: | { [] } | ss = syllables s = syllable { s::ss } word: | Sep? syllables consonant_group? EOL { P.rebuild $3 $2 } main: | word { $1 }