Grammalecte  Check-in [d86a7e72a6]

Overview
Comment:[fr] ajustements [core][fr] suggestions mechanism update
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | core
Files: files | file ages | folders
SHA3-256: d86a7e72a6c6f6f351d2b2219b1a00f549983bb093de83837f5f65b5ec3f78f9
User & Date: olr on 2021-02-09 10:09:21
Other Links: manifest | tags
Context
2021-02-09
10:17
[fr] dictionnaire: suppression du drapeau iM. Verbe “s’enquérir” -> iK check-in: 1c781094d2 user: olr tags: fr, trunk
10:09
[fr] ajustements [core][fr] suggestions mechanism update check-in: d86a7e72a6 user: olr tags: core, fr, trunk
2021-02-06
18:17
[fr] ajustements check-in: 7830f4d1c0 user: olr tags: fr, trunk
Changes

Modified gc_lang/fr/modules-js/cregex.js from [af981c2a51] to [c1ba0b4cea].

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
..
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
..
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
...
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
...
340
341
342
343
344
345
346
347

348
349
350
351
352
353
354
355
356
357


var cregex = {
    ///// Lemme
    _zLemma: new RegExp(">([a-zà-öø-ÿ0-9Ā-ʯ][a-zà-öø-ÿ0-9Ā-ʯ-]+)"),

    ///// Masculin / féminin / singulier / pluriel
    _zGender: new RegExp(":[mfe]"),
    _zNumber: new RegExp(":[spi]"),
    _zGenderNumber: new RegExp(":[mfe]:[spi]"),

    ///// Nom et adjectif
    _zNA: new RegExp(":[NA]"),

    //// nombre
    _zNAs: new RegExp(":[NA].*:s"),
................................................................................
    _zNAm: new RegExp(":[NA].*:m"),
    _zNAf: new RegExp(":[NA].*:f"),
    _zNAe: new RegExp(":[NA].*:e"),
    _zNAme: new RegExp(":[NA].*:[me]"),
    _zNAfe: new RegExp(":[NA].*:[fe]"),

    //// nombre et genre
    // singuilier
    _zNAms: new RegExp(":[NA].*:m.*:s"),
    _zNAfs: new RegExp(":[NA].*:f.*:s"),
    _zNAes: new RegExp(":[NA].*:e.*:s"),
    _zNAmes: new RegExp(":[NA].*:[me].*:s"),
    _zNAfes: new RegExp(":[NA].*:[fe].*:s"),

    // singulier et invariable
................................................................................
    ///// FONCTIONS

    getLemmaOfMorph: function (sMorph) {
        return this._zLemma.exec(sMorph)[1];
    },

    agreement: function (l1, l2) {
        // check number agreement
        if (!this.mbInv(l1) && !this.mbInv(l2)) {
            if (this.mbSg(l1) && !this.mbSg(l2)) {
                return false;
            }
            if (this.mbPl(l1) && !this.mbPl(l2)) {
                return false;
            }
        }
        // check gender agreement
        if (this.mbEpi(l1) || this.mbEpi(l2)) {
            return true;
        }
        if (this.isMas(l1) && !this.mbMas(l2)) {
            return false;
        }
        if (this.isFem(l1) && !this.mbFem(l2)) {

            return false;
        }
        return true;
    },

    checkConjVerb: function (lMorph, sReqConj) {
        return lMorph.some(s  =>  s.includes(sReqConj));
    },

    getGender: function (lMorph) {
        // returns gender of word (':m', ':f', ':e' or empty string).
        let sGender = "";
        for (let sMorph of lMorph) {
            let m = this._zGender.exec(sMorph);
            if (m) {
                if (!sGender) {
                    sGender = m[0];
                } else if (sGender != m[0]) {
                    return ":e";
                }
            }
        }
        return sGender;
    },

    getNumber: function (lMorph) {
        // returns number of word (':s', ':p', ':i' or empty string).
        let sNumber = "";
        for (let sMorph of lMorph) {
            let m = this._zNumber.exec(sMorph);
            if (m) {
                if (!sNumber) {
                    sNumber = m[0];
                } else if (sNumber != m[0]) {
                    return ":i";
                }
            }
        }
        return sNumber;
    },

    getGenderNumber: function (lMorph) {
        // returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string)
        let sGender = "";
        let sNumber = "";
        for (let sMorph of lMorph) {
            let m = this._zGenderNumber.exec(sMorph);
            if (m) {
................................................................................
        return lMorph.some(s  =>  this._zNPm.test(s));
    }
};


if (typeof(exports) !== 'undefined') {
    exports._zLemma = cregex._zLemma;
    exports._zGender = cregex._zGender;
    exports._zNumber = cregex._zNumber;
    exports._zNA = cregex._zNA;
    exports._zNAs = cregex._zNAs;
    exports._zNAp = cregex._zNAp;
    exports._zNAi = cregex._zNAi;
    exports._zNAsi = cregex._zNAsi;
    exports._zNApi = cregex._zNApi;
    exports._zNAm = cregex._zNAm;
................................................................................
    exports._zNnotA = cregex._zNnotA;
    exports._zPNnotA = cregex._zPNnotA;
    exports._zNP = cregex._zNP;
    exports._zNPm = cregex._zNPm;
    exports._zNPf = cregex._zNPf;
    exports._zNPe = cregex._zNPe;
    exports.getLemmaOfMorph = cregex.getLemmaOfMorph;
    exports.checkAgreement = cregex.checkAgreement;

    exports.checkConjVerb = cregex.checkConjVerb;
    exports.getGender = cregex.getGender;
    exports.getNumber = cregex.getNumber;
    exports.isNom = cregex.isNom;
    exports.isNomNotAdj = cregex.isNomNotAdj;
    exports.isAdj = cregex.isAdj;
    exports.isNomAdj = cregex.isNomAdj;
    exports.isNomVconj = cregex.isNomVconj;
    exports.isInv = cregex.isInv;
    exports.isSg = cregex.isSg;







<
<







 







|







 







|
|
|
|
<
<
|
|
<
<
<
<
<
<
<
<
<
>









<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







 







<
<







 







|
>

<
<







5
6
7
8
9
10
11


12
13
14
15
16
17
18
..
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
..
82
83
84
85
86
87
88
89
90
91
92


93
94









95
96
97
98
99
100
101
102
103
104
































105
106
107
108
109
110
111
...
251
252
253
254
255
256
257


258
259
260
261
262
263
264
...
294
295
296
297
298
299
300
301
302
303


304
305
306
307
308
309
310


var cregex = {
    ///// Lemme
    _zLemma: new RegExp(">([a-zà-öø-ÿ0-9Ā-ʯ][a-zà-öø-ÿ0-9Ā-ʯ-]+)"),

    ///// Masculin / féminin / singulier / pluriel


    _zGenderNumber: new RegExp(":[mfe]:[spi]"),

    ///// Nom et adjectif
    _zNA: new RegExp(":[NA]"),

    //// nombre
    _zNAs: new RegExp(":[NA].*:s"),
................................................................................
    _zNAm: new RegExp(":[NA].*:m"),
    _zNAf: new RegExp(":[NA].*:f"),
    _zNAe: new RegExp(":[NA].*:e"),
    _zNAme: new RegExp(":[NA].*:[me]"),
    _zNAfe: new RegExp(":[NA].*:[fe]"),

    //// nombre et genre
    // singulier
    _zNAms: new RegExp(":[NA].*:m.*:s"),
    _zNAfs: new RegExp(":[NA].*:f.*:s"),
    _zNAes: new RegExp(":[NA].*:e.*:s"),
    _zNAmes: new RegExp(":[NA].*:[me].*:s"),
    _zNAfes: new RegExp(":[NA].*:[fe].*:s"),

    // singulier et invariable
................................................................................
    ///// FONCTIONS

    getLemmaOfMorph: function (sMorph) {
        return this._zLemma.exec(sMorph)[1];
    },

    agreement: function (l1, l2) {
        // returns True if agreement in gender and number is possible between morphologies <l1> and <l2>
        let [sGender1, sNumber1] = this.getGenderNumber(l1);
        let [sGender2, sNumber2] = this.getGenderNumber(l2);
        if (sNumber1 !== ":i" && sNumber2 !== ":i" && sNumber1 !== sNumber2) {


            return false;
        }









        if (sGender1 !== ":e" && sGender2 !== ":e" && sGender1 !== sGender2) {
            return false;
        }
        return true;
    },

    checkConjVerb: function (lMorph, sReqConj) {
        return lMorph.some(s  =>  s.includes(sReqConj));
    },

































    getGenderNumber: function (lMorph) {
        // returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string)
        let sGender = "";
        let sNumber = "";
        for (let sMorph of lMorph) {
            let m = this._zGenderNumber.exec(sMorph);
            if (m) {
................................................................................
        return lMorph.some(s  =>  this._zNPm.test(s));
    }
};


if (typeof(exports) !== 'undefined') {
    exports._zLemma = cregex._zLemma;


    exports._zNA = cregex._zNA;
    exports._zNAs = cregex._zNAs;
    exports._zNAp = cregex._zNAp;
    exports._zNAi = cregex._zNAi;
    exports._zNAsi = cregex._zNAsi;
    exports._zNApi = cregex._zNApi;
    exports._zNAm = cregex._zNAm;
................................................................................
    exports._zNnotA = cregex._zNnotA;
    exports._zPNnotA = cregex._zPNnotA;
    exports._zNP = cregex._zNP;
    exports._zNPm = cregex._zNPm;
    exports._zNPf = cregex._zNPf;
    exports._zNPe = cregex._zNPe;
    exports.getLemmaOfMorph = cregex.getLemmaOfMorph;
    exports.agreement = cregex.agreement;
    exports.getGenderNumber = cregex.getGenderNumber;
    exports.checkConjVerb = cregex.checkConjVerb;


    exports.isNom = cregex.isNom;
    exports.isNomNotAdj = cregex.isNomNotAdj;
    exports.isAdj = cregex.isAdj;
    exports.isNomAdj = cregex.isNomAdj;
    exports.isNomVconj = cregex.isNomVconj;
    exports.isInv = cregex.isInv;
    exports.isSg = cregex.isSg;

Modified gc_lang/fr/modules-js/gce_analyseur.js from [822c4ce723] to [7da47c7f30].

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

function queryNamesPOS (sWord1, sWord2) {
    let lMorph1 = gc_engine.oSpellChecker.getMorph(sWord1);
    let lMorph2 = gc_engine.oSpellChecker.getMorph(sWord2);
    if (lMorph1.length == 0 || lMorph2.length == 0) {
        return ":N:e:p";
    }
    let sGender1 = cregex.getGender(lMorph1);
    let sGender2 = cregex.getGender(lMorph2);
    if (sGender1 == ":m" || sGender2 == ":m") {
        return ":N:m:p";
    }
    if (sGender1 == ":f" || sGender2 == ":f") {
        return ":N:f:p";
    }
    return ":N:e:p";
}







|
|








49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

function queryNamesPOS (sWord1, sWord2) {
    let lMorph1 = gc_engine.oSpellChecker.getMorph(sWord1);
    let lMorph2 = gc_engine.oSpellChecker.getMorph(sWord2);
    if (lMorph1.length == 0 || lMorph2.length == 0) {
        return ":N:e:p";
    }
    let [sGender1, ] = cregex.getGenderNumber(lMorph1);
    let [sGender2, ] = cregex.getGenderNumber(lMorph2);
    if (sGender1 == ":m" || sGender2 == ":m") {
        return ":N:m:p";
    }
    if (sGender1 == ":f" || sGender2 == ":f") {
        return ":N:f:p";
    }
    return ":N:e:p";
}

Modified gc_lang/fr/modules/cregex.py from [cca55d14bc] to [d34aee52e1].

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
..
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

import re

#### Lemme
Lemma = re.compile(r"^>(\w[\w-]*)")

#### Analyses
Gender = re.compile(":[mfe]")
Number = re.compile(":[spi]")
GenderNumber = re.compile(":[mfe]:[spi]")

#### Nom et adjectif
NA = re.compile(":[NA]")

## nombre
NAs = re.compile(":[NA].*:s")
................................................................................

def getLemmaOfMorph (s):
    "return lemma in morphology <s>"
    return Lemma.search(s).group(1)

def agreement (l1, l2):
    "returns True if agreement in gender and number is possible between morphologies <l1> and <l2>"
    # check number agreement
    if not mbInv(l1) and not mbInv(l2):
        if mbSg(l1) and not mbSg(l2):
            return False
        if mbPl(l1) and not mbPl(l2):
            return False
    # check gender agreement
    if mbEpi(l1) or mbEpi(l2):
        return True
    if isMas(l1) and not mbMas(l2):
        return False
    if isFem(l1) and not mbFem(l2):
        return False
    return True

def checkConjVerb (lMorph, sReqConj):
    "returns True if <sReqConj> in <lMorph>"
    return any(sReqConj in s  for s in lMorph)

def getGender (lMorph):
    "returns gender of word (':m', ':f', ':e' or empty string)."
    sGender = ""
    for sMorph in lMorph:
        m = Gender.search(sMorph)
        if m:
            if not sGender:
                sGender = m.group(0)
            elif sGender != m.group(0):
                return ":e"
    return sGender

def getNumber (lMorph):
    "returns number of word (':s', ':p', ':i' or empty string)."
    sNumber = ""
    for sMorph in lMorph:
        m = Number.search(sMorph)
        if m:
            if not sNumber:
                sNumber = m.group(0)
            elif sNumber != m.group(0):
                return ":i"
    return sNumber

def getGenderNumber (lMorph):
    "returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string)"
    sGender = ""
    sNumber = ""
    for sMorph in lMorph:
        m = GenderNumber.search(sMorph)
        if m:







<
<







 







|
|
|
|
|
<
<
<
<
<
<
<







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







4
5
6
7
8
9
10


11
12
13
14
15
16
17
..
82
83
84
85
86
87
88
89
90
91
92
93







94
95
96
97
98
99
100
























101
102
103
104
105
106
107

import re

#### Lemme
Lemma = re.compile(r"^>(\w[\w-]*)")

#### Analyses


GenderNumber = re.compile(":[mfe]:[spi]")

#### Nom et adjectif
NA = re.compile(":[NA]")

## nombre
NAs = re.compile(":[NA].*:s")
................................................................................

def getLemmaOfMorph (s):
    "return lemma in morphology <s>"
    return Lemma.search(s).group(1)

def agreement (l1, l2):
    "returns True if agreement in gender and number is possible between morphologies <l1> and <l2>"
    sGender1, sNumber1 = getGenderNumber(l1)
    sGender2, sNumber2 = getGenderNumber(l2)
    if sNumber1 != ":i" and sNumber2 != ":i" and sNumber1 != sNumber2:
        return False
    if sGender1 != ":e" and sGender2 != ":e" and sGender1 != sGender2:







        return False
    return True

def checkConjVerb (lMorph, sReqConj):
    "returns True if <sReqConj> in <lMorph>"
    return any(sReqConj in s  for s in lMorph)

























def getGenderNumber (lMorph):
    "returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string)"
    sGender = ""
    sNumber = ""
    for sMorph in lMorph:
        m = GenderNumber.search(sMorph)
        if m:

Modified gc_lang/fr/modules/gce_analyseur.py from [6a83d3b431] to [af51223cf8].

39
40
41
42
43
44
45
46

47
48
49
50
51
52
53
54
55
56
57
    "returns True it can be a measurement unit"
    if _zUnitSpecial.search(s):
        return True
    if 1 < len(s) < 16 and s[0:1].islower() and (not s[1:].islower() or _zUnitNumbers.search(s)):
        return True
    return False

def queryNamesPOS(sWord1, sWord2):

    lMorph1 = _oSpellChecker.getMorph(sWord1)
    lMorph2 = _oSpellChecker.getMorph(sWord2)
    if not lMorph1 or not lMorph2:
        return ":N:e:p"
    sGender1 = cr.getGender(lMorph1)
    sGender2 = cr.getGender(lMorph2)
    if sGender1 == ":m" or sGender2 == ":m":
        return ":N:m:p"
    if sGender1 == ":f" or sGender2 == ":f":
        return ":N:f:p"
    return ":N:e:p"







|
>




|
|





39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    "returns True it can be a measurement unit"
    if _zUnitSpecial.search(s):
        return True
    if 1 < len(s) < 16 and s[0:1].islower() and (not s[1:].islower() or _zUnitNumbers.search(s)):
        return True
    return False

def queryNamesPOS (sWord1, sWord2):
    "returns POS tag for <sWord1> and <sWord2> as a whole"
    lMorph1 = _oSpellChecker.getMorph(sWord1)
    lMorph2 = _oSpellChecker.getMorph(sWord2)
    if not lMorph1 or not lMorph2:
        return ":N:e:p"
    sGender1, _ = cr.getGenderNumber(lMorph1)
    sGender2, _ = cr.getGenderNumber(lMorph2)
    if sGender1 == ":m" or sGender2 == ":m":
        return ":N:m:p"
    if sGender1 == ":f" or sGender2 == ":f":
        return ":N:f:p"
    return ":N:e:p"

Modified gc_lang/fr/rules.grx from [1293ea0eda] to [5336f0db3c].

3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319



3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333

3334
3335
3336
3337
3338
3339

3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351



3352
3353
3354
3355
3356
3357






3358
3359
3360
3361
3362
3363
3364
3365
3366






















3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380








3381
3382
3383
3384
3385
3386
3387
....
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
....
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
....
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
.....
18659
18660
18661
18662
18663
18664
18665

18666
18667
18668
18669
18670
18671
18672
.....
18847
18848
18849
18850
18851
18852
18853

18854
18855
18856
18857
18858
18859
18860
.....
19246
19247
19248
19249
19250
19251
19252
19253
19254
19255
19256
19257
19258
19259
19260
19261
19262
19263
19264
19265
19266
19267
19268
19269
19270
19271
19272
19273
19274
19275
19276
19277
19278
19279
19280
19281
19282
.....
19300
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311
19312
19313
19314
19315
19316
19317
19318
19319
19320
19321
19322
19323
19324
19325
19326
19327
19328
19329
19330
19331
19332
19333
19334
19335
19336
.....
22377
22378
22379
22380
22381
22382
22383
22384
22385
22386
22387
22388
22389
22390
22391
22392
22393
22394
22395
22396
22397
22398
.....
24707
24708
24709
24710
24711
24712
24713
24714
24715
24716
24717
24718
24719
24720
24721
.....
25919
25920
25921
25922
25923
25924
25925
25926
25927
25928
25929
25930
25931
25932
25933
































































25934
25935
25936
25937
25938
25939
25940
25941
25942
25943
25944
25945
25946
.....
29198
29199
29200
29201
29202
29203
29204
29205



29206
29207
29208
29209
29210
29211
29212
29213
29214
29215
29216
29217


29218
29219
29220
29221
29222
29223
29224
.....
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
30223
30224
30225
30226
30227
30228
30229
30230
30231
30232
30233
30234
30235
30236
30237
30238
30239
30240
30241
30242
30243
30244
.....
30725
30726
30727
30728
30729
30730
30731

30732
30733
30734
30735
30736
30737
30738
.....
30875
30876
30877
30878
30879
30880
30881
30882
30883
30884
30885
30886
30887
30888
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
30912
30913
30914
30915
30916
30917
30918
30919
30920
30921
30922
.....
31086
31087
31088
31089
31090
31091
31092
31093




31094
31095
31096
31097
31098
31099
31100

31101
31102
31103
31104
31105
31106
31107
.....
31332
31333
31334
31335
31336
31337
31338
31339
31340
31341
31342
31343
31344
31345
31346
31347
31348
31349
31350
31351
31352
31353
31354

__da_groupe_nominal__
    à                [la|l’|leur]         @:[NA]¬:Y
    [sans|pour|par]  [la|l’|le|les|leur]  @:[NA]¬:Y
    [à|par]                               @:[NA]¬:Y
        <<- =>> select(\-1, "", ":V")

    [de|d’]  ?[la|l’|leur]¿  @:¬:[YD]
        <<- not value(<1, "|semblant|") =>> select(\-1, "", ":V")

    du   @:[NA].*:[me]:[si]¬:[GY]
        <<- =>> select(\2, ":[NA]")

    aucun  @:[NA].*:[me]:s¬:G
    aucune @:[NA].*:[fe]:s¬:G
        <<- =>> select(\1, ":D") and select(\2, ":N")




    certains   @:[NA].*:[me]:p¬:(?:G|3p|V0)
    certaines  @:[NA].*:[fe]:p¬:(?:G|3p|V0)
        <<- =>> select(\1, ":D") and select(\2, ":[NA]")

    d’ [un|une]  *WORD
        <<- =>> select(\2, ":D") and select(\3, "", ":V")

    [un|quel|cet|l’|notre|votre] été
        <<- =>> select(\2, ":N")

    l’ [un|une]  *WORD
        <<- not value(\3, "|plus|") =>> select(\3, ":[123][sp]")

    [des|chaque|quelque|quelques|cet|cette|ces|mon|ma|ta|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs|aucun|aucune]  *WORD

        <<- not morph(\-1, ":V0") =>> select(\-1, "", ":V")

    ce @:[NA].*:[me]:[si]¬:(?:3[sp]|V0)
        <<- not value(<1, "|il|elle|on|iel|ils|elles|iels|ne|n’|") =>> select(\-1, ":[NA]")

    sa  @¬:(?:V0|3s)

        <<- =>> select(\2, "", ":V")

    les  ~.es$
        <<- not value(<1, "|tu|ne|n’|me|m’|te|t’|se|s’|nous|vous|") and morph(\2, ":V1.*Ip.*:2s") and not tagbefore(\1, "_2s_") and not value(>1, "|tu|pas|jamais|")
        =>> select(\2, "", ":V")

    [un|une]  *WORD
        <<- not value(<1, "|l’|quelqu’|quelqu|") and not value(\2, "|a|fut|fût|est|fait|") and not morph(\2, ":P") =>> select(\2, "", ":V")

    [/_VCint_|/_VCimp_]  [le|la|l’|leur|les]  $:¬:Y
        <<- =>> select(\2, ":D")




    de [>tel|ce|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|notre|votre|plein|pleine]  *WORD
        <<- =>> select(\3, "", ":V")

    de [tous|toutes] les *WORD
        <<- =>> select(\4, ":[NA]")







    en [plein|pleine] *WORD
        <<- =>> select(\3, ":[NA]")

    en tant que  *WORD
        <<- =>> select(\4, ":[NA]")

    la nuit
        <<- =>> select(\2, ":N")























    ni *WORD
        <<- =>> select(\-1, ":N")

    nombre [de|d’|des]
        <<- morph(<1, ":[VR]|<start>|>,") =>> select(\1, ":N")

    par  *WORD
        <<- =>> select(\2, "", ":[123][sp]")

    plein  [de|d’]  @:[AN]
        <<- not morph(<1, ":(?:D.*:m|V[0-3]e)") =>> =define(\1, ":G")

    plusieurs  @:[NA].*:p¬:(?:G|3p|V0)
        <<- =>> select(\1, ":D") and select(\2, ":[NA]")









    sans  @:[ISKP]
        <<- =>> select(\2, ":[NA]")

    source [de|d’]
        <<- morph(<1, ":V[0-3]e") =>> define(\1, ":ÉV")

................................................................................
TEST: La peur irraisonnée de l’autre est le plus grave danger qu’ont à affronter les civilisations.


__conf_on_ont__
    [<start>|,|/_start_] ?l’¿ (ont) [ne|n’|me|m’|te|se|s’]
    [<start>|,|/_start_] ?l’¿ (ont) [lui|nous|vous] @:[123][sp]¬:G
    [<start>|,|/_start_] ?l’¿ (ont) [leur|le|la|l’] @:[123][sp]¬:(?:G|[NA].*:[si])
    [<start>|,|/_start_] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|charge|peine|affaire|hâte|force|recours|somme)/
        <<- /conf/ -1>> on                                          && Confusion probable : le mot “ont” est une conjugaison du verbe avoir.

    [<start>|,|/_start_] ?l’¿ ont t’
        <<- /conf/ not value(>1, "|il|ils|elle|elles|iel|iels|") --2>> on    && Confusion probable : le mot “ont” est une conjugaison du verbe avoir.

    ~-[oO]nt$
        <<- /conf/ ->> =\1[:-1]                                     && Incohérence : le mot “ont” est une forme conjuguée du verbe “avoir” (par exemple : “ils ont”). Pour le pronom, écrivez “on”.
................................................................................
TEST: elle n’y {{à}} pas droit.                                         ->> a
TEST: il y {{à}} des pertes.                                            ->> a
TEST: Il les y {{à}}.                                                   ->> a
TEST: Y {{à}} du poulet                                                 ->> a


    [l’|les] à
        <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|peu|plat|propos|valoir|")
        -2>> a                                                      && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    en à
        <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|peu|plat|propos|valoir|") and not morph(<1, ">venir/")
        -2>> a                                                      && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

TEST: Ce fâcheux, comme à son habitude, les {{à}} ennuyés à mourir.     ->> a
TEST: Lui l’{{à}} pris par surprise.                                    ->> a
TEST: Il y en {{à}}.                                                    ->> a
TEST: Elle en {{à}} pris.                                               ->> a
TEST: Elle l’en {{à}} averti.                                           ->> a
................................................................................


## substantifs

__conf_substantif_à_substantif!3__
    *WORD  a  $:N¬*
        <<- /conf/ \2.islower()
            and not value(\3, "|accès|bon|bonne|beau|besoin|charge|confiance|connaissance|conscience|crainte|droit|envie|été|faim|force|grand|grande|hâte|honte|interdiction|intérêt|lieu|mauvaise|peine|peur|raison|rapport|recours|soif|tendance|terre|tort|trait|vent|vocation|")
            and morph(\1, ":N", "*")
        -2>> à              && Confusion probable : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

TEST: les bobos {{a}} trottinette                                                       ->> à
TEST: la lettre A est la première lettre de l’alphabet
TEST: la lettre a est la première lettre de l’alphabet
TEST: cette femme a raison
................................................................................
    >port [de|d’] plaisance
    >porte [de|d’] [entrée|service|garage|sortie]
    >porte d’ entrée
    >pot [de|d’] [chambre|colle|départ|échappement]
    >poteau d’ exécution
    >poudre aux yeux
    >poudre d’ escampette

    >poule aux œufs d’ or
    >pouvoir d’ achat
    >prédication [de|d’] rue
    >préfecture [de|d’] police
    >président en exercice
    >presse à >scandale
    preuve ?suffisante¿ du contraire
................................................................................
    >véhicule [de|d’] location
    >vente à [découvert|domicile|emporter]
    >vente aux enchères
    >ventilateur à merde
    >vérification [de|d’] routine
    vernis à ongles
    >ver [de|d’] terre

    >verre à pied
    >vêtement [de|d’] rechange
    >vidéo X
    >vie [de|d’] bohème
    >violence [par|sur] personne dépositaire de l’ autorité publique
    >violence [par|sur] personnes dépositaires de l’ autorité publique
    >virage à [*NUM|@:B:.:p] degrés
................................................................................
    >avoir  ?[pas|jamais|plus|guère|point]¿  un [moment|instant]
    >avoir  ?[pas|jamais|plus|guère|point]¿  un minimum
    >avoir  ?[pas|jamais|plus|guère|point]¿  un peu
    >avoir  ?[pas|jamais|plus|guère|point]¿  un petit peu
    >avoir  ?[pas|jamais|plus|guère|point]¿  un tout petit peu
        <<- morph(>1, ":[QY]") ~2:0>> *

    >avoir  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    >avoir  bon [dos|fond]
    >avoir  bon pied ?,¿ bon œil
    >avoir  carte blanche
    >avoir  forme [humaine|animale]
    >avoir  partie [gagnée|liée]
    >avoir  voix au chapitre
        <<- ~2:0>> ␣
        <<- =>> define(\2, ":ÉV")

    >avoir  [pas|jamais|plus|guère|point]  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    >avoir  [pas|jamais|plus|guère|point]  bon [dos|fond]
    >avoir  [pas|jamais|plus|guère|point]  bon pied ?,¿ bon œil
    >avoir  [pas|jamais|plus|guère|point]  carte blanche
    >avoir  [pas|jamais|plus|guère|point]  forme [humaine|animale]
    >avoir  [pas|jamais|plus|guère|point]  gain de cause
    >avoir  [pas|jamais|plus|guère|point]  partie [gagnée|liée]
    >avoir  [pas|jamais|plus|guère|point]  quartier libre
    >avoir  [pas|jamais|plus|guère|point]  voix au chapitre
        <<- ~3:0>> ␣
        <<- =>> define(\3, ":ÉV")

    >avoir  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    >avoir  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  @:(?:Q|V1.*:Y)
        <<- ~2:-2>> *

    n’  >avoir  que  $:Q
        <<- ~3>> *

    n’  >avoir  que  $:W  $:Q
................................................................................
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un [moment|instant]
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un minimum
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un peu
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un petit peu
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un tout petit peu
        <<- morphVC(\1, ":V0a") and morph(>1, ":[QY]") ~2:0>> *

    /_VCint_  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    /_VCint_  bon [dos|fond]
    /_VCint_  bon pied ?,¿ bon œil
    /_VCint_  carte blanche
    /_VCint_  forme [humaine|animale]
    /_VCint_  partie [gagnée|liée]
    /_VCint_  voix au chapitre
        <<- morphVC(\1, ":V0a") ~2:0>> ␣
        <<- __also__ =>> define(\2, ":ÉV")

    /_VCint_  [pas|jamais|plus|guère|point]  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    /_VCint_  [pas|jamais|plus|guère|point]  bon [dos|fond]
    /_VCint_  [pas|jamais|plus|guère|point]  bon pied ?,¿ bon œil
    /_VCint_  [pas|jamais|plus|guère|point]  carte blanche
    /_VCint_  [pas|jamais|plus|guère|point]  forme [humaine|animale]
    /_VCint_  [pas|jamais|plus|guère|point]  gain de cause
    /_VCint_  [pas|jamais|plus|guère|point]  partie [gagnée|liée]
    /_VCint_  [pas|jamais|plus|guère|point]  quartier libre
    /_VCint_  [pas|jamais|plus|guère|point]  voix au chapitre
        <<- morphVC(\1, ":V0a") ~3:0>> ␣
        <<- __also__ =>> define(\3, ":ÉV")

    /_VCint_  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent]
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  @:(?:Q|V1.*:Y)
        <<- morphVC(\1, ":V0a") ~2:-2>> *


__purge_après_verbe__
    $:V  ?pas¿  jour et nuit
    $:V  ?pas¿  nuit et jour
................................................................................
TEST: Cette réunion ayant eu {{lieue}} loin d’ici                                       ->> lieu
TEST: ces conneries donneront {{lieux}} à une enquête approfondie.                      ->> lieu
TEST: Tout ce qui a {{lieue}} hors de ce pays est ignoré.                               ->> lieu
TEST: la répression extrêmement violente des diverses manifestations qui ont eu lieu depuis la fin du mois de novembre


# mare / marre
__conf_marre_mare__
    [la|une|cette|quelle|cette|ma|ta|sa] ?petite¿ marre
        <<- /conf/ --1>> mare                                   && Confusion. Pour parler d’une petite étendue d’eau, écrivez “mare”. En “avoir marre de” = “en avoir assez de”.

    en >avoir mare
        <<- /conf/ -3>> marre                                   && Confusion. Une mare est une petite étendue d’eau.

TEST: cette {{marre}} est presque sèche.                        ->> mare
TEST: j’en ai {{mare}} de tout ça.                              ->> marre
TEST: en avoir vraiment {{mare}} de ces conneries.              ->> marre


# mâter / mater
__conf_mater_mâter__
    >mâter  $:D  [>adversaire|>armée|>cavalier|>cheval|>chien|>con|>connard|>connasse|>cul|>dame|>enfoiré|>emmerdeur|>enfant|>ennemi|>enculé|>femme|>fesse|>fille|fils|>fou|>foule|>gamin|>garçon|>homme|>horde|>incendie|>insurrection|>jument|>lion|>nation|>peuple|>pion|>pute|>rebelle|>rébellion|>reine|>roi|>sein|>salope|>tigre|>tour|>troupe]
................................................................................
TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille


__gn_ces_aux_pluriel_1m__
    [ces|aux]  *WORD
        <<- /gn/ morph(\2, ":[NA].*:s", ":[ipGW]") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]"))
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné : « \2 » devrait être au pluriel.
        <<- /gn/ __also__ and morph(\2, ">[bcçdfglklmnpqrstvwxz].*:m", ":f") >>>
        <<- /gn/ \1.endswith("x") or \1.endswith("X") -1>> au                               && Accord de nombre erroné : « \2 » est au singulier.
        <<- /gn/ __else__ -1>> ce                                                           && Accord de nombre erroné : « \2 » est au singulier.

TEST: {{ces}} {{détournement}} de fonds et ces vols                             ->> ce|||détournements
TEST: ces {{étudiant}} sont légion.                                             ->> étudiants
TEST: je vais {{aux}} {{cinéma}}                                                ->> au|||cinémas
TEST: il l’a donné aux {{étudiant}}                                             ->> étudiants
................................................................................
TEST: l’école de mon entreprise {{pillé}}                       ->> pillée
TEST: l’école de notre cité {{reconstruites}}                   ->> reconstruite
TEST: l’existence de la foi {{rejeté}}                          ->> rejetée
TEST: son homologue de la ville écarté de l’ordre


__gn_det_nom_de_det_nom_adj_sing!3__
    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  [de|d’]  [la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  @:[NA].*:p¬:(?:G|P|[me]:[is]|V0|3[sp])
    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  du                                                                          *WORD  @:[NA].*:p¬:(?:G|P|[me]:[is]|V0|3[sp])
        <<- /gn/ morph(\-2, ":[NA].*:[me]") and not apposition(\-2, \-1)
        --1>> =suggSing(\-1, True)                                                                  && Accord erroné : “\-1” devrait être au masculin singulier.

TEST: la femme de notre homme {{expulsés}}                      ->> expulsé


































































__gn_det_nom_de_det_nom_adj_plur__
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  @:[NA].*:[pi]¬:(?:G|P|s|V0|3[sp])
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  des                                          *WORD  @:[NA].*:[pi]¬:(?:G|P|s|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2)                                                                  && Accord erroné : “\-1” devrait être accordé avec “\2” ou “\-2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp])
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  des                                          *WORD  @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) and not (value(>1, "|et|ou|") and morph(>2, ":A.*:[si]"))
        --1>> =suggPlur(\-1)                                                                        && Accord erroné : “\-1” devrait être au pluriel.

TEST: ces femmes des mines {{voisins}}                              ->> voisines
................................................................................
        <<- /ppas/ morph(\-1, ":V[123]_.__p_e_", "*") or (value(>1, "|<end>|") and not morph(<1, ":R|>que/"))
        --1>> =suggVerbPpas(\-1, ":f:p")                                                            && Si ce participe passé se rapporte bien à “elles”, il devrait être au féminin pluriel.

TEST: elles ne s’y étaient pas {{donnée}}.                                  ->> données
TEST: sans fin elles se sont succédé


__ppas_se_être__



    [me|m’|te|se|s’]  ?[y|en]¿  >être  @:(?:Y|[123][sp])¬:[QAG]
        <<- /ppas/ morph(\-2, ":[123]s") --1>> =suggVerbPpas(\-1, ":s")                             && Incohérence. Le verbe devrait être un participe passé.
        <<- /ppas/ morph(\-2, ":[123]p") --1>> =suggVerbPpas(\-1, ":p")                             && Incohérence. Le verbe devrait être un participe passé.
        <<- /ppas/ __else__ --1>> =suggVerbPpas(\-1)                                                && Incohérence. Le verbe devrait être un participe passé.

    [me|m’|te|se|s’]  ?[y|en]¿  >être  @:[QA].*:p¬:[GW]
        <<- /ppas/ morph(\-2, ":[123]s") and not tagbefore(\1, "_que_") and not before("(?i)\\bon (?:ne |)$")
        --1>> =suggSing(\-1)                                                                        && Le participe passé devrait être au singulier.

    tu  t’  ?[y|en]¿  [es|étais|seras|serais|fus|fusses]  @:(?:Y|[123][sp])¬:[QG]
        <<- /ppas/ --1>> =suggVerbPpas(\-1, ":s")                                                   && Incohérence. Le verbe devrait être un participe passé.



TEST: s’être toujours {{donner}} le mot.                                    ->> donné|donnée|donnés|données
TEST: je suis venu et me suis totalement {{donnés}} à cette œuvre           ->> donné
TEST: c’est de ce qui s’est {{passe}}.                                      ->> passé|passée
TEST: s’était toujours {{passe}} comme ça avec elle                         ->> passé|passée
TEST: s’est {{approche}} de la penderie                                     ->> approché|approchée
TEST: terrorisant l’animal qui s’était {{cabre}}.                           ->> cabré|cabrée
TEST: ce qui s’est {{passe}}.                                               ->> passé|passée
................................................................................



!!!! Participes passés: accord avec le substantif précédent                                       !!

__ppas_sujet_être_accord_immunités__
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || [être|devenir|redevenir|rester|paraître|paraitre|sembler]                                *WORD
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || être [devenu+e|redevenu+e|resté+e|demeuré+e]                                             *WORD
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                  *WORD
        <<- /ppas/ agreement(\1, \-1) !-1>>

    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || [être|devenir|redevenir|rester|paraître|paraitre|sembler]                                *WORD
    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || être [devenu+e|redevenu+e|resté+e|demeuré+e]                                             *WORD
    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                  *WORD
        <<- /ppas/ agreement(\1, \-1) !-1>>


__ppas_sujet_être_accord_singulier__
    [<start>|,|(|/_start_]  [un|le|ce|cet]  (*WORD)  ?qui¿  ?[ne|n’]¿  ?[en|y]¿          (/_VE_)                                                @:[AQ]¬:(?:[GWM]|[me]:[si])
    [<start>|,|(|/_start_]  [un|le|ce|cet]  (*WORD)  ?qui¿  ?[ne|n’]¿  ?[en|y]¿          (/_LVED_) ?/_LVE_¿ ?/_LVE_¿ ?/_LVE_¿ ?/_LVE_¿ /_LVEF_  @:[AQ]¬:(?:[GWM]|[me]:[si])
................................................................................
TEST: L’affront dont il parle, c’est manquer de respect à ses aînés
TEST: Nous nous efforçons de comprendre ce qu’être veut dire, ce qu’être signifie.
TEST: ce qu’il avait cru être devenait un rêve lointain et à peine concevable.
TEST: la grande crainte du maire est de voir s’effondrer d’autres immeubles
TEST: la grande crainte du maire est de voir arriver d’autres immigrés
TEST: Ce faisant, la chambre criminelle nous précise que relayer n’est pas forcément diffamer
TEST: maintenir en confinement certaines personnes sous prétexte qu’elles sont à risques serait une mesure inconstitutionnelle et discriminatoire.




!!
!!
!!!! Participes passés: avoir l’air                                                               !!
!!
................................................................................
__immu_les_avoir_fait_vinfi__
    les >avoir fait ?[me|m’|te|t’|se|s’|nous|vous|leur]¿ $:Y
        <<- !3>>


__ppas_ayant__
    ayant  @:(?:Q.*:[fp]|[123][sp])¬:(?:G|N|m:[si])
        <<- /ppas/ not value(\-1, "|barre|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") and not value(<1, "|m’|t’|l’|nous|vous|les|")
        --1>> =suggMasSing(\-1)
        && Après avoir, il faut un participe passé au masculin singulier (sauf si le COD se trouve avant le verbe, improbable dans ce cas de figure).

TEST: ayant {{marqués}} les esprits, tout le monde se souvenait d’elles.                            ->> marqué
TEST: ayant prise sur les événements, elle ne voyait aucune raison de s’alarmer.
TEST: je croyais, vous ayant déjà reçus, que vous n’auriez pas à revenir.
TEST: il pensait, nous ayant oubliés, que nous l’aurions oublié, nous aussi.


__ppas_pronom_avoir__
    il  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    il  ?[ne|n’]¿  y  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|N|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    [je|j’|tu|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]  ?[ne|n’]¿  ?[lui|leur|y]¿  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    [je|j’|tu|il|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]  ?[ne|n’]¿  en  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp])", ":[GWQ]")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

TEST: ils leur avaient {{donnés}} du fil à retordre.                                                ->> donné
TEST: il a {{affronte}} une bande de voleurs de bétail                                              ->> affronté
................................................................................
TEST: Je viendrai, après avoir vraiment {{écoutée}} le prof.                                        ->> écouté
TEST: Merci de m’avoir {{lus}}                                                                      ->> lu
TEST: Pourquoi m’avoir {{ignorés}} ainsi ?                                                          ->> ignoré
TEST: sans avoir {{ignorée}} le problème.                                                           ->> ignoré


## avoir avec participe passé
__ppas_m_t_l_avoir__




    [l’|m’]  ?[en|y]¿  >avoir  @:(?:Y|[123][sp])¬:[QGWMX]
        <<- /ppas/ --1>> =suggVerbPpas(\-1, ":m:s")         && Confusion : employez un participe passé.

    t’  ?[en|y]¿  >avoir  @:(?:Y|[123][sp])¬:[QGWMX]
        <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
        --1>> =suggVerbPpas(\-1, ":m:s")                    && Confusion : employez un participe passé.


TEST: m’avoir {{terminer}}.                                                                         ->> terminé
TEST: il m’a {{souffler}} la bonne réponse.                                                         ->> soufflé
TEST: elle t’en a {{parle}}.                                                                        ->> parlé
TEST: c’est vous qui m’avez {{convertit}}.                                                          ->> converti
TEST: Mélanie l’a {{transformer}}                                                                   ->> transformé
TEST: parce que t’as envie que je le fasse
TEST: t’avais confiance
................................................................................



!!!! Participes passés avec “avoir” (formes interrogatives)                                       !!

__ppas_avoir_interrogatif__
    *WORD  /_VCint_  *WORD
        <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>>
        <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":[QMG]")
        -3>> =suggVerbPpas(\3, ":m:s")                      && Incohérence probable avec “\2”. Après “avoir”, ce verbe devrait être un participe passé.
        <<- /ppas/ __else__ and not value(\1, "|les|l’|m’|t’|nous|vous|en|") and morph(\3, ":Q.*:[fp]", ":m:[si]")
            and not morph(\1, ":[NA].*:[fp]") and not before("(?i)\\b(?:quel(?:le|)s?|combien) ")
        -3>> =suggVerbPpas(\3, ":m:s")                      && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède).

    [<start>|,|(]  ?n’¿  /_VCint_  *WORD
        <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>>
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QMG]")
        --1>> =suggVerbPpas(\-1, ":m:s")                    && Incohérence probable avec “\-2”. Après “avoir”, ce verbe devrait être un participe passé.
        <<- /ppas/ __else__ and morph(\-1, ":Q.*:[fp]", ":m:[si]")
        --1>> =suggVerbPpas(\-1, ":m:s")                    && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède).

TEST: cet été ont-ils {{mentionnés}} la sécheresse                              ->> mentionné
TEST: quand ont-ils {{donner}} satisfaction                                     ->> donné







<
<
<
<
<
<
|
|


>
>
>













|
>
|




|
>
|











>
>
>






>
>
>
>
>
>









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









|




>
>
>
>
>
>
>
>







 







|







 







|



|







 







|







 







>







 







>







 







|









|











|







 







|









|











|







 







|






|







 







|







 







|
|






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
|


|







 







|
>
>
>












>
>







 







|


|


|




|


|


|







 







>







 







|











|






|






|






|







 







|
>
>
>
>

|


|
|

>







 







|







|







3303
3304
3305
3306
3307
3308
3309






3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
....
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
....
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
....
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
.....
18697
18698
18699
18700
18701
18702
18703
18704
18705
18706
18707
18708
18709
18710
18711
.....
18886
18887
18888
18889
18890
18891
18892
18893
18894
18895
18896
18897
18898
18899
18900
.....
19286
19287
19288
19289
19290
19291
19292
19293
19294
19295
19296
19297
19298
19299
19300
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311
19312
19313
19314
19315
19316
19317
19318
19319
19320
19321
19322
.....
19340
19341
19342
19343
19344
19345
19346
19347
19348
19349
19350
19351
19352
19353
19354
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366
19367
19368
19369
19370
19371
19372
19373
19374
19375
19376
.....
22417
22418
22419
22420
22421
22422
22423
22424
22425
22426
22427
22428
22429
22430
22431
22432
22433
22434
22435
22436
22437
22438
.....
24747
24748
24749
24750
24751
24752
24753
24754
24755
24756
24757
24758
24759
24760
24761
.....
25959
25960
25961
25962
25963
25964
25965
25966
25967
25968
25969
25970
25971
25972
25973
25974
25975
25976
25977
25978
25979
25980
25981
25982
25983
25984
25985
25986
25987
25988
25989
25990
25991
25992
25993
25994
25995
25996
25997
25998
25999
26000
26001
26002
26003
26004
26005
26006
26007
26008
26009
26010
26011
26012
26013
26014
26015
26016
26017
26018
26019
26020
26021
26022
26023
26024
26025
26026
26027
26028
26029
26030
26031
26032
26033
26034
26035
26036
26037
26038
26039
26040
26041
26042
26043
26044
26045
26046
26047
26048
26049
26050
.....
29302
29303
29304
29305
29306
29307
29308
29309
29310
29311
29312
29313
29314
29315
29316
29317
29318
29319
29320
29321
29322
29323
29324
29325
29326
29327
29328
29329
29330
29331
29332
29333
.....
30322
30323
30324
30325
30326
30327
30328
30329
30330
30331
30332
30333
30334
30335
30336
30337
30338
30339
30340
30341
30342
30343
30344
30345
30346
30347
30348
30349
30350
30351
30352
30353
.....
30834
30835
30836
30837
30838
30839
30840
30841
30842
30843
30844
30845
30846
30847
30848
.....
30985
30986
30987
30988
30989
30990
30991
30992
30993
30994
30995
30996
30997
30998
30999
31000
31001
31002
31003
31004
31005
31006
31007
31008
31009
31010
31011
31012
31013
31014
31015
31016
31017
31018
31019
31020
31021
31022
31023
31024
31025
31026
31027
31028
31029
31030
31031
31032
.....
31196
31197
31198
31199
31200
31201
31202
31203
31204
31205
31206
31207
31208
31209
31210
31211
31212
31213
31214
31215
31216
31217
31218
31219
31220
31221
31222
.....
31447
31448
31449
31450
31451
31452
31453
31454
31455
31456
31457
31458
31459
31460
31461
31462
31463
31464
31465
31466
31467
31468
31469

__da_groupe_nominal__
    à                [la|l’|leur]         @:[NA]¬:Y
    [sans|pour|par]  [la|l’|le|les|leur]  @:[NA]¬:Y
    [à|par]                               @:[NA]¬:Y
        <<- =>> select(\-1, "", ":V")







    aucun  @:[NA].*:[me]:s¬:(?:G|V0)
    aucune @:[NA].*:[fe]:s¬:(?:G|V0)
        <<- =>> select(\1, ":D") and select(\2, ":N")

    [au|aux]  @:[NA]¬:V0
        <<- =>> select(\-1, "", ":V")

    certains   @:[NA].*:[me]:p¬:(?:G|3p|V0)
    certaines  @:[NA].*:[fe]:p¬:(?:G|3p|V0)
        <<- =>> select(\1, ":D") and select(\2, ":[NA]")

    d’ [un|une]  *WORD
        <<- =>> select(\2, ":D") and select(\3, "", ":V")

    [un|quel|cet|l’|notre|votre] été
        <<- =>> select(\2, ":N")

    l’ [un|une]  *WORD
        <<- not value(\3, "|plus|") =>> select(\3, ":[123][sp]")

    chaque  @:[NA]¬:V0
    chaque  [avoir|être]
        <<- =>> select(\-1, "", ":V")

    ce @:[NA].*:[me]:[si]¬:(?:3[sp]|V0)
        <<- not value(<1, "|il|elle|on|iel|ils|elles|iels|ne|n’|") =>> select(\-1, ":[NA]")

    [cet|cette|ces] @:[NA]¬:V0
    [cet|cette|ces] [avoir|être]
        <<- =>> select(\-1, "", ":V")

    les  ~.es$
        <<- not value(<1, "|tu|ne|n’|me|m’|te|t’|se|s’|nous|vous|") and morph(\2, ":V1.*Ip.*:2s") and not tagbefore(\1, "_2s_") and not value(>1, "|tu|pas|jamais|")
        =>> select(\2, "", ":V")

    [un|une]  *WORD
        <<- not value(<1, "|l’|quelqu’|quelqu|") and not value(\2, "|a|fut|fût|est|fait|") and not morph(\2, ":P") =>> select(\2, "", ":V")

    [/_VCint_|/_VCimp_]  [le|la|l’|leur|les]  $:¬:Y
        <<- =>> select(\2, ":D")

    [de|d’]  ?[la|l’|leur]¿  @:¬:[YD]
        <<- not value(<1, "|semblant|") =>> select(\-1, "", ":V")

    de [>tel|ce|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|notre|votre|plein|pleine]  *WORD
        <<- =>> select(\3, "", ":V")

    de [tous|toutes] les *WORD
        <<- =>> select(\4, ":[NA]")

    des  @:[NA]
        <<- not \1.isupper() =>> select(\-1, "", ":V")

    du   @:[NA].*:[me]:[si]¬:[GY]
        <<- =>> select(\2, ":[NA]")

    en [plein|pleine] *WORD
        <<- =>> select(\3, ":[NA]")

    en tant que  *WORD
        <<- =>> select(\4, ":[NA]")

    la nuit
        <<- =>> select(\2, ":N")

    leurs @:[NA]¬:V0
        <<- not value(<1, "|je|tu|il|on|elle|iel|nous|vous|ils|elles|iels|") =>> select(\-1, ":[NA]")

    mon @:[NA]¬:V0
    mon [avoir|être]
        <<- =>> select(\-1, "", ":V")

    [ma|ta] @:[NA]¬:V0
        <<- =>> select(\-1, "", ":V")

    sa  @¬:(?:V0|3s)
        <<- =>> select(\2, "", ":V")

    [notre|votre] @:[NA]¬:V0
        <<- not value(<1, "|du|le|la|l’|les|des|") =>> select(\-1, "", ":V")

    [mes|tes|ses|nos|vos] @:[NA]¬:V0
        <<- =>> select(\-1, "", ":V")

    [nos|vos] @:[NA]¬:V0
        <<- =>> select(\-1, "", ":V")

    ni *WORD
        <<- =>> select(\-1, ":N")

    nombre [de|d’|des]
        <<- morph(<1, ":[VR]|<start>|>,") =>> select(\1, ":N")

    par  *WORD
        <<- =>> select(\2, "", ":[123][sp]")

    plein  [de|d’]  @:[NA]
        <<- not morph(<1, ":(?:D.*:m|V[0-3]e)") =>> =define(\1, ":G")

    plusieurs  @:[NA].*:p¬:(?:G|3p|V0)
        <<- =>> select(\1, ":D") and select(\2, ":[NA]")

    [quel|quels|quelle|quelles] @:[NA]¬:V0
    [quel|quels|quelle|quelles] [être|avoir]
        <<- =>> select(\-1, "", ":V")

    [quelque|quelques]  @:[NA]¬:V0
    [quelque|quelques]  [avoir|être]
        <<- =>> select(\-1, "", ":V")

    sans  @:[ISKP]
        <<- =>> select(\2, ":[NA]")

    source [de|d’]
        <<- morph(<1, ":V[0-3]e") =>> define(\1, ":ÉV")

................................................................................
TEST: La peur irraisonnée de l’autre est le plus grave danger qu’ont à affronter les civilisations.


__conf_on_ont__
    [<start>|,|/_start_] ?l’¿ (ont) [ne|n’|me|m’|te|se|s’]
    [<start>|,|/_start_] ?l’¿ (ont) [lui|nous|vous] @:[123][sp]¬:G
    [<start>|,|/_start_] ?l’¿ (ont) [leur|le|la|l’] @:[123][sp]¬:(?:G|[NA].*:[si])
    [<start>|,|/_start_] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|charge|peine|marre|affaire|hâte|force|recours|somme)/
        <<- /conf/ -1>> on                                          && Confusion probable : le mot “ont” est une conjugaison du verbe avoir.

    [<start>|,|/_start_] ?l’¿ ont t’
        <<- /conf/ not value(>1, "|il|ils|elle|elles|iel|iels|") --2>> on    && Confusion probable : le mot “ont” est une conjugaison du verbe avoir.

    ~-[oO]nt$
        <<- /conf/ ->> =\1[:-1]                                     && Incohérence : le mot “ont” est une forme conjuguée du verbe “avoir” (par exemple : “ils ont”). Pour le pronom, écrivez “on”.
................................................................................
TEST: elle n’y {{à}} pas droit.                                         ->> a
TEST: il y {{à}} des pertes.                                            ->> a
TEST: Il les y {{à}}.                                                   ->> a
TEST: Y {{à}} du poulet                                                 ->> a


    [l’|les] à
        <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|marre|peu|plat|propos|valoir|")
        -2>> a                                                      && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    en à
        <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|marre|peu|plat|propos|valoir|") and not morph(<1, ">venir/")
        -2>> a                                                      && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

TEST: Ce fâcheux, comme à son habitude, les {{à}} ennuyés à mourir.     ->> a
TEST: Lui l’{{à}} pris par surprise.                                    ->> a
TEST: Il y en {{à}}.                                                    ->> a
TEST: Elle en {{à}} pris.                                               ->> a
TEST: Elle l’en {{à}} averti.                                           ->> a
................................................................................


## substantifs

__conf_substantif_à_substantif!3__
    *WORD  a  $:N¬*
        <<- /conf/ \2.islower()
            and not value(\3, "|accès|bon|bonne|beau|besoin|charge|confiance|connaissance|conscience|crainte|droit|envie|été|faim|force|grand|grande|hâte|honte|interdiction|intérêt|lieu|mauvaise|marre|peine|peur|raison|rapport|recours|soif|tendance|terre|tort|trait|vent|vocation|")
            and morph(\1, ":N", "*")
        -2>> à              && Confusion probable : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

TEST: les bobos {{a}} trottinette                                                       ->> à
TEST: la lettre A est la première lettre de l’alphabet
TEST: la lettre a est la première lettre de l’alphabet
TEST: cette femme a raison
................................................................................
    >port [de|d’] plaisance
    >porte [de|d’] [entrée|service|garage|sortie]
    >porte d’ entrée
    >pot [de|d’] [chambre|colle|départ|échappement]
    >poteau d’ exécution
    >poudre aux yeux
    >poudre d’ escampette
    >poudre [de|d’] perlimpinpin
    >poule aux œufs d’ or
    >pouvoir d’ achat
    >prédication [de|d’] rue
    >préfecture [de|d’] police
    >président en exercice
    >presse à >scandale
    preuve ?suffisante¿ du contraire
................................................................................
    >véhicule [de|d’] location
    >vente à [découvert|domicile|emporter]
    >vente aux enchères
    >ventilateur à merde
    >vérification [de|d’] routine
    vernis à ongles
    >ver [de|d’] terre
    >ver à soie
    >verre à pied
    >vêtement [de|d’] rechange
    >vidéo X
    >vie [de|d’] bohème
    >violence [par|sur] personne dépositaire de l’ autorité publique
    >violence [par|sur] personnes dépositaires de l’ autorité publique
    >virage à [*NUM|@:B:.:p] degrés
................................................................................
    >avoir  ?[pas|jamais|plus|guère|point]¿  un [moment|instant]
    >avoir  ?[pas|jamais|plus|guère|point]¿  un minimum
    >avoir  ?[pas|jamais|plus|guère|point]¿  un peu
    >avoir  ?[pas|jamais|plus|guère|point]¿  un petit peu
    >avoir  ?[pas|jamais|plus|guère|point]¿  un tout petit peu
        <<- morph(>1, ":[QY]") ~2:0>> *

    >avoir  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    >avoir  bon [dos|fond]
    >avoir  bon pied ?,¿ bon œil
    >avoir  carte blanche
    >avoir  forme [humaine|animale]
    >avoir  partie [gagnée|liée]
    >avoir  voix au chapitre
        <<- ~2:0>> ␣
        <<- =>> define(\2, ":ÉV")

    >avoir  [pas|jamais|plus|guère|point]  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    >avoir  [pas|jamais|plus|guère|point]  bon [dos|fond]
    >avoir  [pas|jamais|plus|guère|point]  bon pied ?,¿ bon œil
    >avoir  [pas|jamais|plus|guère|point]  carte blanche
    >avoir  [pas|jamais|plus|guère|point]  forme [humaine|animale]
    >avoir  [pas|jamais|plus|guère|point]  gain de cause
    >avoir  [pas|jamais|plus|guère|point]  partie [gagnée|liée]
    >avoir  [pas|jamais|plus|guère|point]  quartier libre
    >avoir  [pas|jamais|plus|guère|point]  voix au chapitre
        <<- ~3:0>> ␣
        <<- =>> define(\3, ":ÉV")

    >avoir  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    >avoir  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  @:(?:Q|V1.*:Y)
        <<- ~2:-2>> *

    n’  >avoir  que  $:Q
        <<- ~3>> *

    n’  >avoir  que  $:W  $:Q
................................................................................
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un [moment|instant]
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un minimum
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un peu
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un petit peu
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  un tout petit peu
        <<- morphVC(\1, ":V0a") and morph(>1, ":[QY]") ~2:0>> *

    /_VCint_  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    /_VCint_  bon [dos|fond]
    /_VCint_  bon pied ?,¿ bon œil
    /_VCint_  carte blanche
    /_VCint_  forme [humaine|animale]
    /_VCint_  partie [gagnée|liée]
    /_VCint_  voix au chapitre
        <<- morphVC(\1, ":V0a") ~2:0>> ␣
        <<- __also__ =>> define(\2, ":ÉV")

    /_VCint_  [pas|jamais|plus|guère|point]  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    /_VCint_  [pas|jamais|plus|guère|point]  bon [dos|fond]
    /_VCint_  [pas|jamais|plus|guère|point]  bon pied ?,¿ bon œil
    /_VCint_  [pas|jamais|plus|guère|point]  carte blanche
    /_VCint_  [pas|jamais|plus|guère|point]  forme [humaine|animale]
    /_VCint_  [pas|jamais|plus|guère|point]  gain de cause
    /_VCint_  [pas|jamais|plus|guère|point]  partie [gagnée|liée]
    /_VCint_  [pas|jamais|plus|guère|point]  quartier libre
    /_VCint_  [pas|jamais|plus|guère|point]  voix au chapitre
        <<- morphVC(\1, ":V0a") ~3:0>> ␣
        <<- __also__ =>> define(\3, ":ÉV")

    /_VCint_  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent]
    /_VCint_  ?[pas|jamais|plus|guère|point]¿  [tous|toutes] les @:B:.:p  @:(?:Q|V1.*:Y)
        <<- morphVC(\1, ":V0a") ~2:-2>> *


__purge_après_verbe__
    $:V  ?pas¿  jour et nuit
    $:V  ?pas¿  nuit et jour
................................................................................
TEST: Cette réunion ayant eu {{lieue}} loin d’ici                                       ->> lieu
TEST: ces conneries donneront {{lieux}} à une enquête approfondie.                      ->> lieu
TEST: Tout ce qui a {{lieue}} hors de ce pays est ignoré.                               ->> lieu
TEST: la répression extrêmement violente des diverses manifestations qui ont eu lieu depuis la fin du mois de novembre


# mare / marre
__conf_marre_mare!6__
    [la|une|cette|quelle|cette|ma|ta|sa] ?petite¿ marre
        <<- /conf/ --1>> mare                                   && Confusion. Pour parler d’une petite étendue d’eau, écrivez “mare”. En “avoir marre de” = “en avoir assez de”.

    en >avoir mare
        <<- /conf/ -3>> marre                                   && Confusion. Une mare est une petite étendue d’eau.

TEST: la {{marre}} est presque sèche.                           ->> mare
TEST: j’en ai {{mare}} de tout ça.                              ->> marre
TEST: en avoir vraiment {{mare}} de ces conneries.              ->> marre


# mâter / mater
__conf_mater_mâter__
    >mâter  $:D  [>adversaire|>armée|>cavalier|>cheval|>chien|>con|>connard|>connasse|>cul|>dame|>enfoiré|>emmerdeur|>enfant|>ennemi|>enculé|>femme|>fesse|>fille|fils|>fou|>foule|>gamin|>garçon|>homme|>horde|>incendie|>insurrection|>jument|>lion|>nation|>peuple|>pion|>pute|>rebelle|>rébellion|>reine|>roi|>sein|>salope|>tigre|>tour|>troupe]
................................................................................
TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille


__gn_ces_aux_pluriel_1m__
    [ces|aux]  *WORD
        <<- /gn/ morph(\2, ":[NA].*:s", ":[ipGW]") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]"))
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné : « \2 » devrait être au pluriel.
        <<- /gn/ __also__ and morph(\2, ">[bcçdfgjklmnpqrstvwxz].*:m", ":f") >>>
        <<- /gn/ \1.endswith("x") or \1.endswith("X") -1>> au                               && Accord de nombre erroné : « \2 » est au singulier.
        <<- /gn/ __else__ -1>> ce                                                           && Accord de nombre erroné : « \2 » est au singulier.

TEST: {{ces}} {{détournement}} de fonds et ces vols                             ->> ce|||détournements
TEST: ces {{étudiant}} sont légion.                                             ->> étudiants
TEST: je vais {{aux}} {{cinéma}}                                                ->> au|||cinémas
TEST: il l’a donné aux {{étudiant}}                                             ->> étudiants
................................................................................
TEST: l’école de mon entreprise {{pillé}}                       ->> pillée
TEST: l’école de notre cité {{reconstruites}}                   ->> reconstruite
TEST: l’existence de la foi {{rejeté}}                          ->> rejetée
TEST: son homologue de la ville écarté de l’ordre


__gn_det_nom_de_det_nom_adj_sing!3__
    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  [de|d’]  [la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  @:[NA].*:p¬:(?:G|P|i|s|V0|3[sp])
    [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur]  *WORD  du                                                                          *WORD  @:[NA].*:p¬:(?:G|P|i|s|V0|3[sp])
        <<- /gn/ morph(\-2, ":[NA].*:[me]") and not apposition(\-2, \-1)
        --1>> =suggSing(\-1, True)                                                                  && Accord erroné : “\-1” devrait être au masculin singulier.

TEST: la femme de notre homme {{expulsés}}                      ->> expulsé


__gn_det_nom_de_det_nom_adj_sing_plur__
    [le|un|ce|cet]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]                      *WORD  @:A¬:(?:G|P|V0|3[sp])
    [le|un|ce|cet]  *WORD  des                                                              *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[me]:[si]", ":[fp]") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
            and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2) + "|" + suggMasSing(\-1)                                         && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [la|une|cette|ma|ta|sa]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]             *WORD  @:A¬:(?:G|P|V0|3[sp])
    [la|une|cette|ma|ta|sa]  *WORD  des                                                     *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[fe]:[si]", ":[mp]") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
            and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2) + "|" + suggFemSing(\-1)                                         && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [l’|notre|votre|leur]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]               *WORD  @:A¬:(?:G|P|V0|3[sp])
    [l’|notre|votre|leur]  *WORD  des                                                       *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[si]", ":p") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
            and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2)                                       && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [mon|ton|son]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]                       *WORD  @:A¬:(?:G|P|V0|3[sp])
    [mon|ton|son]  *WORD  des                                                               *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[si]", ":p") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
            and not agreement(\-2, \-1) and not agreement(\2, \-1)  >>>
        <<- /gn/ morph(\2, ">[bcçdfgjklmnpqrstvwxz].*:[NA].*:[me]:[si]")
        --1>> =suggAgree(\-1, \-2) + "|" + suggMasSing(\-1, \2)                                     && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.
        <<- /gn/ __else__ and morph(\2, ":[NA].*:[si]")
        --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2)                                       && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  [de|d’] [un|ce|cet]                        *WORD  @:A¬:(?:G|P|V0|3[sp])
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  du                                         *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[me]:[si]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggMasSing(\-1) + "|" + suggAgree(\-1, \2)                                          && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  [de|d’] [la|une|cette|ma|ta|sa]            *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[fe]:[si]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggFemSing(\-1) + "|" + suggAgree(\-1, \2)                                          && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  [de|d’] [l’|notre|votre|leur]              *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[si]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2)                                       && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  [de|d’] [mon|ton|son]                      *WORD  @:A¬:(?:G|P|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[si]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1) >>>
        <<- /gn/ morph(\-2, ">[bcçdfgjklmnpqrstvwxz].*:[NA].*:[me]:[si]")
        --1>> =suggMasSing(\-1, \-2) + "|" + suggAgree(\-1, \2)                                     && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.
        <<- /gn/ __else__ and morph(\-2, ":[NA].*:[si]")
        --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2)                                       && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

TEST: le pari des fous {{engagées}} dans cette fuite en avant                   ->> engagé|engagés
TEST: la faute de ces idiots {{inconscient}}                                    ->> inconscients|inconsciente
TEST: l’erreur de nos dirigeants {{oublié}} par tout le monde                   ->> oubliés|oubliée
TEST: son président de ces jours {{passée}}                                     ->> passés|passé
TEST: son élégance de ces jours {{passées}}                                     ->> passés|passée
TEST: quelques erreurs du passé {{oubliés}}                                     ->> oublié|oubliées
TEST: les errements de la cité {{voisin}}                                       ->> voisine|voisins
TEST: vos compatriotes de votre ville {{tenu}} en haleine                       ->> tenue|tenus
TEST: les instructions de mon président {{ignorée}}                             ->> ignoré|ignorées
TEST: quelques consignes de son instructeur {{oubliée}}                         ->> oublié|oubliées


__gn_det_nom_de_det_nom_adj_plur__
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  @:A.*:[pi]¬:(?:G|P|s|V0|3[sp])
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  des                                          *WORD  @:A.*:[pi]¬:(?:G|P|s|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1)
                and not agreement(\-2, \-1) and not agreement(\2, \-1)
        --1>> =suggAgree(\-1, \-2)                                                                  && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”.

    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  de [ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp])
    [les|ces|mes|tes|ses|nos|vos|leurs|quelques]  *WORD  des                                          *WORD  @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp])
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) and not (value(>1, "|et|ou|") and morph(>2, ":A.*:[si]"))
        --1>> =suggPlur(\-1)                                                                        && Accord erroné : “\-1” devrait être au pluriel.

TEST: ces femmes des mines {{voisins}}                              ->> voisines
................................................................................
        <<- /ppas/ morph(\-1, ":V[123]_.__p_e_", "*") or (value(>1, "|<end>|") and not morph(<1, ":R|>que/"))
        --1>> =suggVerbPpas(\-1, ":f:p")                                                            && Si ce participe passé se rapporte bien à “elles”, il devrait être au féminin pluriel.

TEST: elles ne s’y étaient pas {{donnée}}.                                  ->> données
TEST: sans fin elles se sont succédé


__ppas_ne_me_te_se_être__
    [ne|n’]  ?[y|en]¿  être  @:(?:Y|[123][sp])¬:[QAG]
        <<- /ppas/ --1>> =suggVerbPpas(\-1)                                                         && Incohérence. Le verbe devrait être un participe passé.

    [me|m’|te|se|s’]  ?[y|en]¿  >être  @:(?:Y|[123][sp])¬:[QAG]
        <<- /ppas/ morph(\-2, ":[123]s") --1>> =suggVerbPpas(\-1, ":s")                             && Incohérence. Le verbe devrait être un participe passé.
        <<- /ppas/ morph(\-2, ":[123]p") --1>> =suggVerbPpas(\-1, ":p")                             && Incohérence. Le verbe devrait être un participe passé.
        <<- /ppas/ __else__ --1>> =suggVerbPpas(\-1)                                                && Incohérence. Le verbe devrait être un participe passé.

    [me|m’|te|se|s’]  ?[y|en]¿  >être  @:[QA].*:p¬:[GW]
        <<- /ppas/ morph(\-2, ":[123]s") and not tagbefore(\1, "_que_") and not before("(?i)\\bon (?:ne |)$")
        --1>> =suggSing(\-1)                                                                        && Le participe passé devrait être au singulier.

    tu  t’  ?[y|en]¿  [es|étais|seras|serais|fus|fusses]  @:(?:Y|[123][sp])¬:[QG]
        <<- /ppas/ --1>> =suggVerbPpas(\-1, ":s")                                                   && Incohérence. Le verbe devrait être un participe passé.

TEST: n’y être {{attacher}} que par habitude                                ->> attaché|attachés|attachée|attachées
TEST: n’être {{attacher}} à rien                                            ->> attaché|attachés|attachée|attachées
TEST: s’être toujours {{donner}} le mot.                                    ->> donné|donnée|donnés|données
TEST: je suis venu et me suis totalement {{donnés}} à cette œuvre           ->> donné
TEST: c’est de ce qui s’est {{passe}}.                                      ->> passé|passée
TEST: s’était toujours {{passe}} comme ça avec elle                         ->> passé|passée
TEST: s’est {{approche}} de la penderie                                     ->> approché|approchée
TEST: terrorisant l’animal qui s’était {{cabre}}.                           ->> cabré|cabrée
TEST: ce qui s’est {{passe}}.                                               ->> passé|passée
................................................................................



!!!! Participes passés: accord avec le substantif précédent                                       !!

__ppas_sujet_être_accord_immunités__
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || [être|devenir|redevenir|rester|paraître|paraitre|sembler]                                *WORD
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || être [devenu+e|redevenu+e|resté+e|demeuré+e]                                             *WORD
    *WORD  [que|qu’]  [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B]  *WORD  ?[ne|n’]¿  ?[en|y]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || avoir [été|semblé|paru]                                                                  *WORD
        <<- /ppas/ agreement(\1, \-1) !-1>>

    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || [être|devenir|redevenir|rester|paraître|paraitre|sembler]                                *WORD
    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || être [devenu+e|redevenu+e|resté+e|demeuré+e]                                             *WORD
    *WORD  [que|qu’]  $:M  ?[ne|n’]¿
        || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]
        || avoir [été|semblé|paru]                                                                  *WORD
        <<- /ppas/ agreement(\1, \-1) !-1>>


__ppas_sujet_être_accord_singulier__
    [<start>|,|(|/_start_]  [un|le|ce|cet]  (*WORD)  ?qui¿  ?[ne|n’]¿  ?[en|y]¿          (/_VE_)                                                @:[AQ]¬:(?:[GWM]|[me]:[si])
    [<start>|,|(|/_start_]  [un|le|ce|cet]  (*WORD)  ?qui¿  ?[ne|n’]¿  ?[en|y]¿          (/_LVED_) ?/_LVE_¿ ?/_LVE_¿ ?/_LVE_¿ ?/_LVE_¿ /_LVEF_  @:[AQ]¬:(?:[GWM]|[me]:[si])
................................................................................
TEST: L’affront dont il parle, c’est manquer de respect à ses aînés
TEST: Nous nous efforçons de comprendre ce qu’être veut dire, ce qu’être signifie.
TEST: ce qu’il avait cru être devenait un rêve lointain et à peine concevable.
TEST: la grande crainte du maire est de voir s’effondrer d’autres immeubles
TEST: la grande crainte du maire est de voir arriver d’autres immigrés
TEST: Ce faisant, la chambre criminelle nous précise que relayer n’est pas forcément diffamer
TEST: maintenir en confinement certaines personnes sous prétexte qu’elles sont à risques serait une mesure inconstitutionnelle et discriminatoire.
TEST: Nous avons vu cet être donner sa vie pour son enfant.



!!
!!
!!!! Participes passés: avoir l’air                                                               !!
!!
................................................................................
__immu_les_avoir_fait_vinfi__
    les >avoir fait ?[me|m’|te|t’|se|s’|nous|vous|leur]¿ $:Y
        <<- !3>>


__ppas_ayant__
    ayant  @:(?:Q.*:[fp]|[123][sp])¬:(?:G|N|m:[si])
        <<- /ppas/ not value(\-1, "|barre|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and not value(<1, "|m’|t’|l’|nous|vous|les|")
        --1>> =suggMasSing(\-1)
        && Après avoir, il faut un participe passé au masculin singulier (sauf si le COD se trouve avant le verbe, improbable dans ce cas de figure).

TEST: ayant {{marqués}} les esprits, tout le monde se souvenait d’elles.                            ->> marqué
TEST: ayant prise sur les événements, elle ne voyait aucune raison de s’alarmer.
TEST: je croyais, vous ayant déjà reçus, que vous n’auriez pas à revenir.
TEST: il pensait, nous ayant oubliés, que nous l’aurions oublié, nous aussi.


__ppas_pronom_avoir__
    il  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    il  ?[ne|n’]¿  y  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|N|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    [je|j’|tu|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]  ?[ne|n’]¿  ?[lui|leur|y]¿  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

    [je|j’|tu|il|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]  ?[ne|n’]¿  en  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and (value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|<start>", ":[NA]")))
            and \-1.islower() and morph(\-1, ":(?:[123][sp])", ":[GWQ]")
        --1>> =suggVerbPpas(\-1, ":m:s")
        && 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

TEST: ils leur avaient {{donnés}} du fil à retordre.                                                ->> donné
TEST: il a {{affronte}} une bande de voleurs de bétail                                              ->> affronté
................................................................................
TEST: Je viendrai, après avoir vraiment {{écoutée}} le prof.                                        ->> écouté
TEST: Merci de m’avoir {{lus}}                                                                      ->> lu
TEST: Pourquoi m’avoir {{ignorés}} ainsi ?                                                          ->> ignoré
TEST: sans avoir {{ignorée}} le problème.                                                           ->> ignoré


## avoir avec participe passé
__ppas_n_m_t_l_avoir__
    n’  ?[en|y]¿  >avoir  @:(?:Y|[123][sp])¬:[QGWMX]
        <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|pouvoir|")
        --1>> =suggVerbPpas(\-1, ":m:s")                                                && Confusion probable : employez un participe passé.

    [l’|m’]  ?[en|y]¿  >avoir  @:(?:Y|[123][sp])¬:[QGWMX]
        <<- /ppas/ --1>> =suggVerbPpas(\-1, ":m:s")                                     && Confusion : employez un participe passé.

    t’  ?[en|y]¿  >avoir  @:(?:Y|[123][sp])¬:[QGWMX]
        <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|")
        --1>> =suggVerbPpas(\-1, ":m:s")                                                && Confusion : employez un participe passé.

TEST: n’y avoir jamais {{toucher}}                                                                  ->> touché
TEST: m’avoir {{terminer}}.                                                                         ->> terminé
TEST: il m’a {{souffler}} la bonne réponse.                                                         ->> soufflé
TEST: elle t’en a {{parle}}.                                                                        ->> parlé
TEST: c’est vous qui m’avez {{convertit}}.                                                          ->> converti
TEST: Mélanie l’a {{transformer}}                                                                   ->> transformé
TEST: parce que t’as envie que je le fasse
TEST: t’avais confiance
................................................................................



!!!! Participes passés avec “avoir” (formes interrogatives)                                       !!

__ppas_avoir_interrogatif__
    *WORD  /_VCint_  *WORD
        <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|charge|confiance|cours|envie|peine|marre|prise|crainte|cure|affaire|hâte|force|recours|") >>>
        <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":[QMG]")
        -3>> =suggVerbPpas(\3, ":m:s")                      && Incohérence probable avec “\2”. Après “avoir”, ce verbe devrait être un participe passé.
        <<- /ppas/ __else__ and not value(\1, "|les|l’|m’|t’|nous|vous|en|") and morph(\3, ":Q.*:[fp]", ":m:[si]")
            and not morph(\1, ":[NA].*:[fp]") and not before("(?i)\\b(?:quel(?:le|)s?|combien) ")
        -3>> =suggVerbPpas(\3, ":m:s")                      && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède).

    [<start>|,|(]  ?n’¿  /_VCint_  *WORD
        <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|charge|confiance|cours|envie|peine|marre|prise|crainte|cure|affaire|hâte|force|recours|") >>>
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QMG]")
        --1>> =suggVerbPpas(\-1, ":m:s")                    && Incohérence probable avec “\-2”. Après “avoir”, ce verbe devrait être un participe passé.
        <<- /ppas/ __else__ and morph(\-1, ":Q.*:[fp]", ":m:[si]")
        --1>> =suggVerbPpas(\-1, ":m:s")                    && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède).

TEST: cet été ont-ils {{mentionnés}} la sécheresse                              ->> mentionné
TEST: quand ont-ils {{donner}} satisfaction                                     ->> donné