1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
(*
See [1] for the theory behind the analysis
[1] https://fr.m.wiktionary.org/wiki/Annexe:Prononciation/fran%C3%A7ais#Structure_syllabique
*)
%parameter<T:Sounds.T>
%{
module P = Process.M(T)
%}
%start<T.t List.t> main
%%
occlusiv:
| P { T.p }
| B { T.b }
| T { T.t }
| D { T.none }
| K { T.k }
| G { T.none }
fricativ:
| S { T.s () }
| SZ { T.sz () }
| Z { T.z () }
| F { T.f }
| X { T.ch () }
obstruent:
| occlusiv { $1 }
| fricativ { $1 }
liquid:
| L { T.l () }
| R { T.r () }
nasal:
| N { T.n () }
opening_consonant:
| occlusiv { $1, None }
| fricativ { $1, None }
| nasal { $1, None }
| liquid { $1, None }
| obstruent liquid { $1, Some $2 }
| occlusiv fricativ { $1, Some $2 }
(* Each voyel as two associated sounds, depending there is a followng sound or
not *)
voyels:
| A { T.a `Opened , T.a `Opened }
| A I { T.e `Opened, T.e `Opened }
| I { T.i `Opened , T.i `Opened }
| E { T.schwa () , T.schwa () }
| E_ACUTE E? { T.e `Closed , T.e `Closed }
| E U { T.eu `Opened , T.eu `Opened }
| O { T.o `Opened , T.o `Opened }
| A_NASAL { T.nasal (T.a `Opened), T.nasal (T.a `Opened) }
nasal_voyels:
| A N { T.a' () , T.a' () }
%prec Low
ending_consonant:
| S { Some (T.s ()) }
| T { None }
| R { Some (T.r ()) }
| nasal { Some $1 }
ending_word:
| X { Some (T.muted (T.s ())) }
| S { Some (T.muted (T.s ())) }
| R { Some (T.muted (T.r ())) }
| T { Some (T.muted T.t) }
consonant_group:
| opening_consonant
{
{ ending = None
; opening = [ fst $1 ]
; following = snd $1 }
}
| ending_consonant
opening_consonant
{
{ ending = Some $1
; opening = [ fst $2 ]
; following = snd $2 }
}
syllable:
| c = consonant_group?
v = voyels
{ (v, c) }
syllables:
| { [] }
| ss = syllables s = syllable { s::ss }
word:
| syllables ending_word? EOL { P.rebuild $2 $1 }
main:
| word { $1 }
|