#
# RÈGLES DE GRAMMAIRE FRANÇAISE POUR GRAMMALECTE
# par Olivier R.
#

# DOCUMENTATION
# Expressions régulières en Python : http://docs.python.org/library/re.html
#
# [char] : caractère par caractère
# [Char] : caractère par caractère, insensible à la casse
# [word] : mot par mot
# [Word] : mot par mot, insensible à la casse (par défaut)

# [gc]   : règles de contrôle du texte
# [pp]   : préprocesseur de texte

# [++]   : accroissement de la profondeur de 1. Par défaut, 0.

# Fin d’interprétation du fichier avec une ligne commençant par #END

# FAUTES COURANTES
# http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Fautes_d%27orthographe/Courantes


############################## VERBES ##############################

# MÉMO :
# avoir -> ([aeo]\w*)
# être -> ([êeésf]\w+)
# avoir et être -> ([aeêésfo]\w*)
# aller -> ((all|v|ir)\w+)
# ppas -> (\w[\w-]+[éiust]e?s?)


################################################################################################################################################################
################################################################################################################################################################
## PASSE 0
## paragraphe par paragraphe
################################################################################################################################################################
################################################################################################################################################################


#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
#
[pp]

[char]
# e-mail
\w[\w.-]*@\w[\w.-]*\w[.]\w+ -> @
# URL
https?://[\w./?&!%=+*"'@$#-]+ -> @
# Numéro de chapitre
^\d+[.][\d.-]* -> @
# Numéro suivi de plusieurs espaces, considéré comme une numérotation de chapitre
^\d+(?:  +|\t+) -> @
# bibliographie
\b[cC](?:f|hap|oll?)([.]) -1> @
\bp[.] \d+(?:-\d+|)\b -> @
\bpp[.] \d+-\d+\b -> @
\b[fF]igure (\d+(?:[.:-]\d+|)) -1> @
# sigles
([A-Z][.][A-Z][.](?:[A-Z][.])*) +[A-ZÉÀÂÊÎÈÔ] -1> =@\1.replace(".", "")+"."
[A-Z][.][A-Z][.](?:[A-Z][.])* -> =@\0.replace(".", "")
# Ne pas scinder la phrase si les points de suspension sont suivis d’une minuscule
(\w+)(…)(?= [a-zéèêàâîô]) <- not re.match("(?i)etc", \1) -2> ,

[word]
(M[.]) (?:[A-ZÉÈÎ]\w+|l[e'’]) -1> Mr
MM[.] -> "MM@"
"\d+ (m) " -1> @


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]


############################## TYPOGRAPHIE ##############################

[Char]
__typo__  \betc([.][.][.]|…) -> etc.				                                    # Un seul point après « etc. »

# virgules manquantes
__virg__  \b\w[\w-]*( etc[.]) -1> , etc.                                                # Avant « etc. », il faut mettre une virgule.
__virg__  \b(\w[\w-]*)( car) (j[e’]|tu|ils?|nous|vous|elles?|on|les?|la|ces?|des?|cette|[mts](?:on|a))\b
    <- not morph(\1, "po:(?:det|prep)", False)
    -2> , car          # Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447
__virg__  \b\w[\w-]*( mais) (j[e’]|tu|ils?|elles?|on|ces?|des?|cette|[mts](?:on|a))\b
    -1> , mais   # Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445
__virg__  \b(\w[\w-]+)( \w-(?:moi|toi|l(?:ui|a|e(?:ur|s|))|nous|vous))
    <- morph(\1, "po:(?:prn|nom)", False)
    -2> \1,      # Ajoutez une virgule.
#__virg__  , (\w[\w’-]*)
#	<- morphex(\1, "po:[123](?:sg|pl)", "po:(nom|impe|ad[jv]|mg|patr|prn)") and not before(",")
#	-> =0[1:]    # Un verbe ne doit pas être séparé du sujet, sauf éventuellement par une incise. (Et ce verbe n’est pas non plus un impératif.) [Sac à bugs]
[char]
__virg__  ([.]\xA0» )([a-zé]) -1> " », | » "       # Ou il faut une virgule (exemple : « Je viens », dit-il). Ou le point est superflu. Ou il faut une majuscule sur le mot suivant.
__virg__  (,\xA0»,? )([a-zé]) -1> " », | » "       # Virgule mal placée ou superflue.


[word]
__maj__  (\w[\w-]+)[.] ([a-zéàèî]\w+)
    <- not re.match(u"(?i)(etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|ref|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1) and morph(\1, "po:") and morph(\2, "po:")
    -2> =\2.capitalize()                                                   # Après un point, une majuscule est généralement requise.

[char]
# définitions
abc [a-z]+
ABC [A-Z]+
Abc [a-zA-Z]+

__typo__  (\w+)[?!,:;%‰‱˚»”](\w+) <- not \1.isdigit() -2> " \2"         # Il manque une espace.
__typo__  {abc}[.]([A-ZÉÂÎ]\w+) -2> " \2"                               # Il manque une espace.

__typo__  [.]{3,5}(?![.]) -> …                                          # Typographie : points de suspension. Utilisez le caractère dédié.
__typo__  [.]{6,} -> =\0.replace("...", u"…").rstrip(".")               # Typographie : succession de points. Utilisez le caractère dédié.
__typo__  (?<![.…])[.][.](?![.]) -> …|.                                 # Typographie : un ou trois points ?
__typo__  , *… -> …                                                     # Typographie : pas de virgule avant les points de suspension.
__typo__  …[.][.]?(?![.]) -> …                                          # Point(s) superflu(s).
__typo__  " ([].,)”])" -> \1                                            # Pas d’espace avant cette ponctuation.
__typo__  (\w+)([.],)
    <- not re.match(u"(etc|[A-Z]|fig|hab|litt|circ|coll|ref|étym|suppl|bibl|bibliogr|cit|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
    -2> .|,                                                            # Pas de virgule après un point (sauf éventuellement après une abréviation).
__typo__  "([[(“]) " -> \1                                              # Pas d’espace après cette ponctuation.
__typo__  (?<=[^(][^(][^(][^(])[)]\b -> ") "                            # Il manque une espace après la parenthèse.
__typo__  \b[(](?=[^)][^)][^)]) -> " ("                                 # Il manque une espace avant la parenthèse.
__typo__  "^-( | )" -> "– |— "                                          # Dialogues et énumérations : un tiret cadratin ou demi-cadratin, suivi d’une espace insécable, est requis.
__typo__  "^([—–]) +" -> "\1 "                                          # Dialogues et énumérations : ce tiret doit être suivi d’une espace insécable.
__typo__  " - " -> " – | — "                                            # Tiret d’incise : un tiret cadratin ou demi-cadratin est requis.
__typo__  (,,|;;|::) -> =\1[1]                                          # Ponctuation redondante.
__typo__  ,[.;:…!?] -> _                                                # Une de ces ponctuations est superflue.
__typo__  ;[.,:…!?] -> _                                                # Une de ces ponctuations est superflue.
__typo__  :[.,;…!?] -> _                                                # Une de ces ponctuations est superflue.

__unit__  \b\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?( ?([kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰]|°C))\b
    -1> " \2"                                                  # Il manque une espace insécable.

__nbsp__  "( |\b)([?!;»])"  -> " \2"                            # Il manque une espace insécable.
__nbsp__  "([].!?)])»"  -> "\1 »"                               # Il manque une espace insécable.
__nbsp__  "«( |\b)"  -> "« "                                    # Il manque une espace insécable.
__nbsp__  "( |\b):(?= |$)"  -> " :"                             # Il manque une espace insécable.
__nbsp__  "([:;]) "  -> "\1 "                                   # Pas d’espace insécable après le signe “\1”.

__typo__  (\d+) ?[x*] ?(\d+) -> \1 × \2                         # Signe de multiplication typographique.

# Guillemets
__typo__  \"(\w[^\'"]*[\w.?!,])\" -> « \1 »|“\1”                                    # Guillemets typographiques.
__typo__  \B'(\w[^']*[\w.?!,])'\B -> “\1”|‘\1’                                      # Guillemets typographiques.
__typo__  " ['‘’]['‘’] " -> " « | » | “|” "                                         # Guillemets typographiques.
__typo__  ' " ' -> " « | » | “|” "                                                  # Guillemets typographiques.

# ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
__liga__  [ﬁﬂﬀﬃﬄﬅﬆ] -> =undoLigature(\0)                                            # Suppression de la ligature typographique.

# Apostrophe typographique
__apos__  (?i)([ldsncjmtç]|jusqu|lorsqu|aujourd|entr|presqu|puisqu|qu)['´‘′`](?=\w) -> \1’                      # Apostrophe typographique.

### Espaces surnuméraires
__esp__  ^ + -> ""                                                  # Espace(s) en début de ligne à supprimer : utilisez les retraits de paragraphe (ou les tabulations à la rigueur).
__esp__  (?: \xA0|\xA0 ) -> " | "                                   # Incohérence : l’espace insécable à côté de l’espace sécable n’a pas d’effet.
__esp__  "\xA0\xA0+" -> " "                                         # Espace(s) insécable(s) surnuméraire(s) à supprimer.
__esp__  (\b|[.?!,:;%‰‱˚»”])  +\b -> "\1 "                          # Espace(s) surnuméraire(s) à supprimer.
__esp__  " +$" -> ""                                                # Espace(s) en fin de ligne à supprimer.

[Char]
__esp__  "\b(([ldsncjmt])(?:[’'´‘`] | [’'´‘′`] ?))[aeéiouhœæyîèêôû]"
    -1> \2’                                                                                                        # Pas d’espace avant ou après une apostrophe.
__esp__  "\b((lorsqu|puisqu|presqu|quoiqu|jusqu|qu|aujourd|entr|ç)(?:[’'´‘′`] | [’'´‘′`] ?))[aeéiouhœæyîèêôû]"
    -1> \2’                                                                                                        # Pas d’espace avant ou après une apostrophe.
__typo__  "\b(([ldsncjmtç]|lorsqu|puisqu|presqu|quoiqu|jusqu|qu|aujourd|entr)[’'´‘′`][’'´‘′`])[aeéiouhœæyîèêôû]"
    -1> \2’                                                                                                        # Apostrophe surnuméraire.

## Apostrophes manquantes
__typo__  "\b(lorsqu|puisqu|presqu|quoiqu|jusqu|qu|aujourd|entr) "
    -> \1’                                                                                                   # Il manque vraisemblablement une apostrophe.

# Solution prudente :
__typo__  \b(je|tu|ils?|nous|vous|on|ça|elles?) ([nmtsl] )([aeéiouhyîèêôû][\w-]*)
    <- not option("mapos") and morph(\3, "po:v", False)
    -2> =\2[:-1]+u"’"                                                                                        # Il manque probablement une apostrophe.
__typo__  \bne ([mtsl] )([aeéiouhyîèêôû][\w-]+)
    <- morph(\2, "po:v", False)
    -1> =\1[:-1]+u"’"                                                                                        # Il manque probablement une apostrophe.
# Solution audacieuse :
[char]
__typo__  \b([ldsncjmtç] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ]
    <- option("mapos") and not before(u"(?i)(?:lettre|caractère|glyphe|dimension|variable|fonction|point) *$")
    -1> =\1[:-1]+u"’"                                                                                        # Il manque peut-être une apostrophe.
# Note : pour les majuscules, la règle se situe lors de la passe suivante.

[Word]
# élisions
__typo__  (l[ea] |de )([aâeéêiîoôu]\w+) <- not re.match(u"([oO]nz|[éÉ]nième|[AÂEÉÊIÎOÔU])", \2) and not morph(\2, "po:mg", False)
    -1> l’                                                              # Élision de l’article devant un mot commençant par une voyelle.|http://fr.wikipedia.org/wiki/Élision
__typo__  (ce) ([aâeéêiîoôu]\w+) <- not re.match(u"(?i)(onz|énième)", \2) and morph(\2, "is:(?:mas|epi)")
    -1> cet                                                             # Euphonie : « ce » devient « cet » devant un mot commençant par une voyelle.
__typo__  si (ils?)  -> s’\1                                            # Il faut élider « si » et l’accoler au pronom.|http://fr.wikipedia.org/wiki/Élision
__typo__  que (ils?|elles?|on)  -> qu’\1                                # Il faut élider « que » et l’accoler au pronom.|http://fr.wikipedia.org/wiki/Élision

[word]
# NF
__nf__  [Nn][Ff][  -]?(C|c|E|e|P|p|Q|q|S|s|X|x|Z|z|EN(?:[  -][Ii][Ss][Oo]|))[  -]?[0-9]+(?:[/ ‑-][0-9]+|)
    <- not re.match(u"NF (?:C|E|P|Q|S|X|Z|EN(?: ISO|)) [0-9]+(?:‑[0-9]+|)", \0)
    -> =formatNF(\0)    # Norme française. Utilisez les espaces et tirets insécables.|http://fr.wikipedia.org/wiki/Liste_de_normes_NF

# Chimie
__chim__  (Ca(CO3|SO4)|CO2|(H2|Na2)(CO3|O|SO4)|[HNO]2|HNO3|Fe2O3|KMnO4|NO2|SiO2|SO[23])
    -> =\0.replace("2", u"₂").replace("3", u"₃").replace("4", u"₄")           # Typographie des composés chimiques. [!]


# dates
[Word]
__date__ (?<!\d[ /.-])(\d\d?)[ /.-](\d\d?)[ /.-](\d\d\d+)(?![ /.-]\d)
    <- not checkDate(\1,\2,\3) and not re.match("(?i)versions?", word(-1)) -> _            # Cette date est invalide.

__date__ (\d\d?) (janvier|février|ma(?:rs|i)|a(?:vril|o[ûu]t)|jui(?:n|llet)|septembre|octobre|novembre|décembre) (\d\d\d+)
    <- not checkDateWithString(\1,\2,\3) -> _                                              # Cette date est invalide.

__date__ (lundi|m(?:ardi|ercredi)|jeudi|vendredi|samedi|dimanche),? (?:le |)(\d\d?)[ /-](\d\d?)[ /-](\d\d+)(?! av(?:ant|[.]) J(?:[.]-C[.]|ésus-Christ))
    <- not checkDay(\1,\2,\3,\4) -1> =getDay(\2,\3,\4)                                      # Le jour de la date suivante est incorrect.

__date__ (lundi|m(?:ardi|ercredi)|jeudi|vendredi|samedi|dimanche),? (?:le |)(\d\d?) (janvier|février|ma(?:rs|i)|a(?:vril|o[ûu]t)|jui(?:n|llet)|septembre|octobre|novembre|décembre) (\d\d+)(?! av(?:ant|[.]) J(?:[.]-C[.]|ésus-Christ))
    <- not checkDayWithString(\1,\2,\3,\4) -1> =getDayWithString(\2,\3,\4)                  # Le jour de la date suivante est incorrect.

__date__ 31 (avril|juin|septembre|novembre)
    -> _                                                                                    # Cette date est invalide. Il n’y a que 30 jours en \1. 

__date__ 3[01] février
    -> _                                                                                    # Cette date est invalide. Il n’y a que 28 ou 29 jours en février. 


############################## LIAISONS - TRAITS D’UNION ##############################

[Word]
#[Char] auparavant, erreur?
__tu__  \w*[ae](-t[’' ](il|elle|on)) -1> -t-\2                                             # Il faut deux traits d’union.
__tu__  \w*[ae]( t[-’' ](il|elle|on)) -1> -t-\2                                            # Il faut deux traits d’union.
__tu__  va[ -]t[ -]en(?! guerre) -> va-t’en                                             # Une apostrophe est nécessaire (s’en aller).
__tu__  va[ -]t[’' -]en guerres? -> va-t-en-guerre                                      # Va-t-en-guerre (invariable) : des traits d’union sont nécessaires.
__tu__  y[’'-]([aeêésfo]\w*) <- morph(\1, ":v0", False) or \1 == "en" -> y \1           # Ici, ni apostrophe, ni trait d’union.

[Word]

### Traits d’union douteux
__tu__  (\w+)(?:--|—|–)(\w+) <- spell(\1+"-"+\2) and morph(\1+"-"+\2, "po:", False) -> \1-\2      # Trait d’union : un tiret simple suffit.

### ce / cet / cette / ces + nom + là
__tu__  c(?:e[st]?|ette) ((\w[\w-]+) là)(?! où) <- morph(\2, "po:n(?:om|b)", False) -1> \2-là                # Il manque probablement un trait d’union.
__tu__  c(?:e[st]?|ette) ((\w[\w-]+) la) <- morph(\2, "po:n(?:om|b)", False) and not word(1) -1> \2-là       # Il manque probablement un trait d’union.

### Préfixes
__tu__  ex (\w\w+) <- morph(\1, "po:nom") and not re.match(u"(?i)(aequo|nihilo|cathedra|absurdo|abrupto)", \1)
    -> ex-\1                                                                               # Il manque un trait d’union.
__tu__  mi (\w\w+) <- morph(\1, "po:(?:nom|adj|ppas)", False) -> mi-\1                      # Il manque un trait d’union.
__tu__  (?:l[ea]|ces?|cette|des?|ma|mon|[lmts]es) (quasi (\w+))
    <- morphex(\2, "po:nom", "po:(?:adj|mg|adv)")
    -1> quasi-\2                                                                           # Il manque un trait d’union : « quasi » s’accroche au mot qui le suit s’il s’agit d’un nom.
__tu__  semi (\w\w+) <- morph(\1, "po:(?:nom|adj|ppas)", False) -> semi-\1                  # Il manque un trait d’union.

__tu__  (franco|américano|anglo|belgo|électro|ferro|hydro|labio|macro|magnéto|médico|micro|nano|néo|neuro|paléo|physico|politico|pseudo|rétro|rhino|sino|socio|stéréo) (\w+)
    <- spell(\1+"-"+\2) and morph(\1+"-"+\2, "po:", False)
    -> \1-\2                                                                    # Il manque un trait d’union.

__tu__  (anti|auto|arrière|avant|demi|extra|intra|multi|non|post|sans|sous) (\w+)
    <- spell(\1+"-"+\2) and morph(\1+"-"+\2, "po:", False) and morph(word(-1), "po:det", False, not bool(re.match("(?i)s(?:ans|ous)$",\1)))
    -> \1-\2                                                                    # Il manque probablement un trait d’union.

__tu__  (attrape|garde|porte|brise|cache|casse|chauffe|contre|coupe|cure|croque|entre|essuie|lance|lave|lève|marque|pare|passe|perce|pèse|porte|poste|pousse|presse|protège|ramasse|serre|taille|tire|tourne|traîne|vice|vide) (\w+)
    <- spell(\1+"-"+\2) and morph(\1+"-"+\2, "po:nom", False) and morph(word(-1), "po:(?:det|v0e)", False, True)
    and not (morph(\1, "po:mg", False) and morph(\2, "po:(?:mg|infi|nb)", False))
    -> \1-\2                                                                    # Il manque probablement un trait d’union.

### Tri 1
__tu__  [àa] tout vas? -> à tout-va                                             # « À tout-va » : locution invariable.
__tu__  allers? retours? -> =\0.replace(" ", "-")                               # Il manque un trait d’union.
__tu__  arcs? en ciel -> =\0.replace(" ", "-")                                  # Il manque les traits d’union.
__tu__  après demain -> après-demain                                            # Il manque un trait d’union.
__tu__  au (delà|dehors|desso?us|devant) -> au-\1                               # Il manque un trait d’union.
__tu__  avant hier -> avant-hier                                                # Il manque un trait d’union.
__tu__  c’est [àa] dire -> c’est-à-dire                                         # Il manque les traits d’union.
__tu__  chef (lieu|d’œuvre) -> chef-\1                                          # Il manque un trait d’union.
__tu__  (celles?|celui|ceux) là -> \1-là                                        # Il manque un trait d’union.
__tu__  (celles?|celui|ceux) [cs]i -> \1-ci                                     # Il manque un trait d’union.
__tu__  centres? villes? -> centre-ville|centres-villes                         # Il manque un trait d’union.
__tu__  ci (desso?us|devant|contre) -> ci-\1                                    # Il manque un trait d’union.
__tu__  de ci,? de là -> de-ci de-là|de-ci, de-là                               # Il manque les traits d’union.
__tu__  (?<![cCdDlL][’'])est ce <- morph(word(-1), "po:cjsub", False, True) -> est-ce  # Il manque un trait d’union.
__tu__  en contre (bas|partie) -> en contre\1|en contre-\1                      # Mettez un trait d’union ou soudez.
__tu__  en contre[- ]point -> en contrepoint                                    # Soudez.
__tu__  état major -> état-major                                                # Il manque un trait d’union.
__tu__  grand chose -> grand-chose                                              # Il manque un trait d’union.
__tu__  grands? (père|mère)s? -> =\0.replace(" ", "-")                          # Il manque un trait d’union.
__tu__  ici bas -> ici-bas                                                      # Il manque un trait d’union.
__tu__  jusque là -> jusque-là                                                  # Il manque un trait d’union.
__tu__  là (bas|haut|desso?us|dedans|devant|derrière) -> là-\1                  # Il manque un trait d’union.
__tu__  n’est( ce[ -]pas|-ce-pas) -> n’est-ce pas                               # Un trait d’union.
__tu__  (nord|sud) ouest -> \1-ouest                                            # Il manque un trait d’union.
__tu__  (nord|sud) est <- not word(1) -> \1-est                                 # Il manque un trait d’union.
__tu__  outre mer -> outre-mer                                                  # Il manque un trait d’union.
__tu__  ou[iï] dire <- morph(word(-1), "po:mg") -> ouï-dire                     # Il manque un trait d’union.
__tu__  par (desso?us|devant|delà|derrière|dehors|dedans|devers)
    -> par-\1                                                                  # Il manque un trait d’union.
__tu__  par ci,? par là -> par-ci par-là|par-ci, par-là                         # Trait(s) d’union manquant(s).
__tu__  (prêts?) à porter <- re.match("(?i)(les?|du|des|un|ces?|[mts]on)", word(-1))
    -> \1-à-porter                                                             # Il manque les traits d’union.
__tu__  plate(s)? forme(?(1)s) -> plate-forme|plates-formes                     # Il manque un trait d’union.
__tu__  quelques (une?s) -> quelques-\1                                         # Il manque un trait d’union.
__tu__  (plus|moins) (values?) -> \1-\2                                         # Il manque un trait d’union.
__tu__  rez de chaussée -> rez-de-chaussée                                      # Il manque un trait d’union.
__tu__  (\w+) (sans gêne) <- morph(\1, ":det", False) -2> sans-gêne             # Il manque un trait d’union.
__tu__  science fiction -> science-fiction                                      # Il manque un trait d’union.
__tu__  soi disant
    <- not (morph(word(-1), "po:prep", False) and after(" *qu[e’]"))
    -> soi-disant                                                               # Il manque un trait d’union.
__tu__  sous (jacente?s?) -> sous-\1                                            # Il manque un trait d’union.
# sur-mesures
__tu__  vice (présidents?|rois?) -> vice-\1                                     # Il manque un trait d’union.
__tu__  vis [àa] vis -> vis-à-vis                                               # Il manque les traits d’union.
__tu__  week (ends?) -> week-\1                                                 # Il manque un trait d’union.

### Tri 2
__tu__  (?:les|aux) (beaux arts) -1> beaux-arts                                 # Il manque un trait d’union.
__tu__  (basket|volley) ball -> \1-ball                                         # Il manque un trait d’union.
#(jusque|moment|celles?|celui|ceux|matins?|jours?|nuits?|deux) là
__tu__  (lui|elle|soi|vous) même -> \1-même                                     # Il manque un trait d’union.
__tu__  (nous|vous|eux|elles) mêmes -> \1-mêmes                                 # Il manque un trait d’union.
__tu__  (?:[lcd]es?|un|[mts]on|leurs?) (va et vient) -1> va-et-vient            # Il manque les traits d’union.


### Noms propres
[word]
__tu__  Royaume Uni -> Royaume-Uni                                              # Il manque un trait d’union (s’il s’agit de l’État englobant la Grande-Bretagne et l’Irlande du Nord).
__tu__  Grande Bretagne -> Grande-Bretagne                                      # Il manque un trait d’union (s’il s’agit de l’État englobant l’Angleterre, l’Écosse et le pays de Galles).
__tu__  (?:les|aux) (Pays Bas) -1> Pays-Bas                                     # Il manque un trait d’union.
__tu__  Aix en Provence -> Aix-en-Provence                                      # Il manque un trait d’union.
__tu__  Bosnie Herzégovine -> Bosnie-Herzégovine                                # Il manque un trait d’union.
__tu__  Charente Maritime -> Charente-Maritime                                  # Il manque un trait d’union.
__tu__  Clermont Ferran[dt] -> Clermont-Ferrand                                 # Il manque un trait d’union.
__tu__  Colombie Britannique -> Colombie-Britannique                            # Il manque un trait d’union.
__tu__  Franche Comté -> Franche-Comté                                          # Il manque un trait d’union.
__tu__  Haute (Garonne|Loire|Marne|Normandie|Corse|Vienne) -> Haute-\1          # Il manque un trait d’union.
__tu__  [ÎI]le de France -> Île-de-France                                       # Il manque les traits d’union.
__tu__  Jean (Baptiste|Claude|François|Jacques|Louis|Luc|Marc|Marie|Michel|Paul|Philippe|Pierre)
    -> Jean-\1                                                                 # Il manque un trait d’union.
__tu__  Jésus Christ -> Jésus-Christ                                            # Il manque un trait d’union.
__tu__  Marie (Ange|Agnès|Anne|Antoinette|Cécile|Chantal|Charlotte|Christine|Claire|Claude|Dominique|France|Françoise|Hélène|Jeanne|José|Josèphe|Line|Louise|Madeleine|Noëlle|Odile|Paule|Pierre|Rose|Thérèse)
    -> Marie-\1                                                                # Il manque un trait d’union.
__tu__  Maison Blanche -> Maison-Blanche                                        # Il manque un trait d’union.
__tu__  Moyen Orient -> Moyen-Orient                                            # Il manque un trait d’union.
__tu__  Nouveau Brunswick -> Nouveau-Brunswick                                  # Il manque un trait d’union.
__tu__  Nouvelle (Zélande|Calédonie|Orléans) -> Nouvelle-\1                     # Il manque un trait d’union.
__tu__  Pas de Calais -> Pas-de-Calais                                          # Il manque les traits d’union.
__tu__  Rhône Alpes -> Rhône-Alpes                                              # Il manque les traits d’union.
__tu__  Saône et Loire -> Saône-et-Loire                                        # Il manque un trait d’union.

[Word]

### nombres
__tu__  (dix|vingts?|trente|quarante|cinquante|soixante|septante|octante|huitante|nonante) ((?:deux|trois|six|sept|huit)(?:ièmes?|)|quatre|quatrièmes?|cinq|cinquièmes?|neuf|neuvièmes?)
    -> =\0.replace(" ", "-").replace("vingts", "vingt")                     # Il manque un trait d’union.
__tu__  soixante ((douz|treiz|quatorz|quinz|seiz)(e|ièmes?)|(dix|dix[- ]sept|dix[- ]huit)(ièmes?)?|dix[- ]neuf|dix[- ]neuvièmes?)
    -> =\0.replace(" ", "-")                                                # Trait(s) d’union manquant(s).
__tu__  quatre[- ]vingts? (?:une|(?:un|deux|trois|six|sept|huit|dix|dix-sept|dix-huit)(?:ièmes?|)|(?:quatr|onz|douz|treiz|quatorz|quinz|seiz)(?:e|ièmes?)|cinq|cinquièmes?|neuf|neuvièmes?)
    -> =\0.replace(" ", "-").replace("vingts", "vingt")                     # Trait(s) d’union manquant(s).
#__tu__  (vingt|trente|quarante|cinquante|soixante|septante|octante|huitante|nonante)[- ](une?|unièmes?)
#	-> \1 et \2|\1-et-\2                                                    # Il manque « et ». (Si vous suivez la réforme orthographique, utilisez des traits d’union.)

### Pas de trait d’union
__tu__  deux-tiers -> deux tiers                                                            # Pas de trait d’union.
__tu__  en-(bas|haut|de(?:ssous|hors|çà)) -> en \1                                          # Pas de trait d’union.
__tu__  peu-[aà]-peu -> peu à peu                                                           # Pas de trait d’union.
__tu__  s’il-([tm]e|[vn]ous)-(pla[îi]t) -> s’il \1 \2                                       # Pas de traits d’union.
__tu__  tout-à-fait -> tout à fait                                                          # Pas de trait d’union.
__tu__  trois-quarts <- not morph(word(-1), "po:det", False, False) -> trois quarts         # Pas de trait d’union.
__tu__  parce-(que?) -> parce \1                                                            # Pas de trait d’union.
__tu__  (y-)a[- ]t[-’ ](?:il|on|elle) -1> "y "                                              # Pas de trait d’union.

[Char]
__tu__  \b-(ç[aà]|aussi|donc)\b -> " \1"                                                    # Pas de trait d’union.



############################## NOMBRES ##############################

### Grands nombres

[char]

__num__  \b\d\d\d\d\d+\b <- not before(u"NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *") -> =formatNumber(\0)                   # Formatage des grands nombres.


#(\d\d\d\d)-(\d\d\d\d)   -> \1–\2                                            # Ne pas séparer deux dates par un trait d’union, mais par un tiret demi-cadratin.

[word]
__num__  [\dO]+O[\dO]+ -> =\0.replace("O", "0")                             # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».
__num__  [1-9]O -> =\0.replace("O", "0")                                    # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

### Nombres ordinaux

[word]

__typo__  ([0-9]+) ?(è|i?[èe]mes?) -> \1ᵉ|\1e                               # Nombre ordinal.
__typo__  ([IVXLCM]{1,3}) ?(è|i?[èe]mes?) -> \1ᵉ|\1e                        # Nombre ordinal romain.


############################## RÈGLES DE BASE ##############################

[Word]

### doublon avec casse identique
(\w+) \1
    <- not re.match(u"(?i)([nv]ous|faire|en|la|lui|donnant|œuvre|h[éo]|olé|joli|Bora|couvent|dément|sapiens|très|vroum|[0-9]+)$", \1)
    and not (re.match("(?:est|une?)$", \1) and before(u"[’']$"))
    and not (\1 == "mieux" and before("(?i)qui +$"))
    -> \1   # Doublon.


### double négation
pas (personne|aucune?|jamais)
    -> \1|pas, \1                          # Double négation : les mots « pas \1 » ne devraient pas se succéder.

[word]
### incohérences globales
([cdlmtsCDLMTS]es|[nvNV]os|[cC]e(?:tte|t|)|[mtsMTS]a|[mM]on|[aA]ux?) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)
    -> _                                   # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.


################################################## STYLE ##################################################

########## Basique

[char]

#__bs__  Mr -> M.                                                                        # M. est l’usage courant pour “Monsieur”. « Mr » est l’abréviation ancienne, française.

[Word]

# à / en
__bs__  (en) A(gen|miens|ngers|jjacio|rles|vignon)
    -1> à                          # On utilise la préposition “à” avant les villes (à Avignon, à Arles…), la préposition “en” avant les régions (en Amérique, en Afrique…).

# avoir été
__bs__  ([aeo]\w*) été chez <- not re.match("(?i)avoir$", \1) and "avoir" in stem(\1)
    -> _                                                                                # Tournure familière. Utilisez « être allé ».

# abyme / abîme
__bs__  mis\w+ en (ab[îi]mes?) -1> abyme                                                # Classiquement, on écrit plutôt « abyme » dans cette expression.

# malgré que
__bs__  malgré (que|qu’\w+) <- not (word(1) == "en" and "avoir" in stem(word(2))) and not (word(2) == "en" and "avoir" in stem(word(3)))
    -> bien \1                                                                             # Tournure populaire. Utilisez « bien que ».

# pire
__bs__  (?:moins|aussi|plus) (pires?) -1> mauvais|mauvaise|mauvaises                        # Tournure familière. Utilisez « mauvais ».
__bs__  de mal en pire -> de mal en pis                                                     # Tournure familière. Utilisez « de mal en pis ».
__bs__  au pire aller -> au pis aller                                                       # Tournure familière. Utilisez « au pis aller ».

# très / trop
__bs__  tr(ès|op) (beaucoup|assez|mieux|pire|meilleur|délicieux) -> \2                      # « tr\1 » est superflu.

# novlangue
__bs__  (vidéo-?protection(s|))
    -1> vidéosurveillance\2|télésurveillance\2|surveillance\2 des populations               # Novlangue. Double pensée. Vocabulaire destiné à affaiblir l’esprit. Utilisez un terme plus approprié.|http://fr.wikipedia.org/wiki/Doublepens%C3%A9e

#__bs__  (tomb\w+) dans les pommes -> \1 dans les pâmes                                     # « Tomber dans les pâmes » est l’ancienne tournure.



######### Expressions impropres

#([mts]e|[nv]ous) (rappel\w+) (de) <- word(1) != "ne" and not morph(word(1), "po:v")
#	-3> _                                                                # Expression impropre. « Se rappeler quelque chose » ou « Se souvenir de quelque chose ».
#Se rappelle de l’amour

#enjoindre à qqn de faire qqch

########## Pléonasmes

[Word]

__pleo__  (abol\w+) entièrement <- "abolir" in stem(\1) -> \1                                                   # Pléonasme.
__pleo__  (accul\w+) aux? pieds? du mur -> \1                                                                   # Pléonasme.
__pleo__  (ach[eè]v\w+) compl[éè]tement <- "achever" in stem(\1) -> \1                                          # Pléonasme.
__pleo__  actuellement en cours <- not after(r" +de?\b") -> en cours                                            # Pléonasme.
__pleo__  actuellement en train de -> en train de                                                               # Pléonasme.
__pleo__  (ajout\w+) en plus -> \1                                                                              # Pléonasme.
__pleo__  (apanages?) exclusifs? -> \1                                                                          # Pléonasme.
__pleo__  (applaudi\w+) des deux mains -> \1                                                                    # Pléonasme.
__pleo__  au jour d[’']aujourd’hui -> aujourd’hui                                                               # Pléonasme.
__pleo__  (avan[cç]\w*) en avant -> \1                                                                          # Pléonasme.
__pleo__  s’avér(\w+) vrai(e?s?) -> s’avér\1 exact\2                                                            # Pléonasme.
__pleo__  (avérée?s?) vraie?s? -> \1                                                                            # Pléonasme.
__pleo__  avenir devant (lui|[mts]oi|eux|[nv]ous) <- morph(word(-1), "(po:adj|st:un)", False) -> avenir         # Pléonasme.
__pleo__  (bourrasques?) de vent -> \1                                                                          # Pléonasme.
__pleo__  car en effet -> car|en effet                                                                          # Pléonasme.
__pleo__  (cirrhoses?) du foie -> \1                                                                            # Pléonasme.
__pleo__  (collabor\w+) ensemble -> \1                                                                          # Pléonasme.
__pleo__  comme par exemple -> comme|par exemple                                                                # Pléonasme.
__pleo__  (compar\w+) entre eux <- stem(\1) == ["comparer"] -> \1                                               # Pléonasme.
__pleo__  (contrainte?s?) malgré (soi|eux|lui|moi|elle|toi) -> \1                                               # Pléonasme.
__pleo__  (contrai\w+) malgré (soi|eux|lui|moi|elle|toi) <- stem(\1) == ["contraindre"] -> \1                   # Pléonasme.
__pleo__  de (d’autres?) -> \1                                                                                  # Pléonasme.
__pleo__  (descend\w+) en bas(?! de) -> \1                                                                      # Pléonasme.
__pleo__  (dessin\w+) un dessin -> \1                                                                           # Pléonasme.
__pleo__  donc par conséquent -> donc|par conséquent|c’est pourquoi                                             # Pléonasme.
__pleo__  (enchevêtr\w+) les uns dans les autres -> \1                                                          # Pléonasme.
__pleo__  (s’entraid\w+) (mutuellement|les uns les autres) -> \1                                                # Pléonasme.
__pleo__  (erreurs?) involontaires? -> \1                                                                       # Pléonasme.
__pleo__  (étapes?) intermédiaires? -> \1                                                                       # Pléonasme.
__pleo__  (hasards?) imprévus? -> \1                                                                            # Pléonasme.
__pleo__  (hémorragies?) de sang -> \1                                                                          # Pléonasme.
__pleo__  (join\w+) ensemble <- stem(\1) == ["joindre"] -> \1|mettre ensemble                                   # Pléonasme.
__pleo__  lever debout -> lever                                                                                 # Pléonasme.
__pleo__  mais (cependant|pourtant|toutefois) -> mais|cependant|pourtant|toutefois                              # Pléonasme.
__pleo__  (marches?) à pieds? -> \1                                                                             # Pléonasme.
__pleo__  (méandres?) sinueux -> \1                                                                             # Pléonasme.
__pleo__  (m[eé]dias?) d’informations? -> \1                                                                    # Pléonasme.
__pleo__  (monopoles?) exclusifs? -> \1                                                                         # Pléonasme.
__pleo__  (mont\w+) en haut(?! d[eu’]) -> \1                                                                    # Pléonasme.
__pleo__  (opportunités?) à saisir -> \1                                                                        # Pléonasme.
__pleo__  (orages? électriques?) -> \1                                                                          # Pléonasme.
__pleo__  paires? de jumelles -> jumelles                                                                       # Pléonasme.
__pleo__  (panacées?) universelles? -> \1|remède universel                                                      # Pléonasme.
__pleo__  (perspectives?) d’avenir -> \1                                                                        # Pléonasme.
__pleo__  premiers? (balbutiements?) -> \1                                                                      # Pléonasme.
__pleo__  premières? (priorités?) -> \1                                                                         # Pléonasme.
__pleo__  (projets?) futurs? -> \1                                                                              # Pléonasme.
__pleo__  futurs? (projets?) -> \1                                                                              # Pléonasme.
__pleo__  (prototypes?) expérimenta(l|ux) -> \1                                                                 # Pléonasme.
__pleo__  (rénov\w+) à neuf -> \1                                                                               # Pléonasme.
__pleo__  puis (après|ensuite|alors) -> puis|après|ensuite|alors                                                # Pléonasme.
__pleo__  (se|[nv]ous) (réuni(?:r|\w+on[st]|\w+ez)) ensemble -> \1 \2                                           # Pléonasme.
__pleo__  (recul\w*) en arrière -> \1                                                                           # Pléonasme.
__pleo__  (risqu\w+) de menace[rs] -> \1                                                                        # Pléonasme.
__pleo__  (risques?) potentiels? -> \1                                                                          # Pléonasme.
__pleo__  (secousses?) sismiques? -> secousse tellurique|secousses telluriques|tremblement de terre             # Pléonasme.
__pleo__  (solidaires?) les uns des autres -> \1                                                                # Pléonasme.
__pleo__  (suffi\w+) simplement <- stem(\1) == ["suffire"] -> \1                                                # Pléonasme.
__pleo__  (tunnels?) souterrains? -> \1                                                                         # Pléonasme.
__pleo__  vieilles hardes -> hardes                                                                             # Pléonasme.
__pleo__  voire même -> voire|même                                                                              # Pléonasme.

# d’avance / à l’avance
__pleo__  ((pré[pvds]|pressent|pronostiqu|réserv|devan[cç]|avert)\w+) (d’avance|à l’avance)
    <- stemchk(\1, u"^(prévenir|prévoir|prédire|présager|préparer|pressentir|pronostiquer|avertir|devancer|réserver)$", False)
    -> \1                                                                                                      # Pléonasme.

# plus tard / à une date ultérieure
__pleo__  ((diff|ajourn|report)\w+) à (plus tard|date ultérieure|une date ultérieure)
    <- stemchk(\1, u"^(ajourner|différer|reporter)$", False)
    -> \1                                                                                                      # Pléonasme.


########## Redondances

W \w[\w-]{2,}

__redon1__   {W}[  ,.;!?:].*[  ](\1)
    <- not morph(\1, u"(?:po:(?:mg|v0)|st:(?:t(?:antôt|emps|rès)|loin|souvent|parfois|quelquefois|côte) )", False) and not \1[0].isupper()
    -2> _           # Dans ce paragraphe, répétition de « \1 ».


################################################################################################################################################################
################################################################################################################################################################
## PASSE 1
## phrase par phrase
################################################################################################################################################################
################################################################################################################################################################
[++]

#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
# épuration des signes inutiles
#
[pp]

[char]
[«»“”„"`¹²³⁴⁵⁶⁷⁸⁹⁰]+ -> *
^ *[-–—] -> *
[[({][\dIVXLCDM]+, \d+[])}] -> *
\b(qu|lorsqu|puisqu|quoiqu|jusqu)’ -> \1

# le, la ou les chose(s)
\bl[ea] ou les \w[\w-]+([(]s[)]) -1> s


[Word]
# les références aux notes
[a-zéèâàôîù][a-zéèâàôîù-]+(\d+) <- not morph(\0, "po:", False) -1> *

# faux positifs avec adverbes de négation
pas mal <- not morph(word(-1), "po:det", False) -> *
pas assez (\w[\w-]+) <- morph(\1, "po:adj", False) and not morph(word(-1), "po:det", False) -> *

# faux positifs avec «à chez»
de chez \w+ à chez (?:moi|toi|lui|elles?|eux|nous|vous) -> * 
(jusqu à|de) chez -1> *

# faux positifs
en tout et pour tout -> *

# singletons entre parenthèses / crochets / accolades
[(]\w+[)] -> *
[{]\w+[}] -> *
[[]\w+[]] -> *

[word]
# Avocats
(Me) [A-ZÉÂÔÈ][\w-]+ -1> *


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]

# Apostrophe manquante (voir règle à la passe précédente)
[char]
__typo__  ^([LDSNCJMTÇ] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ]
    <- option("mapos") 
    -1> =\1[:-1]+"’"                                                                                         # Il manque peut-être une apostrophe.

#### CONFUSIONS

[Char]
\bne n’ -> _                                                                   # Incohérence. Double négation.
\b[mts]e [nmst](’|e ) -> _                                                     # Incohérence.
\bd[eu] d’ -> d’                                                               # Incohérence. 

[Word]

#### Articles et prépositions + verbes

__conf__ (d(?:u|es)|s(?:a|es)|t(?:a|es)|m(?:on|a|es)|ce(?:s|t|tte)|quelques|avec|aux?(?:dites?|)) +(\w[\w-]+)
    <- morph(\2, "po:v.* po:(?:infi|[123](?:sg|pl))") and \2[0].islower()
    -2> _                                                                                                     # Incohérence avec « \1 » : « \2 » est un verbe.

__conf__  [st]on (\w[\w-]+)
    <- morph(\1, "po:v.* po:(?:infi|[123](?:sg|pl))") and \1[0].islower() and not word(-1)
    -1> _                                                                                                     # Incohérence : « \1 » est un verbe.

__conf__  de l[ea] (\w[\w-]+)
    <- morphex(\1, "po:[1-3](?:sg|pl)", "po:(?:nom|adj)")
    -1> _                                                                                                     # Incohérence : « \1 » est un verbe.

__conf__  (?<!’)un (\w[\w-]+) <- morph(\1, "po:(?:infi|[123](?:sg|pl))") and not before("(?i)(dont|sauf) +$") -1> _     # Incohérence : « \1 » est un verbe.

__conf__  (?:d(?:e|ès)|par) (\w[\w’-]+)
    <- morph(\1, "po:v.* po:[123](?:sg|pl)") and \1[0].islower()
    -1> _                                                                                                     # Incohérence : « \1 » est un verbe conjugué.

__conf__  après (?![jcç]’)(\w[\w’-]+)
    <- morph(\1, "po:v.* po:[123](?:sg|pl)") and \1[0].islower()
    -1> _                                                                                                     # Incohérence : « \1 » est un verbe conjugué.

__conf__  (de le) (\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:(?:mas|epi)", "po:(?:infi|mg)") and \2[0].islower()
    -1> du                                                                       # Incohérence : « \2 » est un nom ou un adjectif.

#### Participes présents

__conf__  [nmts]e (\w+ant) <- not morph(\1, "po:ppre", False) -1> _                         # Incohérence : « \1 » n’est pas un participe présent.
__conf__  (?:[nv]ous|lui) (\w+ant) <- morph(\1, "po:(?:nom|adj)") -1> _                     # Incohérence : « \1 » n’est pas un participe présent.


#### Pronoms

__conf__  ([nmts](?:e|’(?:en|y))) (\w[\w’-]+)
    <- morph(\2, "po:(?:nom|adj)")
    -2> _                                                                      # Incohérence avec « \1 » : « \2 » devrait être un verbe.



# incohérences
[Word]

__conf__  très +(bien|\w+ent) +(\w\w+)
    <- morph(\1, "po:adv", "po:(?:3pl|mg)") and morphex(\2, "po:(?:[123](?:sg|pl))", "po:(?:mg|adj|ppas|adv)")
    -1> _                                                                        # Incohérence avec « très » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.
  
__conf__  très +(?!envie)(\w\w+)
    <- morphex(\1, "po:(?:infi|[123](?:sg|pl))", "po:(?:mg|adj|ppas|adv)")
    -1> _                                                                        # Incohérence avec « très » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

__conf__  (?:presque|trop) +(\w\w+)
    <- morphex(\1, "po:(?:[123](?:sg|pl))", "po:(?:mg|nom|adj|ppas|adv|prn|patr)")
    -1> _                                                                        # Incohérence : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

__conf__  si +(\w\w+)
    <- morphex(\1, "po:(?:[123](?:sg|pl))", "po:(?:mg|nom|adj|ppas|adv|prn|patr|titr)")
    -1> _                                                                        # Incohérence avec « si » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

__conf__  de plus en plus +(\w\w+)
    <- morphex(\1, "po:(?:infi|[123](?:sg|pl))", "po:(?:mg|adj|ppas|adv)") and not morph(word(-1), "po:v[123].* po:[123](?:sg|pl)", False, False)
    -1> _                                                                        # Incohérence avec « de plus en plus » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.


# a / à
__conf__  grâce (a) <- morph(word(-1), "po:(?:v|nom)", False, True) -1> à                       # Confusion probable.
__conf__  (a) moins que <- not word(-1) -1> à moins que                                         # Confusion probable : « à moins que » pour dire « sauf si ».
__conf__  tout a co[uû][pt]? -> tout à coup                                                     # Confusion.
__conf__  a coup s[uû]r -> à coup sûr                                                           # Confusion.
__conf__  face (a) <- not re.match("(?i)([lmts]a|leur|une)", word(-1)) -1> à                    # Confusion.
__conf__  pas (a) pas -> à                                                                      # Confusion.
__conf__  ([seéê]\w+) (a)(?! priori| posteriori)
    <- stem(\1) == [u"être"]
    -2> à                                                                                       # Confusion. Utilisez la préposition « à ».
__conf__  (a peu[tx]? (?:près|prés?|prêts?)|à peu[tx] (?:près|prés?|prêts?)|à peu (?:prés?|prêts?))
    -> à peu près                                                                                          # Confusion.
__conf__  ne +l(?:es?|a) +(?:l(?:eur|ui) +|)(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  ne +[nv]ous +(?:les +|l’|)(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  [mtsn]e l(?:es +|’)(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  [mtsnl]’(?:en|y) +(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  les (?:en|y) +(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  [nv]ous +(?:en +|y +|les +|l’)(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  (il|on) +(?:l(?:es +|’)|en +|y +(?:en +|)|[vn]ous +|)(à)
    <- not morph(word(-1), "po:3sg", False, False)
    -2> a                                            # Confusion probable : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  elle +(?:l(?:es +|’)|en +|y +(?:en |)|[vn]ous +|)(à)
    <- not morph(word(-1), "po:(?:3sg|prep)", False, False) and not morph(word(1), "po:properobj", False)
    -1> a                                            # Confusion probable : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  qui (?:l(?:ui|eur)(?: en|)|nous|vous|en|y) +(à)
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  qui (à) +(\w[\w-]+)
    <- morphex(\2, "po:ppas", "po:(?:prn|patr|npr)")
    -1> a                                            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  (à le) (\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj)", "po:infi")
    -1> a le|au                                      # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.
__conf__  (à les) (\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj)", "po:infi")
    -1> a les|aux                                    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : Elle _a_ donné du travail _aux_ employés _à_ profusion.
__conf__  (a) (?:nouveau|présent|(?:bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|l’(?:arrière|autre bout|écart|égard|extérieur|aune|avant|encontre|ins(?:u|tar)|intérieur|opposé)|la (?:portée|suite)|partir|portée|propos|rebours) d(?:es?|u))
    -1> à                                            # Confusion. Utilisez la préposition “à”.
__conf__  (à) aux?(?! (moins|plus)) -1> a            # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__conf__  (a) (?:base|cause) d(?:es?|u) <- not before(r"(?i)\bce que?\b") -1> *
__conf__  (à) +(?:faim|peur|honte|soif) -1> a        # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez : 
__conf__  (a) part (\w+) <- morph(\2, "po:(?:prn|patr|det|properobj)") -1> à                                  # Confusion probable.
__conf__  (à) +(?:a(?:fin|lors|près|uprès|ux?|vant|vec)|au-de(?:dans|hors|là|sso?us|vant)|chez|d(?:ans|evant|ès|déjà|onc|urant)|lorsque?|malgré|par(?:ce|fois|mi|)|p(?:endant|our|uisque)|que?|sur|tandis)
    -1> a                                                                        # Confusion probable : “à” est une préposition. Écrivez “a” pour la conjugaison de “avoir”.
__conf__  (à) +(\w\w+)
    <- morph(\2, "po:[123](?:sg|pl)", True)
    -> _                                                                         # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.
[word]
__conf__  (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme)|de nombreuses reprises|des kilomètres à la ronde|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|feu et à sang|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles réguliers|juste (?:raison|titre)|long terme|longueur (?:de (?:temps|journée)|d’année)|main (?:armée|droite|gauche|levée)|maints égards|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen terme|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir))
    <- not before(u"(?i)[ln]’$|(?<!-)\\b(?:il|elle|on|y|n’en) +$")
    -1> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__conf__  (a) (?:confesse|mi(?:di|nuit)|r(?:allonge|eculons|enverse|isque)|tâtons|la (?:manque|ramasse|re(?:dresse|nverse)))
    <- not before(u"(?i)(\\bque?\\b|[ln]’$|(?<!-)\\b(?:il|elle|on|y|n’en) +$)")
    -1> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__conf__  (a) (?:[mts](?:es|on|a)|[nv]o(?:s|tre)|leurs?) (?:avis|c(?:onnaissance|ôtés)|c(?:œur|orps) défendant|dé(?:pens|triment)|disposition|encontre|égard|grand(?: désarroi|e (?:surprise|tristesse))|guise|insu|portée|risques et périls|sujet|tour)
    <- not before(u"(?i)(\\bque?\\b|[ln]’$|(?<!-)\\b(?:il|elle|on|y|n’en) +$)")
    -1> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__conf__  (a) (\w[\w-]+(?:er|re|ir))
    <- morph(\2, "po:infi", False) and not before(u"(?i)\\b(que?)\\b|(?:il|elle|on|n’(?:en|y)) +$") 
    -1> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
[Word]

# au temps / autant
__conf__  autant pour moi <- not word(-1) -> au temps pour moi                                              # Pour reconnaître son erreur, « au temps pour moi » est l’expression recommandée par l’Académie française.
__conf__  au (?:temps|tant) que faire [sc]e peu[xt]? -> autant que faire se peut                            # Locution adverbiale : « autant que faire se peut ».


# ça / çà / sa
__conf__  comme (sa) <- (not word(1) or re.match("(?i)que?", word(1))) -1> ça               # Confusion.
__conf__  (sa) +(\w[\w-]+) <- morphex(\2, "po:mg", u"(?:st:(tr(?:ès|op)|peu|bien)\\b|po:(?:nom|adj).* is:fem)")
    -1> ça                                                                                  # Confusion. « sa » (sa maison, sa voiture) ≠ « ça » (ça vient, ça heurte).
__conf__  (sa) +(?:d|l(?:orsqu|)|n|s|m|t|j|qu|puisqu)’\w+
    -1> ça                                                                                  # Confusion. « sa » (sa maison, sa voiture) ≠ « ça » (ça vient, ça heurte).
__conf__  (ça) (\w\w+) <- morph(\2, "po:(?:nom|adj).* is:fem") and not re.match("seule?s?", \2)
    -1> sa                                                                                  # Confusion. « sa » (sa maison, sa voiture) ≠ « ça » (ça vient, ça heurte).
__conf__  çà(?! et là) <- not re.match("(?i)(?:oh|ah)$", word(-1))
    -> ça                      # Confusion : « çà » ne s’emploie plus guère que dans l’expression « çà et là ».
__conf__  ça et là <- not morph(word(-1), "po:prep") -> çà et là                            # Confusion : « ça » équivaut à « cela ». Dans l’expression « çà et là », « çà » équivaut à « ici ».

# ce / se
__conf__  (se) (\w+) <- morphex(\2, "po:(?:nom|adj)", "po:([123](?:sg|pl)|infi|pp)|st:la")
    -1> ce                                                                                  # Confusion. « se » (se lever, se demander) ≠ « ce » (ce chien, ce chat).
__conf__  (ce) (\w+(?:er|ir|re)) <- morph(\2, "is:infi")  and \1 != "CE" -1> se             # Confusion. « se » (se lever, se demander) ≠ « ce » (ce chien, ce chat).
__conf__  pour (se) faire(,? (\w+))
    <- (\2.startswith(",") or morphex(\3, ":mg", "po:adj"))
    -1> ce                                                                                  # Confusion. Dans cette locution, il faut employer “ce”.|http://fr.wiktionary.org/wiki/pour_ce_faire
__conf__  (ce) (?!faire)(\w[\w-]+)
    <- morph(\2, "po:v[123].* po:(?:infi|[123](?:sg|pl))") and not stemchk(\2, "^(?:devoir|pouvoir)$") and \2[0].islower() and \1 != "CE"
    -1> se                                                                                                    # Confusion : « \2 » est un verbe. Exemples : ce bâtiment, se perdre.
__conf__  ne (ce) -1> se                                                                    # Confusion. Ce chien, ce chat… Se demander, se croire…
[Char]
__conf__  \bne (c’) -1> s’                                                                  # Confusion. Ce chien, ce chat… Se demander, se croire…
[Word]
__conf__  (se) (?:qu[ei]?|dont|malgré|pourquoi) -1> ce                          # Confusion.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=2440
__conf__  qui (ce) (\w[\w-]+)
    <- morph(\2, "po:v", "po:(?:nom|adj).* is:(?:mas|epi)")
    -1> se                                                                      # Confusion probable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=2440
__conf__  (se) (?:sera(?:i(?:en|)t|)|sont|fu(?:ren|)t)
    <- morph(word(-1), "po:cjsub", False, True) and not before(", +$") and not after(r"^ +(?:ils?|elles?)\b")
    -1> ce                                                                      # Confusion probable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=2440
__conf__  (ceux) (?:ne|sont|n’(?:est|était)) -1> ce                             # Confusion.|http://www.intellego.fr/soutien-scolaire-6eme/aide-scolaire-francais/ce-ceux-ou-se/3829
__conf__  (ceux) (?!l[aà] |qu[ie]? )(\w[\w-]+) <- morphex(\2, "po:nom.* is:sg", "po:adj.* is:(?:pl|inv)")
    -1> ce                                                                      # Confusion probable.|http://www.intellego.fr/soutien-scolaire-6eme/aide-scolaire-francais/ce-ceux-ou-se/3829

# d’en / dans
(d’en|dan) (?:l(?:es?|a)|une?|d(?:es?|u)|[mts](?:on|a|es)|[nv]o(?:tro|s)|ce(?:tte|t|s|))
    <- \1.endswith("en") or before("^ *$") -1> dans                              # Confusion. Utilisez “dans” pour dire “à l’intérieur de quelque chose”.
^ *(dents?) (?:l(?:es?|a)|une?|[mts](?:on|a|es)|[nv]o(?:tro|s)|ce(?:tte|t|s|))
    -1> dans                                                                     # Confusion. Utilisez “dans” pour dire “à l’intérieur de quelque chose”.

# eh bien, hé bien / et bien
__conf__  et bien(?! que?| sûr| d’autres | entendu| avant| souvent| longtemps| des)
    <- not word(-1)
    -> eh bien|hé bien                                                           # Confusion probable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=h%C3%A9&T3.x=0&T3.y=0
__conf__  et (ben)
    <- not \1.startswith("B")
    -> eh ben|hé ben                                                             # Confusion probable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=h%C3%A9&T3.x=0&T3.y=0

# haut delà / au-delà
__conf__  haut[- ]del[àa] -> au-delà                                             # Confusion. 

# là / la
__conf__  (la) (?:a(?:fin|lors|près|uprès|ux?|vant|vec)|au(?:-de(?:dans|hors|là|sso?us|vant)|x|)|c(?:e(?:t|te|s|)|hez)|d(?:ans|evant|es?|ès|onc|urant|’\w[\w-]*)|e(?:lles?|n|t)|ils?|je?|l(?:es?|a|orsque?|’\w[\w-]*)|m(?:algré|es|on|a)|n(?:e|ous)|o[uùn]|par(?:ce|fois|mi|)|p(?:endant|our|uisque)|que?|s(?:on|a|es|ouvent|ur)|t(?:andis|on|a|es|u)|un|vous)
    <- not morph(word(-1), "po:impe", False, False) and not before(r"(?<!-)\ble +$")
    -1> là                                                                       # Confusion probable. Écrivez “là” si vous voulez dire “ici”.

# leurs / leur
__conf__  (leurs) (\w[\w-]+)
    <- morphex(\2, "po:(?:[123](?:sg|pl)|infi)", "po:(?:mg|nom|adj|prn|patr|npr)") and not before(r"(?i)\bles *$")
    -1> leur                                                                     # Incohérence : “leurs” est un déterminant. “\2” est un verbe.

# min / mins
__conf__ \d+ (mins) -1> min                                                      # Les unités de mesure abrégées ne prennent pas la marque du pluriel.

# on / ont
__conf__  (?<!’)(on) (\w[\w-])
    <- morph(\2, "po:adv", False) and not morph(word(-1), "po:v.* po:3sg", False, False)
    -1> ont                                                                      # Confusion probable : “avoir” à la 3e personne du pluriel du présent s’écrit “ont”.

# pale / pâle
__conf__  (bien|tr(?:ès|op)|si|vraiment|tellement) +(pales?)
    -2> =\2.replace("pal", u"pâl")      # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale
__conf__  (pales?) +(?:imitat(?:ion|eur|rice)|rayon)s?
    -1> =\1.replace("pal", u"pâl")            # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale

# peu / peut / peut-être
__conf__  (?<![dDuUnN][eEnN] )(peu) (?:pas|donc|jamais|rien|parfois|alors|enfin|rarement|éventuellement) -1> peut       # Confusion probable.
__conf__  ^ *(il|ce|cela|ceci) (peut-être) -2> peut être                                                                # Confusion probable : « peut-être » signifie « possiblement ». 
__conf__  [ns]e (peu) -1> peut                                                                                          # Confusion. Exemples : Il est peu habile, mais il peut y arriver. 

# qu’elle / quelle
__conf__  (qu elles?) +(?!seule?s?)(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj)", "po:(?:mg|[123](?:sg|pl)|adv)")
    -1> =\1.replace(" ", "")                                                   # Confusion probable. Ex : Quelle femme ! Je crois qu’elle réussira. 

# savoir / ignorer
__conf__  ([êeésf]\w+) pas sans (ignor(?:e[rz]|ée?s?))
    <- morph(\1, ":v0e", False)
    -2> savoir                                                                 # Confusion : vous écrivez l’inverse de ce que vous voulez dire.|http://fr.wiktionary.org/wiki/vous_n%E2%80%99%C3%AAtes_pas_sans_savoir

# s’en / sens / sans / cent / cens

__conf__  (ils?|on) (sans|cen[st]|c’en) (\w[\w-]+)
    <- not word(-1) and morph(\3, "po:v", False)
    -2> s’en                                                                   # Confusion probable.
__conf__  elles? (sans|cen[st]|c’en) (\w[\w-]+)
    <- not word(-1) and morph(\2, "po:v", False)
    and not ( \1 == "sans" and morph(\2, "po:(?:nom|infi)", False) )
    -1> s’en                                                                   # Confusion probable.

#### SGPL

# plus que prévu / mois que prévu
__sgpl__  (plus|moins|autant) +que (prévu(?:es?|s)) -2> prévu                                   # Invariable. Implicitement, \1 que ce qui était prévu.
__sgpl__  (plus|moins|aussi) +(\w[\w-]+) +que (prévu(?:es?|s)) -3> prévu                        # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__sgpl__  (plus|moins|autant) +((?:de |d’)(?:\w[\w-]+)) +que (prévu(?:es?|s)) -3> prévu         # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__sgpl__  comme ((annoncé|convenu|prévu)(?:es?|s)) -1> \2                                       # Invariable. Implicitement, comme ce qui était \2.


#### TOUT / TOUS / TOUTE / TOUTES

__gn__  tout(?= [cl]es\b) <- not re.match(u"(?iu)(d[eu]|avant|après|sur|malgré)$", word(-1))
    -> tous                                                                    # Erreur d’accord probable.
__gn__  tout(?= ceux\b) <- not re.match(u"(?iu)(d[eu]|avant|après|sur|malgré)$", word(-1))
    -> tous                                                                    # Erreur d’accord probable.
__gn__  toute(?= (celles|[cl]es)\b) -> toutes                                   # Erreur d’accord probable.
__gn__  toute(?= (ce|cet)\b) -> tout                                            # Erreur d’accord probable.

__gn__  (tous) +(?:[lcmts]es) +(\w[\w-]+) <- morph(\2, "is:fem") and not re.match(u"(?iu)(à|pas|de|[nv]ous|eux)$", word(-1))
    -1> toutes                                                                 # Erreur d’accord probable. « \2 » est féminin.
__gn__  (toutes) +(?:[lcmts]es) +(\w[\w-]+) <- morph(\2, "is:mas") and not re.match(u"(?iu)(à|pas|de|[nv]ous|eux)$", word(-1))
    -1> tous                                                                   # Erreur d’accord probable. « \2 » est masculin.

__gn__  tout (\w\w\w+)
    <- morphex(\1, "po:nom.* is:(?:fem|pl)", "(?:po:(?:ad[jv]|mg|prn|patr|npr|infi)|is:(?:mas|epi) is:inv)") and morph(word(-1), "(?:po:prep|st:de)", False, True)
    -1> =suggMasSing(@)                                                        # “\1” devrait être au masculin singulier.

__gn__  toute (\w\w\w+)
    <- morph(\1, "po:(?:nom|adj).* is:(?:mas|pl)") and morph(word(-1), "(?:po:prep|st:de)", False, True)
    -1> =suggFemSing(@)                                                        # “\1” devrait être au féminin singulier.

__gn__  tous (\w\w\w+)
    <- morph(\1, "po:(?:nom|adj).* is:(?:fem|sg)") and morph(word(-1), "(?:po:prep|st:de)", False, True)
    -1> =suggMasPlur(@)                                                        # “\1” devrait être au masculin pluriel.

__gn__  toutes (\w\w\w+)
    <- morph(\1, "po:(?:nom|adj).* is:(?:mas|sg)") and morph(word(-1), "(?:po:prep|st:de)", False, True)
    -1> =suggFemPlur(@)                                                        # “\1” devrait être au féminin pluriel.


#### VERBES ET NÉGATION

__neg__  (je|tu|ils?|on|elles?) ([bcdfgjklmnpqrstvwxz][\w-]*) (pas|rien|jamais|guère)
    <- morph(\2, "po:[123](?:sg|pl)", False) and not (re.match("(?i)(?:jamais|rien)", \3) and before("\\b(?:que?|plus|moins)\\b"))
    -2> ne \2                                                                  # Ne … \3 : il manque l’adverbe de négation.

__neg__  (je|tu|ils?|on|elles?) ([aeéiouœ][\w-]*) (pas|rien|jamais|guère)
    <- morph(\2, "po:[123](?:sg|pl)", False) and not (re.match("(?i)(?:jamais|rien)", \3) and before("\\b(?:que?|plus|moins)\\b"))
    -2> n’\2                                                                   # Ne … \3 : il manque l’adverbe de négation.

__neg__  (je|tu|ils?|on|elles?) ([mts](?:e +|’)|[vn]ous +|l(?:e +|a +|eur +|ui +|l’))(\w[\w-]*) (pas|rien|jamais|guère)
    <- morph(\3, "po:[123](?:sg|pl)", False) and not (re.match("(?i)(?:jamais|rien)", \3) and before("\\b(?:que?|plus|moins)\\b"))
    -2> ne \2                                                                  # Ne … \4 : il manque l’adverbe de négation.

__neg__  (je|tu|ils?|on|elles?) (y|en) (\w[\w-]*) (pas|rien|jamais|guère)
    <- morph(\3, "po:[123](?:sg|pl)", False) and not (re.match("(?i)(?:jamais|rien)", \3) and before("\\b(?:que?|plus|moins)\\b"))
    -2> n’\2                                                                   # Ne … \4 : il manque l’adverbe de négation.


## INFINITIF

__infi__  ne (?:pas|rien|jamais(?: rien| plus|)|plus(?: jamais| rien|)) (?:l(?:e(?:ur|s|)|a|ui) |nous |vous |)((\w[\w’-]+)(ée?s?|ez))
    <- morph(\1, "po:v", False)
    -1> \2er                                                                                               # Le verbe devrait être à l’infinitif.


################################################################################################################################################################
################################################################################################################################################################
## PASSE 2
################################################################################################################################################################
################################################################################################################################################################
[++]


#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
# épuration des adverbes, locutions adverbiales, interjections et expressions usuelles
#
[pp]

[word]
(?:[dD]epuis le|[lL]e|[dD]u|[aA]u|[jJ]usqu au|[àÀ] compter du) (?:1(?:er|ᵉʳ)|\d\d?) (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)(?: \d+| dernier|) -> *
([eE]n (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor) +\d+) (\w+) <- not morph(\2, "po:(?:nom|adj)", False) -1> *
[àÀ] la mi-(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor) -> *


[Word]

## moi/toi/lui/elle/nous/vous/eux/elles seul-e-s
[mt]oi (seule?) -1> *
lui (seul) -1> *
elle (seule) -1> *
[nv]ous (seule?s) -1> *
eux (seuls) -1> *
elles (seules) -1> *

## Avant
et (?:ainsi de suite|tutti quanti) -> *
et(/ou) -1> *
ni (?:à|avec|contre|pour|chez|sur|sous|devant|derrière) *(?:[tm]oi|lui|elles?|eux|[nv]ous|),? ni (?:à|avec|contre|pour|chez|sur|sous|devant|derrière) (?:[mt]oi|lui|elles?|eux|[nv]ous) -> *
quant à présent -> *

## Inconditionnel
24 ?h(?:eures|) ?(?:sur |/ ?)24 -> *
7 ?j(?:ours|) ?(?:sur |/ ?)7 -> *
sept jours sur sept -> *
vingt-quatre heures sur vingt-quatre -> *
^ *(?:et(?: puis|)|puis|car|mais|or donc|m’est avis que) -> *
à (?:califourchon|confesse|contre(?:cœur|temps)|demi-mot|foison|grand-peine|loisir|merveille|moitié|nouveau|outrance|peine|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|tâtons|tort|tout-va) -> *
à côté (?:de (?:ça|lui|[mt]oi|[nv]ous)|d’(?:elles|eux))(?! et) -> *
à la (?:bo(?:nne franquette|urre)|con|dér(?:ive|obée)|diable|fois|limite du supportable|longue|lumière de tout ce(?:ci|la)|manque|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|ramasse|re(?:nverse|dresse|scousse)|sauvette|surprise générale|virgule près|volée) -> *
à \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi)|)|) -> *
à (?:au(?:cun prix|trui|tre chose)|bas (?:co[ûu]t|prix)|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|pire|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|but (?:non |)lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit)|occasion)|chaque (?:fois|instant)|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme)|de (?:nombreuses|multiples) reprises|des kilomètres à la ronde|défaut d’autre chose|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|feu et à sang|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles réguliers|juste (?:raison|titre)|long terme|longueur (?:de (?:temps|journée)|d’année)|main (?:armée|droite|gauche|levée)|maints égards|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|mots couverts|moyen terme|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de (?:distance|choses près|frais)|près)|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque(?: distance|s (?:exceptions|nuances) près)|ras bords?|rude épreuve|somme nulle|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|expérimental|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) -> *
à partir (?:de (?:demain(?: matin| midi| soir|)|là|maintenant|rien)|d’(?:aujourd’hui|hier(?: matin| midi| soir|)|ici)) -> *
à quelques-un(?:s d’entre eux|es d’entre elles) -> *
à tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure(?: d(?:u jour|e la nuit)|)|vitesse|volée)) -> *
à l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|occasion|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs))) -> *
à (?:[mts]es|[nv]os|leurs) (?:côtés|dépens|risques et périls|trousses) -> *
à (?:[mts]a|[nv]otre|leur) (?:connaissance|disposition|grande (?:surprise|tristesse)|guise|portée) -> *
à (?:[mts]on|[nv]otre|leur) (?:avis|c(?:œur|orps) défendant|détriment|encontre|égard|grand désarroi|insu|sujet|tour) -> *
à mi(?:di|nuit)(?: pile|) -> *
à cette heure(?: (?:du jour|de la nuit|tardive)|) -> *
[aà] (?:priori|post[eé]riori|contrario|cappella) -> *
ab (?:absurdo|initio) -> *
ad (?:hoc|vitam æternam|nauseam|hominem|infinitum|nauseam|valorem|patres) -> *
advienne que pourra -> *
après (?:[mts]oi|lui|eux|mûre réflexion|tout,|un certain temps|cette date(?: fatidique|)) -> *
(heure|minute|seconde|jour|nuit|semaine|trimestre|semestre|mois|décennie|année|siècle|génération) après \1 -> *
au-de(?:ssus (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:eux|elles?))|là du descriptible) -> *
au (?:[xXvViI]+[eᵉ] siècle|bas mot|beau fixe|bon moment|bout (?:du (?:compte|rouleau)|d’un moment)|cas par cas|commencement|contraire|coude à coude|coup par coup|déb(?:otté|but)|demeurant|doigt mouillé|fil (?:des ans|du temps)|grand complet|hasard|jour (?:et à l’heure dits|le jour)|jugé|lieu de (?:ce(?:la|ci)|ça)|loin|même titre que n’importe l(?:aquelle|equel) d’entre (?:nous|vous|eux|elles)|milieu de nulle part|moment opportun|pas de (?:charge|course)|plus (?:haut point|pressé|vite|tôt|tard)|premier abord|préalable|propre comme au figuré|quotidien|ras des pâquerettes|sens (?:figuré|large|propre)|surplus) -> *
au (?:dernier|même|bon|mauvais) (?:moment|instant) -> *
au cours des (?:deux|trois|quatre|cinq|six|sept|huit|neux|dix|onze|douze|treize|quatorze|quinze|seize|dix-(?:sept|huit|neuf)|vingt|trente|quarante|cinquante|soixante|soixante-dix|quatre-vingt|quatre-vingt-dix|cent) (?:derni(?:ère|er)s|prochaine?s) (?:années|mois|siècles) -> *
(?:tout |)au fond (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:elles?|eux))(?:-mêmes?|) -> *
aux abois -> *
autant que (?:nécessaire|possible|faire se peut) -> *
autour (?:d’(?:eux|elles?)|de (?:lui|[nv]ous|[mt]oi)) -> *
autrement dit -> *
av. J.-C. -> *
avant (?:longtemps|terme|tout le monde|toute(?: chose|s choses)|d’aller plus loin|J.-C.|Jésus-Christ|d’en arriver là|de faire quoi que ce soit(?: de stupide|)|qu il ne soit trop tard) -> *
avec (?:joie|légèreté|insistance|peine|autre chose|pertes et fracas|un peu de chance|tout le respect que (?:je (?:vous|te|l(?:eur|ui)) dois|nous (?:vous|te|l(?:eur|ui)) devons)|tout un chacun) -> *
avec (?:autrui|[mts]oi|lui|e(?:ux|lles?)|[nv]ous|le plus grand soin|tout le monde|tout ça|on ne sait quo?i)(?! qui) -> *
avec brio -> *
beaucoup (?:plus|moins) -> *
bel et bien -> *
bien (?:assez tôt|des fois|souvent) -> *
bon gré,? mal gré -> *
bras dessus,? bras dessous -> *
çà et là -> *
ce faisant -> *
ce(?:ci mis à part|la va sans dire) -> *
ces derniers temps -> *
ce(?:lui|lles?|ux) (d’entre (?:[nv]ous|eux|elles)) -1> *
cette fois-(?:là|ci) -> *
chacune? (d’entre (?:[nv]ous|eux|elles)) -1> *
chez (?:[mt]oi|lui|e(?:ux|lles?)|[nv]ous|autrui|on ne sait qui) -> *
comme (?:avant|autrefois|d’habitude|toujours|de juste|bon (?:me|te|l(?:ui|eur)|[nv]ous) semble|au bon vieux temps|cul et chemise|frappée?s? par la foudre|n’importe où(?: ailleurs|)|par (?:enchantement|magie)|promis|si de rien n’était|tout un chacun) -> *
comme tant d’autres (?:avant|après) (?:[mts]oi|lui|[nv]ous|eux|elles?)(?! qui) -> *
contrairement aux apparences -> *
contre (?:mauvaise fortune,? bon cœur|nature|toute (?:attente|vraisemblance)|vents et marées|[mts]oi|lui|elles?|[nv]ous|eux|(?:[mts]on|[nv]otre|leur) gré) -> *
côte à côte -> *
co[ûu]te que co[ûu]te -> *
cro(?:yez|ois)-le ou (?:non|pas) -> *
cul par-dessus tête -> *
dans (?:ce cas(?: précis|-là|-ci|)|l’i(?:déal|mmédiat)|la mesure du possible|les années \d\d+|peu de temps|tout (?:ce(?:la|ci)|ça)|très peu de temps|un(?: cas comme dans l’autre|e (?:certaine|large) mesure)) -> *
début (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d\d\d|) -> *
d’(abord|affilée|ailleurs|année en année|aujourd’hui|antan|autant (?:plus|moins)|autre(?:s fois| part)|arrière en avant|avant en arrière|à côté|âge mûr|emblée|en face|entr(?:e (?:[nv]ous|eux|elles)|ée de jeu)|est en ouest|extrême[ -](?:droite|gauche)|habitude|hier(?: (?:matin|soir|après-midi)|)|ici(?: là| peu(?: de temps|)| très peu(?: de temps|)|)|ordinaire|origine (?:inconnue|douteuse)|ouest en est|ore?s et déjà|un (?:bout à|côté comme de) l’autre|un autre côté) -> *
d’une (?:autre trempe|(?:façon|manière) ou d’une autre|certaine (?:façon|manière)|tout autre ampleur|(?:minute|seconde) à l’autre) -> *
d’(?:heure en heure|année en année) -> *
d’où qu (?:(?:il|elle|on) vienne|(?:ils|elles) viennent) -> *
de-ci,? de-là -> *
de \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi)|)|) -> *
de (?:\d+(?:,\d+|) ?%|cesse|conserve|facto|guingois|nouveau|permanence|partout|rechange|routine|surcro[îi]t|visu|A à Z|bas(?: (?:en haut|étage)|se (?:condition|extraction|))|bon (?:aloi|cœur|gré|matin|ton)|bonne (?:facture|foi|heure|humeur|grâce|qualité)|bric et de broc|but en blanc|ce(?: (?:fait(?: même|)|point de vue)|tte sorte)|courte (?:durée|vue)|dernière minute|demain(?: (?:matin|soir|après-midi)|)|droite à gauche|fil en aiguille|fond en comble|fort (?:loin|près)|fra[iî]che date|ga[îi]e?té de cœur|gauche à droite|grande (?:taille|envergure)|gré ou de force|guerre lasse|haut(?: (?:en bas|rang|vol)|e (?:stature|volée))|jour comme de nuit|là-bas|la (?:meilleure (?:manière|façon) possible|même (?:façon|manière)|sorte|tête aux pieds|veille)|loin(?: en loin|)|longue (?:date|durée|haleine)|main de ma[îi]tre|mauvais(?: (?:aloi|gré)|e (?:foi|grâce|humeur))|nos jours|plein (?:droit|fouet)|mieux en mieux|nature (?:inconnue|indéterminée|insolite)|nombreuses (?:fois|années plus (?:tôt|tard))|nos jours|notoriété publique|nulle part|pire en pire|près(?: ou de loin|)|par(?: le monde(?: entier|)|t et d’autre)|petite taille|pied ferme|premi(?:er (?:ordre|plan)|ère main)|plein fouet|plus (?:belle|près)|première nécessité|prime abord|proche en proche|sang-froid|seconde (?:zone|importance|main)|si bon(?: matin|ne heure)|source sûre|taille moyenne|telle sorte|temps (?:en temps|à autre)|tr(?:ès|op) (?:loin|près)|vive voix) -> *
de tou(?:t (?:poil|temps|à l’heure|premier (?:ordre|plan))|tes (?:parts|pièces|sortes|(?:[mts]es|leurs|[nv]os) forces)|te (?:éternité|évidence|façon|urgence)|s (?:côtés|bords)) -> *
de (?:(ceux|celles)-(?:ci|là))(?! qui) -> *
de (?:[mts]on|[nv]otre|leur) (?:mieux|plein gré|point de vue|propre (?:cru|chef)|vivant) -> *
de (moins|plus|mieux|pire|jour|minute|semaine|mois|trimestre|semestre|siècle|millénaire|décennie) en \1 -> *
^ *de plus -> *
de (?:ce(?:ux|lles?|lui)-(?:là|ci)|(?:[mts]a|[nv]otre|leur) part) -> *
dès (?:aujourd’hui|à présent|demain(?: matin| après-midi| soir|)|lors|que possible|\d\d\d\d) -> *
des (?:fois|pieds à la tête|uns et des autres|(?:années|mois|siècles|millénaires|décennies|semaines) plus t(?:ôt|ard)) -> *
depuis (?:assez longtemps|belle lurette|bien longtemps|de (?:très |)longues années|des lustres|longtemps|lors|peu de temps|quelque temps|quelques (?:secondes|minutes|heures|jours|semaines|mois|trimestres|semestres|années|décennies|siècles|millénaires)|si longtemps|toujours|tout ce temps|très longtemps) -> *
depuis (\d+ (?:ans|années|mois|semaines|jours|heures|minutes|secondes|)|les années \d\d+) -> *
du moins -> _
du (?:[xXvViI]+[eᵉ] siècle|bout des lèvres|début à la fin|fond du cœur|jour au lendemain|haut en bas|même (?:acabit|tonneau)|moins,? pas|(?:nord|sud) au (?:nord|sud)|tout au tout) -> *
(après-|avant |)demain(?: matin| soir| après-midi|) -> *
(don) Juan -1> *
du (?:coup|même (?:ordre|coup)) -> *
en \d\d+(?: ans| années|) -> *
en cours(?! de| d) -> *
en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|douce|effet|émoi|filigrane|général|goguette|hâte|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|trompe-l’œil|vain|vérité|ville|vitesse) -> *
en (?:[mt]oi|eux|elles?) -> *
en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas de (?:besoin|doute)|chair et en os|chute libre|connaissance de cause|cours de route|d’autres termes|début d(:?e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de marche|d’ébriété(?: avancée|))|fin d(:?e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(:?e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: jour|e (?:gueule|figure|forme|nuit))|perte de vitesse|peu de temps|plein air|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|y réfléchissant bien) -> *
en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier -> *
en (?:[mts]on|leur|[nv]otre) (?:âme et conscience|for intérieur) -> *
en ce(?: (?:moment|temps-là|qui (?:[mt]e|l(?:es?|a)|[nv]ous) concern(?:e|ait))|t instant) -> *
encore (?:une fois|et (?:encore|toujours)) -> *
envers (?:autrui|et contre tout|les uns et les autres|tout le monde) -> *
entre (?:(?:[mt]oi|lui|elles?|[nv]ous|eux) et (?:[mt]oi|lui|elles?|[nv]ous|eux)|autres choses|de (?:bonnes|mauvaises) mains|l’une? et l’autre|quat(?:re[- ]z-?yeux|’ z-?yeux)) -> *
entre (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre) (?:\d\d{1,3} |)et (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d{1,3}|) -> * 
épaule contre épaule -> *
été comme hiver -> *
(?:oh|ah|euh|eh bien) -> *
ex (?:nihilo|cathedra|absurdo|abrupto) -> *
face à face -> *
(?:deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent) fois de suite -> *
grosso modo -> *
# grand bien lui fasse
(?:avant-|)hier(?: matin| soir| après-midi|) -> *
hors (?:de (?:contrôle|portée)|d’atteinte|du commun) -> *
ici(?: comme ailleurs| ou ailleurs| et (?:là|maintenant)| même|-bas) -> *
id est -> *
il y a (longtemps|peu de temps|très (?:longtemps|peu de temps)|quelques (?:secondes|minutes|heures|jours|semaines|mois|années|siècles|millénaires)|quelque temps) -> *
il n’y a pas si longtemps -> *
illico presto -> *
in (?:abstracto|extenso|extremis|fine|petto|situ|utero|vitro|vivo) -> *
ipso facto -> *
j’en passe et des meilleurs -> *
jour pour jour -> *
jusque-là -> *
jusqu (?:alors|ici|aujourd’hui|au bout des ongles) -> *
jusqu à (?:aujourd’hui|bac ?[+] ?\d\d?|présent|maintenant|(?:demain|hier)(?: matin| soir| après-midi|)|nouvel ordre|plus (?:ample informé|soif)|preuve du contraire|la fin de (?:[mts]es|[nv]os|leurs) jours|(?:[mts]on|leur|[nv]otre) dernier souffle(?: de vie|)|ce que (?:j’en sache|tu en saches|(?:il|elle|on) en sache|nous en sachions|vous en sachiez|(?:ils|elles) en sachent) plus|Noël|Pâques) -> *
la (?:plupart du temps|main dans la main|mort dans l’âme) -> *
le (?:cas échéant|moins (?:du monde|souvent)|plus (?:tôt|tard|souvent|de (?:temps|monde)) possible|plus souvent) -> *
là(?:-bas|-haut|-de(?:dans|hors|rrière|sso?us|vant)| non plus) -> *
l’une? (?:après|pour|de(?:rrière|)|avec|contre|sur|près de) l’autre -> *
le pour et le contre -> nmp
les une?s (?:des |(?:après |pour |avec |contre |sur |derrière |devant |)les) autres -> *
non (?:loin (?:d’ici|de là)|plus|seulement) -> *
loin (?:de (?:là|tout ça)|d’(?:être|ici)|s’en fa(?:ut|llait)) -> *
(?:[lcd]es |)maintes fois -> *
malgré (?:[mt]oi|lui|elles?|[nv]ous|eux)(?! qui) -> *
malgré (?:ça|cela|tout) -> *
manu militari -> *
mieux va(?:u|lai)t tard que jamais -> *
moins que nécessaire -> *
moitié (\w\w+),? moitié (\w\w+) -> *
mot pour mot -> *
mutatis mutandis -> *
ne (?:vous |l(?:ui|eur) |t’)en déplaise -> *
nez à nez -> *
ni (?:de près,? ni de loin|plus ni moins|vu,? ni connu) -> *
non (?:plus|sans raison) -> *
nulle part -> * 
ou (bien) -1> *
ou quelque chose d’approchant -> *
où bon (?:me|te|lui|nous|vous|leur) semble -> *
oui (?:ou|et) non -> *
outre mesure -> *
(une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent|mille|éta[pg]e|morceau|pièce) par \1 -> *
par (?:à-coups|ailleurs|avance|chance|conséquent|curiosité|contre|défaut|endroits|essence|ex(?:cellence|emple)|hasard|ici|inadvertance|là|moments|monts et par vaux|nature|principe|terre) -> *
par (?:la (?:même occasion|suite)|(?:bien des|certains) (?:aspects|côtés)|acquit de conscience|ce biais|égard pour (?:moi|toi|lui|elles?|eux|nous|vous)(?! qui)|beau temps|lui-même|elle(?:-même|)|eux(?:-mêmes|)|elles(?:-mêmes|)|les temps qui courent|[nv]ous-mêmes?|[mt]oi(?:-même|)|tout le monde|voie (?:de conséquence|d’exception)) -> *
par-(?:devant|derrière|dessus (?:le marché|tout)|ci,? par-là) -> *
par-devers (?:moi|toi|lui|elles?|lui|eux|nous|vous) -> *
par (deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent) fois -> *
parmi (?:[nv]ous|eux|elles) -> *
partant de là -> *
pas (?:du tout|à pas|le moins du monde) -> *
pendant (?:ce temps-là|(?:bien |si |assez |)longtemps|plusieurs (?:heures|minutes|secondes|mois|semaines|jours|années|siècles|millénaires|décennies)|quelque temps) -> *
petit à petit -> *
peu (?:à peu|de temps auparavant|ou prou) -> *
pile poil -> *
plein (?:nord|sud|ouest|de fois) -> *
plus avant(?! de | que?) -> *
plus (?:du tout|que (?:jamais|tout(?: au monde|e autre chose))|jamais|bas que terre) -> *
plusieurs fois(?: de suite)? -> *
pour (?:autrui|le (?:moment|moins|meilleur et pour le pire)|une fois|l’instant|l’heure|de bon|la suite|un oui ou pour un non|ainsi dire|ce faire|quelque (?:part|temps)|tout (?:le monde|un chacun)|faire bonne mesure|y parvenir|couronner le tout|ce que (?:(?:j’|tu )en sais)|ça va(?:ut|lait)) -> *
pour (?:[mt]oi|elles?|eux|ça|cela|ceci|ceux-(?:là|ci)|celles?-(?:là|ci))(?! qui) -> *
pour la (?:première|seconde|\w[\w-]+ième|dernière) fois(?: de suite| de ma vie|) -> *
pour (?:[mts]a|[nv]otre|leur) (?:gouverne|part) -> *
pour (?:[mts]on|[nv]otre|leur) propre (?:compte|bien) -> *
quand b(?:ien même|on (?:[mt]e|l(?:ui|eur)|[nv]ous) semble) -> *
quant à (?:[mt]oi|lui|elles?|[nv]ous|eux)(?! qui) -> *
que ça (?:me|te|l(?:ui|eur)|[nv]ous) plaise ou non -> *
que (?:je le veuille|tu le veuilles|vous le vouliez|nous le voulions) ou non -> *
qu (?:à cela ne tienne|(?:(?:il|elle|on) le veuille|(?:ils|elles) le veuillent) ou non) -> *
quel qu en soit le (?:moyen|prix|risque(?: financier|)|danger) -> *
quelle qu en soit la (?:cause|raison) -> *
quelque (?:part|temps) -> *
quelques (?:instants|secondes|minutes|heures|jours|semaines|mois|années|siècles|millénaires|trimestres|semestres) (?:auparavant|plus (?:tard|tôt)) -> *
qui plus est -> *
qui (ce (?:jour|matin|après-midi|soir)-là|cette (?:nuit|matinée|soirée)-là) -1> *
quoi qu il (?:(?:arriv|en co[ûu]t)(?:e|ât)|adv(?:ienne|înt)) -> *
sans (?:ambages|arrêt|au(?:cun doute|tre forme de procès)|cesse|commune mesure|conteste|coup férir|crier gare|dire mot|doute|encombres?|états d’âme|fin|foi,? ni loi|le (?:faire exprès|vouloir)|mot dire|nul doute|queue ni tête|raison apparente|relâche|(?:grand|) succès|trêve|(?:pour autant |)y (?:prendre g(?:arde|o[ûu]t)|faire attention|parvenir|réussir|réfléchir|songer|penser)|faire de vagues|s’en (?:rendre compte|apercevoir)|l’aide de personne) -> *
séance tenante -> *
selon (?:toute vraisemblance|(?:[mt]oi|lui|elles?|eux|nous|vous)(?! qui)) -> *
sembl(?:e-t-il|ait-il) -> *
sens dessus dessous -> *
seule?s? à seule?s? -> *
s’il (?:te|vous) pla[îi]t -> *
si (?:bas|besoin est|haut|longtemps|possible|soudain|(?:cela|ça) ne tenait qu à (?:moi|toi|lui|eux|elles?|nous|vous)) -> *
six pieds sous terre -> *
sine (?:die|qua non) -> *
soi(?:t dit en passant|-disant) -> *
sous (?:bonne (?:escorte|garde)|haute surveillance) -> *
stricto sensu -> *
sur (?:ce,|le (?:(?:long|moyen|court) terme|qui-vive)|la (?:forme comme sur le fond|même longueur d’onde)|(?:leur|[mts]on|[nv]otre) trente[ -]et[ -]un) -> *
tant (?:bien que mal|s’en faut) -> *
tôt ou tard -> *
tour à tour -> *
tous comptes faits -> *
tout (?:à (?:fait|coup|l’heure)|le temps|de (?:même|suite|go)|au plus|aussi bien|simplement|bonnement|compte fait|feu, ? tout flammes?|bien (?:considéré|réfléchi)|du long) -> *
toutes (?:affaires cessantes|choses égales par ailleurs|griffes dehors|proportions gardées) -> *
trait pour trait -> *
très (?:bas|haut) -> *
(une?) à \1 -> *
un (?:à un|jour ou l’autre|instant plus (?:tôt|tard)|moment plus (?:tôt|tard)|peu (?:mieux|moins bien|partout|plus t(?:ôt|ard) que prévu)|tant soit peu) -> *
plus t(?:ôt|ard) que prévu -> *
une (?:à une|autre fois|bonne fois pour toutes|fois(?: pour toutes| de plus| n’est pas coutume)) -> *
une fois -> _
urbi et orbi -> *
v(?:aille que vaille|entre à terre|ers nulle part) -> *

# je / tu / il / elles / nous / vous / ils / elles 
je (?:t’en|vous en) (?:prie|supplie) -> *
nous (?:t’en|vous en) (?:prions|supplions) -> *

# mot-là
(\w+)(-là) <- morphex(\1, "po:(?:nom|adj)", "po:mg") -2> *

# Après
(?:bien|si|assez) longtemps -> *
plus (?:près|loin|tôt|tard|ou moins|que (?:nécessaire|jamais)|d’une fois) -> *

## Simplification partielle
(tout au long) d(?:es?|u) <- not morph(word(-1), "po:prep", False, False) -1> au
à (bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|hauteur|l’(?:aff[ûu]t|arrière|autre bout|aune|avant|écart|égard|extérieur|encontre|ins(?:u|tar)|intérieur|opposé|orée|approche)|la (?:hauteur|portée|suite)|partir|portée|pro(?:ximité|pos)|quelques (?:mètres|kilomètres|lieues|pas|centaines de mètres|minutes|heures)|rebours) d(?:es?|u) -1> *
à (base|grand(?: renfort|s coups)|raison) de? -1> *
au (bout|beau milieu|courant|cours|détriment|fin fond|grand dam|fur et à mesure|gré|l(?:ieu|ong|arge)|milieu|nez et à la barbe|plus profond|profit|s(?:ein|ortir|ujet)|vu(?: et au su|)) d(?:es?|u) -1> *
aux (abords|dépens) d(?:es?|u) -1> *
(compte tenu) d(?:es?|u) -1> avec
en (arrière|attente|amont|aval|cas|cours|dehors|dépit|direction|faveur|guise|l’(?:absence|honneur)|lieu et place|plein milieu|présence|raison|sus|termes|vertu) d(?:es?|u) -1> *
en (flagrant délit|matière) de? -1> *
(en proie) à -1> *
(eu égard) (?:à|aux?) -1> *
([dmts]es|nos|vos|le(?:ur|)s) (\d+) (\w[\w-]+) <- not re.match(u"(?i)(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)s?", \3) -2> *
la (une) d(?:es?|u) -1> _
le (long) d(?:es?|u) -1> _
par (le biais) d(?:es?|u) -1> * 
pour (ou contre) -1> *
(vent debout) contre -1> *

## Simplifications spécifiques
armées? (de (?:l’air|terre)|jusqu aux dents) -1> *
armés? (jusqu aux dents) -1> *
armes? (à feu|de (?:poing|guerre|destruction massive)) -1> *
(?:attestation|déclaration)s? (sur l’honneur) -1> *
ayants (droit) -1> *
bo[îi]tes? (aux lettres) -1> *
bisph[ée]nol (A) -1> *
blanc(?:he|)s? (comme neige|comme de la craie) -1> *
chairs? (à (?:pâté|canons?)) -1> *
chambres? (d’hôtes|de (?:commerce|compensation)) -1> *
chefs?(-d’œuvre) -1> *
claire?s? (comme de l’eau de roche) -1> *
commise?s? (d’office) -1> *
conventions? (récepteur|générateur) -1> *
coups? (de (?:cœur|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|p(?:ied|oing|ouce)|tête)|d’(?:éclat|État|œil|épaule)|du sort) -1> *
courses? (contre la montre) -1> *
(?:co[uû]t|prix) (de revient) -1> *
délais? (d’attente|de (?:carence|connexion|prescription|préavis|rétraction|rigueur)) -1> *
dignes? (de (?:confiance|foi)) -1> *
(droit) (?:au but|dans les yeux) -1> *
espérances? (de vie) -1> *
états? (d’(?:âme|e(?:sprit|xtrême urgence)|urgence)|de (?:conservation|fait|l’art)) -1> *
(f[aiîeo]\w*) +(tous(?: deux| trois|)) +(?:allusion|assaut|confiance|chaud|débat|demi-tour|froid|gr(?:ise mine|and cas)|h(?:alte|onte)|ma(?:chine|rche) arrière|p(?:art(?:ie)|eur|rofil bas)|rage|sens|table rase|volte-face) <- "faire" in stem(\1) -2> *
(f[aiîeo]\w*) +(allusion|assaut|confiance|chaud|débat|demi-tour|froid|grise mine|h(?:alte|onte)|ma(?:chine|rche) arrière|p(?:art(?:ie(?: intégrante|)|)|eur|rofil bas)|rage|salle comble|sens|table rase|volte-face|ce que bon (?:me|te|lui|leur|nous|vous) semble) <- "faire" in stem(\1) -2> *
filles? (au pair|à (?:papa|maman)) -1> *
fils (à (?:papa|maman)) -1> *
[word]
[fF]emmes? (de (?:chambre|lettres|loi|ménage)|d’(?:âge mûr|affaires|exception|É(?:tat|glise)|honneur)) -1> *
[hH]ommes? (de (?:lettres|loi|main|paille)|d’(?:âge mûr|affaires|armes|exception|É(?:tat|glise)|honneur)) -1> *
[Word]
gardes? (à vue|du corps) -1> *
(?:infirmières?|médecins?) (de garde) -1> *
(l(?:a (?:nette|bizarre) +|’étrange +|’)impression) +que? -1> *
(le (?:pres|)sentiment) +que? -1> *
listes? (d’attente) -1> *
invitée?s? (d’honneur|surprise) -1> *
journa(?:l|ux) (de bord) -1> *
mains? (d’œuvre) -1> *
ma(?:l|ux) (de (?:tête|ventre)) -1> *
marchés? (aux puces) -1> *
metteu(?:r|se)s? (en scène) -1> *
mis(?:es?|) (à (?:jour|niveau|plat|l’écart)|au p(?:oint|as)|en (?:avant|bouche|demeure|garde|œuvre|scène|terre)) -1> *
modes? (de (?:paiement|scrutin|vie)) -1> *
mots? (de passe) -1> *
numéro (un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf|)|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante(?:-dix|)|quatre-vingt(?:-dix|)|cent|mille|\d+) -1> *
oiseaux? (de (?:malheur|nuit|proie)) -1> * 
ondes? (de choc) -1> *
orge (perlé|mondé|carré) -1> *
noire?s? (comme (?:la nuit|une nuit sans lune)) -1> *
pièces? (de (?:théâtre|monnaie|\d+ (?:euros?|centimes?|cents?|livres? sterling|shillings?))) -1> 
portes? (de service) -1> *
poudres? (aux yeux) -1> *
(pr[eiî]\w+) +(à la légère|au dépourvu|de court|en charge|pour argent comptant|par surprise) <- "prendre" in stem(\1) -2> *
quelqu un (d’autre) -1> *
remise?s? (à plat) -1> *
requêtes? (en (?:nullité|non (?:conciliation|inscription|lieu|révocation de sursis))) -1> *
rouges? (à lèvres) -1> *
sacs? (à (?:dos|main|langer)) -1> *
salles? (à manger|d’attente|de (?:bains?|conférence)) -1> *
saine?s? (d(?:e corps et d|)’esprit) -1> *
(sembl\w+|par\w+) +(être|avoir été) +(\w[\w-]+) <- stemchk(\1, u"^(?:sembler|para[îi]tre)$") and morphex(\3, "po:adj", "po:mg") -2> * 
systèmes? (d’exploitation) -1> *
taille (\d+) -1> *
(t[eiî]\w+) (compte) d(?:es?|u) <- "tenir" in stem(\1) -2> *
(tout un) chacun -1> *
(tri\w+) (sur le volet) <- "trier" in stem(\1) -2> *
tueu(?:r|se)s? (à gages) -1> *
(v[eiî]n\w+) (on ne sait d’où) <- "venir" in stem(\1) -2> *
vernis (à ongles) -1> *
vols? (à l(?:’étalage|a (?:sauvette|tire))) -1> *
usines? (à gaz) -1> *

# nombres
dix-(?:sept|huit|neuf) -> dix
(vingt|trente|quarante|cinquante)(?:-(?:deux|trois|quatre|cinq|six|sept|huit|neuf|et-un)| et un) -> \1
soixante-(?:d(?:eux|ix(?:-(?:sept|huit|neuf)|)|ouze)|tr(?:ois|eize)|quat(?:re|orze)|cinq|six|sept|huit|neuf|quinze|seize| et (?:un|onze)|-et-(?:un|onze)) -> soixante
quatre-vingt-(?:un|d(?:eux|ix(?:-(?:sept|huit|neuf)|)|ouze)|tr(?:ois|eize)|quat(?:re|orze)|cinq|six|sept|huit|neuf|onze|quinze|seize) -> quatre-vingts

(le(?:ur|)s|des|ses|ces|mes|tes|nos|vos|leurs) +(d(?:eux|ix|ouze)|tr(?:ois|eize|ente)|qua(?:t(?:re(?:-vingts|)|orze)|rante)|cinq(?:uante|)|s(?:ix|seize|oixante)|sept|huit|neuf|onze|quinze|vingt|cent|mille) +(\w[\w-]+)
    <- morphex(\3, "po:(?:nom|adj).* is:(?:pl|inv)", "po:(?:mg|3pl)") -2> *

(à |d(?:e +|’))une +heure(?: (?:d(?:eu|i)x|tr(?:ois|eize|ente)|qu(?:a(t(?:re|orze)|rante)|inze)|cinq(?:uante|)|s(?:ix|ept|eize)|huit|neuf|onze|douze|vingt)|) -> *
(à|de) (?:d(?:eu|i)x|tr(?:ois|eize)|qu(?:at(?:re|orze)|inze)|cinq|s(?:ix|ept|eize)|huit|neuf|onze|douze|vingt) +heures(?: (?:d(?:eu|i)x|tr(?:ois|eize|ente)|qu(?:a(t(?:re|orze)|rante)|inze)|cinq(?:uante|)|s(?:ix|ept|eize)|huit|neuf|onze|douze|vingt)|) -> *

## Conditionnel
à (\w[\w-]+) pour cent <- morph(\1, "po:nb", False) -> *
au moins <- morph(word(-1), ":v0", False) or not morph(word(1), "po:adj", False) -> *
aussi (\w[\w-]+) que (?:nécessaire|possible) <- morph(\1, "po:adv", False) -> *
au sens (?:le (?:plus|moins) |)(\w[\w-]+) du terme <- morph(\1, "po:adj .*is:mas is:sg", False) -> *
#aussi (\w[\w-]+) que ce soit
(nombre) des? <- morph(word(-1), "po:(?:prep|cjsub|cjco)", False, True) -1> *
à (\w[\w-]+) reprises <- morph(\1, "po:nb", False) or re.match("(?i)(?:plusieurs|maintes)", \1) -> *
(\w[\w-]+) (comme (?:eux|elles?|lui|ça|celui-(?:ci|là)|celles?-(?:ci|là)|ceux(?:ci|là)|l[ea] [nv]ôtre|le [mts]ien|la [mts]ienne|les ([nv]ôtres|sien(?:ne|)s)))
    <- morphex(\1, "po:(?:nom|adj|ppas)", ":v0") -2> *
(\w[\w-]+) (pêle-mêle) <- not morph(\1, "po:det", False) -2> *
(\w[\w-]+) (droit) devant <- not morph(\1, "po:det.* is:(?:mas is:(?:sg|inv)|epi is:(?:sg|inv))", False) -2> *
(d[eouû]\w+|cr[ouû]\w+|pens\w+|imagin\w+|estim\w+) (l(?:eur|ui)|nous|vous) être <- stemchk(\1, "^(?:croire|devoir|estimer|imaginer|penser)$") -2> *
(en partie) (\w[\w-]+) <- morph(\1, "po:(?:prep|det|[1-3]sg|negadv)", False) -1> *
haut et fort <- not morph(word(-1), "po:det", False, False) -> *
hélas <- not before(u"(?i)\\bt(?:u|oi qui)\\b") -> *
nécessité fait loi <- not morph(word(-1), "po:det", False, False) -> *
(non|par trop) (\w[\w-]+) <- morph(\2, "po:adj", False) -1> *
plein est <- not morph(word(-1), "po:det", False, False) -> *
(plus|moins|aussi) (\w\w\w+) que prévu <- morph(\2, "po:adv", False) -> *
(plus|moins|aussi) (\w\w\w+) (que (?:les autres|l’autre)) <- morphex(\2, "po:ad[jv]", "po:mg") -3> *
plus (\w\w\w+) (les une?s que les autres) <- morph(\2, "po:ad[jv]", False) -2> *
(pour autant (?:que (?:je sache|tu saches|nous sachions|vous sachiez)|qu (?:(?:il|elle) sache|(?:ils|elles) sachent))) ([\w-]+) <- not morph(\2, "po:infi", False) -1> *
#avec (\w+) <- morph(\1, "po:nom") and not re.match("(?i)(force|air)$", \1) and not morph(word(1), "po:adj", False) -> *
(\w[\w-]+) +(tête baissée) <- morphex(\1, "po:(?:nom|v)", "po:det") -2> *
((?:pas |)tant que ça) (\w+) <- not morph(\2, "po:(?:3sg|negadv)", False) -1> *
(le|un|ce|[mts]on) (putain d(?:e +|’))(\w[\w-]+) <- morph(\3, "is:(?:mas|epi)", False) -2> *

# Noms propres
[word]
Amérique (centrale|du (?:Nord|Sud)) -1> *
([A-ZÉÈÂ][\w-]+) ([A-ZÉÈÂ][\w-]+) <- morph(\1, "po:(?:patr|prn)", False) and (morph(\2, "po:(?:patr|prn|v)", False) or not spell(\2)) -2> * 
(?:de |d’)([A-ZÉÈÂ][\w-]+) +(?:et|ou) +(?:de |d’)([A-ZÉÈÂ][\w-]+) <- morph(\1, "po:(?:patr|prn|npr)", False) and morph(\2, "po:(?:patr|prn|npr)", False)-> *
(?:de |d’)([A-ZÉÈÂ][\w-]+) <- morph(\1, "po:(?:patr|prn|npr)", False) -> *
entre ([A-ZÉÈÂ][\w-]*) +et ([A-ZÉÈÂ][\w-]*) <- morph(\1, "po:(?:patr|prn|nom)") and morph(\2, "po:(?:patr|prn|nom)") -> *
en ([A-ZÉ][\w-]+) <- morph(\1, "po:(?:nom|npr)") and \1 != u"République" -> *
[lcLC]e (?:baron|docteur|député|duc|frère|prince|professeur|roi|sénateur) ([A-ZÉÈÂ][\w-]+) <- morph(\1, "po:(patr|prn)", False) -1> *
(?:[lL]a|[cC]ette) (?:baronne|docteure?|députée|duchesse|sœur|princesse|professeure?|reine|sénatrice) ([A-ZÉÈÂ][\w-]+) <- morph(\1, "po:(?:patr|prn)", False) -1> *
M(?:r|lle|me|gr|iss) ([A-ZÉÈÂ][\w-]+) -1> *
([A-ZÉÈÊ][\w-]+) +et (lui|elles?|eux|[nv]ous|[mt]oi)
    <- morph(\1, "po:(?:prn|patr|npr|titr)", False) and morph(word(-1), "po:cjsub", False, True) and not before(u"(?:plus|moins|aussi) .* que +$")
    -> =rewriteSubject(\1,\2)
[Word]

# après être, après avoir
([êeésf]\w+) +(à jamais|un jour|sous peu|du moins|avant tout|de passage|frère et sœur|mari et femme|père et mère|papa et maman) <- morph(\1, "po:v0e", False) -2> *
([ésf]\w+)-(?:ils|nous|elles) +(frère et sœur|mari et femme|père et mère|papa et maman) <- morph(\1, "po:v0e", False) -2> *
(\w+) +(on ne peut (?:pas |)(?:plus|moins)|plus que) +(\w\w+) <- morph(\1, "po:(v0e|nom)", False) and morph(\3, "po:(?:adj|ppas)", False) -2> *
([aeêésfo]\w*) +(pas|jamais|plus|en partie|point|tous (?:deux|trois)) <- morph(\1, "po:v0", False) -2> *
([aeêésfo]\w*) +(beaucoup|bien entendu|dans (?:leur |son |l’)ensemble|à ce(?:t (?:instant|endroit)| moment)|un (?:moment|peu)) +(\w[\w-]+)
    <- morph(\1, "po:v0", False) and morph(\3, "po:(?:ppas|infi)", False) -2> *
([aeo]\w*) +(partie gagnée)
    <- morph(\1, "po:v0a", False) -2> *
([aeo]\w*) +(tou(?:te|)s les (\w[\w-]+)) +(\w[\w-]+)
    <- morph(\1, "po:v0a", False) and morph(\3, "po:nb", False) and morph(\4, "po:(?:ppas|v1.* po:infi)", False) -2> *

# après verbe
(\w+) (?:pas |)(jour et nuit|quand même(?: pas|)) <- morph(\1, "po:v", False) -2> *
(\w[\w-]+) (bien entendu|juste|ensemble) <- morph(\1, "po:v[123]") -2> *
(\w[\w-]+) ((?:fort|très|super) (?:bien|mal)|bien|mal) <- morph(\1, "po:v[1-3]", False) -2> *
(\w[\w-]*) ((?:[mt]oi|[nv]ous|elles?|lui|eux) aussi) <- morph(\1, "po:v", False) -2> *
(?:tout |)aussi -> *
aussi(?:tôt|) -> *
(\w[\w’-]*) (même) <- morphex(\1, "po:v", "po:mg") -2> *

# avant adjectifs, avant adverbes
le (\w[\w-]+) (le plus) (\w[\w-]+) <- morphex(\1, "po:(?:nom|adj).* is:(?:mas|epi)", "po:mg") and morph(\3, "po:(?:adj|ppas).* is:(?:mas|epi)", False) -2> *
la (\w[\w-]+) (la plus) (\w[\w-]+) <- morphex(\1, "po:(?:nom|adj).* is:(?:fem|epi)", "po:mg") and morph(\3, "po:(?:adj|ppas).* is:(?:fem|epi)", False) -2> *
[ld]es (\w[\w-]+) (les plus) (\w[\w-]+) <- morphex(\1, "po:(?:nom|adj).* is:(?:pl|inv)", "po:[123](?:sg|pl)") and morph(\3, "po:(?:adj|ppas).* is:(?:pl|inv)", False) -2> * 
bien sûr(?! de) -> *
(bien|mal|(?:fort|super) (?:bien|mal)|fort) +(\w[\w-]+)
    <- morph(\2, "po:ad[jv]") -1> *
(à (?:demi|peine|peu près)|depuis peu|quelque peu|pas très|un peu(?: plus| moins|)|peu|plus|moins|si) +(\w[\w-]+)
    <- morph(\2, "po:ad[jv]", False) -1> *
(un (?:brin|chou[iï]a|tantinet|soupçon)) (\w[\w-]+) <- morph(\2, "po:ad[jv]", False) -1> *
(assez|trop) +(\w+ment)
    <- morphex(\2, "po:adv", "po:3pl") -> *
(assez|trop) +(\w[\w-]+)
    <- morphex(\2, "po:ad[jv]", "po:[1-3](?:sg|pl)") -1> *


# adverbes en -ment
(\w[\w-]+) ((?:le|la) (?:plus|moins) (\w+ment)) (\w[\w-]+)
    <- morph(\1, "po:(?:nom|adj|ppas)", False) and morph(\3, "po:adv", False) and morph(\4, "po:(?:adj|ppas)", False) -2> *
complètement <- not morph(word(-1), "po:det", False, True) -> *
(\w+ment)(?: parlant|) <- morph(\1, r"po:adv\b") -> *

# couleurs invariables
(\w[\w-]+) +((?:beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet) (?:clair|fluo|foncé|irisé|pâle|pastel|sombre|vif))
    <- morph(\1, "po:(?:nom|adj|ppas)", False) -2> *

# locutions adjectivales & couleurs
(\w[\w-]+) +(bas(?: de gamme|se consommation)|bon (?:enfant|marché|teint|chic,? bon genre)|dernier cri|fleur bleue|grand (?:public|luxe)|grandeur nature|haut(?: de gamme|e résolution)|longue (?:portée|durée)|numéro (?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf)|onze|douze|treize|quatorze|quinze|seize|vingt)|plein cadre|top secret|vieux jeu|open source|Créative Commons|pur jus|terre à terre|bleu (?:saphir|turquoise)|vert (?:émeraude|olive|pomme)|rouge (?:brique|rubis|sang)|jaune sable|blond platine|gris (?:acier|anthracite|perle)|noir (d(?:’encre|e jais)|et blanc))
    <- morph(\1, "po:(?:nom|adj|ppas|v0e)", False) -2> *

# tous / tout / toute / toutes
(tout) (?:le|cet?|[mts]on) -1> *
(toute) (?:la|cette|[mts]a) -1> *
(tou(?:te|)s) (?:[ldscsmt]es) -1> *


## 1 mot
ai(?:lleurs|nsi) -> *
al(?:entour|ors) -> *
au(?:jourd’hui|paravant) -> *
bientôt -> *
ce(?:pendant|rtes) -> *
ci-desso?us -> *
de(?:bout|rechef) -> *
(depuis), -1> *
dé(?:jà|sormais) -> *
do(?:nc|rénavant) -> *
en(?:fin|suite|core) -> *
guère -> *
jadis -> *
lo(?:in|ngtemps) -> *
mouais -> *
n(?:aguère|éanmoins) -> *
par(?:fois|tout) -> *
p(?:eut-être|lutôt|ourtant|resque|rimo) -> *
quelquefois -> *
sou(?:dain|vent) -> *
tou(?:jours|tefois) -> *
secondo -> *
sur(?:-le-champ|tout) -> *
t(?:ôt|ard|antôt|ertio) -> *
très -> *
volontiers -> *

# après
au fur et à mesure -> *

[Char]
, +(?:oui|non|entre autres), -> *

[char]
, +, -> *
^ *, -> *
, *$ -> *
[—–-] +[—–-] -> *
[<] +[>] -> *
[(] +[)] -> *


### Désambiguïsation par séparation de le/la/les avec la suite s’il s’agit de COD dans les syntagmes verbaux
[Char]
(?<!-)\b[nmts]e l(?:es?|a)( ) -1> @
(?<!-)\bje l(?:es?|a)( ) <- not morph(word(-1), "po:1sg", False, False) -1> @
(?<!-)\btu l(?:es?|a)( ) <- not morph(word(-1), "po:2sg", False, False) -1> @
(?<!-)\b(il|elle|on) l(?:es?|a)( ) <- not morph(word(-1), "po:3sg", False, False) -2> @
(?<!-)\bnous l(?:es?|a)( ) <- not morph(word(-1), "po:1pl", False, False) -1> @
(?<!-)\bvous l(?:es?|a)( ) <- not morph(word(-1), "po:2pl", False, False) -1> @
(?<!-)\b(ils|elles) l(?:es?|a)( ) <- not morph(word(-1), "po:3pl", False, False) -2> @ 
(?<!-)\bl(?:es?|a)( )(\w[\w-]+) <- morph(\2, "po:[123](?:sg|pl)") -1> @


### DPP: Désambiguïsation par distinction des mots qui sont à la fois (verbes conjugués ET (noms ET/OU adjectifs))
# Cette distinction est nécessaire seulement pour les mots suivant un groupe nominal.
# Exemples : finis, donne(s), avance(s), bavarde(s)
[Word]
(?<![lL]’)une? (\w[\w-]+)( ) *(\w[\w-]+) 
    <- isAmbiguousNAV(\3) and morph(\1, "po:(?:nom|adj)", False)
    -2> ~
(d(?:es? |’)|[mts](?:es|on|a) |ce(?:s|t(?:te|)|rtaine?s|) |[nv](?:otre|os) |leurs |quelques ) *(\w[\w-]+)( ) *(\w[\w-]+)
    <- isAmbiguousNAV(\4) and morph(\2, "po:(?:nom|adj)", False)
    -3> ~
l(?:es? |a |’|eur ) *(\w[\w-]+)( ) *(\w[\w-]+)
    <- isAmbiguousNAV(\3) and ( morphex(\1, "po:(?:nom|adj)", "po:3(?:sg|pl)") or (morph(\1, "po:(?:nom|adj)", False) and not word(-1)) )
    -2> ~



#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]

#### Redondances

[Word]
 
__redon2__   {W}[ ,].* (\1) <- not morph(\1, "po:(?:mg|v0)", False) -2> _              # Dans cette phrase, répétition de « \1 ».


############################## GROUPE NOMINAL ##############################

[Word]

#### 1 mot

## Usage impropre

(au le) (\w[\w-]+) <- morph(\2, "po:(?:nom|adj)", False) -1> au                      # Usage impropre. Après “au”, l’article “le” est inapproprié. (Ex : Je vais à la gare, je vais au stade.)
(au les) (\w[\w-]+) <- morph(\2, "po:(?:nom|adj)", False) -1> aux                    # Usage impropre. Après “au”, l’article “les” n’est pas nécessaire.
(au) la (\w[\w-]+) <- morph(\2, "po:(?:nom|adj).* is:fem", False) -1> à              # Usage impropre. Avec un nom féminin, utilisez la préposition “à”. (Ex : Je vais à la gare, je vais au stade.)
(au) l’\w[\w-]+ -1> à                                                                # Usage impropre.


## Genre

__gn__  \w[\w-]* *, (le) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|ppre|mg|adv|[1-3](?:sg|pl)|infi)")
    -1> la                                                                                 # Accord de genre erroné : « \2 » est féminin.
__gn__  (\w[\w-]*) (le) +(\w[\w-]+)
    <- morphex(\3, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|ppre|mg|adv|[1-3](?:sg|pl)|infi)")
    or ( morphex(\3, "po:(?:nom|adj).* is:fem", "is:(?:mas|epi)") and morphex(\1, "po:(?:prep|cj)", "st:(?:e[tn]|ou)") and not (morph(\1, "po:prepv", False) and morph(\3, "po:infi", False)) )
    -2> la                                                                                 # Accord de genre erroné : « \3 » est féminin.
__gn__  ^ *(le) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|ppre|mg|adv|infi)")
    -1> la                                                                                 # Accord de genre erroné : « \2 » est féminin.

__gn__  (ledit) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv)")
    -1> ladite                                                                             # Accord de genre erroné : « \2 » est féminin.
__gn__  (un) +(?:des |)(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv|v0|3sg)")
    -1> une                                                                                # Accord de genre erroné : « \2 » est féminin.
__gn__  (certains) +(?:des |)(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv|ppre)")
    -1> certaines                                                                          # Accord de genre erroné : « \2 » est féminin.
__gn__  (du) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv)")
    -1> de la                                                                              # Accord de genre erroné : « \2 » est féminin.
__gn__  (cet?) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv)")
    -1> cette                                                                              # Accord de genre erroné : « \2 » est féminin.
__gn__  (au) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:fem is:sg", ":(?:epi|mas|mg|adv)")
    -1> à la                                                                               # Accord de genre erroné : « \2 » est féminin.

__gn__  \w[\w-]* *, +(la) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|ppre|mg|adv|[1-3](?:sg|pl)|infi)")
    -1> le                                                                                 # Accord de genre erroné : « \2 » est masculin.
__gn__  (\w[\w-]*) (la) +(\w[\w-]+)
    <- morphex(\3, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|ppre|mg|adv|[1-3](?:sg|pl)|infi)")
    or ( morphex(\3, "po:(?:nom|adj).* is:mas", "is:(?:fem|epi)") and morphex(\1, "po:(?:prep|cj)", "st:(?:e[tn]|ou)") and not (morph(\1, "po:(?:prepv|cj)", False) and morph(\3, "po:infi", False)) )
    -2> le                                                                                 # Accord de genre erroné : « \3 » est masculin.
__gn__  ^ *(la) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|ppre|mg|adv|infi)")
    -1> le                                                                                 # Accord de genre erroné : « \2 » est masculin.

__gn__  (ladite) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv)")
    -1> ledit                                                                              # Accord de genre erroné : « \2 » est masculin.
__gn__  (une) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv|v0|3sg|ppre)")
    -1> un                                                                                 # Accord de genre erroné : « \2 » est masculin.
__gn__  (une) +des +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv|v0|3sg)")
    -1> un                                                                                 # Accord de genre erroné : « \2 » est masculin.
__gn__  (certaines) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv|ppre)")
    -1> certains                                                                           # Accord de genre erroné : « \2 » est masculin.
__gn__  (certaines) +des (\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv)")
    -1> certains                                                                           # Accord de genre erroné : « \2 » est masculin.
__gn__  (cette) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv)")
    -1> =ceOrCet(\2)                                                                       # Accord de genre erroné : « \2 » est masculin.
    
__gn__  (([mts])on) +([^aâeéèêiîoôuûyœæhAÂEÉÈÊIÎOÔUÛYŒÆH\s][\w-]+)
    <- morphex(\3, "po:(?:nom|adj).* is:fem", ":(?:epi|mas|mg|adv)")
    -1> \2a                                                                                # Accord de genre erroné : « \3 » est féminin.
__gn__  (([mst])a) ([aâeéèêiîoôuûyœæAÂEÉÈÊIÎOÔUÛYŒÆ]\w+)
    <- morphex(\3, "is:fem", ":(?:epi|mg|adv)")
    -1> \2on                                                                               # Même si « \3 » est féminin, on utilise « \2on » pour faire la liaison.
__gn__  (([mts])a) +(\w[\w-]+)
    <- morphex(\3, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv)")
    -1> \2on                                                                               # Accord de genre erroné : « \3 » est masculin.

## Euphonie
__gn__  (cet) +([bcçdfgjklmnpqrstvwxz][\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:epi|fem|mg|adv)")
    -1> ce                                                                                 # Accord de genre correct, mais euphonie non respectée.|http://fr.wikipedia.org/wiki/Euphonie

## Nombre

__gn__  \w[\w-]* *, les +(\w[\w-]+)
    <- (morph(\1, "po:(?:nom|adj).* is:sg")
    and not (morph(word(1), "st:(?:et|ou)", False, False) and morph(word(2), "po:(?:nom|adj)", True, False)))
    or \1 in aREGULARPLURAL
    -1> =suggPlur(@)                                                                       # Accord de nombre erroné : « \1 » devrait être au pluriel.
__gn__  (\w[\w-]*) les +(\w[\w-]+)
    <- (morph(\2, "po:(?:nom|adj).* is:sg") or (morphex(\2, "po:(?:nom|adj).* is:sg", "(?:is:(?:pl|inv)|st:avoir)") and morphex(\1, "po:(?:prep|cj)", "st:(?:e[tn]|ou)") and not (morph(\1, "po:prepv", False) and morph(\2, "po:infi", False))))
    and not (morph(word(1), "st:(?:et|ou)", False, False) and morph(word(2), "po:(?:nom|adj)", True, False))
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné : « \2 » devrait être au pluriel.
__gn__  ^ *les +(\w[\w-]+)
    <- (morphex(\1, "po:(?:nom|adj).* is:sg", ":(inv|pl|infi|ppre|mg|adv)")
    and not (morph(word(1), "st:(?:et|ou)", False, False) and morph(word(2), "po:(?:nom|adj)", True, False)))
    or \1 in aREGULARPLURAL
    -1> =suggPlur(@)                                                                       # Accord de nombre erroné : « \1 » devrait être au pluriel.
__gn__  ([dcmts]es|[nv]os|leurs|quelques|plusieurs|lesdits|aux|moult) +(\w[\w-]+)
    <- (morphex(\2, "po:(?:nom|adj).* is:sg", ":(?:inv|pl|mg|adv)")
    and not (morph(word(1), "st:(?:et|ou)", False, False) and morph(word(2), "po:(?:nom|adj)", True, False)))
    or \2 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné : « \2 » devrait être au pluriel.
__gn__  certaine?s +(\w[\w-]+)
    <- (morphex(\1, "po:(?:nom|adj).* is:sg", ":(?:inv|pl|mg|adv|ppre)")
    and not (morph(word(1), "st:(?:et|ou)", False, False) and morph(word(2), "po:(?:nom|adj)", True, False)))
    or \1 in aREGULARPLURAL
    -1> =suggPlur(@)                                                                       # Accord de nombre erroné : « \1 » devrait être au pluriel.

__gn__  nombre d(?:e +|’)(\w[\w-]+)
    <- (morphex(\1, "po:(?:nom|adj).* is:sg", "is:(?:inv|pl)") and morphex(word(-1), "po:(?:mg|[123](?:sg|pl))", "po:(?:adj|det)", True))
    or \1 in aREGULARPLURAL
    -1> =suggPlur(@)                                                                       # Ici, « nombre de » devrait être suivi d’un pluriel.

__gn__  ([ldcsmt]es|leurs|nos|vos) (?:centaine|milli(?:er|ion|iard)|d(?:ix|ouz)aine|multitude|horde)s d(?:e +|’)(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:sg", "is:(?:inv|pl)") or \2 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Mettre au pluriel.

__gn__  (une?|l[ea]|ce(?:tte|)|s(?:on|a)|m(?:on|a)|t(?:on|a)) (?:centaine|milli(?:er|ion|iard)|d(?:ix|ouz)aine|multitude|horde) d(?:e +|’)(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:sg", "is:(?:inv|pl)") or \2 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Mettre au pluriel.

__gn__  \w[\w-]* *, +l(?:e|a|eur) +(\w[\w-]+)
    <- morph(\1, "po:(?:nom|adj).* is:pl")
    -1> =suggSing(@)                                                                        # Accord de nombre erroné : « \1 » devrait être au singulier.
__gn__  (\w[\w-]*) +l(?:e|a|eur) +(\w[\w-]+)
    <- morph(\2, "po:(?:nom|adj).* is:pl")
    or ( morphex(\2, "po:(?:nom|adj).* is:pl", "is:(?:sg|inv)") and morphex(\1, "po:(?:prep|cj)", "st:(?:e[tn]|ou)") and not (morph(\1, "po:prepv", False) and morph(\2, "po:infi", False)) )
    -2> =suggSing(@)                                                                       # Accord de nombre erroné : « \2 » devrait être au singulier.
__gn__  ^ *l(?:e|a|eur) +(\w[\w-]+)
    <- morphex(\1, "po:(?:nom|adj).* is:pl", ":(?:inv|sg|mg|adv)")
    -1> =suggSing(@)                                                                       # Accord de nombre erroné : « \1 » devrait être au singulier.

__gn__  (ce(?:t|tte|)|du|[mts](?:on|a)|[nv]otre|ledit|ladite|au|chaque) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:inv|sg|mg|adv)")
    -2> =suggSing(@)                                                                       # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn__  (au) +(\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:inv|sg|mg|adv)")
    -1> aux                                                                                # Accord de nombre erroné : « \2 » est au pluriel.

__gn__  (quelque) +(\w[\w-]+)(?! que?)
    <- morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:mg|sg|inv)")
    -1> quelques                                                                           # Il manque un “s” à « quelque » ou « \2 » doit être au singulier.

__gn__  une? +(\w[\w-]+)
    <- morphex(\1, "po:(?:nom|adj).* is:pl", ":(?:inv|sg|mg|adv)") and not morph(word(-2), "po:nb", False)
    -1> =suggSing(@)                                                                      # Accord de nombre erroné : « \1 » devrait être au singulier.

__gn__  (d(?:eux|ix|ouze)|tr(?:ois|eize)|qua(?:tre(?:-vingt(?:s|-dix)|)|torze|rante)|cinq(?:uante|)|six|sept(?:ante|)|huit(?:ante|)|onze|quinze|seize|vingt|trente|soixante(?:-dix|)|cents?|octante|nonante) +(\w[\w-]+)
    <- (morph(\2, "po:(?:nom|adj).* is:sg")
    and not re.match(u"(?i)(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)$", \2))
    or \2 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

__gn__  (neuf) +(\w[\w-]+)
    <- (morph(\2, "po:(?:nom|adj).* is:sg") and not morph(word(-1), "po:nom", False)
    and not re.match(u"(?i)(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)$", \2))
    or \2 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

__gn__  mille +(\w[\w-]+)
    <- (morph(\1, "po:(?:nom|adj).* is:sg") or \1 in aREGULARPLURAL) and not re.match("(?i)(le|un|ce|du)$", word(-1))
    -1> =suggPlur(@)                                                                       # Accord de nombre erroné avec « mille » : « \1 » devrait être au pluriel.

__gn__  [01] (\w[\w-]+)
    <- morph(\1, "po:(?:nom|adj).* is:pl")
    and not re.match(u"(?i)(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)$", \1)
    -1> =suggSing(@)                                                                       # Accord de nombre erroné : « \1 » devrait être au singulier.
__gn__  (?<!/)(\d+) (\w[\w-]+)
    <- (\1 != "1" and \1 != "0" and morph(\2, "po:(?:nom|adj).* is:sg")
    and not re.match(u"(?i)(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)$", \2))
    or \1 in aREGULARPLURAL
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné : « \2 » devrait être au pluriel.


## quel / quels / quelle / quelles
__gn__  (quel) +(\w[\w-]+)      <- morph(\2, "po:(?:nom|adj).* is:fem is:pl")          -1> quelles         # Accord de genre et de nombre erroné : « \2 » est féminin et au pluriel.
__gn__  (quel) +(\w[\w-]+)      <- morph(\2, "po:(?:nom|adj).* is:mas is:pl")          -1> quels           # Accord de nombre erroné : « \2 » est au pluriel.
__gn__  (quel) +(\w[\w-]+)      <- morph(\2, "po:(?:nom|adj).* is:fem is:(?:sg|inv)")  -1> quelle          # Accord de nombre erroné : « \2 » est féminin.
__gn__  (quels) +(\w[\w-]+)     <- morph(\2, "po:(?:nom|adj).* is:fem is:sg")          -1> quelle          # Accord de genre et de nombre erroné : « \2 » est féminin et au singulier.
__gn__  (quels) +(\w[\w-]+)     <- morph(\2, "po:(?:nom|adj).* is:sg")                 -1> quel            # Accord de nombre erroné : « \2 » est au singulier.
__gn__  (quels) +(\w[\w-]+)     <- morph(\2, "po:(?:nom|adj).* is:fem")                -1> quelles         # Accord de nombre erroné : « \2 » est féminin.
__gn__  (quelle) +(\w[\w-]+)    <- morph(\2, "po:(?:nom|adj).* is:mas is:pl")          -1> quels           # Accord de genre et de nombre erroné : « \2 » est masculin et au pluriel.
__gn__  (quelle) +(\w[\w-]+)    <- morph(\2, "po:(?:nom|adj).* is:fem is:pl")          -1> quelles         # Accord de nombre erroné : « \2 » est au pluriel.
__gn__  (quelle) +(\w[\w-]+)    <- morph(\2, "po:(?:nom|adj).* is:mas is:(?:sg|inv)")  -1> quel            # Accord de nombre erroné : « \2 » est masculin.
__gn__  (quelles) +(\w[\w-]+)   <- morph(\2, "po:(?:nom|adj).* is:mas is:sg")          -1> quel            # Accord de genre et de nombre erroné. « \2 » est masculin et au singulier.
__gn__  (quelles) +(\w[\w-]+)   <- morph(\2, "po:(?:nom|adj).* is:sg")                 -1> quelle          # Accord de nombre erroné : « \2 » est au singulier.
__gn__  (quelles) +(\w[\w-]+)   <- morph(\2, "po:(?:nom|adj).* is:mas")                -1> quels           # Accord de nombre erroné : « \2 » est masculin.

__gn__  (quel(?:le|)) (sont|étaient|ser(?:o|aie)nt|fu(?:r|ss)ent)
    <- not before(r"\btel(?:le|)s? +$")
    -1> \1s                                                     # Accord de nombre erroné avec “\2”.
__gn__  (quel(?:le|)s) (est|était|serai?t|fut|fût)
    <- not before(r"\btel(?:le|)s? +$")
    -1> =\1[:-1]                                                # Accord de nombre erroné avec “\2”.

__gn__  (quel) (?:est|était|sera(?:it|)|fut|fût) (la|cette|[mts](?:a|on)|[vn]otre) +(\w[\w-]+)
    <- not before(r"\btel(?:le|)s? +$") and morphex(\3, "po:(?:nom|adj).* is:fem", "is:(?:mas|inv)")
    -1> quelle                                                  # Accord de genre erroné avec « \2 \3 ».

__gn__  (quelle) (?:est|était|sera(?:it|)|fut|fût) (le|cet?|[mts]on|[vn]otre) +(\w[\w-]+)
    <- not before(r"\btel(?:le|)s? +$") and morphex(\3, "po:(?:nom|adj).* is:mas", "is:(?:fem|inv)")
    -1> quel                                                    # Accord de genre erroné avec « \2 \3 ».

__gn__  (quels) (?:sont|étaient|ser(?:o|aie)nt|fu(?:r|ss)ent) (les|ces|[mts]es|[vn]os) +(\w[\w-]+)
    <- not before(r"\btel(?:le|)s? +$") and morphex(\3, "po:(?:nom|adj).* is:fem", "is:(?:mas|inv)")
    -1> quelles                                                  # Accord de genre erroné avec « \2 \3 ».

__gn__  (quelles) (?:sont|étaient|ser(?:o|aie)nt|fu(?:r|ss)ent) (les|ces|[mts]es|[vn]os) +(\w[\w-]+)
    <- not before(r"\btel(?:le|)s? +$") and morphex(\3, "po:(?:nom|adj).* is:mas", "is:(?:fem|inv)")
    -1> quels                                                    # Accord de genre erroné avec « \2 \3 ».


## Cas particuliers
__gn__  [cdmts]es (même|point|son|ton) -1> \1s                                                             # Accord de nombre erroné : mettez au pluriel.
__gn__  (trouv\w+) +(ça|ce(?:ci|la)) +(\w[\w-]+)
    <- "trouver" in stem(\1) and morphex(\3, "po:adj.* is:(?:fem|mas is:pl)", "po:(?:mg|3(?:sg|pl)|prn|patr|npr)")
    -3> =suggMasSing(@)                                                                                    # Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).


#### 2 mots

## Sans article

__gn__  ^ *(\w[\w-]+) +(\w[\w-]+)
    <- ((morph(\1, "po:(?:nom|adj).* is:mas") and morph(\2, "po:(?:nom|adj).* is:fem")) or (morph(\1, "po:(?:nom|adj).* is:fem") and morph(\2, "po:(?:nom|adj).* is:mas")))
    and not apposition(\1, \2)
    -2> =switchGender(@)                                                                   # Accord de genre erroné avec « \1 ».

__gn__  ^ *(\w[\w-]+) +(\w[\w-]+)
    <- ((morph(\1, "po:(?:nom|adj).* is:sg") and morph(\2, "po:(?:nom|adj).* is:pl")) or (morph(\1, "po:(?:nom|adj).* is:pl") and morph(\2, "po:(?:nom|adj).* is:sg")))
    and not apposition(\1, \2)
    -2> =switchPlural(@)                                                                   # Accord de nombre erroné avec « \1 ».

## Prépositions

# Genre 
__gn__  (en) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morph(\2, "po:(?:nom|adj).* is:mas") and morph(\3, "po:(?:nom|adj).* is:fem"))
    or (morph(\2, "po:(?:nom|adj).* is:fem") and morph(\3, "po:(?:nom|adj).* is:mas")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchGender(@)                                                                   # Accord de genre erroné avec « \2 ».

__gn__  (à|par|pour|sans) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morphex(\2, "po:(?:nom|adj).* is:mas", "(?:po:(?:mg|infi)|is:(?:fem|epi))") and morph(\3, "po:(?:nom|adj).* is:fem"))
    or (morphex(\2, "po:(?:nom|adj).* is:fem", "(?:po:(?:mg|infi)|is:(?:mas|epi))") and morph(\3, "po:(?:nom|adj).* is:mas")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchGender(@)                                                                   # Accord de genre erroné avec « \2 ».

__gn__  (de|sur|avec) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morphex(\2, "po:(?:nom|adj).* is:mas", "(?:po:mg|is:(?:fem|epi))") and morph(\3, "po:(?:nom|adj).* is:fem"))
    or (morphex(\2, "po:(?:nom|adj).* is:fem", "(?:po:mg|is:(?:mas|epi))") and morph(\3, "po:(?:nom|adj).* is:mas")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchGender(@)                                                                   # Accord de genre erroné avec « \2 ».

# Nombre
__gn__  (en) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morph(\2, "po:(?:nom|adj).* is:pl") and morph(\3, "po:(?:nom|adj).* is:sg"))
    or (morph(\2, "po:(?:nom|adj).* is:sg") and morph(\3, "po:(?:nom|adj).* is:pl")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchPlural(@)                                                                   # Accord de nombre erroné avec « \2 ».

__gn__  (à|par|pour|sans) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morphex(\2, "po:(?:nom|adj).* is:pl", "(?:po:(?:mg|infi)|is:(?:sg|inv))") and morph(\3, "po:(?:nom|adj).* is:sg"))
    or (morphex(\2, "po:(?:nom|adj).* is:sg", "(?:po:(?:mg|infi)|is:(?:pl|inv))") and morph(\3, "po:(?:nom|adj).* is:pl")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchPlural(@)                                                                   # Accord de nombre erroné avec « \2 ».

__gn__  (de|sur|avec) +(\w[\w-]+) +(\w[\w-]+)
    <- ((morphex(\2, "po:(?:nom|adj).* is:pl", "(?:po:mg|is:(?:sg|inv))") and morph(\3, "po:(?:nom|adj).* is:sg"))
    or (morphex(\2, "po:(?:nom|adj).* is:sg", "(?:po:mg|is:(?:pl|inv))") and morph(\3, "po:(?:nom|adj).* is:pl")))
    and not apposition(\2, \3)
    and morph(word(-1), "po:(?:v|prep|proneg)", True, True)
    -3> =switchPlural(@)                                                                   # Accord de nombre erroné avec « \2 ».

## l’

__gn__  (?<!et |ou |de )l’(\w[\w-]+) +(\w[\w-]+)
    <- not re.match("(?i)air$", \1) and not \2.startswith("seul")
    and ((morph(\1, "is:mas") and morph(\2, "po:(?:nom|adj).* is:fem")) or (morph(\1, "is:fem") and morph(\2, "po:(?:nom|adj).* is:mas")))
    and not apposition(\1, \2) and not before(r"\b(et|ou|de) +$")
    -2> =switchGender(@, False)                                                           # Accord de genre erroné entre « \1 » et « \2 ».
__gn__  (?:et|ou|de) +l’(\w[\w-]+) +(\w[\w-]+)
    <- not \2.startswith("seul")
    and ((morph(\1, "is:mas") and morph(\2, "po:(?:nom|adj).* is:fem")) or (morph(\1, "is:fem") and morph(\2, "po:(?:nom|adj).* is:mas")))
    and not morph(word(-1), "po:(?:nom|adj)", False, False)
    and not apposition(\1, \2)
    -2> =switchGender(@, False)                                                           # Accord de genre erroné entre « \1 » et « \2 ».

__gn__  (?<!et |ou |de )l’(\w[\w-]+) +(\w[\w-]+)
    <- not re.match("(?i)air$", \1) and not \2.startswith("seul")
    and morph(\1, "is:(?:sg|inv)") and morph(\2, "po:(?:nom|adj).* is:pl")
    and not apposition(\1, \2) and not before(r"\b(et|ou|de) +$")
    -2> =suggSing(@)                                                                      # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__gn__  (?:et|ou|de) +l’(\w[\w-]+) +(\w[\w-]+)
    <- not re.match("(?i)air$", \1) and not \2.startswith("seul")
    and morph(\1, "is:(?:sg|inv)") and morph(\2, "po:(?:nom|adj).* is:pl")
    and not morph(word(-1), "po:(?:nom|adj)", False, False)
    and not apposition(\1, \2)
    -2> =suggSing(@)                                                                      # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

## des

__gn__  des +(\w[\w-]+) +(\w[\w-]+)
    <- \1 != "fois" and not \2.startswith("seul")
    and ((morph(\1, "po:(?:nom|adj).* is:mas") and morph(\2, "po:(?:nom|adj).* is:fem")) or (morph(\1, "po:(?:nom|adj).* is:fem") and morph(\2, "po:(?:nom|adj).* is:mas")))
    and morph(word(-1), "po:(?:v|prep|nb|proneg)", True, True)
    and not apposition(\1, \2)
    -2> =switchGender(@, True)                                                            # Accord de genre erroné avec « \1 ».

__gn__  des +(\w[\w-]+) +(\w[\w-]+)
    <- morph(\1, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morph(\2, "po:(?:nom|adj).* is:sg")
    and morph(word(-1), "po:(v|prep|nb|proneg)", True, True)
    and not apposition(\1, \2)
    -2> =suggPlur(@)                                                                      # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

## un / une

__gn__  (?<!et |ou | d’)une? +(\w[\w-]+) +(\w[\w-]+)
    <- \1 != "fois" and morph(\1, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morph(\2, "po:(?:nom|adj).* is:pl") and not \2.startswith("seul")
    and not apposition(\1, \2) and not before(r"\b(et|ou|d’) *$")
    -2> =suggSing(@)                                                                      # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__gn__  (?:et|ou) +(?:d’|)une? +(\w[\w-]+) +(\w[\w-]+)
    <- \1 != "fois" and morph(\1, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morph(\2, "po:(?:nom|adj).* is:pl") and not \2.startswith("seul")
    and not apposition(\1, \2)
    and not morph(word(-1), "po:(?:nom|adj|ppas|nb)", False, False)
    -2> =suggSing(@)                                                                      # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

## articles divers

# Genre
__gn__  (?<!et |ou |de )(le|un|cet?|certains|quels?) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:(?:mas|epi)", ":(?:nb|mg|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =suggMasPlur(@)  if \1=="certains"  else suggMasSing(@)                           # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.
__gn__  (?:et|ou|de) +(le|un|cet?|certains|quels) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:(?:mas|epi)", ":(?:nb|mg|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")
    and not apposition(\2, \3)
    and not morph(word(-1), ":(?:nom|adj|ppas|et|ou)", False, False)
    -3> =suggMasPlur(@)  if \1=="certains"  else suggMasSing(@)                           # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.

__gn__  (?<!et |ou |de )([mts]on) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:nb|mg|epi|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =suggMasSing(@)                                                                   # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.
__gn__  (?:et|ou|de) +([mts]on) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:nb|mg|epi|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")
    and not apposition(\2, \3)
    and not morph(word(-1), ":(?:nom|adj|ppas|et|ou)", False, False)
    -3> =suggMasSing(@)                                                                   # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.

__gn__  (?<!et |ou |de )(la|une|[mts]a|cette|certaines|quelles?) +(\w[\w-]+) +(\w[\w-]+)
    <- \2 != "fois" and not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:(?:fem|epi)", ":(?:nb|mg|v0|mas)") and morph(\3, "po:(?:nom|adj).* is:mas")
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =suggFemPlur(@)  if \1=="certaines"  else suggFemSing(@)                          # Accord de genre erroné : « \2 » est féminin, « \3 » est masculin.
__gn__  (?:et|ou|de) +(la|une|[mts]a|cette|certaines|quelles) +(\w[\w-]+) +(\w[\w-]+)
    <- \2 != "fois" and not \3.startswith("seul")
    and morphex(\2, "po:(?:nom|adj).* is:(?:fem|epi)", ":(?:nb|mg|v0|mas)") and morph(\3, "po:(?:nom|adj).* is:mas")
    and not apposition(\2, \3)
    and not morph(word(-1), ":(?:nom|adj|ppas|et|ou)", False, False)
    -3> =suggFemPlur(@)  if \1=="certaines"  else suggFemSing(@)                          # Accord de genre erroné : « \2 » est féminin, « \3 » est masculin.

__gn__  (?<!et |ou |de )([lcmts]es|[nv]os|leurs?|chaque|quelques?) +(\w[\w-]+) +(\w[\w-]+)
    <- \2 != "fois" and not \3.startswith("seul") and not re.match("(?i)quelque chose", \0)
    and ((morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:nb|epi|mg|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")) or (morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:nb|epi|mg|v0|mas)") and morph(\3, "po:(?:nom|adj).* is:mas")))
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =switchGender(@, \1.endswith("s"))                                                # Accord de genre erroné entre « \2 » et « \3 ».
__gn__  (?:et|ou|de) +([lcmts]es|[nv]os|leurs?|chaque|quelques?) +(\w[\w-]+) +(\w[\w-]+)
    <- \2 != "fois" and not \3.startswith("seul") and not re.match("(?i)quelque chose", \0)
    and ((morphex(\2, "po:(?:nom|adj).* is:mas", ":(?:nb|epi|mg|v0|fem)") and morph(\3, "po:(?:nom|adj).* is:fem")) or (morphex(\2, "po:(?:nom|adj).* is:fem", ":(?:nb|epi|mg|v0|mas)") and morph(\3, "po:(?:nom|adj).* is:mas")))
    and not apposition(\2, \3)
    and not morph(word(-1), r":(?:nom|adj|ppas|et|ou)\b", False, False)
    -3> =switchGender(@, \1.endswith("s"))                                                # Accord de genre erroné entre « \2 » et « \3 ».


# Nombre
__gn__  (?<!et |ou |de )(le|la|leur) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morph(\3, "po:(?:nom|adj).* is:pl")
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =suggSing(@)                                                                      # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.
__gn__  (?:et|ou|de) +(le|la|leur) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morph(\3, "po:(?:nom|adj).* is:pl")
    and not apposition(\2, \3)
    and not morph(word(-1), ":(?:nom|adj|ppas|et|ou)", False, False)
    -3> =suggSing(@)                                                                      # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.

__gn__  (?<!et |ou |de )(ce|[mts]on|cette|[nv]otre|ledit|ladite|au|quel(?:le|)) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul") 
    and morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:inv|mg|adv)")
    and not apposition(\2, \3) and not before(r"\b(et|ou|de) +$")
    -3> =suggSing(@)                                                                       # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.
__gn__  (?:et|ou|de) +(ce|[mts]on|cette|[nv]otre|ledit|ladite|au|quel(?:le|)) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:inv|mg|adv)")
    and not apposition(\2, \3)
    and not morph(word(-1), ":(?:nom|adj|ppas|et|ou)", False, False)
    -3> =suggSing(@)                                                                       # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.

__gn__  les +(\w[\w-]+) +(\w[\w-]+)(?! +et)
    <- not \2.startswith("seul")
    and morph(\1, "po:(?:nom|adj).* is:(?:pl|inv)") and morph(\2, "po:(?:nom|adj).* is:sg")
    and not apposition(\1, \2)
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
__gn__  les +(\w[\w-]+) +(\w[\w-]+) +et +(\w[\w-]+)
    <- not \2.startswith("seul")
    and morph(\1, "po:(?:nom|adj).* is:(?:pl|inv)") and morph(\2, "po:(?:nom|adj).* is:sg") and not morph(\3, "po:adj", False)
    and not apposition(\1, \2)
    -2> =suggPlur(@)                                                                       # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

__gn__  ([cmts]es|[nv]os|leurs|quel(?:que|le|)s|plusieurs|certaine?s|lesdite?s|aux|moult) +(\w[\w-]+) +(\w[\w-]+)
    <- not \3.startswith("seul")
    and morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morph(\3, "po:(?:nom|adj).* is:sg")
    and not apposition(\2, \3)
    and not before(r"(?i)\bune? de ")
    -3> =suggPlur(@)                                                                       # Accord de nombre erroné avec « \2 » : « \3 » devrait être au pluriel.


#### 3 mots

## nombre

__gn__  ^ *(\w\w[\w-]+\w) +(\w[\w-]+) +(\w\w[\w-]+)
    <- (morph(\1, "po:(?:nom|adj).* is:pl") and morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)") and morph(\3, "po:(?:nom|adj).* is:sg"))
    or (morph(\1, "po:(?:nom|adj).* is:sg") and morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)") and morph(\3, "po:(?:nom|adj).* is:pl"))
    -3> =switchPlural(@)                                                                      # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.

__gn__  les +(\w[\w-]+) +(\w[\w-]+) +(\w\w[\w-]+)
    <- morph(\1, "po:(?:nom|adj).* is:(?:pl|inv)") and morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)") and morph(\3, "po:(?:nom|adj).* is:sg")
    -3> =suggPlur(@)                                                                      # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.

__gn__  ([cmts]es|[nv]os|leurs|quel(?:que|le|)s|plusieurs|certaine?s|lesdite?s|aux|moult) +(\w[\w-]+) +(\w[\w-]+) +(\w\w[\w-]+)
    <- morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morphex(\3, "po:(?:nom|adj).* is:(?:pl|inv)", "po:mg") and morph(\4, "po:(?:nom|adj).* is:sg")
    and not before(r"(?i)\bune? de ")
    -4> =suggPlur(@)                                                                      # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au pluriel.

__gn__  ^ *(l(?:e(?:ur|dit|)|a(?:dite))|ce(?:t|tte|)|[mts](?:on|a)|[nv]otre|au|quel(?:le|)) +(\w[\w-]+) +(\w[\w-]+) +(\w\w[\w-]+)
    <- morph(\2, "po:(?:nom|adj).* is:(?:sg|inv)", False) and morphex(\3, "po:(?:nom|adj).* is:(?:sg|inv)", "po:mg") and morph(\4, "po:(?:nom|adj).* is:pl")
    -4> =suggSing(@)                                                                      # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au singulier.


#### Quel(le) que soit …

## masculin requis

__gn__  (quelle) que ([sf]\w+) +(le|cet?) +(\w[\w-]+)
    <- morph(\2, "po:v0e", False)
    -1> quel                                                                           # Accord de genre avec « \3 \4 ». Utilisez le masculin.
__gn__  (quelles?) que ([sf]\w+) +(ces|[mts](?:on|ses)|[nv]o(?:tre|s)|leurs?) +(\w[\w-]+)
    <- morph(\2, "po:v0e", False) and morphex(\4, "po:(?:nom|adj).* is:mas", "is:(?:fem|epi)")
    -1> =\1.replace("lle", "l")                                                        # Accord de genre avec « \3 \4 ». Utilisez le masculin.

## féminin requis

__gn__  (quel) que ([sf]\w+) +(la|cette|[mts]a) +(\w[\w-]+)
    <- morph(\2, "po:v0e", False)
    -1> quelle                                                                         # Accord de genre avec « \3 \4 ». Utilisez le féminin.
__gn__  (quels?) que ([sf]\w+) +(ces|[mts](?:on|ses)|[nv]o(?:tre|s)|leurs?) +(\w[\w-]+)
    <- morph(\2, "po:v0e", False) and morphex(\4, "po:(?:nom|adj).* is:fem", "is:(?:mas|epi)")
    -1> =\1.replace("l", "lle")                                                        # Accord de genre avec « \3 \4 ». Utilisez le féminin.


#### Divers

# L’accord par syllepse est obligatoire après /la plupart/, ainsi qu’après /nombre/ et /quantité/ employés sans déterminant. L’accord se fait avec le « pseudo-complément ».

## quelque adverbe
quelques(?= \d+) -> quelque                                                 # Devant un nombre, « quelque » est un adverbe, donc invariable.
(quelques) +(\w+) <- morph(\2, "po:nb.* is:pl", False) -1> quelque          # Devant un nombre, « quelque » est un adverbe, donc invariable.

## divers
__gn__  de tel(s|les|) sorte(s|nt|) -> de telle sorte                       # Accord erroné.



############################## SINGULIERS & PLURIELS ##############################

[Word]

### Prépositions

# Similaires à prépositions : http://www.synapse-fr.com/manuels/PP_ATTENDU.htm
# attendu, compris, non-compris, y compris, entendu, excepté, ôté, ouï, passé, supposé, vu
# ! problème avec l’ouïe, ouï retiré de la liste
[word]
__sgpl__  ^ *((Compris|Non[- ]compris)es?) +(?:[lc]es?|la|cette|leurs?)
    -1> \2                                                                             # Considéré comme préposition, invariable.
__sgpl__  ^ *((Entendu|Excepté|Ôté|Supposé|Passé)(?:es?|s)) +(?:[lc]es?|la|cette|leurs?)
    -1> \2                                                                             # Considéré comme préposition, invariable.
[Word]
__sgpl__  (attendu(?:es?|s)) que? <- not word(-1) -1> attendu                        # Considéré comme préposition, invariable.
__sgpl__  étant donné(?:es?|s) <- not word(-1) -> étant donné                        # Considéré comme préposition, invariable.
__sgpl__  (vu(?:es?|s)) (?:[lc]es?|la|cette|leurs?|que?) <- not word(-1) -1> vu      # Considéré comme préposition, invariable.


### Nombres cardinaux

# vingt
__sgpl__  vingts <- not before(r"(?i)\bquatre ")
    -> vingt                                                                # “Vingt” ne prend la marque du pluriel que dans “quatre-vingts”.
__sgpl__  quatre[- ]vingt
    <- not morph(word(1), "po:nb") and not before(u"(?i)\\b(?:numéro|page|chapitre|référence|année|test|série)s? +$")
    -> quatre-vingts                                                        # Mettre « vingt » au pluriel, excepté s’il s’agit d’une référence (page, chapitre, année…).
__sgpl__  quatre-(vingts)-(?:deux|trois|quatre|cinq|six|sept|huit|neufs?|dix|onze|douze|treize|quatorze|quinze|seize)
    -1> vingt                                                               # Mettez « vingt » au singulier.

# neuf
__sgpl__  (dix|vingt|trente|quarante|cinquante|soixante|soixante-dix|quatre-vingt|quatre-vingt-dix)-neufs
    -> \1-neuf                                                              # Pas de “s”.

# cent
__sgpl__  (deux|trois|quatre|cinq|six|sept|huit|neuf) (cent)
    <- not morph(word(1), "(?:po:nb|st:une?)", False, True) and not before(u"(?i)\\b(?:numéro|page|chapitre|référence|année|test|série)s? +$")
    -2> cents                      # Mettre « cent » au pluriel (centaines entières), excepté s’il s’agit d’une référence (page, chapitre, année…).|http://fr.wiktionary.org/wiki/cent
__sgpl__  (deux|trois|quatre|cinq|six|sept|huit|neuf|mille) (cents)
    <- morph(word(1), "(?:po:nb|st:une?)", False, False)
    -2> cent                       # Nombre cardinal : pas de “s” à “cent” (hormis sur les centaines entières).|http://fr.wiktionary.org/wiki/cent
__sgpl__   (cents) (\w[\w-]+)
    <- morphex(\2, "po:(?:nom|adj).* is:(?:pl|inv)", "po:mg") and morphex(word(-1), "po:(?:v|prep)", "po:nb", True)
    -1> cent                       # Nombre cardinal : pas de “s” à “cent” (hormis sur les centaines entières).|http://fr.wiktionary.org/wiki/cent

# mille
__sgpl__  milles <- morph(word(1), "po:nb") or (morph(word(-1), "po:nb") and morph(word(1), "po:(?:nom|adj)", False))
    -> mille                       # « Mille » est invariable s’il s’agit d’un nombre (et non de l’unité de mesure maritime).


### Locutions

# affaires
__sgpl__  chiffres? d’(affaire) -1> affaires                                # Le chiffre d’affaires. Toujours un “s” final.
__sgpl__  (f[aieî]\w+) (affaires) avec <- "faire" in stem(\1)
    -2> affaire                                                            # « Faire affaire avec ». Pas de “s”.
__sgpl__  (f[aieî]\w+) (affaire) (?:à|en) ([A-ZÉ][\w-]+) <- "faire" in stem(\1) and morph(\3, "po:(?:nom|npr)")
    -2> affaires                                                           # Ajoutez un “s” à « affaire ».

# ayants droit
__sgpl__  [ldc]es (ayant[- ]droits?) -1> ayants droit                       # Au singulier : « un ayant droit ». Au pluriel : « des ayants droit ».

# boisson
__sgpl__  débits? de (boisson) -1> boissons                                 # Il manque un “s” à « boisson ».

# carnet
__sgpl__  carnet de (chèque|note|timbre|ticket|vacance) -1> \1s             # Il manque un “s”.

# cor / cri
__sgpl__  à cors? et à cris -> à cor et à cri                               # Locution adverbiale invariable.

# demi-heure, heure et demie
__sgpl__  demi(?:e[- ]| )heure(s|) -> demi-heure\1                          # « Une demi-heure ».
__sgpl__  heures? et (demi(?:s|es|)) -1> demie                              # « Une heure et demie », « deux heures et demie », etc.

# dévolu
__sgpl__  jet\w+ +(leurs dévolus) -1> leur dévolu                           # « Jeter son dévolu » : au singulier.

# escalier
__sgpl__  cages? d’(escaliers) -1> escalier                                 # Pas de “s” à escalier.

# collet monté
__sgpl__  (\w+) (collets[- ]montés) <- morph(\1, "po:(?:v0e|adv)", False) or \1 == u"très"
    -2> collet monté                                                       # « Être collet monté » : dans cette locution, « collet monté » est invariable.

# coûter cher
__sgpl__  ((?:co[uû]t|pa)\w+) +(chers|chères?|chaire?s?) <- stemchk(\1, u"^(co[ûu]ter|payer)$", False)
    -2> cher                                                               # Ici, « cher » est un adverbe, invariable.

# en générale
__sgpl__  en générale -> en général                                         # Cette locution s’écrit : « en général ».

# par intermittence
__sgpl__  par (intermittences) -1> intermittence                            # « Par intermittence ».

# par intervalles
__sgpl__  par (intervalle) -1> intervalles                                  # « Par intervalles ».

# donner lieu
__sgpl__  (donn\w+) +(lieux) <- stemchk(\1, "^donner$", False)
    -2> lieu                                                               # « Donner lieu » : lieu est invariable dans cette locution verbale.

# eux-mêmes, elles-mêmes
__sgpl__  (eux|elles)-(même) -2> mêmes                                      # Il manque un “s” à même.

# nu
__sgpl__  (m\w+) +([aà] nu(e|s|es)) <- stemchk(\1, "^(mettre|mise)$", False)
    -2> à nu                                                               # « nu » est invariable dans cette locution.

# à parts égales
__sgpl__  à part égale? -> à parts égales                                   # Il y a plusieurs parts.
__sgpl__  [àa] moindre frais? -> à moindres frais                           # Lorsqu’on parle des dépenses, “frais” est un pluriel.

# pied
__sgpl__  ([aeop]\w*) (?:pas |)(pieds) <- stemchk(\1, "^(avoir|perdre)$", False)
    -2> pied                                                               # Pas de “s” final.
__sgpl__  à (pieds) <- not before(u"(?i)\\b(lit|fauteuil|armoire|commode|guéridon|tabouret|chaise)s?\\b")
    -1> pied                                                               # Pas de “s” final.
__sgpl__  (?:à|aux) pieds? levée?s? -> au pied levé                         # Locution adverbiale invariable.

# plein
__sgpl__  (pleins) de?
    <- morphex(word(-1), "po:(?:v|(?:nom|adj).* is:sg)", "is:(?:pl|inv)", True)
    -1> plein                                                               # Au singulier.

# pleines dents
__sgpl__  [àa] (pleine dents?|pleines? dent) -> à pleines dents             # Toujours au pluriel.

# possible
__sgpl__  autant (?:(?:de |d’)[\w-]+ |)que (possibles) -1> possible         # Invariable. Implicitement, autant que ce qui est possible.

# quelque
__sgpl__  (quelques) temps -1> quelque temps                                # « Quelque temps » : un temps indéterminé, pas de « s ».

# rafales
__sgpl__  (?:par|en) (rafale) -1> rafales                                   # Par rafales, en rafales.

#sans (crainte|défense)s -> sans \1                                         # En général, pas de pluriel.

# par souci de
__sgpl__  par (soucis) (?:de|d) -1> souci                                   # Invariable dans cette locution.

# termes
__sgpl__  en (terme) (?:de|d) -1> termes                                    # Au pluriel.

# tous / tout / toutes
__sgpl__  tout azimuts? -> tous azimuts                                     # « Tous azimuts » signifie « dans toutes les directions ».
__sgpl__  une (?:bonne |)fois pour (toute) -1> toutes                       # Il manque un “s”. Sous-entendu : une fois pour toutes les autres fois.

# vacances
__sgpl__  bonne vacance -> bonnes vacances                                  # Au pluriel.
__sgpl__  (\w+) +en (vacance) <- stemchk(\1, "^(aller|partir)$", False)
    -2> vacances                                                           # Si vous parlez des congés, « vacance » doit être au pluriel.

# vu / vue
__sgpl__  points? de (vu(?:s|es)) -1> vue                                   # Au singulier.



############################## CONFUSIONS, HOMONYMES ET FAUX-AMIS ###############################

[Word]


__conf__  (?<![dDt]’)(je|tu|il|elle|on|ils|elles) (\w[\w-]+)
    <- not re.match(u"(?i)([lmtsn]|soussignée?s?|seule?s?)$", \2) and morph(\2, "po:(?:nom|adj|ppas)") and not morph(word(-1), "po:v0")
    -2> _                                                                      # Incohérence avec « \1 » : « \2 » est un nom, un adjectif ou un participe passé.


# acquis / acquit
__conf__  par (acquis) de conscience -1> acquit                                                             # Confusion. On écrit « par acquit de conscience ».
__conf__  (t\w+) +pour (acquit) <- stem(\1) == ["tenir"] -2> acquis                                         # Confusion. On écrit « tenir pour acquis ».

# affilée / affilé
__conf__  d’affilé -> d’affilée                                                                             # Locution.

# à faire / affaire
#__conf__  à faire (à|avec) <- morph(word(-1), "po:v0a") -> affaire \1                                      # Confusion.

# amende / amande
__conf__  yeux en (amendes?) -1> amande                                                                     # Confusion.
__conf__  (m\w+) à (l’amande) <- "mettre" in stem(\1) -2> l’amende                                          # Confusion. L’amande est un fruit.
__conf__  (f\w+) (amandes? honorables?) <- "faire" in stem(\1) -2> amende honorable                         # Confusion. L’amande est un fruit.

# annales / anal-e-s
__conf__  (anale?s?) (littéraires?|politiques?|ecclésiastiques?|du (bac(?:calauréat|)|brevet)|de (physique|chimie|mathématiques|biologie|géographie)|d’histoire)
    -1> annales                                                 # Confusion : “\1” est l’adjectif relatif à l’anus.|http://fr.wiktionary.org/wiki/annales 
__conf__  (les|ces|des) (anale?s?)
    -2> annales                                                 # Confusion : “\2” est l’adjectif relatif à l’anus.|http://fr.wiktionary.org/wiki/annales

# avion / avions
__conf__  nous (avion) -1> avions                                                                           # Confusion probable : l’avion est un appareil volant.

# bât / bas
__conf__  le (ba[st]) bless\w+ -1> bât                                                                      # Confusion : là où le bât blesse.|http://fr.wiktionary.org/wiki/b%C3%A2t

# bel et bien
__conf__  (belle) et bien (?!que?|sûr) <- not morph(word(1), "po:(?:adj|ppas)")
    -1> bel                                                                                                # Confusion. « Bel et bien » est équivalent à « vraiment ».

# bite / bitte
__conf__  (bite) (?:d’amarrage|du quai|sur le quai) -1> bitte                                               # Bitte d’amarrage

# en butte à / but / bute
__conf__  en bute?s? +(à|aux?) -> en butte \1                                                               # Confusion. Écrivez « en butte \1 ».

# chair / chère
__conf__  (f[aioîe]\w+) +(bonnes? ch(?:ai|e)re?) <- "faire" in stem(\1) -2> bonne chère         # Confusion. « Faire bonne chère » signifie bien manger, ripailler.

# compte / comte / conte
__conf__  (co[mn]tes?) (?:à rebours|bancaires?) -1> compte|comptes                              # Confusion.

# content / comptant
__conf__  ([aeo]\w*) (?:tout |)(?:[mts]on|[nv]otre|leur) (comptant) <- morph(\1, "po:v0a", False)
    -2> content                                                                                # Confusion. Avoir (tout) son content…

# cor / corps
__conf__  [àa] corp?s et [àa] cris? -> à cor et à cri                                           # Locution adverbiale invariable.

# cour / cours / court
__conf__  au (court?) (?:des?|du|d) -1> cours                                                   # Confusion probable.
__conf__  en cour(?! martiale?) -> en cours                                                     # Confusion probable.
__conf__  (coup\w+) (cours?) <- stem(\1) == ["couper"] -2> court                                # « Couper court ». Écourter.
__conf__  (\w+) +libre (court?) <- stemchk(\1, "^(?:avoir|donner)$", False) -2> cours           # Confusion probable.
__conf__  à cours? de -> à court de                                                             # Confusion probable : écrivez « à court de … » pour « manquer de … »
__conf__  à cour(?:s|ts|) termes? -> à court terme                                              # Confusion.

# davantage / d’avantage
__conf__  (?:peu|plein|beaucoup|trop|plus|moins|assez|suffisamment|tellement|obtentions?|régimes?) (davantage)
    -1> d’avantages                                                                            # Confusion probable.
__conf__  (\w+) (d’avantages?) <- morph(\1, "po:v.\w+ is:(?!ppas)") -2> davantage               # Confusion probable.
__conf__  (?:[\w-]+)-(?:je|tu|ils?|elles?|[nv]ous|on) (d’avantages) -1> davantage               # Confusion probable.
__conf__  (d’avantages?) (?:de|du|d) -1> davantage                                              # Confusion possible.
#__conf__  ([êeésf]\w+) d’avantages? <- morph(\1, "po:v0e", False) -> \1 davantage              # Confusion possible.

# dés / dès
__conf__  (dés) (le|la|les|que?|lors|avant|toujours|demain) <- not re.match("(?i)[dlmts]es|[nv]os|leurs$", word(-1)) -1> dès     # Confusion.

# différend / différent
__conf__  (?:[mts]on|[vn]otre|leur) +(différent) <- morphex(word(1), "po:(?:mg|v)", "po:(?:nom|adj|ppas)", True)
    -1> différend                                                                              # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__conf__  un différent <- morphex(word(1), "po:(?:mg|v)", "po:(?:nom|adj)")
    -> un différend                                                                            # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__conf__  (?:leurs|[mts]es|[nv]os) (différents) <- morphex(word(1), "po:(?:mg|v)", "po:(?:nom|adj)", True)
    -1> différends                                                                             # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__conf__  (?:[ld]es) (différents) <- morphex(word(1), "po:mg", "po:(?:nom|adj)")
    -1> différends                                                                             # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__conf__  ([êeésf]\w+) +(?:pas +|)(?:si +|)(différend(s|)) <- morph(\1, "po:v0e", False)
    -2> différent\3                                                                            # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.

# en train / entrain
__conf__  entrain <- morph(word(-1), "po:v0e", False) -> en train                               # Confusion.

# envi / envie
__conf__  à l’(envie)
    <- not stemchk(word(-1), u"^(?:abandonner|céder|résister)$", False) -1> envi                 # Locution adverbiale « à l’envi », signifiant « autant que possible ».

# aire / ère
__conf__  aire (?:glacière|glaciaire) -> ère glaciaire                                          # Confusion : « ère » est une époque, « aire » une surface.
__conf__  (aire) (?:baroque|numérique) -1> ère                                                  # Confusion : « ère » est une époque, « aire » une surface.

# chant / champ
la (cha(?:nt|mp)s? de l’heure?) -1> Chandeleur                                                  # Confusion : la Chandeleur est une fête.|http://fr.wikipedia.org/wiki/Chandeleur
(chants?) de (?:blé|betteraves?|fleurs|maïs|tournesols?|tulipes|force)
    -1> =\1.replace("nt", "mp")                                                                 # Confusion probable. Un chant est ce qui se chante.|http://fr.wiktionary.org/wiki/champ

# colon / côlon
__conf__  cancer du (colon) -1> côlon                                                           # Confusion : le côlon est un segment du gros intestin, le colon colonise.

# censé / sensé
__conf__  ([êeésf]\w+) +(sensée?s?) +(\w[\w’-]+)
    <- morph(\1, "po:v0e", False) and morph(\3, "po:infi", False)
    -2> =\2.replace("sens", "cens")                                                            # Confusion : « sensé » se dit de quelqu’un de « bon sens ».

# côté / coté
__conf__  (à|au|autres?|bon|mauvais|les?|de|ce|du|[mts](?:on|es)|[nv]otre|chaque|un|leurs?) (cotés?)
    -2> =\2.replace("o", u"ô")                                                                 # Confusion : « coté » est le participe passé du verbe « coter ».

# cote / côte
__conf__  (cote) de (?:bœuf|porc|veau)[sx]? -1> côte                                           # Confusion : « cote » est un terme servant à chiffrer.|http://fr.wiktionary.org/wiki/cote
__conf__  (côte) (?:mobilière|foncière|de (?:niveau|popularité)|d’(?:alerte|altitude|amour))
    -1> cote                                                                                   # Confusion : utilisez « cote » pour chiffrer.|http://fr.wiktionary.org/wiki/cote
__conf__  ([aeo]\w*) +la (côte) <- morph(\1, "po:v0a", False) -2> cote                         # Confusion probable : utilisez « cote ».|http://fr.wiktionary.org/wiki/cote    

# desceller / déceler / desseller
(erreurs?|fautes?|incohérences?) .*(des[cs]ellées?)
    -2> =\2.replace("descell", u"décel").replace("dessell", u"décel")                          # Confusion probable si ce mot se rapporte à « \1 ». Desceller signifie briser un sceau, un cachet… Desseller signifie ôter une selle.|http://fr.wiktionary.org/wiki/déceler

# faite / faîte / fait
__conf__  vous +(?:ne |)(faîtes?) -1> faites                                                    # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
__conf__  faîtes?[- ]vous -> faites-vous                                                        # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
__conf__  ([aeêésfo]\w*) +(faîte(s|))
    <- morph(\1, "po:v0", False)
    -2> faite\3                                                                                 # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
__conf__  en fa[iî]te -> en fait                                                                # Confusion probable. « En fait » = « en réalité ».

# flamant rose
__conf__  (flamands?) roses? -1> =\1.replace("and", "ant")                                      # Confusion. Flamand = habitant des Flandres. Flamant = oiseau.

# foi / fois
__conf__  (mauvaise|bonne) (fois)
    <- not ( \1 == "bonne" and before("(?i)\\bune +$") and after("(?i)^ +pour toute") ) 
    -2> foi                                                       # Confusion probable.|http://fr.wiktionary.org/wiki/foi
__conf__  ((?:f|perd)\w+) (fois) <- stemchk(\1, "^(?:faire|perdre)$") -2> foi                   # Confusion probable.|http://fr.wiktionary.org/wiki/foi

# fond / fonds
__conf__  à (fond) perdus? -1> fonds                                                            # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__conf__  (fond) (?:monétaire|de (?:commerce|garantie|roulement|pension|placement|roulement|solidarité)|d’aide)
    -1> fonds   # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__conf__  (fonds) baptismaux -1> fonts                                                          # Confusion. « Fonts » vient du latin « fons », qui signifie « fontaine, source ».

# glaciaire / glacière
__conf__  (\w+) (glaciaires?) <- morph(\1, "po:det") -2> glacière                               # Confusion : « glaciaire » est un adjectif.
__conf__  ère (glacière) -1> glaciaire                                                          # Confusion : une glacière est un contenant préservant le froid.

# en son for intérieur / fort
__conf__  (?:en|dans) (?:[mts]on|leur|[nv]otre) (forts? intérieurs?) -1> for intérieur          # Confusion : “for” vient du latin “forum” et le “for intérieur” évoque la conscience individuelle.

# gène / gêne
__conf__  sans[- ]gènes? -> sans-gêne                                                           # Confusion. Gène = élément des chromosomes. Gêne = embarras.
__conf__  [lmts]es (gênes) -1> gènes                                                            # Confusion probable. Gène = élément des chromosomes. Gêne = embarras.

# gent [nf] / gent(e)(s) [adj]
__conf__  la (gente) (?:féminine|masculine) -1> gent                                            # Confusion. « Gente » est un adjectif vieilli. Utiliser « gent » pour désigner un groupe de personnes.

# golf / golf
__conf__  (champion(?:ne|nat|)s?|clubs?|joueu(?:r|se)s?|parcours|sacs?|balles?|terrains?|tournois?|compétitions?|passionnée?s?|écoles?|professeurs?|parties?|professionel(?:le|)s?|amateure?s?|stages?|journées?|après-midi|matinées?|heures?|fédérations?|fans?) de (golfe)
    -2> golf                                                       # Confusion. Le golfe est une zone de mer ou d’un lac avancée dans les terres. Ex : Le golfe Persique.
__conf__  (golf) (persique|d[ue] (?:Bengale|Botnie|Gascogne|Gabès|Guinée|Lion|Morbihan|Mexique|Porto|Saint-Laurent|Thaïlande|Tonkin|Tunis|Winam)|d’(?:Aden|Ajaccio|Alaska|Hammamet))
    -1> golfe                                                                                   # Confusion. Le golf est un sport.
__conf__  (guerre|émir|monarchie)s? du (golf) -2> Golfe                                         # Confusion. Le golf est un sport.          	

# gré / grès
__conf__  à (?:[mts]on|[nv]otre|leur) (grès) -1> gré                                            # Confusion probable. Le grès est une roche.
__conf__  bon grès(,|) mal grès -> bon gré\1 mal gré                                            # Confusion : « bon gré mal gré » signifie « que cela convienne ou non ».
__conf__  au (grès) d(?:es?|u) -1> gré                                                          # Confusion probable. Le grès est une roche.
__conf__  de (grès) ou de force -1> gré                                                         # Confusion. Le grès est une roche.
__conf__  de (?:bon|mauvais|(?:[mts]on|[nv]otre|leur) plein) (grès) -1> gré                     # Confusion. Le grès est une roche.
__conf__  contre (?:[mts]on|[nv]otre|leur) (grès) -1> gré                                       # Confusion probable. Le grès est une roche.
#savoir gré à quelqu’un « lui être reconnaissant »
#au gré de quelqu’un, « selon son goût, son désir »

# la / là
__conf__  (celles?|celui|ceux)[ -]la -> \1-là                                                   # Écrivez “là” et non “la”.
__conf__  (\w\w+)-(là) <- morph(\1, "po:v", "po:(?:nom|adj)") -2> la                            # Confusion : pour un COD, utilisez “la”.
__conf__  (\w\w+)-(la) <- morph(\1, "po:(?:nom|adj)", "po:[123](?:sg|pl)") -2> là               # Confusion : « \1 » n’est pas un verbe.
__conf__  [nmts]e (là) -1> la                                                                   # Confusion : “là” signifie “ici”.|http://fr.wiktionary.org/wiki/l%C3%A0

# la / l’a
__conf__  (il|elle|on) (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+)
    <- morphex(\3, "po:[1-3](?:sg|pl)", "po:(?:ppas|mg)")
    -2> la                                                                                                                          # Confusion probable.
__conf__  ne (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+) <- morphex(\2, "po:[1-3](?:sg|pl)", "po:(?:ppas|mg)") -1> la     # Confusion probable.
__conf__  ne (l’a) l(?:ui|eur) -1> la                                                                                               # Confusion probable.
__conf__  [mts]e (l’a) +([bcdfghjklmnpqrstvwxz][\w-]+) <- morphex(\2, "po:[1-3](?:sg|pl)", "po:(?:ppas|mg)") -1> la                 # Confusion probable.

# laissez-passer / laissez-faire
__conf__  laisser-passer -> laissez-passer                                                      # Confusion.
__conf__  laissez-(aller|faire) -> laisser-\1                                                   # Confusion.

# leur / leurs
__conf__  (\w+) (leurs) (\w+) <- morph(\3, "is:infi") and not re.match("(?i)[ld]es", \1) -2> leur    # Confusion.

# levée / lever
__conf__  levée?(?= de rideau) -> lever                                                         # Confusion.
__conf__  levée?(?= d[eu] soleil) -> lever                                                      # Confusion.

# lever un lièvre / soulever
__conf__  (sou(l\w+)) (?:un|le) lièvre <- "soulever" in stem(\1) -1> \2                         # Expression impropre. |http://fr.wiktionary.org/wiki/lever_le_li%C3%A8vre

# lieux / lieues / lieus
__conf__  (assurances?|états?|visites?|ma[îi]tres?|seigneurs?|magie|chefs?|responsables?|respect|entretien|propreté|propriétaires?|tranquillité|dans|vers|plans?) des (lieue?s)
    -2> lieux                                      # Confusion probable. Pour désigner un endroit, utilisez “lieux”.|http://fr.wiktionary.org/wiki/lieu
__conf__  (lieue?s) (?:aménagée?s|abandonnée?s|accueillante?s|insolites|accessibles|inaccessibles|inexplorée?s|éloignée?s|lointains|louches|réservée?s|proches|touristiques|saints|sacrée?s|connue?s|inconnue?s|méconnue?s|privilégiée?s|mythiques|publics|privée?s|prestigieux|romantiques|stratégiques|historiques|où|humides|secs|de (?:communication|contemplation|culte|chasse|détente|détention|départ|méditation|mémoire|pouvoir|prière|prostitution|sépulture|repos|refuge|stockage|travail|vacances?|spectacles?|conférences?|rassemblements?|stationnement|rencontres?|villégiature))
    -1> lieux                                      # Confusion probable. Pour désigner un endroit, utilisez “lieu(x)”.|http://fr.wiktionary.org/wiki/lieu
__conf__  ((?:[eêsf]|demeur|habit|trouv|situ|rest)\w+) à (?:dix|vingt|cent|mille|des|\d+) (lieu[sx])
    <- stemchk(\1, "^(?:être|habiter|trouver|situer|rester|demeurer?)$")
    -2> lieues                                     # Confusion probable. Pour désigner une distance, utilisez “lieues”.|http://fr.wiktionary.org/wiki/lieue

# en général
__conf__  en (générale) -1> général                                                             # Expression impropre. Écrivez :

# mare / marre
__conf__  (?:la|une) (marre) -2> mare                                                           # Confusion. Une mare est une étendue d’eau. En avoir marre de = en avoir assez de.

# n’est-ce pas - ai / es / est
__conf__  n’(es|ai[et]?)[- ]ce[- ]pas -> n’est-ce pas                                           # Erreur de conjugaison.

# notre / nôtre -- votre / vôtre
__conf__  (?:les?|la|du|des|aux?) ([nv]otres?) -1> =\1.replace("otre", u"ôtre")                 # Confusion : « notre possession », « la nôtre ».
__conf__  [nv]ôtres?
    <- not re.match("(?i)les?|la|du|des|aux?", word(-1)) and morph(word(1), "po:(?:nom|adj)")
    -> =\0.replace(u"ôtre", "otre").replace("s", "")                                            # Confusion : « notre possession », « la nôtre ».
# Hunspell corrige déjà les formes au pluriel (les nôtres).
## prep/verb + nôtre + nom

# nulle part
__conf__  nul part <- not morph(word(-1), "po:det") -> nulle part                               # Confusion : « nulle part » = en aucun lieu.

# mi / mis
__conf__  ([aeo]\w*) +(mie?) <- morph(\1, "po:v0a", False) -2> mis                              # Confusion. Pour le participe passé de mettre, écrivez :
__conf__  (mie?) en (?:abyme|bouteilles?|cause|demeure|évidence|examen|f[ûu]ts?|images?|liquidation|mémoire|musique|œuvres?|paiement|place|pièces?|quarantaine|scène|tonneaux?|service|valeur)
    -1> mis                                                                                    # Confusion. Pour le participe passé de mettre, écrivez :
__conf__  (mie?) à (?:jours?|pieds?|dispositions?|part|mal|nue?|contribution|rude|mort)
    -1> mis                                                                                    # Confusion. Pour le participe passé de mettre, écrivez :

# on / ont
__conf__ (ont) [nmts]’
    <- not word(-1)
    -1> on                                                                                             # Confusion probable : “ont” est une conjugaison du verbe avoir.
__conf__  (ont) (\w[\w’-]*)
    <- ( re.match("[nmts]e$", \2) or
    (not re.match(u"(?i)(?:confiance|envie|peine|prise|crainte|affaire|hâte|force|recours)$", \2) and morphex(\2, "po:[1-3](?:sg|pl)", "po:(?:adj|mg)")) )
    and not word(-1)
    -1> on                                                                                             # Confusion probable : “ont” est une conjugaison du verbe avoir.
__conf__  [nmtsl]’(?:y|en) (on) -1> ont                                                                # Confusion. Exemples : « on y va », « ils ont faim ».
__conf__  ne l’(on) -1> ont                                                                            # Confusion. Exemples : « on y va », « ils ont faim ».
__conf__  qui +(on) <- not morph(word(-1), "po:(?:prep|v)", False, False) and not after("^ +>") and not morph(word(1), "po:3sg", False)
    -1> ont                                                                                            # Confusion probable. Exemples : « on y va », « ils ont faim ».

# ou / où
__conf__  ^(Ou) (\w[\w-]+) <- morph(\2, "po:v.\w+ is:(?!infi)") -1> Où                          # Confusion probable. Utilisez “où” pour “en quel lieu”.
__conf__  ^(Ou) ([eéêsf]\w+) <- morphex(\2, "po:v0e", "po:infi")
    -1> Où                                                                                     # Confusion probable. Utilisez “où” pour “en quel lieu”.
__conf__  (?:au moment|par) (ou) -1> où                                                   # Confusion. On écrit “ceci ou cela” mais “où aller ?”
__conf__  vers (ou) <- not morph(word(-1), "po:det", False, False) -1> où                       # Confusion probable. On écrit “ceci ou cela” mais “où aller ?”

# pair / paire
__conf__  ((?:all|v|ir)\w+) de (pair(e|s|es)|perd?s?) <- "aller" in stem(\1) -2> pair           # Confusion. On écrit « aller de pair ».

# pâle / pale
([eéêsf]\w+) +(pales?) <- morph(\1, "po:v0e", False)
    -2> =\2.replace("pal", u"pâl")            # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale
(airs?|lu(?:mière|eur)s?|teinte?s?|co(?:loris|uleurs?)|peaux?|visages?|bleus?|rouges?|jaunes?|verts?|gris|oranges?|violets?|pourpres?) +(pales?)
    -2> =\2.replace("pal", u"pâl")            # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale

# parti / partie
__conf__  (pr\w+) (parti(?:s|es?)) <- "prendre" in stem(\1) -2> parti                           # Confusion. On écrit « prendre parti ».
__conf__  (tir\w+) (parti(?:s|es?)) <- "tirer" in stem(\1) -2> parti                            # Confusion. On écrit « tirer parti ».
__conf__  (f[aieoî]\w+) (parti(?:s|es|)) <- "faire" in stem(\1) -2> partie                      # Confusion. On écrit « faire partie ».
__conf__  juges? et partis? -> juge et partie|juges et parties                                  # Confusion. On écrit « être juge et partie ».
__conf__  (pr\w+) +(?:[\w’-]+ +|)([àa] partis?) <- "prendre" in stem(\1) -2> à partie           # Confusion. On écrit « prendre à partie ».

# pâte / patte
__conf__  (?:coqs?) en (pattes?) -1> pâte                                                       # Confusion. Patte = jambe. Pâte = matière pâteuse.

# peu / peux / peut
__conf__  (peu[xt]) (?:de |d’)(\w\w+) <- morph(\2, "po:(?:nom|adj)") -1> peu                    # Confusion probable : « \1 » est une conjugaison de « pouvoir ».
__conf__  ^ *(peu[tx]) importe(nt|) <- not word(-1) -1> peu                                     # Confusion : « \1 » est une conjugaison de « pouvoir », utilisez « peu ».
__conf__  (?:très|trop|de|quelque|pour|à) (peu[tx]) -1> peu                                     # Confusion : « \1 » est une conjugaison de « pouvoir », utilisez « peu ».
__conf__  (?<![^dDlL]’)un (peu[xt]) -1> peu                                                     # Confusion : « \1 » est une conjugaison de « pouvoir », utilisez « peu ».
__conf__  peu[xt]? a peu[xt]? -> peu à peu                                                      # Confusion : « peu à peu » ou « petit à petit ». 
__conf__  (?:[iI]l|[oO]n) (?:ne |)(peu) -1> peut                                                # Confusion : « peu » signifie « pas beaucoup ».
__conf__  (?:[jJ]e|[tT]u) (?:ne |)(peu) -1> peux                                                # Confusion : « peu » signifie « pas beaucoup ».
__conf__  (peu[tx]) (\w[\w-]+)
    <- morph(\2, "po:adj") and not re.match("(?i)seule?s?$", \2) -1> peu                        # Confusion probable : « \1 » est une conjugaison de « pouvoir », utilisez « peu ».

# peut-être / peut être
__conf__  (\w+) (peut être) <- morphex(\1, "po:v", "po:(?:nom|adj|ppas|mg|npr)") -2> peut-être  # Confusion probable.
__conf__  ^ *(peut être) -1> peut-être                                                          # Confusion probable.

# plain / pied
__conf__  (de|au) (pleins?[- ]pieds?) -2> plain-pied                                            # Écrivez « \1 plain-pied ». Plain (vieux) : qui est plat, uni.

# la plupart
__conf__  la (plu[st][ -]part) -1> plupart                                                      # Confusion : « la plupart » = la majeure partie.

# pôle / pole
__conf__  pole(?! position) -> pôle                                                             # « pole », uniquement pour la « pole position ».

# prêt / près
__conf__  (prêts?) de (\w[\w-]+) <- morph(\2, "po:(?:infi|patr|prn|npr)") -1> près              # Confusion. Être près de (faire) quelque chose. Prêt à faire quelque chose.
__conf__  (près) à (\w[\w-]+) <- word(-1) != "peu" and morph(\2, "po:infi") -1> prêt|prêts      # Confusion. Être près de (faire) quelque chose. Prêt à faire quelque chose.
__conf__  [àa] peu[tx]? pr(?:êt|é)s? -> à peu près                                              # Confusion. Le prêt est un bien qu’on accorde temporairement à quelqu’un. Le pré est un champ d’herbe.

# pot aux roses / poteau rose
__conf__  poteau rose -> pot aux roses                                                          # Confusion probable. On dit : « découvrir le pot aux roses ».|http://fr.wiktionary.org/wiki/d%C3%A9couvrir_le_pot_aux_roses

# pu / pus
__conf__  ([aeo]\w*) (pu(?:es?|s)) <- morph(\1, "po:v0a", False) -2> pu                         # Confusion. Pour le participe passé de pouvoir, écrivez :

# quand / quant / qu’en
__conf__  (?<![dD]e )(quand) (?:à|aux?) -1> quant                                               # Confusion probable. Quand = à quel moment. Quant à = à propos de.
__conf__  (quant)(?! à| aux?| est[ -]il d(?:es?|u) ) -1> quand                                  # Confusion. Quand = à quel moment. Quant à = à propos de.
__conf__  (quan[dt]) est[ -]il d(?:es?|u) -1> qu’en                                             # Confusion. Ce qu’il en est de… → Qu’en est-il de… ?

# quand même / comme même
__conf__  (comme même) *$ -1> quand même                                                        # Confusion.|http://fr.wiktionary.org/wiki/quand_m%C3%AAme
__conf__  (\w+) (comme même) <- morphex(\1, "po:v", "po:ppas") -2> quand même                   # Confusion probable.|http://fr.wiktionary.org/wiki/quand_m%C3%AAme

# quel que soit / quoi qu’il en soit
__conf__  quelques? soi(?:ent|t|s|) -> quel que soit|quelle que soit|quels que soient|quelles que soient            # Confusion.
__conf__  quoiqu il en soit <- not morph(word(1), "po:adj", False) -> quoi qu’il en soit                            # Confusion.

# quelque part
__conf__  quel(?:le|)s? que par[ts]? -> quelque part                                            # Confusion probable.

# quelquefois / quelques fois
#__conf__  quelques? fois(?! au cours| par)
#    <- not morph(word(-1), "po:det", False, False)
#    -> quelquefois       # Confusion probable : « quelquefois » est un adverbe qui signifie « parfois » ; ne pas confondre avec les quelques fois qu’il est advenu ou qu’il adviendra quelque chose.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4334
__conf__  qu ?elles? que fois?
    -> quelquefois|quelques fois       # Confusion. Utilisez « quelquefois » si vous voulez dire « parfois ». Utilisez « quelques fois » pour évoquer ce qui est advenu ou adviendra plusieurs fois.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4334  

# quoique / quoi que
__conf__  de (quoique) -1> quoi que         # Confusion.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=1571

# Note : quelquefois ne peut être vérifié ici, puisque le mot est supprimé par le préprocesseur.

# quoiqu’il en coûte
__conf__  (quoiqu il) en (?:co[uû]te) <- not word(1) -1> quoi qu’il                             # Confusion probable.

# raisonner / résonner
__conf__  (la|les|[lmts]e|[nv]ous) (résonn\w+)
    <- u"résonner" in stem(\2) -2> =\2.replace(u"résonn", "raisonn")                           # Confusion probable. Vous utilisez la raison, mais vous ne « sonnez » pas.

# ris / riz
__conf__  (riz?) (?:de veaux?|d’agneaux?) -1> ris                                               # Confusion.|http://fr.wiktionary.org/wiki/ris

# sa / ça
__conf__  (sa) (\w[\w-]+) <- morph(\2, "po:v.* po:(?:infi|[123](?:sg|pl))") or \2 == "va" -1> ça              # Confusion : « \2 » est un verbe. Exemples : sa jambe, ça vient.

# saint / sain / sein / seing
__conf__  (s[ae]in) ([A-ZÉÊ]\w+) <- morph(\1, "po:prn", False) -1> saint                        # Confusion.
__conf__  (en|dans|sur) [mts]on (saint?) -2> sein                                               # Confusion.
__conf__  au (sain) (?:de|du|des) -1> sein                                                      # Confusion.
__conf__  blanc-(?:s[ae]int?)(s|) -> blanc-seing\1                                              # Confusion.|http://fr.wiktionary.org/wiki/blanc-seing

# sans / sens
__conf__  sans dessus dessous -> sens dessus dessous                                            # Confusion.

# sceptique / septique
__conf__  (fosse|installation|choc|chirurgie|maladie|plaie|blessure|embolie|arthrite|isolement|pneumo-entérite)s? (sceptiques?)
    -2> =\2.replace("scep","sep")                                                               # Confusion possible. Septique = corrompu, infecté. Sceptique = ayant des doutes.
__conf__  ([seêéf]\w+) +(septique(s|)) <- morph(\1, "po:v0e", False) -2> sceptique\3            # Confusion possible. Septique = corrompu, infecté. Sceptique = ayant des doutes.

# s’ensuivre
__conf__  s’en (sui\w+) <- "suivre" in stem(\1) -> s’en\1                                       # Verbe « s’ensuivre ».

# soi / soit
__conf__  soit-disant -> soi-disant                                                             # Confusion.|http://fr.wiktionary.org/wiki/soi-disant
__conf__  (?:chez|don de|sur|avec|pour|sur) (soit) -1> soi                                      # Confusion probable.
__conf__  (?<![iI]l )en (soit) <- morph(word(1), "po:(?:mg|infi)", True, True) and not before("quel(?:s|les?|) qu $")
    -1> soi                                                                                    # Confusion probable.
__conf__  quel(?:le|)s? que (soi(?:es?|)) -1> soit|soient                                       # Confusion probable. 

# son / sont
__conf__  ne (?:l(?:e|eur|ui) |[nv]ous |)(son)
    -1> sont                            # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3e personne du pluriel s’écrit “sont”.
__conf__  [mts]e (son)
    -1> sont                            # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3e personne du pluriel s’écrit “sont”.
__conf__  (sont) (\w[\w-]+)
    <- morphex(\2, "po:nom.* is:mas is:sg", "po:mg") and (before(u"(?i)^ *$|\b(?:par|avec|dès|sur|contre|devant|derrière)$"))
    -1> son                             # Confusion : “sont” est le verbe “être” à la 3e personne du pluriel. Pour le déterminant, écrivez “son”.

# statu / statut
__conf__  statu[ts] quo -> statu quo                                                            # Confusion.
__conf__  statu(?! quo) -> statut                                                               # Confusion. « Statu » ne s’emploie que dans l’expression « statu quo ».

# teint / tain
__conf__  (?:glace|miroir|verre)s? sans (teints?) -1> tain                                      # Confusion.|http://fr.wiktionary.org/wiki/glace_sans_tain 

# sur / sûr
__conf__  (sure?s?) que?
    -1> =\1.replace("sur", u"sûr")     # Confusion probable : “sur” est une préposition ou un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur
__conf__  (sur(?:es?|s)) de?
    -1> =\1.replace("sur", u"sûr")     # Confusion probable : “sur” un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur
__conf__  (sur) d(?:e (?:m(?:oi|es?|on|a)|t(?:oi|es?|on|a)|vous|nous|l(?:ui|es?)|s(?:oi|es?|on|a)|ce(?:ci|la|s|tte|t|)|ça)|’(?:elles?|eux))
    -1> sûr                            # Confusion probable : “sur” est une préposition ou un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur
__conf__  (sur) d(?:e |’)([A-Z][\w-]+)
    <- morph(\2, "po:prn", False)
    -1> sûr                            # Confusion probable : “sur” est une préposition ou un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur
__conf__  (sur) de l(?:a |’|es? |ui |eur |[nv]ous )(\w[\w-]+(?:er|re|ir))
    <- morph(\2, "po:infi", False)
    -1> =\1.replace("sur", u"sûr")     # Confusion probable : “sur” est une préposition ou un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur
__conf__  en lieu (sur)
    -1> sûr                            # Confusion probable : “sur” est une préposition ou un adjectif signifiant acide ou aigre ; utilisez “sûr” pour certain, vrai ou sans danger.|http://fr.wiktionary.org/wiki/sur

# tache / tâche
__conf__  (tâche) d(?:e +|’)(\w[\w-]+)
    <- morphex(\2, "po:nom", "po:(prn|patr|npr)")
    -1> tache                        # Confusion probable : une tâche est un travail à accomplir. Pour une salissure, une altération, une marque, une coloration… employez « tache ».
# chocolat / rousseur / vin / sang / café / gras / graisse / huile / etc.

# tant / temps
__conf__  en (temps) que? -1> tant                                                        # Incorrect. Écrivez « en tant que ».|http://fr.wiktionary.org/wiki/en_tant_que
__conf__  en (tant) de? -1> temps                                                         # Incorrect. Écrivez « en temps de ».
__conf__  de tant? en tant? -> de temps en temps                                          # Incorrect. Écrivez « de temps en temps ».
__conf__  un (temps) soit peu -1> tant                                                    # Incorrect. Écrivez « un tant soit peu ».
__conf__  a(?:près|vec) (temps) de? -1> tant                                              # Confusion.|http://fr.wiktionary.org/wiki/tant 
__conf__  il ([êeésf]\w+) +(tant) de ((?:\w+)(?:er|ir|re))
    <- morph(\1, "po:v0e", False) and morph(\3, "is:infi", False)
    -2> temps                                                                              # Incorrect.

# tort / tord
__conf__  à (tord) -1> tort                                                             # Confusion : « tord » est une conjugaison du verbe tordre.
__conf__  ([aeo]\w*) +(tord)
    <- "avoir" in stem(\1) -2> tort                                                        # Confusion : « tord » est une conjugaison du verbe tordre.

# venimeux / vénéneux
__conf__  (?:serpent|araignée|scorpion|vipère|cobra|crapaud|grenouille|dendrobate|poulpe|guêpe|abeille|méduse|morsure|piqûre|dard|dent|croc|crochet)s? (vénéneu(?:x|ses?))
    -1> \1.replace(u"vénén", u"venim")                        # Confusion : « vénéneux » se dit des plantes, employez « venimeux ».
__conf__  (?:(?:plante|champignon|lépiote|fruit|herbe|fleur|chair|moule|humus|substance)s?|végéta(?:l|ux)) (venimeu(?:x|ses?))
    -1> \1.replace(u"venim", u"vénén")                        # Confusion : pas de « venin » ici.

# vieil / vieux
__conf__  vieux ([aeiou]\w+) <- morph(\1, "po:(?:nom|adj).* is:(?:mas|epi).* is:sg")
    -> vieil \1                                                         # Utilisez « vieil » pour un nom masculin singulier commençant par une voyelle ou un h.
# nouveau / nouvel

# voie / vois / voix
# -> voix
__conf__  à haute (voi[tes]) -1> voix                                   # Confusion.|http://fr.wiktionary.org/wiki/voix
__conf__  à (voi[tes]) (?:basse|haute) -1> voix                         # Confusion.|http://fr.wiktionary.org/wiki/voix
__conf__  de vives? (voi[est]) -1> voix                                 # Confusion.|http://fr.wiktionary.org/wiki/voix

# -> voie
__conf__  en (voix) d(?:e (?:développement|disparition|guérison|résorption)|’(?:acquisition|achèvement|extinction|obtention))
    -1> voie                                                            # Confusion.|http://fr.wiktionary.org/wiki/voie
__conf__  (ouv\w+) +la (voix) (?:à|aux?)
    <- "ouvrir" in stem(\1)
    -2> voie                                                            # Confusion.|http://fr.wiktionary.org/wiki/voie
__conf__  par (voix) de conséquence -1> voie                            # Confusion.|http://fr.wiktionary.org/wiki/voie
__conf__  (voix) (?:abdominale|anale|biliaire|carrossable|communale|express|interdite|intramusculaire|intraveineuse|piétonne|principale|prioritaire|privée|publique|déserte|romaine|appienne|flaminienne|ferrée|ferroviaire|lactée|lacrymale|aérienne|maritime|fluviale|terrestre|navigable|détournée|déviée|buccale|disgestive|urinaire|respiratoire|parallèle|administrative|diplomatique|gouvernementale|législative|hiérarchique|rectiligne|sinueuse|souterraine|urbaine)s?
    -1> voie                                                            # Confusion.|http://fr.wiktionary.org/wiki/voie 

# vu / vue
__conf__  points? de (vu) -1> vue                                       # Mettez au féminin.


############################## MOTS COMPOSÉS ###############################

[Word]
__mc__  (\w\w+)-(\w\w+)
    <- not \1.isdigit() and not \2.isdigit() and not morph(\0, "po:", False) and not morph(\2, "po:mg", False) and spell(\1+\2)
    -> \1\2                                                                        # Vous pouvez ôter le trait d’union.
__mc__  (\w\w+)-(\w\w+)
    <- \2 != u"là" and not re.match("(?i)(?:ex|mi|quasi|semi|non|demi|pro|anti|multi|pseudo|proto|extra)$", \1)
    and not \1.isdigit() and not \2.isdigit() and not morph(\2, "po:mg", False)
    and not morph(\0, "po:", False) and not spell(\1+\2)
    -> _                                                                           # Mot inconnu du dictionnaire.|http://www.dicollecte.org/dictionary.php?prj=fr&unknownword=on


############################## TYPOGRAPHIE ##############################

[word]
# accentuation la préposition en début de phrase
__typo__  ^(A) (\w[\w’-]+)
    <- morphex(\2, "po:(?:mg|nom|adj|infi)", ":ppas") and not re.match(u"(?i)(?:priori|post[eé]riori|contrario|capella)", \2)
    -1> À                                                                      # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
# \w\w+ est utile pour parer aux confusions avec « A t[-’]il » ou autres erreurs de ce genre.


############################## MAJUSCULES & MINUSCULES ###############################

[word]
# Les jours
__maj__  (?<=[\w,] )(Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche)
    -> =\0.lower()   # Pas de majuscule sur les jours de la semaine.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

# Les mois
__maj__  (?<=[\w,][ ’])(Janvier|Février|Avril|Mai|Juin|Juillet|Ao[ûu]t|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor)
    <- not( ( \0=="Juillet" and before("(?i)monarchie +de +$") ) or ( \0=="Octobre" and before("(?i)révolution +d’$") ) )
    -> =\0.lower()   # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong
__maj__  (en|(?:[0-9][0-9]?)) (Mars)
    -2> mars   # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong


# Les États
__maj__  (état) (?:français|belge|suisse|canadien|palestinien|souverain|américain|membre|africain|européen|voyou|démocratique|totalitaire|fédéral|fédéré|capitaliste|communiste)
    -1> État                                            # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez « État ».
__maj__  (états) (?:français|belges|suisses|canadiens|palestiniens|souverains|membres|américains|africains|européens|voyous|démocratiques|totalitaires|fédéraux|fédérés|capitalistes|communistes)
    -1> États                                           # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez « État ».

__maj__  (?:affaire|agent|administration|chancellerie|chefs|conseil|coup|diplôme|doctorat|emprunt|lycée|propriété|secret|homme|femme|police|religion|ministre|ministère|subvention|secrétaire|secrétariat|raison|ressortissant|université)s? d’(état)
    -1> État                                            # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez « État ».
__maj__  (?:défense|s[ûu]reté|agent|budget|caisse|capitale|constitution|charge|chef|dirigeant|denier|finance|fonction|fonctionnement|frontière|institution|propriété|monopole|pouvoir|rouage|ressource|service|subvention|suprême)s? de l’(état)
    -1> État                                            # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez « État ».

# gentilés / ethnonymes
__maj__  (une?|certaine?s?|cet?|[cdl]es|cette|quelques|plusieurs|chaque) ((afghan|albanais|algérien|allemand|américain|andorran|angolais|anglais|argentin|arménien|australien|autrichien|azerbaïdjanais|bahamien|bangladais|bengladeshi|barbadien|basque|belge|bélizien|béninois|breton|bhoutanais|biélorusse|birman|bolivien|bosnien|botswanais|brésilien|britannique|brunéien|bulgare|burkinabé|burundais|cambodgien|camerounais|canadien|capverdien|centrafricain|chilien|chinois|chypriote|colombien|comorien|congolais|nord-coréen|corse|costaricien|croate|cubain|danois|djiboutien|dominicain|ivoirien|égyptien|émirati|équatorien|érythréen|estonien|espagnol|états-?unien|étasunien|éthiopien|fidjien|finlandais|formosan|français|gabonais|gambien|géorgien|ghanéen|grec|grenadien|guadeloupéen|guatémaltèque|guinéen|équato-guinéen|guyanien|haïtien|hondurien|hollandais|hongrois|indien|indochinois|indonésien|irakien|italien|iranien|irlandais|islandais|israélien|jamaïcain|japonais|jordanien|kazakh|kényan|kosovar|koweïtien|laotien|lapon|letton|libanais|libérien|libyen|liechtensteinois|lituanien|luxembourgeois|macédonien|malgache|malaisien|malawite|maldivien|malien|maltais|maori|marocain|martien|mauricien|mauritanien|mexicain|micronésien|moldave|monégasque|monténégrin|mongol|mozambicain|namibien|népalais|nicaraguayen|nigérien|nigérian|néerlandais|norvégien|néo-zélandais|ougandais|ouzbek|pakistanais|palestinien|panaméen|paraguayen|péruvien|philippin|polonais|polynésien|portugais|québécois|qatari|roumain|russe|rwandais|salvadorien|sénégalais|serbe|singapourien|slovaque|slovène|somalien|soudanais|srilankais|suédois|suisse|surinamais|syrien|tadjik|tanzanien|tchadien|tchèque|thaïlandais|togolais|tahitien|saoudien|scandinave|sud-africain|sud-coréen|sud-américain|tunisien|turkmène|turc|taïwanais|ukrainien|soviétique|uruguayen|vénézuélien|vietnamien|yéménite|yougoslave|zaïrois|zambien|zimbabwéen)(s|es|ne|nes|))(?! correct| courant| parfait| facile| aisé| impeccable)
    <- not before(u"(?i)\\b(?:parl|appr|enseign|étudi|exprim)") and not \2.startswith("canadienne")
    -2> =\2.capitalize()                                # S’il s’agit d’un gentilé, mettez une majuscule.

__maj__  (une? |certaine?s? |cet? |[cdl]es |cette |l[ea] |quelques |plusieurs |chaque )((européen|parisien|lyonnais|marseillais|lillois|toulousain|nantais|strasbourgeois|montpelliérain|bordelais|bruxellois|montréalais|genévois|zurichois|bâlois)(s|es|ne|nes|))
    -2> =\2.capitalize()                                # S’il s’agit d’un gentilé, mettez une majuscule.

# les langues
__maj__  ((?:parl|cours|leçon|appr|étud|tradu|enseign|professeur|enseignant|dictionnaire|méthode)\w*) (?:le |d[eu] |l’|d’|qu |)(Afrikaans|Albanais|Allemand|Alsacien|Anglais|Arabe|Aragonais|Arménien|Asturien|Basque|Bengali|Biélorusse|Birman|Bosniaque|Breton|Bulgare|Cantonais|Catalan|Cherokee|Chinois|Corse|Cornique|Coréen|Croate|Danois|Écossais|Espagnol|Espéranto|Estonien|Féroïen|Farsi|Finnois|Flamand|Français|Frison|Galicien|Gallois|Gaulois|Géorgien|Grec|Gujarati|Hakka|Hawaïen|Hébreu|Hindi|Hollandais|Hongrois|Javanais|Ido|Indonésien|Interlingua|Islandais|Italien|Irlandais|Japonais|Kazakh|Khmer|Kurde|Ladino|Laotien|Latin|Ligurien|Limbourgeois|Lituanien|Lombard|Luxembourgeois|Macédonien|Malais|Maldivien|Malgache|Maltais|Mandarin|Maori|Marathi|Marwari|Moldave|Mongol|Napolitain|Néerlandais|Norvégien|Occitan|Ourdou|Ouzbek|Persan|Peul|Piémontais|Polonais|Portugais|Provençal|Quichua|Romanche|Roumain|Russe|Sans[ck]rit|Sarde|Serbe|Sicilien|Sindhi|Slovaque|Slovène|Soudanais|Sorabe|Suédois|Swahili|Tagalog|Tahitien|Tamoul|Tatar|Tchèque|Thaï|Turc|Ukrainien|Vénitien|Vietnamien|Volapük|Wallon|Wo?u|Yiddish|Xhosa|Xiang|Zoulou)
    <- stemchk(\1, u"^(?:parler|cours|leçon|apprendre|étudier|traduire|enseigner|professeur|enseignant|dictionnaire|méthode)$", False)
    -2> =\2.lower()                                     # Si vous parlez de la langue, pas de majuscule.

__maj__  (?:[Ee]n )(Afrikaans|Albanais|Allemand|Alsacien|Anglais|Arabe|Aragonais|Arménien|Asturien|Basque|Bengali|Biélorusse|Birman|Bosniaque|Breton|Bulgare|Cantonais|Catalan|Cherokee|Chinois|Cornique|Coréen|Croate|Danois|Écossais|Espagnol|Espéranto|Estonien|Féroïen|Farsi|Finnois|Flamand|Français|Frison|Galicien|Gallois|Gaulois|Géorgien|Grec|Gujarati|Hakka|Hawaïen|Hébreu|Hindi|Hollandais|Hongrois|Javanais|Ido|Indonésien|Interlingua|Islandais|Italien|Irlandais|Japonais|Kazakh|Khmer|Kurde|Ladino|Laotien|Latin|Ligurien|Limbourgeois|Lituanien|Lombard|Luxembourgeois|Macédonien|Malais|Maldivien|Malgache|Maltais|Mandarin|Maori|Marathi|Marwari|Moldave|Mongol|Napolitain|Néerlandais|Norvégien|Occitan|Ourdou|Ouzbek|Persan|Peul|Piémontais|Polonais|Portugais|Provençal|Quichua|Romanche|Roumain|Russe|Sans[ck]rit|Sarde|Serbe|Sicilien|Sindhi|Slovaque|Slovène|Soudanais|Sorabe|Suédois|Swahili|Tagalog|Tahitien|Tamoul|Tatar|Tchèque|Thaï|Turc|Ukrainien|Vénitien|Vietnamien|Volapük|Wallon|Wo?u|Yiddish|Xhosa|Xiang|Zoulou)
    -1> =\1.lower()                                     # Si vous parlez de la langue, pas de majuscule.

# Moyen Âge
__maj__  [Mm]oyen[- ][Aâa]ge -> Moyen Âge                                   # Le « Moyen Âge ».

# Dieu
__maj__  (?:[MmBb]on) (dieu) -1> Dieu                                               # Il manque une majuscule.
__maj__  dieu(?! de?) <- not morph(word(-1), "po:det", False) -> Dieu               # Il manque une majuscule.

# Église
__maj__  [lL]’(église) (adventiste|anglicane|copte|catholique|calviniste|épiscopalienne|jacobite|luth[eé]rienne|méthodiste|mormone|néo-?apostolique|orthodoxe|pentecôtiste|presbytérienne|protestante|réformée)
    -1> Église                                                                      # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.
__maj__  [hH]ommes? d’(église) -1> Église                                           # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.
__maj__  (?:chef|rite|sacrement)s? de l’(église) -1> Église                         # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.
__maj__  (Église)s? +(?:(?:baroque|gothique|romane)s?|Saint-[A-ZÉÊ]\w[\w-]+)
    <- before(r"\w") -1> église                                                     # Pour un bâtiment, une minuscule est requise. La majuscule est pour l’institution.


# Points cardinaux
__maj__  (?:Afrique|Amérique|Asie|Corée|Galles|Europe|Irlande|Soudan|Rhodésie|Territoire) du (nord|sud) -1> =\1.capitalize()        # Majuscule manquante.
__maj__  (?:Afrique|(?:ex-|)Allemagne|Asie|Europe|Pays) de l’(ouest|est) -1> =\1.capitalize()                                       # Majuscule manquante.


# Unités de mesure
__maj__  (\d+|une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|septante|octante|huitante|nonante|cents?|mille) ([A-Z]\w+)
    <- re.match(u"(?:Mètre|Watt|Gramme|Seconde|Ampère|Kelvin|Mole|Cand[eé]la|Hertz|Henry|Newton|Pascal|Joule|Coulomb|Volt|Ohm|Farad|Tesla|W[eé]ber|Radian|Stéradian|Lumen|Lux|Becquerel|Gray|Sievert|Siemens|Katal)s?|(?:Exa|P[ée]ta|Téra|Giga|Méga|Kilo|Hecto|Déc[ai]|Centi|Mi(?:lli|cro)|Nano|Pico|Femto|Atto|Ze(?:pto|tta)|Yo(?:cto|etta))(?:mètre|watt|gramme|seconde|ampère|kelvin|mole|cand[eé]la|hertz|henry|newton|pascal|joule|coulomb|volt|ohm|farad|tesla|w[eé]ber|radian|stéradian|lumen|lux|becquerel|gray|sievert|siemens|katal)s?", \2)
    -2> =\2.lower()                                                      # Pas de majuscule sur les unités de mesure.|https://fr.wikipedia.org/wiki/Unit%C3%A9_de_mesure


################################################################## CONJUGAISONS ################################################################################


[Word]

#### INFINITIF
__infi__  à en (\w[\w-]+) <- not morph(\1, "po:infi", False) -1> _                                            # Le verbe devrait être à l’infinitif.
__infi__  de ((\w[\w-]+)(?:é|ez))
    <- morph(\1, "po:v1") and not before(u"(?i)(quelqu(?:e chose|’une?) d(?:e |’)|(?:l(es?|a)|nous|vous|me|te|se)[ @]trait|(?:quelqu(?:e chose|’une?)|personne|rien(?: +\w+|)) +$)")
    -1> \2er                                                                                                  # Le verbe devrait être à l’infinitif.
__infi__  de +(?:[nv]ous|lui) ((\w[\w’-]+)(?:ée?s?|ez)) <- morphex(\1, "po:v1", "po:(?:prn|npr|patr)") -1> \2er  # Le verbe devrait être à l’infinitif.
__infi__  de les? ((\w[\w’-]+)(?:ée?s?|ez)) <- morph(\1, "po:v1", False) -1> \2er                              # Le verbe devrait être à l’infinitif.
__infi__  y +(\w[\w’-]+ée?s?) <- morphex(\1, "po:v", "po:[123](?:sg|pl)") -1> _                               # Le verbe ne devrait pas être un participe passé.
__infi__  pour (\w[\w’-]+(?:ée?s?|ez))
    <- morphex(\1, "po:v1", "po:(?:nom|prn|npr|patr)") and not stemchk(word(-1), "^(?:tenir|passer)$", False)
    -1> =suggVerbInfi(@)                                                                                      # Le verbe devrait être à l’infinitif.
__infi__  pour +(?:[nv]ous|lui) ((\w[\w’-]+)(?:ée?s?|ez)) <- morph(\1, "po:v1", False) -1> \2er               # Le verbe devrait être à l’infinitif.
__infi__  sans ((\w[\w’-]+)(?:ée?s?|ez)) <- morphex(\1, "po:v1", "po:(?:nom|prn|npr|patr)") -1> \2er          # Le verbe devrait être à l’infinitif.
__infi__  (?:[mn](?:e|’en)|lui) (\w[\w-]+ée?s?) <- morph(\1, "po:ppas", False) -1> _                          # Incohérence. Le verbe ne devrait pas être un participe passé.
__infi__  [ts](?:e|’(?:en|y)) ((\w[\w-]+)(?:ée?s?|ez)) <- morph(\1, "po:(?:ppas|2pl)", False) -1> \2er        # Incohérence. Le verbe devrait être à l’infinitif.
__infi__  (?:nous|vous) (\w[\w-]+ée?s?)
    <- morph(\1, "po:ppas", False) and not morph(word(-1), "v0.*[12]pl", False)
    -1> _                                                                                                  # Incohérence. Le verbe ne devrait pas être un participe passé.


#### PARTICIPES PRÉSENTS

__gv__  (ne|lui|me|te|se|nous|vous) (\w[\w-]+ants)
    -2> =\2[:-1]                                                   # Un participe présent est invariable.|http://fr.wiktionary.org/wiki/participe_pr%C3%A9sent



################################################################################################################################################################
################################################################################################################################################################
## NOUVELLE PASSE
################################################################################################################################################################
################################################################################################################################################################

[++]

#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
#
[pp]

[Word]

### Avant les verbes (ôter seulement les COI!)
ne (leur|lui)(?! en) -1> *

### Après les verbes
jamais -> *
guère -> *
(\w+) (pas|point|rien|bien|ensemble) <- morph(\1, ":v", False) -2> *
\w+-(?:je|tu|ils?|elles?|on|[nv]ous) (pas|point|rien|bien|ensemble) -1> *

# sembler le croire/penser/présumer
que +(sembl\w+) +(l(?:e (?:penser|croire|présumer|supposer)|’(?:envisager|imaginer))) <- "sembler" in stem(\1) -2> *

### tous / tout / toute / toutes
(tout) (?:le|ce|[mts]on|leur) -1> *
(toute) (?:la|cette|[mts](?:a|on)|leur) -1> *
(tou(?:te|)s) (?:[csmlt]es|[vn]os|leurs) -1> *

### Simplification des groupes nominaux

[Char]
# désambiguïsation - pour contrer le faux positif qui veut accorder fois avec le participe passé de la proposition suivante
\b(fois )que?\b -1> fois=

[Word]
beaucoup (de (?:monde|temps)) -1> _
en pleine? (\w[\w-]+) <- morph(\1, "po:(?:nom|adj)", False) and isEndOfNG() -> *
en tant que tel(?:s|lles?|) -> *
de (\w[\w-]+(?:er|ir|re)) <- morph(\1, ":v[1-3]_i_._") and isEndOfNG() -> *
de (?:manière|façon) +(?:non +|)(\w[\w-]+) et +(?:non +|)(\w[\w-]+) <- morph(\1, "po:adj", False) and morphex(\2, "po:adj", "po:(?:mg|prn|patr|npr)") -> *
de (?:manière|façon) +(?:non +|)(\w[\w-]+) <- morph(\1, "po:adj", False) -> *
d(?:e +|’)(\w[\w-]+) +(\w[\w-]+) <- morph(\1, "po:(?:nom|adj) .*is:sg", False) and morphex(\2, "po:(?:nom|adj) .*is:sg", "po:(?:mg|v)") and isEndOfNG() -> *
d(?:e +|’)(\w[\w-]+) <- morphex(\1, "po:nom", "po:(?:mg|infi)") and isEndOfNG() -> *
d(?:e +|’)(\w[\w-]+) <- morphex(\1, "po:nom", "po:(?:mg|infi)") and isEndOfNG() -> *

(les? |la |l’|des |ce[st]? |cette |[mts](?:es|on|a) |[nv]o(?:s|tre) |leurs? |certaine?s? |quelques ) *(\w\w+) +(\w\w+)
    <- morphex(\2, "po:(?:nom|adj)", ":v0") and morphex(\3, "po:(?:nom|adj)", "po:(?:mg|[1-3](?:sg|pl)|ppre)")
    -3> *
(les? |la |l’|des |ce[st]? |cette |[mts](?:es|on|a) |[nv]o(?:s|tre) |leurs? |certaine?s? |quelques ) *(\w\w+) +(\w\w+)
    <- morphex(\2, "po:(?:nom|adj)", ":v0") and morphex(\3, "po:(?:nom|adj)", "po:(?:mg|[1-3](?:sg|pl)|ppre)")
    -3> *
aucune? (de [nv]ous|d’e(?:ux|lles|ntre (?:[nv]ous|e(?:ux|elles)))) -1> *
aucune? +(des +\w[\w-]+) +ne? -1> *
chacune? (de [nv]ous|d’e(?:ux|lles|ntre (?:[nv]ous|e(?:ux|elles)))) -1> *
l’une? (de [nv]ous|des [nv]ôtres|d’e(?:ux|lles|ntre (?:[nv]ous|e(?:ux|elles)))) -1> *
la plupart (des \w[\w-]+) -1> *

# groupe déjà partiellement simplifié (selon les règles de la passe 3)
(?:[aA](?:ux?|vec)|[àÀ]|[eE]n)   +d(?:e +(?:la |l’|leurs? |ce(?:s|t(?:te|)|) |[nv]o(?:s|tre) |[mts](?:a|on) |quelques? |certaine?s? )|des? |u ) *(\w\w+)
    <- morph(\1, "po:(?:nom|adj)", False) and isEndOfNG()
    -> *

# y compris (pas terrible, mais cas difficile)
y compris -> *

# eux/nous/vous tous -- elles toutes
[nv]ous (tou(?:te|)s) qui -1> *
eux (tous) qui -1> *
elles (toutes) qui -1> *

# groupe avec préposition
(?:avec|à|s(?:ur|ous|elon)|c(?:ontre|hez)|dans|envers|p(?:ar|our)) +(\w\w+)
    <- morphex(\1, "po:(?:nom|adj)", "po:mg") and isEndOfNG()
    -> *
(?:avec|à|s(?:ur|ous|elon)|c(?:ontre|hez)|dans|envers|p(?:ar|our)) +(?:les? |la |l’|des |ce[st]? |cette |[mts](?:es|on|a) |[nv]o(?:s|tre) |leurs? |certaine?s? |quelques ) *(\w\w+)
    <- morph(\1, "po:(?:nom|adj)", False) and isEndOfNG()
    -> *
    
# de +
d(?:e +|’)(\w[\w-]+) <- morphex(\1, "po:nom", "po:(?:mg|infi)") and isEndOfNG() -> *
d(?:e +|’)(\w[\w-]+) <- morphex(\1, "po:nom", "po:(?:mg|infi)") and isEndOfNG() -> *
de (?:ce(t|tte|s|)|[mts](?:on|a|es)|[nv](?:otre|os)) +(\w[\w-]+) <- morph(\1, "po:(?:nom|adj)", False) and isEndOfNG() -> *
de (?:ce(t|tte|s|)|[mts](?:on|a|es)|[nv](?:otre|os)) +(\w[\w-]+) <- morph(\1, "po:(?:nom|adj)", False) and isEndOfNG() -> *
de la +(\w[\w-]+) <- morphex(\1, "po:(?:nom|adj)", "po:infi") and isEndOfNG() -> *


[char]
, +, -> *
^ *, -> *
, *$ -> *
[—–-] +[—–-] -> *
[<] +[>] -> *
[(] +[)] -> *


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]

[Word]

#### CONFUSIONS
## s’en / c’en
__conf__  (s’en) (?:n’|)(?:est|seras?|étai[ts]) +(?:fini|terminé)s?
    <- morph(word(-1), "po:cj", False, True)
    -1> c’en                                               # Confusion probable. « C’en est… » équivaut à « ça, c’est… ».|http://fr.wiktionary.org/wiki/c%E2%80%99en_est_fait_de
__conf__  (s’en) (?:n’|)(?:est|seras?|étai[ts]) +(?:assez|trop)
    <- after("^ +d(?:e |’)") or not word(1)
    -1> c’en       # Confusion probable. « C’en est… » équivaut à « ça, c’est… ».|http://fr.wiktionary.org/wiki/c%E2%80%99en_est_fait_de
__conf__  (s’en) (?:n’|)(?:est|seras?|étai[ts]) +(\w[\w-]+)
    <- morphex(\2, "po:adj", "po:(?:mg|v|adv)") and morph(word(-1), "po:cj", False, True)
    -1> c’en       # Confusion probable : “\2” est un adjectif. « C’en est… » équivaut à « ça, c’est… ».|http://fr.wiktionary.org/wiki/c%E2%80%99en_est_fait_de


#### INFINITIF

__infi__  ((?:fai|f[iî]|fer|fon|v[oe]u)\w+) +((\w[\w-]+)(?:ée?s?|ez))
    <- stemchk(\1, "^(faire|vouloir)$", False) and not re.match("(?i)(en|[mtsld]es?|[nv]ous|un)$", word(-1)) and morphex(\2, "po:v", "po:(patr|prn)")
    -2> \3er                                                                                                        # Le verbe devrait être à l’infinitif.
__infi__  (s[auû]\w+) +(\w[\w-]+(?:ée?s?|ez))
    <- "savoir" in stem(\1) and morph(\2, "po:v", False) and not re.match("(?i)([mts]e|[vn]ous|les?|la|un)$", word(-1))
    -2> _                                                                                                           # Le verbe devrait être à l’infinitif.
__infi__  il (?:ne |)fa(?:ut|udrait|udra|llut) +(?:lui (?:en|)|[mts](?:e |’(y |en |))|[nv]ous (?:en |y |)|en |y )(\w[\w-]+(?:ée?s?|ez))
    <- morph(\1, "po:(?:ppas|2pl)", False)
    -1> =suggVerbInfi(@)                                                                                            # Le verbe devrait être à l’infinitif.
__infi__  il (?:ne |)fa(?:ut|udrait|udra|llut) +l(?:es? |a |’)(\w[\w-]+(?:ée?s?|ez))
    <- morphex(\1, "po:(?:ppas|2pl)", "po:nom")
    -1> =suggVerbInfi(@)                                                                                            # Le verbe devrait être à l’infinitif.


#### ÊTRE / AVOIR ÉTÉ / SEMBLER (+ÊTRE via PP) / DEVENIR / RESTER / DEVENIR / REDEVENIR / PARAÎTRE + PARTICIPE PASSÉ / ADJ

__gv__  (je +|j’(?:y +|en +|))(?:ne +|n’|)((?:s[oue]|étai|fus|dev|re(?:dev|st)|par)\w*|a(?:ie?|vais|urais?) +été|eus(?:se|) +été) +(\w[\w-]+)
    <- (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été")) and morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv|infi)")
    -3> =suggSing(@)                                                      # Accord avec le sujet « je » : « \3 » devrait être au singulier.

__gv__  tu +(?:ne +|n’|)((?:es|étai|fus|se[rm]|soi|dev|re(?:dev|st)|par)\w*|a(?:s|ies|vais|urai?s) +été|eus(?:ses|) +été) +(\w[\w-]+)
    <- (stemchk(\1, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \1.endswith(u" été")) and morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv|infi)")
    -2> =suggSing(@)                                                      # Accord avec le sujet « tu » : « \2 » devrait être au singulier.

__gv__  (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +qui|quiconque) +(?:ne +|n’|)((?:es|étai|f[uû]|se[mr]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +(\w[\w-]+)
    <- (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    -3> =suggMasSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

__gv__  c’(?:est|était|e[uû]t +été) +(\w[\w-]+)
    <- (morphex(\1, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\1, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    -1> =suggMasSing(@)                                                   # Accord avec le sujet « c’ » : « \1 » devrait être au masculin singulier.

__gv__  ç’(?:a(?:it|vait|ura(?:it|)|) +été) +(\w[\w-]+)
    <- (morphex(\1, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\1, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    -1> =suggMasSing(@)                                                   # Accord avec le sujet « ç’ » : « \1 » devrait être au masculin singulier.

__gv__  (ça|ce(?:la|ci)|celui-(?:ci|là)|lequel) +(?:ne +|n’|)((?:es|étai|f[uû]|se[mr]|soi|par|dev|re(?:dev|st))\w+|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +(\w[\w-]+)
    <- (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    and not morph(word(-1), "po:prep", False, False)
    -3> =suggMasSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

__gv__  (elle|celle-(?:ci|là)|laquelle) +(?:ne +|n’|)((?:es|étai|f[uû]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +(\w[\w-]+)
    <- (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    and not morph(word(-1), "po:prep", False, False)
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  (c?elle +qui) +(?:ne +|n’|)((?:es|étai|f[uû]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +(\w[\w-]+)
    <- (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(adj|ppas|nom).* is:pl", ":(mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  (?<![nN][oO][uU][sS] )nous +(?:ne +|n’|)((?:sommes|étions|fûmes|fussions|seri?ons|soyons|sembl|dev|re(?:dev|st)|par)\w*|a(?:vi?ons|uri?ons|yions) +été|e(?:ûme|ussion)s +été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \2)
    and ((stemchk(\1, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) and morph(\1, "po:1pl", False)) or \1.endswith(u" été"))
    and morphex(\2, "po:(?:nom|adj).* is:sg", ":(?:mg|adv|pl|inv|infi)")
    -2> =suggPlur(@)                                                      # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

__gv__  (ils|c?eux +qui|ceux-ci|ceux-là|lesquels) +(?:ne +|n’|)((?:sont|étaient|fu[rs]|se[rm]|soient|dev|re(?:dev|st)|par)\w*|ont +été|a(?:ient|vaient|ur(?:ont|aient)) +été|eu(?:r|ss)ent +été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \3) and (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:sg", ":(?:mg|adv|pl|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    and (not re.match(u"(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggMasPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

__gv__  (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|n’|)((?:sont|étai|fu[rs]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|ont +été|a(?:ient|vaient|ur(?:ont|aient)) +été|eu(?:r|ss)ent +été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \3) and (stemchk(\2, u"^(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre)$", False) or \2.endswith(u" été"))
    and (morphex(\3, "po:(adj|ppas|nom).* is:sg", ":(?:mg|adv|pl|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    and (not re.match(u"(?i)(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggFemPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

__gv__  ([aeo]\w*) +été +(\w[\w-]+)
    <- stemchk(\1, u"^avoir$", False) and morphex(\2, "po:[123]sg", ":(?:mg|ad[vj]|infi|ppas)")
    -2> =suggVerbPpas(@)                                                  # Après « avoir été », il faut un participe passé.


## pouvoir/sembler/paraître/vouloir/devoir/croire/déclarer/penser/dire/affirmer + être/avoir été
__gv__  (je|j’(?:y|en)) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False) and morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv|infi)")
    -3> =suggSing(@)                                                      # Accord avec le sujet « je » : « \3 » devrait être au singulier.

__gv__  tu +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\1, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False) and morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv|infi)")
    -2> =suggSing(@)                                                      # Accord avec le sujet « tu » : « \2 » devrait être au singulier.

__gv__  (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +qui|quiconque) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:pl", ":(?:mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    -3> =suggMasSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

__gv__  (ça|ce(?:la|ci)|celui-(?:ci|là)|lequel) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:pl", ":(?:mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    and not morph(word(-1), "po:prep", False, False)
    -3> =suggMasSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

__gv__  (elle|celle-(?:ci|là)|laquelle) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:pl", ":(?:mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    and not morph(word(-1), "po:prep", False, False)
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  (c?elle +qui) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:pl", ":(?:mg|adv|sg|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  (?<![nN][oO][uU][sS] )nous +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouû]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \2) and stemchk(\1, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False) and morph(\1, "po:1pl", False)
    and morphex(\2, "po:(?:nom|adj).* is:sg", ":(?:mg|adv|pl|inv|infi)")
    -2> =suggPlur(@)                                                      # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

__gv__  (ils|c?eux +qui|ceux-(?:ci|là)|lesquels) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \3) and stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:sg", ":(?:mg|adv|pl|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi|infi)"))
    and (not re.match(u"(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggMasPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

__gv__  (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|)((?:p[aeouûr]|sembl|cr[ouû]|d[eouûéî]|v[eo]|affirm)\w+) +(?:être|avoir été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \3) and stemchk(\2, u"^(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ire)|vouloir|affirmer)$", False)
    and (morphex(\3, "po:(?:adj|ppas|nom).* is:sg", ":(?:mg|adv|pl|inv|infi)") or morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi|infi)"))
    and (not re.match(u"(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggFemPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.


## Contrôle de l’accord en nombre avec la conjugaison de « être »
__gv__  (\w[\w-]+) +(?:qui +|)(?:ne +|n’|)(?:est|était|f[uû]t|sera(?:it|)|a(?:vait|ura|urait|it|) +été|e[uû]t +été) +(\w[\w-]+)
    <- morphex(\2, "po:(?:adj|ppas|nom).* is:pl", ":(?:mg|adv|sg|inv|infi)") and not morph(\1, "po:mg", False)
    -2> =suggSing(@)                                                      # Accord avec « être » : « \2 » devrait être au singulier.

__gv__  (\w[\w-]+) +(?:qui +|)(?:ne +|n’|)(?:sont|étaient|fu(?:r|ss)ent|ser(?:ont|aient)|soient|ont +été|a(?:vaient|uront|uraient|ient) +été|eu(?:r|ss)ent +été) +(\w[\w-]+)
    <- not re.match("(?i)légion$", \2) and morphex(\2, "po:(?:adj|ppas|nom).* is:sg", ":(?:mg|adv|pl|inv|infi)") and not morph(\1, "po:mg", False)
    -2> =suggPlur(@)                                                      # Accord avec « être » : « \2 » devrait être au pluriel.

## Contrôle de l’accord en genre avec le substantif précédent
__gv__  (?<![dD]’)(une? |les? |la |l’|ce(?:s|t|tte|) |[mts](?:on|a|es) |[nv]os |leurs? ) *(\w[\w-]+) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \3)
    and ((morphex(\3, "po:(?:adj|ppas).* is:fem", ":(?:mg|adv|mas|epi)") and morphex(\2, "is:mas", ":(?:mg|epi|fem)")) or (morphex(\3, "po:(?:adj|ppas).* is:mas", ":(?:mg|adv|fem|epi)") and morphex(\2, "is:fem", ":(?:mg|mas|epi)")))
    and not ( morph(\3, "is:pl", False) and morph(\2, "is:sg", False) )
    and not morph(word(-1), "po:(?:prep|pp|infi|[1-3](?:sg|pl))", False, False) and not before(r"\b(?:et|ou|de) +$")
    -3> =switchGender(@)                                                  # Accord erroné : « \2 » et « \3 » ne sont pas accordés en genre.

[word]
__gv__  (?<![dD]’)([A-ZÉÈ]\w[\w-]+) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent|a(?:vait|ura|urait|it|) +été|e[uû]t +été) +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \2)
    and ((morphex(\1, "po:(?:prn|npr).* is:fem", ":(mg|adv|mas|epi)") and morphex(\2, "is:mas", ":(?:mg|epi|fem|adv)")) or (morphex(\1, "po:(?:prn|npr).* is:mas", ":(?:mg|adv|fem|epi)") and morphex(\2, "is:fem", ":(?:mg|mas|epi|adv)")))
    and not morph(word(-1), "po:(?:prep|pp|infi|[1-3](?:sg|pl))", False, False) and not before(r"\b(?:et|ou|de) +$")
    -2> =switchGender(@)                                                  # Accord erroné : « \1 » et « \2 » ne sont pas accordés en genre.
[Word]

## accords avec l’adjectif précédant le pronom

__gv__  ^ *(\w[\w-]+s),? (je?|tu)
    <- morphex(\1, "po:adj.* is:pl", "(?:is:(?:sg|inv)|po:(?:mg|impe|prn))")
    -1> =suggSing(@)                                   # Si cet adjectif se réfère au pronom « \2 », l’adjectif devrait être au singulier (et accordé en genre).

__gv__  ^ *(\w[\w-]+[es]),? il
    <- morphex(\1, "po:adj.* is:(?:pl|fem)", "(?:is:mas is(?:sg|inv)|po:(?:mg|impe|prn))")
    -1> =suggMasSing(@)                                   # Si cet adjectif se réfère au pronom « il », l’adjectif devrait être au masculin singulier.

__gv__  ^ *(\w[\w-]+[éuits]),? elle
    <- morphex(\1, "po:adj.* is:(?:pl|mas)", "(?:is:fem is(?:sg|inv)|po:(?:mg|impe|prn))")
    -1> =suggFemSing(@)                                   # Si cet adjectif se réfère au pronom « elle », l’adjectif devrait être au féminin singulier.

__gv__  ^ *(\w[\w-]+[eiuéts]),? ils
    <- morphex(\1, "po:adj.* is:(?:sg|fem)", "(?:is:mas is(?:pl|inv)|po:(?:mg|impe|prn))")
    -1> =suggMasPlur(@)                                   # Si cet adjectif se réfère au pronom « ils », l’adjectif devrait être au masculin pluriel.

__gv__  ^ *(\w[\w-]+[eiuéts]),? elles
    <- morphex(\1, "po:adj.* is:(?:sg|mas)", "(?:is:fem is(?:pl|inv)|po:(?:mg|impe|prn))")
    -1> =suggFemPlur(@)                                   # Si cet adjectif se réfère au pronom « elles », l’adjectif devrait être au féminin pluriel.


## se rendre compte
__gv__  ([êeésf]\w+) +(rendu(?:s|es?)) compte
    <- morph(\1, "v0e", False) -2> rendu                  # Accord erroné : dans l’expression « se rendre compte », « rendu » est invariable. 

## Inversion verbe/sujet
__gv__  (?:s[ou]is|étais|fus|fussé|serais?)-je +(\w[\w-]+)
    <- morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:pl)", ":(?:mg|adv|sg|inv)")
    -1> =suggSing(@)                                                      # Accord avec le sujet « je » : « \1 » devrait être au singulier.
__gv__  (?:es|étais|fus|fusses|serai?s)-tu +(\w[\w-]+)
    <- morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:pl)", ":(?:mg|adv|sg|inv)")
    -1> =suggSing(@)                                                      # Accord avec le sujet « tu » : « \1 » devrait être au singulier.
__gv__  (?:est|était|f[uû]t|sera|serait)-(?:[iI]l|ce) +(\w[\w-]+)
    <- (morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:pl)", ":(?:mg|adv|sg|inv)") or morphex(\1, "po:(?:[1-3](?:sg|pl)|(?:adj|ppas).* is:fem)", ":(?:mg|adv|mas|epi)"))
    -1> =suggMasSing(@)                                                   # Accord avec le sujet « il » : « \1 » devrait être au masculin singulier.
__gv__  (?:est|était|f[uû]t|sera|serait)-elle +(\w[\w-]+)
    <- (morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:pl)", ":(?:mg|adv|sg|inv)") or morphex(\1, "po:(?:[1-3](?:sg|pl)|(?:adj|ppas).* is:mas)", ":(?:mg|adv|fem|epi)"))
    -1> =suggFemSing(@)                                                   # Accord avec le sujet « elle » : « \1 » devrait être au féminin singulier.
__gv__  (?:sommes|étions|fûmes|fussions|seri?ons)-nous +(\w[\w-]+)
    <- morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:sg)", ":(?:mg|adv|pl|inv)")
    -1> =suggPlur(@)                                                      # Accord avec le sujet « nous » : « \1 » devrait être au pluriel.
__gv__  (?:sont|étaient|furent|fussent|seront|seraient)-ils +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \1) and (morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:sg)", ":(?:mg|adv|pl|inv)") or morphex(\1, "po:(?:[1-3](?:sg|pl)|(?:adj|ppas).* is:fem)", ":(?:mg|adv|mas|epi)"))
    -1> =suggMasPlur(@)                                                   # Accord avec « ils » : « \1 » devrait être au masculin pluriel.
__gv__  (?:sont|étaient|furent|fussent|seront|seraient)-elles +(\w[\w-]+)
    <- not re.match(u"(?i)légion$", \1) and (morphex(\1, "po:(?:[1-3](?:sg|pl)|infi|(?:nom|adj|ppas).* is:sg)", ":(?:mg|adv|pl|inv)") or morphex(\1, "po:(?:[1-3](?:sg|pl)|(?:adj|ppas).* is:mas)", ":(?:mg|adv|fem|epi)"))
    -1> =suggFemPlur(@)                                                   # Accord avec « elles » : « \1 » devrait être au féminin pluriel.

## Accord et incohérences 
__gv__  sont (\w[\w-]+)
    <- morphex(\1, "po:(?:nom|adj)", "(?:po:(?:ppas|adv|mg|nb|patr|prn)|is:(?:pl|inv))") and not re.match(u"(?i)(?:légion|nombre|cause)$", \1) 
    -1> =suggPlur(@)                      # Incohérence : « \1 » est au singulier. Ou vous confondez « sont » et « son », ou l’accord en nombre est incorrect.

#TODO: ont été +PPAS sg

__gv__  sont +(\w[\w-]+)
    <- morphex(\1, "po:v", "po:(?:nom|ad[jv]|ppas|mg|3pl)") and not before(r"(?i)\bce que?\b")
    -1> _                                  # Incohérence : « \1 » n’est pas un participe passé.


#### SE CROIRE/CONSIDÉRER/MONTRER/PENSER/SAVOIR/SENTIR/VOIR/VOULOIR + PARTICIPE PASSÉ/ADJ

__gv__  je +(?:ne +|)me +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\1, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False) and morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv)")
    -2> =suggSing(@)                                                      # Accord avec le sujet « je » : « \2 » devrait être au singulier.

__gv__  tu +(?:ne +|)te +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\1, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False) and morphex(\2, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv)")
    -2> =suggSing(@)                                                      # Accord avec le sujet « je » : « \2 » devrait être au singulier.

__gv__  (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là)|quiconque|lequel) +(?:ne +|)se +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False)
    and (morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv)") or morphex(\3, "po:(?:nom|adj).* is:fem", ":(?:mg|adv|mas|epi)"))
    and (not re.match(u"(?:celui-(?:ci|là)|lequel)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggMasSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

__gv__  (elle|celle-(?:ci|là)|laquelle) +(?:ne +|)se +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False)
    and (morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv)") or morphex(\3, "po:(?:nom|adj).* is:mas", ":(?:mg|adv|fem|epi)"))
    and not morph(word(-1), "po:prep", False, False)
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  (c?elle +qui) +(?:ne +|)se +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False)
    and (morphex(\3, "po:(?:nom|adj).* is:pl", ":(?:mg|adv|sg|inv)") or morphex(\3, "po:(?:nom|adj).* is:mas", ":(?:mg|adv|fem|epi)"))
    -3> =suggFemSing(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

__gv__  nous +(?:ne +|)nous +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\1, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False) and morphex(\2, "po:(?:nom|adj).* is:sg", ":(?:mg|adv|pl|inv)")
    -2> =suggPlur(@)                                                      # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

__gv__  (ils|c?eux +qui|ceux-ci|ceux-là|lesquels) +(?:ne +|)se +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False)
    and (morphex(\3, "po:(?:nom|adj).* is:sg", ":(?:mg|adv|pl|inv)") or morphex(\3, "po:(?:nom|adj).* is:fem", ":(?:mg|adv|mas|epi)"))
    and (not re.match(u"(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggMasPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

__gv__  (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|)se +((?:s|c(?:r|onsid)|montr|pens|v)\w+) +(\w[\w-]+)
    <- stemchk(\2, u"^(?:croire|considérer|montrer|penser|savoir|sentir|voir|vouloir)$", False)
    and (morphex(\3, "po:(?:nom|adj).* is:sg", ":(?:mg|adv|pl|inv)") or morphex(\3, "po:(?:nom|adj).* is:mas", ":(?:mg|adv|fem|epi)"))
    and (not re.match(u"(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), "po:prep", False, False))
    -3> =suggFemPlur(@)                                                   # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.


#### AVOIR + PARTICIPES PASSÉS

#__gv__  fait(s|e|es) (\w+) <- morph(\2, "po:v") and not morph(\2, "is:infi")
#	-> fait \1                      # Le participe passé de faire reste au masculin singulier s’il est suivi par un verbe à l’infinitif.

__gv__  ^ *(j’|je |tu |ils? |elles? |[nv]ous |on |et )(?:ne +|n’|l(?:ui|eur) +|)([aeo]\w*) +(\w[\w-]+)
    <- not re.match(u"(?i)(?:confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \3)
    and morph(\2, "po:v0a", False) and morphex(\3, "po:(?:[1-3](?:sg|pl)|ppas.* is:(?:pl|fem))", "po:(?:mg|adv|ppas.* is:mas is:(?:sg|inv))")
    -3> =suggMasSing(@)            # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  ^ *(l(?:’|es? |a |eurs )|ce(?:s|tte|t|rtaine?s|) |des |quelques |[mts](?:es|on) |[nv]o(?:s|tre) ) *(\w[\w-]+) +(?:ne +|n’|l(?:ui|eur) +|)([aeo]\w*) +(\w[\w-]+)
    <- not re.match(u"(?i)(?:confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \4)
    and morph(\3, "po:v0a", False) and morphex(\4, "po:(?:[1-3](?:sg|pl)|ppas.* is:(?:pl|fem))", "po:(?:mg|adv|ppas.* is:mas is:(?:sg|inv))")
    -4> =suggMasSing(@)            # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  les +([aeo]\w*) +(\w[\w-]*(?:[éiut]e?|is|se))
    <- morph(\1, "po:v0a", False) and morphex(\2, "po:v[0-3]..t.* po:ppas.* is:sg", ":(?:mg|adv|pl|inv)") and not morph(word(1), "po:v", False)
    -2> =suggPlur(@)               # Accord avec le COD “les” : Le participe passé « \2 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  (je|tu|ils?||elles?|on|[nv]ous) (nous) +([aeo]\w*) +(\w[\w-]*(?:[éiut]e?|is|se)) *$
    <- morph(\2, "po:v0a", False) and morphex(\3, "po:v[0-3]..t_.* po:ppas.* is:sg", ":(?:mg|adv|pl|inv)") and not before(r"\bque?\b")
    -3> =suggPlur(@)               # Accord avec le COD “nous” : Le participe passé « \3 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  l’([aeo]\w*) +(\w[\w-]*s)
    <- morph(\1, "po:v0a", False) and morphex(\2, "po:v[0-3]..t.* po:ppas.* is:pl", ":(?:mg|adv|sg|inv)") and not morph(word(1), "po:v", False)
    -2> =\2[:-1]                   # Accord avec le COD « l’ » : Le participe passé « \2 » devrait être au singulier (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  ([mt])’([aeo]\w*) +(\w[\w-]*s)
    <- morph(\2, "po:v0a", False) and morphex(\3, "po:v[0-3]..t_.* po:ppas.* is:pl", ":(?:mg|adv|sg|inv)") and not before(r"\bque?\b") and not morph(word(1), "po:v", False)
    -3> =\3[:-1]                   # Accord avec « \1’ ». Le participe passé « \3 » devrait être au singulier (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  qui +(?:n’|l(?:ui|eur) |ne l(?:ui|eur) )(?:a(s?|i|v(?:ai(?:[ts]|ent)|ons|ions|ez|iez)|ur(?:on[ts]|ai?[st]?|aient))|e[uû]t|ont) +(\w[\w-]+[es])
    <- morphex(\1, "po:ppas.* is:(?:fem|mas is:pl)", "is:(?:mas is:(?:sg|inv)|fem)")
    -1> =suggMasSing(@)            # Le participe passé devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  avoir +(\w[\w-]+)
    <- not re.match(u"(?i)(?:confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \1)
    and morphex(\1, "po:ppas.* is:(?:fem|mas is:pl)", "is:mas is:(?:sg|inv)") and before(u"(?i)(?:après +$|sans +$|pour +$|que? +$|quand +$|, +$|^ *$)")
    -1> =suggMasSing(@)            # Le participe passé devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

## COD avant que

__gv__  ([ldmtsc]es) +(\w[\w-]+) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)([aeo]\w*) +(\w[\w-]+[éiust]e?)(?! [mts]’)
    <- morph(\3, "po:v0a", False)
    and not (re.match(u"(?:décidé|essayé|tenté)$", \4) and after(u" +d(?:e |’)"))
    and morph(\2, "po:(?:nom|adj)", False) and morphex(\4, "po:v[0-3]..t.* po:ppas.* is:sg", ":(?:mg|adv|pl|inv)")
    and not morph(word(1), "po:(?:infi|properobj)", False)
    -4> =suggPlur(@, \2)  # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  (le |l’|cet? |[mts]on |un ) *(\w[\w-]+) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)([aeo]\w*) +(\w[\w-]+[es])(?! [mts]’)
    <- morph(\3, "po:v0a", False)
    and not (re.match(u"(?:décidé|essayé|tenté)$", \4) and after(u" +d(?:e |’)"))
    and morph(\2, "po:(?:nom|adj).* is:mas", False)
    and (morphex(\4, "po:v[0-3]..t.* po:ppas.* is:fem", ":(?:mg|adv|mas|epi)") or morphex(\4, "po:v[0-3]..t.* po:ppas.* is:pl", ":(?:mg|adv|sg|inv)"))
    and not morph(word(1), "po:(?:infi|properobj)", False)
    -4> =suggMasSing(@)  # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  (la |l’|cette |[mts]a |mon |une ) *(\w[\w-]+) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)([aeo]\w*) +(\w[\w-]+[éiust])(?! [mts]’)
    <- morph(\3, "po:v0a", False)
    and not (re.match(u"(?:décidé|essayé|tenté)$", \4) and after(u" +d(?:e |’)"))
    and morph(\2, "po:(?:nom|adj).* is:fem", False)
    and (morphex(\4, "po:v[0-3]..t.* po:ppas.* is:mas", ":(?:mg|adv|fem|epi)") or morphex(\4, "po:v[0-3]..t.* po:ppas.* is:pl", ":(?:mg|adv|sg|inv)"))
    and not morph(word(1), "(?:po:(?:infi|properobj)|st:que?)", False)
    -4> =suggFemSing(@)  # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au féminin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

__gv__  ([aeo]\w*) +(\w[\w-]+e[rz])
    <- not re.match("(A|avions)$", \1) and morph(\1, "po:v0a", False) and morph(\2, "po:v(?!.* po:ppas)")
    -2> _                                                                  # Incohérence : « \2 » n’est pas un participe passé.

## du / dû
__gv__  ([aeo]\w*) +(due?s?) +(\w[\w’-]+)
    <- morph(\1, "po:v0a", False) and (morph(\3, "po:infi") or re.match("(?:[mtsn]e|[nv]ous|leur|lui)$", \3))
    -2> dû                                                                 # Participe passé de devoir : « dû ».

__gv__  (du) +(?:à|a|aux?) -1> dû                                                                   # Confusion. Ce qui est dû.
__gv__  (?:mon|notre|votre) (du) -1> dû                                                             # Confusion. Ce qui est dû.
__gv__  [ts]on (du) <- not morph(word(1), "po:(?:nom|adj).* is:mas", False) -1> dû                  # Confusion. Ce qui est dû.

__gv__  qui +(?:ne +|)(?:[mt](?:’|e +)|l(?:eur|ui) +|[nv]ous +)([eésf]\w+) (du)
    <- morph(\1, "po:v0e", False) -2> dû                                                           # Confusion. Ce qui est dû.

# formes interrogatives
__gv__  (?<![lLtTmM]’)([aeo]\w*)[- ](?:je|tu|(?:t-|)ils?|elles?|[nv]ous) +(\w\w+)
    <- morph(\1, "po:v0a", False) and morphex(\2, "po:(?:infi|2pl|ppas.* is:(?:fem|pl))", "is:mas is:(?:sg|inv)") and \2 != "prise"
    and not morph(word(-1), "(?:st:(?:les|[nv]ous)|po:(?:nom|adj).* is:(?:fem|pl))", False) and not before(r"(?i)\bquel(?:le|)s?\b")
    -2> =suggMasSing(@)                                                   # Avec « avoir », il faut un participe passé au masculin singulier.

__gv__  les +([aeo]\w*)-(?:je|tu|ils?|elles?|-t-(?:ils?|elles?)|[nv]ous) +(\w[\w-]*(?:[éiut]e?|is|se))
    <- morph(\1, "po:v0a", False) and morphex(\2, "po:v[1-3]..t.* po:ppas.* is:sg", ":(?:mg|adv|pl|inv)")
    -2> =suggPlur(@)                                                      # Accord avec le COD “les” : Le participe passé « \2 » devrait être au pluriel (et accordé en genre).

## 1pl
__gv__  ^ *nous +(\w\w+)
    <- morphex(\1, "po:v", "po:(?:mg|infi|1pl|3(?:sg|pl))") and not after("^ +(?:je|tu|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "1pl")                                               # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.

## 2pl
__gv__  ^ *vous +(\w\w+)
    <- morphex(\1, "po:v", "po:(?:mg|infi|2pl|3(?:sg|pl))") and not after("^ +(?:je|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "2pl")                                               # Conjugaison erronée. Accord avec « vous ». Le verbe devrait être à la 2ᵉ personne du pluriel.



################################################################################################################################################################
################################################################################################################################################################
## NOUVELLE PASSE
################################################################################################################################################################
################################################################################################################################################################

[++]

#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
#
[pp]

[Word]
^ *ne l(?:es?|a) l(?:ui|eur) -> >
^ *ne (?:[mt]’|l(?:ui|eur) )en -> >
^ *ne (?:[mt]e|[nv]ous) (?:les?|la|en) -> >
^ *ne +(?:en|l(?:es?|a|’(?:en|y))|[mt](?:e|’(?:en|y))|[nv]ous) -> >
^ *n’(?:en|y) -> >

[Char]
n(’)importe quo?i -1> `
^ *ne l’ -> >
^ *n’ -> >

[Word]
^ *ne -> >

#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]

[Word]


#### CONFUSIONS

# ou / où
__conf__  ^ *(l(?:es?|a)|[nv]o(?:s|tre)|ce(?:t|tte|s|)|[mts](?:es|on|a)|des) +(\w[\w-]+) +(ou) +(?:je|tu|ils?|elles? +> +\w+|[nv]ous +> +\w+)
    <- morphex(\2, "po:(?:nom|adj)", "po:mg")
    -3> où                                                                   # Confusion probable.|http://fr.wiktionary.org/wiki/o%C3%B9


#### IMPÉRATIF !

# verbes du 1er et du 3ᵉ groupe en -e
__imp__  ^ *((\w+e)s)(?![- ](je|tu|[nv]ous|ils?|elles?|t-ils?|t-elles?))
    <- morphex(\1, "po:v[13].* po:ipre.* po:2sg", "po:(?:mg|nom|adj)")
    -1> \2                                                                   # S’il s’agit d’un impératif, pas de “s”.
__imp__  ^> *((\w+e)s)(?![- ](je|tu|[nv]ous|ils?|elles?|t-ils?|t-elles?))
    <- morphex(\1, "po:v[13].* po:ipre.* po:2sg", "po:mg")
    -1> \2                                                                   # S’il s’agit d’un impératif, pas de “s”.

# verbes du 2ᵉ et du 3ᵉ groupe en -t
__imp__  ^ *((\w+)t)(?![- ](je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))
    <- morphex(\1, "po:v[23].* po:ipre.* po:3sg", "po:(mg|nom|adj)") and morph(\2+"s", "po:impe po:2sg", False) and not re.match("(?i)doit", \1)
    and not (re.match("(?i)vient$", \1) and after(" +l[ea]")) and morph(\2+"s", "po:impe po:2sg", False)
    -1> \2s                                                                  # S’il s’agit d’un impératif, la terminaison est “is”, non “it”.
__imp__  ^> *((\w+)t)(?![- ](je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))
    <- morphex(\1, "po:v[23].* po:ipre.* po:3sg", "po:mg") and morph(\2+"s", "po:impe po:2sg", False)
    -1> \2s                                                                  # S’il s’agit d’un impératif, la terminaison est “is”, non “it”.

# verbes du 3ᵉ groupe en -d
__imp__  ^ *(\w+d)(?![- ](je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))
    <- morphex(\1, "po:v3.* po:ipre.* po:3sg", "po:(?:mg|nom|adj)")
    -> \1s                                                                   # S’il s’agit d’un impératif, ajoutez un “s”.
__imp__  ^> *(\w+d)(?![- ](je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))
    <- morphex(\1, "po:v3.* po:ipre.* po:3sg", "po:mg")
    -1> \1s                                                                  # S’il s’agit d’un impératif, ajoutez un “s”.


# aller
__imp__  ^>? *(vas)(?![- ](je|tu|[nv]ous|ils?|elles?|t-ils?|t-elles?))
    -1> va                                                                   # S’il s’agit d’un impératif, pas de “s”.

# être
__imp__  ^ *(soit) +(\w[\w-]+)
    <- morphex(\2, "po:adj", "po:mg") and not after(r"\bsoit\b")
    -1> sois                                                                 # S’il s’agit d’un impératif, écrivez « sois ».
__imp__  ^> *(soit)
    -1> sois                                                                 # S’il s’agit d’un impératif, écrivez « sois ».

# avoir
__imp__  ^>? *(ait?|aies)
    -1> aie                                                                  # S’il s’agit d’un impératif, écrivez « aie ».

# Contrôle
__imp__  (\w\w+)-(?:[mt]oi|lui|les|l[ea]|leur|[mt]’en)
    <- not morph(\1, "(?:po:impe|st:chez)", False) and spell(\1)
    -1> _                                                                    # Erreur : ceci n’est pas une forme impérative.|http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29

## Traits d’union manquants
__imp__  (?<![’~])(\w[\w-]+) ([mt]oi)
    <- morphex(\1, "po:impe", "po:(?:prn|patr|mg)")
    -> \1-\2                                                                   # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (?<![’~])(\w[\w-]+) ([nv]ous|lui|y)(?! en| y| est)
    <- morphex(\1, "po:impe", "po:(?:prn|patr|mg)") and not morph(word(1), "po:infi", False, False) and morph(word(-1), "po:cjco", False, True)
    -> \1-\2                                                                   # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (?<![’~])(\w[\w-]+) les(?! plus| moins| mieux| trop| très| en| y)
    <- morphex(\1, "po:impe", "po:(?:prn|patr|mg)") and not morph(word(1), "po:(?:nom|adj|ppas|infi|nb|3(?:sg|pl))", False, False) and morph(word(-1), "po:cjco", False, True)
    -> \1-les                                                                  # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (?<![’~])(\w[\w-]+) (l[ea])(?! plus| moins| mieux| plupart| trop| très| une?)
    <- morphex(\1, "po:impe", "po:(?:prn|patr|mg)") and not morph(word(1), "po:(?:nom|adj|ppas|infi|npr)", False, False) and morph(word(-1), "po:cjco", False, True)
    -> \1-\2                                                                   # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  ([mts])-en -> \1’en                                                    # « \1e » est ici abrégé, c’est une forme élidée. Il faut mettre une apostrophe et non un trait d’union.

__imp__  (\w[\w-]+) ([mt]’(?:en|y))
    <- morphex(\1, "po:impe", "po:(?:prn|patr|mg)") and not morph(word(1), "po:(?:infi|[1-3])", False, False)
    -> \1-\2                                                                   # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (\w[\w-]+)-(en|les|l[ae]) ([mt]oi|lui)
    <- morph(\1, "po:impe", False)
    -> \1-\2-\3                                                                # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (\w[\w-]+)-([mt]oi|[nv]ous|lui|leur|l[ae]|les) (en|y|leur)
    <- morph(\1, "po:impe", False) and morphex(word(1), "po:(?:prep|cj)", "po:(?:nom|adj)", True)
    -> \1-\2-\3                                                                # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

__imp__  (\w[\w-]+)-(l[ae]|les) ([nv]ous)
    <- morph(\1, "po:impe", False) and morphex(word(1), "po:(?:prep|cj)", "po:infi", True)
    -> \1-\2-\3                                                                # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206


__tu__  (v(?:iens|enez|enons)|all(?:ons|ez)) y
    <- not morph(word(1), "po:infi", False, False) -> \1-y                                 # Il manque un trait d’union.
__tu__  vas? y
    <- not word(-1) and not morph(word(1), "po:infi", False, False) -> vas-y               # Il manque un trait d’union.
__tu__  conv(iens|enez|enons) en(?! partie) -> conv\1-en                                    # Il manque un trait d’union.

#__tu__  (\w+) ([mt]oi|[nv]ous|lui|leur) <- morph(\1, "po:v[123].* is:impe", False) -> \1-\2     # Il manque un trait d’union.



################################################################################################################################################################
################################################################################################################################################################
## NOUVELLE PASSE
################################################################################################################################################################
################################################################################################################################################################

[++]

#
# //////////////////////////////////////// PRÉPROCESSEUR ////////////////////////////////////////
#
[pp]

# Brainfuck, mon amour (ici, prudence !)
[Word]
ne +(?:l(?:ui|eur|a|es?)|[mts]e|[nv]ous) +(?:l(?:a|es?|ui)|en|y) -> >
ne +(?:[mts](?:e|’(?:en|y))|[nv]ous|l(?:es?|a|ui|eur|’(?:en|y))) -> >
[mts]e +l(?:a|es?) -> >
[nmsl]’(?:en|y) -> >
l(?:a|es?) +(?:lui|en) -> >
lui +(?:la|les?|en|y) <- not morph(word(-1), "po:prep", False, True) -> >
leur +(?:en|y) <- not morph(word(-1), "po:prep", False, False) -> >
(je|tu|ils?|on) ([nv]ous(?: la| les?|)|l(?:es?|ui|a)) -2> >
(elles?|[nv]ous) ([nv]ous(?: la| les?|)|l(?:es?|ui|a)) <- not morph(word(-1), "po:prep", False, False) -2> >
ce(?:ux|lles?|lui|la|) qui ([nv]ous(?: la| les?|)|l(?:es?|ui|a)) -1> >
(?<!’)(en) (\w[\w-]+) <- morph(\2, "po:[123](?:sg|pl)") -1> >
(tu|il|on) (en) <- not morph(word(-1), "po:[123]sg", False, False) -2> >
(?<!’)elle (en) <- not morph(word(-1), "po:(?:[123]sg|prep)", False, False) -1> >
(?<!’)elles (en) <- not morph(word(-1), "po:(?:[123]pl|prep)", False, False) -1> >
ils (en) <- not morph(word(-1), "po:3pl", False, False) -1> >
(?<!’)(y) (\w[\w-]+) <- morph(\2, "po:[123](?:sg|pl)", False) -1> >
(le) (\w[\w-]+) <- morphex(\2, "po:[123](?:sg|pl)", "po:(?:(?:nom|adj).* is:mas is:(?:sg|inv)|mg|prn|patr|npr)") -1> >
(la) (\w[\w-]+) <- morphex(\2, "po:[123](?:sg|pl)", "po:(?:(?:nom|adj).* is:fem is:(?:sg|inv)|mg|prn|patr|npr)") -1> >
(l’)(\w[\w-]+) <- morphex(\2, "po:[123](?:sg|pl)", "po:(?:(?:nom|adj).* is:(?:sg|inv)|mg|prn|patr|npr)") -1> >
l’a -> > a
(nous) (\w[\w-]+) <- morphex(\2, "po:[123](?:sg|pl)", "po:(?:adj|mg|prn|patr|npr|1pl)") -1> >
(vous) (\w[\w-]+) <- morphex(\2, "po:[123](?:sg|pl)", "po:(?:adj|mg|prn|patr|npr|2pl)") -1> >
(à|de) ([nv]ous|lui|les?|en) -2> >
(s’)(\w\w\w\w+) <- morph(\2, "po:v", False) -1> >
(je|tu|ils?|elles?|on|[nv]ous|ce(?:ux|elles?|lui|la|) qui) (l’)(\w\w\w\w+) <- morph(\3, "po:v", False) -2> >
(t’(?:en|y)) (\w+[\w-]+) <- not morph(\2, "po:2sg", False) or before("(?i)\\b(?:je|tu|on|ils?|elles?|nous) +$") -1> >
(t’)(\w+[\w-]+) <- not morph(\2, "po:2sg", False) or before("(?i)\\b(?:je|tu|on|ils?|elles?|nous) +$") -1> >

[Char]
(?<!-)\bne [mtsl]’ -> >
(?<!-)\b[mts]e +l’ -> >
(?<!-)\b[nm]’ -> >

[Word]
[nmts]e -> >

[char]
> +> -> >
# Fin du Brainfuck


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#
[gc]

[Word]

#### CONFUSION a / à
__conf__  ^ *(je|tu|ils?|on|elles?) +>? *(\w[\w’-]+) +(a)
    <- morph(\2, "po:v", False)
    -3> à                                                                                                 # Confusion probable.
__conf__  ^ *[nv]ous +>? *(\w[\w’-]+) +(a)
    <- morphex(\1, "po:v", "po:infi")
    -2> à                                                                                                 # Confusion probable.
[char]
__conf__  > +(face)\b(?! à) -1> fasse                                                                     # Confusion probable. Pour le subjonctif de “faire”, écrivez “fasse”.

[Word]
#### CONFUSION ÊTRE / AVOIR
__conf__  (?<!’)(est?) +(con(?:fiance|science)|envie|été|p(?:eine|eur)|faim|crainte|affaire|h(?:âte|onte)|recours|soif)
    <- not before(r"\bce que?\b")
    -1> ait                                                        # Confusion probable dans l’expression « avoir \2 ». Vous utilisez ici le verbe « être ».


#### INFINITIF

__infi__  (?:comment|où) +((\w[\w-]+)(?:ée?s?|ez))
    <- morph(\1, "po:v", False) and not (\1.endswith("ez") and after(" +vous"))
    -1> \2er                                                                                              # Le verbe devrait être à l’infinitif.
__infi__  (?:afin|en train|avant|façons?|intentions?|manières?) de +((\w[\w’-]+)(?:ée?s?|ez))
    <- morph(\1, "po:(?:ppas|2pl)", False)
    -1> \2er                                                                                              # Incohérence. Le verbe devrait être à l’infinitif.
__infi__  ((?:aim|all|v|ir|désir|esp|p)\w+) +((\w[\w-]+)(?:ée?s?|ez))
    <- stemchk(\1, u"^(?:aimer|aller|désirer|devoir|espérer|pouvoir|préférer|souhaiter|venir)$", False) and not morph(\1, "po:(?:mg|nom)", False) and morph(\2, "po:v", False)
    -2> \3er                                                                                                        # Le verbe devrait être à l’infinitif.
__infi__  (d[eouû]\w+) +((\w[\w-]+)(?:ée?s?|ez))
    <- stemchk(\1, "^devoir$", False) and morph(\2, "po:v", False) and not morph(word(-1), "po:det", False)
    -2> \3er                                                                                                        # Le verbe devrait être à l’infinitif.
__infi__  ((?:cess|dé|sugg|command|essa|tent|chois|permet|interd)\w*) +(?:pas|plus|point|guère|jamais|peu|rien|) *(?:de +|d’)((\w[\w’-]+)(?:ée?s?|ez))
    <- stemchk(\1, u"^(?:cesser|décider|défendre|suggérer|commander|essayer|tenter|choisir|permettre|interdire)$", False) and morph(\2, "po:(?:ppas|2pl)", False)
    -2> \3er                                                                                                        # Incohérence. Le verbe devrait être à l’infinitif.
__infi__  (?:de quoi|à (?:faire|même de)|avec qui|avant (?:même |)de|marre de|en vue de|du mal à|intérêt à|impossible de|pourquoi|quand|faut-il) +((\w[\w-]+)(?:ée?s?|ez))
    <- morph(\1, "po:(?:ppas|2pl)", False)
    -1> \2er                                                                                                        # Incohérence. Le verbe devrait être à l’infinitif.
__infi__  mieux (va\w+) +((\w[\w-]+)(?:ée?s?|ez))
    <- "valoir" in stem(\1) and morphex(\2, "po:(?:ppas|2pl)", "po:(?:mg|patr|prn)") -2> \3er                  # Le verbe devrait être à l’infinitif.
__infi__  à ((\w[\w-]+)(?:ée?|ez)) <- morphex(\1, "po:v1", "po:nom") and \1 != u"pâté" -1> \2er                # Incohérence. Le verbe devrait être à l’infinitif.
__infi__  ([aeo]\w*) beau ((\w[\w-]+)(?:ée?s?|ez)) <- morphex(\2, "po:v1", "po:nom") -2> \3er                  # Le verbe devrait être à l’infinitif.|http://fr.wiktionary.org/wiki/avoir_beau

#__infi__  ((all|v|ir)\w+) (\w[\w-]+é) <- stem(\1) == ["aller"] and morph(\2, "po:v", False) -> _            # Le verbe « \1 » devrait être à l’infinitif.
#__infi__  [aeo]\w* (dû|[ps]u|voulu) (\w[\w’-]+[éesz]) <- morph(\2, "po:v.* po:(ppas|2pl)", False) -> _      # Le verbe « \2 » devrait être à l’infinitif.


#### PAS D’INFINITIF

__infi__  (?<![cC]’)([êeésf]\w+) +(\w[\w-]+er)
    <- morph(\1, "po:v0e", False) and (morphex(\2, "po:infi", "po:(?:adj|nom)") or \2 in aSHOULDBEVERB) and not re.match(u"(?i)(soit|été)", \1)
    and not morph(word(-1), "(?:po:infi|st:ce)", False, False) and not before("(?i)ce (?:>|qu|que >) $") and not beforechk1(u"(\w[\w-]+) +> $", "po:infi") and not beforechk1(u"^ +>? *(\w[\w-]+)", "po:infi")
    -2> _                                                                  # Incohérence. Après « être », le verbe ne doit pas être à l’infinitif.
__infi__  ([aeo]\w*) +(\w[\w-]+er)
    <- morph(\1, "po:v0a", False) and morph(\2, "po:infi", False)
    -2> _                                                                  # Incohérence. Après « avoir », le verbe ne doit pas être à l’infinitif.


#### CONJUGAISON

## 1sg
__gv__  (je) +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:1sg|mg)") and not (morph(\2, "po:pp", False) and morph(word(-1), "po:v0.* po:1sg", False, False))
    -2> =suggVerb(@, "1sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 1ʳᵉ personne du singulier.
__gv__  (je) +> +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:1sg|mg|1pl)")
    -2> =suggVerb(@, "1sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 1ʳᵉ personne du singulier.
__gv__  (j’(?:y|en)) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:1sg|mg|1pl)")
    -2> =suggVerb(@, "1sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 1ʳᵉ personne du singulier.
__gv__  (moi +qui) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:1sg|mg|1pl|3pl!)")
    -2> =suggVerb(@, "1sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 1ʳᵉ personne du singulier.

## 2sg
__gv__  (tu) +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:mg|(?:i(?:pre|imp|psi|fut)|s(?:pre|imp)|cond).* po:2sg)") and not (morph(\2, "po:pp", False) and morph(word(-1), "po:v0.* po:2sg", False, False))
    -2> =suggVerb(@, "2sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 2ᵉ personne du singulier.
__gv__  (tu) +> +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:mg|(?:i(?:pre|imp|psi|fut)|s(?:pre|imp)|cond).* po:2sg)")
    -2> =suggVerb(@, "2sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 2ᵉ personne du singulier.
__gv__  (toi +qui) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:mg|2pl|3pl!|(?:i(?:pre|imp|psi|fut)|s(?:pre|imp)|cond).* po:2sg)")
    -2> =suggVerb(@, "2sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 2ᵉ personne du singulier.

## 3sg
__gv__  (il|on|quiconque) +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3sg|ppre|mg)") and not (morph(\2, "po:pp", False) and morph(word(-1), "po:v0.* po:3sg", False, False))
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.
__gv__  (il|on|quiconque) +> +([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3sg|ppre|mg)")
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (ce) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:nom|adj|3sg|pp|mg|v0e.* po:3pl)")
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (ce(?:lui|lle|) +qui) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3sg|pp|mg)")
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (ça|chacune?|l’une?|ce(?:ci|la|lui-(?:ci|là)|lle-(?:ci|là))|n`importe quo?i|quelqu(?:’une?|e chose)|tout|l(?:equel|aquelle))(?: +qui|) +>? *(\w[\w-]*)
    <- morphex(\2, "po:v", "po:(?:3sg|pp|mg|3pl!)") and not morph(word(-1), "(?:po:(?:prep|v)|st:de)", False, False) and not(\1.endswith("out") and morph(\2, "po:infi", False))
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (?<![dD]’)elle +([\w’-]+)
    <- morphex(\1, "po:v", "po:(?:3sg|ppre|mg|3pl!)") and not morph(word(-1), "(?:po:prep|st:(?:et|ou))", False, False)
    and not (morph(\1, "po:pp", False) and morph(word(-1), "po:v0.* po:3sg", False, False))
    -1> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « elle ». Le verbe devrait être à la 3ᵉ personne du singulier.
__gv__  (?<![dD]’)elle +> +([\w’-]+)
    <- morphex(\1, "po:v", "po:(?:3sg|ppre|mg|3pl!)") and not morph(word(-1), "(?:po:prep|st:(?:et|ou))", False, False)
    -1> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « elle ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  ^ *(elle|il) +>? *(\w[\w-]+nt)
    <- morphex(\2, "po:3pl", "po:(?:mg|3sg)")
    -1> \1s                                                                # Accord avec « \2 ».
__gv__  ^ *(elles) +>? *(\w[\w-]+)
    <- morphex(\2, "po:3sg", "po:(?:mg|3pl)")
    -1> elle                                                               # Accord avec « \2 ».

__gv__  mieux (va(?:ux|lais|udrais)) -1> =\1[:-1]+"t"                      # Conjugaison erronée. Accord avec “mieux” : utilisez la 3ᵉ personne du singulier.

__gv__  (personne|aucun|rien|nul(?:le|)) +(?:qui +|)> +(\w[\w-]+)
    <- morphex(\2, "po:v", "po:(?:3sg|ppre|mg)") and morphex(word(-1), "po:cj", "po:(?:infi|pp|[1-3](?:sg|pl)|prep)", True)
    and not( \1.endswith("ien") and before("> +$") and morph(\2, "po:infi", False) )
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1… ». Le verbe devrait être à la 3ᵉ personne du singulier.


__gv__  ^ *(\w[\w-]*(?:er|ir|re)) +>? *(\w[\w-]+)
    <- morph(\1, "po:infi", False) and morph(\2, "po:v.\w+(?!.* po:(?:3sg|pp|infi|3pl!))") 
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1… ». Le verbe devrait être à la 3ᵉ personne du singulier.


__gv__  (?<![dD]’)(l[ea] |une? |l’|[mts](?:on|a) |ce(?:tte|t|) |leur ) *(\w[\w-]+) +(?:qui +|)(?!j’|c’)(\w[\w’-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and morph(\2, "po:(?:nom|adj|ppas).* is:(?:sg|inv)", False) and morph(\3, "po:v.\w+(?!.* po:(?:3sg|pp|infi|3pl!))")
    and not (re.match("(?i)et|ou$", word(-1)) and morph(\3, "po:[1-3]pl", False)) and not before(r"(?i)\bni .* ni\b")
    -3> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du singulier.
__gv__  (?<![dD]’)(l[ea] |une? |l’|[mts](?:on|a) |ce(?:tte|t|) |leur |nul(?:le|) ) *(\w[\w-]+) +(?:qui +|)> +(\w[\w’-]+)
    <- morphex(word(-1), "po:cj", "is:(?:infi|ppre)", True) and morph(\2, "po:(?:nom|adj|ppas).* is:(?:sg|inv)", False) and morphex(\3, "po:v", "po:(?:3sg|1pl|pp|infi|3pl!|mg)")
    and not (re.match("(?i)et|ou$", word(-1)) and morph(\3, "po:[1-3]pl", False)) and not before(r"(?i)\bni .* ni\b")
    -3> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du singulier.

# confusions noms/adjectifs/verbes (voir règles DPP)
__gv__  (?<![dD]’)(une?|[mts](?:on|a)|ce(?:tte|t|)) +(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isAmbiguousAndWrong(\2, \3, "sg", "3sg")
    and not (re.match("(?i)et|ou$", word(-1)) and morph(\3, "(?:po:[1-3]pl|is:pl)", False)) and not before(r"(?i)\bni .* ni\b")
    -3> =suggVerb(@, "3sg")       # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

__gv__  (l(?:e(?:ur|) |a |’)) *(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isVeryAmbiguousAndWrong(\2, \3, "sg", "3sg", not word(-1))
    and not (re.match("(?i)et|ou$", word(-1)) and morph(\3, "(?:po:[1-3]pl|is:pl)", False)) and not before(r"(?i)\bni .* ni\b")
    -3> =suggVerb(@, "3sg")       # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

## Incohérences avec formes verbales 1sg et 2sg
__gv__  \w*ai(?! je)
    <- ( morph(\0, "po:1sg") or ( before("> +$") and morph(\0, "po:1sg", False) ) ) and not (\0[0:1].isupper() and before(r"\w"))
    and not before(u"(?i)\\b(?:j(?:e |’)|moi,? qui )")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.
__gv__  \w*es(?! tu)
    <- morphex(\0, "po:2sg", "po:(?:impe|mg|adv|prn|patr|npr|interj|[13](?:sg|pl)|2pl)") and not \0[0:1].isupper() and not before("^ *$")
    and ( not morph(\0, "po:(?:nom|adj)", False) or before("> +$") )
    and not before(u"(?i)\\bt(?:u |’|oi,? qui )")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
__gv__  \w+as(?! tu)
    <- morphex(\0, "po:2sg", "po:(?:mg|adv|prn|patr|npr|interj|[13](?:sg|pl)|2pl)") and not (\0[0:1].isupper() and before(r"\w"))
    and ( not morph(\0, "po:(?:nom|adj)", False) or before("> +$") )
    and not before(u"(?i)\\bt(?:u |’|oi,? qui )")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
__gv__  \w+[iudnrtpcï]s(?! (?:tu|je))
    <- morphex(\0, "po:[12]sg", "po:(?:impe|mg|adv|prn|patr|npr|interj|3(?:sg|pl)|2pl|1pl)") and not (\0[0:1].isupper() and before(r"\w"))
    and ( not morph(\0, "po:(?:nom|adj)", False) or before("> +$") or ( re.match(u"(?i)étais$", \0) and not morph(word(-1), "po:(?:det|adj).* is:pl", False, True) ) )
    and not before(u"(?i)\\b(?:j(?:e |’)|moi,? qui |t(?:u |’|oi,? qui ))")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Le sujet de cette forme verbale est introuvable.
__gv__  [pv]eux(?! (?:tu|je))
    <- not (\0[0:1].isupper() and before(r"\w")) and not before(u"(?i)\\b(?:j(?:e |’)|moi,? qui |t(?:u |’|oi,? qui ))")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Le sujet de cette forme verbale est introuvable.
__gv__  (équi|pré|)vaux(?! (?:tu|je))
    <- not (\0[0:1].isupper() and before(r"\w")) and not before(u"(?i)\\b(?:j(?:e |’)|moi,? qui |t(?:u |’|oi,? qui ))")
    -> =suggVerb(@, "3sg")                                                # Incohérence. Le sujet de cette forme verbale est introuvable.

## 1pl
__gv__  ^ *nous +> +(\w+)
    <- morphex(\1, "po:v", "po:(?:1pl|3(?:sg|pl))") and not after("^ +(?:je|tu|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "1pl")                                               # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.
__gv__  ^ *nous +qui +>? *(\w+)
    <- morphex(\1, "po:v", "po:1pl") and not after("^ +(?:je|tu|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "1pl")                                               # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.
__gv__  ^ *nous +(?:qui +(?:> +|)|> +|)(\w+ont)
    <- morphex(\1, "po:v", "po:1pl") and not after("^ +(?:ils|elles)")
    -1> =suggVerb(@, "1pl")                                               # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.

## 2pl
__gv__  ^ *vous +> +(\w+)
    <- morphex(\1, "po:v", "po:(?:2pl|3(?:sg|pl))") and not after("^ +(?:je|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "2pl")                                               # Conjugaison erronée. Accord avec « vous ». Le verbe devrait être à la 2ᵉ personne du pluriel.
__gv__  ^ *vous +qui +>? *(\w+)
    <- morphex(\1, "po:v", "po:2pl") and not after("^ +(?:je|ils?|elles?|on|[vn]ous)")
    -1> =suggVerb(@, "2pl")                                               # Conjugaison erronée. Accord avec « vous ». Le verbe devrait être à la 2ᵉ personne du pluriel.

## 3pl
__gv__  (ils) +(\w[\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)") and not (morph(\2, "po:pp", False) and morph(word(-1), "po:v0.* po:3pl", False, False))
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du pluriel.
__gv__  (ils) +> +(\w[\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)")
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du pluriel.

__gv__  (ce(?:ux|lles) +qui) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)")
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (ce(?:ux-(?:ci|là)|lles-(?:ci|là))|lesquel(?:le|)s)(?: +qui|) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)") and not morph(word(-1), "po:(?:prep|v)", False, False)
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  (?<![dD]’)elles +(\w[\w’-]+)
    <- morphex(\1, "po:v", "po:(?:3pl|pp|mg)") and not morph(word(-1), "po:prep", False, False) and not (morph(\1, "po:pp", False) and morph(word(-1), "po:v0.* is:3pl", False, False))
    -1> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « elles ». Le verbe devrait être à la 3ᵉ personne du pluriel.
__gv__  (?<![dD]’)elles +> +([\w’-]+)
    <- morphex(\1, "po:v", "po:(?:3pl|pp|mg)") and not morph(word(-1), "po:prep", False, False)
    -1> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « elles ». Le verbe devrait être à la 3ᵉ personne du pluriel.


__gv__  (ils|c?eux +qui|c?elles +qui) +(on)
    -2> ont                                                                # Incohérence : « on » est un pronom personnel, « ont » est une conjugaison du verbe avoir.

__gv__  (?<![dD]’)(elles|ceux-(?:ci|là)|celles-(?:ci|là)) +(on)
    <- not re.match(u"(à|avec|sur|chez|par|dans)$", word(-1))
    -2> ont                                                                # Conjugaison : « on » est un pronom personnel, « ont » est une conjugaison du verbe avoir.

__gv__  (beaucoup|d’aucuns|la plupart) +>? *(\w[\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)") and not morph(word(-1), "(?:po:(?:prep|v)|st:de )", False, False)
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du pluriel.

__gv__  (beaucoup|d’aucuns|la plupart) +qui +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:3pl|pp|mg)") and not morph(word(-1), "po:(?:prep|v)", False, False)
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du pluriel.

__gv__  (?<!de )(certaine?s|tou(?:te|)s|plusieurs)(?: +qui|) +>? *([\w’-]+)
    <- morphex(\2, "po:v", "po:(?:mg|adj|nom|3pl|pp)") and not morph(word(-1), "po:(?:prep|v)", False, False)
    -2> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du pluriel.

__gv__  ([lcmts]es|[nv]os|leurs|quelques|certaine?s|plusieurs) +(\w[\w-]+) +(?:qui +|)(?!j’|c’)(\w[\w’-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morph(\3, "po:v.\w+(?!.* po:(?:[13]pl|pp|infi))")
    -3> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
__gv__  ([lcmts]es|[nv]os|leurs|quelques|certaine?s|plusieurs) +(\w[\w-]+) +(?:qui +|)> +(\w[\w’-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morphex(\3, "po:v", "po:(?:[13]pl|ppre|infi|mg)")
    -3> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.


__gv__  ^ *(des) +(\w[\w-]+) +(?:> +|)(\w[\w’-]+)
    <- morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morphex(\3, "po:v", "po:(?:[13]pl|ppre|mg)") and morph(word(1), "po:(?:prep|det.* is:pl)|st:au ", False, True)
    -3> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
__gv__  ^ *(des) +(\w[\w-]+) +qui +(?:> +|)(\w[\w’-]+)
    <- morph(\2, "po:(?:nom|adj).* is:(?:pl|inv)", False) and morphex(\3, "po:v", "po:(?:[13]pl|ppre|mg)")
    -3> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.


# confusions noms/adjectifs/verbes (voir règles DPP)
__gv__  ([cmts]es|[nv]os|leurs|quelques) +(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isAmbiguousAndWrong(\2, \3, "pl", "3pl")
    -3> =suggVerb(@, "3pl")       # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

__gv__  les +(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isVeryAmbiguousAndWrong(\1, \2, "pl", "3pl", not word(-1))
    -2> =suggVerb(@, "3pl")       # Accord avec « les \1… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

__gv__  certains +(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isVeryAmbiguousAndWrong(\1, \2, "mas pl", "3pl", not word(-1))
    -2> =suggVerb(@, "3pl")       # Accord avec « certains \1… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

__gv__  certaines +(\w[\w-]+)~ *(\w[\w-]+)
    <- morphex(word(-1), "po:cj", "po:(?:infi|ppre)", True) and isVeryAmbiguousAndWrong(\1, \2, "fem pl", "3pl", not word(-1))
    -2> =suggVerb(@, "3pl")       # Accord avec « certaines \1… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.


## Quel(le) que soit / quel(le)s que soient

# singulier
__gv__  quel(?:le|)s? que ([sf]\w+) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)
    <- morphex(\1, "po:v0e", "po:3sg")
    -1> =suggVerb(@, "3sg")                                                            # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du singulier.

__gv__  (quel(?:le|)s) que ([sf]\w+t) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)
    <- morphex(\2, "po:v0e.* po:3sg", "po:3pl")
    -1> =\1[:-1]                                                                       # Accord avec “\2”. Utilisez le singulier.

# pluriel
__gv__  quel(?:le|)s? que ([sf]\w+) +(?:[lscmt]es|[nv]os|leurs)
    <- morphex(\1, "po:v0e", "po:3pl")
    -1> =suggVerb(@, "3pl")                                                            # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du pluriel.

__gv__  (quel(?:le|)) que ([sf]\w+ent) +(?:[lscmt]es|[nv]os|leurs)
    <- morphex(\2, "po:v0e.* po:3pl", "po:3sg")
    -1> \1s                                                                            # Accord avec “\2”. Utilisez le pluriel.


#### NOMS PROPRES

# 3sg
__gv__  (?<!et |ou |[dD][eu] |ni )([A-ZÉÈ][\w-]+) +>? *([\w’-]+)
    <- morph(\1, "po:(?:prn|patr|npr)", False) and morphex(\2, "po:[123](?:sg|pl)", "po:(?:mg|3sg|3pl!|ppre|(?:adj|ppas).* is:(?:sg|inv))")
    and not morph(word(-1), "po:(?:prep|v|det)", False, False) and not before(u"([A-ZÉÈ][\w-]+), +([A-ZÉÈ][\w-]+), +$")
    -2> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

# 3pl
__gv__  (?<!et |ou |[dD][eu] |ni )([A-ZÉÈ][\w-]+) et ([A-ZÉÈ][\w-]+) +>? *([\w’-]+)
    <- morph(\1, "po:(?:prn|patr|npr)", False) and morph(\2, "po:(?:prn|patr|npr)", False)
    and morphex(\3, "po:[123](?:sg|pl)", "po:(?:mg|3pl|ppre|ppas.* is:(?:pl|inv))") and not morph(word(-1), "po:prep", False, False)
    -3> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \1 et \2 ». Le verbe devrait être à la 3ᵉ personne du pluriel.



#### INVERSION VERBE SUJET

__gv__  que? +(\w+) (l(?:e(?:ur|)|a|’)|[mts]on|cet?) +(?!plupart)(\w+)
    <- morphex(\1, "po:(?:[12]sg|3pl)", "po:(?:3sg|mg|adv|3pl!)")
    -1> =suggVerb(@, "3sg")                                               # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du singulier.

__gv__  que? +(\w+) ([ldcmts]es) (\w+)
    <- morphex(\1, "po:[123]sg", "po:(?:3pl|mg|adv)")
    -1> =suggVerb(@, "3pl")                                               # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

__gv__  "que? +(\w[\w-]*)  "
    <- morphex(\1, "po:[12](?:sg|pl)", "po:(?:mg|adv|3(?:sg|pl)|infi|pp)")
    -1> _                                                                  # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

__gv__  que +> +(\w+) (?![jJ]e|[tT]u|[nNvV]ous|[eE]t)
    <- morphex(\1, "po:[12](?:sg|pl)", "po:(?:mg|adv|3(?:sg|pl))")
    -1> _                                                                  # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.


#### INTERROGATIVES ?

__inte__  (?<![jJ]’)((\w[\w-]+)[éèe]) je(?! +ne)
    <- morphex(\1, "po:v.* po:1sg", "po:(?:mg|adv|nom)") and not before(r"(?i)\bje +>? *$")
    -> \2é-je                                                                  # Forme interrogative ? Mettez un trait d’union.
__inte__  (?<![jJ]’)((\w[\w-]+)[^éèe]) je(?! +ne)
    <- morphex(\1, "po:v.* po:1sg", "po:(?:mg|adv|nom)") and not before(r"(?i)\bje +>? *$")
    -> \1-je                                                                   # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]+s) tu
    <- not after("^ +(?:en|y|ne|>)") and morphex(\1, "po:v.* po:2sg", "po:(?:mg|adv|nom)") and not before(r"(?i)\b(je|tu) +>? *$")
    -> \1-tu                                                                   # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]+[td]) (il|on)
    <- not after("^ +(?:en|y|ne|>)") and morphex(\1, "po:v.* po:3sg", "(po:(?:mg|adv|nom)|dp:ca)") and not before(r"(?i)\b(ce|il|elle|on) +>? *$")
    -> \1-\2                                                                   # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]+[td]) elle
    <- not after("^ +(?:en|y|ne|aussi|>)") and morphex(\1, "po:v.* po:3sg", "(po:(?:mg|adv|nom)|dp:ca)") and not before(r"(?i)\b(ce|il|elle|on) +>? *$")
    -> \1-elle                                                                 # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]*[eac])(?: t[’ -]|-t[’ ])(il|elle|on)
    <- not after("^ +(?:en|y|ne)") and morphex(\1, "po:v.* po:3sg", "po:(?:mg|adv|nom)")
    -> \1-t-\2                                                                 # Forme interrogative ? Mettez deux traits d’union.
__inte__  (\w[\w’-]+ons) nous
    <- not after("^ +(?:en|y|ne|aussi|>)") and morphex(\1, "po:v.* po:1pl", "po:(?:mg|adv|nom)")
    and not morph(word(-1), "po:propersuj", False, False) and not morph(word(1), "po:infi", False, False)
    -> \1-nous                                                                 # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]+ez) vous
    <- not after("^ +(?:en|y|ne|aussi|>)") and not \1.endswith("euillez") and morphex(\1, "po:v.* is:2pl", "po:(?:mg|adv|nom)")
    and not morph(word(-1), "po:propersuj", False, False) and not morph(word(1), "po:infi", False, False)
    -> \1-vous                                                                 # Forme interrogative ? Mettez un trait d’union.
__inte__  (\w[\w’-]+nt) (ils|elles)
    <- not after("^ +(?:en|y|ne|aussi|>)") and morphex(\1, "po:v.* po:3pl", "po:(?:mg|adv|nom)") and not before(r"(?i)\b(ce|ils|elles) +>? *$")
    -> \1-\2                                                                   # Forme interrogative ? Mettez un trait d’union.

# Note : pour les règles suivantes, il faut vérifier que \1 existe (spell(\1)) à cause du bug Python 2.x sur les regex.
__inte__  (\w+)-je <- not morph(\1, "po:1[ij]?sg", False) and spell(\1) and not re.match("(?i)vite$", \1)
    -1> =suggVerb(@, "1isg")                                                  # Forme interrogative : « \1 » n’est pas un verbe à la 1ʳᵉ personne du singulier.
__inte__  (\w+)-tu <- not morph(\1, "po:(?:[is](?:pre|imp)|ipsi|ifut|cond).* po:2sg", False) and spell(\1) and not re.match("(?i)vite$", \1)
    -1> =suggVerb(@, "2sg")                                                   # Forme interrogative. « \1 » n’est pas un verbe à la 2ᵉ personne du singulier.
__inte__  (\w+)-(?:t-|)(il|elle|on) <- \1 != "t" and not morph(\1, "po:3sg", False) and (not \1.endswith(u"oilà") or \2 != "il") and spell(\1) and not re.match("(?i)vite$", \1)
    -1> =suggVerb(@, "3sg")                                                   # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du singulier.
__inte__  (\w+ent)-(il|elle) <- morphex(\1, "po:3pl", "po:3sg") and spell(\1)
    -2> \2s                                                                   # Forme interrogative : accordez “\2” avec le verbe à la 3ᵉ personne du pluriel.
__inte__  (\w+)-nous <- not morph(\1, "po:(?:1pl|2sg|2pl)", False) and spell(\1) and not re.match("(?i)(vite|chez)$", \1)
    -1> _                                                                      # Forme interrogative ou impérative incorrecte.
__inte__  (\w+)-vous <- not morph(\1, "po:2pl", False) and spell(\1) and not re.match("(?i)(tes|vite)$", \1) and not spell(\0)
    -1> _                                                                      # Forme interrogative ou impérative incorrecte.
__inte__  (\w+)-(?:ils|elles) <- \1 != "t" and not morph(\1, "po:3pl", False) and spell(\1)
    -1> =suggVerb(@, "3pl")                                                   # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du pluriel.

__inte__  (\w[\w’]*)-(?:je|tu|(?:t-|)(?:il|elle|on)|nous|vous|ils|elles)
    <- not morph(\1, "po:v", False) and not \1.endswith(u"oilà") and not re.match("(?i)vite$", \1) and spell(\1)
    -1> _                                                                      # Forme interrogative. Incohérence : « \1 » n’est pas un verbe.

[Char]
__inte__  [- ]t-(ils|elles|tu|je|[nv]ous)\b -> -\1       # Le “t” euphonique ne s’emploie qu’avec “il”, “elle” ou “on” dans certains cas.|http://66.46.185.79/bdl/gabarit_bdl.asp?T1=t+euphonique
__inte__  (?<=[td])[- ]t-(il|elle|on)\b -> -\1           # Le “t” euphonique n’est pas nécessaire quand le verbe se termine par “t” ou “d”.|http://66.46.185.79/bdl/gabarit_bdl.asp?T1=t+euphonique


#### CONTRÔLE DES MODES

[Word]

# Si suivi du conditionnel ou du subjonctif
__gv__  si +(\w+) +>? *(\w[\w-]+)
    <- morph(\1, "po:(?:propersuj|patr|prn|npr)", False) and morphex(\2, "po:(?:cond|spre|simp)", "po:(?:mg|v0|i)") and not word(-1)
    -2> _                                                                  # Ce verbe ne devrait être ni au conditionnel, ni au subjonctif.
__gv__  (?:si [jt]’|s’ils? )>? *(\w[\w-]+)
    <- morphex(\1, "po:(?:cond|spre|simp)", "po:(?:mg|v0|i(?:pre|imp|fut|psi))") and not word(-1)
    -1> _                                                                  # Ce verbe ne devrait être ni au conditionnel, ni au subjonctif.

# verbe que + subjonctif
__gv__  (afin|pour|quoi|(?:perm|fa|v|ordonn|exig|désir|suff)[\w-]+) +que? +(\w+) +>? *(\w[\w-]+)
    <- stemchk(\1, u"^(afin|pour|quoi|permettre|falloir|vouloir|ordonner|exiger|désirer|suffire)$", False)
    and morph(\2, "po:(?:prn|patr|npr|propersuj)", False) and not morph(\3, "po:(?:spre|simp|mg|infi)", False)
    -3> =suggVerbMode(@, "s", \2)                                           # Ce verbe devrait être au subjonctif.

# indicatif nécessaire
__gv__  ^ *(je|tu|ils?|elles?|on|nous|vous) +>? *(\w[\w-]+)
    <- morphex(\2, "po:spre", "po:(?:i(?:pre|imp|fut|psi)|cond|mg)")
    -2> =suggVerbMode(@, "i", \1)                                           # Ce verbe ne devrait pas être au subjonctif.

# Après que + indicatif
__gv__  après que? (\w[\w-]+) +>? *(\w[\w-]+)
    <- morph(\1, "po:(?:propersuj|patr|prn|npr)", False) and morph(\2, "po:v.* po:s(?:pre|imp)")
    -2> =suggVerbMode(@, "i", \1)               # Après « après que », le verbe s’emploie pas au subjonctif mais à l’indicatif, si l’action s’est déroulée de façon certaine.



################################################################################################################################################################
################################################################################################################################################################
## GRAMMALECTE CODE
################################################################################################################################################################
################################################################################################################################################################

[code]

# Exceptions
aREGULARPLURAL = frozenset(["abricot", "amarante", "aubergine", "acajou", "anthracite", "brique", "caca", u"café", "carotte", "cerise", "chataigne", "corail", "citron", u"crème", "grave", "groseille", "jonquille", "marron", "pervenche", "prune", "sable"])
aSHOULDBEVERB = frozenset(["aller", "manger"]) 

def show (s):
    "Debug: à utiliser dans les conditions pour affichage"
    echo("SHOW: " + s)
    return True

def ceOrCet (s):
    if re.match("(?i)[aeéèêiouyâîï]", s):
        return "cet"
    if s[0:1] == "h" or s[0:1] == "H":
        return "ce|cet"
    return "ce"

def formatNumber (s):
    nLen = len(s)
    if nLen == 10:
        sRes = s[0] + u" " + s[1:4] + u" " + s[4:7] + u" " + s[7:]                                  # nombre ordinaire
        if s.startswith("0"):
            sRes += u"|" + s[0:2] + u" " + s[2:4] + u" " + s[4:6] + u" " + s[6:8] + u" " + s[8:]    # téléphone français
            if s[1] == "4" and (s[2]=="7" or s[2]=="8" or s[2]=="9"):
                sRes += u"|" + s[0:4] + u" " + s[4:6] + u" " + s[6:8] + u" " + s[8:]                # mobile belge
            sRes += u"|" + s[0:3] + u" " + s[3:6] + u" " + s[6:8] + u" " + s[8:]                    # téléphone suisse
        sRes += u"|" + s[0:4] + u" " + s[4:7] + "-" + s[7:]                                         # téléphone canadien ou américain
        return sRes 
    elif nLen == 9:
        sRes = s[0:3] + u" " + s[3:6] + u" " + s[6:]                                                # nombre ordinaire
        if s.startswith("0"):
            sRes += "|" + s[0:3] + u" " + s[3:5] + u" " + s[5:7] + u" " + s[7:9]                    # fixe belge 1
            sRes += "|" + s[0:2] + u" " + s[2:5] + u" " + s[5:7] + u" " + s[7:9]                    # fixe belge 2
        return sRes
    elif nLen < 4:
        return ""
    sRes = ""
    nEnd = nLen
    while nEnd > 0:
        nStart = max(nEnd-3, 0)
        if not sRes:
            sRes = s[nStart:nEnd]
        else:
            sRes = s[nStart:nEnd] + u" " + sRes
        nEnd = nEnd - 3
    return sRes

def formatNF (s):
    try:
        m = re.match(u"NF[  -]?(C|E|P|Q|S|X|Z|EN(?:[  -]ISO|))[  -]?([0-9]+(?:[/‑-][0-9]+|))", s)
        if not m:
            return ""
        return u"NF " + m.group(1).upper().replace(" ", u" ").replace("-", u" ") + u" " + m.group(2).replace("/", u"‑").replace("-", u"‑")
    except:
        traceback.print_exc()
        return ""
    
