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
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"\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
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(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
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) {
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) {
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 && sMorph.search(sNegPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        dTokenPos.get(nPos)["lMorph"] = lSelect;
    }
    return true;
}

function exclude (dTokenPos, nPos, sWord, sPattern) {
        }
        else {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
        }
    }
    else if (sNegPattern) {
    if (!sWord) {
        return true;
        lSelect = lMorph.filter( sMorph => sMorph.search(sNegPattern) === -1 );
    }
    if (!dTokenPos.has(nPos)) {
        console.log("Error. There should be a token at this position: ", nPos);
    else {
        console.log("[Grammalecte] Error: missing pattern for disambiguation selection...");
        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) {
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) {
    let lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 && sMorph.search(sNegPattern) === -1 );
    if (lSelect.length > 0 && lSelect.length != lMorph.length) {
        oToken["lMorph"] = lSelect;
    }
    return true;
}

function g_exclude (oToken, sPattern) {
        }
        else {
            lSelect = lMorph.filter( sMorph => sMorph.search(sPattern) !== -1 );
        }
    }
    else if (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) {
        lSelect = lMorph.filter( sMorph => sMorph.search(sNegPattern) === -1 );
    }
    else {
        console.log("[Grammalecte] Error: missing pattern for disambiguation selection...");
        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) {

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
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):
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) ]
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) and not re.search(sNegPattern, sMorph) ]
    if lSelect and len(lSelect) != len(lMorph):
        dTokenPos[nPos]["lMorph"] = lSelect
    return True


def exclude (dTokenPos, nPos, sWord, sPattern):
        else:
            lSelect = [ sMorph  for sMorph in lMorph  if re.search(sPattern, sMorph) ]
    elif sNegPattern:
    "Disambiguation: exclude morphologies of <sWord> matching <sPattern>"
    if not sWord:
        return True
        lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sNegPattern, sMorph) ]
    else:
    if nPos not in dTokenPos:
        echo("Error. There should be a token at this position: ", nPos)
        echo("# Error: missing pattern for disambiguation selection...")
        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"
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) ]
    if lSelect and len(lSelect) != len(lMorph):
            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) ]
        dToken["lMorph"] = lSelect
    #echo("DA:", dToken["sValue"], dToken["lMorph"])
    return True


def g_exclude (dToken, sPattern):
    elif sNegPattern:
        lSelect = [ sMorph  for sMorph in lMorph  if not re.search(sNegPattern, sMorph) ]
    else:
        echo("# Error: missing pattern for disambiguation selection...")
    "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):

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

33
34
35
36
37
38
39
40

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   
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
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")
        <<- __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|") =>> exclude(\1, ":N")
        <<- 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|") =>> exclude(\1, ":N")
        <<- 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
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")
        <<- =>> select(\2, "", ":Os")

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

    vous [>avoir|>être]
        <<- not morph(\2, ":2p") =>> exclude(\1, ":Os")
        <<- 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") =>> exclude(\1, ":(?:Q|Os)")
        <<- 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
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")
        <<- =>> select(\-1, "", ":E")

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

    >falloir [pouvoir|savoir|vouloir|manger|conseiller]
        <<- =>> exclude(\2, ":N")
        <<- =>> 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
        <<- =>> exclude(\2, ":N")
        <<- =>> 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]") =>> exclude(\1, ":N")
        <<- 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]") =>> exclude(\1, ":[AW]")
        <<- 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’|") =>> exclude(\1, ":G")
        <<- 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]
        <<- =>> exclude(\1, ":D")
        <<- =>> 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)
        <<- =>> exclude(\2, ":V")
        <<- =>> select(\2, "", ":V")

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

    certaines  @:[NA].*:[fe]:[pi]¬:(?:G|3[sp])
        <<- =>> exclude(\1, ":O")
        <<- =>> 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
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")
        <<- 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
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")
        <<- 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])") =>> exclude(\1, ":N")
        <<- 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])") =>> exclude(\1, ":N")
        <<- not morph(<1, ":(?:D|A.*:[fe]:[si])") =>> select(\1, "", ":N")

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

__da_mais__
    mais
        <<- not value(<1, "|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques|") =>> exclude(\1, ":N")
        <<- 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
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")
        <<- =>> select(\-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")
        <<- morph(<1, ":[VWX]") =>> select(\1, "", ":N")

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

__da_passé__
    passé  [<end>|,|$:R]
        <<- =>> exclude(\1, ":G")
        <<- =>> 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
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")
        <<- =>> 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
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")
        <<- not value(>1, "|que|qu’|") =>> select(\1, "", ":G")

__da_puis__
    puis
        <<- not value(<1, "|je|ne|n’|le|l’|leur|") =>> exclude(\1, ":V")
        <<- 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") =>> exclude(\1, ":D")
        <<- 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
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")
        <<- =>> select(\2, "", ":D")

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

    [de|d’]  ?[la|l’|leur]¿  @:¬:[YD]
        <<- not value(<1, "|semblant|") =>> exclude(\-1, ":V")
        <<- 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 exclude(\3, ":V")
        <<- =>> 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") =>> exclude(\-1, ":V")
        <<- 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)
        <<- =>> exclude(\2, ":V")
        <<- =>> 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|")
        =>> exclude(\2, ":V")
        =>> 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") =>> exclude(\2, ":V")
        <<- 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
        <<- =>> exclude(\3, ":V")
        <<- =>> 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
        <<- =>> exclude(\2, ":[123][sp]")
        <<- =>> 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
        <<- =>> exclude(\2, ":[123][sp]")
        <<- =>> 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
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")
        <<- 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
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")
        <<- 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
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
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>> *
        <<- =>> exclude(\1, ":N")
        <<- =>> 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
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
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 exclude(\-1, ":[123][sp]")
        <<- 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 exclude(\-1, ":[123][sp]")
        <<- =>> =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])") =>> exclude(\4, ":V")
        <<- 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])") =>> exclude(\4, ":V")
        <<- 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]") =>> exclude(\4, ":V")
            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)
        <<- =>> exclude(\3, ":V")
        <<- =>> select(\3, "", ":V")

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

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