Grammalecte  Check-in [55b6bb4791]

Overview
Comment:[core][fr] rename functions
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | core | build
Files: files | file ages | folders
SHA3-256: 55b6bb4791d4a36ed9cd9a1980269f7bcce0d52b534c544de53778dbb5f06441
User & Date: olr on 2020-11-25 22:37:24
Other Links: manifest | tags
Context
2020-11-25
22:59
[build][core][fr][doc] rename functions check-in: b695f86d1e user: olr tags: build, core, doc, fr, trunk
22:37
[core][fr] rename functions check-in: 55b6bb4791 user: olr tags: build, core, fr, trunk
21:38
[core] remove useless parameter check-in: bd591492d4 user: olr tags: core, trunk
Changes

Modified compile_rules_graph.py from [dc34a23095] to [b9a13543b1].

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    if sCode[0:1] == "=":
        sCode = sCode[1:]
    sCode = sCode.replace("__also__", "bCondMemo")
    sCode = sCode.replace("__else__", "not bCondMemo")
    sCode = sCode.replace("sContext", "_sAppContext")
    sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|meta|info)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|meta|info)[(]\\-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(select|exclude|define|define_from|rewrite|add_morph|change_meta)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(select|exclude|define|define_from|rewrite|add_morph|change_meta)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(tag_before|tag_after)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode)
    sCode = re.sub(r"\b(tag_before|tag_after)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], dTags', sCode)
    sCode = re.sub(r"\bspace_after[(][\\](\d+)", 'g_space_between_tokens(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\bspace_after[(][\\]-(\d+)", 'g_space_between_tokens(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\banalyse_with_next[(][\\](\d+)", 'g_merged_analyse(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\banalyse_with_next[(][\\]-(\d+)", 'g_merged_analyse(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(>1", 'g_\\1(lToken[nLastToken+1]', sCode)                       # next token
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(<1", 'g_\\1(lToken[nTokenOffset]', sCode)                       # previous token
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(>(\d+)", 'g_\\1(g_token(lToken, nLastToken+\\2)', sCode)        # next token







|
|
|
|







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    if sCode[0:1] == "=":
        sCode = sCode[1:]
    sCode = sCode.replace("__also__", "bCondMemo")
    sCode = sCode.replace("__else__", "not bCondMemo")
    sCode = sCode.replace("sContext", "_sAppContext")
    sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|meta|info)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|meta|info)[(]\\-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(select|exclude|define|definefrom|rewrite|addmorph|setmeta)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(select|exclude|define|definefrom|rewrite|addmorph|setmeta)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], dTags', sCode)
    sCode = re.sub(r"\bspace_after[(][\\](\d+)", 'g_space_between_tokens(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\bspace_after[(][\\]-(\d+)", 'g_space_between_tokens(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\banalyse_with_next[(][\\](\d+)", 'g_merged_analyse(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\banalyse_with_next[(][\\]-(\d+)", 'g_merged_analyse(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(>1", 'g_\\1(lToken[nLastToken+1]', sCode)                       # next token
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(<1", 'g_\\1(lToken[nTokenOffset]', sCode)                       # previous token
    sCode = re.sub(r"\b(morph|analyse|tag|meta|value)\(>(\d+)", 'g_\\1(g_token(lToken, nLastToken+\\2)', sCode)        # next token

Modified doc/syntax.txt from [9d8b7e574a] to [ae64accd19].

354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
...
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
...
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
`tag(n, tag)`

>   Returns True if <tag> exists on taken the nth token.

`tag_before(n, tag)`

>   Returns True if <tag> is found any token before the nth tag.
   
`tag_after(n, tag)`

>   Returns True if <tag> is found any token after the nth tag.

### Functions for regex and token rules

`__also__`
................................................................................
    =>> exclude(\1, "po:verb")
    =>> exclude(\1, "po:verb") and define(\2, ["po:adv"]) and select(\3, "po:adv")

Note: All these functions ALWAYS return True.

If `select()` and `exclude()` generate an empty list, nothing change.

With `define()` and `add_morph()`, you must set a list of POS tags. Example:

    =>> define(\1, ["po:nom is:plur", "po:adj is:sing", "po:adv"])
    =>> add_morph(\1, ["po:adv"])

### Tagging

**Only for token rules**. Tagging can be done with the command `/>>`. You can set one or several tags at once. Use `|` as a separator.

Example: `/>> a_tag` to set the same tag on all takens of the rule.
Example: `/3>> a_tag` to set the tag on the third token.
................................................................................

    DEF: name definition

Usage: `{name}` will be replaced by its definition

Example:

    DEF: word_3_letters     \w\w\w+  
    DEF: uppercase_token    ~^[A-Z]+$
    DEF: month_token        [January|February|March|April|May|June|July|August|September|October|November|december]

    ({word_3_letters}) (\w+) <<- condition ->> suggestion     && message|URL

    {uppercase_token} {month_token}
        <<- condition ->> message                             && message|URL







|







 







|


|







 







|







354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
...
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
...
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
`tag(n, tag)`

>   Returns True if <tag> exists on taken the nth token.

`tag_before(n, tag)`

>   Returns True if <tag> is found any token before the nth tag.

`tag_after(n, tag)`

>   Returns True if <tag> is found any token after the nth tag.

### Functions for regex and token rules

`__also__`
................................................................................
    =>> exclude(\1, "po:verb")
    =>> exclude(\1, "po:verb") and define(\2, ["po:adv"]) and select(\3, "po:adv")

Note: All these functions ALWAYS return True.

If `select()` and `exclude()` generate an empty list, nothing change.

With `define()` and `addmorph()`, you must set a list of POS tags. Example:

    =>> define(\1, ["po:nom is:plur", "po:adj is:sing", "po:adv"])
    =>> addmorph(\1, ["po:adv"])

### Tagging

**Only for token rules**. Tagging can be done with the command `/>>`. You can set one or several tags at once. Use `|` as a separator.

Example: `/>> a_tag` to set the same tag on all takens of the rule.
Example: `/3>> a_tag` to set the tag on the third token.
................................................................................

    DEF: name definition

Usage: `{name}` will be replaced by its definition

Example:

    DEF: word_3_letters     \w\w\w+
    DEF: uppercase_token    ~^[A-Z]+$
    DEF: month_token        [January|February|March|April|May|June|July|August|September|October|November|december]

    ({word_3_letters}) (\w+) <<- condition ->> suggestion     && message|URL

    {uppercase_token} {month_token}
        <<- condition ->> message                             && message|URL

Modified gc_core/js/lang_core/gc_functions.js from [66aee0aeb8] to [aa38f73dea].

295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
...
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
...
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
    let bResult = lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1));
    if (bResult && bSetMorph) {
        oToken1["lMorph"] = lMorph;
    }
    return bResult;
}

function g_tag_before (oToken, dTags, sTag) {
    if (!dTags.has(sTag)) {
        return false;
    }
    if (oToken["i"] > dTags.get(sTag)[0]) {
        return true;
    }
    return false;
}

function g_tag_after (oToken, dTags, sTag) {
    if (!dTags.has(sTag)) {
        return false;
    }
    if (oToken["i"] < dTags.get(sTag)[1]) {
        return true;
    }
    return false;
................................................................................
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}

function g_add_morph (oToken, sNewMorph) {
    // Disambiguation: add a morphology to a token
    let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    lMorph.push(...sNewMorph.split("|"));
    oToken["lMorph"] = lMorph;
    return true;
}

................................................................................

function g_define (oToken, sMorphs) {
    // set morphologies of <oToken>, always return true
    oToken["lMorph"] = sMorphs.split("|");
    return true;
}

function g_define_from (oToken, nLeft=null, nRight=null) {
    let sValue = oToken["sValue"];
    if (nLeft !== null) {
        sValue = (nRight !== null) ? sValue.slice(nLeft, nRight) : sValue.slice(nLeft);
    }
    oToken["lMorph"] = gc_engine.oSpellChecker.getMorph(sValue);
    return true;
}

function g_change_meta (oToken, sType) {
    // Disambiguation: change type of token
    oToken["sType"] = sType;
    return true;
}










|









|







 







|







 







|








|







295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
...
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
...
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
    let bResult = lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1));
    if (bResult && bSetMorph) {
        oToken1["lMorph"] = lMorph;
    }
    return bResult;
}

function g_tagbefore (oToken, dTags, sTag) {
    if (!dTags.has(sTag)) {
        return false;
    }
    if (oToken["i"] > dTags.get(sTag)[0]) {
        return true;
    }
    return false;
}

function g_tagafter (oToken, dTags, sTag) {
    if (!dTags.has(sTag)) {
        return false;
    }
    if (oToken["i"] < dTags.get(sTag)[1]) {
        return true;
    }
    return false;
................................................................................
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}

function g_addmorph (oToken, sNewMorph) {
    // Disambiguation: add a morphology to a token
    let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    lMorph.push(...sNewMorph.split("|"));
    oToken["lMorph"] = lMorph;
    return true;
}

................................................................................

function g_define (oToken, sMorphs) {
    // set morphologies of <oToken>, always return true
    oToken["lMorph"] = sMorphs.split("|");
    return true;
}

function g_definefrom (oToken, nLeft=null, nRight=null) {
    let sValue = oToken["sValue"];
    if (nLeft !== null) {
        sValue = (nRight !== null) ? sValue.slice(nLeft, nRight) : sValue.slice(nLeft);
    }
    oToken["lMorph"] = gc_engine.oSpellChecker.getMorph(sValue);
    return true;
}

function g_setmeta (oToken, sType) {
    // Disambiguation: change type of token
    oToken["sType"] = sType;
    return true;
}



Modified gc_core/py/lang_core/gc_functions.py from [2ffbd61317] to [35f4fd30c3].

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
...
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
...
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
    zPattern = re.compile(sPattern)
    bResult = any(zPattern.search(sMorph)  for sMorph in lMorph)
    if bResult and bSetMorph:
        dToken1["lMorph"] = lMorph
    return bResult


def g_tag_before (dToken, dTags, sTag):
    "returns True if <sTag> is present on tokens before <dToken>"
    if sTag not in dTags:
        return False
    if dToken["i"] > dTags[sTag][0]:
        return True
    return False


def g_tag_after (dToken, dTags, sTag):
    "returns True if <sTag> is present on tokens after <dToken>"
    if sTag not in dTags:
        return False
    if dToken["i"] < dTags[sTag][1]:
        return True
    return False

................................................................................
    lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dToken["lMorph"] = lSelect
    #echo("DA:", dToken["sValue"], dToken["lMorph"])
    return True


def g_add_morph (dToken, sNewMorph):
    "Disambiguation: add a morphology to a token"
    lMorph = dToken["lMorph"]  if "lMorph" in dToken  else _oSpellChecker.getMorph(dToken["sValue"])
    lMorph.extend(sNewMorph.split("|"))
    dToken["lMorph"] = lMorph
    return True


................................................................................
def g_define (dToken, sMorphs):
    "Disambiguation: set morphologies of <dToken>, always return True"
    dToken["lMorph"] = sMorphs.split("|")
    #echo("DA:", dToken["sValue"], lMorph)
    return True


def g_define_from (dToken, nLeft=None, nRight=None):
    "Disambiguation: set morphologies of <dToken> with slicing its value with <nLeft> and <nRight>"
    if nLeft is not None:
        dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])
    else:
        dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"])
    return True


def g_change_meta (dToken, sType):
    "Disambiguation: change type of token"
    dToken["sType"] = sType
    return True



#### GRAMMAR CHECKER PLUGINS







|








|







 







|







 







|








|







244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
...
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
...
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
    zPattern = re.compile(sPattern)
    bResult = any(zPattern.search(sMorph)  for sMorph in lMorph)
    if bResult and bSetMorph:
        dToken1["lMorph"] = lMorph
    return bResult


def g_tagbefore (dToken, dTags, sTag):
    "returns True if <sTag> is present on tokens before <dToken>"
    if sTag not in dTags:
        return False
    if dToken["i"] > dTags[sTag][0]:
        return True
    return False


def g_tagafter (dToken, dTags, sTag):
    "returns True if <sTag> is present on tokens after <dToken>"
    if sTag not in dTags:
        return False
    if dToken["i"] < dTags[sTag][1]:
        return True
    return False

................................................................................
    lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dToken["lMorph"] = lSelect
    #echo("DA:", dToken["sValue"], dToken["lMorph"])
    return True


def g_addmorph (dToken, sNewMorph):
    "Disambiguation: add a morphology to a token"
    lMorph = dToken["lMorph"]  if "lMorph" in dToken  else _oSpellChecker.getMorph(dToken["sValue"])
    lMorph.extend(sNewMorph.split("|"))
    dToken["lMorph"] = lMorph
    return True


................................................................................
def g_define (dToken, sMorphs):
    "Disambiguation: set morphologies of <dToken>, always return True"
    dToken["lMorph"] = sMorphs.split("|")
    #echo("DA:", dToken["sValue"], lMorph)
    return True


def g_definefrom (dToken, nLeft=None, nRight=None):
    "Disambiguation: set morphologies of <dToken> with slicing its value with <nLeft> and <nRight>"
    if nLeft is not None:
        dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])
    else:
        dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"])
    return True


def g_setmeta (dToken, sType):
    "Disambiguation: change type of token"
    dToken["sType"] = sType
    return True



#### GRAMMAR CHECKER PLUGINS

Modified gc_lang/fr/rules.grx from [f8fdf0f604] to [16cbef8ec3].

1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
....
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
....
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
....
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
....
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
....
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
....
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
....
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
....
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
....
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
....
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
....
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
....
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
....
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
....
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
....
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
....
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
....
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
.....
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
.....
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
.....
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
.....
19337
19338
19339
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
.....
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
.....
21481
21482
21483
21484
21485
21486
21487
21488
21489
21490
21491
21492
21493
21494
21495
.....
24946
24947
24948
24949
24950
24951
24952
24953
24954
24955
24956
24957
24958
24959
24960
.....
25320
25321
25322
25323
25324
25325
25326
25327
25328
25329
25330
25331
25332
25333
25334
.....
25354
25355
25356
25357
25358
25359
25360
25361
25362
25363
25364
25365
25366
25367
25368
.....
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
25403
25404
25405
.....
25437
25438
25439
25440
25441
25442
25443
25444
25445
25446
25447
25448
25449
25450
25451
.....
25489
25490
25491
25492
25493
25494
25495
25496
25497
25498
25499
25500
25501
25502
25503
.....
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
.....
26898
26899
26900
26901
26902
26903
26904
26905
26906
26907
26908
26909
26910
26911
26912
.....
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
28333
.....
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
28661
.....
30209
30210
30211
30212
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
30223
.....
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
30912
.....
30938
30939
30940
30941
30942
30943
30944
30945
30946
30947
30948
30949
30950
30951
30952
30953
30954
30955
30956
30957
30958
30959
30960
30961
30962
30963
30964
30965
30966
30967
30968
#TEST: +{{1.5}} dioptrie
#TEST: j’en veux 2.000
#TEST: et moi 3.000.000 de dollars


__virg_après_verbe_COD__
    [le|la|l’|les]  $:Y¬:N  $:M
        <<- /virg/ not value(\2, "|appeler|") and not tag_before(\1, "_que_") and not tag_before(\1, "_comme_")
        -2>> \2,                                                && Si “\-1” marque le début d’une proposition, une virgule est probablement souhaitable.

    [le|la|l’|les]  *WORD  ?[cher|chère]¿  @:M[12]  <end>
        <<- /virg/ morph(\2, ":[123][sp]", ">appeler/|:[NA]") and not tag_before(\1, "_que_") and not tag_before(\1, "_comme_")
        -2>> \2,                                                && Si “\-2” est une personne apostrophée, alors il faut mettre le nom en incise.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?Th=2&t1=&id=3412

TEST: Tu vas les {{donner}} Rachel.
TEST: Il va la {{tuer}} Paul.
TEST: je le {{sais}} chère Paula
TEST: Ma fille, je vais l’appeler Deirdre.
TEST: Cependant les promesses n’engagent que ceux qui les croient, comme aimait à le dire Jacques Chirac.
................................................................................
    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)
        <<- =>> exclude(\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 tag_before(\1, "_2s_") and not value(>1, "|tu|pas|jamais|")
        =>> exclude(\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") =>> exclude(\2, ":V")

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


__da_groupe_nominal__cas_particuliers__
    [au|aux] alentour
        <<- =>> select(\2, ":N")

    avions
        <<- not tag_before(\1, "_1p_") and not value(<1, "|n’|") and not value(>1, "|nous|") =>> select(\-1, ":N")

    l’ avions
        <<- morph(<1, ":Y") =>> select(\-1, ":N")

    bac + ~^\d\d?$
        <<- ~>> ␣
        <<- =>> define(\1, ":N:e:i")
................................................................................
__da_couleurs_invariables__
    *WORD [abricot|acajou|amarante|anthracite|aubergine|brique|caca|café|cannelle|caramel|carmin|carotte|cerise|châtaigne|chocolat|citron|corail|crème|fuchsia|groseille|havane|jonquille|marron|mastic|nacarat|ocre|olive|paille|parme|pastel|pervenche|pie|prune|sable|tabac|vermillon]
        <<- morph(\1, ":(?:D.*:p|B)") =>> exclude(\2, ":A:e:i")


__da_noms_propres__
    Concorde
        <<- not morph(<1, ":D.*:f") =>> add_morph(\1, ">Concorde/:MP:m:i")

    Mustang
        <<- not morph(<1, ":D.*:m") =>> add_morph(\1, ">Mustang/:MP:f:i")

TEST: le crash du Concorde
TEST: elle a acheté une Mustang



!!!
................................................................................
    ni
        <<- />> _ni_


__tag_noms__
    ~\w-là$
        <<- />> -là
        <<- =>> =define_from(\1, 0, -3)

    ## _1M_  : première lettre majuscule
    ## _CAP_ : toutes capitales
    ## _Cap_ : première lettre capitale, les autres minuscules
    ~^[A-ZÀÂÉÈÊÎÏÔ]
        <<- />> _Maj_
        <<- \1.isupper() />> _CAP_
................................................................................
    alors    [que|qu’]
    dès lors [que|qu’]
        <<- ~>> ␣
        <<- =>> define(\1, ":Cs")

    quelqu’ [un|une]
        <<- ~>> ␣
        <<- =>> change_meta(\1, "WORD")


    [  [m|t|s]  ]  [a|on|es]
    [  [n|v]    ]  [otre|ôtre]
        <<- space_after(\1, 0, 0) and space_after(\2, 0, 0) and space_after(\3, 0, 0) ~>> ␣\2\4
        <<- =>> change_meta(\1, "WORD")

TEST: [s]es {{homme}}                                           ->> hommes
TEST: des effets sur [s]es états d’âme, [s]on corps


__fusions_noms_communs__
    au revoir
................................................................................

    notre père
        <<- morph(<1, ":D.*:[mp]") ~>> ␣
        <<- __also__ =>> define(\1, ":N:m:i")

    presqu’ [>ile|>île]
        <<- ~>> ␣
        <<- =>> change_meta(\1, "WORD")

    nec plus ultra
    terra incognita
    statu quo
        <<- ~>> ␣

    *NUM : *NUM
................................................................................


__eleu_n_superflu__
    on n’ [a|avait|eut|aura|aurait|eût] rarement
        <<- /eleu/ -2:3>> \3                                    && Adverbe de négation erroné. Rarement signifie que ça arrive, pas que ça n’arrive pas.

    on n’ [a|avait|eut|aura|aurait|eût] [>besoin|>chaud|>crainte|>faim|>froid|>peur|>soif]
        <<- /eleu/ not tag_after(\-1, "_que_") and not value(<1, "|jamais|guère|")
        -2:3>> \3|n’\3 pas|n’\3 jamais|n’\3 plus|n’\3 guère     && Adverbe de négation superflu ou manquant.

TEST: on {{n’a}} rarement besoin d’avoir accès à plus de 10 logiciels.              ->> a
TEST: on {{n’avait}} faim.                                                          ->> avait|n’avait pas|n’avait jamais|n’avait plus|n’avait guère
TEST: on n’avait peur que lorsque la tempête soufflait
TEST: jamais on n’eut besoin d’une telle chose.

................................................................................


!!!! Dates                                                                                        !!

__fusion_date__
    *NUM  -  ~^\d\d?$  -  ~^\d{2,5}$
        <<- \1.isdigit() ~>> ␣
        <<- =>> change_meta(\1, "DATE")


__date_jour_mois_année__
    31 [avril|juin|septembre|novembre]
        <<- /date/ space_after(\1, 1, 1) ->> 30 \2                                                  && Cette date est invalide. Il n’y a que 30 jours en \2.

    [30|31] février
................................................................................
        <<- ~1>> *

    [une|la|cette|cet|ma|ta|sa]  pseudo  @:N.*:f
        <<- /tu/ -2:3>> pseudo-\3                                                                   && Si vous voulez évoquer le simulacre de “\2”, mettez un trait d’union.
        <<- ~2>> *

    ~^[pP]seudo-\w+
        <<- =>> define_from(\1, 7)

TEST: il n’avait contracté qu’un {{pseudo mariage}}.
TEST: elle connaissait de {{cet}} pseudo-prêtresse uniquement de nom.
TEST: la {{pseudo taxe}} carbone


__tu_mots_composés_verbe_nom__
................................................................................
!!!! Trait d’union : formes interrogative (nous/vous)                                             !!

__inte_union_nous1!7__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~ons$  nous
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~ons$  nous
    [ne|n’]  [le|la|l’|les]                  [lui|leur|en|y]             ~ons$  nous
    [ne|n’]  [lui|leur|y]                    en                          ~ons$  nous
        <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:1p", ":[GW]") and not tag_before(\1, "_1p_")
        --2:-1>> \-2-\-1                                                                            && Forme interrogative ? Mettez un trait d’union.

    ,  ~ons$  nous  [<end>|,|)]
    ,  ~ons$  nous  @:¬:(?:1p|Y)
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and not value(\2, "|veuillons|sachons|")
        -2:3>> \2-\3                                                                                && Forme interrogative ? Mettez un trait d’union.

................................................................................


__inte_union_vous1!7__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~ez$  vous
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~ez$  vous
    [ne|n’]  [le|la|l’|les]                  [lui|leur|en|y]             ~ez$  vous
    [ne|n’]  [lui|leur|y]                    en                          ~ez$  vous
        <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:2p", ":[GW]") and not tag_before(\1, "_2p_")
        --2:-1>> \-2-\-1       && Forme interrogative ? Mettez un trait d’union.

    ,  ~ez$  vous  [<end>|,|)]
    ,  ~ez$  vous  @:¬:(?:2p|Y)
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and not value(\2, "|veuillez|sachez|")
        -2:3>> \2-\3                                                                                && Forme interrogative ? Mettez un trait d’union.

................................................................................
!!
!!

## Incohérences avec formes verbales 1sg et 2sg sans sujet

__conj_1s_sans_sujet_xxxai!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~ai$
        <<- /conj/ not tag_before(\1, "_1s_") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp])")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~ai$
    [le|la|l’|les]      [lui|leur|en|y]         ~ai$
    [lui|leur]          en                      ~ai$
        <<- /conj/ not tag_before(\1, "_1s_") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp])")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~ai$
        <<- /conj/ not tag_before(\-1, "_1s_") and not morph(<1, ":R") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    ~ai$
        <<- /conj/ not tag_before(\1, "_1s_") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp]|N|A|Q)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

TEST: avançait et s’{{donnai}} en spectacle
TEST: il avancera, ne {{serai}} ce que de quelques pas
TEST: m’{{occupai}} que deux jours, cette ânerie
TEST: Lui, quand il y pensait, en {{arrivai}} à chaque fois à la même conclusion.
TEST: {{dansai}} puis oubliait
TEST: ce qui, dans le meilleur des cas, peut-être, oui, c’est vrai, vous {{donnerai}} l’avantage.


__conj_2s_sans_sujet_xxxas_xxxes!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~[ae]s$
        <<- /conj/ not tag_before(\1, "_2s_") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~[ae]s$
    [le|la|l’|les]      [lui|leur|en|y]         ~[ae]s$
    [lui|leur]          en                      ~[ae]s$
        <<- /conj/ not tag_before(\-1, "_2s_") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~[ae]s$
        <<- /conj/ not tag_before(\-1, "_2s_") and not morph(<1, ":R") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    ~..[ae]s$
        <<- /conj/ not tag_before(\1, "_2s_") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|N|A|Q|1p)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

TEST: se {{demandes}} comment faire
TEST: oui, il l’ignorait, ne me {{demandes}} comment c’était possible
TEST: c’est ça, me {{demandes}} comment c’est possible
TEST: je me questionne, {{exiges}} des réponses mais n’en obtiens pas…
TEST: Caroline, quand l’heure viendra, {{décideras}} de la conduite à tenir.
................................................................................
TEST: {{arrimeras}} le voilier
TEST: n’est-ce pas, indubitablement, nous la {{contestes}}
TEST: nous laisserons derrière nous les empires de la Terre.


__conj_1s_2s_sans_sujet_xxxs!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~[iudnrtpcï]s$
        <<- /conj/ not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~[iudnrtpcï]s$
    [le|la|l’|les]      [lui|leur|en|y]         ~[iudnrtpcï]s$
    [lui|leur]          en                      ~[iudnrtpcï]s$
        <<- /conj/ not tag_before(\-1, "_1s_") and not tag_before(\-1, "_2s_") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~[iudnrtpcï]s$
        <<- /conj/ not tag_before(\-1, "_1s_") and not tag_before(\1, "_2s_") and not morph(<1, ":R") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    étais
        <<- /conj/ not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_") and not (\1.istitle() and before0("\\w")) and not morph(<1, ":[DA].*:p")
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

    ~[iudnrtpcï]s$
        <<- /conj/ not tag(\1, "eg1mot") and not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_")
            and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p|V0e|N|A|Q)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

TEST: s’{{précipitais}} dans la gueule du loup
TEST: ne leur {{donnais}} aucune raison de se faire aimer
TEST: leur en {{faisais}} baver
TEST: vous en {{donnais}} pour votre argent, ce type.
................................................................................


__conj_peux_veux_vaux_équivaux_prévaux_sans_sujet!3__
    [ne|n’]                  ?[le|la|l’|les|en|vous|lui|leur|y]¿  [peux|veux|vaux|équivaux|prévaux]
    [me|m’|te|t’|nous|vous]  ?[le|la|l’|les|en|y]¿                [peux|veux|vaux|équivaux|prévaux]
    [le|la|l’|les]           [lui|leur|en|y]                      [peux|veux|vaux|équivaux|prévaux]
    [lui|leur]               en                                   [peux|veux|vaux|équivaux|prévaux]
        <<- /conj/ not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    vaux
        <<- /conj/ not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_") and not (\1.istitle() and before0("\\w"))
            and not morph(<1, ":(?:R|D.*:p)")
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

    [peux|veux|équivaux|prévaux]
        <<- /conj/ not tag_before(\1, "_1s_") and not tag_before(\1, "_2s_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

TEST: tu sais, s’{{équivaux}}, voilà.
TEST: tu sais, s’en {{veux}} d’avoir raté ça.
TEST: s’{{peux}} qu’il avait faim, va savoir
TEST: n’{{équivaux}} pas à ma BMW, cette tire.
TEST: faut voir, ces hommes, lui, tu sais, l’en peux
................................................................................
TEST: Elle, ici et dans tous les cas de figure, {{veux}} toujours en faire plus.
TEST: Le total de cette opération, contrairement à ce qu’on pense, {{équivaux}} à au moins trois d’entre eux.


## Incohérences avec formes verbales 1pl et 2pl sans sujet
__conj_1p_sans_sujet!3__
    ~ons$
        <<- /conj/ morph(\1, ":1p", ":[EGMNAJ]") and not tag_before(\1, "_1p_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3p")     && Ceci est un verbe à la 1ʳᵉ personne du pluriel. Sujet (“nous” ou équivalent) introuvable.

__conj_2p_sans_sujet!3__
    ~ez$
        <<- /conj/ morph(\1, ":2p", ":[EGMNAJ]") and not tag_before(\2, "_2p_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3p")     && Ceci est un verbe à la 2ᵉ personne du pluriel. Sujet (“vous” ou équivalent) introuvable.

TEST: les hommes et les femmes, qui sans un bruit, sans une parole amère, {{continuerons}} leur tâche n’en seront pas plus récompensés.
TEST: il était dit que cette femme et son frère {{promènerez}} leur chien à cette heure de la journée.
TEST: cet homme et cette femme {{pouvez}} y parvenir avec de la persévérance
TEST: Comme on lui disait que vous-même aviez déjà consulté le notaire
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
................................................................................

TEST: en tant qu’{{abaisse}}
TEST: en tant que tel


__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tag_before(\1, "_ceque_") and not value(<1, "|ou|") -2>> _                   && Incohérence probable avec “presque” : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: presque {{délaissait}} par tout le monde.
TEST: Tout le monde ou presque déteste ces gens-là.


__conf_sur_vconj__
    sur  @:(?:[123][sp]|P)¬:[GNAQM]
................................................................................

# pour justifiée qu’elle fût
# [aussi|si] habile qu’il soit


__conf_trop_vconj__
    trop  @:[123][sp]¬:(?:[GNAQWM]|3p)
        <<- /conf/ not tag_before(\1, "_ceque_") -2>> _                                              && Incohérence probable avec “trop” : “\2” n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: J’ai trop {{mangeais}}.
TEST: Ce que nous réussissons presque sera considéré comme un échec.


__conf_très_verbe__
    très  @:(?:Y|[123][sp])¬:[AQW]
................................................................................
TEST: Un homme pas {{évidement}} intelligible.
TEST: L’{{évidemment}} du sanglier ne sera pas si facile.


# en fait
__conf_en_fait__
    en [faite|>faîte]
        <<- /conf/ not value(<1, "|n’|") and not tag_before(\1, "_2p_")
        ->> en fait                                         && Confusion probable : « en fait » qui signifie « en réalité ». Le faîte est la partie la plus élevée d’un bâtiment.

TEST: {{en faite}}, on en voit partout, ça grouille.
TEST: ils sont {{en faîtes}} partis à la montagne.
TEST: Aujourd’hui, n’en faites pas trop.


................................................................................
    [qui|que|comment|pourquoi|lorsque|quand] son [,|@:[DR]]
        <<- /conf/ -2>> sont                                    && Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

    [<start>|,|(] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son                                     && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ morph(<1, ":(?:V|Cs|R)", ":(?:[NA].*:[pi]|Ov)") and not tag_before(\1, "_ceque_")
        -1>> son                                                && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    [à|chez|dès|par] sont
    [avec|contre|devant|derrière|pour|sans|sur] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son                                     && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    en sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
................................................................................
    haut [placé+ses]
        <<- not value(<1, "|en|de|d’|") ~1>> *

    haut et fort
        <<- not morph(<1, ":D") ~>> *

    hélas
        <<- not morph(<1, ":(?:X|Ov)") and not tag_before(\1, "_2s_") ~>> *

    [hein|hop]
        <<- not morph(<1, ":D") ~>> *

    la lettre [a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]  @:(?:3s|Ov)
        <<- ~3>> *

................................................................................
    >prêter attention a
    enclin a
    en être [réduit+ses] a
    en [hommage|proie] a
    [m’|t’|s’] en >remettre a
    nous nous en >remettre a
    vous vous en >remettre a
        <<- /conf/ \-1 != "A" and not tag_before(\1, "_àCOI_") and not value(>1, "|été|")
        --1>> à                                                             && Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    [>abandonner|>accorder|>adapter|>adjoindre|>adresser|>affirmer|>agréer|>aider|>ajouter|>amener|>annoncer|>appeler|>applaudir|>appliquer|>apporter|>apprendre|>arguer|>argüer|>aspirer|>assujettir|>attacher|>atteindre|>attoucher|>attribuer|>autoriser|>avancer|>céder|>changer|>chicaner|>coller|>commander|>commencer|>conclure|>conférer|>confier|>confirmer|>conseiller|>consentir|>conspirer|>continuer|>convertir|>couper|>couter|>coûter|>croire|>décider|>déclarer|>décrire|>défendre|>déférer|>demander|>destiner|>devoir|>dire|>disposer|>disputer|>donner|>échapper|>écrire|>élever|>employer|>engager|>enjoindre|>entendre|>envoyer|>exercer|>expliquer|>exposer|>falloir|>fermer|>filer|>forfaire|>former|>fournir|>gouter|>goûter|>impartir|>imputer|>infliger|>insulter|>intégrer|>intéresser|>jeter|>justifier|>lier|>lire|>livrer|>manquer|>mesurer|>mettre|>montrer|>obliger|>obtenir|>offrir|>ouvrir|>parer|>parler|>passer|>payer|>penser|>permettre|>porter|>pourvoir|>prendre|>préparer|>prescrire|>présenter|>présider|>prétendre|>promettre|>protester|>quémander|>rappeler|>rapprendre|>ravir|>réapprendre|>recoller|>recourir|>redéclarer|>redire|>référer|>réfléchir|>refuser|>regarder|>réimputer|>remesurer|>remettre|>remontrer|>rendre|>renoncer|>reparler|>répondre|>reprendre|>répugner|>retoucher|>retravailler|>retweeter|>réussir|>révéler|>rêver|>satisfaire|>schtroumpfer|>servir|>signaler|>sonner|>soumettre|>souscrire|>soutenir|>statuer|>suppléer|>surseoir|>sursoir|>survendre|>téléphoner|>témoigner|>tendre|>tenir|>tirer|>toucher|>traduire|>travailler|>tweeter|>unir|>veiller|>vendre|>virer|>viser|>vouloir|>aboutir|>acquiescer|>adhérer|>apparaitre|>apparaître|>compatir|>complaire|>concourir|>confiner|>contribuer|>convenir|>coopérer|>correspondre|>déplaire|>désobéir|>disparaitre|>équivaloir|>mentir|>naitre|>naître|>nuire|>obéir|>obtempérer|>participer|>plaire|>profiter|>réagir|>rechigner|>renaitre|>renaître|>résister|>ressembler|>retéléphoner|>seoir|>songer|>sourire|>succéder|>succomber|>suffire|>surréagir|>survivre|>tarder|>vaquer] a
    >arriver a
    >condamner a
    ## locutions
    >avoir du mal a
................................................................................
    >dire [adieu|merde] a
    >donner du grain à moudre a
    >faire [barrage|barrière|confiance|écho] a
    >faire faux bond a
    >prêter serment a
    >rendre hommage a
    >rendre service a
        <<- /conf/ not tag_before(\1, "_propsub_") and not morph(\1, ":[YNA]") and not value(>1, "|été|")
        --1>> à                                                             && Confusion probable : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    @:V¬:[YGNAWM]  a
        <<- /conf/ \-1 != "A" and not tag(\-1, "eg1mot") and not tag_before(\1, "_propsub_") and not morph(>1, ":Q")
        --1>> à                                                             && Confusion probable : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    [/_VCint_|/_VCimp_]  a
        <<- /conf/ not value(\1, "|rendez-vous|") --1>> à                   && Confusion : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    >passer du coq a l’ âne
        <<- /conf/ -4>> à                                                   && Confusion : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0
................................................................................

TEST: Ils l’ont échappé {{bel}}


# bien / bine
__conf_bien_bine__
    bine
        <<- /conf/ not tag_before(\1, "_propsub_") and morph(<1, ":V")
        ->> bien                                                        && Confusion probable. Erreur de frappe ?

    [<start>|,|(] bine [que|qu’|entendu|sûr]
        <<- /conf/ -2>> bien                                            && Confusion probable. Erreur de frappe ?

TEST: il me semblait {{bine}} que j’avais raison                        ->> bien
TEST: il avance {{bine}}                                                ->> bien
................................................................................
__conf_prie_prit__
    [me|te|le|la|nous|vous|les] prit [de|d’] [ne|n’|me|m’|te|t’|se|s’]
    [me|te|le|la|nous|vous|les] prit [de|d’] [le|la|l’|les|en|nous|vous|lui|leur|y]  $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [nous|vous]     [le|la|l’|les|en|y]     $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [le|la|l’|les]  [lui|leur|en|y]         $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [lui|leur|y]    en                      $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] $:Y
        <<- /conf/ not tag_before(\1, "_cequi_") -2>> prie              && Confusion probable. Si vous voulez dire “prier de faire quelque chose”, écrivez “prie”.|https://fr.wiktionary.org/wiki/prier

TEST: elle me {{prit}} d’obéir
TEST: je ne sais pas ce qui me prit de lui écrire


# prêt / près / pré
__conf_suivre_de_près__
................................................................................
    [de|d’] leur                 en                                              @:V¬:Y
    [de|d’] lui                  en                                              @:V¬:[YP]
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             && Après “de”, le verbe devrait être à l’infinitif.

    [de|d’]  @:V1.*:Q¬:N
        <<- /infi/ not \2[0:1].isupper() and not morph(<1, ">(?:en|passer|qualifier)/") and not morph(\2, ">(?:fieffer|sacrer)/")
            and not before("(?i)(?:quelqu(?:e chose|’une?)|qu’y a-t-il |\\b(?:l(?:es?|a)|nous|vous|me|te|se) trait|personne|points? +$|autant +$|ça +|rien d(?:e |’)|rien(?: +[a-zéèêâîûù]+|) +$)")
            and not tag_before(\1, "_ceque_")
        -2>> =suggVerbInfi(\2)                                                          && Le verbe devrait être à l’infinitif.

TEST: d’en {{parlé}} sans cesse
TEST: cela suffit de les {{aimait}}
TEST: de ne leur en {{avancé}} que le nécessaire.
TEST: de l’y {{poussé}}
TEST: je suis certain d’en {{choque}} plusieurs.
................................................................................
        <<- /infi/ not value(\1, "|devoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not (value(\1, "|devant|") and morph(\-1, ":N"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet doit accomplir, le verbe devrait être à l’infinitif.

    >devoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|devoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not (value(\1, "|devant|") and morph(\-1, ":N")) and not tag_before(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet doit accomplir, le verbe devrait être à l’infinitif.

    de  devoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|puis|pouvoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet peut accomplir, le verbe devrait être à l’infinitif.

    >pouvoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|puis|pouvoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tag_before(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet peut accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  pouvoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|savoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet sait accomplir, le verbe devrait être à l’infinitif.

    >savoir  ?[ne|n’]¿  [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]       ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]           ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [lui|leur|y]                    en                        ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|savoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tag_before(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet sait accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  savoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|vouloirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet veut accomplir, le verbe devrait être à l’infinitif.

    >vouloir  ?[ne|n’]¿  [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]       ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]           ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [lui|leur|y]                    en                        ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|vouloirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tag_before(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet veut accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  vouloir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ai[ts]?)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................


__infi_falloir__
    [faut|fallait|fallut|faudra|faudrait]                   @:V¬:[YMWG]
    il faille                                               @:V¬:[YMWG]
    >avoir    fallu                                         @:V¬:[YMWG]
    [faut-il|fallait-il|fallut-il|faudra-t-il|faudrait-il]  @:V¬:[YMWG]
        <<- /infi/ not (tag_before(\1, "_que_") and morph(\-1, ":3[sp]"))
        --1>> =suggVerbInfi(\-1)                                                                    && Après le verbe “falloir”, le verbe devrait être à l’infinitif.

    [faut|fallait|fallut|faudra|faudrait]                   [le|la|leur|les|l’]  @:V¬:[YMWGN]
    il faille                                               [le|la|leur|les|l’]  @:V¬:[YMWGN]
    >avoir    fallu                                         [le|la|leur|les|l’]  @:V¬:[YMWGN]
    [faut-il|fallait-il|fallut-il|faudra-t-il|faudrait-il]  [le|la|leur|les|l’]  @:V¬:[YMWGN]
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                                         && Après le verbe “falloir”, le verbe devrait être à l’infinitif.
................................................................................
TEST: L’hôtel {{ou}} ils sont allés l’été dernier.
TEST: une chambre {{ou}} nous n’avons rien trouvé


## Accord et incohérences
__ppas_sont_adj__
    sont  *WORD
        <<- /ppas/ morph(\2, ":V[123]", ":(?:N|A|Q|W|G|3p)") and not tag_before(\1, "_ceque_")
        -2>> =suggVerbPpas(\2, ":m:p")                      && Incohérence : “\2” n’est pas un participe passé.

TEST: après avoir mis à jour sont {{profile}}.
TEST: maintenir en confinement certaines personnes sous prétexte qu’elles sont à risques serait une mesure inconstitutionnelle et discriminatoire.



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


__ppas_se_être__
    [me|m’|te|se|s’]  ?[y|en]¿  >être  *WORD
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QAG]") --1>> =suggVerbPpas(\-1)                && Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\-2, ":[123]s") and morph(\-1, ":Q.*:p") and not tag_before(\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]  *WORD
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QAG]") --1>> =suggVerbPpas(\-1)                && Incohérence. Après « s’être », le verbe doit être un participe passé.

TEST: s’être toujours {{donner}} le mot.
TEST: je suis venu et me suis totalement {{donnés}} à cette œuvre
................................................................................


__ppas_être_confusion__
    ne [pas|jamais] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
        <<- /ppas/ --1>> =suggVerbPpas(\-1)                                                         && Après “ne \2 être”, il faut un participe passé.

    avoir [pu|cru|pensé|imaginé] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
        <<- /ppas/ not value(<1, "|l’|") and not tag_before(\1, "_que_") --1>> =suggVerbPpas(\-1)   && Après le verbe “être”, il faut un participe passé.

    >être  ~..er$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and (morph(\2, ":Y", ":[NAQ]") or morph(\2, ">(?:aller|manger)/"))
            and not morph(<1, ":Y|>ce/") and not value(<1, "|c’|") and not value(<2, "|ce|")
            and not tag_before(\1, "_ceque_") and not tag_before(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être à l’infinitif.

    >être  ~..ez$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":2p", ":[NAQ]")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 2ᵉ personne du pluriel.

    >être  ~..es$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":2s", ":[NAQ]")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 2ᵉ personne du singulier.

    >être  ~.it$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":V(?:2.*:Ip.*:3s|3.*:Is.*:3s)", ":[NAQ]")
            and not tag_before(\1, "_ceque_") and not tag_before(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 3ᵉ personne du singulier.

    >être  ~.ut$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":V3.*:Is.*:3s", ":[NAQ]")
            and not tag_before(\1, "_ceque_") and not tag_before(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 3ᵉ personne du singulier.

TEST: Ne pas être {{aller}} là-bas est une grave erreur que nous regretterons longtemps.
TEST: Ne pas être {{arrivez}} à ses fins.
TEST: Ne pas être {{prit}} au sérieux.
TEST: Ne pas être {{voulut}}.
TEST: avoir cru être {{éliminer}} par de tels bouffons…
................................................................................
TEST: Nous l’avons {{mangées}}.
TEST: Ils ne me l’ont pas {{donnés}}
TEST: il faillit agir, mais l’ayant {{remarqués}}, il passa son chemin.


__ppas_m_t_avoir__
    [m’|t’] >avoir @:Q.*:p¬:[GWsi]
        <<- /ppas/ not tag_before(\1, "_que_") or morph(\3, ":V[0-3]..t_")  -3>> =suggSing(\3)
        && Accord avec « \1 ». S’il s’agit d’un COD, 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

TEST: ces livres m’avaient {{ennuyés}} au-delà du dicible.
TEST: Les élèves m’ont {{écoutés}}.
TEST: Les élèves t’ont de temps en temps {{écoutées}}.
TEST: Les élèves ne m’ont pas {{écoutés}}.
TEST: Les élèves ne m’ont pas {{écoutées}}.
................................................................................
TEST: vous examiner a eu des conséquences imprévues.


#### être / avoir
__conf_ait_confiance_été_faim_tort!3__
    [es|est] [confiance|conscience|envie|été|peur|faim|hâte|honte|recours|soif|tort]
    [es|est] peine [à|a]
        <<- /conf/ not tag_before(\1, "_ceque_") and not value(<1, "|tout|d’|l’|")
        -1>> ait|aie                                                && Confusion probable dans l’expression “avoir \2”. Vous utilisez ici le verbe “être”.

TEST: il est posssible qu’il {{est}} confiance en toi
TEST: Je crains qu’il {{est}} peine à trouver le bonheur.
TEST: La révolution est crainte.
TEST: Je n’en ai cure.
TEST: Notre communauté vous est redevable.
................................................................................
TEST: y être sans ma femme ni les enfants fait monter en moi une certaine nervosité.


__conj_le_la_leur_nom__
    [le|la|l’|leur]  *WORD  @:V¬:(?:3s|P|Q|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3)
            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [le|la|l’|leur]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
        -4>> =suggVerb(\4, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: La {{N.S.A.}} {{espionneras}} toujours tout le monde
TEST: La suspicion envers les élus {{accroissaient}}…                                               ->> accroissait
TEST: Le chien n’{{es}} pas mort.
TEST: Le damné {{donnes}}
TEST: La Corée {{peux}} gagner.
................................................................................
TEST: un grand nombre avaient été humiliés par ces pratiques délétères


__conj_det_sing_nom__
    [un|ce|cet|mon|ton|son|notre|votre]  *WORD  @:[123][sp]¬:(?:3s|P|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[me]:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|nombre|")
                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [une|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  @:[123][sp]¬:(?:3s|P|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[fe]:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tag_before(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
        -4>> =suggVerb(\4, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Tu devrais le savoir, ce roman-là de Jean-Paul Sartre {{es}} passionnant.
TEST: Cette confusion qui {{donnent}} le tournis.
TEST: tu sais, une hausse de 2 % {{satisfais}} tout le monde                                        ->> satisfait
TEST: tu sais, une petite {{donnes}} satisfaction
TEST: tu penses mal, cet homme {{mens}}







|



|







 







|







 







|







 







|


|







 







|







 







|
<




|







 







|







 







|







 







|







 







|







 







|







 







|







 







|





|



|



|












|





|



|



|







 







|





|



|



|



|







 







|



|




|







 







|




|







 







|







 







|







 







|







 







|







 







|







 







|







 







|



|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|




|












|




|







 







|







 







|







 







|








|







 







|







|







|







1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
....
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
....
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
....
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
....
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
....
2651
2652
2653
2654
2655
2656
2657
2658

2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
....
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
....
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
....
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
....
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
....
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
....
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
....
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
....
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
....
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
....
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
....
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
....
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
.....
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
.....
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
.....
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
.....
19336
19337
19338
19339
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
.....
19761
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
.....
21480
21481
21482
21483
21484
21485
21486
21487
21488
21489
21490
21491
21492
21493
21494
.....
24945
24946
24947
24948
24949
24950
24951
24952
24953
24954
24955
24956
24957
24958
24959
.....
25319
25320
25321
25322
25323
25324
25325
25326
25327
25328
25329
25330
25331
25332
25333
.....
25353
25354
25355
25356
25357
25358
25359
25360
25361
25362
25363
25364
25365
25366
25367
.....
25390
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
25403
25404
.....
25436
25437
25438
25439
25440
25441
25442
25443
25444
25445
25446
25447
25448
25449
25450
.....
25488
25489
25490
25491
25492
25493
25494
25495
25496
25497
25498
25499
25500
25501
25502
.....
26739
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
.....
26897
26898
26899
26900
26901
26902
26903
26904
26905
26906
26907
26908
26909
26910
26911
.....
28295
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
.....
28646
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
.....
30208
30209
30210
30211
30212
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
.....
30888
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
.....
30937
30938
30939
30940
30941
30942
30943
30944
30945
30946
30947
30948
30949
30950
30951
30952
30953
30954
30955
30956
30957
30958
30959
30960
30961
30962
30963
30964
30965
30966
30967
#TEST: +{{1.5}} dioptrie
#TEST: j’en veux 2.000
#TEST: et moi 3.000.000 de dollars


__virg_après_verbe_COD__
    [le|la|l’|les]  $:Y¬:N  $:M
        <<- /virg/ not value(\2, "|appeler|") and not tagbefore(\1, "_que_") and not tagbefore(\1, "_comme_")
        -2>> \2,                                                && Si “\-1” marque le début d’une proposition, une virgule est probablement souhaitable.

    [le|la|l’|les]  *WORD  ?[cher|chère]¿  @:M[12]  <end>
        <<- /virg/ morph(\2, ":[123][sp]", ">appeler/|:[NA]") and not tagbefore(\1, "_que_") and not tagbefore(\1, "_comme_")
        -2>> \2,                                                && Si “\-2” est une personne apostrophée, alors il faut mettre le nom en incise.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?Th=2&t1=&id=3412

TEST: Tu vas les {{donner}} Rachel.
TEST: Il va la {{tuer}} Paul.
TEST: je le {{sais}} chère Paula
TEST: Ma fille, je vais l’appeler Deirdre.
TEST: Cependant les promesses n’engagent que ceux qui les croient, comme aimait à le dire Jacques Chirac.
................................................................................
    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)
        <<- =>> exclude(\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|")
        =>> exclude(\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") =>> exclude(\2, ":V")

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


__da_groupe_nominal__cas_particuliers__
    [au|aux] alentour
        <<- =>> select(\2, ":N")

    avions
        <<- not tagbefore(\1, "_1p_") and not value(<1, "|n’|") and not value(>1, "|nous|") =>> select(\-1, ":N")

    l’ avions
        <<- morph(<1, ":Y") =>> select(\-1, ":N")

    bac + ~^\d\d?$
        <<- ~>> ␣
        <<- =>> define(\1, ":N:e:i")
................................................................................
__da_couleurs_invariables__
    *WORD [abricot|acajou|amarante|anthracite|aubergine|brique|caca|café|cannelle|caramel|carmin|carotte|cerise|châtaigne|chocolat|citron|corail|crème|fuchsia|groseille|havane|jonquille|marron|mastic|nacarat|ocre|olive|paille|parme|pastel|pervenche|pie|prune|sable|tabac|vermillon]
        <<- morph(\1, ":(?:D.*:p|B)") =>> exclude(\2, ":A:e:i")


__da_noms_propres__
    Concorde
        <<- not morph(<1, ":D.*:f") =>> addmorph(\1, ">Concorde/:MP:m:i")

    Mustang
        <<- not morph(<1, ":D.*:m") =>> addmorph(\1, ">Mustang/:MP:f:i")

TEST: le crash du Concorde
TEST: elle a acheté une Mustang



!!!
................................................................................
    ni
        <<- />> _ni_


__tag_noms__
    ~\w-là$
        <<- />> -là
        <<- =>> =definefrom(\1, 0, -3)

    ## _1M_  : première lettre majuscule
    ## _CAP_ : toutes capitales
    ## _Cap_ : première lettre capitale, les autres minuscules
    ~^[A-ZÀÂÉÈÊÎÏÔ]
        <<- />> _Maj_
        <<- \1.isupper() />> _CAP_
................................................................................
    alors    [que|qu’]
    dès lors [que|qu’]
        <<- ~>> ␣
        <<- =>> define(\1, ":Cs")

    quelqu’ [un|une]
        <<- ~>> ␣
        <<- =>> setmeta(\1, "WORD")


    [  [m|t|s]  ]  [a|on|es]
    [  [n|v]    ]  [otre|ôtre]
        <<- space_after(\1, 0, 0) and space_after(\2, 0, 0) and space_after(\3, 0, 0) ~>> ␣\2\4
        <<- =>> setmeta(\1, "WORD")

TEST: [s]es {{homme}}                                           ->> hommes
TEST: des effets sur [s]es états d’âme, [s]on corps


__fusions_noms_communs__
    au revoir
................................................................................

    notre père
        <<- morph(<1, ":D.*:[mp]") ~>> ␣
        <<- __also__ =>> define(\1, ":N:m:i")

    presqu’ [>ile|>île]
        <<- ~>> ␣
        <<- =>> setmeta(\1, "WORD")

    nec plus ultra
    terra incognita
    statu quo
        <<- ~>> ␣

    *NUM : *NUM
................................................................................


__eleu_n_superflu__
    on n’ [a|avait|eut|aura|aurait|eût] rarement
        <<- /eleu/ -2:3>> \3                                    && Adverbe de négation erroné. Rarement signifie que ça arrive, pas que ça n’arrive pas.

    on n’ [a|avait|eut|aura|aurait|eût] [>besoin|>chaud|>crainte|>faim|>froid|>peur|>soif]
        <<- /eleu/ not tagafter(\-1, "_que_") and not value(<1, "|jamais|guère|")
        -2:3>> \3|n’\3 pas|n’\3 jamais|n’\3 plus|n’\3 guère     && Adverbe de négation superflu ou manquant.

TEST: on {{n’a}} rarement besoin d’avoir accès à plus de 10 logiciels.              ->> a
TEST: on {{n’avait}} faim.                                                          ->> avait|n’avait pas|n’avait jamais|n’avait plus|n’avait guère
TEST: on n’avait peur que lorsque la tempête soufflait
TEST: jamais on n’eut besoin d’une telle chose.

................................................................................


!!!! Dates                                                                                        !!

__fusion_date__
    *NUM  -  ~^\d\d?$  -  ~^\d{2,5}$
        <<- \1.isdigit() ~>> ␣
        <<- =>> setmeta(\1, "DATE")


__date_jour_mois_année__
    31 [avril|juin|septembre|novembre]
        <<- /date/ space_after(\1, 1, 1) ->> 30 \2                                                  && Cette date est invalide. Il n’y a que 30 jours en \2.

    [30|31] février
................................................................................
        <<- ~1>> *

    [une|la|cette|cet|ma|ta|sa]  pseudo  @:N.*:f
        <<- /tu/ -2:3>> pseudo-\3                                                                   && Si vous voulez évoquer le simulacre de “\2”, mettez un trait d’union.
        <<- ~2>> *

    ~^[pP]seudo-\w+
        <<- =>> definefrom(\1, 7)

TEST: il n’avait contracté qu’un {{pseudo mariage}}.
TEST: elle connaissait de {{cet}} pseudo-prêtresse uniquement de nom.
TEST: la {{pseudo taxe}} carbone


__tu_mots_composés_verbe_nom__
................................................................................
!!!! Trait d’union : formes interrogative (nous/vous)                                             !!

__inte_union_nous1!7__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~ons$  nous
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~ons$  nous
    [ne|n’]  [le|la|l’|les]                  [lui|leur|en|y]             ~ons$  nous
    [ne|n’]  [lui|leur|y]                    en                          ~ons$  nous
        <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:1p", ":[GW]") and not tagbefore(\1, "_1p_")
        --2:-1>> \-2-\-1                                                                            && Forme interrogative ? Mettez un trait d’union.

    ,  ~ons$  nous  [<end>|,|)]
    ,  ~ons$  nous  @:¬:(?:1p|Y)
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and not value(\2, "|veuillons|sachons|")
        -2:3>> \2-\3                                                                                && Forme interrogative ? Mettez un trait d’union.

................................................................................


__inte_union_vous1!7__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~ez$  vous
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~ez$  vous
    [ne|n’]  [le|la|l’|les]                  [lui|leur|en|y]             ~ez$  vous
    [ne|n’]  [lui|leur|y]                    en                          ~ez$  vous
        <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:2p", ":[GW]") and not tagbefore(\1, "_2p_")
        --2:-1>> \-2-\-1       && Forme interrogative ? Mettez un trait d’union.

    ,  ~ez$  vous  [<end>|,|)]
    ,  ~ez$  vous  @:¬:(?:2p|Y)
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and not value(\2, "|veuillez|sachez|")
        -2:3>> \2-\3                                                                                && Forme interrogative ? Mettez un trait d’union.

................................................................................
!!
!!

## Incohérences avec formes verbales 1sg et 2sg sans sujet

__conj_1s_sans_sujet_xxxai!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~ai$
        <<- /conj/ not tagbefore(\1, "_1s_") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp])")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~ai$
    [le|la|l’|les]      [lui|leur|en|y]         ~ai$
    [lui|leur]          en                      ~ai$
        <<- /conj/ not tagbefore(\1, "_1s_") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp])")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~ai$
        <<- /conj/ not tagbefore(\-1, "_1s_") and not morph(<1, ":R") and morph(\-1, ":1s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    ~ai$
        <<- /conj/ not tagbefore(\1, "_1s_") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp]|N|A|Q)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

TEST: avançait et s’{{donnai}} en spectacle
TEST: il avancera, ne {{serai}} ce que de quelques pas
TEST: m’{{occupai}} que deux jours, cette ânerie
TEST: Lui, quand il y pensait, en {{arrivai}} à chaque fois à la même conclusion.
TEST: {{dansai}} puis oubliait
TEST: ce qui, dans le meilleur des cas, peut-être, oui, c’est vrai, vous {{donnerai}} l’avantage.


__conj_2s_sans_sujet_xxxas_xxxes!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~[ae]s$
        <<- /conj/ not tagbefore(\1, "_2s_") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~[ae]s$
    [le|la|l’|les]      [lui|leur|en|y]         ~[ae]s$
    [lui|leur]          en                      ~[ae]s$
        <<- /conj/ not tagbefore(\-1, "_2s_") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~[ae]s$
        <<- /conj/ not tagbefore(\-1, "_2s_") and not morph(<1, ":R") and morph(\-1, ":2s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    ~..[ae]s$
        <<- /conj/ not tagbefore(\1, "_2s_") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|N|A|Q|1p)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

TEST: se {{demandes}} comment faire
TEST: oui, il l’ignorait, ne me {{demandes}} comment c’était possible
TEST: c’est ça, me {{demandes}} comment c’est possible
TEST: je me questionne, {{exiges}} des réponses mais n’en obtiens pas…
TEST: Caroline, quand l’heure viendra, {{décideras}} de la conduite à tenir.
................................................................................
TEST: {{arrimeras}} le voilier
TEST: n’est-ce pas, indubitablement, nous la {{contestes}}
TEST: nous laisserons derrière nous les empires de la Terre.


__conj_1s_2s_sans_sujet_xxxs!3__
    [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~[iudnrtpcï]s$
        <<- /conj/ not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    [me|m’|te|t’]       ?[le|la|l’|les|en|y]¿   ~[iudnrtpcï]s$
    [le|la|l’|les]      [lui|leur|en|y]         ~[iudnrtpcï]s$
    [lui|leur]          en                      ~[iudnrtpcï]s$
        <<- /conj/ not tagbefore(\-1, "_1s_") and not tagbefore(\-1, "_2s_") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    [nous|vous]         ?[le|la|l’|les|en|y]¿   ~[iudnrtpcï]s$
        <<- /conj/ not tagbefore(\-1, "_1s_") and not tagbefore(\1, "_2s_") and not morph(<1, ":R") and morph(\-1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    étais
        <<- /conj/ not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_") and not (\1.istitle() and before0("\\w")) and not morph(<1, ":[DA].*:p")
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

    ~[iudnrtpcï]s$
        <<- /conj/ not tag(\1, "eg1mot") and not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_")
            and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p|V0e|N|A|Q)") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

TEST: s’{{précipitais}} dans la gueule du loup
TEST: ne leur {{donnais}} aucune raison de se faire aimer
TEST: leur en {{faisais}} baver
TEST: vous en {{donnais}} pour votre argent, ce type.
................................................................................


__conj_peux_veux_vaux_équivaux_prévaux_sans_sujet!3__
    [ne|n’]                  ?[le|la|l’|les|en|vous|lui|leur|y]¿  [peux|veux|vaux|équivaux|prévaux]
    [me|m’|te|t’|nous|vous]  ?[le|la|l’|les|en|y]¿                [peux|veux|vaux|équivaux|prévaux]
    [le|la|l’|les]           [lui|leur|en|y]                      [peux|veux|vaux|équivaux|prévaux]
    [lui|leur]               en                                   [peux|veux|vaux|équivaux|prévaux]
        <<- /conj/ not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_")
        --1>> =suggVerb(\-1, ":3s")                                                                 && Incohérence. Le sujet de cette forme verbale est introuvable.

    vaux
        <<- /conj/ not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_") and not (\1.istitle() and before0("\\w"))
            and not morph(<1, ":(?:R|D.*:p)")
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

    [peux|veux|équivaux|prévaux]
        <<- /conj/ not tagbefore(\1, "_1s_") and not tagbefore(\1, "_2s_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3s")                                                                   && Incohérence. Le sujet de cette forme verbale est introuvable.

TEST: tu sais, s’{{équivaux}}, voilà.
TEST: tu sais, s’en {{veux}} d’avoir raté ça.
TEST: s’{{peux}} qu’il avait faim, va savoir
TEST: n’{{équivaux}} pas à ma BMW, cette tire.
TEST: faut voir, ces hommes, lui, tu sais, l’en peux
................................................................................
TEST: Elle, ici et dans tous les cas de figure, {{veux}} toujours en faire plus.
TEST: Le total de cette opération, contrairement à ce qu’on pense, {{équivaux}} à au moins trois d’entre eux.


## Incohérences avec formes verbales 1pl et 2pl sans sujet
__conj_1p_sans_sujet!3__
    ~ons$
        <<- /conj/ morph(\1, ":1p", ":[EGMNAJ]") and not tagbefore(\1, "_1p_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3p")     && Ceci est un verbe à la 1ʳᵉ personne du pluriel. Sujet (“nous” ou équivalent) introuvable.

__conj_2p_sans_sujet!3__
    ~ez$
        <<- /conj/ morph(\1, ":2p", ":[EGMNAJ]") and not tagbefore(\2, "_2p_") and not (\1.istitle() and before0("\\w"))
        -1>> =suggVerb(\1, ":3p")     && Ceci est un verbe à la 2ᵉ personne du pluriel. Sujet (“vous” ou équivalent) introuvable.

TEST: les hommes et les femmes, qui sans un bruit, sans une parole amère, {{continuerons}} leur tâche n’en seront pas plus récompensés.
TEST: il était dit que cette femme et son frère {{promènerez}} leur chien à cette heure de la journée.
TEST: cet homme et cette femme {{pouvez}} y parvenir avec de la persévérance
TEST: Comme on lui disait que vous-même aviez déjà consulté le notaire
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
................................................................................

TEST: en tant qu’{{abaisse}}
TEST: en tant que tel


__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tagbefore(\1, "_ceque_") and not value(<1, "|ou|") -2>> _                    && Incohérence probable avec “presque” : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: presque {{délaissait}} par tout le monde.
TEST: Tout le monde ou presque déteste ces gens-là.


__conf_sur_vconj__
    sur  @:(?:[123][sp]|P)¬:[GNAQM]
................................................................................

# pour justifiée qu’elle fût
# [aussi|si] habile qu’il soit


__conf_trop_vconj__
    trop  @:[123][sp]¬:(?:[GNAQWM]|3p)
        <<- /conf/ not tagbefore(\1, "_ceque_") -2>> _                                              && Incohérence probable avec “trop” : “\2” n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: J’ai trop {{mangeais}}.
TEST: Ce que nous réussissons presque sera considéré comme un échec.


__conf_très_verbe__
    très  @:(?:Y|[123][sp])¬:[AQW]
................................................................................
TEST: Un homme pas {{évidement}} intelligible.
TEST: L’{{évidemment}} du sanglier ne sera pas si facile.


# en fait
__conf_en_fait__
    en [faite|>faîte]
        <<- /conf/ not value(<1, "|n’|") and not tagbefore(\1, "_2p_")
        ->> en fait                                         && Confusion probable : « en fait » qui signifie « en réalité ». Le faîte est la partie la plus élevée d’un bâtiment.

TEST: {{en faite}}, on en voit partout, ça grouille.
TEST: ils sont {{en faîtes}} partis à la montagne.
TEST: Aujourd’hui, n’en faites pas trop.


................................................................................
    [qui|que|comment|pourquoi|lorsque|quand] son [,|@:[DR]]
        <<- /conf/ -2>> sont                                    && Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

    [<start>|,|(] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son                                     && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ morph(<1, ":(?:V|Cs|R)", ":(?:[NA].*:[pi]|Ov)") and not tagbefore(\1, "_ceque_")
        -1>> son                                                && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    [à|chez|dès|par] sont
    [avec|contre|devant|derrière|pour|sans|sur] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son                                     && Confusion probable : “sont” est la forme verbale de “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    en sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
................................................................................
    haut [placé+ses]
        <<- not value(<1, "|en|de|d’|") ~1>> *

    haut et fort
        <<- not morph(<1, ":D") ~>> *

    hélas
        <<- not morph(<1, ":(?:X|Ov)") and not tagbefore(\1, "_2s_") ~>> *

    [hein|hop]
        <<- not morph(<1, ":D") ~>> *

    la lettre [a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]  @:(?:3s|Ov)
        <<- ~3>> *

................................................................................
    >prêter attention a
    enclin a
    en être [réduit+ses] a
    en [hommage|proie] a
    [m’|t’|s’] en >remettre a
    nous nous en >remettre a
    vous vous en >remettre a
        <<- /conf/ \-1 != "A" and not tagbefore(\1, "_àCOI_") and not value(>1, "|été|")
        --1>> à                                                             && Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    [>abandonner|>accorder|>adapter|>adjoindre|>adresser|>affirmer|>agréer|>aider|>ajouter|>amener|>annoncer|>appeler|>applaudir|>appliquer|>apporter|>apprendre|>arguer|>argüer|>aspirer|>assujettir|>attacher|>atteindre|>attoucher|>attribuer|>autoriser|>avancer|>céder|>changer|>chicaner|>coller|>commander|>commencer|>conclure|>conférer|>confier|>confirmer|>conseiller|>consentir|>conspirer|>continuer|>convertir|>couper|>couter|>coûter|>croire|>décider|>déclarer|>décrire|>défendre|>déférer|>demander|>destiner|>devoir|>dire|>disposer|>disputer|>donner|>échapper|>écrire|>élever|>employer|>engager|>enjoindre|>entendre|>envoyer|>exercer|>expliquer|>exposer|>falloir|>fermer|>filer|>forfaire|>former|>fournir|>gouter|>goûter|>impartir|>imputer|>infliger|>insulter|>intégrer|>intéresser|>jeter|>justifier|>lier|>lire|>livrer|>manquer|>mesurer|>mettre|>montrer|>obliger|>obtenir|>offrir|>ouvrir|>parer|>parler|>passer|>payer|>penser|>permettre|>porter|>pourvoir|>prendre|>préparer|>prescrire|>présenter|>présider|>prétendre|>promettre|>protester|>quémander|>rappeler|>rapprendre|>ravir|>réapprendre|>recoller|>recourir|>redéclarer|>redire|>référer|>réfléchir|>refuser|>regarder|>réimputer|>remesurer|>remettre|>remontrer|>rendre|>renoncer|>reparler|>répondre|>reprendre|>répugner|>retoucher|>retravailler|>retweeter|>réussir|>révéler|>rêver|>satisfaire|>schtroumpfer|>servir|>signaler|>sonner|>soumettre|>souscrire|>soutenir|>statuer|>suppléer|>surseoir|>sursoir|>survendre|>téléphoner|>témoigner|>tendre|>tenir|>tirer|>toucher|>traduire|>travailler|>tweeter|>unir|>veiller|>vendre|>virer|>viser|>vouloir|>aboutir|>acquiescer|>adhérer|>apparaitre|>apparaître|>compatir|>complaire|>concourir|>confiner|>contribuer|>convenir|>coopérer|>correspondre|>déplaire|>désobéir|>disparaitre|>équivaloir|>mentir|>naitre|>naître|>nuire|>obéir|>obtempérer|>participer|>plaire|>profiter|>réagir|>rechigner|>renaitre|>renaître|>résister|>ressembler|>retéléphoner|>seoir|>songer|>sourire|>succéder|>succomber|>suffire|>surréagir|>survivre|>tarder|>vaquer] a
    >arriver a
    >condamner a
    ## locutions
    >avoir du mal a
................................................................................
    >dire [adieu|merde] a
    >donner du grain à moudre a
    >faire [barrage|barrière|confiance|écho] a
    >faire faux bond a
    >prêter serment a
    >rendre hommage a
    >rendre service a
        <<- /conf/ not tagbefore(\1, "_propsub_") and not morph(\1, ":[YNA]") and not value(>1, "|été|")
        --1>> à                                                             && Confusion probable : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    @:V¬:[YGNAWM]  a
        <<- /conf/ \-1 != "A" and not tag(\-1, "eg1mot") and not tagbefore(\1, "_propsub_") and not morph(>1, ":Q")
        --1>> à                                                             && Confusion probable : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    [/_VCint_|/_VCimp_]  a
        <<- /conf/ not value(\1, "|rendez-vous|") --1>> à                   && Confusion : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0

    >passer du coq a l’ âne
        <<- /conf/ -4>> à                                                   && Confusion : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0
................................................................................

TEST: Ils l’ont échappé {{bel}}


# bien / bine
__conf_bien_bine__
    bine
        <<- /conf/ not tagbefore(\1, "_propsub_") and morph(<1, ":V")
        ->> bien                                                        && Confusion probable. Erreur de frappe ?

    [<start>|,|(] bine [que|qu’|entendu|sûr]
        <<- /conf/ -2>> bien                                            && Confusion probable. Erreur de frappe ?

TEST: il me semblait {{bine}} que j’avais raison                        ->> bien
TEST: il avance {{bine}}                                                ->> bien
................................................................................
__conf_prie_prit__
    [me|te|le|la|nous|vous|les] prit [de|d’] [ne|n’|me|m’|te|t’|se|s’]
    [me|te|le|la|nous|vous|les] prit [de|d’] [le|la|l’|les|en|nous|vous|lui|leur|y]  $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [nous|vous]     [le|la|l’|les|en|y]     $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [le|la|l’|les]  [lui|leur|en|y]         $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] [lui|leur|y]    en                      $:Y
    [me|te|le|la|nous|vous|les] prit [de|d’] $:Y
        <<- /conf/ not tagbefore(\1, "_cequi_") -2>> prie               && Confusion probable. Si vous voulez dire “prier de faire quelque chose”, écrivez “prie”.|https://fr.wiktionary.org/wiki/prier

TEST: elle me {{prit}} d’obéir
TEST: je ne sais pas ce qui me prit de lui écrire


# prêt / près / pré
__conf_suivre_de_près__
................................................................................
    [de|d’] leur                 en                                              @:V¬:Y
    [de|d’] lui                  en                                              @:V¬:[YP]
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             && Après “de”, le verbe devrait être à l’infinitif.

    [de|d’]  @:V1.*:Q¬:N
        <<- /infi/ not \2[0:1].isupper() and not morph(<1, ">(?:en|passer|qualifier)/") and not morph(\2, ">(?:fieffer|sacrer)/")
            and not before("(?i)(?:quelqu(?:e chose|’une?)|qu’y a-t-il |\\b(?:l(?:es?|a)|nous|vous|me|te|se) trait|personne|points? +$|autant +$|ça +|rien d(?:e |’)|rien(?: +[a-zéèêâîûù]+|) +$)")
            and not tagbefore(\1, "_ceque_")
        -2>> =suggVerbInfi(\2)                                                          && Le verbe devrait être à l’infinitif.

TEST: d’en {{parlé}} sans cesse
TEST: cela suffit de les {{aimait}}
TEST: de ne leur en {{avancé}} que le nécessaire.
TEST: de l’y {{poussé}}
TEST: je suis certain d’en {{choque}} plusieurs.
................................................................................
        <<- /infi/ not value(\1, "|devoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not (value(\1, "|devant|") and morph(\-1, ":N"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet doit accomplir, le verbe devrait être à l’infinitif.

    >devoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~..(?:ai(?:s|t|ent))$
    >devoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|devoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not (value(\1, "|devant|") and morph(\-1, ":N")) and not tagbefore(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet doit accomplir, le verbe devrait être à l’infinitif.

    de  devoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    de  devoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|puis|pouvoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet peut accomplir, le verbe devrait être à l’infinitif.

    >pouvoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~..(?:ai(?:s|t|ent))$
    >pouvoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|puis|pouvoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tagbefore(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet peut accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  pouvoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    [de|d’]  pouvoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|savoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet sait accomplir, le verbe devrait être à l’infinitif.

    >savoir  ?[ne|n’]¿  [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]       ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]           ~..(?:ai(?:s|t|ent))$
    >savoir  ?[ne|n’]¿  [lui|leur|y]                    en                        ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|savoirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tagbefore(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet sait accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  savoir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ais)$
    [de|d’]  savoir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ais)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................
        <<- /infi/ not value(\1, "|vouloirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D"))
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet veut accomplir, le verbe devrait être à l’infinitif.

    >vouloir  ?[ne|n’]¿  [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]       ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]           ~..(?:ai(?:s|t|ent))$
    >vouloir  ?[ne|n’]¿  [lui|leur|y]                    en                        ~..(?:ai(?:s|t|ent))$
        <<- /infi/ not value(\1, "|vouloirs|") and morph(\-1, ":V", ":M") and not (morph(\1, ":N") and morph(<1, ":D")) and not tagbefore(\1, "_ceque_")
        --1>> =suggVerbInfi(\-1)                                                                    && S’il s’agit d’une action que le sujet veut accomplir, le verbe devrait être à l’infinitif.

    [de|d’]  vouloir  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             ~(?:ée?s?|ez|ai[ts]?)$
    [de|d’]  vouloir  ?[ne|n’]¿  [lui|leur|y]                    en                          ~(?:ée?s?|ez|ai[ts]?)$
        <<- /infi/ morph(\-1, ":V", ":M")
................................................................................


__infi_falloir__
    [faut|fallait|fallut|faudra|faudrait]                   @:V¬:[YMWG]
    il faille                                               @:V¬:[YMWG]
    >avoir    fallu                                         @:V¬:[YMWG]
    [faut-il|fallait-il|fallut-il|faudra-t-il|faudrait-il]  @:V¬:[YMWG]
        <<- /infi/ not (tagbefore(\1, "_que_") and morph(\-1, ":3[sp]"))
        --1>> =suggVerbInfi(\-1)                                                                    && Après le verbe “falloir”, le verbe devrait être à l’infinitif.

    [faut|fallait|fallut|faudra|faudrait]                   [le|la|leur|les|l’]  @:V¬:[YMWGN]
    il faille                                               [le|la|leur|les|l’]  @:V¬:[YMWGN]
    >avoir    fallu                                         [le|la|leur|les|l’]  @:V¬:[YMWGN]
    [faut-il|fallait-il|fallut-il|faudra-t-il|faudrait-il]  [le|la|leur|les|l’]  @:V¬:[YMWGN]
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                                         && Après le verbe “falloir”, le verbe devrait être à l’infinitif.
................................................................................
TEST: L’hôtel {{ou}} ils sont allés l’été dernier.
TEST: une chambre {{ou}} nous n’avons rien trouvé


## Accord et incohérences
__ppas_sont_adj__
    sont  *WORD
        <<- /ppas/ morph(\2, ":V[123]", ":(?:N|A|Q|W|G|3p)") and not tagbefore(\1, "_ceque_")
        -2>> =suggVerbPpas(\2, ":m:p")                      && Incohérence : “\2” n’est pas un participe passé.

TEST: après avoir mis à jour sont {{profile}}.
TEST: maintenir en confinement certaines personnes sous prétexte qu’elles sont à risques serait une mesure inconstitutionnelle et discriminatoire.



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


__ppas_se_être__
    [me|m’|te|se|s’]  ?[y|en]¿  >être  *WORD
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QAG]") --1>> =suggVerbPpas(\-1)                && Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\-2, ":[123]s") and morph(\-1, ":Q.*:p") 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]  *WORD
        <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QAG]") --1>> =suggVerbPpas(\-1)                && Incohérence. Après « s’être », le verbe doit être un participe passé.

TEST: s’être toujours {{donner}} le mot.
TEST: je suis venu et me suis totalement {{donnés}} à cette œuvre
................................................................................


__ppas_être_confusion__
    ne [pas|jamais] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
        <<- /ppas/ --1>> =suggVerbPpas(\-1)                                                         && Après “ne \2 être”, il faut un participe passé.

    avoir [pu|cru|pensé|imaginé] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p)
        <<- /ppas/ not value(<1, "|l’|") and not tagbefore(\1, "_que_") --1>> =suggVerbPpas(\-1)    && Après le verbe “être”, il faut un participe passé.

    >être  ~..er$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and (morph(\2, ":Y", ":[NAQ]") or morph(\2, ">(?:aller|manger)/"))
            and not morph(<1, ":Y|>ce/") and not value(<1, "|c’|") and not value(<2, "|ce|")
            and not tagbefore(\1, "_ceque_") and not tagbefore(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être à l’infinitif.

    >être  ~..ez$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":2p", ":[NAQ]")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 2ᵉ personne du pluriel.

    >être  ~..es$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":2s", ":[NAQ]")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 2ᵉ personne du singulier.

    >être  ~.it$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":V(?:2.*:Ip.*:3s|3.*:Is.*:3s)", ":[NAQ]")
            and not tagbefore(\1, "_ceque_") and not tagbefore(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 3ᵉ personne du singulier.

    >être  ~.ut$
        <<- /ppas/ morph(\1, ":V", ":Q|>soit/") and morph(\2, ":V3.*:Is.*:3s", ":[NAQ]")
            and not tagbefore(\1, "_ceque_") and not tagbefore(\1, "_sujinfi_")
        -2>> =suggVerbPpas(\2)                                                                      && Après “être”, le verbe ne devrait pas être conjugué à la 3ᵉ personne du singulier.

TEST: Ne pas être {{aller}} là-bas est une grave erreur que nous regretterons longtemps.
TEST: Ne pas être {{arrivez}} à ses fins.
TEST: Ne pas être {{prit}} au sérieux.
TEST: Ne pas être {{voulut}}.
TEST: avoir cru être {{éliminer}} par de tels bouffons…
................................................................................
TEST: Nous l’avons {{mangées}}.
TEST: Ils ne me l’ont pas {{donnés}}
TEST: il faillit agir, mais l’ayant {{remarqués}}, il passa son chemin.


__ppas_m_t_avoir__
    [m’|t’] >avoir @:Q.*:p¬:[GWsi]
        <<- /ppas/ not tagbefore(\1, "_que_") or morph(\3, ":V[0-3]..t_")  -3>> =suggSing(\3)
        && Accord avec « \1 ». S’il s’agit d’un COD, 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

TEST: ces livres m’avaient {{ennuyés}} au-delà du dicible.
TEST: Les élèves m’ont {{écoutés}}.
TEST: Les élèves t’ont de temps en temps {{écoutées}}.
TEST: Les élèves ne m’ont pas {{écoutés}}.
TEST: Les élèves ne m’ont pas {{écoutées}}.
................................................................................
TEST: vous examiner a eu des conséquences imprévues.


#### être / avoir
__conf_ait_confiance_été_faim_tort!3__
    [es|est] [confiance|conscience|envie|été|peur|faim|hâte|honte|recours|soif|tort]
    [es|est] peine [à|a]
        <<- /conf/ not tagbefore(\1, "_ceque_") and not value(<1, "|tout|d’|l’|")
        -1>> ait|aie                                                && Confusion probable dans l’expression “avoir \2”. Vous utilisez ici le verbe “être”.

TEST: il est posssible qu’il {{est}} confiance en toi
TEST: Je crains qu’il {{est}} peine à trouver le bonheur.
TEST: La révolution est crainte.
TEST: Je n’en ai cure.
TEST: Notre communauté vous est redevable.
................................................................................
TEST: y être sans ma femme ni les enfants fait monter en moi une certaine nervosité.


__conj_le_la_leur_nom__
    [le|la|l’|leur]  *WORD  @:V¬:(?:3s|P|Q|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tagbefore(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3)
            and not ( morph(\2, "(?:[123][sp]|P)") and not value(<1, "|<start>|,|") ) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [le|la|l’|leur]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tagbefore(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
        -4>> =suggVerb(\4, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: La {{N.S.A.}} {{espionneras}} toujours tout le monde
TEST: La suspicion envers les élus {{accroissaient}}…                                               ->> accroissait
TEST: Le chien n’{{es}} pas mort.
TEST: Le damné {{donnes}}
TEST: La Corée {{peux}} gagner.
................................................................................
TEST: un grand nombre avaient été humiliés par ces pratiques délétères


__conj_det_sing_nom__
    [un|ce|cet|mon|ton|son|notre|votre]  *WORD  @:[123][sp]¬:(?:3s|P|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[me]:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|nombre|")
                        or tagbefore(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [une|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  @:[123][sp]¬:(?:3s|P|Y|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[fe]:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tagbefore(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\3, ":3?p") ) and not agreement(\2, \3) >>>
        <<- /conj/ not tag(\-1, "_ngn_") and morph(\3, ":A.*:p") or (morph(\3, ":N.*:p") and morph(\2, ":A"))
        -3>> =suggVerb(\3, ":3s", suggSing)                                                         && Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ -3>> =suggVerb(\3, ":3s")                                               && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD  qui  @:V¬:(?:3s|P|3p!|G|M)
        <<- /conj/ not tag(\2, "_enum_") and morph(<1, ":C|<start>|>,", ":[YP]") and morph(\2, ":[NA].*:[si]", ":G")
            and not ( (value(\2, "|dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet|moitié|")
                        or tagbefore(\1, "_ni_") or value(<1, "|et|ou|")) and morph(\4, ":3p") )
        -4>> =suggVerb(\4, ":3s")                                                                   && Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Tu devrais le savoir, ce roman-là de Jean-Paul Sartre {{es}} passionnant.
TEST: Cette confusion qui {{donnent}} le tournis.
TEST: tu sais, une hausse de 2 % {{satisfais}} tout le monde                                        ->> satisfait
TEST: tu sais, une petite {{donnes}} satisfaction
TEST: tu penses mal, cet homme {{mens}}

Modified misc/grammalecte.sublime-syntax from [3aba4c4214] to [08a130127a].

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    # other.
    - match: '\b(?:if|else|and|or|not|in)\b'
      scope: keyword.python

    - match: '\b(?:True|False|None)\b'
      scope: constant.language

    - match: '\b(?:spell|morph|morphVC|stem|tag|value|space_after|textarea0?\w*|before0?\w*|after0?\w*|word|option|define|define_from|select|exclude|analyse\w*|tag_\w+|apposition|is[A-Z]\w+|agreement|rewrite|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b'
      scope: entity.name.function

    - match: '\b(?:replace|endswith|startswith|search|upper|lower|capitalize|strip|rstrip|is(?:alpha|upper|lower|digit|title))\b'
      scope: support.function

    - match: '\becho\b'
      scope: support.function.debug







|







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    # other.
    - match: '\b(?:if|else|and|or|not|in)\b'
      scope: keyword.python

    - match: '\b(?:True|False|None)\b'
      scope: constant.language

    - match: '\b(?:spell|morph(?:VC|)|stem|tag|value|space_after|textarea0?\w*|before0?\w*|after0?\w*|word|option|define(?:from|)|select|exclude|setmeta|analyse\w*|tag(?:after|before)|apposition|is[A-Z]\w+|agreement|rewrite|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b'
      scope: entity.name.function

    - match: '\b(?:replace|endswith|startswith|search|upper|lower|capitalize|strip|rstrip|is(?:alpha|upper|lower|digit|title))\b'
      scope: support.function

    - match: '\becho\b'
      scope: support.function.debug