From 6ccbcc2cadae41574e33226b9072a08354880d28 Mon Sep 17 00:00:00 2001
From: Sébastien Dailly <sebastien@chimrod.com>
Date: Sun, 29 Aug 2021 12:11:24 +0200
Subject: Update

---
 src/lib/modifiers/nasal.ml |   4 +-
 src/lib/parser.mly         |   6 +-
 src/lib/prononciation.mly  | 115 +++++++++++++++--------------
 src/lib/reader.ml          |   1 -
 src/lib/sounds/sounds.ml   | 180 +++++++++++++++++++++++++++++++++------------
 src/lib/tokens.mly         |   2 +-
 src/test/test.ml           |   6 +-
 7 files changed, 203 insertions(+), 111 deletions(-)

(limited to 'src')

diff --git a/src/lib/modifiers/nasal.ml b/src/lib/modifiers/nasal.ml
index fbaa35d..8fdc60c 100644
--- a/src/lib/modifiers/nasal.ml
+++ b/src/lib/modifiers/nasal.ml
@@ -1,3 +1,5 @@
+(* Remove the ending consonant, and transform the voyel into
+   the nasal form  *)
 let transform
   : (module Sounds.T with type t = 'a) ->  'a Sig.consonants option -> 'a Sig.t -> 'a Sig.t
   = fun (type el) m c init ->
@@ -28,8 +30,6 @@ let process
     match ending, is_voyel, opening with
     | Some ending, _, _ when T.is_nasal ending ->
       transform m c init
-    (* Remove the ending consonant, and transform the voyel into
-       the nasal form  *)
     | None, false, Some (opening::tl) when T.is_nasal opening ->
       (* If there is no voyel here, transform the opening consonant as an
          ending consonant for the next syllabus *)
diff --git a/src/lib/parser.mly b/src/lib/parser.mly
index 68809fc..6bef7bf 100644
--- a/src/lib/parser.mly
+++ b/src/lib/parser.mly
@@ -82,12 +82,12 @@ voyels:
   | 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 `Opened , T.eu `Opened }
-  | O               { T.o  `Opened , T.o  `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.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)}
 
 nasal_voyels:
diff --git a/src/lib/prononciation.mly b/src/lib/prononciation.mly
index 6fe0d5f..09124a6 100644
--- a/src/lib/prononciation.mly
+++ b/src/lib/prononciation.mly
@@ -27,60 +27,65 @@ voyel:
 
 
 letters:
-  |                 { [] }
-  | letters voyel  { $2 :: $1 }
-  | letters Space   { Space :: $1 }
-  | letters Sep     { Sep :: $1 }
-
-  | letters B       { B :: $1 }
-  | letters C       { K :: $1 }
-  | letters C H     { X :: $1 }
-  | letters C I     { I :: S :: $1 }
-  | letters C E     { E :: S :: $1 }
-  | letters C U I   { I :: K :: $1 }
-  | letters C U E   { E :: K :: $1 }
-  | letters D       { D :: $1 }
-  | letters D D     { D :: $1 }
-  | letters F       { F :: $1 }
-  | letters G       { G :: $1 }
-  | letters G I     { I :: J :: $1 }
-  | letters G E     { E :: J :: $1 }
-  | letters G U I   { I :: G :: $1 }
-  | letters G U E   { E :: G :: $1 }
-  | letters H       { Sep :: $1 }
-
-  | letters J       { J :: $1 }
-  | letters K       { K :: $1 }
-  | letters E L L   { L :: E_AGRAVE :: $1 }
-  | letters E L     { L :: E :: $1 }
-  | letters I L L   { Y :: I :: $1 }
-  | letters I L     { L :: I :: $1 }
-  | letters L       { L :: $1 }
-  | letters M       { M :: $1 }
-  | letters M M     { M :: $1 }
-  | letters N       { N :: $1 }
-  | letters N N     { N :: $1 }
-
-  | letters O I N   { N :: I :: W :: $1 }
-  | letters O I     { A :: W :: $1 }
-
-  | letters P       { P :: $1 }
-  | letters P H     { F :: $1 }
-
-  | letters Q U     { K :: $1 }
-
-  | letters R       { R :: $1 }
-  | letters S S     { S :: $1 }
-  | letters S H     { X :: $1 }
-  | letters S       { SZ :: $1 }
-  | letters T       { T :: $1 }
-
-  | letters V       { V :: $1 }
-  | letters W       { W :: $1 }
-  | letters X       { S :: K :: $1 }
-  | letters Y       { Y :: $1 }
-
-  | letters Z       { Z :: $1 }
+  | voyel  { $1 :: [] }
+  | Space   { Space :: [] }
+  | Sep     { Sep :: [] }
+
+  | B       { B :: [] }
+  | C       { K :: [] }
+  | C H     { X :: [] }
+  | C I     { S :: I :: [] }
+  | C E     { S :: E :: [] }
+  | C U     { K :: U :: [] }
+  | C U I   { K :: I :: [] }
+  | C U E   { K :: E :: [] }
+  | D       { D :: [] }
+  | D D     { D :: [] }
+  | F       { F :: [] }
+  | G       { G :: [] }
+  | G I     { J :: I :: [] }
+  | G E     { J :: E :: [] }
+  | G U     { G :: U :: [] }
+  | G U I   { G :: I :: [] }
+  | G U E   { G :: E :: [] }
+  | H       { Sep :: [] }
+
+  | J       { J :: [] }
+  | K       { K :: [] }
+  | E L     { E :: L :: [] }
+  | E L L   { E_AGRAVE :: L :: [] }
+  | I L     { I :: L :: [] }
+  | I L L   { I :: Y :: [] }
+  | L       { L :: [] }
+  | M       { M :: [] }
+  | M M     { M :: [] }
+  | N       { N :: [] }
+  | N N     { N :: [] }
+
+  | O I     { W :: A :: [] }
+  | O I N   { W :: I :: N :: [] }
+
+  | P       { P :: [] }
+  | P H     { F :: [] }
+
+  | Q       { K :: [] }
+  | Q U     { K :: [] }
+
+  | R       { R :: [] }
+  | S       { SZ :: [] }
+  | S S     { S :: [] }
+  | S H     { X :: [] }
+  | T       { T :: [] }
+
+  | V       { V :: [] }
+  | W       { W :: [] }
+  | X       { K :: S :: [] }
+  | Y       { Y :: [] }
+
+  | Z       { Z :: [] }
+
+ending: 
+  | EOL %prec Low            { EOL::[] }
 
 main: 
-  | letters EOL     { EOL::$1 }
+  | append(flatten(letters*), ending)     { $1 }
diff --git a/src/lib/reader.ml b/src/lib/reader.ml
index 20dc9cc..f705b90 100644
--- a/src/lib/reader.ml
+++ b/src/lib/reader.ml
@@ -59,7 +59,6 @@ let process (line : string) =
   let lexbuf = Lexing.from_string line in
   let content =
     Prononciation.main Lexer.letter lexbuf
-    |> List.rev
     |> build_processor in
   try
     loop content (Parser.Incremental.main lexbuf.lex_curr_p)
diff --git a/src/lib/sounds/sounds.ml b/src/lib/sounds/sounds.ml
index 6c3cad9..85db338 100644
--- a/src/lib/sounds/sounds.ml
+++ b/src/lib/sounds/sounds.ml
@@ -5,12 +5,26 @@ module type T = sig
 
   val a : t
   val e : [`Closed | `Opened] -> t
-  val eu : [`Closed | `Opened] -> t
+  val eu : t
 
-  val o : [`Closed | `Opened] -> t
+  val o : t
   val schwa : unit -> t
+
+  (** This is an empty sound.
+
+      It can be used to replace any element in a syllabus *)
+  val none: t
+
+  (** This is the voyel i like in "ici"
+      When nazalized, the voyel become [in] like in "ainsi" *)
   val i : t
+
+  (** This is the sound ou like in "ouvrier"
+      When nazalized, the voyel does not change *)
   val voyel_u : t
+
+  (** This is the sound u like in "unis"
+      When nazalized, the voyel becom [un] like in "brun" *)
   val voyel_y : t
 
   (** Create a diphtongue from a semi-voyel and a voyel *)
@@ -18,8 +32,6 @@ module type T = sig
 
   val nasal: t -> t option
 
-  val none: t
-
   val p: t
   val b: t
   val t: t
@@ -29,9 +41,10 @@ module type T = sig
   val f: t
   val v: t
   val s: t
+  val z: t
   val sz: t
   val ch: t
-  val z: t
+  (* val j: t *)
 
   val n: t
   val m: t
@@ -54,7 +67,7 @@ module T = struct
 
   type code =
     | None
-    | SZ
+    | SZ (* This is a possible Z if followed by a voyel *)
     | Voyel_A
     | Voyel_E
     | Voyel_I
@@ -63,6 +76,20 @@ module T = struct
     | Voyel_Y (* U like in Unique *)
     | SemiVoyel_W
     | SemiVoyel_Y
+    | Consonant_P
+    | Consonant_B
+    | Consonant_T
+    | Consonant_D
+    | Consonant_K
+    | Consonant_G
+    | Consonant_F
+    | Consonant_V
+    | Consonant_S
+    | Consonant_Z
+    | Consonant_M
+    | Consonant_N
+    | Consonant_L
+    | Consonant_R
     | Diphtonge of t * t
 
   and t =
@@ -139,88 +166,135 @@ module S = struct
 
   let diphtongue v1 v2 =
     { voyel with
-      repr = (v1.repr) ^ (v2.repr)
-    ; code = Diphtonge (v1, v2)
+      code = Diphtonge (v1, v2)
+    ; repr = "[" ^ (v1.repr) ^ (v2.repr) ^ "]"
     }
 
   let code t = t.code
 
   let a =
-    { voyel with repr = Repr.a ; code = Voyel_A }
+    { voyel with
+      code = Voyel_A
+    ; repr = Repr.a
+    }
 
   let e = function
     | `Closed -> { voyel with repr = "e" ; code = Voyel_E }
     | `Opened -> { voyel with repr = "E" ; code = Voyel_E }
 
-  let eu = function
-    | `Closed -> { voyel with repr = "2" }
-    | `Opened -> { voyel with repr = "9" }
+  let eu =
+    { voyel with repr = "9" }
 
 
   let schwa () =
-    { voyel with repr = "°" }
+    { voyel with
+      code = Voyel_E
+    ; repr = "°" }
 
-  let o _ =
-    { voyel with repr = Repr.o ; code = Voyel_O }
+  let o =
+    { voyel with
+      repr = Repr.o
+    ; code = Voyel_O }
 
   let i =
-    { voyel with repr = Repr.i ; code = Voyel_I }
+    { voyel with
+      repr = Repr.i
+    ; code = Voyel_I }
 
   let voyel_y =
-    { voyel with repr = Repr.y ; code = Voyel_Y }
+    { voyel with
+      repr = Repr.y
+    ; code = Voyel_Y }
 
   let voyel_u =
-    { voyel with repr = Repr.u ; code = Voyel_U }
+    { voyel with
+      repr = Repr.u
+    ; code = Voyel_U }
 
   let p =
-    { none with repr = Repr.p ; mutable_ = false }
+    { none with
+      code = Consonant_P
+    ; repr = Repr.p
+    ; mutable_ = false }
 
   let b =
-    { none with repr = Repr.b ; mutable_ = false }
+    { none with
+      code = Consonant_B
+    ; repr = Repr.b
+    ; mutable_ = false
+    }
 
   let t =
-    { none with repr = Repr.t }
+    { none with
+      code = Consonant_T
+    ; repr = Repr.t
+    }
 
   let d =
-    { none with repr = Repr.d }
+    { none with
+      code = Consonant_D
+    ; repr = Repr.d }
 
   let k =
-    { none with repr = Repr.k ; mutable_ = false }
+    { none with
+      code = Consonant_K
+    ; repr = Repr.k
+    ; mutable_ = false }
 
   let g =
-    { none with repr = Repr.g }
+    { none with
+      code = Consonant_G
+    ; repr = Repr.g }
 
   let f =
-    { none with repr = Repr.f }
+    { none with
+      code = Consonant_F
+    ; repr = Repr.f }
 
   let v =
-    { none with repr = Repr.v }
+    { none with
+      code = Consonant_V
+    ; repr = Repr.v }
 
   let s =
-    { none with repr = Repr.s }
-
-  let sz =
-    { s with code = SZ }
+    { none with
+      code = Consonant_S
+    ; repr = Repr.s }
 
   let ch =
     { none with
       repr = Repr.ch
     ; mutable_ = false }
 
+  let sz =
+    { s with code = SZ }
+
   let z =
-    { none with repr = Repr.z }
+    { none with
+      code = Consonant_Z
+    ; repr = Repr.z }
 
   let n =
-    { none with repr = Repr.n ; nasal = true }
+    { none with
+      code = Consonant_N
+    ; repr = Repr.n
+    ; nasal = true }
 
   let m =
-    { none with repr = Repr.m ; nasal = true }
+    { none with
+      code = Consonant_M
+    ; repr = Repr.m
+    ; nasal = true }
 
   let l =
-    { none with repr = Repr.l }
+    { none with
+      code = Consonant_L
+    ; repr = Repr.l }
 
   let r =
-    { none with repr = Repr.r }
+    { none with
+      code = Consonant_R
+    ; repr = Repr.r }
 
   let semi_voyel_w =
     { none with
@@ -233,7 +307,9 @@ module S = struct
     ; code = SemiVoyel_Y}
 
   let nasal t =
+
     match t.code with
+    | Voyel_E -> Some { t with repr = Repr.a_nasal ; nasal = true }
     | Voyel_A -> Some { t with repr = Repr.a_nasal ; nasal = true }
     | Voyel_O -> Some { t with repr = Repr.o_nasal ; nasal = true }
     | Voyel_I -> Some { t with repr = Repr.i_nasal ; nasal = true }
@@ -246,17 +322,10 @@ module S = struct
           Some (
             diphtongue
               semi_voyel_w
-              { t with repr = Repr.i_nasal ; nasal = true } )
-        | (SemiVoyel_W, Voyel_A) ->
-          (* The only case we could have the nasalisation of such diphtongue, is
-             the case O I, N -> wich is transformed into O, I N *)
-          Some (
-            diphtongue
-              semi_voyel_w
-              { t with repr = Repr.i_nasal ; nasal = true } )
+              { i with repr = Repr.i_nasal ; nasal = true } )
         | (Voyel_I, Voyel_E) ->
           (* The only case we could have the nasalisation of such diphtongue, is
-             the case O I, N -> wich is transformed into O, I N *)
+             the case I E, N -> wich is transformed into I, E N *)
           Some (
             diphtongue
               i
@@ -276,8 +345,9 @@ module S = struct
     : t -> Repr.t
     = fun letter ->
       match letter.code, letter.nasal with
+
       | None, _ -> ""
-      | SZ, _ -> ""
+
       | Voyel_A, false -> Repr.a
       | Voyel_A, true  -> Repr.a_nasal
       | Voyel_E, _ -> ""
@@ -288,10 +358,28 @@ module S = struct
       | Voyel_U, _  -> Repr.u
       | Voyel_Y, false -> Repr.y
       | Voyel_Y, true -> Repr.y_nasal
+
       | SemiVoyel_W, _ -> Repr.semi_voyel_w
       | SemiVoyel_Y, _ -> Repr.semi_voyel_y
+
+      | Consonant_P, _ -> Repr.p
+      | Consonant_B, _ -> Repr.b
+      | Consonant_T, _ -> Repr.t
+      | Consonant_D, _ -> Repr.d
+      | Consonant_K, _ -> Repr.k
+      | Consonant_G, _ -> Repr.g
+      | Consonant_F, _ -> Repr.f
+      | Consonant_V, _ -> Repr.v
+      | SZ, _
+      | Consonant_S, _ -> Repr.s
+      | Consonant_Z, _ -> Repr.z
+
+      | Consonant_M, _ -> Repr.m
+      | Consonant_N, _ -> Repr.n
+      | Consonant_L, _ -> Repr.l
+      | Consonant_R, _ -> Repr.r
       | Diphtonge (l1, l2), _ ->
-        (repr l1) ^ (repr l2)
+        "["  ^ (repr l1) ^ (repr l2) ^ "]"
 end
 
 include S
diff --git a/src/lib/tokens.mly b/src/lib/tokens.mly
index d70781a..0eb442e 100644
--- a/src/lib/tokens.mly
+++ b/src/lib/tokens.mly
@@ -34,7 +34,7 @@
 %token EOL
 
 %nonassoc Low
-
+%left R
 %right High
 
 %%
diff --git a/src/test/test.ml b/src/test/test.ml
index 4c763f4..a9980e4 100644
--- a/src/test/test.ml
+++ b/src/test/test.ml
@@ -59,11 +59,11 @@ let tests =
   ; "chat",         "Sa(t)"
   ; "chipant",      "Sip@(t)"
   ; "co|incidant",  "ko5sid@(t)"
-  ; "croire",       "kRwaR°"
+  ; "croire",       "kR[wa]R°"
   ; "ébrouas",      "ebRua(s)"
   ; "famille",      "famij°"
   ; "loin",         "Lw5"
-  ; "groin",        "gRw5"
+  ; "groin",        "gR[w5]"
   ; "hirondelle",   "iR§dEL°"
   ; "pacha",        "paSa"
   ; "péché",        "peSe"
@@ -73,7 +73,7 @@ let tests =
   ; "platte",       "pLat°"
   ; "soin",         "sw5"
   ; "toiture",      "twatyR°"
-  ; "trois",        "tRwa(s)"
+  ; "trois",        "tR[wa](s)"
   ; "vil|le",       "viLL°"
   ; "wèb",          "wEb"
   ]
-- 
cgit v1.2.3