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: trunk, build
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: trunk, fr, core, build, misc
2020-12-11
20:04
[lo][fr] update version to download extension check-in: c491b9dc46 user: olr tags: trunk, fr, lo
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
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
        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>"
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        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
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
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>"
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        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

    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")







|






|




|







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

    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")
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439

    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]
    n’       ?[en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYPE]")
        <<- /-1>> neg

    [ne|n’]                 [lui|en|leur|le|la|l’|les|nous|vous|y]
    [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]")








|


|


|



















|







2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439

    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]
    n’       ?[en|y]¿  @:¬:[OX]
        <<- =>> select(\-1, ":[ISKYPE]")
        <<- /-1>> neg

    [ne|n’]                 [lui|en|leur|le|la|l’|les|nous|vous|y]
    [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]")

2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
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
2559
2560
2561
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
    $: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

    s’ ras
        <<- ~>> ␣seras

    nous ?[ne|n’]¿ ?[le|l’|en|nous|vous|lui|leur|y]¿  sommes
    nous ?[ne|n’]¿ [nous|vous]   [le|l’|en|y]         sommes
    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]
        <<- =>> select(\1, ":O")

    ce  @:[NA].*:[me]:[si]¬:V0e
        <<- 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)







|


|


|



















|












|







|





|

















|








|



|


|







2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
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
2559
2560
2561
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
    $: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

    s’ ras
        <<- ~>> ␣seras

    nous ?[ne|n’]¿ ?[le|l’|en|nous|vous|lui|leur|y]¿  sommes
    nous ?[ne|n’]¿ [nous|vous]   [le|l’|en|y]         sommes
    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]
        <<- =>> select(\1, ":O")

    ce  @:[NA].*:[me]:[si]¬:V0e
        <<- 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)
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
    [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]







|







2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
    [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]
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

    >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")







|










|




|



|



|







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

    >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")
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

__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]







|











|






|







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

__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]
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
        <<- =>> 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]







|







2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
        <<- =>> 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]
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
        <<- 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")







|



|










|







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
        <<- 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")
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
        <<- =>> 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’]
        <<- =>> select(\1, ":C")



__da_sous_sur__
    sous @:[BD]
        <<- 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")








|


|




















|







2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
        <<- =>> 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’]
        <<- =>> select(\1, ":C")



__da_sous_sur__
    sous @:[BD]
        <<- 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")

2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955

__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")









|







2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955

__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")


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
3025
3026
3027
3028
3029
3030
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
        <<- =>> 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]")

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

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

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

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

    par  *WORD
        <<- =>> 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







|


|













|








|





|



|


|





|




















|














|







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
3025
3026
3027
3028
3029
3030
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
        <<- =>> 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]")

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

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

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

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

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

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

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

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

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

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


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

    avions
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
        <<- =>> 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
        <<- ~>> ␣








|







3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
        <<- =>> 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
        <<- ~>> ␣

3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
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







|







3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
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
16349
16350
16351
16352
16353
16354
16355

16356
16357
16358
16359
16360
16361
16362
    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







>







16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
    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
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
        <<- ~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]







|







16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
        <<- ~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]
17739
17740
17741
17742
17743
17744
17745

17746
17747
17748
17749
17750
17751
17752
    >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







>







17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
    >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
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

__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







|


|









|


|

|


|


|


|


|







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

__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
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
    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")








|







19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
    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")

23481
23482
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
    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







|







23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
23496
23497
    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