Grammalecte  Check-in [cbfed9773f]

Overview
Comment:[core][build][fr][misc] disambiguator: merge functions select() and exclude() in one function -> select()
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | core | build | misc
Files: files | file ages | folders
SHA3-256: cbfed9773f144ab5736436e0232f35b8614011dec35bc6c932d3e025177f9227
User & Date: olr on 2020-12-12 16:54:16
Other Links: manifest | tags
Context
2020-12-13
09:50
[build] fix regex check-in: dc5d496871 user: olr tags: build, trunk
2020-12-12
16:54
[core][build][fr][misc] disambiguator: merge functions select() and exclude() in one function -> select() check-in: cbfed9773f user: olr tags: build, core, fr, misc, trunk
2020-12-11
20:04
[lo][fr] update version to download extension check-in: c491b9dc46 user: olr tags: fr, lo, trunk
Changes

Modified compile_rules.py from [ac30a9ef24] to [b5b4c7e6b9].

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    s = re.sub(r"\brealstart\(\)", 'before("^ *$")', s)
    s = re.sub(r"\bstart0\(\)", 'before0("^ *$|, *$")', s)
    s = re.sub(r"\brealstart0\(\)", 'before0("^ *$")', s)
    s = re.sub(r"\bend\(\)", 'after("^ *$|^,")', s)
    s = re.sub(r"\brealend\(\)", 'after("^ *$")', s)
    s = re.sub(r"\bend0\(\)", 'after0("^ *$|^,")', s)
    s = re.sub(r"\brealend0\(\)", 'after0("^ *$")', s)
    s = re.sub(r"\b(select|exclude)[(][\\](\d+)", '\\1(dTokenPos, m.start(\\2), m.group(\\2)', s)
    s = re.sub(r"\bdefine[(][\\](\d+)", 'define(dTokenPos, m.start(\\1)', s)
    s = re.sub(r"\b(morph|info)[(][\\](\d+)", '\\1((m.start(\\2), m.group(\\2))', s)
    s = re.sub(r"\b(morph|info)[(]", '\\1(dTokenPos, ', s)
    s = re.sub(r"\b(sugg\w+|switch\w+)\(@", '\\1(m.group(i[4])', s)
    s = re.sub(r"\bword\(\s*1\b", 'nextword1(sSentence, m.end()', s)                                # word(1)
    s = re.sub(r"\bword\(\s*-1\b", 'prevword1(sSentence, m.start()', s)                             # word(-1)
    s = re.sub(r"\bword\(\s*(\d)", 'nextword(sSentence, m.end(), \\1', s)                           # word(n)







|







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    s = re.sub(r"\brealstart\(\)", 'before("^ *$")', s)
    s = re.sub(r"\bstart0\(\)", 'before0("^ *$|, *$")', s)
    s = re.sub(r"\brealstart0\(\)", 'before0("^ *$")', s)
    s = re.sub(r"\bend\(\)", 'after("^ *$|^,")', s)
    s = re.sub(r"\brealend\(\)", 'after("^ *$")', s)
    s = re.sub(r"\bend0\(\)", 'after0("^ *$|^,")', s)
    s = re.sub(r"\brealend0\(\)", 'after0("^ *$")', s)
    s = re.sub(r"\bselect[(][\\](\d+)", '\\1(dTokenPos, m.start(\\2), m.group(\\2)', s)
    s = re.sub(r"\bdefine[(][\\](\d+)", 'define(dTokenPos, m.start(\\1)', s)
    s = re.sub(r"\b(morph|info)[(][\\](\d+)", '\\1((m.start(\\2), m.group(\\2))', s)
    s = re.sub(r"\b(morph|info)[(]", '\\1(dTokenPos, ', s)
    s = re.sub(r"\b(sugg\w+|switch\w+)\(@", '\\1(m.group(i[4])', s)
    s = re.sub(r"\bword\(\s*1\b", 'nextword1(sSentence, m.end()', s)                                # word(1)
    s = re.sub(r"\bword\(\s*-1\b", 'prevword1(sSentence, m.start()', s)                             # word(-1)
    s = re.sub(r"\bword\(\s*(\d)", 'nextword(sSentence, m.end(), \\1', s)                           # word(n)

Modified compile_rules_graph.py from [611d15ee62] to [d4d961a0bc].

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







|
|







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    if sCode[0:1] == "=":
        sCode = sCode[1:]
    sCode = sCode.replace("__also__", "bCondMemo")
    sCode = sCode.replace("__else__", "not bCondMemo")
    sCode = sCode.replace("sContext", "_sAppContext")
    sCode = re.sub(r"\b(morph0?|morphVC|value|tag|meta|info)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(morph0?|morphVC|value|tag|meta|info)[(]\\-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(select|define|definefrom|rewrite|addmorph|setmeta)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(select|define|definefrom|rewrite|addmorph|setmeta)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], dTags', sCode)
    sCode = re.sub(r"\bspace[(][\\](\d+)", 'g_space(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\bspace[(][\\]-(\d+)", 'g_space(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\bmorph2[(][\\](\d+)", 'g_morph2(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode)
    sCode = re.sub(r"\bmorph2[(][\\]-(\d+)", 'g_morph2(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode)
    sCode = re.sub(r"\b(morph0?|tag|meta|value)\(>1", 'g_\\1(lToken[nLastToken+1]', sCode)                      # next token

Modified gc_core/js/lang_core/gc_functions.js from [1f04b155c5] to [7edc6f08c2].

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
409
410
411


412
413
414
415
416


417
418
419
420
421
422
423
424
425
426
    }
    return lToken[i];
}


//////// Disambiguator for regex rules

function select (dTokenPos, nPos, sWord, sPattern) {
    if (!sWord) {
        return true;
    }
    if (!dTokenPos.has(nPos)) {
        console.log("Error. There should be a token at this position: ", nPos);
        return true;
    }
    let lMorph = gc_engine.oSpellChecker.getMorph(sWord);
    if (lMorph.length === 0  ||  lMorph.length === 1) {
        return true;
    }



    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        dTokenPos.get(nPos)["lMorph"] = lSelect;
    }
    return true;


}

function exclude (dTokenPos, nPos, sWord, sPattern) {
    if (!sWord) {
        return true;

    }
    if (!dTokenPos.has(nPos)) {
        console.log("Error. There should be a token at this position: ", nPos);
        return true;
    }
    let lMorph = gc_engine.oSpellChecker.getMorph(sWord);
    if (lMorph.length === 0  ||  lMorph.length === 1) {
        return true;
    }
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        dTokenPos.get(nPos)["lMorph"] = lSelect;
    }
    return true;
}

function define (dTokenPos, nPos, sMorphs) {
................................................................................
    dTokenPos.get(nPos)["lMorph"] = sMorphs.split("|");
    return true;
}


//// Disambiguation for graph rules

function g_select (oToken, sPattern) {
    // select morphologies for <oToken> according to <sPattern>, always return true
    let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    if (lMorph.length === 0  || lMorph.length === 1) {
        return true;
    }






    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}



function g_exclude (oToken, sPattern) {
    // select morphologies for <oToken> according to <sPattern>, always return true
    let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    if (lMorph.length === 0  || lMorph.length === 1) {


        return true;
    }
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}

function g_addmorph (oToken, sNewMorph) {







|











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

<
|
|
<
<
<


<







 







|





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


<







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


409

410
411
412
413




414
415
416
417

418
419
420
421
422
423
424
    }
    return lToken[i];
}


//////// Disambiguator for regex rules

function select (dTokenPos, nPos, sWord, sPattern, sNegPattern="") {
    if (!sWord) {
        return true;
    }
    if (!dTokenPos.has(nPos)) {
        console.log("Error. There should be a token at this position: ", nPos);
        return true;
    }
    let lMorph = gc_engine.oSpellChecker.getMorph(sWord);
    if (lMorph.length === 0  ||  lMorph.length === 1) {
        return true;
    }
    let lSelect;
    if (sPattern) {
        if (sNegPattern) {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 && sMorph.search(sNegPattern) === -1 );


        }

        else {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
        }
    }


    else if (sNegPattern) {
        lSelect = lMorph.filter( sMorph => sMorph.search(sNegPattern) === -1 );
    }

    else {
        console.log("[Grammalecte] Error: missing pattern for disambiguation selection...");



        return true;
    }

    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        dTokenPos.get(nPos)["lMorph"] = lSelect;
    }
    return true;
}

function define (dTokenPos, nPos, sMorphs) {
................................................................................
    dTokenPos.get(nPos)["lMorph"] = sMorphs.split("|");
    return true;
}


//// Disambiguation for graph rules

function g_select (oToken, sPattern, sNegPattern="") {
    // select morphologies for <oToken> according to <sPattern>, always return true
    let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    if (lMorph.length === 0  || lMorph.length === 1) {
        return true;
    }
    let lSelect;
    if (sPattern) {
        if (sNegPattern) {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 && sMorph.search(sNegPattern) === -1 );
        }
        else {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );


        }

    }
    else if (sNegPattern) {
        lSelect = lMorph.filter( sMorph => sMorph.search(sNegPattern) === -1 );
    }




    else {
        console.log("[Grammalecte] Error: missing pattern for disambiguation selection...");
        return true;
    }

    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}

function g_addmorph (oToken, sNewMorph) {

Modified gc_core/py/lang_core/gc_functions.py from [fb2b86ce70] to [9e52227dd2].

294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
...
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
        return lToken[-1]
    return lToken[i]



#### Disambiguator for regex rules

def select (dTokenPos, nPos, sWord, sPattern):
    "Disambiguation: select morphologies of <sWord> matching <sPattern>"
    if not sWord:
        return True
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        return True
    lMorph = _oSpellChecker.getMorph(sWord)
    if not lMorph or len(lMorph) == 1:
        return True
    lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dTokenPos[nPos]["lMorph"] = lSelect
    return True


def exclude (dTokenPos, nPos, sWord, sPattern):
    "Disambiguation: exclude morphologies of <sWord> matching <sPattern>"
    if not sWord:
        return True
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        return True
    lMorph = _oSpellChecker.getMorph(sWord)
    if not lMorph or len(lMorph) == 1:
        return True
    lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dTokenPos[nPos]["lMorph"] = lSelect
    return True


def define (dTokenPos, nPos, sMorphs):
    "Disambiguation: set morphologies of token at <nPos> with <sMorphs>"
................................................................................
        return True
    dTokenPos[nPos]["lMorph"] = sMorphs.split("|")
    return True


#### Disambiguation for graph rules

def g_select (dToken, sPattern):
    "Disambiguation: select morphologies for <dToken> according to <sPattern>, always return True"
    lMorph = dToken["lMorph"]  if "lMorph" in dToken  else _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph or len(lMorph) == 1:
        return True




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




def g_exclude (dToken, sPattern):
    "Disambiguation: select morphologies for <dToken> according to <sPattern>, always return True"
    lMorph = dToken["lMorph"]  if "lMorph" in dToken  else _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph or len(lMorph) == 1:
        return True
    lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dToken["lMorph"] = lSelect
    #echo("DA:", dToken["sValue"], dToken["lMorph"])
    return True


def g_addmorph (dToken, sNewMorph):







|









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







 







|
|



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

<







294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320







321
322
323
324
325
326
327
...
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
356
357
358
        return lToken[-1]
    return lToken[i]



#### Disambiguator for regex rules

def select (dTokenPos, nPos, sWord, sPattern, sNegPattern=""):
    "Disambiguation: select morphologies of <sWord> matching <sPattern>"
    if not sWord:
        return True
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        return True
    lMorph = _oSpellChecker.getMorph(sWord)
    if not lMorph or len(lMorph) == 1:
        return True
    if sPattern:
        if sNegPattern:
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) and not re.search(sNegPattern, sMorph) ]
        else:
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) ]
    elif sNegPattern:
        lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sNegPattern, sMorph) ]
    else:
        echo("# Error: missing pattern for disambiguation selection...")
        return True







    if lSelect and len(lSelect) != len(lMorph):
        dTokenPos[nPos]["lMorph"] = lSelect
    return True


def define (dTokenPos, nPos, sMorphs):
    "Disambiguation: set morphologies of token at <nPos> with <sMorphs>"
................................................................................
        return True
    dTokenPos[nPos]["lMorph"] = sMorphs.split("|")
    return True


#### Disambiguation for graph rules

def g_select (dToken, sPattern, sNegPattern=""):
    "Disambiguation: select morphologies for <dToken> according to <sPattern>, removing those matching <sNegPattern>; always return True"
    lMorph = dToken["lMorph"]  if "lMorph" in dToken  else _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph or len(lMorph) == 1:
        return True
    if sPattern:
        if sNegPattern:
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) and not re.search(sNegPattern, sMorph) ]
        else:
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) ]






    elif sNegPattern:
        lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sNegPattern, sMorph) ]
    else:
        echo("# Error: missing pattern for disambiguation selection...")


        return True

    if lSelect and len(lSelect) != len(lMorph):
        dToken["lMorph"] = lSelect
    #echo("DA:", dToken["sValue"], dToken["lMorph"])
    return True


def g_addmorph (dToken, sNewMorph):

Modified gc_lang/fr/perf_memo.txt from [3126d748b9] to [38382db779].

33
34
35
36
37
38
39
40
1.12.2      2020.09.09 13:34    1.50568     0.374504    0.233108    0.0798712   0.0804466   0.0769674   0.171519    0.0945132   0.0165344   0.0019474
1.12.2      2020.09.09 13:35    1.41094     0.359093    0.236443    0.06968     0.0734418   0.0738087   0.169371    0.0946279   0.0167106   0.0019773
1.12.2      2020.09.11 19:16    1.35297     0.330545    0.221731    0.0666998   0.0692539   0.0701707   0.160564    0.0891676   0.015807    0.0045998
1.12.2      2020.09.30 14:50    1.37531     0.330381    0.226012    0.0668063   0.0690574   0.0694727   0.160282    0.0929373   0.0176629   0.0019713
1.12.2      2020.09.30 17:01    1.37168     0.329009    0.248127    0.0670758   0.0701238   0.0910568   0.170556    0.093876    0.0168925   0.0020051
1.12.2      2020.10.01 11:18    1.36493     0.34176     0.24473     0.0691607   0.0720002   0.0903613   0.170067    0.0934571   0.0174357   0.0019585
2.0.0       2020.11.29 00:00    1.27748     0.320919    0.227774    0.0649503   0.0688481   0.0672859   0.163426    0.0878984   0.016784    0.0018913
2.0.0       2020.11.30 11:29    1.41342     0.337644    0.237702    0.0724714   0.0806047   0.0743924   0.190887    0.101287    0.0176239   0.0022744   







|
33
34
35
36
37
38
39
40
1.12.2      2020.09.09 13:34    1.50568     0.374504    0.233108    0.0798712   0.0804466   0.0769674   0.171519    0.0945132   0.0165344   0.0019474
1.12.2      2020.09.09 13:35    1.41094     0.359093    0.236443    0.06968     0.0734418   0.0738087   0.169371    0.0946279   0.0167106   0.0019773
1.12.2      2020.09.11 19:16    1.35297     0.330545    0.221731    0.0666998   0.0692539   0.0701707   0.160564    0.0891676   0.015807    0.0045998
1.12.2      2020.09.30 14:50    1.37531     0.330381    0.226012    0.0668063   0.0690574   0.0694727   0.160282    0.0929373   0.0176629   0.0019713
1.12.2      2020.09.30 17:01    1.37168     0.329009    0.248127    0.0670758   0.0701238   0.0910568   0.170556    0.093876    0.0168925   0.0020051
1.12.2      2020.10.01 11:18    1.36493     0.34176     0.24473     0.0691607   0.0720002   0.0903613   0.170067    0.0934571   0.0174357   0.0019585
2.0.0       2020.11.29 00:00    1.27748     0.320919    0.227774    0.0649503   0.0688481   0.0672859   0.163426    0.0878984   0.016784    0.0018913
2.0.0       2020.11.30 11:29    1.41342     0.337644    0.237702    0.0724714   0.0806047   0.0743924   0.190887    0.101287    0.0176239   0.0022744

Modified gc_lang/fr/rules.grx from [d23f38e310] to [4d58431d97].

2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
....
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
....
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
....
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
....
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
....
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
....
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
....
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
....
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
....
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
....
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
....
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
....
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
....
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
....
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
....
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
....
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
....
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
....
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
.....
16349
16350
16351
16352
16353
16354
16355

16356
16357
16358
16359
16360
16361
16362
.....
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
.....
17739
17740
17741
17742
17743
17744
17745

17746
17747
17748
17749
17750
17751
17752
.....
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
19147
19148
19149
19150
19151
19152
19153
19154
19155
19156
.....
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
.....
23481
23482
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495

    le [*NUM|*WORDORD]
        <<- =>> select(\1, ":D")

    la  *WORD
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|plupart|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")
        <<- __else__ and not value(<1, "|le|ce|du|") =>> exclude(\1, ":N")

    les *WORD
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")

    leur    *WORD
        <<- not value(<1, "|le|du|") =>> exclude(\1, ":N")
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")

    leurs   *WORD
        <<- not value(<1, "|les|des|") =>> exclude(\1, ":N")

    en  [*NUM|*HOUR]
        <<- =>> select(\1, ":R")

    en  *WORD
        <<- value(<1, "|j’|n’|m’|t’|s’|l’|c’|") or morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")
        <<- __else__ and not morph(<1, ":O[sv]") and morph(\2, ":", ":[ISKYPE]") =>> select(\1, ":R")
................................................................................

    y   *WORD
        <<- value(<1, "|j’|n’|m’|t’|s’|l’|c’|") or morph(\2, ":(?:[123][sp]|P|Y)") =>> select(\1, ":Ov")


__da_nous_vous__
    [ne|n’] [nous|vous]
        <<- =>> exclude(\2, ":Os")

    nous [>avoir|>être]
        <<- not morph(\2, ":1p") =>> exclude(\1, ":Os")

    vous [>avoir|>être]
        <<- not morph(\2, ":2p") =>> exclude(\1, ":Os")


__da_préverbes_verbes__
    [ne|n’]  ?[le|la|l’|les|nous|vous|lui|leur]¿  @:¬:[OX]
    [ne|n’]  [nous|vous]     [le|la|l’|les|en]    @:¬:[OX]
    [ne|n’]  [le|la|l’|les]  [lui|leur|en]        @:¬:[OX]
    [ne|n’]  [lui|leur]      en                   @:¬:[OX]
................................................................................
    [me|m’|te|t’|se|s’]     [en|le|la|l’|les|y]
        <<- =>> select(\2, ":Ov")

    lui @:[ISKQYP]¬:3s
        <<- =>> select(\1, ":Ov")

    lui
        <<- morph(<1, ":R") =>> exclude(\1, ":(?:Q|Os)")

    [me|m’|te]  ?[le|la|l’|les|en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYPE]")

    [se|s’]  ?[le|la|l’|les|en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYP]")

................................................................................
    $:M  @:[123]s¬:[QWA]
        <<- \2.islower() and morph(<1, ":Cs|<start>") =>> select(\2, ":[123][sp]")

    <start>  $:M  @:(?:[123]s|Ov)¬:A
        <<- =>> =select(\2, ":M")

    [que|qu’|combien|pourquoi|qui|quand|où]  ?[en|y]¿  *WORD
        <<- =>> exclude(\-1, ":E")

    [<start>|,|(]  quelqu’ un  *WORD
        <<- =>> exclude(\4, ":N")

    >falloir [pouvoir|savoir|vouloir|manger|conseiller]
        <<- =>> exclude(\2, ":N")

    v’nir
        <<- ~>> venir

    s’ ra
        <<- ~>> ␣sera

................................................................................
    nous ?[ne|n’]¿ [lui|leur]      en                 sommes
        <<- not morph(<1, ":R") =>> select(\-1, ":V0")

    [de|d’|par|pour|sans|contre] [elle|lui|nous|vous|eux|elles|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]
        <<- =>> select(\-1, ":Oo")

    après avoir $:Q
        <<- =>> exclude(\2, ":N")


__da_jours__
    [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> select(\1, ":W")

__da_a__
    [ça|ceci|cela] a
        <<- =>> select(\2, ":V")

__da_autour__
    autour [de|du|d’|des]
        <<- not morph(<1, ":D.*:[me]") =>> exclude(\1, ":N")

__da_avant__
    avant [que|qu’|$:D]
        <<- not value(<1, "|l’|quel|cet|un|mon|ton|son|notre|votre|leur|") =>> select(\1, ":R")

__da_bien__
    bien [que|qu’]
        <<- not morph(<1, ":[DNA].*:[me]:[si]") =>> exclude(\1, ":[AW]")

    bien $:Y
        <<- not morph(<1, ":[DNA].*:[me]:[si]") =>> select(\1, ":W")

    bien *WORD
        <<- not value(\2, "|que|qu’|") =>> exclude(\1, ":G")

__da_car__
    car
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> select(\1, ":G")

__da_ce__
    c’  [>avoir|>être]
................................................................................
        <<- not value(<1, "|il|ils|on|ne|n’|") =>> select(\1, ":D") and select(\2, ":[NA]")

    ce  @:3[sp]¬:[NA].*:[me]:[si]
    ce  [ne|n’]
        <<- =>> select(\1, ":O")

    ce [que|qu’|qui|dont|pour|par]
        <<- =>> exclude(\1, ":D")

__da_cela__
    [<start>|,|(]  cela  [ne|n’|me|m’|te|t’|se|s’]
    [<start>|,|(]  cela  [le|la|l’|les|en|nous|vous|lui|leur|y]  @:(?:[123]s|P)
    [<start>|,|(]  cela  [nous|vous]     [le|la|l’|les|en|y]     @:(?:[123]s|P)
    [<start>|,|(]  cela  [le|la|l’|les]  [lui|leur|en|y]         @:(?:[123]s|P)
    [<start>|,|(]  cela  [lui|leur|y]    en                      @:(?:[123]s|P)
    [<start>|,|(]  cela  @:(?:[123]s|P)
        <<- =>> exclude(\2, ":V")

__da_certains_certaines__
    certains  @:[NA].*:[me]:[pi]¬:(?:G|3[sp])
        <<- =>> exclude(\1, ":O")

    certaines  @:[NA].*:[fe]:[pi]¬:(?:G|3[sp])
        <<- =>> exclude(\1, ":O")

    certains [ne|n’|me|m’|te|t’|se|s’]               @:3p
    certains [le|la|l’|les|en|nous|vous|lui|leur|y]  @:3p
    certains [nous|vous]     [le|la|l’|les|en|y]     @:3p
    certains [le|la|l’|les]  [lui|leur|en|y]         @:3p
    certains [lui|leur|y]    en                      @:3p
    certains @:3p¬:(?:G|[NA].*:[me]:[pi]|V.e)
................................................................................
    [la|les|des|une|cette|ma|ta|sa|notre|votre|leur+s] >lutte       ?$:A¬:G¿  contre
    [>accusation|>action|>assaut|>attentat|>croisade|>guerre]       ?$:A¬:G¿  contre
    [>guerre|>jihad|>offensive|>ratonnade|>sortilège|>violence]     ?$:A¬:G¿  contre
    [>antidote|>crime|>philtre|>remède|>sérum|>vaccin|>solution]    ?$:A¬:G¿  contre
        <<- =>> select(\-1, ":R")

    contre
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> exclude(\1, ":N")

__da_dans__
    dans
        <<- not morph(<1, ":D.*:p|>[a-zé-]+ième/") =>> select(\1, ":R")

__da_de__
    [de|d’] [me|m’|te|t’|se|s’|en|y|nous|vous|moi|toi|soi|lui|elle|iel|eux|elles|iels]
................................................................................

    >différence entre
    >choisir entre
        <<- =>> select(\-1, ":R")

__da_environ__
    environ  [$:B|*NUM]
        <<- not value(<1, "|l’|un|cet|quel|") =>> exclude(\1, ":N")

__da_été__
    >avoir ?@:[WX]¿ été
        <<- =>> select(\1, ":V0") and select(\-1, ":Q")

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

__da_face__
    face [à|au|aux]
        <<- not morph(<1, ":(?:D|A.*:[fe]:[si])") =>> exclude(\1, ":N")
        <<- __else__ =>> select(\1, ":N")

__da_grâce__
    grâce [à|au|aux]
        <<- not morph(<1, ":(?:D|A.*:[fe]:[si])") =>> exclude(\1, ":N")

__da_grave__
    grave
        <<- morph(<1, ":D") =>> exclude(\1, ":W")

__da_mais__
    mais
        <<- not value(<1, "|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques|") =>> exclude(\1, ":N")

    n’ en >pouvoir mais
        <<- =>> define(\-1, ">mais/:W")

__da_mal__
    pas mal
        <<- =>> select(\2, ":W")
................................................................................

__da_point__
    [le|l’|un|mon|notre|votre|leur|chaque|mes|tes|ses|nos|vos|leurs|quel|quels|quelle|quelles] point
        <<- =>> select(\2, ":N")

    [ne|n’]  $:V  point
    [ne|n’] point
        <<- =>> exclude(\-1, ":N")

__da_nos__
    nos $¬:B
        <<- =>> select(\1, ":D")

__da_parmi__
    parmi *WORD
        <<- =>> select(\1, ":R")

__da_pas__
    pas
        <<- morph(<1, ":[VWX]") =>> exclude(\1, ":N")

    pourquoi pas
        <<- =>> select(\2, ":X")

__da_passé__
    passé  [<end>|,|$:R]
        <<- =>> exclude(\1, ":G")

__da_pendant__
    ## évènements
    pendant ?tout¿ [le|l’|ce|cet|mon|ton|son|notre|votre|leur] ?[interminable|long]¿
        || [accouchement|acte|âge|colloque|confinement|conflit|cours|couronnement|déjeuner|dîner|diner|entracte|entrainement|entraînement|entretien|examen|événement|évènement|interrègne|jihad|mandat|mariage|match|passage|procès|repas|règne|sommeil|souper|temps|travail|voyage]
    pendant ?toute¿ [la|l’|cette|ma|ta|sa|mon|ton|son|notre|votre|leur] ?[interminable|longue]¿
        || [adolescence|cérémonie|compétition|crise|croisade|dictature|durée|enfance|étude|existence|guerre|interview|intronisation|messe|partie|pause|période|prière|querelle|rencontre|récréation|régence|retraite|réunion|révolution|séance|thérapie|traversée|tyrannie|union|vacance|vie]
................................................................................
        <<- =>> select(\1, ":R")

__da_personne__
    personne [ne|n’]
        <<- not morph(<1, ":[DA].*:[fe]:[si]") =>> select(\1, ":O")

    n’  $:V  personne
        <<- =>> exclude(\-1, ":N")

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

__da_plus_moins__
    [plus|moins]
................................................................................
        <<- not value(<1, "|je|ne|n’|") =>> select(\1, ":W")

    [un|une|des|le|la|l’|les|mon|ton|son|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs] [plus|moins] @:[AW]¬:G
        <<- =>> select(\2, ":W")

__da_pourvu__
    pourvu
        <<- not value(>1, "|que|qu’|") =>> exclude(\1, ":G")

__da_puis__
    puis
        <<- not value(<1, "|je|ne|n’|le|l’|leur|") =>> exclude(\1, ":V")

__da_quelque__
    quelque *NUM
        <<- =>> select(\1, ":W")

    quelque [autre|chose|temps|part]
        <<- =>> select(\1, ":D")

__da_SA__
    SA
        <<- morph(<1, ":D") =>> exclude(\1, ":D")

__da_selon__
    selon @:(?:[DBM]|Oo)
        <<- =>> select(\1, ":R")

    selon [,|<end>]
        <<- =>> select(\1, ":W")
................................................................................
        <<- =>> select(\1, ":W") and select(\2, ":W")

    si @:[AW]¬:G
        <<- morph(<1, ":N", ":D") =>> select(\1, ":W")

__da_son_ton__
    [le|ce|cet|mon|ton|son|quel|quelque|notre|votre|un|leur|ledit|dudit|chaque|des|les|quelques|quel|quelle|quels|quelles]  [son|ton]
        <<- =>> exclude(\2, ":D")

    [son|ton] *WORD
        <<- morph(\2, ":G", ":[NA]") or value(<1, "|du|le|ce|un|quel|mon|") =>> exclude(\1, ":D")
        <<- __else__ and morph(\2, ":N", "*") =>> select(\1, ":D")

    [son|ton] ,
        <<- =>> select(\1, ":N")

__da_sans__
    sans [que|qu’]
................................................................................
        <<- not morph(<1, ":[DA].*:[me]:[pi]") =>> select(\1, ":R")

    sur @:[BD]
        <<- not morph(<1, ":(?:V[0123]e|[DN].*:[me]:[si])") =>> select(\1, ":R")

__da_tout__
    tout
        <<- morph(<1, "<start>|>,") =>> exclude(\1, ":N")

    tout @:N.*:[me]:[si]¬:(?:[AGW]|3s)
        <<- =>> select(\1, ":D")

    tout le monde
        <<- =>> select(\1, ":W") and select(\2, ":D") and select(\-1, ":N")

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

__da_vis_à_vis__
    vis-à-vis [de|des|du|d’]
        <<- not morph(<1, ":(?:[DA].*:[me]|R)") =>> select(\1, ":R")

__da_vu__
    vu  [<end>|,|$:R]
        <<- =>> exclude(\1, ":G")

__da_y_compris__
    y compris
        <<- not value(<1, "|n’|j’|tu|t’|m’|s’|") ~>> ␣
        <<- __also__ =>> define(\1, ":G:R:LR")


................................................................................
        <<- =>> select(\-1, ":N")


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    avions
................................................................................
        <<- =>> define(\1, ":GN:m:p")

    l’ une comme l’ autre
        <<- ~>> ␣
        <<- =>> define(\1, ":GN:f:p")

    en peine
        <<- not value(<1, "|ne|n’|j’|on|il|elle|iel|") =>> exclude(\2, ":V")

    m’ dame
        <<- ~>> ␣madame

    m’ sieur
        <<- ~>> ␣

................................................................................
TEST: Votre question fait référence à un fait divers déroutant
TEST: il s’ra bien heureux d’vous voir.
TEST: tu s’ras bien content d’nous voir.


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


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

    Mustang
................................................................................
    en tout état [de|d’] cause
    en tout premier lieu
    en toute bonne foi
    en ?toute¿ connaissance [de|d’] cause
    en toute [confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|modestie|sécurité|simplicité]
    en travers [de|d’] la gorge
    en trompe-l’œil

    en vase clos
    en vigueur
    en vitesse ?[subsonique|supersonique|subluminique|superluminique]¿
    en voie [de|d’] développement
    en vrac
    en y [réfléchissant|songeant] bien
    en [mon|ton|son|leur|notre|votre] âme et conscience
................................................................................
        <<- ~2>> *

    pas très
        <<- morph(<1, ":[NV]", ":A:[em]:[is]") ~>> *

    personne  d’ autre [que|qu’]  [moi|moi-même|toi|toi-même|lui|lui-même|elle|elle-même|elles|elles-mêmes|nous|nous-même|nous-mêmes|vous|vous-même|vous-mêmes|eux-mêmes|iel|iels|iel-même|iels-mêmes]
        <<- ~2:0>> *
        <<- =>> exclude(\1, ":N")

    pour ou contre
        <<- ~2:0>> *

    qui ce      [jour-là|matin-là|après-midi-là|soir-là|mois-là|siècle-là|millénaire-là]
    qui cette   [nanoseconde-là|milliseconde-là|seconde-là|minute-là|heure-là|nuit-là|matinée-là|soirée-là|journée-là|semaine-là|année-là|décennie-là]
    qui à part  [moi|toi|lui|elle|nous|vous|eux|elles]
................................................................................
    >livret d’ épargne ?[bancaire|populaire|salariale]¿
    >local à louer
    >locomotive à vapeur
    >loi d’ airain
    >longueur d’ avance
    >lopin [de|d’] terre ?[desséchée|glaiseuse|grise|jaune|noire|ocre|rouge|sableuse|sèche]¿
    >lune [de|d’] miel

    >lutte à outrance
    >machine à [café|coudre|écrire|laver|sous|vapeur|voter]
    >machine à remonter le temps
    >machine [de|d’] guerre
    >maillot [de|d’] bain
    >main d’ œuvre
    >maison à colombages
................................................................................

__da_le_la_les_leur2__
    [<start>|,|(]  c’                                                 ?[ne|n’]¿  >être   [le|la|l’|les]  @:[NA]¬:G
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [lui|leur|y]                    en                          *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
        <<- morph(\-3, ":[123][sp]") =>> =select(\-2, ":D") and exclude(\-1, ":[123][sp]")

    [/_VCint_|/_VCimp_]  [le|la|l’|les|leur|leurs]  @:[NA]¬:[YG]
        <<- =>> =select(\-2, ":D") and exclude(\-1, ":[123][sp]")


__da_substantifs__
    [<start>|,|(]  $:D  *WORD  *WORD  [ne|n’|me|m’|te|t’|se|s’]
    [<start>|,|(]  $:D  *WORD  *WORD  [en|nous|vous|lui|y]                    @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [le|la|l’|les|leur]                     @:(?:[123][sp]|P)¬:[NA]
    [<start>|,|(]  $:D  *WORD  *WORD  [nous|vous]     [le|la|l’|les|en|y]     @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [le|la|l’|les]  [lui|leur|en|y]         @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [lui|leur|y]    en                      @:(?:[123][sp]|P)
        <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":(?:[PG]|V[023])") =>> exclude(\4, ":V")

    [<start>|,|(]  $:D  *WORD  *WORD  @:(?:3[sp]|P)¬:[GW]
        <<- morph(\2, ":p") and morph(\3, ":[NA].*:p", ":(?:G|V0)") and morph(\4, ":[NA].*:p", ":(?:[PGQ]|V[023])") =>> exclude(\4, ":V")
        <<- __else__ and
            morph(\2, ":s") and morph(\3, ":[NA].*:s", ":(?:G|V0)") and morph(\4, ":[NA].*:s", ":(?:[PGQ]|V[023])") and not morph(\5, ":A.*:[si]") =>> exclude(\4, ":V")

    [des|ces|mes|tes|ses|nos|vos|quelques|lesdits]  @:A.*:[pi]  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- =>> exclude(\3, ":V")

    les  @:A.*:[pi]¬:V  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- not before(":O[vs]") =>> exclude(\3, ":V")

    leurs  @:A.*:[pi]¬:V  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- not before(":O[vs]") =>> exclude(\3, ":V")

    [plusieurs|certains|certaines|maints|maintes]  @:A.*:[pi]¬:3[sp]  @:N.*:p¬:(?:3[sp]|Q|G)
        <<- =>> select(\2, ":A") and exclude(\3, ":N")


__da_locutions_verbales__
    >avoir [cours|foule|lieu|recours|vent]
    >avoir ni queue ?,¿ ni tête
    >aller bon train
    >aller [de|d’] l’ avant
................................................................................
    qui  ?[lui|nous|vous|leur]¿  $:V0  $:Q
        <<- =>> select(\-2, ":V") and select(\-1, ":Q")

    qui  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:V
    qui  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:V
    qui  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             $:V
    qui  ?[ne|n’]¿  [lui|leur|y]                    en                          $:V
        <<- =>> exclude(\-1, ":E")

    [<start>|,|(]  nous  ?[ne|n’]¿  $:1p
        <<- =>> select(\2, ":Os") and select(\-1, ":[ISK].*:1p")

    [<start>|,|(]  vous  ?[ne|n’]¿  $:2p
        <<- =>> select(\2, ":Os") and select(\-1, ":[ISK].*:2p")

................................................................................
    des  *WORD  *WORD
        <<- /gn/ (morph(<1, ":(?:[VRBXÉ]|Cs)|>comme/|<start>|>,", "*") or morph(\3, ":N", ":[AQ]")) and not morph(\3, ">(?:seul|minimum|maximum)/") >>>
        <<- /gn/ ( (morph(\2, ":[NA].*:m", ":[fe]") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":[me]") and morph(\3, ":[NA].*:m", "*")) ) and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":G") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.
        <<- not morph(\3, ":G|>a/") and agreement(\2, \3) =>> =exclude(\3, ":V")

TEST: faire table rase des passions {{inutile}}               ->> inutiles
TEST: à bonne distance des {{chiens}} {{méchante}}
TEST: des hommes {{attaquée}}
TEST: des femmes {{agressé}}
TEST: des hommes très mal {{renseigné}}                       ->> renseignés
TEST: des dépenses non {{nécessaire}}                         ->> nécessaires







|






|




|







 







|


|


|







 







|







 







|


|


|







 







|












|







|





|







 







|








|



|


|







 







|







 







|










|




|



|



|







 







|











|






|







 







|







 







|



|










|







 







|


|







 







|







 







|







 







|


|













|








|





|



|


|





|







 







|







 







|







 







|







 







|







 







>







 







|







 







>







 







|


|









|


|

|


|


|


|


|







 







|







 







|







2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
....
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
....
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
....
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
....
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
....
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
....
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
....
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
....
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
....
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
....
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
....
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
....
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
....
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
....
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
....
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
....
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
....
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
....
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
.....
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
.....
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
.....
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
.....
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
19147
19148
19149
19150
19151
19152
19153
19154
19155
19156
19157
19158
.....
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
.....
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
23496
23497

    le [*NUM|*WORDORD]
        <<- =>> select(\1, ":D")

    la  *WORD
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|plupart|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")
        <<- __else__ and not value(<1, "|le|ce|du|") =>> select(\1, "", ":N")

    les *WORD
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")

    leur    *WORD
        <<- not value(<1, "|le|du|") =>> select(\1, "", ":N")
        <<- not value(<1, "|je|j’|il|on|elle|nous|vous|ils|elles|iel|iels|ne|n’|me|m’|te|t’|se|s’|") and (morph(\2, ":[NABWM]", "*") or value(\2, "|plus|moins|")) =>> select(\1, ":D")
        <<- __else__ and morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")

    leurs   *WORD
        <<- not value(<1, "|les|des|") =>> select(\1, "", ":N")

    en  [*NUM|*HOUR]
        <<- =>> select(\1, ":R")

    en  *WORD
        <<- value(<1, "|j’|n’|m’|t’|s’|l’|c’|") or morph(\2, ":[ISKYPE]", "*") =>> select(\1, ":Ov")
        <<- __else__ and not morph(<1, ":O[sv]") and morph(\2, ":", ":[ISKYPE]") =>> select(\1, ":R")
................................................................................

    y   *WORD
        <<- value(<1, "|j’|n’|m’|t’|s’|l’|c’|") or morph(\2, ":(?:[123][sp]|P|Y)") =>> select(\1, ":Ov")


__da_nous_vous__
    [ne|n’] [nous|vous]
        <<- =>> select(\2, "", ":Os")

    nous [>avoir|>être]
        <<- not morph(\2, ":1p") =>> select(\1, "", ":Os")

    vous [>avoir|>être]
        <<- not morph(\2, ":2p") =>> select(\1, "", ":Os")


__da_préverbes_verbes__
    [ne|n’]  ?[le|la|l’|les|nous|vous|lui|leur]¿  @:¬:[OX]
    [ne|n’]  [nous|vous]     [le|la|l’|les|en]    @:¬:[OX]
    [ne|n’]  [le|la|l’|les]  [lui|leur|en]        @:¬:[OX]
    [ne|n’]  [lui|leur]      en                   @:¬:[OX]
................................................................................
    [me|m’|te|t’|se|s’]     [en|le|la|l’|les|y]
        <<- =>> select(\2, ":Ov")

    lui @:[ISKQYP]¬:3s
        <<- =>> select(\1, ":Ov")

    lui
        <<- morph(<1, ":R") =>> select(\1, "", ":(?:Q|Os)")

    [me|m’|te]  ?[le|la|l’|les|en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYPE]")

    [se|s’]  ?[le|la|l’|les|en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYP]")

................................................................................
    $:M  @:[123]s¬:[QWA]
        <<- \2.islower() and morph(<1, ":Cs|<start>") =>> select(\2, ":[123][sp]")

    <start>  $:M  @:(?:[123]s|Ov)¬:A
        <<- =>> =select(\2, ":M")

    [que|qu’|combien|pourquoi|qui|quand|où]  ?[en|y]¿  *WORD
        <<- =>> select(\-1, "", ":E")

    [<start>|,|(]  quelqu’ un  *WORD
        <<- =>> select(\4, "", ":N")

    >falloir [pouvoir|savoir|vouloir|manger|conseiller]
        <<- =>> select(\2, "", ":N")

    v’nir
        <<- ~>> venir

    s’ ra
        <<- ~>> ␣sera

................................................................................
    nous ?[ne|n’]¿ [lui|leur]      en                 sommes
        <<- not morph(<1, ":R") =>> select(\-1, ":V0")

    [de|d’|par|pour|sans|contre] [elle|lui|nous|vous|eux|elles|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là]
        <<- =>> select(\-1, ":Oo")

    après avoir $:Q
        <<- =>> select(\2, "", ":N")


__da_jours__
    [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> select(\1, ":W")

__da_a__
    [ça|ceci|cela] a
        <<- =>> select(\2, ":V")

__da_autour__
    autour [de|du|d’|des]
        <<- not morph(<1, ":D.*:[me]") =>> select(\1, "", ":N")

__da_avant__
    avant [que|qu’|$:D]
        <<- not value(<1, "|l’|quel|cet|un|mon|ton|son|notre|votre|leur|") =>> select(\1, ":R")

__da_bien__
    bien [que|qu’]
        <<- not morph(<1, ":[DNA].*:[me]:[si]") =>> select(\1, "", ":[AW]")

    bien $:Y
        <<- not morph(<1, ":[DNA].*:[me]:[si]") =>> select(\1, ":W")

    bien *WORD
        <<- not value(\2, "|que|qu’|") =>> select(\1, "", ":G")

__da_car__
    car
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> select(\1, ":G")

__da_ce__
    c’  [>avoir|>être]
................................................................................
        <<- not value(<1, "|il|ils|on|ne|n’|") =>> select(\1, ":D") and select(\2, ":[NA]")

    ce  @:3[sp]¬:[NA].*:[me]:[si]
    ce  [ne|n’]
        <<- =>> select(\1, ":O")

    ce [que|qu’|qui|dont|pour|par]
        <<- =>> select(\1, "", ":D")

__da_cela__
    [<start>|,|(]  cela  [ne|n’|me|m’|te|t’|se|s’]
    [<start>|,|(]  cela  [le|la|l’|les|en|nous|vous|lui|leur|y]  @:(?:[123]s|P)
    [<start>|,|(]  cela  [nous|vous]     [le|la|l’|les|en|y]     @:(?:[123]s|P)
    [<start>|,|(]  cela  [le|la|l’|les]  [lui|leur|en|y]         @:(?:[123]s|P)
    [<start>|,|(]  cela  [lui|leur|y]    en                      @:(?:[123]s|P)
    [<start>|,|(]  cela  @:(?:[123]s|P)
        <<- =>> select(\2, "", ":V")

__da_certains_certaines__
    certains  @:[NA].*:[me]:[pi]¬:(?:G|3[sp])
        <<- =>> select(\1, "", ":O")

    certaines  @:[NA].*:[fe]:[pi]¬:(?:G|3[sp])
        <<- =>> select(\1, "", ":O")

    certains [ne|n’|me|m’|te|t’|se|s’]               @:3p
    certains [le|la|l’|les|en|nous|vous|lui|leur|y]  @:3p
    certains [nous|vous]     [le|la|l’|les|en|y]     @:3p
    certains [le|la|l’|les]  [lui|leur|en|y]         @:3p
    certains [lui|leur|y]    en                      @:3p
    certains @:3p¬:(?:G|[NA].*:[me]:[pi]|V.e)
................................................................................
    [la|les|des|une|cette|ma|ta|sa|notre|votre|leur+s] >lutte       ?$:A¬:G¿  contre
    [>accusation|>action|>assaut|>attentat|>croisade|>guerre]       ?$:A¬:G¿  contre
    [>guerre|>jihad|>offensive|>ratonnade|>sortilège|>violence]     ?$:A¬:G¿  contre
    [>antidote|>crime|>philtre|>remède|>sérum|>vaccin|>solution]    ?$:A¬:G¿  contre
        <<- =>> select(\-1, ":R")

    contre
        <<- not morph(<1, ":[DA].*:[me]:[si]") =>> select(\1, "", ":N")

__da_dans__
    dans
        <<- not morph(<1, ":D.*:p|>[a-zé-]+ième/") =>> select(\1, ":R")

__da_de__
    [de|d’] [me|m’|te|t’|se|s’|en|y|nous|vous|moi|toi|soi|lui|elle|iel|eux|elles|iels]
................................................................................

    >différence entre
    >choisir entre
        <<- =>> select(\-1, ":R")

__da_environ__
    environ  [$:B|*NUM]
        <<- not value(<1, "|l’|un|cet|quel|") =>> select(\1, "", ":N")

__da_été__
    >avoir ?@:[WX]¿ été
        <<- =>> select(\1, ":V0") and select(\-1, ":Q")

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

__da_face__
    face [à|au|aux]
        <<- not morph(<1, ":(?:D|A.*:[fe]:[si])") =>> select(\1, "", ":N")
        <<- __else__ =>> select(\1, ":N")

__da_grâce__
    grâce [à|au|aux]
        <<- not morph(<1, ":(?:D|A.*:[fe]:[si])") =>> select(\1, "", ":N")

__da_grave__
    grave
        <<- morph(<1, ":D") =>> select(\1, "", ":W")

__da_mais__
    mais
        <<- not value(<1, "|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques|") =>> select(\1, "", ":N")

    n’ en >pouvoir mais
        <<- =>> define(\-1, ">mais/:W")

__da_mal__
    pas mal
        <<- =>> select(\2, ":W")
................................................................................

__da_point__
    [le|l’|un|mon|notre|votre|leur|chaque|mes|tes|ses|nos|vos|leurs|quel|quels|quelle|quelles] point
        <<- =>> select(\2, ":N")

    [ne|n’]  $:V  point
    [ne|n’] point
        <<- =>> select(\-1, "", ":N")

__da_nos__
    nos $¬:B
        <<- =>> select(\1, ":D")

__da_parmi__
    parmi *WORD
        <<- =>> select(\1, ":R")

__da_pas__
    pas
        <<- morph(<1, ":[VWX]") =>> select(\1, "", ":N")

    pourquoi pas
        <<- =>> select(\2, ":X")

__da_passé__
    passé  [<end>|,|$:R]
        <<- =>> select(\1, "", ":G")

__da_pendant__
    ## évènements
    pendant ?tout¿ [le|l’|ce|cet|mon|ton|son|notre|votre|leur] ?[interminable|long]¿
        || [accouchement|acte|âge|colloque|confinement|conflit|cours|couronnement|déjeuner|dîner|diner|entracte|entrainement|entraînement|entretien|examen|événement|évènement|interrègne|jihad|mandat|mariage|match|passage|procès|repas|règne|sommeil|souper|temps|travail|voyage]
    pendant ?toute¿ [la|l’|cette|ma|ta|sa|mon|ton|son|notre|votre|leur] ?[interminable|longue]¿
        || [adolescence|cérémonie|compétition|crise|croisade|dictature|durée|enfance|étude|existence|guerre|interview|intronisation|messe|partie|pause|période|prière|querelle|rencontre|récréation|régence|retraite|réunion|révolution|séance|thérapie|traversée|tyrannie|union|vacance|vie]
................................................................................
        <<- =>> select(\1, ":R")

__da_personne__
    personne [ne|n’]
        <<- not morph(<1, ":[DA].*:[fe]:[si]") =>> select(\1, ":O")

    n’  $:V  personne
        <<- =>> select(\-1, "", ":N")

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

__da_plus_moins__
    [plus|moins]
................................................................................
        <<- not value(<1, "|je|ne|n’|") =>> select(\1, ":W")

    [un|une|des|le|la|l’|les|mon|ton|son|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs] [plus|moins] @:[AW]¬:G
        <<- =>> select(\2, ":W")

__da_pourvu__
    pourvu
        <<- not value(>1, "|que|qu’|") =>> select(\1, "", ":G")

__da_puis__
    puis
        <<- not value(<1, "|je|ne|n’|le|l’|leur|") =>> select(\1, "", ":V")

__da_quelque__
    quelque *NUM
        <<- =>> select(\1, ":W")

    quelque [autre|chose|temps|part]
        <<- =>> select(\1, ":D")

__da_SA__
    SA
        <<- morph(<1, ":D") =>> select(\1, "", ":D")

__da_selon__
    selon @:(?:[DBM]|Oo)
        <<- =>> select(\1, ":R")

    selon [,|<end>]
        <<- =>> select(\1, ":W")
................................................................................
        <<- =>> select(\1, ":W") and select(\2, ":W")

    si @:[AW]¬:G
        <<- morph(<1, ":N", ":D") =>> select(\1, ":W")

__da_son_ton__
    [le|ce|cet|mon|ton|son|quel|quelque|notre|votre|un|leur|ledit|dudit|chaque|des|les|quelques|quel|quelle|quels|quelles]  [son|ton]
        <<- =>> select(\2, "", ":D")

    [son|ton] *WORD
        <<- morph(\2, ":G", ":[NA]") or value(<1, "|du|le|ce|un|quel|mon|") =>> select(\1, "", ":D")
        <<- __else__ and morph(\2, ":N", "*") =>> select(\1, ":D")

    [son|ton] ,
        <<- =>> select(\1, ":N")

__da_sans__
    sans [que|qu’]
................................................................................
        <<- not morph(<1, ":[DA].*:[me]:[pi]") =>> select(\1, ":R")

    sur @:[BD]
        <<- not morph(<1, ":(?:V[0123]e|[DN].*:[me]:[si])") =>> select(\1, ":R")

__da_tout__
    tout
        <<- morph(<1, "<start>|>,") =>> select(\1, "", ":N")

    tout @:N.*:[me]:[si]¬:(?:[AGW]|3s)
        <<- =>> select(\1, ":D")

    tout le monde
        <<- =>> select(\1, ":W") and select(\2, ":D") and select(\-1, ":N")

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

__da_vis_à_vis__
    vis-à-vis [de|des|du|d’]
        <<- not morph(<1, ":(?:[DA].*:[me]|R)") =>> select(\1, ":R")

__da_vu__
    vu  [<end>|,|$:R]
        <<- =>> select(\1, "", ":G")

__da_y_compris__
    y compris
        <<- not value(<1, "|n’|j’|tu|t’|m’|s’|") ~>> ␣
        <<- __also__ =>> define(\1, ":G:R:LR")


................................................................................
        <<- =>> select(\-1, ":N")


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    avions
................................................................................
        <<- =>> define(\1, ":GN:m:p")

    l’ une comme l’ autre
        <<- ~>> ␣
        <<- =>> define(\1, ":GN:f:p")

    en peine
        <<- not value(<1, "|ne|n’|j’|on|il|elle|iel|") =>> select(\2, "", ":V")

    m’ dame
        <<- ~>> ␣madame

    m’ sieur
        <<- ~>> ␣

................................................................................
TEST: Votre question fait référence à un fait divers déroutant
TEST: il s’ra bien heureux d’vous voir.
TEST: tu s’ras bien content d’nous voir.


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


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

    Mustang
................................................................................
    en tout état [de|d’] cause
    en tout premier lieu
    en toute bonne foi
    en ?toute¿ connaissance [de|d’] cause
    en toute [confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|modestie|sécurité|simplicité]
    en travers [de|d’] la gorge
    en trompe-l’œil
    en ultime recours
    en vase clos
    en vigueur
    en vitesse ?[subsonique|supersonique|subluminique|superluminique]¿
    en voie [de|d’] développement
    en vrac
    en y [réfléchissant|songeant] bien
    en [mon|ton|son|leur|notre|votre] âme et conscience
................................................................................
        <<- ~2>> *

    pas très
        <<- morph(<1, ":[NV]", ":A:[em]:[is]") ~>> *

    personne  d’ autre [que|qu’]  [moi|moi-même|toi|toi-même|lui|lui-même|elle|elle-même|elles|elles-mêmes|nous|nous-même|nous-mêmes|vous|vous-même|vous-mêmes|eux-mêmes|iel|iels|iel-même|iels-mêmes]
        <<- ~2:0>> *
        <<- =>> select(\1, "", ":N")

    pour ou contre
        <<- ~2:0>> *

    qui ce      [jour-là|matin-là|après-midi-là|soir-là|mois-là|siècle-là|millénaire-là]
    qui cette   [nanoseconde-là|milliseconde-là|seconde-là|minute-là|heure-là|nuit-là|matinée-là|soirée-là|journée-là|semaine-là|année-là|décennie-là]
    qui à part  [moi|toi|lui|elle|nous|vous|eux|elles]
................................................................................
    >livret d’ épargne ?[bancaire|populaire|salariale]¿
    >local à louer
    >locomotive à vapeur
    >loi d’ airain
    >longueur d’ avance
    >lopin [de|d’] terre ?[desséchée|glaiseuse|grise|jaune|noire|ocre|rouge|sableuse|sèche]¿
    >lune [de|d’] miel
    lunettes [de|d’] [soleil|vue]
    >lutte à outrance
    >machine à [café|coudre|écrire|laver|sous|vapeur|voter]
    >machine à remonter le temps
    >machine [de|d’] guerre
    >maillot [de|d’] bain
    >main d’ œuvre
    >maison à colombages
................................................................................

__da_le_la_les_leur2__
    [<start>|,|(]  c’                                                 ?[ne|n’]¿  >être   [le|la|l’|les]  @:[NA]¬:G
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
    [<start>|,|(]  ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿  ?[ne|n’]¿  [lui|leur|y]                    en                          *WORD  [le|la|l’|les]  @:[NA]¬:[YG]
        <<- morph(\-3, ":[123][sp]") =>> =select(\-2, ":D") and select(\-1, "", ":[123][sp]")

    [/_VCint_|/_VCimp_]  [le|la|l’|les|leur|leurs]  @:[NA]¬:[YG]
        <<- =>> =select(\-2, ":D") and select(\-1, "", ":[123][sp]")


__da_substantifs__
    [<start>|,|(]  $:D  *WORD  *WORD  [ne|n’|me|m’|te|t’|se|s’]
    [<start>|,|(]  $:D  *WORD  *WORD  [en|nous|vous|lui|y]                    @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [le|la|l’|les|leur]                     @:(?:[123][sp]|P)¬:[NA]
    [<start>|,|(]  $:D  *WORD  *WORD  [nous|vous]     [le|la|l’|les|en|y]     @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [le|la|l’|les]  [lui|leur|en|y]         @:(?:[123][sp]|P)
    [<start>|,|(]  $:D  *WORD  *WORD  [lui|leur|y]    en                      @:(?:[123][sp]|P)
        <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":(?:[PG]|V[023])") =>> select(\4, "", ":V")

    [<start>|,|(]  $:D  *WORD  *WORD  @:(?:3[sp]|P)¬:[GW]
        <<- morph(\2, ":p") and morph(\3, ":[NA].*:p", ":(?:G|V0)") and morph(\4, ":[NA].*:p", ":(?:[PGQ]|V[023])") =>> select(\4, "", ":V")
        <<- __else__ and
            morph(\2, ":s") and morph(\3, ":[NA].*:s", ":(?:G|V0)") and morph(\4, ":[NA].*:s", ":(?:[PGQ]|V[023])") and not morph(\5, ":A.*:[si]") =>> select(\4, "", ":V")

    [des|ces|mes|tes|ses|nos|vos|quelques|lesdits]  @:A.*:[pi]  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- =>> select(\3, "", ":V")

    les  @:A.*:[pi]¬:V  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- not before(":O[vs]") =>> select(\3, "", ":V")

    leurs  @:A.*:[pi]¬:V  @:N.*:[pi]¬(?:3[sp]|Q|G)
        <<- not before(":O[vs]") =>> select(\3, "", ":V")

    [plusieurs|certains|certaines|maints|maintes]  @:A.*:[pi]¬:3[sp]  @:N.*:p¬:(?:3[sp]|Q|G)
        <<- =>> select(\2, ":A") and select(\3, "", ":N")


__da_locutions_verbales__
    >avoir [cours|foule|lieu|recours|vent]
    >avoir ni queue ?,¿ ni tête
    >aller bon train
    >aller [de|d’] l’ avant
................................................................................
    qui  ?[lui|nous|vous|leur]¿  $:V0  $:Q
        <<- =>> select(\-2, ":V") and select(\-1, ":Q")

    qui  ?[ne|n’]¿  ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:V
    qui  ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:V
    qui  ?[ne|n’]¿  [le|la|l’|les]                  [lui|leur|en|y]             $:V
    qui  ?[ne|n’]¿  [lui|leur|y]                    en                          $:V
        <<- =>> select(\-1, "", ":E")

    [<start>|,|(]  nous  ?[ne|n’]¿  $:1p
        <<- =>> select(\2, ":Os") and select(\-1, ":[ISK].*:1p")

    [<start>|,|(]  vous  ?[ne|n’]¿  $:2p
        <<- =>> select(\2, ":Os") and select(\-1, ":[ISK].*:2p")

................................................................................
    des  *WORD  *WORD
        <<- /gn/ (morph(<1, ":(?:[VRBXÉ]|Cs)|>comme/|<start>|>,", "*") or morph(\3, ":N", ":[AQ]")) and not morph(\3, ">(?:seul|minimum|maximum)/") >>>
        <<- /gn/ ( (morph(\2, ":[NA].*:m", ":[fe]") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":[me]") and morph(\3, ":[NA].*:m", "*")) ) and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", ":G") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.
        <<- not morph(\3, ":G|>a/") and agreement(\2, \3) =>> =select(\3, "", ":V")

TEST: faire table rase des passions {{inutile}}               ->> inutiles
TEST: à bonne distance des {{chiens}} {{méchante}}
TEST: des hommes {{attaquée}}
TEST: des femmes {{agressé}}
TEST: des hommes très mal {{renseigné}}                       ->> renseignés
TEST: des dépenses non {{nécessaire}}                         ->> nécessaires

Modified misc/grammalecte.sublime-syntax from [e93ef25e4b] to [9e26acd942].

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

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

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

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

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







|







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

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

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

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

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