Grammalecte  Check-in [8ca82c9a7e]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | comdic
Files: files | file ages | folders
SHA3-256:8ca82c9a7e77f0e76e1663de06364a73349c0fb22ecfb59a12686b61e2d1d64b
User & Date: olr 2019-03-15 14:00:47
Context
2019-03-15
14:08
[fx] fix merge Leaf check-in: e8375db0be user: olr tags: comdic, fx
14:00
merge trunk check-in: 8ca82c9a7e user: olr tags: comdic
12:54
[fr] faux positif check-in: 220c5d2bfc user: olr tags: fr, trunk
2019-02-25
12:11
[fx] init: observePage, set this check-in: a7c123cfd6 user: olr tags: comdic, fx
Changes

Changes to doc/build.md.

1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
..
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

# How to build Grammalecte

## Required ##

* Python 3.6

* Firefox Nightly
* NodeJS
  * npm
  * jpm : https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm
  * web-ext : https://developer.mozilla.org/fr/Add-ons/WebExtensions/Getting_started_with_web-ext
* Thunderbird


## Commands ##

**Build a language**

`make.py LANG`

> Generate the LibreOffice extension and the package folder.
> LANG is the lang code (ISO 639).

> This script uses the file `config.ini` in the folder `gc_lang/LANG`.

**First build**

`make.py LANG -js`

> This command is required to generate all necessary files.
................................................................................

`-i --install`

> Install the LibreOffice extension.

`-fx --firefox`

> Launch Firefox Developper (before Firefox 57).
> Unit tests can be lanched from Firefox, with CTRL+SHIFT+F12.

`-we --webext`

> Launch Firefox Nightly (Firefox 57+).
> Unit tests can be lanched from the menu.

`-tb --thunderbird`

> Launch Thunderbird.


## Examples ##






>



<
|











<







 







|
|



|
|







1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18
19
20
21
22

23
24
25
26
27
28
29
..
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

# How to build Grammalecte

## Required ##

* Python 3.6
* Firefox Developper
* Firefox Nightly
* NodeJS
  * npm

  * web-ext : `https://developer.mozilla.org/fr/Add-ons/WebExtensions/Getting_started_with_web-ext`
* Thunderbird


## Commands ##

**Build a language**

`make.py LANG`

> Generate the LibreOffice extension and the package folder.
> LANG is the lang code (ISO 639).

> This script uses the file `config.ini` in the folder `gc_lang/LANG`.

**First build**

`make.py LANG -js`

> This command is required to generate all necessary files.
................................................................................

`-i --install`

> Install the LibreOffice extension.

`-fx --firefox`

> Launch Firefox Developper.
> Unit tests can be launched from the menu (Tests section).

`-we --webext`

> Launch Firefox Nightly.
> Unit tests can be launched from the menu (Tests section).

`-tb --thunderbird`

> Launch Thunderbird.


## Examples ##

Changes to doc/syntax.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14





15
16
17
18
19
20





21












22
23
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39

40













41
42
43

44
45
46
47
48
49
50
...
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
...
185
186
187
188
189
190
191












192
193
194
195
196
197
198
...
298
299
300
301
302
303
304

305



























































306
307
308
309
310
311
312
313
314
315
...
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
...
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404

405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448

449
450
451
452
453
454

455
456
457

458
459






460
461

462
463

464
465

466
467

468
469



470
471
472


473
474

475
476
477
478
479
480



481
482



483
484
485
486



487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
WRITING RULES FOR GRAMMALECTE

Note: This documentation is obsolete right now.

# Principles #

Grammalecte is a bi-passes grammar checker engine. On the first pass, the
engine checks the text paragraph by paragraph. On the second passe, the engine
check the text sentence by sentence.

The command to switch to the second pass is `[++]`.

In each pass, you can write as many rules as you need.






A rule is defined by:

* [optional] flags “LCR” for the regex word boundaries and case sensitiveness
* a regex pattern trigger
* a list of actions (can’t be empty)
* [optional] user option name for activating/disactivating the rule





* [optional] rule name













There is no limit to the number of actions and the type of actions a rule can
launch. Each action has its own condition to be triggered.

There are three kind of actions:

* Error warning, with a message, and optionally suggestions, and optionally an URL
* Text transformation, modifying internally the checked text
* Disambiguation action, setting tags on a position



The rules file for your language must be named rules.grx.
The settings file must be named config.ini.

All these files are simple utf-8 text file.
UTF-8 is mandatory.

















# Rule syntax #

        __LCR/option(rulename)__  pattern

            <<- condition ->> error_suggestions  # message_error|http://awebsite.net...
            <<- condition ~>> text_rewriting
            <<- condition =>> commands_for_disambiguation
            ...

Patterns are written with the Python syntax for regular expressions:
http://docs.python.org/library/re.html
................................................................................

Examples:

        __<s>__ pattern
            <<- condition ->> replacement
            # message
            <<- condition ->> suggestion # message
            <<- condition
            ~>> text_rewriting
            <<- =>> disambiguation

        __<s>__ pattern <<- condition ->> replacement # message


## Comments ##

Lines beginning with # are comments.


## End of file ##

With the command:

        #END

at the beginning of a line, the compiler won’t go further.
Whatever is written after will be considered as comments.


## Whitespaces at the border of patterns or suggestions ##

Example: Recognize double or more spaces and suggests a single space:

        __<s>__  "  +" <<- ->> " "      # Extra space(s).

ASCII " characters protect spaces in the pattern and in the replacement text.


## Pattern groups and back references ##

It is usually useful to retrieve parts of the matched pattern. We simply use
parenthesis in pattern to get groups with back references.

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

        __<i]__ \b([?!.])([A-Z]+) <<- ->> \1 \2     # Missing space?

Example. Back reference in messages.

        (fooo) bar <<- ->> foo      # “\1” should be:














## Name definitions ##

Grammalecte supports name definitions to simplify the description of the
complex rules.

Example:
................................................................................
        Mr(. [A-Z]\w+) <<- ~1>> *

You can also call Python expressions.

        __[s]__ Mr. ([a-z]\w+) <<- ~1>> =\1.upper()































































# Disambiguation #

When Grammalecte analyses a word with morph or morphex, before requesting the
POS tags to the dictionary, it checks if there is a stored marker for the
position where the word is. If there is a marker, Grammalecte uses the stored
data and don’t make request to the dictionary.

The disambiguation commands store POS tags at the position of a word.

There is 3 commands for disambiguation.
................................................................................
>   stores at position n only the POS tags of the word matching the pattern.

`exclude(n, pattern)`

>   stores at position n the POS tags of the word, except those matching the
    pattern.

`define(n, definition)`

>   stores at position n the POS tags in definition.

Examples:

        =>> select(\1, "po:noun is:pl")
        =>> exclude(\1, "po:verb")
        =>> define(\1, "po:adv")
        =>> exclude(\1, "po:verb") and define(\2, "po:adv") and select(\3, "po:adv")

Note: select, exclude and define ALWAYS return True.

If select and exclude generate an empty list, no marker is set.

With define, you can set a list of POS tags. Example:

        define(\1, "po:nom is:plur|po:adj is:sing|po:adv")

This will store a list of tags at the position of the first group:

        ["po:nom is:plur", "po:adj is:sing", "po:adv"]



# Conditions #

Conditions are Python expressions, they must return a value, which will be
evaluated as boolean. You can use the usual Python syntax and libraries.

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

>   checks if the text before the pattern matches the regex.

`textarea(regex[, neg_regex])`

>    checks if the full text of the checked area (paragraph or sentence) matches the regex.

`morph(n, regex[, strict=True][, noword=False])`

>   checks if all tags of the word in group n match the regex.
>   if strict = False, returns True only if one of tags matches the regex.
>   if there is no word at position n, returns the value of noword.

`morphex(n, regex, neg_regex[, noword=False])`

>   checks if one of the tags of the word in group n match the regex and
>          if no tags matches the neg_regex.
>   if there is no word at position n, returns the value of noword.


`option(option_name)`

>   returns True if option_name is activated else False

Note: the analysis is done on the preprocessed text.


## Default variables ##

`sCountry`

>   It contains the current country locale of the checked paragraph.

        colour <<- sCountry == "US" ->> color       # Use American English spelling.



# Expressions in the suggestions #

Suggestions (and warning messages) started by an equal sign are Python string expressions
extended with possible back references and named definitions:

Example:

        foo\w+ ->> = '"' + \0.upper() + '"'     # With uppercase letters and quoation marks

All words beginning with "foo" will be recognized, and the suggestion is
the uppercase form of the string with ASCII quoation marks: eg. foom ->> "FOOM".




//////////////////////////////// OLD ///////////////////////////////////////

= Text preprocessing and multi-passes checking =

On each pass, Lightproof uses rules written in the text preprocessor to modify
internally the text before checking the text.

The text preprocessor is useful to simplify texts and write simplier checking
rules.

For example, sentences with the same grammar mistake:


        These “cats” are blacks.
        These cats are “blacks”.
        These cats are absolutely blacks.
        These stupid “cats” are all blacks.
        These unknown cats are as per usual blacks.


Instead of writting complex rules or several rules to find mistakes for all possible
cases, you can use the text preprocessor to simplify the text.


To remove the chars “”, write:







        [“”] ->> *


The * means: replace text by whitespaces.


Similarly to grammar rules, you can add conditions:


        \w+ly <<- morph(\0, "adverb") ->> *


You can also remove a group reference:




        these (\w+) (\w+) <<- morph(\1, "adjective") and morph(\2, "noun") -1>> *
        (am|are|is|were|was) (all) <<- -2>> *



With these rules, you get the following sentences:


        These  cats  are blacks.
        These cats are  blacks .
        These cats are            blacks.
        These         cats  are     blacks.
        These         cats are              blacks.




These grammar mistakes can be detected with one simple rule:




        these +(\w+) +are +(\w+s)
            <<- morph(\1, "noun") and morph(\2, "plural")
            -2>> _              # Adjectives are invariable.




Instead of replacing text with whitespaces, you can replace text with @.

        https?://\S+ ->> @

This is useful if at first pass you write rules to check successive whitespaces.
@ are automatically removed at the second pass.

You can also replace any text as you wish.

        Mister <<- ->> Mr
        (Mrs?)[.] <<- ->> \1



With the multi-passes checking and the text preprocessor, it is advised to
remove or simplify the text which has been checked on the previous pass.



== Pattern matching ==

Repeating pattern matching of a single rule continues after the previous matching, so
instead of general multiword patterns, like

(\w+) (\w+) <<- some_check(\1, \2) ->> \1, \2 # foo

use

(\w+) <<- some_check(\1, word(1)) ->> \1, # foo



|




|






>
>
>
>
>
|



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




|




>


|
|





>

>
>
>
>
>
>
>
>
>
>
>
>
>
|

|
>







 







<
|




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







|







 







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







 







>

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


|







 







|

|





|
|





|

<
<
<
<
|
<







 







|


|
|

|

|
|
|
>








|











|




|

<
<

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

<
>

<
<
<
<
<
>

<
<
>

<
>
>
>
>
>
>

<
>

<
>

<
>

<
>

<
>
>
>

<
<
>
>

<
>

<
<
<
<
<
>
>
>

<
>
>
>

<
<
<
>
>
>

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
...
174
175
176
177
178
179
180

181
182
183
184
185















186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
...
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435




436

437
438
439
440
441
442
443
...
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520


521











522
523

524
525





526
527


528
529

530
531
532
533
534
535
536

537
538

539
540

541
542

543
544

545
546
547
548


549
550
551

552
553





554
555
556
557

558
559
560
561



562
563
564
565






























WRITING RULES FOR GRAMMALECTE

Note: This documentation is a draft. Information may be obsolete or incomplete.

# Principles #

Grammalecte is a bi-passes grammar checker engine. On the first pass, the
engine checks the text paragraph by paragraph. On the second pass, the engine
check the text sentence by sentence.

The command to switch to the second pass is `[++]`.

In each pass, you can write as many rules as you need.

There are two kinds of rules:

* regex rules (triggered by a regular expression)
* token rules (triggered by a succession of tokens)

A regex rule is defined by:

* [optional] flags “LCR” for the regex word boundaries and case sensitiveness
* a regex pattern trigger
* a list of actions

* [optional] option name (the rule is active only if the option defined by user or config is active)
* [optional] rule name (named rules can be disabled by user or by config)

A token rules is defined by:

* rule name
* one or several lists of tokens (triggers)
* a list of actions (the action is active only if the option defined by user or config is active)

Token rules must be defined within a graph.

Each graph is defined within the second pass with the command:

        @@@@GRAPH: graph_name

A graph ends when another graph is defined or when is found the command:

        @@@@END_GRAPH

There is no limit to the number of actions and the type of actions a rule can
launch. Each action has its own condition to be triggered.

There are several kinds of actions:

* Error warning, with a message, and optionally suggestions, and optionally an URL
* Text transformation, modifying internally the checked text
* Disambiguation action, setting tags on a position
* Tagging


The rules file for your language must be named `rules.grx`.
The settings file must be named `config.ini`.

All these files are simple utf-8 text file.
UTF-8 is mandatory.


# Comments #

Lines beginning with `#` are comments.


# End of file #

With the command:

        #END

at the beginning of a line, the parser won’t go further.
Whatever is written after will be considered as comments.


# Regex rule syntax #

        __LCR/option(rulename)__
            pattern
            <<- condition ->> error_suggestions  # message_error|http://awebsite.net...
            <<- condition ~>> text_rewriting
            <<- condition =>> commands_for_disambiguation
            ...

Patterns are written with the Python syntax for regular expressions:
http://docs.python.org/library/re.html
................................................................................

Examples:

        __<s>__ pattern
            <<- condition ->> replacement
            # message
            <<- condition ->> suggestion # message

            <<- condition ~>> text_rewriting
            <<- =>> disambiguation

        __<s>__ pattern <<- condition ->> replacement # message

















## Whitespaces at the border of patterns or suggestions ##

Example: Recognize double or more spaces and suggests a single space:

        __<s>__  "  +" <<- ->> " "      # Extra space(s).

Characters `"` protect spaces in the pattern and in the replacement text.


## Pattern groups and back references ##

It is usually useful to retrieve parts of the matched pattern. We simply use
parenthesis in pattern to get groups with back references.

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

        __<i]__ \b([?!.])([A-Z]+) <<- ->> \1 \2     # Missing space?

Example. Back reference in messages.

        (fooo) bar <<- ->> foo      # “\1” should be:


## Pattern matching ##

Repeating pattern matching of a single rule continues after the previous matching, so
instead of general multiword patterns, like

        (\w+) (\w+) <<- some_check(\1, \2) ->> \1, \2 # foo

use

        (\w+) <<- some_check(\1, word(1)) ->> \1, # foo


## Name definitions ##

Grammalecte supports name definitions to simplify the description of the
complex rules.

Example:
................................................................................
        Mr(. [A-Z]\w+) <<- ~1>> *

You can also call Python expressions.

        __[s]__ Mr. ([a-z]\w+) <<- ~1>> =\1.upper()


# Text preprocessing and multi-passes checking #

On each pass, Lightproof uses rules written in the text preprocessor to modify
internally the text before checking the text.

The text preprocessor is useful to simplify texts and write simplier checking
rules.

For example, sentences with the same grammar mistake:

        These “cats” are black.
        These cats are “black”.
        These cats are absolutely black.
        These stupid “cats” are all black.
        These unknown cats are as per usual black.

Instead of writting complex rules or several rules to find mistakes for all possible
cases, you can use the text preprocessor to simplify the text.

To remove the chars “”, write:

        [“”] ->> *

The * means: replace text by whitespaces.

Similarly to grammar rules, you can add conditions:

        \w+ly <<- morph(\0, "adverb") ->> *

You can also remove a group reference:

        these (\w+) (\w+) <<- morph(\1, "adjective") and morph(\2, "noun") -1>> *
        (am|are|is|were|was) (all) <<- -2>> *

With these rules, you get the following sentences:

        These  cats  are black.
        These cats are  black .
        These cats are            black.
        These         cats  are     black.
        These         cats are              black.

These grammar mistakes can be detected with one simple rule:

        these +(\w+) +are +(\w+s)
            <<- morph(\1, "noun") and morph(\2, "plural")
            -2>> _              # Adjectives are invariable.

Instead of replacing text with whitespaces, you can replace text with @.

        https?://\S+ ->> @

This is useful if at first pass you write rules to check successive whitespaces.
@ are automatically removed at the second pass.

You can also replace any text as you wish.

        Mister <<- ->> Mr
        (Mrs?)[.] <<- ->> \1


# Disambiguation #

When Grammalecte analyses a word with morph, before requesting the
POS tags to the dictionary, it checks if there is a stored marker for the
position where the word is. If there is a marker, Grammalecte uses the stored
data and don’t make request to the dictionary.

The disambiguation commands store POS tags at the position of a word.

There is 3 commands for disambiguation.
................................................................................
>   stores at position n only the POS tags of the word matching the pattern.

`exclude(n, pattern)`

>   stores at position n the POS tags of the word, except those matching the
    pattern.

`define(n, [definitions])`

>   stores at position n the POS tags in definitions (a list of strings).

Examples:

        =>> select(\1, "po:noun is:pl")
        =>> exclude(\1, "po:verb")
        =>> define(\1, ["po:adv"])
        =>> exclude(\1, "po:verb") and define(\2, ["po:adv"]) and select(\3, "po:adv")

Note: select, exclude and define ALWAYS return True.

If select and exclude generate an empty list, no marker is set.

With define, you must set a list of POS tags. Example:





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



# Conditions #

Conditions are Python expressions, they must return a value, which will be
evaluated as boolean. You can use the usual Python syntax and libraries.

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

>   checks if the text before the pattern matches the regex.

`textarea(regex[, neg_regex])`

>    checks if the full text of the checked area (paragraph or sentence) matches the regex.

`morph(n, regex[, neg_regex][, no_word=False])`

>   checks if all tags of the word in group n match the regex.
>   if neg_regex = "*", returns True only if all morphologies match the regex.
>   if there is no word at position n, returns the value of no_word.

`analyse(n, regex[, neg_regex][, no_word=False])`

>   checks if all tags of the word in group n match the regex.
>   if neg_regex = "*", returns True only if all morphologies match the regex.
>   if there is no word at position n, returns the value of no_word.


`option(option_name)`

>   returns True if option_name is activated else False

Note: the analysis is done on the preprocessed text.


# Default variables #

`sCountry`

>   It contains the current country locale of the checked paragraph.

        colour <<- sCountry == "US" ->> color       # Use American English spelling.



# Expressions in the suggestions #

Suggestions started by an equal sign are Python string expressions
extended with possible back references and named definitions:

Example:

        <<- ->> = '"' + \1.upper() + '"'     # With uppercase letters and quotation marks















# Token rules


Token rules must be defined within a graph.






## Tokens



Tokens can be defined in several ways:


* Value (meaning the text of the token). Examples: `word`, `<start>`, `<end>`, `,`.
* Lemma: `>lemma`.
* Regex: `~pattern`, `~pattern¬antipattern`.
* Regex on morphologies: `@pattern`, `@pattern¬antipattern`.
* Tags: `/tag`.
* Metatags: *NAME. Examples: `*WORD`, `*NUM`, `*SIGN`, etc.


Selection of tokens: `[token1|token2|>lemma1|>lemma2|~pattern1|@pattern1|…]`


Conditional token: `?token¿`


Conditional selection of token: `?[token1|token2|…]¿`


## Token references


Positive references are defined by a positive integer `>= 1`. Examples: \1, \2, \3, etc.
If there is at least one token set between parenthesis, these numbers refer to tokens between parenthesis, ignoring all others.
If there is no token between parenthesis, these numbers refer to tokens found in order defined by the rule triggered.



Negative references are defined by a negative integer `<= -1`. Examples: \-1, \-2, \-3, etc.
These numbers refer to the tokens beginning by the last one found by the rule triggered.


Examples:






        tokens:             alpha       beta        gamma       delta       epsilon
        positive refs:      1           2           3           4           5
        negative refs:      -5          -4          -3          -2          -1


        tokens:             alpha       (beta)      gamma       (delta)     epsilon
        positive refs:                  1                       2
        negative refs:      -5          -4          -3          -2          -1




        tokens:             alpha       (beta)      ?gamma¿     (delta)     epsilon
        positive refs:                  1                       2
        negative refs:      (-4/-5)     (-3/-4)     (-3/none)   -2          -1































Changes to gc_lang/fr/data/phonet_simil.txt.

196
197
198
199
200
201
202

203
204
205
206
207
208
209
...
513
514
515
516
517
518
519

520
521
522
523
524
525
526
convaincs convainc convins convint
convaincant convaincants convainquant
convergeant convergent convergents
convoi convois convoie convoies convoient
cool cools coule coules coulent
coq coqs coque coques coke cokes
cor cors corps

coron corons corromps corrompt
corset corsets corser corsé
cote cotes cotent côte côtes cotte cottes
côté côtés coter
cou cous coût coûts cout couts coup coups coud couds
coucher couchers
coule coules coulent cool
................................................................................
mu mus mû mue mues muent
nais nait nez né née
navigant navigants naviguant
nécessité nécessités nécessiter
négligeant négligent négligents
ni nid nids nie nies nient
niais niait niaient

nô nos
noix noie noies noient noua nouas
nom noms non
nome nomes nomme nommes nomment
notre nôtre nôtres
nourrice nourrices nourrisse nourrisses nourrissent
nous noue noues nouent







>







 







>







196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
...
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
convaincs convainc convins convint
convaincant convaincants convainquant
convergeant convergent convergents
convoi convois convoie convoies convoient
cool cools coule coules coulent
coq coqs coque coques coke cokes
cor cors corps
cornée cornées corner cornet cornets
coron corons corromps corrompt
corset corsets corser corsé
cote cotes cotent côte côtes cotte cottes
côté côtés coter
cou cous coût coûts cout couts coup coups coud couds
coucher couchers
coule coules coulent cool
................................................................................
mu mus mû mue mues muent
nais nait nez né née
navigant navigants naviguant
nécessité nécessités nécessiter
négligeant négligent négligents
ni nid nids nie nies nient
niais niait niaient
nichée nichées nicher nichet nichets
nô nos
noix noie noies noient noua nouas
nom noms non
nome nomes nomme nommes nomment
notre nôtre nôtres
nourrice nourrices nourrisse nourrisses nourrissent
nous noue noues nouent

Changes to gc_lang/fr/modules-js/gce_suggestions.js.

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    for (let sStem of _oSpellChecker.getLemma(sFlex)) {
        let tTags = conj._getTags(sStem);
        if (tTags) {
            // we get the tense
            let aTense = new Set();
            for (let sMorph of _oSpellChecker.getMorph(sFlex)) {
                let m;
                let zVerb = new RegExp (">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K))", "g");
                while ((m = zVerb.exec(sMorph)) !== null) {
                    // stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if (m) {
                        if (m[1] === ":Y") {
                            aTense.add(":Ip");
                            aTense.add(":Iq");
                            aTense.add(":Is");
                        } else if (m[1] === ":P") {
                            aTense.add(":Ip");
                        } else {
                            aTense.add(m[1]);







|



|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    for (let sStem of _oSpellChecker.getLemma(sFlex)) {
        let tTags = conj._getTags(sStem);
        if (tTags) {
            // we get the tense
            let aTense = new Set();
            for (let sMorph of _oSpellChecker.getMorph(sFlex)) {
                let m;
                let zVerb = new RegExp (">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P|Q))", "g");
                while ((m = zVerb.exec(sMorph)) !== null) {
                    // stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if (m) {
                        if (m[1] === ":Y" || m[1] == ":Q") {
                            aTense.add(":Ip");
                            aTense.add(":Iq");
                            aTense.add(":Is");
                        } else if (m[1] === ":P") {
                            aTense.add(":Ip");
                        } else {
                            aTense.add(m[1]);

Changes to gc_lang/fr/modules/gce_suggestions.py.

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    aSugg = set()
    for sStem in _oSpellChecker.getLemma(sFlex):
        tTags = conj._getTags(sStem)
        if tTags:
            # we get the tense
            aTense = set()
            for sMorph in _oSpellChecker.getMorph(sFlex):
                for m in re.finditer(">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P))", sMorph):
                    # stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if m:
                        if m.group(1) == ":Y":
                            aTense.add(":Ip")
                            aTense.add(":Iq")
                            aTense.add(":Is")
                        elif m.group(1) == ":P":
                            aTense.add(":Ip")
                        else:
                            aTense.add(m.group(1))







|


|







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    aSugg = set()
    for sStem in _oSpellChecker.getLemma(sFlex):
        tTags = conj._getTags(sStem)
        if tTags:
            # we get the tense
            aTense = set()
            for sMorph in _oSpellChecker.getMorph(sFlex):
                for m in re.finditer(">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P|Q))", sMorph):
                    # stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if m:
                        if m.group(1) == ":Y" or m.group(1) == ":Q":
                            aTense.add(":Ip")
                            aTense.add(":Iq")
                            aTense.add(":Is")
                        elif m.group(1) == ":P":
                            aTense.add(":Ip")
                        else:
                            aTense.add(m.group(1))

Changes to gc_lang/fr/rules.grx.

737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778

779
780
781
782
783
784
785
....
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
....
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869




1870
1871
1872
1873
1874
1875
1876
1877
1878


1879
1880
1881
1882
1883
1884
1885
....
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
....
2030
2031
2032
2033
2034
2035
2036

2037
2038
2039
2040
2041
2042
2043
....
2151
2152
2153
2154
2155
2156
2157




2158
2159
2160
2161
2162
2163
2164
....
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217




3218
3219
3220
3221
3222
3223
3224
....
3404
3405
3406
3407
3408
3409
3410







3411
3412
3413
3414
3415
3416
3417
....
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
....
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
....
4674
4675
4676
4677
4678
4679
4680













4681
4682
4683
4684
4685
4686
4687

4688
4689
4690
4691
4692
4693
4694
....
4977
4978
4979
4980
4981
4982
4983

















4984
4985
4986
4987
4988
4989
4990
....
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227

5228
5229
5230
5231
5232
5233
5234
....
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352


5353
5354
5355
5356
5357
5358
5359
....
5399
5400
5401
5402
5403
5404
5405

5406
5407
5408
5409
5410
5411
5412
....
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
....
5815
5816
5817
5818
5819
5820
5821

5822
5823
5824
5825
5826
5827
5828
....
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
....
6084
6085
6086
6087
6088
6089
6090

6091
6092
6093
6094
6095
6096
6097
....
6594
6595
6596
6597
6598
6599
6600










6601
6602
6603
6604
6605
6606
6607
....
6639
6640
6641
6642
6643
6644
6645









6646
6647
6648
6649
6650
6651
6652
....
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
....
7269
7270
7271
7272
7273
7274
7275

7276
7277
7278
7279
7280
7281
7282
....
7556
7557
7558
7559
7560
7561
7562




7563
7564
7565
7566
7567
7568
7569

7570
7571
7572
7573
7574
7575
7576
....
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240

8241
8242
8243

8244
8245
8246
8247
8248
8249
8250
....
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
....
8300
8301
8302
8303
8304
8305
8306

8307
8308
8309
8310
8311
8312
8313
8314

8315
8316
8317
8318
8319

8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331








8332
8333
8334
8335
8336
8337
8338
....
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
....
9581
9582
9583
9584
9585
9586
9587

9588
9589
9590
9591
9592
9593
9594
....
9959
9960
9961
9962
9963
9964
9965

9966
9967
9968
9969
9970
9971
9972
.....
10567
10568
10569
10570
10571
10572
10573




10574
10575
10576
10577
10578
10579
10580
.....
10613
10614
10615
10616
10617
10618
10619


10620
10621
10622
10623
10624
10625
10626
.....
10631
10632
10633
10634
10635
10636
10637

10638

10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649

10650
10651
10652
10653
10654
10655
10656
.....
10774
10775
10776
10777
10778
10779
10780

10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793

10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
.....
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218


11219
11220
11221
11222
11223
11224
11225
.....
11276
11277
11278
11279
11280
11281
11282

11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
.....
11301
11302
11303
11304
11305
11306
11307

11308
11309
11310
11311
11312
11313
11314
11315
11316

11317
11318
11319
11320
11321
11322
11323
.....
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
.....
11501
11502
11503
11504
11505
11506
11507




11508
11509
11510
11511
11512
11513
11514
.....
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659

11660
11661
11662
11663
11664
11665
11666
.....
11789
11790
11791
11792
11793
11794
11795


11796
11797
11798
11799
11800
11801
11802
11803





















11804
11805
11806
11807
11808
11809
11810
.....
11835
11836
11837
11838
11839
11840
11841

11842
11843
11844
11845
11846
11847
11848
.....
12132
12133
12134
12135
12136
12137
12138

12139
12140
12141
12142
12143
12144
12145
.....
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
.....
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541

12542
12543
12544
12545
12546
12547
12548

12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562


12563
12564
12565
12566
12567
12568
12569
.....
14298
14299
14300
14301
14302
14303
14304



















14305
14306
14307
14308
14309
14310
14311
.....
15242
15243
15244
15245
15246
15247
15248
15249
15250
15251
15252
15253
15254
15255
15256
15257
15258



15259
15260
15261
15262
15263
15264
15265
15266
15267
15268
.....
15271
15272
15273
15274
15275
15276
15277

15278
15279
15280
15281
15282
15283
15284
15285

15286
15287
15288
15289
15290
15291
15292
.....
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
.....
16166
16167
16168
16169
16170
16171
16172



16173
16174
16175
16176
16177
16178
16179
.....
16294
16295
16296
16297
16298
16299
16300


16301
16302
16303
16304
16305
16306
16307
.....
16534
16535
16536
16537
16538
16539
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555

16556
16557
16558
16559
16560
16561
16562
.....
16652
16653
16654
16655
16656
16657
16658
16659
16660
16661
16662
16663
16664
16665
16666
.....
16667
16668
16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
.....
16710
16711
16712
16713
16714
16715
16716

16717
16718
16719
16720
16721
16722
16723
.....
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194







17195
17196
17197
17198
17199
17200
17201
.....
17202
17203
17204
17205
17206
17207
17208

17209
17210
17211
17212
17213
17214
17215
.....
17280
17281
17282
17283
17284
17285
17286

17287
17288
17289
17290
17291
17292
17293
.....
18609
18610
18611
18612
18613
18614
18615
18616
18617
18618
18619
18620




18621
18622
18623
18624
18625

18626
18627
18628
18629
18630
18631
18632
.....
18808
18809
18810
18811
18812
18813
18814



18815
18816
18817
18818
18819
18820
18821
.....
18909
18910
18911
18912
18913
18914
18915



18916
18917

18918
18919
18920
18921

18922
18923
18924
18925
18926


18927

18928
18929
18930




18931
18932
18933
18934
18935
18936
18937
.....
18939
18940
18941
18942
18943
18944
18945

18946
18947
18948
18949
18950
18951
18952
.....
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027
19028
19029












19030
19031
19032
19033
19034
19035
19036
.....
19191
19192
19193
19194
19195
19196
19197
19198
19199
19200




19201
19202
19203
19204
19205



19206
19207

19208



19209
19210

19211
19212
19213
19214
19215
19216
19217
19218
19219
19220
.....
19428
19429
19430
19431
19432
19433
19434
19435
19436
19437
19438
19439


19440
19441
19442
19443
19444
19445
19446
.....
19598
19599
19600
19601
19602
19603
19604

19605
19606
19607
19608
19609
19610
19611
.....
19922
19923
19924
19925
19926
19927
19928
19929
19930
19931
19932
19933
19934
19935
19936
19937
19938
19939
19940
19941
19942
19943
19944
19945
19946
19947
19948
19949
19950
19951
19952
19953
19954
19955
19956
19957
19958
19959
19960
.....
20028
20029
20030
20031
20032
20033
20034








20035
20036
20037
20038
20039
20040
20041
.....
23028
23029
23030
23031
23032
23033
23034
23035
23036
23037
23038
23039
23040
23041
23042

!!
!!
!!!! Ponctuation de fin de paragraphe                                                             !!
!!
!!

__[i>/poncfin__
    ({w_1}) *$  @@0
    <<- before("\\w+(?:\\.|[   ][!?]) +(?:[A-ZÉÈÎ]\\w+|[ÀÔ])") -1>> \1.|\1 !|\1 ?                   # Il semble manquer une ponctuation finale (s’il s’agit d’un titre, le point final n’est pas requis).

TEST: __poncfin__ Vraiment. Quel {{ennui}}
TEST: Internet : le nouvel eldorado
TEST: OMC-FMI : Les nouveaux maîtres du monde

................................................................................
    # Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447
__[i>/virg(virgule_manquante_avant_mais)__
    ({w_1})( mais)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on)\b)  @@0,$
    <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais
    # Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445
__[i>/virg(virgule_manquante_avant_donc)__
    ({w_1})( donc)(?= (?:j[e’]|tu|ils?|elles?|on)\b)  @@0,$
    <<- not morph(\1, ":V") -2>> , donc
    # Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448

TEST: Un chien, un chat{{ etc.}}                                            ->> , etc.
TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit.                   ->> , car
TEST: Je suis fatigué{{ mais}} il a joué toute la nuit.                     ->> , mais
TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire.              ->> , donc
TEST: il s’est donc tu



__<s>/virg(virgule_point_fin_dialogue)__
    ([.] » )[a-zéà]  @@0 <<- -1>> " », | » "             # Ou il faut une virgule (exemple : « Je viens », dit-il). Ou le point est superflu. Ou il faut une majuscule sur le mot suivant.
__<s>/virg(virgule_fin_dialogue)__
    (, »,? )[a-zéà]  @@0 <<- -1>> " », | » "                                            # Virgule mal placée ou superflue.

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

    [des|chaque|quelque|quelques|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs|aucun|aucune]  *WORD
        <<- =>> exclude(\2, ":V")

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

    [une|le|la|les|des|chaque|quelque|quelques|cet|cette|ces|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs] personne
        <<- =>> select(\-1, ":N")

    de  [la|l’]  @:¬:Y
        <<- =>> exclude(\3, ":V")

................................................................................
    en tant que  *WORD
        <<- =>> exclude(\4, ":[123][sp]")

    en peine
        <<- =>> exclude(\2, ":V")

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

    plein  [de|d’]  @:[AN]
        <<- not morph(<1, ":V0e") =>> =define(\1, [":G"])





    très  *WORD
        <<- =>> exclude(\2, ":[123][sp]")

TEST: il s’agit d’{{un}} {{anagramme}}
TEST: nul ne sait qui arriva à ce pauvre Paul surpris par la pluie.
TEST: elle finit par être très fière de son fils.
TEST: en tant que président du conseil
TEST: les bac +2 sont trop nombreux.
TEST: c’est à n’y plus rien comprendre.





!!!
!!!
!!! Étiquettes                                                                                    !!
!!!
................................................................................
TEST: {{attaquant-ils}}                                     ->> attaquent-ils
TEST: {{prendrons-elles}} un verre avec moi ?


__inte_verbes_composés_interrogatifs_impératifs__
    ~\w-[nN]ous$
        <<- /inte/ morphVC(\1, ":V", ":(?:1p|E:2[sp])") ->> =suggVerb(\1, ":1p", None, True)          # Forme interrogative ou impérative incorrecte.
        <<- /inte/ __else__ and morphVC(\1, ":", ":V|>chez/") ->> =suggSimil(\1, ":1p", False, True)  # Forme interrogative ou impérative incorrecte.
        <<- />> -nous|VCint

    ~\w-[vV]ous$
        <<- /inte/ morphVC(\1, ":V", ":2p") ->> =suggVerb(\1, ":2p", None, True)                      # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel.
        <<- /inte/ __else__ and morphVC(\1, ":", ":V|>chez/") ->> =suggSimil(\1, ":2p", False, True)  # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel.
        <<- />> -vous|VCint

................................................................................
TEST: {{Prendront-nous}}                                    ->> Prendrons-nous
TEST: {{Attendront-nous}} le train                          ->> Attendrons-nous
TEST: {{Attaquait-vous}}                                    ->> Attaquiez-vous
TEST: Elle a de nombreux rendez-vous ce matin.
TEST: êtes-vous là ?
TEST: C’est notre chez-nous.
TEST: Dans votre chez-vous, faites comme bon vous semble.



__inte_rendez_vous__
    ne [le|la|les] [lui|leur]   rendez-vous
    ne me [le|la|les]           rendez-vous
    ne [lui|leur] en            rendez-vous
    ne [le|la|les|lui|leur]     rendez-vous
................................................................................

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


__immunités__




    à l’ arrache
        <<- %3>>

    à ce point
    en tout point
        <<- %3>>

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

TEST: des {{franco américains}}
TEST: {{franco américaine}}                             ->> franco-américaine
TEST: l’{{israélo belge}}


__tu_préfixe_xxxo__
    [électro|ferro|hydro|labio|macro|magnéto|médico|micro|nano|néo|neuro|paléo|physico|politico|rétro|rhino|sino|socio|stéréo]  *WORD
        <<- /tu/ analyse_with_next(\1, "-", ":")
        ->> \1-\2                                                                                   # S’il s’agit d’un seul mot, il manque un trait d’union.





TEST: {{ferro électrique}}                              ->> ferro-électrique
TEST: {{rétro ingénierie}}.                             ->> rétro-ingénierie


__tu_préfixe_divers__
    [anti|auto|arrière|avant|demi|extra|intra|multi|post]  *WORD
        <<- /tu/ (morph(<1, ":D|<start>") or value(<1, "|l’|d’|")) and analyse_with_next(\1, "-", ":")
................................................................................

    quelques [un|uns|une|unes]
        <<- /tu/ ->> quelques-\2                                # Il manque un trait d’union.

    [plus|moins] [value|values]
        <<- /tu/ ->> \1-\2                                      # Il manque un trait d’union.








    rez de >chaussée
        <<- /tu/ ->> rez-de-chaussée                            # Il manque un trait d’union.

    science fiction
        <<- /tu/ ->> science-fiction                            # Il manque un trait d’union.

    stock >option
................................................................................
        <<- /conf/ not \1.isupper() and not \2.isupper()
        -2>> =suggSimil(\2, ":[NA].*:[pi]", True)                                                   # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

    [quels|quelles] [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on]
        <<- /conf/ not \1.isupper() and not \2.isupper() and not value(<1, "|tels|telles|")
        -2>> =suggSimil(\2, ":[NA].*:[pi]", True)                                                   # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

    des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on]
        <<- /conf/ not \1.isupper() -2>> =suggSimil(\2, ":[NA].*:[pi]", True)                       # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
        <<- /conf/ __also__ -1>> de                                                                 # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

TEST: {{Ces}} {{cette}} canaille qui nous a donné tant de fil à retordre.
TEST: Mon {{il}} est une merveille.
TEST: je ne sais {{des}} {{ses}} choses.


................................................................................
    on  [ne|n’]    [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [lui|leur]                     en                         @:¬:(?:V|Ov)
        <<- /conf/ not morph(<1, ":3s") and not value(<1, "|n’|m’|t’|s’|")
        --1>> =suggSimil(\-1, ":(?:3s|Ov)", False)                                                  # Incohérence avec “\1” : “\-1” devrait être un verbe, un pronom objet, un adverbe de négation, etc.

TEST: il {{et}} parti.
TEST: il nous {{et}} indispensable.
TEST: Il ne {{travail}} pas le week-end.
TEST: il m’{{arête}} encore une fois avec une impudence insupportable.
TEST: il n’y {{pas}} beaucoup d’entente entre eux.
TEST: il est normal de ne presque pas payer des gens qui effectuent un travail
TEST: il s’en va.


__conj_ce__
    [ce|c’]             @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:N|A|3s|P|Q|Ov)
    [ce|c’]  [ne|n’]    @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:3s|P|Ov)
        <<- /conj/ --1>> =suggVerb(\-1, ":3s")                                                      # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
TEST: elle {{c’}}en était trop vanté
TEST: cet homme, perdu dans ses pensées, allait {{c’}}en faire du souci.
TEST: il {{c’}}accoutumait à sa nouvelle fonction.
TEST: elle {{c’}}anime dès qu’on fait du bruit.
TEST: {{s’}}{{avait}} fonctionné
TEST: c’était merveilleux.















__conj_mieux_vaut__
    mieux  ?[ne|n’]¿  [vaux|valais|valus|vaudras|vaudrais]
        <<- /conj/ --1>> =\-1[:-1]+"t"                                                              # Conjugaison erronée. Accord avec “mieux” : utilisez la 3ᵉ personne du singulier.

TEST: avec toi qui ne sais rien de rien, mieux {{vaux}} ne rien dire.
TEST: Mais là-bas mieux {{valais}} ouvrir sa gueule que se taire.



## 1pl
__conj_nous__
    <start>  nous  @:V¬:(?:G|Y|P|1p|3[sp])
        <<- /conj/ not value(>1, "|je|tu|il|elle|on|nous|vous|ils|elles|")
        -3>> =suggVerb(\3, ":1p")                                                                   # Conjugaison erronée. Accord avec “nous”. Le verbe devrait être à la 1ʳᵉ personne du pluriel.
................................................................................
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: mes supérieurs et moi-même avons pris la décision de ne pas vendre
TEST: Ni lui ni moi n’avions mangé
TEST: Mon épouse et moi-même avons toujours dit
TEST: que vous ou moi ignorions à peu près tout du boson de Higgs n’a pas du tout le même sens



















!!
!!
!!!! Confusions générales                                                                         !!
!!
!!

................................................................................
TEST: elle n’{{en n’}}avait plus pour longtemps.        ->> "en "
TEST: toute chose pourrait finalement advenir indifféremment en n’importe quel point du globe


#### Divers
__ppas_lui_verbe__
    lui  ~é(?:es?|s)$
        <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":V0a")
        -2>> =suggVerbInfi(\2)+"|"+suggVerbPpas(\2, ":m:s")                                         # Incohérence probable. Soit il faut un participe passé masculin singulier, soit un verbe à l’infinitif.

    lui aussi ~é(?:es?|s)$
        <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":V0a") -2>> =suggVerbPpas(\2, ":m:s")         # Incohérence probable. Il faut vraisemblement un participe passé masculin singulier.

TEST: lui {{mangée}} beaucoup.
TEST: L’homme qui s’approchait de lui voulait le surprendre.
TEST: avec Paul, lui aussi éliminé.
TEST: les études qu’il a lui terminées avec bien du mal.



__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tag_before(\1, "ce_que") 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.
................................................................................

    à été
        <<- /conf/ -1>> a                                           # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    qui  à  @:Q¬:M
        <<- /conf/ \3.islower() -2>> a                              # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    qui  [lui|leur|nous|vous|y]  à
        <<- /conf/ -3>> a                                           # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.




    à  le  @:[NAQ].*:[me]¬:(?:Y|Oo)
        <<- /conf/ -1:2>> a le|au
        # Confusion. Ou vous confondez “à” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.

    à  le  @:[NAQ].*:f¬:(?:Y|Oo)
        <<- /conf/ -1:2>> à la|a la
................................................................................
TEST: Ce chien, croyons-nous savoir, {{à le}} maître le plus violent qui soit.
TEST: L’homme {{à}} ouvert la boîte.
TEST: Il ne nous reste plus qu’{{à}} {{vérifié}} si votre maquette.
TEST: Je veux {{à}} {{mangé}}.
TEST: Ne pas hésiter {{à}} {{demandé}} des conseils.
TEST: cette femme, dans son délire, {{à}} {{jetez}} son argent à la poubelle.
TEST: Ce que cet homme à {{devient}} aujourd’hui notre problème

TEST: il en a.
TEST: elle en a.
TEST: celle qui à contrario nous a foutu dans la merde.
TEST: ceux qui à Somewhere se sont si mal illustrés.
TEST: en à peine vingt ans


................................................................................
    a haut risque
    a hue et à dia
    a huis clos
    a intervalles [réguliers|irréguliers]
    a juste [raison|titre]
    a l’ heure actuelle
    a l’ heure qu’ il est
    a l’ [accoutumée|amiable|arrache|avance|avenir|avenant|aveuglette|emporte-pièce|évidence|improviste|inverse]
    a l’ air libre
    a l’ exclusion de toute autre chose
    a l’ ordre du jour
    a l’ œil nu
    a l’ en croire
    a l’ unanimité
    a l’ un d’ entre eux
................................................................................
__conf_à_substantifs__
    >arc a >poulie
    >arme a >feu
    >bombe a [eau|fragmentation|retardement]
    [>canne|>cane] a [>pêche|>sucre]
    >caisse a >outil
    >chair a [pâté|>canon]

    >crayon a [lèvres|sourcils]
    >cuillère a [café|soupe]
    >fard a paupières
    [>fille|fils] a [papa|maman]
    >gaz a effet de serre
    >lime a >ongle
    >machine a [café|coudre|laver]
................................................................................
TEST: on va y arriver, {{au temps que faire se peu}}…
TEST: autant que faire se peut, il faut éviter la confusion entre ces deux discours.


# ça / çà / sa
__conf_ça_çà_sa__
    ça  @:[NAQ].*:f¬:(?:G|P|[123][sp])|>seule?s?/
        <<- /conf/ -1>> sa                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa  @:G¬>(?:tr(?:ès|op)|peu|bien|plus|moins|toute|presque)/|:[NAQ].*:f
        <<- /conf/ not (\2 == "ou" and value(>1, "|son|ses|")) -1>> ça          # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa [n’|m’|t’|s’|j’|l’|d’|qu’|lorsqu’|puisqu’|quoiqu’]
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

................................................................................
TEST: et {{sa}} par deux fois
TEST: Il trouva de la nourriture {{ça et là}}.                                ->> çà et là
TEST: Elle parle comme {{ça}} mère.                                           ->> sa
TEST: C’est comme {{sa}}.
TEST: {{sa}} l’ennuierait, ce fils de pute, de dire bonjour ?
TEST: il faut s’y prendre comme {{sa}}
TEST: on fait {{sa}} lorsqu’on a tout perdu

TEST: avec sa presque belle-mère
TEST: sa toute nouvelle application de synchronisation de fichiers
TEST: communiquer avec sa ou son partenaire.


# Campagne / compagne
__conf_campagne_compagne__
................................................................................
TEST: Ils sont pas si {{différends}} de nous.
TEST: Cette fois, il parla avec un ton différent.
TEST: J’en veux un différent.
TEST: Il en veut des différents.
TEST: dans ses différents ouvrages
TEST: dans ses différents postes gouvernementaux












# dû / du
__ppas_dû_du__
    du  [à|a|au|aux]
        <<- /ppas/ \2.islower() -1>> dû                         # Confusion. Ce qui est dû.

    [mon|notre|votre]  du
................................................................................
# en / an
__être_en_xxxx__
    [>être|>rester|>demeurer] an [contradiction|désaccord|accord]
        <<- /conf/ -2>> en                                                                          # Confusion. Un an = une année. Pour la préposition, écrivez “en”.

TEST: Je suis {{an}} désaccord avec lui.











# en général
__conf_en_général__
    en générale
        <<- /conf/ ->> en général                               # Dans cette locution, “général” est toujours au masculin singulier.|https://fr.wiktionary.org/wiki/en_g%C3%A9n%C3%A9ral

TEST: On n’en sait {{en générale}} pas assez.
................................................................................
        <<- /conf/ not morph(<1, ":[VR]|<start>") and not morph(>1, ":(?:3s|Ov)")
        -2>> ont                                                    # Confusion probable. Exemples : « on y va », « ils ont faim ».

    ~-ont$
        <<- /conf/ ->> =\1[:-1]                                     # Incohérence : “ont” est une forme conjuguée du verbe “avoir” (par exemple: “ils ont”). Pour le pronom personnel, écrivez “on”.

    [<start>|,]  *WORD  ont
        <<- /conf/ space_after(\2, 1, 1) and morph(\2, ":3s") -2:3>> \2-on
        # Confusion probable : “ont” est une forme conjuguée du verbe “avoir”. Pour le pronom personnel, écrivez “on” et mettez un trait d’union puisqu’il s’agit d’une question.

TEST: {{ont}} m’assure qu’il n’y en a pas.
TEST: {{Ont}} n’arrive pas à s’en sortir.
TEST: {{Ont}} ne sait jamais quoi faire
TEST: si {{ont}} donne à ces gens, ça n’en finit plus.
TEST: {{Ont}} viens !
................................................................................
TEST: comme ce que l’{{ont}} {{voit}} dans le lien entre polygynie et guerre.
TEST: Tout à fait, {{ont}} peut même dire qu’à l’adolescence, ce sont les problèmes de l’enfance qui ressortent.
TEST: les politiques de l’offre ont échoué.
TEST: qui on blâme, ce soir ?
TEST: qui n’ont somme toute que le désir de vivre paisiblement
TEST: ces textes, quoi qu’on en pense, ont force de loi.
TEST: s’ils n’ont ne serait-ce qu’un peu de jugeotte, on ne les reverra plus.



# ou / où
__conf_où_ou__
    <start>  Ou  @:3[sp]¬:Y
        <<- /conf/ -2>> Où                                  # Confusion probable. La conjonction “ou” signale une alternative. Utilisez “où” pour “en quel lieu”.

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

    à la >seconde [>prêt|>pré]
        <<- /conf/ -3>> près                                                # Confusion probable. Locution “à la \2 près”.

    au >mètre [>prêt|>pré]
        <<- /conf/ -3>> près                                                # Confusion probable. Locution “au \2 près”.





TEST: depuis {{prêt}} de 15 ans
TEST: ils se sont approchés très {{prêts}}.
TEST: Je suis si {{prêt}} d’y arriver.
TEST: Elle est si {{prêt}} de la trouver.
TEST: Il est {{près}} à les aider
TEST: Elle va regarder ça de plus {{prêt}}.
TEST: Il était rasé de {{prés}}

TEST: Il a obtenu un prêt de Patrick
TEST: Il a obtenu un prêt de Le Drian
TEST: collait au millimètre près à la réalité


# puits / puis
__conf_puits_puis__
................................................................................
TEST: un immonde {{vert}} de terre
TEST: Un {{ver}} de bière fraîche.
TEST: ce {{vert}} quoi nous allons, c’est une catastrophe à l’échelle planétaire.


# voix / voie / vois / voit
__conf_voie_voix_vois_voit__
    à haute [voie|vois|voit]
    de vive [voie|vois|voit]
        <<- /conf/ -3>> voix        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie


    à [voie|vois|voit] [basse|haute]
        <<- /conf/ -2>> voix        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie


    sur la bonne voix
        <<- /conf/ -4>> voie        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie

    >ouvrir la voix [à|au|aux]
        <<- /conf/ -3>> voie        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie

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

# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|vouloir|préférer|de|à)/")
            and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voire                      # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez “voire”.|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire
................................................................................
TEST: l’immobilier a été ces dernières années l’investissement le plus rentable (voir graphique ci-dessous)
TEST: elles sont pas mal ainsi, voire élégantes pourrait-on dire.
TEST: il y en a peu, voire très peu.
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.
TEST: les membres de l’équipage commencent à voir flou
TEST: un travail qu’il préfère voir effectué par un spécialiste plutôt que par lui-même



# vieil / vieux
__conf_vieil_vieux_euphonie__
    vieux  homme
        <<- /conf/ -1>> vieil                                   # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie

    vieux  ~^[aeéiîou]

        <<- /conf/ morph(\2, ":[NA].*:[me]:s") -1>> vieil       # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie

TEST: ce {{vieux}} homme
TEST: c’est un {{vieux}} imbécile.
TEST: Le {{vieux}} homme était parti.                         ->> vieil





# ayants droit
__sgpl_ayants_droit__
    [les|des|ces|ses|nos|vos|leurs] ayant [droit|droits]
        <<- /sgpl/ -2:3>> ayants droit                              # Au singulier : “un ayant droit”. Au pluriel : “des ayants droit”.

TEST: Comment lutter contre la cupidité des {{ayant droits}}
# Note: À supprimer? Graphie qui tend vers la soudure et le pluriel régulier (ayant-droit(s))










# termes
__sgpl_en_termes_de__
    en terme [de|d’]
        <<- /sgpl/ -2>> termes                                      # Dans la locution “en termes de”, mettez “terme” au pluriel.

TEST: en {{terme}} de communication, c’est une véritable catastrophe
................................................................................
    à plat ventre
    à plate couture
    à plein [régime|temps|nez]
    à pleins poumons
    à plus forte raison
    à plus d’un titre
    à point nommé
    à portée de [main|tir]
    à première vue
    à prix [cassé|modique|cassés|modiques]
    à proprement parler
    à qui de droit
    à qui mieux mieux
    à qui que ce soit
    à quelque distance
................................................................................
    de près ou de loin
    de par le monde ?entier¿
    de part et d’autre
    de ?presque¿ partout
    d’ un peu partout
    de petite taille
    de pied ferme

    de plein [droit|fouet]
    de plus [belle|près]
    de premier [choix|ordre|plan]
    de première [catégorie|main|nécessité]
    de prime abord
    de proche en proche
    de pure forme
................................................................................
    niveau par niveau
    pièce par pièce
    par-ci ?,¿ par-là
    par-derrière
    par-dessus le marché
    par-dessus tout
    par-devant

    par là
    parfois
    partant de là
    partout
    pas du tout
    pas le moins du monde
    pas à pas
................................................................................
    pour  autant  [que|qu’]  nous             sachions   @¬:Y
    pour  autant  [que|qu’]  vous             sachiez    @¬:Y
    pour  autant  [que|qu’]  [ils|elles]      sachent    @¬:Y
        <<- ~1:5>> *

    pour cette raison [que|qu’]
        <<- ~1:3>> *





    [le|un|ce|mon|ton|son]  putain  [de|d’]  @:[NA].*:[me]
        <<- ~2:3>> *

    tambour battant
    tambours battants
        <<- morph(<1, ":(?:V|N:f)", ":G") ~>> *
................................................................................
    >arme de [poing|guerre]
    >arme de destruction massive
    >argent de poche
    >article de presse
    >attestation sur l’ honneur
    >attendre de pied ferme
    ayants droit


    >billet de *NUM [>euro|>dollar|>centime|>cent|>livre|>shilling]
    [>bisphénol|>bisphenol] A
    >blanche comme neige
    >blanche comme de la craie
    [>boîte|>boite] aux lettres
    [>boîte|>boite] à gants
    >bombe à [eau|fragmentation|retardement]
................................................................................
    >chambre [de|d’] [agriculture|hôte|hôtes|commerce|compensation|décompression|dégrisement]
    >chasse à courre
    >chemin de [traverse|fer]
    >chili con carne
    >claire comme de l’ eau de [boudin|roche|source]
    >claire comme du cristal
    >claire comme jus de [boudin|chaussette|chaussettes|chique]

    >commise d’ office

    >convention [récepteur|générateur]
    >conne comme la lune
    >conne comme un balai
    >conne comme une valise sans >poignée
    >coup [de|d’] [balai|bol|cœur|couteau|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|patte|pied|poing|poker|pouce|tête|avance|éclat|État|œil|épaule]
    >coup du sort
    >course contre la montre
    [cousu|cousue|cousus|cousues] [main]
    [cousu|cousue|cousus|cousues] de fil blanc
    >crayon à [lèvres|sourcils]
    [>coût|>cout] de revient

    >cuillère à [café|soupe]
    >déclaration sur l’ honneur
    >délai [de|d’] [attente|carence|connexion|prescription|préavis|rétraction|rigueur]
    >demande d’ asile
    >descente aux [enfers|flambeaux]
    [>dîner|>diner] aux chandelles
    >digne de [confiance|foi]
................................................................................
    basse consommation
    bon [enfant|marché|teint]
    bon chic ?,¿ bon genre
    [>clé|>clef] en >main
    dernier cri
    fleur bleue
    grand [public|luxe|maximum]

    grandeur nature
    haut de gamme
    hautee [résolution|fidélité|tension]
    longue [distance|portée|durée]
    meilleur marché
    numéro un
    numéro @:B
    plein cadre
    top secret
    vieux jeu
    open source
    Créative Commons
    pair à pair

    plein les yeux
    pur [sucre|jus]
    terre à terre
    vieille école
        <<- morph(<1, ":(?:N|A|Q|W|V0e)", ":D") ~>> *


__purge_couleurs__
    [beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet] [brillant|clair|fluo|foncé|irisé|mat|pâle|pastel|sombre|tendre|terne|vif]
        <<- morph(<1, ":[NAQ]") ~>> *

    bleu    [ciel|indigo|marine|roi|saphir|turquoise]
    blond   platine
    gris    [acier|anthracite|perle|souris]
    jaune   [paille|sable]
    noir    [de|d’] [encre|jais]
................................................................................

    en [certaines|quelques|plusieurs] occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    en de multiples occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:4>> *

    entre autres choses  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *




    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:2>> *

    de [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

................................................................................
    >aller bon train
    >arriver à échéance
    >arriver à point nommé
    >arriver à bon port
    >battre en [brèche|retraite]
    >chauffer à blanc
    >compter à rebours

    >couler à ?grands¿ flots
    >demander [assistance|audience|conseil|pardon]
    [>donner|>redonner] sens
    >faire [allusion|assaut|attention|chaud|confiance|compliqué|copain-copain|débat|défaut|demi-tour|envie|erreur|figure|froid|halte|honte|illusion|mouche|office|part|peur|plaisir|preuve|rage|scandale|sens|signe|volte-face]
    >faire amende honorable
    >faire bande à part
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
    >faire de [mon|ton|son|notre|votre|leur] mieux
    >faire état
................................................................................
    >faire grise mine
    >faire grand [bruit|cas]
    >faire profil bas
    >faire salle comble
    >faire table rase
    >faire ce que bon [me|te|lui|nous|vous|leur] semble
    >foutre en l’ air

    >jouer franc jeu
    >lâcher prise
    >laisser pour compte
    >marcher à rebours
    >mettre à [bas|jour|niveau|nu|plat|terre]
    >mettre l’ [écart|épreuve]
    >mettre au [point|pas]
    >mettre en [avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre]
    >mourir jeune

    >percer à jour
    >perdre [connaissance|conscience|raison]
    >perdre d’ avance
    >porter [atteinte|bonheur|caution|chance|malheur|plainte|préjudice|secours]
    >poser problème
    >prendre ?[ça|cela|ceci]¿ à la légère
    >prendre ?[ça|cela|ceci]¿ au [dépourvu|sérieux]
................................................................................
    >tenir ?[ça|cela|ceci]¿ à distance ?respectable¿
    >tenir compte
    >tenir au courant
    >trier sur le volet
    >trouver refuge
    >tirer [avantage|profit]
    >tourner court
    >venir je ne sais ?pas¿ ?trop¿ d’ où
    >venir on ne sait ?pas¿ ?trop¿ d’ où
        <<- ~2:0>> *


__conf_locutions_verbales__
    >arriver a échéance
    >arriver a point nommé
    >arriver a bon port
    >chauffer a blanc
    >gonfler a bloc
    >mettre a [bas|>jour|>niveau|>nu|>nue|>plat|>terre]
    >mettre a l’ [écart|épreuve]
    >percer a jour
    >prendre a la légère
    >saigner a blanc
    >tenir a distance
    >venir a point
        <<- /conf/ -2>> à               # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.

    >faire plaisirs
        <<- /sgpl/ -2>> plaisir                                                                     # Faire plaisir : dans cette locution, “plaisir” doit être au singulier.
        <<- ~2>> *

    >laisser pour [comte|comtes|>conte]
................................................................................
TEST: Elles ont avec constance démontré l’inanité de leur politique.
TEST: On l’a mauvaise, j’peux vous l’dire.
TEST: Défigurée, travestie, dans tous les cas contestée.
TEST: Une file d’attente de plusieurs heures s’étire au rez-de-chaussée
TEST: à une hausse des coûts de l’emprunt à court et moyen terme.
TEST: Elle n’avait que rarement pris connaissance de ses droits.
TEST: On ajoutera que si elle n’a que rarement pris la connerie pour objet







@@@@
@@@@
@@@@
@@@@
................................................................................
        <<- /gn/ morph(\2, ":[NA].*:[me]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:f", "*") and not apposition(\2, \3)
        -3>> =suggMasSing(\3, True)                                                                 # Accord de genre erroné : « \1 \2 » est masculin, « \3 » est féminin.
        <<- /gn/ morph(\2, ":[NA].*:[si]", ":G") and morph(\3, ":[NA].*:p", ":[GWsi]") and not apposition(\2, \3)
        -3>> =suggMasSing(\3)                                                                       # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au singulier.

    [et|ou]  le  *WORD  *WORD
        <<- /gn/ morph(\2, ":D") and not morph(<1, ":[NA]") and not \4.startswith("seul") >>>
        <<- /gn/ morph(\3, ":[NA].*:[me]", ":(?:B|G|V0|f)") and morph(\4, ":[NA].*:f", ":[GWme]") and not apposition(\3, \4)
        -4>> =suggMasSing(\4, True)                                                                 # Accord de genre erroné : « \2 \3 » est masculin, « \4 » est féminin.
        <<- /gn/ morph(\3, ":[NA].*:[si]", ":G") and morph(\4, ":[NA].*:p", ":[GWsi]") and not apposition(\4, \4)
        -4>> =suggMasSing(\4)                                                                       # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au singulier.

TEST: le test très {{cons}} qu’on a passé hier.
TEST: c’était le chien {{perdue}} des voisins.
TEST: viens vite ou le pari {{imperdables}} sera moins facile…
TEST: Le bruit {{perçus}} par les voisins.
TEST: si le premier film est un triomphe, le deuxième est un demi-succès, et le troisième une déception.



__gn_la_1m__
    ,  la  *WORD
        <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -2>> le               # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p") -3>> =suggFemSing(\3)                  # Accord de nombre erroné : « \3 » devrait être au singulier.
................................................................................
__gn_aucun_1m__
    aucun  *WORD
        <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> aucune                              # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: aucun {{accords}} n’y changera rien.



__gn_aucune_1m__
    aucune  *WORD
        <<- /gn/ morph(\2, ":[NA].*:m", ":[efGW]") -1>> aucun                               # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggFemSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: aucune {{passions}} n’est digne qu’on meurt pour elle.























__gn_un_1m__
    un  *WORD
        <<- /gn/ morph(\2, ":[NA].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une                    # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.
................................................................................
TEST: un {{fromages}}.                                        ->> fromage
TEST: Un {{ballons}}                                          ->> ballon
TEST: Une {{cinglées}}                                        ->> cinglée
TEST: {{une}} des {{chats}}
TEST: {{une}} kyste                                           ->> un
TEST: {{une}} des {{joueurs}}
TEST: mille et une merveilles



## un / une
__gn_un_2m__
    un  *WORD  *WORD
        <<- /gn/ not value(<1, "|et|ou|d’|") and not \3.startswith("seul") >>>
        <<- /gn/ morph(\2, ":[NA].*:[me]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:f", "*") and not apposition(\2, \3)
................................................................................
        <<- /gn/ morph(\3, ":[NA].*:[pi]") and morph(\4, ":[NA].*:s", "*") and not apposition(\3, \4) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -4>> =suggPlur(\4)                                                                          # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au pluriel.

TEST: les pitres {{imbécile}}
TEST: il faut en convenir et les femmes {{oubliés}} seront satisfaites.
TEST: et les femmes {{retrouvés}} seront emmenées à l’hôpital.
TEST: les moins éloignées possible



__gn_leurs_1m__
    leurs  *WORD
        <<- /gn/ (morph(\2, ":[NA].*:s", ":(?:[ipGW]|[123][sp])") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]")))
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
................................................................................

TEST: Je connais nombre d’{{emmerdeur}} et aucun n’est pire que lui.


__gn_det_groupe_de_1m__
    [un|une|le|la|ce|cette|mon|ton|son|ma|ta|sa|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques]  [>centaine|>millier|>million|>milliard|>dizaine|>douzaine|>multitude|>horde]  [de|d’]  *WORD
        <<- /gn/ morph(\4, ":[NA].*:s", ":[ip]|>fraude/") or \4 in aREGULARPLURAL
        -4>> =suggPlur(\4)                                                                  # Avec \1 « \2 \3 \4 », mettre au pluriel “\4” s’il y en a bien plusieurs.

TEST: des centaines de {{bête}} à cornes passèrent devant nous.     ->> bêtes
TEST: une multitude d’{{homme}}                                     ->> hommes
TEST: les 80 milliards de fraude fiscale


## quelque adverbe
................................................................................
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ (morph(\2, ":[NA].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.
TEST: Il a abandonné neuf {{enfant}}.
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.

TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue


__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*

        <<- /gn/ not value(\2, "|Rois|Corinthiens|Thessaloniciens|") -2>> =suggSing(\2)     # Accord de nombre erroné : « \1 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N")
            and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|"))
            or \1 in aREGULARPLURAL )
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné : « \2 » devrait être au pluriel.

TEST: 00 heure, 01 heure
TEST: il a adopté 1 {{chiens}}.
TEST: 22 {{heure}}
TEST: 3 {{heure}}
TEST: les élèves sont inquiets après une année 2018 compliquée et riche en réformes.
TEST: ils gagneront 300 € maximum.




##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              # Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

................................................................................
        -2>> est                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez “est”.

TEST: où {{et}} cet ennemi ?
TEST: où {{et}} l’homme qui est passé ce matin ?
TEST: Je veux savoir où et quand, où et pouquoi.
TEST: où et avec qui ?





















# faim / fin
__conf_faim_fin__
    >avoir (>fin)
    [>rester|>demeurer] sur [ma|ta|sa|notre|votre|leur|leurs] (>fin)
        <<- /conf/ -1>> faim                                                # Confusion. Pour évoquer l’envie de se sustenter, écrivez “faim”.

................................................................................
TEST: à leur plus grand fils, ils ont offert une voiture.
TEST: ça va d’autonome à hautement dépendant
TEST: la pression entre les membres à un moment devient trop importante


__infi_de_verbe__
    [de|d’] [le|la|l’|leur|les]           @:V¬:[YNAM]|>(?:lui|plus)/
    [<start>|,]  [de|d’] [nous|vous|lui]  @:V¬[YE]|>(?:lui|plus)/
        <<- /infi/ \-1.islower() --1>> =suggVerbInfi(\-1)                               # Erreur probable. Après “de”, le verbe devrait être à l’infinitif.

    [de|d’] [ne|n’|en|me|m’|te|t’|se|s’|y]                                       @:V¬:Y|>(?:lui|plus)/
    [de|d’] [ne|n’]    [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  @:V¬:Y|>(?:lui|plus)/
    [de|d’] ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:V¬:Y
    [de|d’] ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:V¬:Y
    [de|d’] ?[ne|n’]¿  [lui|leur]                     en                         @:V¬:Y
        <<- /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)/")
            and not before("(?i)\\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)")
        -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: arrête d’y {{consacré}} autant de temps.
................................................................................
TEST: de me le {{facturez}}
TEST: Il s’agit de me {{donnait}} tout ça.
TEST: j’étais incapable de m’{{orientait}} dans la bonne direction.
TEST: ils étaient susceptibles de m’y {{trouvaient}}
TEST: Il tentait de {{raisonné}} en homme libre
TEST: sa façon de {{nettoyez}} était inefficace.
TEST: elle a délibérément omis de les {{inclurent}}.

TEST: elle s’engage de ne les lui donner qu’en dernier recours.
TEST: l’idée consiste de la lui donner sans contrepartie et voir ce qu’il en fera.
TEST: de leur plus grand fils, ils attendent beaucoup.
TEST: de n’importe quelle manière
TEST: un libéralisme trop « individualiste » s’est transformé en de supposées demandes de droits spécifiques
TEST: soit 40 % de plus comparé au quinquennat précédent
TEST: On passe de sophistiqué à classique.
TEST: Les « événements » d’il y a cinquante ans n’ont sans doute « rien à voir » avec le mouvement des « gilets jaunes »



__infi_y_verbe!3__
    y ~ée?s?$
        <<- /infi/ morph(\2, ":V", ":[123][sp]") -2>> _                                 # Le verbe ne devrait pas être un participe passé.

TEST: y {{mangée}} était un supplice
................................................................................
__infi_nous_vous_verbe__
    [nous|vous]  ~ée?s?$
        <<- /infi/ morph(\2, ":Q") and not morph(<1, "V0.*[12]p") -2>> _                 # Après “\1”, le verbe ne devrait pas être un participe passé.

TEST: Nous {{intéressé}} à la question ne suffit pas à faire de nous des experts.
TEST: nous {{ridiculisé}}
TEST: vous {{mangé}}
TEST: Sommes nous désespérés à ce point ?


__infi_devoir_savoir_pouvoir_interrogatif__
    /VCint  ?[pas|jamais]¿  ?[en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD
        <<- /infi/ morphVC(\1, ">(?:devoir|savoir|pouvoir|vouloir)/") and morph(\-1, ":(?:Q|A|[123][sp])", ":[GYW]")
        --1>> =suggVerbInfi(\-1)                                                        # Après “\1”, le verbe devrait être à l’infinitif.

................................................................................
    [ce|ça|ceci|cela|c’|ç’] >avoir été >seule               [que|qu’]
    [ce|ça|ceci|cela|c’|ç’] >avoir été @:[AQ].*:f¬:[GWYme]  @:N.*:f
        <<- %4>>

    [ce|ça|ceci|cela|c’|ç’] >être >seule                    [que|qu’]
    [ce|ça|ceci|cela|c’|ç’] >être @:[AQ].*:f¬:[GWYme]       @:N.*:f
        <<- %3>>




    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])               [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru]                                                                 [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler]) [devenu|redevenu|resté|demeuré]                                         [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || [être|devenir|redevenir|rester]                                                                                                  [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
................................................................................
TEST: tout sera {{dissoute}}
TEST: C’est donc seules que les deux femmes sont amenées à comparaître
TEST: C’eût été pure imagination.
TEST: Je n’arrêtais pas de me répéter que tout cela était peut-être pure imagination
TEST: La femme qui faisait ça est partie.
TEST: De cela a toujours été faite notre vie
TEST: Ce sont différents types de violences




__ppas_3sg_fem_verbe_état__
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])              [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru]                                                                [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler]) [devenue|redevenue|restée|demeurée]                                    [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿
................................................................................
TEST: celles-là imaginent être devenues légion


__ppas_avoir_été__
    >avoir  été  *WORD
        <<- /ppas/ morph(\3, ":[123]s", ":[GNAQWY]") -3>> =suggVerbPpas(\3)          # Après “avoir été”, il faut un participe passé.
        <<- /ppas/ not before("[çcCÇ]’$|[cC]e n’$|[çÇ]a (?:n’|)$") and not before("(?i)^ *ne pas ") and not morph(<1, ":Y") >>>
        <<- /ppas/ morph(\3, ":Y", ":A") -1:2>> _                                    # Tournure familière. Utilisez “être allé” plutôt que “avoir été”.
        <<- /ppas/ morph(\3, ":V1..t.*:Y", ":A") -3>> =suggVerbPpas(\3)              # Incohérence. Après “avoir été”, il faut un participe passé (à moins que “avoir été” signifie ici “être allé”).

TEST: j’ai été {{instruis}} par elle
TEST: avoir été {{prit}} par surprise
TEST: Ils {{ont été}} {{réaliser}} à partir d’éléments naturels.
TEST: J’{{ai été}} camper dans les Alpes.
TEST: Tu {{as été}} prendre du bois.
TEST: J’{{ai été}} {{chercher}} du pain.
TEST: Mon grand-père aurait été fier.
TEST: Ç’eût été prendre des vessies pour des lanternes.
TEST: C’eût été foncer tête baissée dans la gueule du loup.
TEST: Leur passe-temps, ça a été faire n’importe quoi.
TEST: Ne pas ressortir le livre le plus remarqué de la collaboration aurait été faire acte de censure.
TEST: Partir aurait été assurer sa survie.




!!!! Participes passés: accord en nombre avec la conjugaison de « être » (et équivalent)            !!

__ppas_être_accord_sing__
    (*WORD)      ?qui¿  ?[ne|n’]¿  ?[en|y]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])           @:[NA].*:p¬:[GMWYsi]
................................................................................
        || [être|devenir|redevenir|rester]                                                                              *WORD
    [<start>|,|@:Cs]  [un|le|ce|cet]                    (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]                                       *WORD
    [<start>|,|@:Cs]  [un|le|ce|cet]                    (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                                      *WORD
        <<- /ppas/ morph(\1, ":[NA].*:m", ":[GWfe]") and morph(\-1, ":A.*:f", ":[GWme]") and morph(\2, ":[123]s")
        --1>> =switchGender(\-1)                                                                    # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre.

    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])             *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                               *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]    *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
................................................................................
        || [être|devenir|redevenir|rester]                                                                              *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]                                       *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                                      *WORD
        <<- /ppas/ morph(\1, ":[NA].*:f", ":[GWme]") and morph(\-1, ":A.*:m", ":[GWfe]") and morph(\2, ":[123]s")
        --1>> =switchGender(\-1)                                                                    # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre.

    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])             *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                               *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]    *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
................................................................................
TEST: Le chien ne sera pas {{oubliés}}
TEST: les femmes sont vraiment {{partis}}                                         ->> parties
TEST: les hommes ne sont pas tout à fait {{fâché}}                                ->> fâchés
TEST: les enfants ne sont pas {{content}}
TEST: les réunions sans cesse reportées sont {{annulés}}
TEST: l’avenir de la région était {{suspendue}}
TEST: il prétendait que les banques universelles « à la française » s’{{était}} très honorablement comportées



__ppas_nom_propre_être_accord_genre__
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  [>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]            *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                            *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿
................................................................................
__immu_les_avoir_fait_vinfi__
    les >avoir fait ?[me|m’|te|t’|se|s’|nous|vous|leur]¿ @:Y
        <<- %3>>


__ppas_pronom_avoir__
    [je|j’|tu|il|elle|on|ils|elles|et|qui]  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
    <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
        and value(<1, "|<start>|,|comme|comment|et|lorsque|mais|où|ou|quand|qui|pourquoi|puisque|quoique|si|sinon|")
        and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    --1>> =suggVerbPpas(\-1, ":m:s")
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais








TEST: ils leur avaient {{donnés}} du fil à retordre.                                ->> donné
TEST: il a {{affronte}} une bande de voleurs de bétail                              ->> affronté
TEST: J’ai {{mettrai}} du sel.                                                      ->> mis
TEST: J’ai {{lut}} son journal.                                                     ->> lu
TEST: Si j’avais {{sut}}.                                                           ->> su
TEST: Il a {{prit}} le train.                                                       ->> pris
................................................................................
TEST: Il a {{donner}} sa vie pour elle.                                             ->> donné
TEST: Ils leur ont {{données}} un cadeau.                                           ->> donné
TEST: ils avaient, en ce temps-là, déjà {{perdus}} leurs illusions                  ->> perdu
TEST: Ils ont à plusieurs reprises {{perdus}} leur sang-froid.                      ->> perdu
TEST: Elle avait {{pose}} son tricot                                                ->> posé
TEST: qui ont {{refuse}} de se soumettre                                            ->> refusé
TEST: il a {{suffit}} de le pousser un peu                                          ->> suffi

TEST: Ils avaient barre sur lui.


__ppas_nous_vous_avoir__
    [nous|vous]  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
    <<- /ppas/ morph(\1, ":Os")
        and not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
................................................................................
        # Accord avec “l’” : 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: ils l’avaient {{retrouvés}}.
TEST: Vous l’avez {{trouvez}}.                                                    ->> trouvé
TEST: Nous l’avons {{mangés}}.
TEST: Nous l’avons {{mangées}}.
TEST: Ils ne me l’ont pas {{donnés}}



__ppas_m_t_avoir__
    [m’|t’] >avoir @:V[0-3]..t_.*:Q.*:p¬:[GWsi]
        <<- /ppas/ not before("(?i)\\bqu(?:e |’)") -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

................................................................................
        -2:3>> \2-elle                                                                              # Forme interrogative ? Mettez un trait d’union.

TEST: {{vient elle}} souvent ?
TEST: je ne comprenais pas pourquoi c’était elle qui était punie et que personne ne parlait de celui qui avait fait ça.
TEST: C’était elle qui avait pris le contrôle.


__inte_union_nous__
    [<start>|,]  ~ons$  nous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and morph(>1, ":|<end>|,", ":1p")
        -2:3>> \2-nous                                                                              # Forme interrogative ? Mettez un trait d’union.





    *WORD  ~ons$  nous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GNW]") and not morph(\1, ":Os") and morph(>1, ":|<end>|,", ":(?:Y|1p)")
        -2:3>> \2-nous                                                                              # Forme interrogative ? Mettez un trait d’union.

TEST: {{retrouverons nous}} enfin la tranquilité ?



__inte_union_vous__
    [<start>|,]  ~..e[zs]$  vous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and morph(>1, ":|<end>|,", ":2p")
        -2:3>> \2-vous                                                                              # Forme interrogative ? Mettez un trait d’union.

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

#### PARTICIPES PASSÉS APRÈS ÊTRE

__ppas_être__
    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é.




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

    >être  ~..ez$
................................................................................

TEST: Quiconque {{pensez}} s’en sortir se trompait lourdement.
TEST: Il voulut punir quiconque s’y {{adonnaient}}.
TEST: quiconque issu de la gauche n’a aucune chance.


__conj_ce_celui_celle_qui__



    [ce|celui|celle]  qui  @:V¬:(?:3s|P|Q|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                    # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.


TEST: Ce qui, la plupart du temps, {{donnes}} des maux de tête.
TEST: Ce qui {{fâchent}} mes amis.
TEST: celui qui {{pensent}} mal de toute chose



__conj_3sg_misc__
    [ça|chacun|chacune|ceci|cela|celui-ci|celui-l|celle-ci|celle-l|quelqu’un|quelqu’une]  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ not morph(<1, ":[VR]")


        -2>> =suggVerb(\2, ":3s")                               # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.


    [ça|chacun|chacune|ceci|cela|celui-ci|celui-l|celle-ci|celle-l|quelqu’un|quelqu’une]  qui  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                    # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.





    l’ [un|une]            @:V¬:(?:3s|P|Q|G|M|3p!)
    quelque chose          @:V¬:(?:3s|P|Q|G|M|3p!)
    n’importe [qui|quoi]   @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ not morph(<1, ":[VR]")
        --1>> =suggVerb(\-1, ":3s")                             # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
    quelque chose          qui  @:V¬:(?:3s|P|Q|G|3p!)
    n’importe [qui|quoi]   qui  @:V¬:(?:3s|P|Q|G|3p!)
        <<- /conj/ --1>> =suggVerb(\-1, ":3s")                  # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: chacun {{fais}} comme il peut
TEST: quelqu’un {{sauras}}
TEST: quelqu’une se {{montrent}} désagréable

TEST: n’importe quoi {{peux}} réussir
TEST: n’importe qui {{peux}} y arriver.
TEST: quelque chose {{sens}} mauvais ici
TEST: l’un d’eux {{viendras}}
TEST: ce {{dois}} être ennuyeux
TEST: ce {{seras}} foutu
TEST: mais ça ne vous {{aideras}} en rien
................................................................................
TEST: aucun ne {{vas}} là-bas
TEST: il ne faut rien faire ou rien dire contre les manifestants
TEST: qui n’ont rien appris et rien oublié
TEST: comme si son pays n’avait rien appris du fascisme ni rien reçu de l’Europe


__conj_nul_nulle__
    [nul|nulle]  ?qui¿  @:V¬:(?:3s|P|G|N.*:[si])
        <<- /conj/ morph(<1, ":C", ":(?:Y|P|Q|[123][sp]|R)")
        --1>> =suggVerb(\-1, ":3s")                                     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: nul ne {{sais}} que faire
TEST: nulle n’{{iras}} là-bas
TEST: nulle femme ne {{saurais}} le faire
TEST: nul homme ne {{sauras}} s’y prendre
TEST: nulle partie du corps ne peut être considérée comme le siège de l’âme.














__conj_vinfi_suj__
    [<start>|,]  @:Y  @:V¬:(?:3s|P|Q.*:[me]:[si]|Y|G|3p!|M)
        <<- /conj/ not (value(\2, "|croire|être|devenir|redevenir|voir|sembler|paraître|paraitre|sentir|rester|retrouver|") and morph(\3, ":A"))
        -3>> =suggVerb(\3, ":3s")                                       # Conjugaison erronée. Accord avec “\2”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
TEST: {{elles}} {{avance}} rapidement sur ce projet
TEST: {{Elles}} n’y {{comprenne}} rien
TEST: L’expérience sensible qu’il nous restera bientôt d’elles est à peu près
TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes.


__conj_ceux_celles_qui__
    [ceux|celles]  qui  @:V¬:(?:3p|P|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.





TEST: Ceux qui {{chante}} toute la journée…
TEST: Celles qui {{pense}}.


__conj_ceux_là_celles_ci__



    [ceux-ci|ceux-là|celles-ci|celles-là]  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p")     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.





    [ceux-ci|ceux-là|celles-ci|celles-là]  qui  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.


TEST: ceux-là {{devienne}} des ratés
TEST: celles-ci qui {{semble}} avoir tout pour réussir.


__conj_lesquels_lesquelles__
    [lesquels|lesquelles]  @:V¬:(?:3p|P|Y|Q|G|M)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p")     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: lesquels {{devienne}} des ennuyeux incomparables.
................................................................................
TEST: Des femmes de l’administration Obama y racontent qu’elles ont constaté qu’il leur arrivait régulièrement de ne pas être invitées
TEST: Macron président, c’est…


# 3pl
__conj_nom_propre_et_nom_propre__
    ~^[A-ZÉÈ]  et  ~^[A-ZÉÈ]  @:[123][sp]¬:(?:G|3p|P|Q.*:[pi])
        <<- /conj/ morph(\1, ":M") and morph(\3, ":M") and not morph(<1, ":R|>(?:des?|du|et|ou|ni)/")
        -4>> =suggVerb(\4, ":3p")                                                                   # Conjugaison erronée. Accord avec “\1 et \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Samantha et Eva {{viennes}} demain.
TEST: Samantha et Eva leur {{décrive}} une leçon.




# on / ont
__conf_ont!6__
    ils  on
    [eux|ceux|elles|celles]  qui  on
        <<- /conf/ --1>> ont                                    # Confusion probable : “on” est un pronom personnel. Pour la conjugaison du verbe “avoir”, écrivez “ont”.
................................................................................
    [je|j’|tu|il|elle|on|ils|nous|vous|elle|elles]  >avoir  @:V.......e_.*:Q
        <<- /conf/ -2>> _                                                       # Incohérence. La forme verbale “\3” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.

TEST: {{Ait-il}} arrivé à ses fins ?
TEST: je n’{{avais}} pas parti avec eux.
TEST: il {{avait}} parti.
TEST: Avais-je partie liée avec lui ?



!!
!!
!!!! Modes verbaux                                                                                !!
!!
!!
................................................................................
!!
!!
!!

!!! À trier                                                                                       !!

TODO: Il faut au préalable avoir {{définit}} un protocole.
TODO: Il y a quatre cents {{mot}} dans la phrase.
TODO: Ma mémoire a aussi été {{effacé}}.
TODO: Vous la {{voulait}}
TODO: un délire systématisé de persécution basé sur des interprétations
TODO: Soudain, surgit l’un des ouvriers…
TODO: Ainsi périt l’inconstant.
TODO: puis repartit.
TODO: Les créatures de l’enfer que nous avions rencontrées…
TODO: Étaient-ils vraiment frère et sœur
TODO: Cela fait des années qu’elle n’a pas donné signe de vie.
TODO: Et si je te donne son nom, cela t’aiderait, Dworkin ?
TODO: cet être que personne n’a vu ni senti à part elle
TODO: Ce qu’ils sont influence leur regard sur moi.
TODO: Ils sont âgés de 4 et 1 ans.
TODO: Mille neuf cent quatre-vingt. (dépend du contexte)
TODO: Le CAPES de mathématiques.
TODO: La Mustang est une voiture.
TODO: Il faut se bien connaître soi-même.
TODO: C’est lui ou moi qui a gagné.
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.
TODO: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.
TODO: Les côtes sont dans leur ensemble extrêmement découpées.


!!! Indécidable                                                                                   !!
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests                                                                                  !!
TEST: Ça a l’air de t’aller.
................................................................................
TEST: En 1944, au sortir des deux guerres ayant ravagé l’Europe, le CNR (conseil national de la résistance) avait bien mesuré les tenants et les aboutissants, c’est-à-dire les causes et les conséquences du ravage des inégalités et du jusqu’au boutisme de l’auto-défense d’une caste pour préserver ses acquis.
TEST: Ceux de l’Université sont plus perfectionnés
TEST: Celles de l’Institut sont plus perfectionnées
TEST: Judith A. Allan a aussi constaté que les études sur les crises de la masculinité ne proposent pas ou que très rarement d’indicateurs pour déterminer si une société est (trop) féminisée et si les hommes sont (réellement) en crise.
TEST: une procédure abusive pour fermer la porte qu’elles ont essayé d’ouvrir
TEST: En France, les hauts fonctionnaires gagnent en moyenne 7850 euros net
TEST: Il faut avoir du pouvoir et des ressources










!!! Tests historiques                                                                             !!

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.

................................................................................
TEST: Quand elle fut endormie :
TEST: — Votre mari n’a plus besoin de cinq mille francs ! Vous allez donc oublier que vous avez prié votre cousin de vous les prêter, et, s’il vous parle de cela, vous ne comprendrez pas.
TEST: Puis il la réveilla. Je tirai de ma poche un portefeuille :
TEST: — Voici, ma chère cousine, ce que vous m’avez demandé ce matin.
TEST: Elle fut tellement surprise que je n’osai pas insister. J’essayai cependant de ranimer sa mémoire, mais elle nia avec force, crut que je me moquais d’elle, et faillit, à la fin, se fâcher.
TEST: Voilà ! je viens de rentrer ; et je n’ai pu déjeuner, tant cette expérience m’a bouleversé.
TEST: 19 juillet. — Beaucoup de personnes à qui j’ai raconté cette aventure se sont moquées de moi. Je ne sais plus que penser. Le sage dit : Peut-être ?
TEST: 21 juillet. — J’{{ai été}} dîner à Bougival, puis j’ai passé la soirée au bal des canotiers. Décidément, tout dépend des lieux et des milieux.
TEST: Croire au surnaturel dans l’île de la Grenouillère, serait le comble de la folie… mais au sommet du mont Saint-Michel ?… mais dans les Indes ?
TEST: Nous subissons effroyablement l’influence de ce qui nous entoure. Je rentrerai chez moi la semaine prochaine.
TEST: 30 juillet. — Je suis revenu dans ma maison depuis hier. Tout va bien.
TEST: 2 août. — Rien de nouveau ; il fait un temps superbe. Je passe mes journées à regarder couler la Seine.
TEST: 4 août. — Querelles parmi mes domestiques. Ils prétendent qu’on casse les verres, la nuit, dans les armoires.
TEST: Le valet de chambre accuse la cuisinière, qui accuse la lingère, qui accuse les deux autres. Quel est le coupable ? Bien fin qui le dirait !
TEST: 6 août. — Cette fois, je ne suis pas fou. J’ai vu… j’ai vu… j’ai vu !… Je ne puis plus douter… j’ai vu !… J’ai encore froid jusque dans les ongles… j’ai encore peur jusque dans les moelles… j’ai vu !…







|







 







|







>







 







|







 







|




>
>
>
>









>
>







 







|







 







>







 







>
>
>
>







 







|



>
>
>
>







 







>
>
>
>
>
>
>







 







|
|







 







|
|
|
|
|
|
|







 







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







>







 







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







 







|



|





>







 







|


>
>







 







>







 







|







 







>







 







|







 







>







 







>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>







 







|







 







>







 







>
>
>
>







>







 







|
|
|
>

|
<
>







 







|







 







>








>
|




>












>
>
>
>
>
>
>
>







 







|







 







>







 







>







 







>
>
>
>







 







>
>







 







>

>











>







 







>













>








|







 







|


>
>







 







>



|







 







>




|
|
|
|

>







 







|
|








|
|
|




|







 







>
>
>
>







 







|









>







 







>
>








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







 







>







 







>







 







|







 







|
|
|
>







>
|


|










>
>







 







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







 







|









>
>
>


|







 







>








>







 







|







 







>
>
>







 







>
>







 







|
|













>







 







|







 







|







 







>







 







|
|
|
|
|
>
>
>
>
>
>
>







 







>







 







>







 







|




>
>
>
>





>







 







>
>
>







 







>
>
>
|

>




>



|
|
>
>
|
>

|
|
>
>
>
>







 







>







 







|
|


|
|
|
|

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







 







|


>
>
>
>

|



>
>
>
|

>

>
>
>
|

>


|







 







|
|



>
>







 







>







 







<
<








<
<



<








<







 







>
>
>
>
>
>
>
>







 







|







737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
....
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
....
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
....
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
....
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
....
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
....
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
....
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
....
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
....
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
....
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
....
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
....
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
....
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
....
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
....
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
....
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
....
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
....
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
....
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
....
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
....
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
....
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
....
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
....
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328

8329
8330
8331
8332
8333
8334
8335
8336
....
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
....
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
....
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
....
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
.....
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
.....
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
.....
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
.....
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
.....
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
.....
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
.....
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
.....
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
.....
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482
11483
.....
11616
11617
11618
11619
11620
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631
11632
11633
.....
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
.....
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953
.....
11978
11979
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11990
11991
11992
.....
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
.....
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
.....
12677
12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
.....
14447
14448
14449
14450
14451
14452
14453
14454
14455
14456
14457
14458
14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
.....
15410
15411
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424
15425
15426
15427
15428
15429
15430
15431
15432
15433
15434
15435
15436
15437
15438
15439
.....
15442
15443
15444
15445
15446
15447
15448
15449
15450
15451
15452
15453
15454
15455
15456
15457
15458
15459
15460
15461
15462
15463
15464
15465
.....
15497
15498
15499
15500
15501
15502
15503
15504
15505
15506
15507
15508
15509
15510
15511
.....
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
.....
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
.....
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
.....
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
.....
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
.....
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
.....
17363
17364
17365
17366
17367
17368
17369
17370
17371
17372
17373
17374
17375
17376
17377
17378
17379
17380
17381
17382
17383
17384
17385
17386
17387
17388
.....
17389
17390
17391
17392
17393
17394
17395
17396
17397
17398
17399
17400
17401
17402
17403
.....
17468
17469
17470
17471
17472
17473
17474
17475
17476
17477
17478
17479
17480
17481
17482
.....
18798
18799
18800
18801
18802
18803
18804
18805
18806
18807
18808
18809
18810
18811
18812
18813
18814
18815
18816
18817
18818
18819
18820
18821
18822
18823
18824
18825
18826
.....
19002
19003
19004
19005
19006
19007
19008
19009
19010
19011
19012
19013
19014
19015
19016
19017
19018
.....
19106
19107
19108
19109
19110
19111
19112
19113
19114
19115
19116
19117
19118
19119
19120
19121
19122
19123
19124
19125
19126
19127
19128
19129
19130
19131
19132
19133
19134
19135
19136
19137
19138
19139
19140
19141
19142
19143
19144
19145
19146
.....
19148
19149
19150
19151
19152
19153
19154
19155
19156
19157
19158
19159
19160
19161
19162
.....
19224
19225
19226
19227
19228
19229
19230
19231
19232
19233
19234
19235
19236
19237
19238
19239
19240
19241
19242
19243
19244
19245
19246
19247
19248
19249
19250
19251
19252
19253
19254
19255
19256
19257
19258
.....
19413
19414
19415
19416
19417
19418
19419
19420
19421
19422
19423
19424
19425
19426
19427
19428
19429
19430
19431
19432
19433
19434
19435
19436
19437
19438
19439
19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
.....
19662
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
19680
19681
19682
.....
19834
19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
.....
20159
20160
20161
20162
20163
20164
20165


20166
20167
20168
20169
20170
20171
20172
20173


20174
20175
20176

20177
20178
20179
20180
20181
20182
20183
20184

20185
20186
20187
20188
20189
20190
20191
.....
20259
20260
20261
20262
20263
20264
20265
20266
20267
20268
20269
20270
20271
20272
20273
20274
20275
20276
20277
20278
20279
20280
.....
23267
23268
23269
23270
23271
23272
23273
23274
23275
23276
23277
23278
23279
23280
23281

!!
!!
!!!! Ponctuation de fin de paragraphe                                                             !!
!!
!!

__[i>/poncfin(poncfin_règle1)__
    ({w_1}) *$  @@0
    <<- before("\\w+(?:\\.|[   ][!?]) +(?:[A-ZÉÈÎ]\\w+|[ÀÔ])") -1>> \1.|\1 !|\1 ?                   # Il semble manquer une ponctuation finale (s’il s’agit d’un titre, le point final n’est pas requis).

TEST: __poncfin__ Vraiment. Quel {{ennui}}
TEST: Internet : le nouvel eldorado
TEST: OMC-FMI : Les nouveaux maîtres du monde

................................................................................
    # Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447
__[i>/virg(virgule_manquante_avant_mais)__
    ({w_1})( mais)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on)\b)  @@0,$
    <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais
    # Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445
__[i>/virg(virgule_manquante_avant_donc)__
    ({w_1})( donc)(?= (?:j[e’]|tu|ils?|elles?|on)\b)  @@0,$
    <<- not morph(\1, ":[VG]") -2>> , donc
    # Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448

TEST: Un chien, un chat{{ etc.}}                                            ->> , etc.
TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit.                   ->> , car
TEST: Je suis fatigué{{ mais}} il a joué toute la nuit.                     ->> , mais
TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire.              ->> , donc
TEST: il s’est donc tu
TEST: Chacun peut l’entendre d’une manière différente et donc on se demande bien ce qui est mesuré dans les réponses.


__<s>/virg(virgule_point_fin_dialogue)__
    ([.] » )[a-zéà]  @@0 <<- -1>> " », | » "             # Ou il faut une virgule (exemple : « Je viens », dit-il). Ou le point est superflu. Ou il faut une majuscule sur le mot suivant.
__<s>/virg(virgule_fin_dialogue)__
    (, »,? )[a-zéà]  @@0 <<- -1>> " », | » "                                            # Virgule mal placée ou superflue.

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

    [des|chaque|quelque|quelques|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs|aucun|aucune]  *WORD
        <<- =>> exclude(\2, ":V")

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

    [une|le|la|les|des|chaque|quelque|quelques|cet|cette|ces|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs] personne
        <<- =>> select(\-1, ":N")

    de  [la|l’]  @:¬:Y
        <<- =>> exclude(\3, ":V")

................................................................................
    en tant que  *WORD
        <<- =>> exclude(\4, ":[123][sp]")

    en peine
        <<- =>> exclude(\2, ":V")

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

    plein  [de|d’]  @:[AN]
        <<- not morph(<1, ":V0e") =>> =define(\1, [":G"])

    tout feu ?,¿ tout >flamme
        <<- ~>> ␣
        <<- =>> define(\1, [":A:e:i"])

    très  *WORD
        <<- =>> exclude(\2, ":[123][sp]")

TEST: il s’agit d’{{un}} {{anagramme}}
TEST: nul ne sait qui arriva à ce pauvre Paul surpris par la pluie.
TEST: elle finit par être très fière de son fils.
TEST: en tant que président du conseil
TEST: les bac +2 sont trop nombreux.
TEST: c’est à n’y plus rien comprendre.
TEST: Elle était tout feu, tout flamme.
TEST: Ses rencards finissent par devenir lassants



!!!
!!!
!!! Étiquettes                                                                                    !!
!!!
................................................................................
TEST: {{attaquant-ils}}                                     ->> attaquent-ils
TEST: {{prendrons-elles}} un verre avec moi ?


__inte_verbes_composés_interrogatifs_impératifs__
    ~\w-[nN]ous$
        <<- /inte/ morphVC(\1, ":V", ":(?:1p|E:2[sp])") ->> =suggVerb(\1, ":1p", None, True)          # Forme interrogative ou impérative incorrecte.
        <<- /inte/ __else__ and morphVC(\1, ":", ":V|>(?:chez|malgré)/") ->> =suggSimil(\1, ":1p", False, True)  # Forme interrogative ou impérative incorrecte.
        <<- />> -nous|VCint

    ~\w-[vV]ous$
        <<- /inte/ morphVC(\1, ":V", ":2p") ->> =suggVerb(\1, ":2p", None, True)                      # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel.
        <<- /inte/ __else__ and morphVC(\1, ":", ":V|>chez/") ->> =suggSimil(\1, ":2p", False, True)  # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel.
        <<- />> -vous|VCint

................................................................................
TEST: {{Prendront-nous}}                                    ->> Prendrons-nous
TEST: {{Attendront-nous}} le train                          ->> Attendrons-nous
TEST: {{Attaquait-vous}}                                    ->> Attaquiez-vous
TEST: Elle a de nombreux rendez-vous ce matin.
TEST: êtes-vous là ?
TEST: C’est notre chez-nous.
TEST: Dans votre chez-vous, faites comme bon vous semble.
TEST: Libérée en grande majorité durant l’automne 1945, une partie des « Malgré-nous » passe pourtant plusieurs années supplémentaires en captivité.


__inte_rendez_vous__
    ne [le|la|les] [lui|leur]   rendez-vous
    ne me [le|la|les]           rendez-vous
    ne [lui|leur] en            rendez-vous
    ne [le|la|les|lui|leur]     rendez-vous
................................................................................

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


__immunités__
    il y a
    il n’ y a
        <<- %-1>>

    à l’ arrache
        <<- %3>>

    à ce point
    en tout point
        <<- %3>>

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

TEST: des {{franco américains}}
TEST: {{franco américaine}}                             ->> franco-américaine
TEST: l’{{israélo belge}}


__tu_préfixe_xxxo__
    [macro|magnéto|micro|paléo|rétro|rhino|stéréo]  *WORD
        <<- /tu/ analyse_with_next(\1, "-", ":")
        ->> \1-\2                                                                                   # S’il s’agit d’un seul mot, il manque un trait d’union.

    [électro|ferro|hydro|labio|médico|nano|néo|neuro|physico|politico|sino|socio]  *WORD
        <<- /tu/ space_after(\1, 1, 1) and (morph(\2, ":N") or analyse_with_next(\1, "-", ":"))
        ->> \1-\2                                                                                   # S’il s’agit d’un seul mot, il manque un trait d’union.

TEST: {{ferro électrique}}                              ->> ferro-électrique
TEST: {{rétro ingénierie}}.                             ->> rétro-ingénierie


__tu_préfixe_divers__
    [anti|auto|arrière|avant|demi|extra|intra|multi|post]  *WORD
        <<- /tu/ (morph(<1, ":D|<start>") or value(<1, "|l’|d’|")) and analyse_with_next(\1, "-", ":")
................................................................................

    quelques [un|uns|une|unes]
        <<- /tu/ ->> quelques-\2                                # Il manque un trait d’union.

    [plus|moins] [value|values]
        <<- /tu/ ->> \1-\2                                      # Il manque un trait d’union.

    ras le bol
        <<- /tu/ morph(<1, ":D") ->> ras-le-bol                 # Il manque des traits d’union.

    ras-le bol
    ras le-bol
        <<- /tu/ ->> ras-le-bol                                 # Il manque un trait d’union.

    rez de >chaussée
        <<- /tu/ ->> rez-de-chaussée                            # Il manque un trait d’union.

    science fiction
        <<- /tu/ ->> science-fiction                            # Il manque un trait d’union.

    stock >option
................................................................................
        <<- /conf/ not \1.isupper() and not \2.isupper()
        -2>> =suggSimil(\2, ":[NA].*:[pi]", True)                                                   # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

    [quels|quelles] [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on]
        <<- /conf/ not \1.isupper() and not \2.isupper() and not value(<1, "|tels|telles|")
        -2>> =suggSimil(\2, ":[NA].*:[pi]", True)                                                   # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

    des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on|ceux|celles|celui|celle]
        <<- /conf/ not \1.isupper() and not \2.isupper() -2>> =suggSimil(\2, ":[NA].*:[pi]", True)  # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
        <<- /conf/ __also__ -1>> de                                                                 # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

TEST: {{Ces}} {{cette}} canaille qui nous a donné tant de fil à retordre.
TEST: Mon {{il}} est une merveille.
TEST: je ne sais {{des}} {{ses}} choses.


................................................................................
    on  [ne|n’]    [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:¬:(?:V|Ov)
    on  ?[ne|n’]¿  [lui|leur]                     en                         @:¬:(?:V|Ov)
        <<- /conf/ not morph(<1, ":3s") and not value(<1, "|n’|m’|t’|s’|")
        --1>> =suggSimil(\-1, ":(?:3s|Ov)", False)                                                  # Incohérence avec “\1” : “\-1” devrait être un verbe, un pronom objet, un adverbe de négation, etc.

TEST: on {{et}} parti.
TEST: on nous {{et}} indispensable.
TEST: on ne {{travail}} pas le week-end.
TEST: on m’{{arête}} encore une fois avec une impudence insupportable.
TEST: on n’y {{pas}} beaucoup d’entente entre eux.
TEST: on est normal de ne presque pas payer des gens qui effectuent un travail
TEST: on s’en va.


__conj_ce__
    [ce|c’]             @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:N|A|3s|P|Q|Ov)
    [ce|c’]  [ne|n’]    @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:3s|P|Ov)
        <<- /conj/ --1>> =suggVerb(\-1, ":3s")                                                      # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
TEST: elle {{c’}}en était trop vanté
TEST: cet homme, perdu dans ses pensées, allait {{c’}}en faire du souci.
TEST: il {{c’}}accoutumait à sa nouvelle fonction.
TEST: elle {{c’}}anime dès qu’on fait du bruit.
TEST: {{s’}}{{avait}} fonctionné
TEST: c’était merveilleux.


__conf_ce_qui_verbe__
    ce qui  ?[lui|leur|leurs|nous|vous]¿  (et)  ?@:[WX]¿  ?@:[WX]¿  @:(?:[AQD]|V1.*:Y)
        <<- -1>> est                                                            # Confusion probable : “et” est une conjonction de coordination. Pour le verbe “être”, écrivez “est”.

    ce qui  ?[lui|leur|leurs|nous|vous]¿  (étai)  ?@:[WX]¿  ?@:[WX]¿  @:(?:[AQD]|V1.*:Y)
        <<- -1>> était                                                          # Confusion probable : “étai” est un nom commun. Pour le verbe “être”, écrivez “était”.

TEST: ce qui {{et}} beau.
TEST: ce qui {{étai}} notre lot.
TEST: ce qui lui {{étai}} propre
TEST: ce qui nous {{et}} pas vraiment utile


__conj_mieux_vaut__
    mieux  ?[ne|n’]¿  [vaux|valais|valus|vaudras|vaudrais]
        <<- /conj/ --1>> =\-1[:-1]+"t"                                                              # Conjugaison erronée. Accord avec “mieux” : utilisez la 3ᵉ personne du singulier.

TEST: avec toi qui ne sais rien de rien, mieux {{vaux}} ne rien dire.
TEST: Mais là-bas mieux {{valais}} ouvrir sa gueule que se taire.



## 1pl
__conj_nous__
    <start>  nous  @:V¬:(?:G|Y|P|1p|3[sp])
        <<- /conj/ not value(>1, "|je|tu|il|elle|on|nous|vous|ils|elles|")
        -3>> =suggVerb(\3, ":1p")                                                                   # Conjugaison erronée. Accord avec “nous”. Le verbe devrait être à la 1ʳᵉ personne du pluriel.
................................................................................
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: mes supérieurs et moi-même avons pris la décision de ne pas vendre
TEST: Ni lui ni moi n’avions mangé
TEST: Mon épouse et moi-même avons toujours dit
TEST: que vous ou moi ignorions à peu près tout du boson de Higgs n’a pas du tout le même sens


# Confusion futur / conditionnel
__vmode_je_futur__
    <start>  ([demain|oui|non])  ?,¿  [je|j’]  ?[ne|n’]¿  ?y¿  (*WORD)  ?@:[WX]¿  ?@:[WX]¿  <end>
    <start>  ([demain|oui|non])  ?,¿  [je|j’]  ?[ne|n’]¿  ?y¿  (*WORD)  ?@:[WX]¿  ?@:[WX]¿
        || [le|la|l’|les|un|une|des|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leur|leurs|quelques|plusieurs|certains|certaines]  *WORD  <end>
        <<- /vmode/ morph(\2, ":K:1s", ">(?:aimer|vouloir)/") -2>> =\2[:-1]
        # Confusion possible. Le mot “\1” semble indiquer une certitude. Dans ce cas, “\2” devrait être conjugué au futur, non au conditionnel.

TEST: demain, je {{viendrais}}                                                          ->> viendrai
TEST: non, je n’{{irais}} pas là-bas !                                                  ->> irai
TEST: oui, j’y {{penserais}}…                                                           ->> penserai
TEST: oui, je le voudrais.
TEST: oui, je l’aimerais.
TEST: oui, je la prendrais pour femme si ça ne tenait qu’à moi.



!!
!!
!!!! Confusions générales                                                                         !!
!!
!!

................................................................................
TEST: elle n’{{en n’}}avait plus pour longtemps.        ->> "en "
TEST: toute chose pourrait finalement advenir indifféremment en n’importe quel point du globe


#### Divers
__ppas_lui_verbe__
    lui  ~é(?:es?|s)$
        <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":(?:V0a|R)")
        -2>> =suggVerbInfi(\2)+"|"+suggVerbPpas(\2, ":m:s")                                         # Incohérence probable. Soit il faut un participe passé masculin singulier, soit un verbe à l’infinitif.

    lui aussi ~é(?:es?|s)$
        <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":(?:V0a|R)") -2>> =suggVerbPpas(\2, ":m:s")         # Incohérence probable. Il faut vraisemblement un participe passé masculin singulier.

TEST: lui {{mangée}} beaucoup.
TEST: L’homme qui s’approchait de lui voulait le surprendre.
TEST: avec Paul, lui aussi éliminé.
TEST: les études qu’il a lui terminées avec bien du mal.
TEST: cette déclaration fut selon lui rédigée par des imbéciles.


__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tag_before(\1, "ce_que") 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.
................................................................................

    à été
        <<- /conf/ -1>> a                                           # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    qui  à  @:Q¬:M
        <<- /conf/ \3.islower() -2>> a                              # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    qui  [lui|nous|vous|y]  à
        <<- /conf/ -3>> a                                           # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    [leur|leurs] à
        <<- /conf/ not morph(<1, ":D") --1>> a                      # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”.

    à  le  @:[NAQ].*:[me]¬:(?:Y|Oo)
        <<- /conf/ -1:2>> a le|au
        # Confusion. Ou vous confondez “à” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.

    à  le  @:[NAQ].*:f¬:(?:Y|Oo)
        <<- /conf/ -1:2>> à la|a la
................................................................................
TEST: Ce chien, croyons-nous savoir, {{à le}} maître le plus violent qui soit.
TEST: L’homme {{à}} ouvert la boîte.
TEST: Il ne nous reste plus qu’{{à}} {{vérifié}} si votre maquette.
TEST: Je veux {{à}} {{mangé}}.
TEST: Ne pas hésiter {{à}} {{demandé}} des conseils.
TEST: cette femme, dans son délire, {{à}} {{jetez}} son argent à la poubelle.
TEST: Ce que cet homme à {{devient}} aujourd’hui notre problème
TEST: le peuple leur {{à}} donner tort
TEST: il en a.
TEST: elle en a.
TEST: celle qui à contrario nous a foutu dans la merde.
TEST: ceux qui à Somewhere se sont si mal illustrés.
TEST: en à peine vingt ans


................................................................................
    a haut risque
    a hue et à dia
    a huis clos
    a intervalles [réguliers|irréguliers]
    a juste [raison|titre]
    a l’ heure actuelle
    a l’ heure qu’ il est
    a l’ [accoutumée|amiable|arrache|avance|avenir|avenant|aveuglette|emporte-pièce|évidence|extérieur|improviste|intérieur|inverse]
    a l’ air libre
    a l’ exclusion de toute autre chose
    a l’ ordre du jour
    a l’ œil nu
    a l’ en croire
    a l’ unanimité
    a l’ un d’ entre eux
................................................................................
__conf_à_substantifs__
    >arc a >poulie
    >arme a >feu
    >bombe a [eau|fragmentation|retardement]
    [>canne|>cane] a [>pêche|>sucre]
    >caisse a >outil
    >chair a [pâté|>canon]
    >couteau a cran d’ arrêt
    >crayon a [lèvres|sourcils]
    >cuillère a [café|soupe]
    >fard a paupières
    [>fille|fils] a [papa|maman]
    >gaz a effet de serre
    >lime a >ongle
    >machine a [café|coudre|laver]
................................................................................
TEST: on va y arriver, {{au temps que faire se peu}}…
TEST: autant que faire se peut, il faut éviter la confusion entre ces deux discours.


# ça / çà / sa
__conf_ça_çà_sa__
    ça  @:[NAQ].*:f¬:(?:G|P|[123][sp])|>seule?s?/
        <<- /conf/ not morph(<1, ">appeler/") -1>> sa                           # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa  @:G¬>(?:tr(?:ès|op)|peu|bien|plus|moins|toute|presque)/|:[NAQ].*:f
        <<- /conf/ not (\2 == "ou" and value(>1, "|son|ses|")) -1>> ça          # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa [n’|m’|t’|s’|j’|l’|d’|qu’|lorsqu’|puisqu’|quoiqu’]
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

................................................................................
TEST: et {{sa}} par deux fois
TEST: Il trouva de la nourriture {{ça et là}}.                                ->> çà et là
TEST: Elle parle comme {{ça}} mère.                                           ->> sa
TEST: C’est comme {{sa}}.
TEST: {{sa}} l’ennuierait, ce fils de pute, de dire bonjour ?
TEST: il faut s’y prendre comme {{sa}}
TEST: on fait {{sa}} lorsqu’on a tout perdu
TEST: Eux, ils appellent ça routine.
TEST: avec sa presque belle-mère
TEST: sa toute nouvelle application de synchronisation de fichiers
TEST: communiquer avec sa ou son partenaire.


# Campagne / compagne
__conf_campagne_compagne__
................................................................................
TEST: Ils sont pas si {{différends}} de nous.
TEST: Cette fois, il parla avec un ton différent.
TEST: J’en veux un différent.
TEST: Il en veut des différents.
TEST: dans ses différents ouvrages
TEST: dans ses différents postes gouvernementaux


# dites / dîtes
__conf_dites_dîtes__
    *WORD  dîtes  @:A¬:G
        <<- /conf/ morph(\1, ":[NA].*:[fe]:[pi]", ":G") -2>> dites      # Confusion probable : “dîtes” est une forme verbale de dire au subjonctif. Pour l’ajectif, écrivez “dites”.

TEST: Des armes {{dîtes}} létales.                                          ->> dites
TEST: usage débridé des armes dites létales
TEST: Vous dîtes “idiotes”, je dis “originales”.


# dû / du
__ppas_dû_du__
    du  [à|a|au|aux]
        <<- /ppas/ \2.islower() -1>> dû                         # Confusion. Ce qui est dû.

    [mon|notre|votre]  du
................................................................................
# en / an
__être_en_xxxx__
    [>être|>rester|>demeurer] an [contradiction|désaccord|accord]
        <<- /conf/ -2>> en                                                                          # Confusion. Un an = une année. Pour la préposition, écrivez “en”.

TEST: Je suis {{an}} désaccord avec lui.


# en dessous
__conf_dessus_dessous__
    en dessus
    en-dessus
        <<- ->> en dessous|au-dessus                            # Confusion.|https://fr.wiktionary.org/wiki/en_dessous

TEST: Il est {{en dessus}} de tout.


# en général
__conf_en_général__
    en générale
        <<- /conf/ ->> en général                               # Dans cette locution, “général” est toujours au masculin singulier.|https://fr.wiktionary.org/wiki/en_g%C3%A9n%C3%A9ral

TEST: On n’en sait {{en générale}} pas assez.
................................................................................
        <<- /conf/ not morph(<1, ":[VR]|<start>") and not morph(>1, ":(?:3s|Ov)")
        -2>> ont                                                    # Confusion probable. Exemples : « on y va », « ils ont faim ».

    ~-ont$
        <<- /conf/ ->> =\1[:-1]                                     # Incohérence : “ont” est une forme conjuguée du verbe “avoir” (par exemple: “ils ont”). Pour le pronom personnel, écrivez “on”.

    [<start>|,]  *WORD  ont
        <<- /conf/ space_after(\2, 1, 1) and not value(\2, "|soit|") and morph(\2, ":3s") -2:3>> \2-on
        # Confusion probable : “ont” est une forme conjuguée du verbe “avoir”. Pour le pronom personnel, écrivez “on” et mettez un trait d’union puisqu’il s’agit d’une question.

TEST: {{ont}} m’assure qu’il n’y en a pas.
TEST: {{Ont}} n’arrive pas à s’en sortir.
TEST: {{Ont}} ne sait jamais quoi faire
TEST: si {{ont}} donne à ces gens, ça n’en finit plus.
TEST: {{Ont}} viens !
................................................................................
TEST: comme ce que l’{{ont}} {{voit}} dans le lien entre polygynie et guerre.
TEST: Tout à fait, {{ont}} peut même dire qu’à l’adolescence, ce sont les problèmes de l’enfance qui ressortent.
TEST: les politiques de l’offre ont échoué.
TEST: qui on blâme, ce soir ?
TEST: qui n’ont somme toute que le désir de vivre paisiblement
TEST: ces textes, quoi qu’on en pense, ont force de loi.
TEST: s’ils n’ont ne serait-ce qu’un peu de jugeotte, on ne les reverra plus.
TEST: En français, la plupart des noms de métier traditionnellement masculins soit ne disposent pas d’une forme féminine, soit ont des formes féminines anciennes tombées en désuétude.


# ou / où
__conf_où_ou__
    <start>  Ou  @:3[sp]¬:Y
        <<- /conf/ -2>> Où                                  # Confusion probable. La conjonction “ou” signale une alternative. Utilisez “où” pour “en quel lieu”.

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

    à la >seconde [>prêt|>pré]
        <<- /conf/ -3>> près                                                # Confusion probable. Locution “à la \2 près”.

    au >mètre [>prêt|>pré]
        <<- /conf/ -3>> près                                                # Confusion probable. Locution “au \2 près”.

    à [ceci|cela] ([prêt|prêts]) [que|qu’]
    , à [ceci|cela] ([prêt|prêts]) ,
        <<- /conf/ -1>> près                                                # Confusion probable. Locution “à \2 près”.|https://fr.wiktionary.org/wiki/%C3%A0_cela_pr%C3%A8s

TEST: depuis {{prêt}} de 15 ans
TEST: ils se sont approchés très {{prêts}}.
TEST: Je suis si {{prêt}} d’y arriver.
TEST: Elle est si {{prêt}} de la trouver.
TEST: Il est {{près}} à les aider
TEST: Elle va regarder ça de plus {{prêt}}.
TEST: Il était rasé de {{prés}}
TEST: Il est un peu fantasque ; mais, à cela {{prêt}}, c’est un aimable homme.
TEST: Il a obtenu un prêt de Patrick
TEST: Il a obtenu un prêt de Le Drian
TEST: collait au millimètre près à la réalité


# puits / puis
__conf_puits_puis__
................................................................................
TEST: un immonde {{vert}} de terre
TEST: Un {{ver}} de bière fraîche.
TEST: ce {{vert}} quoi nous allons, c’est une catastrophe à l’échelle planétaire.


# voix / voie / vois / voit
__conf_voie_voix_vois_voit__
    à haute [>voie|vois|voit]
    de vive [>voie|vois|voit]
    à portée de [>voie|vois|voit]
        <<- /conf/ --1>> voix       # Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|http://fr.wiktionary.org/wiki/voix

    à [>voie|vois|voit] [basse|haute|basses|hautes]

        <<- /conf/ -2>> voix        # Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|http://fr.wiktionary.org/wiki/voix

    sur la bonne voix
        <<- /conf/ -4>> voie        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie

    >ouvrir la voix [à|au|aux]
        <<- /conf/ -3>> voie        # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie

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

# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|vouloir|préférer|faire|de|à)/")
            and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voire                      # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez “voire”.|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire
................................................................................
TEST: l’immobilier a été ces dernières années l’investissement le plus rentable (voir graphique ci-dessous)
TEST: elles sont pas mal ainsi, voire élégantes pourrait-on dire.
TEST: il y en a peu, voire très peu.
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.
TEST: les membres de l’équipage commencent à voir flou
TEST: un travail qu’il préfère voir effectué par un spécialiste plutôt que par lui-même
TEST: médicaments qui me donnent envie de vomir, qui m’abrutissent, qui me font voir flou


# vieil / vieux
__conf_vieil_vieux_euphonie__
    vieux  homme
        <<- /conf/ -1>> vieil                                   # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie

    vieux  ~^[aeéiîou]
        <<- /conf/ morph(\2, ":[NA].*:[me]:s", ":[123][sp]")
        -1>> vieil                                              # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie

TEST: ce {{vieux}} homme
TEST: c’est un {{vieux}} imbécile.
TEST: Le {{vieux}} homme était parti.                         ->> vieil
TEST: Diviser les jeunes et les vieux est un peu son fonds de commerce




# ayants droit
__sgpl_ayants_droit__
    [les|des|ces|ses|nos|vos|leurs] ayant [droit|droits]
        <<- /sgpl/ -2:3>> ayants droit                              # Au singulier : “un ayant droit”. Au pluriel : “des ayants droit”.

TEST: Comment lutter contre la cupidité des {{ayant droits}}
# Note: À supprimer? Graphie qui tend vers la soudure et le pluriel régulier (ayant-droit(s))


# bien
__sgpl_très_bien__
    très biens
        <<- /sgpl/ -2>> bien                                        # Adverbe ou adjectif, “bien” est invariable.|https://fr.wiktionary.org/wiki/bien

TEST: Très {{biens}} connus des services de police, il leur fut difficile de passer entre les mailles du filet.


# termes
__sgpl_en_termes_de__
    en terme [de|d’]
        <<- /sgpl/ -2>> termes                                      # Dans la locution “en termes de”, mettez “terme” au pluriel.

TEST: en {{terme}} de communication, c’est une véritable catastrophe
................................................................................
    à plat ventre
    à plate couture
    à plein [régime|temps|nez]
    à pleins poumons
    à plus forte raison
    à plus d’un titre
    à point nommé
    à portée de [main|tir|voix]
    à première vue
    à prix [cassé|modique|cassés|modiques]
    à proprement parler
    à qui de droit
    à qui mieux mieux
    à qui que ce soit
    à quelque distance
................................................................................
    de près ou de loin
    de par le monde ?entier¿
    de part et d’autre
    de ?presque¿ partout
    d’ un peu partout
    de petite taille
    de pied ferme
    de place en place
    de plein [droit|fouet]
    de plus [belle|près]
    de premier [choix|ordre|plan]
    de première [catégorie|main|nécessité]
    de prime abord
    de proche en proche
    de pure forme
................................................................................
    niveau par niveau
    pièce par pièce
    par-ci ?,¿ par-là
    par-derrière
    par-dessus le marché
    par-dessus tout
    par-devant
    par instants
    par là
    parfois
    partant de là
    partout
    pas du tout
    pas le moins du monde
    pas à pas
................................................................................
    pour  autant  [que|qu’]  nous             sachions   @¬:Y
    pour  autant  [que|qu’]  vous             sachiez    @¬:Y
    pour  autant  [que|qu’]  [ils|elles]      sachent    @¬:Y
        <<- ~1:5>> *

    pour cette raison [que|qu’]
        <<- ~1:3>> *

    pour les uns    @:¬:[AQ].*:[me]:[pi]
    pour les autres @:¬:[AQ].*:[pi]
        <<- ~1:3>> *

    [le|un|ce|mon|ton|son]  putain  [de|d’]  @:[NA].*:[me]
        <<- ~2:3>> *

    tambour battant
    tambours battants
        <<- morph(<1, ":(?:V|N:f)", ":G") ~>> *
................................................................................
    >arme de [poing|guerre]
    >arme de destruction massive
    >argent de poche
    >article de presse
    >attestation sur l’ honneur
    >attendre de pied ferme
    ayants droit
    bas résille
    >benne à >ordure
    >billet de *NUM [>euro|>dollar|>centime|>cent|>livre|>shilling]
    [>bisphénol|>bisphenol] A
    >blanche comme neige
    >blanche comme de la craie
    [>boîte|>boite] aux lettres
    [>boîte|>boite] à gants
    >bombe à [eau|fragmentation|retardement]
................................................................................
    >chambre [de|d’] [agriculture|hôte|hôtes|commerce|compensation|décompression|dégrisement]
    >chasse à courre
    >chemin de [traverse|fer]
    >chili con carne
    >claire comme de l’ eau de [boudin|roche|source]
    >claire comme du cristal
    >claire comme jus de [boudin|chaussette|chaussettes|chique]
    [>clé|>clef] à molette
    >commise d’ office
    >condamnée à mort
    >convention [récepteur|générateur]
    >conne comme la lune
    >conne comme un balai
    >conne comme une valise sans >poignée
    >coup [de|d’] [balai|bol|cœur|couteau|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|patte|pied|poing|poker|pouce|tête|avance|éclat|État|œil|épaule]
    >coup du sort
    >course contre la montre
    [cousu|cousue|cousus|cousues] [main]
    [cousu|cousue|cousus|cousues] de fil blanc
    >crayon à [lèvres|sourcils]
    [>coût|>cout] de revient
    >couteau à cran d’ arrêt
    >cuillère à [café|soupe]
    >déclaration sur l’ honneur
    >délai [de|d’] [attente|carence|connexion|prescription|préavis|rétraction|rigueur]
    >demande d’ asile
    >descente aux [enfers|flambeaux]
    [>dîner|>diner] aux chandelles
    >digne de [confiance|foi]
................................................................................
    basse consommation
    bon [enfant|marché|teint]
    bon chic ?,¿ bon genre
    [>clé|>clef] en >main
    dernier cri
    fleur bleue
    grand [public|luxe|maximum]
    grande taille
    grandeur nature
    haut de gamme
    hautee [résolution|fidélité|tension]
    longue [distance|portée|durée]
    meilleur marché
    numéro un
    numéro @:B
    plein cadre
    top secret
    vieux jeu
    open source
    Créative Commons
    pair à pair
    petite taille
    plein les yeux
    pur [sucre|jus]
    terre à terre
    vieille école
        <<- morph(<1, ":(?:N|A|Q|W|V0e)", ":D") ~>> *


__purge_couleurs__
    [beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet] [brillant|clair|fluo|foncé|irisé|mat|pâle|pastel|sale|sombre|tendre|terne|vif]
        <<- morph(<1, ":[NAQ]") ~>> *

    bleu    [ciel|indigo|marine|roi|saphir|turquoise]
    blond   platine
    gris    [acier|anthracite|perle|souris]
    jaune   [paille|sable]
    noir    [de|d’] [encre|jais]
................................................................................

    en [certaines|quelques|plusieurs] occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    en de multiples occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:4>> *

    en un sens  @¬:A.*:[me]:[si]
        <<- ~1:3>> *

    entre autres choses  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:2>> *

    de [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

................................................................................
    >aller bon train
    >arriver à échéance
    >arriver à point nommé
    >arriver à bon port
    >battre en [brèche|retraite]
    >chauffer à blanc
    >compter à rebours
    >condamner à mort
    >couler à ?grands¿ flots
    >demander [assistance|audience|conseil|pardon]
    [>donner|>redonner] sens
    >faire [allusion|assaut|attention|chaud|confiance|compliqué|copain-copain|débat|défaut|demi-tour|envie|erreur|figure|froid|halte|honte|illusion|mouche|office|part|peur|polémique|plaisir|preuve|rage|scandale|sens|signe|volte-face]
    >faire amende honorable
    >faire bande à part
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
    >faire de [mon|ton|son|notre|votre|leur] mieux
    >faire état
................................................................................
    >faire grise mine
    >faire grand [bruit|cas]
    >faire profil bas
    >faire salle comble
    >faire table rase
    >faire ce que bon [me|te|lui|nous|vous|leur] semble
    >foutre en l’ air
    [>gonfler|>regonfler] à bloc
    >jouer franc jeu
    >lâcher prise
    >laisser pour compte
    >marcher à rebours
    [>mettre|>remettre] à [bas|flot|jour|niveau|nu|plat|terre]
    [>mettre|>remettre] l’ [écart|épreuve]
    [>mettre|>remettre] au [point|pas]
    [>mettre|>remettre] en [avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre]
    >mourir jeune
    [>naître|>naitre] sous x
    >percer à jour
    >perdre [connaissance|conscience|raison]
    >perdre d’ avance
    >porter [atteinte|bonheur|caution|chance|malheur|plainte|préjudice|secours]
    >poser problème
    >prendre ?[ça|cela|ceci]¿ à la légère
    >prendre ?[ça|cela|ceci]¿ au [dépourvu|sérieux]
................................................................................
    >tenir ?[ça|cela|ceci]¿ à distance ?respectable¿
    >tenir compte
    >tenir au courant
    >trier sur le volet
    >trouver refuge
    >tirer [avantage|profit]
    >tourner court
    [>venir|>revenir] je ne sais ?pas¿ ?trop¿ d’ où
    [>venir|>revenir] on ne sait ?pas¿ ?trop¿ d’ où
        <<- ~2:0>> *


__conf_locutions_verbales__
    >arriver a échéance
    >arriver a point nommé
    >arriver a bon port
    >chauffer a blanc
    [>gonfler|>regonfler] a bloc
    [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>nue|>plat|>terre]
    [>mettre|>remettre] a l’ [écart|épreuve]
    >percer a jour
    >prendre a la légère
    >saigner a blanc
    >tenir a distance
    [>venir|>revenir] a point
        <<- /conf/ -2>> à               # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.

    >faire plaisirs
        <<- /sgpl/ -2>> plaisir                                                                     # Faire plaisir : dans cette locution, “plaisir” doit être au singulier.
        <<- ~2>> *

    >laisser pour [comte|comtes|>conte]
................................................................................
TEST: Elles ont avec constance démontré l’inanité de leur politique.
TEST: On l’a mauvaise, j’peux vous l’dire.
TEST: Défigurée, travestie, dans tous les cas contestée.
TEST: Une file d’attente de plusieurs heures s’étire au rez-de-chaussée
TEST: à une hausse des coûts de l’emprunt à court et moyen terme.
TEST: Elle n’avait que rarement pris connaissance de ses droits.
TEST: On ajoutera que si elle n’a que rarement pris la connerie pour objet
TEST: Les bas résille, le détail qui fait mouche.
TEST: un vice pour les uns diabolique et pour les autres patriarcal
TEST: Les gains sont en un sens maigres.
TEST: Des vêtements grande taille



@@@@
@@@@
@@@@
@@@@
................................................................................
        <<- /gn/ morph(\2, ":[NA].*:[me]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:f", "*") and not apposition(\2, \3)
        -3>> =suggMasSing(\3, True)                                                                 # Accord de genre erroné : « \1 \2 » est masculin, « \3 » est féminin.
        <<- /gn/ morph(\2, ":[NA].*:[si]", ":G") and morph(\3, ":[NA].*:p", ":[GWsi]") and not apposition(\2, \3)
        -3>> =suggMasSing(\3)                                                                       # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au singulier.

    [et|ou]  le  *WORD  *WORD
        <<- /gn/ morph(\2, ":D") and not morph(<1, ":[NA]") and not \4.startswith("seul") >>>
        <<- /gn/ morph(\3, ":[NA].*:[me]", ":(?:B|G|V0|f)") and morph(\4, ":[NA].*:f", "*") and not apposition(\3, \4)
        -4>> =suggMasSing(\4, True)                                                                 # Accord de genre erroné : « \2 \3 » est masculin, « \4 » est féminin.
        <<- /gn/ morph(\3, ":[NA].*:[si]", ":G") and morph(\4, ":[NA].*:p", ":[GWsi]") and not apposition(\4, \4)
        -4>> =suggMasSing(\4)                                                                       # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au singulier.

TEST: le test très {{cons}} qu’on a passé hier.
TEST: c’était le chien {{perdue}} des voisins.
TEST: viens vite ou le pari {{imperdables}} sera moins facile…
TEST: Le bruit {{perçus}} par les voisins.
TEST: si le premier film est un triomphe, le deuxième est un demi-succès, et le troisième une déception.
TEST: Cela aboutira sur une contractualisation coûteuse pour organiser cette divergence d’intérêts, et le gestionnaire aura le dernier mot.


__gn_la_1m__
    ,  la  *WORD
        <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -2>> le               # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p") -3>> =suggFemSing(\3)                  # Accord de nombre erroné : « \3 » devrait être au singulier.
................................................................................
__gn_aucun_1m__
    aucun  *WORD
        <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> aucune                              # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: aucun {{accords}} n’y changera rien.
TEST: {{aucun}} femme ne réagirait si bêtement


__gn_aucune_1m__
    aucune  *WORD
        <<- /gn/ morph(\2, ":[NA].*:m", ":[efGW]") -1>> aucun                               # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggFemSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: aucune {{passions}} n’est digne qu’on meurt pour elle.
TEST: {{aucune}} homme ne comprendrait ça


__gn_nul_1m__
    nul  *WORD
        <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> nulle                               # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: nul {{accords}} n’y changera rien.
TEST: {{nul}} femme ne réagirait si bêtement


__gn_nulle_1m__
    nulle  *WORD
        <<- /gn/ morph(\2, ":[NA].*:m", ":[efGW]") -1>> nul                                 # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggFemSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: nulle {{passions}} n’est digne qu’on meurt pour elle.
TEST: {{nulle}} homme ne comprendrait ça


__gn_un_1m__
    un  *WORD
        <<- /gn/ morph(\2, ":[NA].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une                    # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2)                    # Accord de nombre erroné : « \2 » devrait être au singulier.
................................................................................
TEST: un {{fromages}}.                                        ->> fromage
TEST: Un {{ballons}}                                          ->> ballon
TEST: Une {{cinglées}}                                        ->> cinglée
TEST: {{une}} des {{chats}}
TEST: {{une}} kyste                                           ->> un
TEST: {{une}} des {{joueurs}}
TEST: mille et une merveilles
TEST: Quatorze heures découpées en quatre parties, une sortant en salles chaque semaine


## un / une
__gn_un_2m__
    un  *WORD  *WORD
        <<- /gn/ not value(<1, "|et|ou|d’|") and not \3.startswith("seul") >>>
        <<- /gn/ morph(\2, ":[NA].*:[me]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:f", "*") and not apposition(\2, \3)
................................................................................
        <<- /gn/ morph(\3, ":[NA].*:[pi]") and morph(\4, ":[NA].*:s", "*") and not apposition(\3, \4) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -4>> =suggPlur(\4)                                                                          # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au pluriel.

TEST: les pitres {{imbécile}}
TEST: il faut en convenir et les femmes {{oubliés}} seront satisfaites.
TEST: et les femmes {{retrouvés}} seront emmenées à l’hôpital.
TEST: les moins éloignées possible
TEST: Les besoins minimums en matière de sommeil sont-ils les mêmes d’un individu à l’autre ?


__gn_leurs_1m__
    leurs  *WORD
        <<- /gn/ (morph(\2, ":[NA].*:s", ":(?:[ipGW]|[123][sp])") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]")))
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
................................................................................

TEST: Je connais nombre d’{{emmerdeur}} et aucun n’est pire que lui.


__gn_det_groupe_de_1m__
    [un|une|le|la|ce|cette|mon|ton|son|ma|ta|sa|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques]  [>centaine|>millier|>million|>milliard|>dizaine|>douzaine|>multitude|>horde]  [de|d’]  *WORD
        <<- /gn/ morph(\4, ":[NA].*:s", ":[ip]|>fraude/") or \4 in aREGULARPLURAL
        -4>> =suggPlur(\4)                                                                  # Avec \1 « \2 \3 », mettre au pluriel “\4” s’il y en a bien plusieurs.

TEST: des centaines de {{bête}} à cornes passèrent devant nous.     ->> bêtes
TEST: une multitude d’{{homme}}                                     ->> hommes
TEST: les 80 milliards de fraude fiscale


## quelque adverbe
................................................................................
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ (morph(\2, ":[NA].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.        ->> idiots
TEST: Il a abandonné neuf {{enfant}}.                                               ->> enfants
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.              ->> travailleurs
TEST: Il y a quatre cents {{mot}} dans la phrase.                                   ->> mots
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue


__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|")
        -2>> =suggSing(\2)                                                                  # Accord de nombre erroné : « \1 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N")
            and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|"))
            or \1 in aREGULARPLURAL )
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné : « \2 » devrait être au pluriel.

TEST: 00 heure, 01 heure
TEST: il a adopté 1 {{chiens}}.
TEST: 22 {{heure}}
TEST: 3 {{heure}}
TEST: les élèves sont inquiets après une année 2018 compliquée et riche en réformes.
TEST: ils gagneront 300 € maximum.
TEST: il revint en 2005 complètement dévoré par la culpabilité.
TEST: un jeu de 1980 absolument démodé.


##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              # Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

................................................................................
        -2>> est                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez “est”.

TEST: où {{et}} cet ennemi ?
TEST: où {{et}} l’homme qui est passé ce matin ?
TEST: Je veux savoir où et quand, où et pouquoi.
TEST: où et avec qui ?


__conf_été_était__
    [le|ce|cet|mon|ton|son|notre|votre|leur|du|quel]  *WORD  >été
        <<- /conf/ morph(\2, ":N.*:m:[si]", ":[AWG]") and morph(<1, ":Cs|<start>|>,") --1>> était
        # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “était”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord.

    [la|cette|mon|ton|son|ma|ta|sa|notre|votre|leur|quelle]  *WORD  >été
        <<- /conf/ morph(\2, ":N.*:f:[si]", ":[AWG]") and morph(<1, ":Cs|<start>|>,") --1>> était
        # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “était”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord.

    [les|des|ces|mes|tes|ces|nos|vos|leurs|quelques|plusieurs|certains|certaines|quels|quelles]  *WORD  >été
        <<- /conf/ morph(\2, ":N.*:[pi]", ":[AWG]") and morph(<1, ":Cs|<start>|>,") --1>> étaient
        # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “étaient”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord.

TEST: Ce mec {{été}} un connard fini.                                               ->> était
TEST: Quelle solution {{été}} à notre portée ?                                      ->> était
TEST: Les questions {{étés}} incompréhensibles.                                     ->> étaient
TEST: Le bel été indien que nous avons cette année.


# faim / fin
__conf_faim_fin__
    >avoir (>fin)
    [>rester|>demeurer] sur [ma|ta|sa|notre|votre|leur|leurs] (>fin)
        <<- /conf/ -1>> faim                                                # Confusion. Pour évoquer l’envie de se sustenter, écrivez “faim”.

................................................................................
TEST: à leur plus grand fils, ils ont offert une voiture.
TEST: ça va d’autonome à hautement dépendant
TEST: la pression entre les membres à un moment devient trop importante


__infi_de_verbe__
    [de|d’] [le|la|l’|leur|les]           @:V¬:[YNAM]|>(?:lui|plus)/
    [<start>|,]  [de|d’] [nous|vous|lui]  @:V¬:[YE]|>(?:lui|plus)/
        <<- /infi/ \-1.islower() --1>> =suggVerbInfi(\-1)                               # Erreur probable. Après “de”, le verbe devrait être à l’infinitif.

    [de|d’] [ne|n’|en|me|m’|te|t’|se|s’|y]                                       @:V¬:Y|>(?:lui|plus)/
    [de|d’] [ne|n’]    [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]  @:V¬:Y|>(?:lui|plus)/
    [de|d’] ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:V¬:Y
    [de|d’] ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:V¬:Y
    [de|d’] ?[ne|n’]¿  [lui|leur]                     en                         @:V¬:Y
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             # Après “de”, le verbe devrait être à l’infinitif.

    en  [droit|état|mesure]  [de|d’]  ?[nous|vous|le|la|l’|les|leur]¿  @:V1.*:Q
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             # Le verbe devrait être à l’infinitif.

    [de|d’]  @:V1.*:Q¬:N
        <<- /infi/ not \2[0:1].isupper() and not morph(<1, ">(?:en|passer)/")
            and not before("(?i)\\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|points? +$|rien(?: +[a-zéèêâîûù]+|) +$)")
        -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: arrête d’y {{consacré}} autant de temps.
................................................................................
TEST: de me le {{facturez}}
TEST: Il s’agit de me {{donnait}} tout ça.
TEST: j’étais incapable de m’{{orientait}} dans la bonne direction.
TEST: ils étaient susceptibles de m’y {{trouvaient}}
TEST: Il tentait de {{raisonné}} en homme libre
TEST: sa façon de {{nettoyez}} était inefficace.
TEST: elle a délibérément omis de les {{inclurent}}.
TEST: Sont-ils en mesure de nous {{fabriqué}} ces armes ?
TEST: elle s’engage de ne les lui donner qu’en dernier recours.
TEST: l’idée consiste de la lui donner sans contrepartie et voir ce qu’il en fera.
TEST: de leur plus grand fils, ils attendent beaucoup.
TEST: de n’importe quelle manière
TEST: un libéralisme trop « individualiste » s’est transformé en de supposées demandes de droits spécifiques
TEST: soit 40 % de plus comparé au quinquennat précédent
TEST: On passe de sophistiqué à classique.
TEST: Les « événements » d’il y a cinquante ans n’ont sans doute « rien à voir » avec le mouvement des « gilets jaunes »
TEST: Quelques points de gagnés avec cette astuce, ne faisons pas la fine bouche.


__infi_y_verbe!3__
    y ~ée?s?$
        <<- /infi/ morph(\2, ":V", ":[123][sp]") -2>> _                                 # Le verbe ne devrait pas être un participe passé.

TEST: y {{mangée}} était un supplice
................................................................................
__infi_nous_vous_verbe__
    [nous|vous]  ~ée?s?$
        <<- /infi/ morph(\2, ":Q") and not morph(<1, "V0.*[12]p") -2>> _                 # Après “\1”, le verbe ne devrait pas être un participe passé.

TEST: Nous {{intéressé}} à la question ne suffit pas à faire de nous des experts.
TEST: nous {{ridiculisé}}
TEST: vous {{mangé}}
TEST: Sommes-nous désespérés à ce point ?


__infi_devoir_savoir_pouvoir_interrogatif__
    /VCint  ?[pas|jamais]¿  ?[en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD
        <<- /infi/ morphVC(\1, ">(?:devoir|savoir|pouvoir|vouloir)/") and morph(\-1, ":(?:Q|A|[123][sp])", ":[GYW]")
        --1>> =suggVerbInfi(\-1)                                                        # Après “\1”, le verbe devrait être à l’infinitif.

................................................................................
    [ce|ça|ceci|cela|c’|ç’] >avoir été >seule               [que|qu’]
    [ce|ça|ceci|cela|c’|ç’] >avoir été @:[AQ].*:f¬:[GWYme]  @:N.*:f
        <<- %4>>

    [ce|ça|ceci|cela|c’|ç’] >être >seule                    [que|qu’]
    [ce|ça|ceci|cela|c’|ç’] >être @:[AQ].*:f¬:[GWYme]       @:N.*:f
        <<- %3>>

    tout en étant @:A
        <<- %4>>

    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])               [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru]                                                                 [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler]) [devenu|redevenu|resté|demeuré]                                         [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
    ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || [être|devenir|redevenir|rester]                                                                                                  [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]]
................................................................................
TEST: tout sera {{dissoute}}
TEST: C’est donc seules que les deux femmes sont amenées à comparaître
TEST: C’eût été pure imagination.
TEST: Je n’arrêtais pas de me répéter que tout cela était peut-être pure imagination
TEST: La femme qui faisait ça est partie.
TEST: De cela a toujours été faite notre vie
TEST: Ce sont différents types de violences
TEST: La littérature africaine s’ouvre au monde, parle au monde, tout en étant ancrée dans le continent.
TEST: pour « faire de la politique avec leur député » sans « faire de travail pour l’Union européenne », mais tout en étant payés par elle.


__ppas_3sg_fem_verbe_état__
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])              [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru]                                                                [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler]) [devenue|redevenue|restée|demeurée]                                    [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]]
    ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿
................................................................................
TEST: celles-là imaginent être devenues légion


__ppas_avoir_été__
    >avoir  été  *WORD
        <<- /ppas/ morph(\3, ":[123]s", ":[GNAQWY]") -3>> =suggVerbPpas(\3)          # Après “avoir été”, il faut un participe passé.
        <<- /ppas/ not before("[çcCÇ]’$|[cC]e n’$|[çÇ]a (?:n’|)$") and not before("(?i)^ *ne pas ") and not morph(<1, ":Y") >>>
        <<- /ppas/ morph(\3, ":Y", ":[AN]") -1:2>> _                                 # Tournure familière. Utilisez “être allé” plutôt que “avoir été”.
        <<- /ppas/ morph(\3, ":V1..t.*:Y", ":[AN]") -3>> =suggVerbPpas(\3)           # Incohérence. Après “avoir été”, il faut un participe passé (à moins que “avoir été” signifie ici “être allé”).

TEST: j’ai été {{instruis}} par elle
TEST: avoir été {{prit}} par surprise
TEST: Ils {{ont été}} {{réaliser}} à partir d’éléments naturels.
TEST: J’{{ai été}} camper dans les Alpes.
TEST: Tu {{as été}} prendre du bois.
TEST: J’{{ai été}} {{chercher}} du pain.
TEST: Mon grand-père aurait été fier.
TEST: Ç’eût été prendre des vessies pour des lanternes.
TEST: C’eût été foncer tête baissée dans la gueule du loup.
TEST: Leur passe-temps, ça a été faire n’importe quoi.
TEST: Ne pas ressortir le livre le plus remarqué de la collaboration aurait été faire acte de censure.
TEST: Partir aurait été assurer sa survie.
TEST: J’ai été conseiller régional



!!!! Participes passés: accord en nombre avec la conjugaison de « être » (et équivalent)            !!

__ppas_être_accord_sing__
    (*WORD)      ?qui¿  ?[ne|n’]¿  ?[en|y]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])           @:[NA].*:p¬:[GMWYsi]
................................................................................
        || [être|devenir|redevenir|rester]                                                                              *WORD
    [<start>|,|@:Cs]  [un|le|ce|cet]                    (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]                                       *WORD
    [<start>|,|@:Cs]  [un|le|ce|cet]                    (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                                      *WORD
        <<- /ppas/ morph(\1, ":[NA].*:[me]", ":[GWf]") and morph(\-1, ":A.*:f", ":[GWme]") and morph(\2, ":[123]s")
        --1>> =switchGender(\-1)                                                                    # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre.

    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])             *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                               *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]    *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
................................................................................
        || [être|devenir|redevenir|rester]                                                                              *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]                                       *WORD
    [<start>|,|@:Cs]  [une|la|ma|ta|sa|cette]           (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
        || avoir [été|semblé|paru]                                                                                      *WORD
        <<- /ppas/ morph(\1, ":[NA].*:[fe]", ":[GWm]") and morph(\-1, ":A.*:m", ":[GWfe]") and morph(\2, ":[123]s")
        --1>> =switchGender(\-1)                                                                    # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre.

    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre])             *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                               *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée]    *WORD
    [<start>|,|@:Cs]  [l’|mon|ton|son|notre|votre|leur] (*WORD)  ?qui¿  ?[ne|n’]¿
        || ([>aller|>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir])
................................................................................
TEST: Le chien ne sera pas {{oubliés}}
TEST: les femmes sont vraiment {{partis}}                                         ->> parties
TEST: les hommes ne sont pas tout à fait {{fâché}}                                ->> fâchés
TEST: les enfants ne sont pas {{content}}
TEST: les réunions sans cesse reportées sont {{annulés}}
TEST: l’avenir de la région était {{suspendue}}
TEST: il prétendait que les banques universelles « à la française » s’{{était}} très honorablement comportées
TEST: Ma mémoire a aussi été {{effacé}}.


__ppas_nom_propre_être_accord_genre__
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  [>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]            *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  (>avoir) [été|semblé|paru]                                                            *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿  ([>être|>sembler])  [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD
    [<start>|,|@:Cs]  (@M)  ?qui¿  ?[ne|n’]¿
................................................................................
__immu_les_avoir_fait_vinfi__
    les >avoir fait ?[me|m’|te|t’|se|s’|nous|vous|leur]¿ @:Y
        <<- %3>>


__ppas_pronom_avoir__
    [je|j’|tu|il|elle|on|ils|elles|et|qui]  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|")
            and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        --1>> =suggVerbPpas(\-1, ":m:s")
        # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

    [je|j’|tu|il|elle|on|ils|elles|et|qui]  ?[ne|n’]¿  en  >avoir  *WORD
        <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
            and value(<1, "|<start>|,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|")
            and \-1.islower() and morph(\-1, ":(?:[123][sp])", ":[GWQ]")
        --1>> =suggVerbPpas(\-1, ":m:s")
        # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: ils leur avaient {{donnés}} du fil à retordre.                                ->> donné
TEST: il a {{affronte}} une bande de voleurs de bétail                              ->> affronté
TEST: J’ai {{mettrai}} du sel.                                                      ->> mis
TEST: J’ai {{lut}} son journal.                                                     ->> lu
TEST: Si j’avais {{sut}}.                                                           ->> su
TEST: Il a {{prit}} le train.                                                       ->> pris
................................................................................
TEST: Il a {{donner}} sa vie pour elle.                                             ->> donné
TEST: Ils leur ont {{données}} un cadeau.                                           ->> donné
TEST: ils avaient, en ce temps-là, déjà {{perdus}} leurs illusions                  ->> perdu
TEST: Ils ont à plusieurs reprises {{perdus}} leur sang-froid.                      ->> perdu
TEST: Elle avait {{pose}} son tricot                                                ->> posé
TEST: qui ont {{refuse}} de se soumettre                                            ->> refusé
TEST: il a {{suffit}} de le pousser un peu                                          ->> suffi
TEST: il en a toujours {{était}} ainsi                                              ->> été
TEST: Ils avaient barre sur lui.


__ppas_nous_vous_avoir__
    [nous|vous]  ?[ne|n’]¿  ?[lui|leur]¿  >avoir  *WORD
    <<- /ppas/ morph(\1, ":Os")
        and not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|")
................................................................................
        # Accord avec “l’” : 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: ils l’avaient {{retrouvés}}.
TEST: Vous l’avez {{trouvez}}.                                                    ->> trouvé
TEST: Nous l’avons {{mangés}}.
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 @:V[0-3]..t_.*:Q.*:p¬:[GWsi]
        <<- /ppas/ not before("(?i)\\bqu(?:e |’)") -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

................................................................................
        -2:3>> \2-elle                                                                              # Forme interrogative ? Mettez un trait d’union.

TEST: {{vient elle}} souvent ?
TEST: je ne comprenais pas pourquoi c’était elle qui était punie et que personne ne parlait de celui qui avait fait ça.
TEST: C’était elle qui avait pris le contrôle.


__inte_union_nous!6__
    [<start>|,]  ~ons$  nous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and morph(>1, ":|<end>|,", ":1p")
        -2:3>> \2-nous                                                                              # Forme interrogative ? Mettez un trait d’union.

    [<start>|,]  sommes  nous
        <<- /inte/ space_after(\2, 1, 1)
        -2:3>> \2-nous                                                                              # Forme interrogative ? Mettez un trait d’union.

    *WORD  ~ons$  nous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GNW]") and not morph(\1, ":Os") and morph(>1, ":|<end>|,", ":(?:Y|1p)")
        -2:3>> \2-nous                                                                              # Forme interrogative ? Mettez un trait d’union.

TEST: {{retrouverons nous}} enfin la tranquilité ?
TEST: Ne {{sommes nous}} pas des dieux ?


__inte_union_vous__
    [<start>|,]  ~..e[zs]$  vous
        <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and morph(>1, ":|<end>|,", ":2p")
        -2:3>> \2-vous                                                                              # Forme interrogative ? Mettez un trait d’union.

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

#### PARTICIPES PASSÉS APRÈS ÊTRE

__ppas_être__
    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("que") --1>> =suggVerbPpas(\-1)         # Après le verbe “être”, il faut un participe passé.

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

    >être  ~..ez$
................................................................................

TEST: Quiconque {{pensez}} s’en sortir se trompait lourdement.
TEST: Il voulut punir quiconque s’y {{adonnaient}}.
TEST: quiconque issu de la gauche n’a aucune chance.


__conj_ce_celui_celle_qui__
    [ce|celui]  qui  @:V¬:(?:3s|P|Q|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                    # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.

    celle  qui  @:V¬:(?:3s|P|Q|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                    # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.
        <<- /conj/ morph(\3, ":[123]p") -1>> celles             # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au pluriel.

TEST: Ce qui, la plupart du temps, {{donnes}} des maux de tête.
TEST: Ce qui {{fâchent}} mes amis.
TEST: celui qui {{pensent}} mal de toute chose
TEST: {{celle}} qui y {{parviendront}} seront récompensées.


__conj_3sg_misc__
    [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|quelqu’un|quelqu’une]  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3s")                                 # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [celle-ci|celle-là]  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3s")                                 # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.
        <<- /conj/ __also__ and morph(\2, ":[123]p") -1>> =\1.replace("e-", "es-").replace("E-", "ES-")     # Conjugaison erronée. Accord avec “\2”. Le sujet devrait être au pluriel.

    [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|quelqu’un|quelqu’une]  qui  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                                                        # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [celle-ci|celle-là]  qui  @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ -3>> =suggVerb(\3, ":3s")                                                        # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.
        <<- /conj/ morph(\3, ":[123]p") -1>> =\1.replace("e-", "es-").replace("E-", "ES-")          # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au pluriel.

    l’ [un|une]            @:V¬:(?:3s|P|Q|G|M|3p!)
    quelque chose          @:V¬:(?:3s|P|Q|G|M|3p!)
    n’importe [qui|quoi]   @:V¬:(?:3s|P|Q|G|M|3p!)
        <<- /conj/ not morph(<1, ":[VR]")
        --1>> =suggVerb(\-1, ":3s")                             # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
    quelque chose          qui  @:V¬:(?:3s|P|Q|G|3p!)
    n’importe [qui|quoi]   qui  @:V¬:(?:3s|P|Q|G|3p!)
        <<- /conj/ --1>> =suggVerb(\-1, ":3s")                  # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: chacun {{fais}} comme il peut
TEST: quelqu’un {{sauras}}
TEST: quelqu’une se {{montrent}} désagréable
TEST: {{celle-ci}} {{deviennent}} plus fortes avec le temps.
TEST: n’importe quoi {{peux}} réussir
TEST: n’importe qui {{peux}} y arriver.
TEST: quelque chose {{sens}} mauvais ici
TEST: l’un d’eux {{viendras}}
TEST: ce {{dois}} être ennuyeux
TEST: ce {{seras}} foutu
TEST: mais ça ne vous {{aideras}} en rien
................................................................................
TEST: aucun ne {{vas}} là-bas
TEST: il ne faut rien faire ou rien dire contre les manifestants
TEST: qui n’ont rien appris et rien oublié
TEST: comme si son pays n’avait rien appris du fascisme ni rien reçu de l’Europe


__conj_nul_nulle__
    [nul|nulle]  ?@:[NA]¿  ?qui¿  @:V¬:(?:3s|P|G|N.*:[si])
        <<- /conj/ morph(<1, ":Cs|<start>|>,", ":(?:Y|P|Q|[123][sp]|R)")
        --1>> =suggVerb(\-1, ":3s")                                     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: nul ne {{savaient}} que faire
TEST: nulle n’{{iront}} là-bas
TEST: nulle femme ne {{sauraient}} le faire
TEST: nul homme ne {{sauraient}} s’y prendre
TEST: nulle partie du corps ne peut être considérée comme le siège de l’âme.


__conj_aucun_aucune__
    [aucun|aucune]  ?@:[NA]¿  ?qui¿  @:V¬:(?:3s|P|G|N.*:[si])
        <<- /conj/ morph(<1, ":Cs|<start>|>,", ":(?:Y|P|Q|[123][sp]|R)")
        --1>> =suggVerb(\-1, ":3s")                                     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: aucun ne {{savaient}} que faire
TEST: aucune n’{{iront}} là-bas
TEST: aucune femme ne {{sauraient}} le faire
TEST: aucun homme ne {{sauraient}} s’y prendre
TEST: aucune partie du corps ne peut être considérée comme le siège de l’âme.


__conj_vinfi_suj__
    [<start>|,]  @:Y  @:V¬:(?:3s|P|Q.*:[me]:[si]|Y|G|3p!|M)
        <<- /conj/ not (value(\2, "|croire|être|devenir|redevenir|voir|sembler|paraître|paraitre|sentir|rester|retrouver|") and morph(\3, ":A"))
        -3>> =suggVerb(\3, ":3s")                                       # Conjugaison erronée. Accord avec “\2”. Le verbe devrait être à la 3ᵉ personne du singulier.

................................................................................
TEST: {{elles}} {{avance}} rapidement sur ce projet
TEST: {{Elles}} n’y {{comprenne}} rien
TEST: L’expérience sensible qu’il nous restera bientôt d’elles est à peu près
TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes.


__conj_ceux_celles_qui__
    ceux  qui  @:V¬:(?:3p|P|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    celles  qui  @:V¬:(?:3p|P|G)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ morph(\3, ":[123]s") -1>> celle                      # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au singulier.

TEST: Ceux qui {{chante}} toute la journée…
TEST: {{Celles}} qui {{pense}}.


__conj_ceux_là_celles_ci__
    [ceux-ci|ceux-là]  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p")     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    [celles-ci|celles-là]  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p")     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __also__ and morph(\2, ":[123]s") -1>> =\1.replace("s", "").replace("S", "")     # Conjugaison erronée. Accord avec “\2”. Le sujet devrait être au singulier.

    [ceux-ci|ceux-là]  qui  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    [celles-ci|celles-là]  qui  @:V¬:(?:3p|P|Q|G|M)
        <<- /conj/ -3>> =suggVerb(\3, ":3p")                            # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ morph(\3, ":[123]s") -1>> =\1.replace("s", "").replace("S", "")                  # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au singulier.

TEST: ceux-là {{devienne}} des ratés
TEST: {{celles-ci}} qui {{semble}} avoir tout pour réussir.


__conj_lesquels_lesquelles__
    [lesquels|lesquelles]  @:V¬:(?:3p|P|Y|Q|G|M)
        <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p")     # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: lesquels {{devienne}} des ennuyeux incomparables.
................................................................................
TEST: Des femmes de l’administration Obama y racontent qu’elles ont constaté qu’il leur arrivait régulièrement de ne pas être invitées
TEST: Macron président, c’est…


# 3pl
__conj_nom_propre_et_nom_propre__
    ~^[A-ZÉÈ]  et  ~^[A-ZÉÈ]  @:[123][sp]¬:(?:G|3p|P|Q.*:[pi])
        <<- /conj/ morph(\1, ":M") and morph(\3, ":M") and not morph(<1, ":[RV]|>(?:des?|du|et|ou|ni)/")
        -4>> =suggVerb(\4, ":3p")                                                                   # Conjugaison erronée. Accord avec “\1 et \3”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Samantha et Eva {{viennes}} demain.
TEST: Samantha et Eva leur {{décrive}} une leçon.
TEST: La relation spéciale qu’entretiennent Donald et Kim met paradoxalement en péril les discussions entre les deux pays.
TEST: La menace d’une guerre nucléaire entre Delhi et Islamabad plane toujours


# on / ont
__conf_ont!6__
    ils  on
    [eux|ceux|elles|celles]  qui  on
        <<- /conf/ --1>> ont                                    # Confusion probable : “on” est un pronom personnel. Pour la conjugaison du verbe “avoir”, écrivez “ont”.
................................................................................
    [je|j’|tu|il|elle|on|ils|nous|vous|elle|elles]  >avoir  @:V.......e_.*:Q
        <<- /conf/ -2>> _                                                       # Incohérence. La forme verbale “\3” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.

TEST: {{Ait-il}} arrivé à ses fins ?
TEST: je n’{{avais}} pas parti avec eux.
TEST: il {{avait}} parti.
TEST: Avais-je partie liée avec lui ?
TEST: il n’y a pas mort d’homme, mais il y a mort de meuf.


!!
!!
!!!! Modes verbaux                                                                                !!
!!
!!
................................................................................
!!
!!
!!

!!! À trier                                                                                       !!

TODO: Il faut au préalable avoir {{définit}} un protocole.


TODO: Vous la {{voulait}}
TODO: un délire systématisé de persécution basé sur des interprétations
TODO: Soudain, surgit l’un des ouvriers…
TODO: Ainsi périt l’inconstant.
TODO: puis repartit.
TODO: Les créatures de l’enfer que nous avions rencontrées…
TODO: Étaient-ils vraiment frère et sœur
TODO: Cela fait des années qu’elle n’a pas donné signe de vie.


TODO: Ce qu’ils sont influence leur regard sur moi.
TODO: Ils sont âgés de 4 et 1 ans.
TODO: Mille neuf cent quatre-vingt. (dépend du contexte)

TODO: La Mustang est une voiture.
TODO: Il faut se bien connaître soi-même.
TODO: C’est lui ou moi qui a gagné.
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.
TODO: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.
TODO: Les côtes sont dans leur ensemble extrêmement découpées.


!!! Indécidable                                                                                   !!
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests                                                                                  !!
TEST: Ça a l’air de t’aller.
................................................................................
TEST: En 1944, au sortir des deux guerres ayant ravagé l’Europe, le CNR (conseil national de la résistance) avait bien mesuré les tenants et les aboutissants, c’est-à-dire les causes et les conséquences du ravage des inégalités et du jusqu’au boutisme de l’auto-défense d’une caste pour préserver ses acquis.
TEST: Ceux de l’Université sont plus perfectionnés
TEST: Celles de l’Institut sont plus perfectionnées
TEST: Judith A. Allan a aussi constaté que les études sur les crises de la masculinité ne proposent pas ou que très rarement d’indicateurs pour déterminer si une société est (trop) féminisée et si les hommes sont (réellement) en crise.
TEST: une procédure abusive pour fermer la porte qu’elles ont essayé d’ouvrir
TEST: En France, les hauts fonctionnaires gagnent en moyenne 7850 euros net
TEST: Il faut avoir du pouvoir et des ressources
TEST: Le con de jadis ne dérangeait personne, maintenant il répand sa haine et son inculture sur les réseaux sociaux.
TEST: Les hommes qui se servaient de lui espéraient l’amadouer…
TEST: Celui qui se servait de lui voulait lui donner une bonne leçon.
TEST: Le CAPES de mathématiques.
TEST: cet être que personne n’a vu ni senti à part elle
TEST: un délire systématisé de persécution basé sur des interprétations
TEST: Et si je te donne son nom, cela t’aiderait, Dworkin ?



!!! Tests historiques                                                                             !!

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.

................................................................................
TEST: Quand elle fut endormie :
TEST: — Votre mari n’a plus besoin de cinq mille francs ! Vous allez donc oublier que vous avez prié votre cousin de vous les prêter, et, s’il vous parle de cela, vous ne comprendrez pas.
TEST: Puis il la réveilla. Je tirai de ma poche un portefeuille :
TEST: — Voici, ma chère cousine, ce que vous m’avez demandé ce matin.
TEST: Elle fut tellement surprise que je n’osai pas insister. J’essayai cependant de ranimer sa mémoire, mais elle nia avec force, crut que je me moquais d’elle, et faillit, à la fin, se fâcher.
TEST: Voilà ! je viens de rentrer ; et je n’ai pu déjeuner, tant cette expérience m’a bouleversé.
TEST: 19 juillet. — Beaucoup de personnes à qui j’ai raconté cette aventure se sont moquées de moi. Je ne sais plus que penser. Le sage dit : Peut-être ?
TEST: 21 juillet. — J’ai été dîner à Bougival, puis j’ai passé la soirée au bal des canotiers. Décidément, tout dépend des lieux et des milieux.
TEST: Croire au surnaturel dans l’île de la Grenouillère, serait le comble de la folie… mais au sommet du mont Saint-Michel ?… mais dans les Indes ?
TEST: Nous subissons effroyablement l’influence de ce qui nous entoure. Je rentrerai chez moi la semaine prochaine.
TEST: 30 juillet. — Je suis revenu dans ma maison depuis hier. Tout va bien.
TEST: 2 août. — Rien de nouveau ; il fait un temps superbe. Je passe mes journées à regarder couler la Seine.
TEST: 4 août. — Querelles parmi mes domestiques. Ils prétendent qu’on casse les verres, la nuit, dans les armoires.
TEST: Le valet de chambre accuse la cuisinière, qui accuse la lingère, qui accuse les deux autres. Quel est le coupable ? Bien fin qui le dirait !
TEST: 6 août. — Cette fois, je ne suis pas fou. J’ai vu… j’ai vu… j’ai vu !… Je ne puis plus douter… j’ai vu !… J’ai encore froid jusque dans les ongles… j’ai encore peur jusque dans les moelles… j’ai vu !…

Changes to gc_lang/fr/webext/content_scripts/init.js.

100
101
102
103
104
105
106

107
108
109
110
111
112
113
                }
            }
        }
    },

    observePage: function () {
        //    When a textarea is added via jascript we add the menu

        let that = this;
        this.xObserver = new MutationObserver(function (mutations) {
            mutations.forEach(function (mutation) {
                for (let i = 0;  i < mutation.addedNodes.length;  i++){
                    if (mutation.addedNodes[i].tagName == "TEXTAREA") {
                        if (that.oOptions === null || that.oOptions.textarea) {
                            oGrammalecte.lMenu.push(new GrammalecteMenu(oGrammalecte.nMenu, mutation.addedNodes[i]));







>







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
                }
            }
        }
    },

    observePage: function () {
        //    When a textarea is added via jascript we add the menu
        let that = this;
        let that = this;
        this.xObserver = new MutationObserver(function (mutations) {
            mutations.forEach(function (mutation) {
                for (let i = 0;  i < mutation.addedNodes.length;  i++){
                    if (mutation.addedNodes[i].tagName == "TEXTAREA") {
                        if (that.oOptions === null || that.oOptions.textarea) {
                            oGrammalecte.lMenu.push(new GrammalecteMenu(oGrammalecte.nMenu, mutation.addedNodes[i]));

Changes to graphspell-js/char_player.js.

25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
..
42
43
44
45
46
47
48












49
50
51
52
53
54
55
        ['à', 'a'],  ['é', 'e'],  ['î', 'i'],  ['ô', 'o'],  ['û', 'u'],  ['ÿ', 'i'],  ['y', 'i'],
        ['â', 'a'],  ['è', 'e'],  ['ï', 'i'],  ['ö', 'o'],  ['ù', 'u'],  ['ŷ', 'i'],
        ['ä', 'a'],  ['ê', 'e'],  ['í', 'i'],  ['ó', 'o'],  ['ü', 'u'],  ['ý', 'i'],
        ['á', 'a'],  ['ë', 'e'],  ['ì', 'i'],  ['ò', 'o'],  ['ú', 'u'],  ['ỳ', 'i'],
        ['ā', 'a'],  ['ē', 'e'],  ['ī', 'i'],  ['ō', 'o'],  ['ū', 'u'],  ['ȳ', 'i'],
        ['ç', 'c'],  ['ñ', 'n'],  ['k', 'q'],  ['w', 'v'],
        ['œ', 'oe'], ['æ', 'ae'],
        ['ſ', 's'],  ['ffi', 'ffi'],  ['ffl', 'ffl'],  ['ff', 'ff'],  ['ſt', 'ft'],  ['fi', 'fi'],  ['fl', 'fl'],  ['st', 'st']

    ]),

    simplifyWord: function (sWord) {
        // word simplication before calculating distance between words
        sWord = sWord.toLowerCase();
        sWord = [...sWord].map(c => this._xTransCharsForSimplification.gl_get(c, c)).join('');
        let sNewWord = "";
................................................................................
            if (c == 'e' || c != sWord.slice(i, i+1)) {  // exception for <e> to avoid confusion between crée / créai
                sNewWord += c;
            }
            i++;
        }
        return sNewWord.replace(/eau/g, "o").replace(/au/g, "o").replace(/ai/g, "ẽ").replace(/ei/g, "ẽ").replace(/ph/g, "f");
    },













    aVowel: new Set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ"),
    aConsonant: new Set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ"),
    aDouble: new Set("bcdfjklmnprstzBCDFJKLMNPRSTZ"),  // letters that may be used twice successively


    // Similar chars







|
>







 







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







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
..
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
        ['à', 'a'],  ['é', 'e'],  ['î', 'i'],  ['ô', 'o'],  ['û', 'u'],  ['ÿ', 'i'],  ['y', 'i'],
        ['â', 'a'],  ['è', 'e'],  ['ï', 'i'],  ['ö', 'o'],  ['ù', 'u'],  ['ŷ', 'i'],
        ['ä', 'a'],  ['ê', 'e'],  ['í', 'i'],  ['ó', 'o'],  ['ü', 'u'],  ['ý', 'i'],
        ['á', 'a'],  ['ë', 'e'],  ['ì', 'i'],  ['ò', 'o'],  ['ú', 'u'],  ['ỳ', 'i'],
        ['ā', 'a'],  ['ē', 'e'],  ['ī', 'i'],  ['ō', 'o'],  ['ū', 'u'],  ['ȳ', 'i'],
        ['ç', 'c'],  ['ñ', 'n'],  ['k', 'q'],  ['w', 'v'],
        ['œ', 'oe'], ['æ', 'ae'],
        ['ſ', 's'],  ['ffi', 'ffi'],  ['ffl', 'ffl'],  ['ff', 'ff'],  ['ſt', 'ft'],  ['fi', 'fi'],  ['fl', 'fl'],  ['st', 'st'],
        ["⁰", "0"], ["¹", "1"], ["²", "2"], ["³", "3"], ["⁴", "4"], ["⁵", "5"], ["⁶", "6"], ["⁷", "7"], ["⁸", "8"], ["⁹", "9"]
    ]),

    simplifyWord: function (sWord) {
        // word simplication before calculating distance between words
        sWord = sWord.toLowerCase();
        sWord = [...sWord].map(c => this._xTransCharsForSimplification.gl_get(c, c)).join('');
        let sNewWord = "";
................................................................................
            if (c == 'e' || c != sWord.slice(i, i+1)) {  // exception for <e> to avoid confusion between crée / créai
                sNewWord += c;
            }
            i++;
        }
        return sNewWord.replace(/eau/g, "o").replace(/au/g, "o").replace(/ai/g, "ẽ").replace(/ei/g, "ẽ").replace(/ph/g, "f");
    },

    _xTransNumbersToExponent: new Map([
        ["0", "⁰"], ["1", "¹"], ["2", "²"], ["3", "³"], ["4", "⁴"], ["5", "⁵"], ["6", "⁶"], ["7", "⁷"], ["8", "⁸"], ["9", "⁹"]
    ]),

    numbersToExponent: function (sWord) {
        let sNewWord = "";
        for (let c of sWord) {
            sNewWord += this._xTransNumbersToExponent.gl_get(c, c);
        }
        return sNewWord;
    },

    aVowel: new Set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ"),
    aConsonant: new Set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ"),
    aDouble: new Set("bcdfjklmnprstzBCDFJKLMNPRSTZ"),  // letters that may be used twice successively


    // Similar chars

Changes to graphspell-js/ibdawg.js.

341
342
343
344
345
346
347






348
349
350
351
352
353
354
...
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
            return aSugg.map( (sSugg) => { return sPfx + sSugg + sSfx; } );
        }
        //console.timeEnd("Suggestions for " + sWord);
        return aSugg;
    }

    _splitSuggest (oSuggResult, sWord) {






        for (let cSplitter of "'’") {
            if (sWord.includes(cSplitter)) {
                let [sWord1, sWord2] = sWord.split(cSplitter, 2);
                if (this.isValid(sWord1) && this.isValid(sWord2)) {
                    oSuggResult.addSugg(sWord1+" "+sWord2);
                }
            }
................................................................................
            if (sRemain == "") {
                oSuggResult.addSugg(sNewWord);
                for (let sTail of this._getTails(iAddr)) {
                    oSuggResult.addSugg(sNewWord+sTail);
                }
                return;
            }
            else if (this.isValid(sRemain) && oSuggResult.sWord.toLowerCase().startsWith(sNewWord.toLowerCase())) {
                oSuggResult.addSugg(sNewWord+" "+sRemain);
            }
        }
        if (nDist > oSuggResult.nDistLimit) {
            return;
        }








>
>
>
>
>
>







 







|







341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
...
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
            return aSugg.map( (sSugg) => { return sPfx + sSugg + sSfx; } );
        }
        //console.timeEnd("Suggestions for " + sWord);
        return aSugg;
    }

    _splitSuggest (oSuggResult, sWord) {
        // split trailing numbers
        let m = /^([a-zA-Zà-öÀ-Ö_ø-ÿØ-ßĀ-ʯfi-st][a-zA-Zà-öÀ-Ö_ø-ÿØ-ßĀ-ʯfi-st-]+)([0-9]+)$/.exec(sWord);
        if (m) {
            oSuggResult.addSugg(m[1] + " " + char_player.numbersToExponent(m[2]));
        }
        // split at apostrophes
        for (let cSplitter of "'’") {
            if (sWord.includes(cSplitter)) {
                let [sWord1, sWord2] = sWord.split(cSplitter, 2);
                if (this.isValid(sWord1) && this.isValid(sWord2)) {
                    oSuggResult.addSugg(sWord1+" "+sWord2);
                }
            }
................................................................................
            if (sRemain == "") {
                oSuggResult.addSugg(sNewWord);
                for (let sTail of this._getTails(iAddr)) {
                    oSuggResult.addSugg(sNewWord+sTail);
                }
                return;
            }
            else if ( (sNewWord.length + sRemain.length == oSuggResult.sWord.length) && oSuggResult.sWord.toLowerCase().startsWith(sNewWord.toLowerCase()) && this.isValid(sRemain) ) {
                oSuggResult.addSugg(sNewWord+" "+sRemain);
            }
        }
        if (nDist > oSuggResult.nDistLimit) {
            return;
        }

Changes to graphspell/char_player.py.

21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36
37
38








39
40
41
42
43
44
45
    'â': 'a',  'è': 'e',  'ï': 'i',  'ö': 'o',  'ù': 'u',  'ŷ': 'i',
    'ä': 'a',  'ê': 'e',  'í': 'i',  'ó': 'o',  'ü': 'u',  'ý': 'i',
    'á': 'a',  'ë': 'e',  'ì': 'i',  'ò': 'o',  'ú': 'u',  'ỳ': 'i',
    'ā': 'a',  'ē': 'e',  'ī': 'i',  'ō': 'o',  'ū': 'u',  'ȳ': 'i',
    'ç': 'c',  'ñ': 'n',  'k': 'q',  'w': 'v',
    'œ': 'oe',  'æ': 'ae',
    'ſ': 's',  'ffi': 'ffi',  'ffl': 'ffl',  'ff': 'ff',  'ſt': 'ft',  'fi': 'fi',  'fl': 'fl',  'st': 'st',

})

def simplifyWord (sWord):
    "word simplication before calculating distance between words"
    sWord = sWord.lower().translate(_xTransCharsForSimplification)
    sNewWord = ""
    for i, c in enumerate(sWord, 1):
        if c == 'e' or c != sWord[i:i+1]:  # exception for <e> to avoid confusion between crée / créai
            sNewWord += c
    return sNewWord.replace("eau", "o").replace("au", "o").replace("ai", "ẽ").replace("ei", "ẽ").replace("ph", "f")










aVowel = set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ")
aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ")
aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ")  # letters that may be used twice successively


# Similar chars







>











>
>
>
>
>
>
>
>







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    'â': 'a',  'è': 'e',  'ï': 'i',  'ö': 'o',  'ù': 'u',  'ŷ': 'i',
    'ä': 'a',  'ê': 'e',  'í': 'i',  'ó': 'o',  'ü': 'u',  'ý': 'i',
    'á': 'a',  'ë': 'e',  'ì': 'i',  'ò': 'o',  'ú': 'u',  'ỳ': 'i',
    'ā': 'a',  'ē': 'e',  'ī': 'i',  'ō': 'o',  'ū': 'u',  'ȳ': 'i',
    'ç': 'c',  'ñ': 'n',  'k': 'q',  'w': 'v',
    'œ': 'oe',  'æ': 'ae',
    'ſ': 's',  'ffi': 'ffi',  'ffl': 'ffl',  'ff': 'ff',  'ſt': 'ft',  'fi': 'fi',  'fl': 'fl',  'st': 'st',
    "⁰": "0", "¹": "1", "²": "2", "³": "3", "⁴": "4", "⁵": "5", "⁶": "6", "⁷": "7", "⁸": "8", "⁹": "9"
})

def simplifyWord (sWord):
    "word simplication before calculating distance between words"
    sWord = sWord.lower().translate(_xTransCharsForSimplification)
    sNewWord = ""
    for i, c in enumerate(sWord, 1):
        if c == 'e' or c != sWord[i:i+1]:  # exception for <e> to avoid confusion between crée / créai
            sNewWord += c
    return sNewWord.replace("eau", "o").replace("au", "o").replace("ai", "ẽ").replace("ei", "ẽ").replace("ph", "f")


_xTransNumbersToExponent = str.maketrans({
    "0": "⁰", "1": "¹", "2": "²", "3": "³", "4": "⁴", "5": "⁵", "6": "⁶", "7": "⁷", "8": "⁸", "9": "⁹"
})

def numbersToExponent (sWord):
    return sWord.translate(_xTransNumbersToExponent)


aVowel = set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ")
aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ")
aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ")  # letters that may be used twice successively


# Similar chars

Changes to graphspell/ibdawg.py.

310
311
312
313
314
315
316






317
318
319
320
321
322
323
...
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
        aSugg = oSuggResult.getSuggestions(nSuggLimit)
        if sSfx or sPfx:
            # we add what we removed
            return list(map(lambda sSug: sPfx + sSug + sSfx, aSugg))
        return aSugg

    def _splitSuggest (self, oSuggResult, sWord):






        for cSplitter in "'’":
            if cSplitter in sWord:
                sWord1, sWord2 = sWord.split(cSplitter, 1)
                if self.isValid(sWord1) and self.isValid(sWord2):
                    oSuggResult.addSugg(sWord1+" "+sWord2)

    def _suggest (self, oSuggResult, sRemain, nMaxSwitch=0, nMaxDel=0, nMaxHardRepl=0, nMaxJump=0, nDist=0, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False):
................................................................................
        #logging.info((nDeep * "  ") + sNewWord + ":" + sRemain)
        if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
            if not sRemain:
                oSuggResult.addSugg(sNewWord, nDeep)
                for sTail in self._getTails(iAddr):
                    oSuggResult.addSugg(sNewWord+sTail, nDeep)
                return
            elif self.isValid(sRemain) and oSuggResult.sWord.lower().startswith(sNewWord.lower()):
                oSuggResult.addSugg(sNewWord+" "+sRemain)
        if nDist > oSuggResult.nDistLimit:
            return
        cCurrent = sRemain[0:1]
        for cChar, jAddr in self._getCharArcs(iAddr):
            if cChar in cp.d1to1.get(cCurrent, cCurrent):
                self._suggest(oSuggResult, sRemain[1:], nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, jAddr, sNewWord+cChar)







>
>
>
>
>
>







 







|







310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
...
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
        aSugg = oSuggResult.getSuggestions(nSuggLimit)
        if sSfx or sPfx:
            # we add what we removed
            return list(map(lambda sSug: sPfx + sSug + sSfx, aSugg))
        return aSugg

    def _splitSuggest (self, oSuggResult, sWord):
        # split trailing numbers
        m = re.match(r"(\D+)([0-9]+)$", sWord)
        if m:
            print("ok")
            oSuggResult.addSugg(m.group(1) + " " + cp.numbersToExponent(m.group(2)))
        # split at apostrophes
        for cSplitter in "'’":
            if cSplitter in sWord:
                sWord1, sWord2 = sWord.split(cSplitter, 1)
                if self.isValid(sWord1) and self.isValid(sWord2):
                    oSuggResult.addSugg(sWord1+" "+sWord2)

    def _suggest (self, oSuggResult, sRemain, nMaxSwitch=0, nMaxDel=0, nMaxHardRepl=0, nMaxJump=0, nDist=0, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False):
................................................................................
        #logging.info((nDeep * "  ") + sNewWord + ":" + sRemain)
        if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
            if not sRemain:
                oSuggResult.addSugg(sNewWord, nDeep)
                for sTail in self._getTails(iAddr):
                    oSuggResult.addSugg(sNewWord+sTail, nDeep)
                return
            elif (len(sNewWord) + len(sRemain) == len(oSuggResult.sWord)) and oSuggResult.sWord.lower().startswith(sNewWord.lower()) and self.isValid(sRemain):
                oSuggResult.addSugg(sNewWord+" "+sRemain)
        if nDist > oSuggResult.nDistLimit:
            return
        cCurrent = sRemain[0:1]
        for cChar, jAddr in self._getCharArcs(iAddr):
            if cChar in cp.d1to1.get(cCurrent, cCurrent):
                self._suggest(oSuggResult, sRemain[1:], nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, jAddr, sNewWord+cChar)

Changes to misc/grammalecte.sublime-syntax.

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
..
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
...
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
...
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
...
198
199
200
201
202
203
204
205
206
207
208
209
210
    # 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|morphex|morphVC|stem|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+|rewriteSubject|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(?:upper|lower|digit|title))\b'
      scope: support.function

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

    - match: '/(\w+)/'
      scope: rule.actionoption
      captures:
        1: rule.optionname

    # Definitions and options
    - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPTSOFTWARE:'
      scope: options.command

    - match: '^OPT(?:LABEL|)/'
      scope: options.parameter

    - match: '^DEF: '
      scope: definition

    # Tests & TODO
    - match: '^TEST: (?:__[a-zA-Z0-9]+__ |)'
................................................................................
    # rule delimiters
    - match: '<<-|>>>'
      scope: keyword.action
    - match: '__also__'
      scope: keyword.condition.green
    - match: '__else__'
      scope: keyword.condition.red
    - match: '-(\d*\.?(?::\.?\d+|))>>'
      scope: keyword.error
      captures:
        1: keyword.error.group
    - match: '~(\d*(?::\d+|))>>'
      scope: keyword.textprocessor
      captures:
        1: keyword.textprocessor.group
    - match: '=>>'
      scope: keyword.disambiguator
    - match: '/(\d*(?::\d+|))>>'
      scope: keyword.tag
      captures:
        1: keyword.tag.group
    - match: '%(\d*)>>'
      scope: keyword.tag
      captures:
        1: keyword.tag.group

    # Tokens
    - match: '(>)\w+'
      scope: string.lemma
      captures:
        1: keyword.valid

    - match: '(~)(?!(?:\d+(?::\d+|)|)>>)[^\s¬]*'
      scope: string.regex
      captures:
................................................................................
        2: string.morph.pattern

    - match: '(/)[\w-]+'
      scope: string.tag
      captures:
        1: keyword.valid

    - match: '(?<=[\[ |])([*])([^\s¬]+)'
      scope: string.morph
      captures:
        1: keyword.valid
        2: string.meta

    - match: '(¬)(\S+)'
      scope: string.morph
................................................................................
    - match: '<(?:start|end)>'
      scope: string.token

    - match: '<>'
      scope: string.jumptoken

    # Escaped chars
    - match: '\\(?:\d+|w|d|b|n|s|t)'
      scope: constant.character.escape

    # URL
    - match: '\| ?https?://[\w./%?&=#+-]+'
      scope: string.other

    # Example errors
................................................................................
#      scope: constant.character.escape
#    - match: '(?:"|$)'
#      scope: punctuation.definition.string.end
#      pop: true

  line_comment:
    - meta_scope: comment.line
    - match: '\\[0-9]+'
      scope: constant.character.escape
    - match: '\| ?https?://[\w./%?&=#+-]+'
      scope: string.other
    - match: $
      pop: true







|







 







|


|







 







|



|





|



|





|







 







|







 







|







 







|





46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
..
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
...
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
...
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
...
198
199
200
201
202
203
204
205
206
207
208
209
210
    # 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+|rewriteSubject|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(?:upper|lower|digit|title))\b'
      scope: support.function

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

    - match: '/(\w+)/'
      scope: rule.actionoption
      captures:
        1: rule.optionname

    # Definitions and options
    - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPT(?:SOFTWARE|COLORTHEME):|^COLOR/'
      scope: options.command

    - match: '^OPT(?:LABEL|COLOR|)/'
      scope: options.parameter

    - match: '^DEF: '
      scope: definition

    # Tests & TODO
    - match: '^TEST: (?:__[a-zA-Z0-9]+__ |)'
................................................................................
    # rule delimiters
    - match: '<<-|>>>'
      scope: keyword.action
    - match: '__also__'
      scope: keyword.condition.green
    - match: '__else__'
      scope: keyword.condition.red
    - match: '-(-?\d*\.?(?::\.?-?\d+|))(?::|)>>'
      scope: keyword.error
      captures:
        1: keyword.error.group
    - match: '~(-?\d*(?::-?\d+|))>>'
      scope: keyword.textprocessor
      captures:
        1: keyword.textprocessor.group
    - match: '=>>'
      scope: keyword.disambiguator
    - match: '/(-?\d*(?::-?\d+|))>>'
      scope: keyword.tag
      captures:
        1: keyword.tag.group
    - match: '%(-?\d*(?::-?\d+|))>>'
      scope: keyword.tag
      captures:
        1: keyword.tag.group

    # Tokens
    - match: '(>)[\w-]+'
      scope: string.lemma
      captures:
        1: keyword.valid

    - match: '(~)(?!(?:\d+(?::\d+|)|)>>)[^\s¬]*'
      scope: string.regex
      captures:
................................................................................
        2: string.morph.pattern

    - match: '(/)[\w-]+'
      scope: string.tag
      captures:
        1: keyword.valid

    - match: '(?<=[^\w])([*][a-zA-Z0-9_]+)'
      scope: string.morph
      captures:
        1: keyword.valid
        2: string.meta

    - match: '(¬)(\S+)'
      scope: string.morph
................................................................................
    - match: '<(?:start|end)>'
      scope: string.token

    - match: '<>'
      scope: string.jumptoken

    # Escaped chars
    - match: '\\(?:-?\d+|w|d|b|n|s|t)'
      scope: constant.character.escape

    # URL
    - match: '\| ?https?://[\w./%?&=#+-]+'
      scope: string.other

    # Example errors
................................................................................
#      scope: constant.character.escape
#    - match: '(?:"|$)'
#      scope: punctuation.definition.string.end
#      pop: true

  line_comment:
    - meta_scope: comment.line
    - match: '\\-?[0-9]+'
      scope: constant.character.escape
    - match: '\| ?https?://[\w./%?&=#+-]+'
      scope: string.other
    - match: $
      pop: true