Index: gc_lang/fr/rules.grx
==================================================================
--- gc_lang/fr/rules.grx
+++ gc_lang/fr/rules.grx
@@ -1060,15 +1060,17 @@
 TEST: Ah !{{,.,}} et en quoi consistait le festin ?
 
 
 __<s>/typo(typo_ponctuation_superflue1)__    , ?([.,;:!?]) @@$ <<- ->> =",|" + \1       && Une de ces ponctuations est superflue.
 __<s>/typo(typo_ponctuation_superflue2)__    ; ?([.,;:…!?]) @@$ <<- ->> =";|" + \1      && Une de ces ponctuations est superflue.
-__<s>/typo(typo_ponctuation_superflue3)__    :[.,;:…!?] <<- ->> =":|" + \0[1]           && Une de ces ponctuations est superflue.
+__<s>/typo(typo_ponctuation_superflue3)__    :[.,;:…!?] <<- ->> =":|" + \0[1:2]         && Une de ces ponctuations est superflue.
+__<s>/typo(typo_ponctuation_superflue4)__    [?!][.](?![.]) <<- ->> =\0[0:1]            && Ne mettez pas un point après un point d’interrogation ou d’exclamation.
 
-TEST: Mouais{{, ;}}
-TEST: Vraiment, bof {{;;}} on ne sait guère qu’en penser.
-TEST: Raisons {{:.}} trop, c’est trop.
+TEST: Mouais{{, .}}                                                     ->> ,|.
+TEST: Vraiment, bof {{;;}} on ne sait guère qu’en penser.               ->> ;|;
+TEST: Raisons {{:.}} trop, c’est trop.                                  ->> :|.
+TEST: C’est ça {{?.}} tu crois ?                                        ->> ?
 
 
 
 !!
 !!
@@ -1096,10 +1098,11 @@
 TEST: {{«}}Il manque deux espaces insécables. »                             ->> "« "
 TEST: « Il manque deux espaces insécables{{.»}}                             ->> ". »"
 TEST: « Il manque deux espaces insécables{{ »}}                             ->> " »"
 TEST: Et encore{{!}}?                                                       ->> " !"
 TEST: Quoi{{?}}                                                             ->> " ?"
+TEST: Qui{{ ?}}                                                             ->> " ?"
 TEST: Voici{{:}} les deux points.                                           ->> " :"
 TEST: Voyelles:{{a}}.                                                       ->> " a"
 TEST: Succession : a{{;}} b.                                                ->> " ;"
 TEST: C’est assez {{: }}parlez !                                            ->> ": "
 TEST: {{» }}C’est ce qu’on croit savoir.                                    ->> "» |« "
@@ -16830,10 +16833,11 @@
     >signal d’ alarme
     >silo à [>grains|blé]
     >site [de|d’] lancement
     >soldat d’ élite
     >solution [de|d’] [rechange|repli]
+    >sommier à lattes
     >sonnette d’ alarme
     >sortie [de|d’] secours
     >soue à >cochon
     >sourate [*NUM|$:B] ?,¿ verset [*NUM|$:B]
     >souvenir d’ enfance
@@ -21158,10 +21162,25 @@
 TEST: l’amour {{immortels}}
 TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou.
 TEST: du chien et de l’étonnant {{colliers}} qu’il avait autour du cou.
 TEST: elle prendra l’{{avions}} dès que possible
 
+
+__gn_l_3m__
+    l’  *WORD  *WORD  *WORD
+        <<- /gn/ morph(\1, ":D") and morph(<1, "<start>|:V", "*") and \4.islower() >>>
+        <<- /gn/ morph(\2, ":[NA].*:m:[si]", "*") and morph(\3, ":[NA].*:[me]:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:f", "*")
+        -4>> =suggMasSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au masculin singulier.
+        <<- /gn/ __else__ and morph(\2, ":[NA].*:f:[si]", "*") and morph(\3, ":[NA].*:[fe]:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:m", "*")
+        -4>> =suggFemSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au féminin singulier.
+        <<- /gn/ __else__ and morph(\2, ":[NA].*:[si]", "*") and morph(\3, ":[NA].*:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:p", "*")
+        -4>> =suggSing(\4)                                                                  && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au singulier.
+
+TEST: l’horreur obscure {{répandu}} dans les ténèbres                               ->> répandue
+TEST: l’honneur français {{bafouée}}                                                ->> bafoué
+TEST: l’ignoble ignorance si {{répandues}}                                          ->> répandue
+
 
 __gn_le_1m__
     ,  le  *WORD
         <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -2>> =suggLesLa(\3)           && Accord de genre erroné : « \3 » est féminin.
         <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True)                            && Accord de genre erroné : « \2 » est un déterminant masculin.
@@ -21220,10 +21239,23 @@
 TEST: connaître et le grand {{perdante}}
 TEST: Le bruit {{perçus}} par les voisins.
 TEST: si le premier film est un triomphe, le deuxième est un demi-succès, et le troisième une déception.
 TEST: Cela aboutira sur une contractualisation coûteuse pour organiser cette divergence d’intérêts, et le gestionnaire aura le dernier mot.
 
+
+__gn_le_3m__
+    le  *WORD  *WORD  *WORD
+        <<- /gn/ not value(<1, "|et|ou|") and morph(\1, ":D")
+            and morph(\2, ":[NA].*:[me]:[si]", ":(?:[123][sp]|G)") and morph(\3, ":[NA].*:[me]:[si]", ":(?:[123][sp]|G|P)") and morph(\4, ":[NA].*:[fp]", "*") and \4.islower()
+        -4>> =suggMasSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au masculin singulier.
+
+TEST: le roi chrétien {{tyranniques}} tout pétri de son prétendu droit divin                    ->> tyrannique
+TEST: le petit chien {{bruns}}                                                                  ->> brun
+TEST: elles furent le jour venu prises par surprise, et elles durent s’enfuir.
+TEST: qu’ils fassent tourner le système économique, assez concrètement, mais sans faire chier avec leurs petits problèmes de gens de rien.
+TEST: avec le peuple, contre le capitalisme mortifère sous tous ses visages.
+
 
 __gn_la_1m__
     ,  la  *WORD
         <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|M|[1-3][sp]|Y)") -2>> le             && Accord de genre erroné : « \3 » est masculin.
         <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    && Accord de genre erroné : « \2 » est un déterminant féminin.
@@ -21285,10 +21317,22 @@
 TEST: Il faut donc examiner ensemble le panneau et la paroi latérale.
 TEST: Il faut donc examiner ensemble le panneau et la paroi latéraux.
 TEST: Il faut donc examiner ensemble les panneaux et la paroi latéraux.
 TEST: Il faut donc examiner ensemble les panneaux et la paroi latérale.
 
+
+__gn_la_3m__
+    la  *WORD  *WORD  *WORD
+        <<- /gn/ not value(<1, "|et|ou|") and morph(\1, ":D")
+            and morph(\2, ":[NA].*:[fe]:[si]", ":(?:[123][sp]|G)") and morph(\3, ":[NA].*:[fe]:[si]", ":(?:[123][sp]|G|P)|;C") and morph(\4, ":[NA].*:[mp]", "*") and \4.islower()
+        -4>> =suggFemSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au féminin singulier.
+
+TEST: la seule solution {{trouvé}} consistait à déléguer                                        ->> trouvée
+TEST: La petite fille {{devenues}} infirmière.                                                  ->> devenue
+TEST: sous la forme d’un baromètre comparant différents moyens pour alléger ses émissions
+TEST: non seulement met en péril la logique industrielle mais contribue à détruire peu à peu le substrat sur lequel repose le marché lui-même, à savoir la société des hommes.
+
 
 __gn_leur_1m__
     ,  leur  *WORD
         <<- /gn/ morph(\3, ":[NA].*:p", "*") -2>> leurs                                     && Accord de nombre erroné avec « \3 ».
         <<- /gn/ __also__ -3>> =suggSing(\3)                                                && Accord de nombre erroné : « \3 » devrait être au singulier.
@@ -21338,22 +21382,23 @@
 TEST: ils arrivent et leur arrogance {{insupportables}} nous fatigue tous.
 TEST: {{leur}} gros {{grains}}
 TEST: Que ferons-nous de {{leur}} gros {{grains}}
 
 
-__gn_le_la_leur_3m__
-    [le|la|leur|l’]  *WORD  *WORD  *WORD
-        <<- /gn/ not value(<1, "|et|ou|") and morph(\1, ":D") and morph(\2, ":[NA].*:[si]", ":(?:[123][sp]|G)") and morph(\3, ":[NA].*:[si]", ":(?:[123][sp]|G|P)") and morph(\4, ":[NA].*:p", "*") and \4.islower()
+__gn_leur_3m__
+    leur  *WORD  *WORD  *WORD
+        <<- /gn/ morph(\1, ":D") and morph(<1, "<start>|:V", "*") and \4.islower() >>>
+        <<- /gn/ morph(\2, ":[NA].*:m:[si]", "*") and morph(\3, ":[NA].*:[me]:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:f", "*")
+        -4>> =suggMasSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au masculin singulier.
+        <<- /gn/ __else__ and morph(\2, ":[NA].*:f:[si]", "*") and morph(\3, ":[NA].*:[fe]:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:m", "*")
+        -4>> =suggFemSing(\4)                                                               && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au féminin singulier.
+        <<- /gn/ __else__ and morph(\2, ":[NA].*:[si]", "*") and morph(\3, ":[NA].*:[si]", ":(?:[123][sp]|G|P|B)|;C") and morph(\4, ":[NA].*:p", "*")
         -4>> =suggSing(\4)                                                                  && Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au singulier.
 
-TEST: La petite fille {{devenues}} infirmière.
-TEST: leur grande passion {{délirantes}} pour le cosplay.
-TEST: le jour venu prises par surprise elles durent s’enfuir.
-TEST: sous la forme d’un baromètre comparant différents moyens pour alléger ses émissions
-TEST: non seulement met en péril la logique industrielle mais contribue à détruire peu à peu le substrat sur lequel repose le marché lui-même, à savoir la société des hommes.
-TEST: qu’ils fassent tourner le système économique, assez concrètement, mais sans faire chier avec leurs petits problèmes de gens de rien.
-TEST: avec le peuple, contre le capitalisme mortifère sous tous ses visages.
+TEST: leur grande passion {{délirants}} pour le cosplay.                            ->> délirante
+TEST: leur noir projet {{ignorées}} du peuple                                       ->> ignoré
+TEST: leur psychologue altruiste {{détestés}} par ses voisins                       ->> détesté
 
 
 __gn_ledit_1m__
     ledit  *WORD
         <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> ladite                              && Accord de genre erroné : « \2 » est féminin.
@@ -29576,11 +29621,11 @@
 TEST: Mais migrer un site et ses contenus prend du temps…
 TEST: y être sans ma femme ni les enfants fait monter en moi une certaine nervosité.
 
 
 __conj_le_la_leur_nom__
-    [le|la|l’|leur]  *WORD  @:V¬:(?:3s|P|Y|3p!|G|M)
+    [le|la|l’|leur]  *WORD  @:V¬:(?:3s|P|Q|Y|3p!|G|M)
         <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
             and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                         or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not checkAgreement(\2, \3)
             and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
         <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
@@ -31003,10 +31048,11 @@
 TEST: à pied ou à cheval
 TEST: tout ça pour prouver qu’il va bien
 TEST: c’étaient bien les Français qui avaient procédé ainsi
 TEST: les hommes haut placés
 TEST: Votre père est on ne peut plus aimable
+TEST: Qu’ont fait les sénateurs ?
 
 
 
 !!! Tests historiques                                                                             !!