summaryrefslogtreecommitdiff
path: root/src/lib/parser.mly
blob: acb8e25818b964f762bbf50f84a16310707f0bfc (plain)
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
(*

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 }

  | C               { T.k }
  | K               { T.k }
  | G               { T.none }

fricativ:
  | S               { T.s () }
  | SS              { T.s () }

  | F               { T.f }

  | C H             { 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 }

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 }