Grammalecte  Changes On Branch mtok

Changes In Branch mtok Excluding Merge-Ins

This is equivalent to a diff from f831e2b562 to 8553b43f18

2021-03-16
20:35
[core][build][fr] new feature: multi-tokens check-in: f7f4aac204 user: olr tags: build, core, fr, new_feature, trunk
18:29
[core][js] gc engine: multi-token match Leaf check-in: 8553b43f18 user: olr tags: core, mtok
18:13
[fr] ajustements: locutions adverbiales check-in: 66c9bda313 user: olr tags: fr, mtok
2021-03-10
20:22
[fr] faux positif check-in: 0915b69239 user: olr tags: fr, trunk
2021-03-09
17:20
[misc] SublimeText syntaxic color check-in: 126b183b9d user: olr tags: misc, mtok
07:23
[fr] ajustements check-in: f831e2b562 user: olr tags: fr, trunk
2021-03-06
23:10
[fr] ajustements check-in: 199d498ccf user: olr tags: fr, trunk

Modified compile_rules_graph.py from [82cd1181fb] to [523cbe02bb].

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
...
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
...
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
...
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
def rewriteCode (sCode):
    "convert simple code syntax to a string of Python code"
    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(agreement|suggAgree)[(][\\](\d+), *[\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], lToken[nTokenOffset+\\3]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\](\d+), *[\\]-(\d+)", 'g_\\1(lToken[nTokenOffset+\\2], lToken[nLastToken-\\3+1]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\]-(\d+), *[\\](\d+)", 'g_\\1(lToken[nLastToken-\\2+1], lToken[nTokenOffset+\\3]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\]-(\d+), *[\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], lToken[nLastToken-\\3+1]', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode)
................................................................................
        if m:
            sOption = m.group(1)
            sAction = sAction[m.end():].strip()
        if nPriority == -1:
            nPriority = self.dOptPriority.get(sOption, 4)

        # valid action?
        m = re.search(r"(?P<action>[-=~/!>])(?P<start>-?\d+\.?|)(?P<end>:\.?-?\d+|)(?P<casing>:|)>>", sAction)
        if not m:
            print("\n# Error. No action found at: ", sLineId, sActionId)
            exit()

        # Condition
        sCondition = sAction[:m.start()].strip()
        if sCondition:
................................................................................
        checkTokenNumbers(sCondition, sActionId, nToken)    # check tokens in condition
        checkTokenNumbers(sAction, sActionId, nToken)       # check tokens in action

        if cAction == ">":
            ## no action, break loop if condition is False
            return [sLineId, sOption, sCondition, cAction, ""]

        if not sAction and cAction != "!":
            print(f"\n# Error in action at line <{sLineId}/{sActionId}>:  This action is empty.")
            exit()

        if sAction[0:1] != "=" and cAction != "=":
            checkIfThereIsCode(sAction, sActionId)

        if cAction == "-":
................................................................................
                nToken = sAction.count("|") + 1
                if iStartAction > 0 and iEndAction > 0:
                    if (iEndAction - iStartAction + 1) != nToken:
                        print(f"\n# Error in action at line <{sLineId}/{sActionId}>: numbers of modified tokens modified.")
                elif iStartAction < 0 or iEndAction < 0 and iStartAction != iEndAction:
                    print(f"\n# Warning in action at line <{sLineId}/{sActionId}>: rewriting with possible token position modified.")
            return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction, bCaseSensitivity]
        if cAction in "!/":
            ## tags
            return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction]
        if cAction == "=":
            ## disambiguator
            sAction = self.createFunction("da", sAction)
            return [sLineId, sOption, sCondition, cAction, sAction]
        print("\n# Unknown action at ", sLineId, sActionId)
................................................................................
        elif sLine.startswith("        ||"):
            # tokens line continuation
            iPrevLine, sPrevLine = lTokenLine[-1]
            lTokenLine[-1] = [iPrevLine, sPrevLine + " " + sLine.strip()[2:]]
        elif sLine.startswith("        <<- "):
            # actions
            lActions.append([iLine, sLine[12:].strip()])
            if not re.search(r"[-=~/!>](?:-?\d\.?(?::\.?-?\d+|)|):?>>", sLine):
                bActionBlock = True
        elif sLine.startswith("        && "):
            # action message
            iPrevLine, sPrevLine = lActions[-1]
            lActions[-1] = [iPrevLine, sPrevLine + sLine]
        elif sLine.startswith("        ") and bActionBlock:
            # action line continuation
            iPrevLine, sPrevLine = lActions[-1]
            lActions[-1] = [iPrevLine, sPrevLine + " " + sLine.strip()]
            if re.search(r"[-=~/!>](?:-?\d\.?(?::\.?-?\d+|)|):?>>", sLine):
                bActionBlock = False
        elif re.match("[  ]*$", sLine):
            # empty line to end merging
            if not lTokenLine:
                continue
            if bActionBlock or not lActions:
                print("# Error. No action found at line:", iLine)







|
|







 







|







 







|







 







|







 







|









|







34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
...
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
...
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
...
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
def rewriteCode (sCode):
    "convert simple code syntax to a string of Python code"
    if sCode[0:1] == "=":
        sCode = sCode[1:]
    sCode = sCode.replace("__also__", "bCondMemo")
    sCode = sCode.replace("__else__", "not bCondMemo")
    sCode = sCode.replace("sContext", "_sAppContext")
    sCode = re.sub(r"\b(morph[0x]?|morphVC|value|tag|meta|info)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode)
    sCode = re.sub(r"\b(morph[0x]?|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(agreement|suggAgree)[(][\\](\d+), *[\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], lToken[nTokenOffset+\\3]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\](\d+), *[\\]-(\d+)", 'g_\\1(lToken[nTokenOffset+\\2], lToken[nLastToken-\\3+1]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\]-(\d+), *[\\](\d+)", 'g_\\1(lToken[nLastToken-\\2+1], lToken[nTokenOffset+\\3]', sCode)
    sCode = re.sub(r"\b(agreement|suggAgree)[(][\\]-(\d+), *[\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], lToken[nLastToken-\\3+1]', sCode)
    sCode = re.sub(r"\b(tagbefore|tagafter)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode)
................................................................................
        if m:
            sOption = m.group(1)
            sAction = sAction[m.end():].strip()
        if nPriority == -1:
            nPriority = self.dOptPriority.get(sOption, 4)

        # valid action?
        m = re.search(r"(?P<action>[-=~/!>&])(?P<start>-?\d+\.?|)(?P<end>:\.?-?\d+|)(?P<casing>:|)>>", sAction)
        if not m:
            print("\n# Error. No action found at: ", sLineId, sActionId)
            exit()

        # Condition
        sCondition = sAction[:m.start()].strip()
        if sCondition:
................................................................................
        checkTokenNumbers(sCondition, sActionId, nToken)    # check tokens in condition
        checkTokenNumbers(sAction, sActionId, nToken)       # check tokens in action

        if cAction == ">":
            ## no action, break loop if condition is False
            return [sLineId, sOption, sCondition, cAction, ""]

        if not sAction and cAction not in "!#":
            print(f"\n# Error in action at line <{sLineId}/{sActionId}>:  This action is empty.")
            exit()

        if sAction[0:1] != "=" and cAction != "=":
            checkIfThereIsCode(sAction, sActionId)

        if cAction == "-":
................................................................................
                nToken = sAction.count("|") + 1
                if iStartAction > 0 and iEndAction > 0:
                    if (iEndAction - iStartAction + 1) != nToken:
                        print(f"\n# Error in action at line <{sLineId}/{sActionId}>: numbers of modified tokens modified.")
                elif iStartAction < 0 or iEndAction < 0 and iStartAction != iEndAction:
                    print(f"\n# Warning in action at line <{sLineId}/{sActionId}>: rewriting with possible token position modified.")
            return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction, bCaseSensitivity]
        if cAction in "!/&":
            ## tags
            return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction]
        if cAction == "=":
            ## disambiguator
            sAction = self.createFunction("da", sAction)
            return [sLineId, sOption, sCondition, cAction, sAction]
        print("\n# Unknown action at ", sLineId, sActionId)
................................................................................
        elif sLine.startswith("        ||"):
            # tokens line continuation
            iPrevLine, sPrevLine = lTokenLine[-1]
            lTokenLine[-1] = [iPrevLine, sPrevLine + " " + sLine.strip()[2:]]
        elif sLine.startswith("        <<- "):
            # actions
            lActions.append([iLine, sLine[12:].strip()])
            if not re.search(r"[-=~/!>&](?:-?\d\.?(?::\.?-?\d+|)|):?>>", sLine):
                bActionBlock = True
        elif sLine.startswith("        && "):
            # action message
            iPrevLine, sPrevLine = lActions[-1]
            lActions[-1] = [iPrevLine, sPrevLine + sLine]
        elif sLine.startswith("        ") and bActionBlock:
            # action line continuation
            iPrevLine, sPrevLine = lActions[-1]
            lActions[-1] = [iPrevLine, sPrevLine + " " + sLine.strip()]
            if re.search(r"[-=~/!>&](?:-?\d\.?(?::\.?-?\d+|)|):?>>", sLine):
                bActionBlock = False
        elif re.match("[  ]*$", sLine):
            # empty line to end merging
            if not lTokenLine:
                continue
            if bActionBlock or not lActions:
                print("# Error. No action found at line:", iLine)

Modified darg.py from [f98928fa4d] to [6cee0c2543].

212
213
214
215
216
217
218
219
220
221

222
223
224
225
226
227
228
229
230
231


232
233
234
235
236
237
238
...
243
244
245
246
247
248
249


250
251
252
253
254
255
256
        # Used as a key in a python dictionary.
        # Nodes are equivalent if they have identical arcs, and each identical arc leads to identical states.
        return self.__str__() == other.__str__()

    def getNodeAsDict (self):
        "returns the node as a dictionary structure"
        dNode = {}
        dReValue = {}   # regex for token values
        dReMorph = {}   # regex for morph
        dMorph = {}     # simple search in morph

        dLemma = {}
        dPhonet = {}
        dMeta = {}
        dTag = {}
        dRule = {}
        for sArc, oNode in self.dArcs.items():
            if sArc.startswith("@") and len(sArc) > 1:
                dReMorph[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("$") and len(sArc) > 1:
                dMorph[sArc[1:]] = oNode.__hash__()


            elif sArc.startswith("~") and len(sArc) > 1:
                dReValue[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith(">") and len(sArc) > 1:
                dLemma[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("%") and len(sArc) > 1:
                dPhonet[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("*") and len(sArc) > 1:
................................................................................
                dRule[sArc[1:]] = oNode.__hash__()
            else:
                dNode[sArc] = oNode.__hash__()
        if dReValue:
            dNode["<re_value>"] = dReValue
        if dReMorph:
            dNode["<re_morph>"] = dReMorph


        if dMorph:
            dNode["<morph>"] = dMorph
        if dLemma:
            dNode["<lemmas>"] = dLemma
        if dPhonet:
            dNode["<phonet>"] = dPhonet
        if dTag:







|
|
|
>










>
>







 







>
>







212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
        # Used as a key in a python dictionary.
        # Nodes are equivalent if they have identical arcs, and each identical arc leads to identical states.
        return self.__str__() == other.__str__()

    def getNodeAsDict (self):
        "returns the node as a dictionary structure"
        dNode = {}
        dReValue = {}       # regex for token values
        dReMorph = {}       # regex for morph
        dMorph = {}         # simple search in morph
        dReMultiMorph = {}  # regex for morph in multi-tokens
        dLemma = {}
        dPhonet = {}
        dMeta = {}
        dTag = {}
        dRule = {}
        for sArc, oNode in self.dArcs.items():
            if sArc.startswith("@") and len(sArc) > 1:
                dReMorph[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("$") and len(sArc) > 1:
                dMorph[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("&") and len(sArc) > 1:
                dReMultiMorph[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("~") and len(sArc) > 1:
                dReValue[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith(">") and len(sArc) > 1:
                dLemma[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("%") and len(sArc) > 1:
                dPhonet[sArc[1:]] = oNode.__hash__()
            elif sArc.startswith("*") and len(sArc) > 1:
................................................................................
                dRule[sArc[1:]] = oNode.__hash__()
            else:
                dNode[sArc] = oNode.__hash__()
        if dReValue:
            dNode["<re_value>"] = dReValue
        if dReMorph:
            dNode["<re_morph>"] = dReMorph
        if dReMultiMorph:
            dNode["<re_mmorph>"] = dReMultiMorph
        if dMorph:
            dNode["<morph>"] = dMorph
        if dLemma:
            dNode["<lemmas>"] = dLemma
        if dPhonet:
            dNode["<phonet>"] = dPhonet
        if dTag:

Modified gc_core/js/lang_core/gc_engine.js from [04cf68e8aa] to [a2adf10c84].

177
178
179
180
181
182
183



184
185
186
187
188
189
190
...
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
...
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
...
543
544
545
546
547
548
549



































550
551
552
553
554
555
556
...
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601








602
603
604
605
606
607
608
609

610
611
612
613
614
615
616
617
618
619
620
621

622
623
624
625








626
627
628
629
630
631
632
...
649
650
651
652
653
654
655
656
657
658
659
660
661

662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
...
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
...
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
...
746
747
748
749
750
751
752



















753
754
755
756
757
758
759
760
...
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
            s += `#${dToken["i"]}\t${dToken["nStart"]}:${dToken["nEnd"]}\t${dToken["sValue"]}\t${dToken["sType"]}`;
            if (dToken.hasOwnProperty("lMorph")) {
                s += "\t" + dToken["lMorph"].toString();
            }
            if (dToken.hasOwnProperty("aTags")) {
                s += "\t" + dToken["aTags"].toString();
            }



            s += "\n";
        }
        return s;
    }

    parse (sCountry="${country_default}", bDebug=false, dOptions=null, bContext=false, bFullInfo=false) {
        // analyses <sText> and returns an iterable of errors or (with option <bFullInfo>) a list of sentences with tokens and errors
................................................................................
                }
            }
            else if (!sOption || option(sOption)) {
                for (let [zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions, lGroups, lNegLookBefore] of lRuleGroup) {
                    if (!gc_engine.aIgnoredRules.has(sRuleId)) {
                        while ((m = zRegex.gl_exec2(sText, lGroups, lNegLookBefore)) !== null) {
                            let bCondMemo = null;
                            for (let [sFuncCond, cActionType, sWhat, ...eAct] of lActions) {
                                // action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                                try {
                                    bCondMemo = (!sFuncCond || gc_functions[sFuncCond](sText, sText0, m, this.dTokenPos, sCountry, bCondMemo));
                                    if (bCondMemo) {
                                        switch (cActionType) {
                                            case "-":
                                                // grammar error
                                                //console.log("-> error detected in " + sLineId + "\nzRegex: " + zRegex.source);
                                                let nErrorStart = nOffset + m.start[eAct[0]];
                                                if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.get(nErrorStart)) {
                                                    this.dError.set(nErrorStart, this._createErrorFromRegex(sText, sText0, sWhat, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bShowRuleId, sOption, bContext));
                                                    this.dErrorPriority.set(nErrorStart, nPriority);
                                                    this.dSentenceError.set(nErrorStart, this.dError.get(nErrorStart));
                                                }
                                                break;
                                            case "~":
                                                // text processor
                                                //console.log("-> text processor by " + sLineId + "\nzRegex: " + zRegex.source);
                                                sText = this.rewriteText(sText, sWhat, eAct[0], m, bUppercase);
                                                bChange = true;
                                                if (bDebug) {
                                                    console.log("~ " + sText + "  -- " + m[eAct[0]] + "  # " + sLineId);
                                                }
                                                break;
                                            case "=":
                                                // disambiguation
                                                //console.log("-> disambiguation by " + sLineId + "\nzRegex: " + zRegex.source);
                                                gc_functions[sWhat](sText, m, this.dTokenPos);
                                                if (bDebug) {
                                                    console.log("= " + m[0] + "  # " + sLineId, "\nDA:", this.dTokenPos);
                                                }
                                                break;
                                            case ">":
                                                // we do nothing, this test is just a condition to apply all following actions
                                                break;
................................................................................
        }
        if (bDebug) {
            console.log("UPDATE:");
            console.log(this.asString());
        }
    }

    * _getMatches (oGraph, oToken, oNode, bKeep=false) {
        // generator: return matches where <oToken> “values” match <oNode> arcs
        try {
            let bTokenFound = false;
            // token value
            if (oNode.hasOwnProperty(oToken["sValue"])) {
                yield [" ", oToken["sValue"], oNode[oToken["sValue"]]];
                bTokenFound = true;
................................................................................
                                        bTokenFound = true;
                                    }
                                }
                            }
                        }
                    }
                }



































            }
            // token tags
            if (oToken.hasOwnProperty("aTags") && oNode.hasOwnProperty("<tags>")) {
                for (let sTag of oToken["aTags"]) {
                    if (oNode["<tags>"].hasOwnProperty(sTag)) {
                        yield ["/", sTag, oNode["<tags>"][sTag]];
                        bTokenFound = true;
................................................................................
            }
            if (!bTokenFound && bKeep) {
                yield [null, "", -1];
            }
            // JUMP
            // Warning! Recurssion!
            if (oNode.hasOwnProperty("<>")) {
                yield* this._getMatches(oGraph, oToken, oGraph[oNode["<>"]], bKeep=true);
            }
        }
        catch (e) {
            console.error(e);
        }
    }

    parseGraph (oGraph, sCountry="${country_default}", dOptions=null, bShowRuleId=false, bDebug=false, bContext=false) {
        // parse graph with tokens from the text and execute actions encountered
        let lPointer = [];
        let bTagAndRewrite = false;
        try {
            for (let [iToken, oToken] of this.lTokens.entries()) {
                if (bDebug) {
                    console.log("TOKEN: " + oToken["sValue"]);
                }
                // check arcs for each existing pointer
                let lNextPointer = [];
                for (let oPointer of lPointer) {








                    for (let [cActionType, sMatch, iNode] of this._getMatches(oGraph, oToken, oGraph[oPointer["iNode"]])) {
                        if (cActionType === null) {
                            lNextPointer.push(oPointer);
                            continue;
                        }
                        if (bDebug) {
                            console.log("  MATCH: " + cActionType + sMatch);
                        }

                        lNextPointer.push({ "iToken1": oPointer["iToken1"], "iNode": iNode });
                    }
                }
                lPointer = lNextPointer;
                // check arcs of first nodes
                for (let [cActionType, sMatch, iNode] of this._getMatches(oGraph, oToken, oGraph[0])) {
                    if (cActionType === null) {
                        continue;
                    }
                    if (bDebug) {
                        console.log("  MATCH: " + cActionType + sMatch);
                    }

                    lPointer.push({ "iToken1": iToken, "iNode": iNode });
                }
                // check if there is rules to check for each pointer
                for (let oPointer of lPointer) {








                    if (oGraph[oPointer["iNode"]].hasOwnProperty("<rules>")) {
                        let bChange = this._executeActions(oGraph, oGraph[oPointer["iNode"]]["<rules>"], oPointer["iToken1"]-1, iToken, dOptions, sCountry, bShowRuleId, bDebug, bContext);
                        if (bChange) {
                            bTagAndRewrite = true;
                        }
                    }
                }
................................................................................
        for (let [sLineId, nextNodeKey] of Object.entries(oNode)) {
            let bCondMemo = null;
            for (let sRuleId of oGraph[nextNodeKey]) {
                try {
                    if (bDebug) {
                        console.log("   >TRY: " + sRuleId + " " + sLineId);
                    }
                    let [_, sOption, sFuncCond, cActionType, sWhat, ...eAct] = gc_rules_graph.dRule[sRuleId];
                    // Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ]
                    // TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ]
                    // Disambiguator [ option, condition, "=", replacement/suggestion/action ]
                    // Tag           [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    // Immunity      [ option, condition, "!", "",                            iTokenStart, iTokenEnd ]

                    // Test          [ option, condition, ">", "" ]
                    if (!sOption || dOptions.gl_get(sOption, false)) {
                        bCondMemo = !sFuncCond || gc_functions[sFuncCond](this.lTokens, nTokenOffset, nLastToken, sCountry, bCondMemo, this.dTags, this.sSentence, this.sSentence0);
                        if (bCondMemo) {
                            if (cActionType == "-") {
                                // grammar error
                                let [iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL] = eAct;
                                let nTokenErrorStart = (iTokenStart > 0) ? nTokenOffset + iTokenStart : nLastToken + iTokenStart;
                                if (!this.lTokens[nTokenErrorStart].hasOwnProperty("sImmunity") || (this.lTokens[nTokenErrorStart]["sImmunity"] != "*" && !this.lTokens[nTokenErrorStart]["sImmunity"].includes(sOption))) {
                                    let nTokenErrorEnd = (iTokenEnd > 0) ? nTokenOffset + iTokenEnd : nLastToken + iTokenEnd;
                                    let nErrorStart = this.nOffsetWithinParagraph + ((cStartLimit == "<") ? this.lTokens[nTokenErrorStart]["nStart"] : this.lTokens[nTokenErrorStart]["nEnd"]);
                                    let nErrorEnd = this.nOffsetWithinParagraph + ((cEndLimit == ">") ? this.lTokens[nTokenErrorEnd]["nEnd"] : this.lTokens[nTokenErrorEnd]["nStart"]);
                                    if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.gl_get(nErrorStart, -1)) {
                                        this.dError.set(nErrorStart, this._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty,
                                                                                                 sMessage, gc_rules_graph.dURL[iURL], bShowRuleId, sOption, bContext));
                                        this.dErrorPriority.set(nErrorStart, nPriority);
                                        this.dSentenceError.set(nErrorStart, this.dError.get(nErrorStart));
                                        if (bDebug) {
                                            console.log("    NEW_ERROR: ",  this.dError.get(nErrorStart));
                                        }
                                    }
                                }
                            }
                            else if (cActionType == "~") {
                                // text processor
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                this._tagAndPrepareTokenForRewriting(sWhat, nTokenStart, nTokenEnd, nTokenOffset, nLastToken, eAct[2], bDebug);
                                bChange = true;
                                if (bDebug) {
                                    console.log(`    TEXT_PROCESSOR: [${this.lTokens[nTokenStart]["sValue"]}:${this.lTokens[nTokenEnd]["sValue"]}]  > ${sWhat}`);
                                }
                            }
                            else if (cActionType == "=") {
                                // disambiguation
                                gc_functions[sWhat](this.lTokens, nTokenOffset, nLastToken);
                                if (bDebug) {
                                    console.log(`    DISAMBIGUATOR: (${sWhat})  [${this.lTokens[nTokenOffset+1]["sValue"]}:${this.lTokens[nLastToken]["sValue"]}]`);
                                }
                            }
                            else if (cActionType == ">") {
                                // we do nothing, this test is just a condition to apply all following actions
                                if (bDebug) {
                                    console.log("    COND_OK");
                                }
................................................................................
                            }
                            else if (cActionType == "/") {
                                // Tag
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                for (let i = nTokenStart; i <= nTokenEnd; i++) {
                                    if (this.lTokens[i].hasOwnProperty("aTags")) {
                                        this.lTokens[i]["aTags"].add(...sWhat.split("|"))
                                    } else {
                                        this.lTokens[i]["aTags"] = new Set(sWhat.split("|"));
                                    }
                                }
                                if (bDebug) {
                                    console.log(`    TAG:  ${sWhat} > [${this.lTokens[nTokenStart]["sValue"]}:${this.lTokens[nTokenEnd]["sValue"]}]`);
                                }
                                for (let sTag of sWhat.split("|")) {
                                    if (!this.dTags.has(sTag)) {
                                        this.dTags.set(sTag, [nTokenStart, nTokenEnd]);
                                    } else {
                                        this.dTags.set(sTag, [Math.min(nTokenStart, this.dTags.get(sTag)[0]), Math.max(nTokenEnd, this.dTags.get(sTag)[1])]);
                                    }
                                }
                            }
................................................................................
                            else if (cActionType == "!") {
                                // immunity
                                if (bDebug) {
                                    console.log("    IMMUNITY: " + sLineId + " / " + sRuleId);
                                }
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                let sImmunity = sWhat || "*";
                                if (nTokenEnd - nTokenStart == 0) {
                                    this.lTokens[nTokenStart]["sImmunity"] = sImmunity;
                                    let nErrorStart = this.nOffsetWithinParagraph + this.lTokens[nTokenStart]["nStart"];
                                    if (this.dError.has(nErrorStart)) {
                                        this.dError.delete(nErrorStart);
                                    }
                                } else {
................................................................................
                                        this.lTokens[i]["sImmunity"] = sImmunity;
                                        let nErrorStart = this.nOffsetWithinParagraph + this.lTokens[i]["nStart"];
                                        if (this.dError.has(nErrorStart)) {
                                            this.dError.delete(nErrorStart);
                                        }
                                    }
                                }



















                            } else {
                                console.log("# error: unknown action at " + sLineId);
                            }
                        }
                        else if (cActionType == ">") {
                            if (bDebug) {
                                console.log("    COND_BREAK");
                            }
................................................................................
            sNew = sRepl.gl_expand(m);
            sNew = sNew + " ".repeat(ln-sNew.length);
        }
        //console.log(sText+"\nstart: "+m.start[iGroup]+" end:"+m.end[iGroup]);
        return sText.slice(0, m.start[iGroup]) + sNew + sText.slice(m.end[iGroup]);
    }

    _tagAndPrepareTokenForRewriting (sWhat, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bCaseSvty, bDebug) {
        // text processor: rewrite tokens between <nTokenRewriteStart> and <nTokenRewriteEnd> position
        if (sWhat === "*") {
            // purge text
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                this.lTokens[nTokenRewriteStart]["bToRemove"] = true;
            } else {
                for (let i = nTokenRewriteStart;  i <= nTokenRewriteEnd;  i++) {
                    this.lTokens[i]["bToRemove"] = true;
                }
            }
        }
        else if (sWhat === "␣") {
            // merge tokens
            this.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd;
        }
        else if (sWhat.startsWith("␣")) {
            sWhat = this._expand(sWhat, nTokenOffset, nLastToken);
            this.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd;
            this.lTokens[nTokenRewriteStart]["sMergedValue"] = sWhat.slice(1);
        }
        else if (sWhat === "_") {
            // neutralized token
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                this.lTokens[nTokenRewriteStart]["sNewValue"] = "_";
            } else {
                for (let i = nTokenRewriteStart;  i <= nTokenRewriteEnd;  i++) {
                    this.lTokens[i]["sNewValue"] = "_";
                }
            }
        }
        else {
            if (sWhat.startsWith("=")) {
                sWhat = gc_functions[sWhat.slice(1)](this.lTokens, nTokenOffset, nLastToken);
            } else {
                sWhat = this._expand(sWhat, nTokenOffset, nLastToken);
            }
            let bUppercase = bCaseSvty && this.lTokens[nTokenRewriteStart]["sValue"].slice(0,1).gl_isUpperCase();
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                // one token
                if (bUppercase) {
                    sWhat = sWhat.gl_toCapitalize();
                }
                this.lTokens[nTokenRewriteStart]["sNewValue"] = sWhat;
            }
            else {
                // several tokens
                let lTokenValue = sWhat.split("|");
                if (lTokenValue.length != (nTokenRewriteEnd - nTokenRewriteStart + 1)) {
                    if (bDebug) {
                        console.log("Error. Text processor: number of replacements != number of tokens.");
                    }
                    return;
                }
                let j = 0;







>
>
>







 







|










|







|








|







 







|







 







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







 







|









|







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



|

>
|


|

|
|



|

>
|


|
>
>
>
>
>
>
>
>







 







|





>













|













|


|




|

|







 







|

|



|

|







 







|







 







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







 







|

|









|



|
|

|

|










|
|

|





|

|



|







177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
...
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
...
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
...
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
...
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
...
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
...
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
...
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
...
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
            s += `#${dToken["i"]}\t${dToken["nStart"]}:${dToken["nEnd"]}\t${dToken["sValue"]}\t${dToken["sType"]}`;
            if (dToken.hasOwnProperty("lMorph")) {
                s += "\t" + dToken["lMorph"].toString();
            }
            if (dToken.hasOwnProperty("aTags")) {
                s += "\t" + dToken["aTags"].toString();
            }
            if (dToken.hasOwnProperty("nMultiStartTo")) {
                s += "\t>>" + dToken["nMultiStartTo"].toString();
            }
            s += "\n";
        }
        return s;
    }

    parse (sCountry="${country_default}", bDebug=false, dOptions=null, bContext=false, bFullInfo=false) {
        // analyses <sText> and returns an iterable of errors or (with option <bFullInfo>) a list of sentences with tokens and errors
................................................................................
                }
            }
            else if (!sOption || option(sOption)) {
                for (let [zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions, lGroups, lNegLookBefore] of lRuleGroup) {
                    if (!gc_engine.aIgnoredRules.has(sRuleId)) {
                        while ((m = zRegex.gl_exec2(sText, lGroups, lNegLookBefore)) !== null) {
                            let bCondMemo = null;
                            for (let [sFuncCond, cActionType, sAction, ...eAct] of lActions) {
                                // action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                                try {
                                    bCondMemo = (!sFuncCond || gc_functions[sFuncCond](sText, sText0, m, this.dTokenPos, sCountry, bCondMemo));
                                    if (bCondMemo) {
                                        switch (cActionType) {
                                            case "-":
                                                // grammar error
                                                //console.log("-> error detected in " + sLineId + "\nzRegex: " + zRegex.source);
                                                let nErrorStart = nOffset + m.start[eAct[0]];
                                                if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.get(nErrorStart)) {
                                                    this.dError.set(nErrorStart, this._createErrorFromRegex(sText, sText0, sAction, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bShowRuleId, sOption, bContext));
                                                    this.dErrorPriority.set(nErrorStart, nPriority);
                                                    this.dSentenceError.set(nErrorStart, this.dError.get(nErrorStart));
                                                }
                                                break;
                                            case "~":
                                                // text processor
                                                //console.log("-> text processor by " + sLineId + "\nzRegex: " + zRegex.source);
                                                sText = this.rewriteText(sText, sAction, eAct[0], m, bUppercase);
                                                bChange = true;
                                                if (bDebug) {
                                                    console.log("~ " + sText + "  -- " + m[eAct[0]] + "  # " + sLineId);
                                                }
                                                break;
                                            case "=":
                                                // disambiguation
                                                //console.log("-> disambiguation by " + sLineId + "\nzRegex: " + zRegex.source);
                                                gc_functions[sAction](sText, m, this.dTokenPos);
                                                if (bDebug) {
                                                    console.log("= " + m[0] + "  # " + sLineId, "\nDA:", this.dTokenPos);
                                                }
                                                break;
                                            case ">":
                                                // we do nothing, this test is just a condition to apply all following actions
                                                break;
................................................................................
        }
        if (bDebug) {
            console.log("UPDATE:");
            console.log(this.asString());
        }
    }

    * _getNextNodes (oGraph, oToken, oNode, bKeep=false) {
        // generator: return matches where <oToken> “values” match <oNode> arcs
        try {
            let bTokenFound = false;
            // token value
            if (oNode.hasOwnProperty(oToken["sValue"])) {
                yield [" ", oToken["sValue"], oNode[oToken["sValue"]]];
                bTokenFound = true;
................................................................................
                                        bTokenFound = true;
                                    }
                                }
                            }
                        }
                    }
                }
                // regex multi morph arcs
                if (oNode.hasOwnProperty("<re_mmorph>")) {
                    if (oToken.hasOwnProperty("nMultiStartTo")) {
                        let lMorph = oToken["oMultiToken"]["lMorph"];
                        for (let sRegex in oNode["<re_mmorph>"]) {
                            if (!sRegex.includes("¬")) {
                                // no anti-pattern
                                if (lMorph.some(sMorph  =>  (sMorph.search(sRegex) !== -1))) {
                                    yield ["&", sRegex, oNode["<re_mmorph>"][sRegex]];
                                    bTokenFound = true;
                                }
                            } else {
                                // there is an anti-pattern
                                let [sPattern, sNegPattern] = sRegex.split("¬", 2);
                                if (sNegPattern == "*") {
                                    // all morphologies must match with <sPattern>
                                    if (sPattern) {
                                        if (lMorph.every(sMorph  =>  (sMorph.search(sPattern) !== -1))) {
                                            yield ["&", sRegex, oNode["<re_mmorph>"][sRegex]];
                                            bTokenFound = true;
                                        }
                                    }
                                } else {
                                    if (sNegPattern  &&  lMorph.some(sMorph  =>  (sMorph.search(sNegPattern) !== -1))) {
                                        continue;
                                    }
                                    if (!sPattern  ||  lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1))) {
                                        yield ["&", sRegex, oNode["<re_mmorph>"][sRegex]];
                                        bTokenFound = true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            // token tags
            if (oToken.hasOwnProperty("aTags") && oNode.hasOwnProperty("<tags>")) {
                for (let sTag of oToken["aTags"]) {
                    if (oNode["<tags>"].hasOwnProperty(sTag)) {
                        yield ["/", sTag, oNode["<tags>"][sTag]];
                        bTokenFound = true;
................................................................................
            }
            if (!bTokenFound && bKeep) {
                yield [null, "", -1];
            }
            // JUMP
            // Warning! Recurssion!
            if (oNode.hasOwnProperty("<>")) {
                yield* this._getNextNodes(oGraph, oToken, oGraph[oNode["<>"]], bKeep=true);
            }
        }
        catch (e) {
            console.error(e);
        }
    }

    parseGraph (oGraph, sCountry="${country_default}", dOptions=null, bShowRuleId=false, bDebug=false, bContext=false) {
        // parse graph with tokens from the text and execute actions encountered
        let lPointers = [];
        let bTagAndRewrite = false;
        try {
            for (let [iToken, oToken] of this.lTokens.entries()) {
                if (bDebug) {
                    console.log("TOKEN: " + oToken["sValue"]);
                }
                // check arcs for each existing pointer
                let lNextPointers = [];
                for (let oPointer of lPointers) {
                    if (oPointer["nMultiEnd"] != -1) {
                        if (oToken["i"] <= oPointer["nMultiEnd"]) {
                            lNextPointers.push(oPointer);
                        }
                        if (oToken["i"] != oPointer["nMultiEnd"]) {
                            continue;
                        }
                    }
                    for (let [cNodeType, sMatch, iNode] of this._getNextNodes(oGraph, oToken, oGraph[oPointer["iNode"]])) {
                        if (cNodeType === null) {
                            lNextPointers.push(oPointer);
                            continue;
                        }
                        if (bDebug) {
                            console.log("  MATCH: " + cNodeType + sMatch);
                        }
                        let nMultiEnd = (cNodeType != "&") ? -1 : oToken["nMultiStartTo"];
                        lNextPointers.push({ "iToken1": oPointer["iToken1"], "iNode": iNode, "nMultiEnd": nMultiEnd });
                    }
                }
                lPointers = lNextPointers;
                // check arcs of first nodes
                for (let [cNodeType, sMatch, iNode] of this._getNextNodes(oGraph, oToken, oGraph[0])) {
                    if (cNodeType === null) {
                        continue;
                    }
                    if (bDebug) {
                        console.log("  MATCH: " + cNodeType + sMatch);
                    }
                    let nMultiEnd = (cNodeType != "&") ? -1 : oToken["nMultiStartTo"];
                    lPointers.push({ "iToken1": iToken, "iNode": iNode, "nMultiEnd": nMultiEnd });
                }
                // check if there is rules to check for each pointer
                for (let oPointer of lPointers) {
                    if (oPointer["nMultiEnd"] != -1) {
                        if (oToken["i"] < oPointer["nMultiEnd"]) {
                            continue;
                        }
                        if (oToken["i"] >= oPointer["nMultiEnd"]) {
                            oPointer["nMultiEnd"] = -1;
                        }
                    }
                    if (oGraph[oPointer["iNode"]].hasOwnProperty("<rules>")) {
                        let bChange = this._executeActions(oGraph, oGraph[oPointer["iNode"]]["<rules>"], oPointer["iToken1"]-1, iToken, dOptions, sCountry, bShowRuleId, bDebug, bContext);
                        if (bChange) {
                            bTagAndRewrite = true;
                        }
                    }
                }
................................................................................
        for (let [sLineId, nextNodeKey] of Object.entries(oNode)) {
            let bCondMemo = null;
            for (let sRuleId of oGraph[nextNodeKey]) {
                try {
                    if (bDebug) {
                        console.log("   >TRY: " + sRuleId + " " + sLineId);
                    }
                    let [_, sOption, sFuncCond, cActionType, sAction, ...eAct] = gc_rules_graph.dRule[sRuleId];
                    // Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ]
                    // TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ]
                    // Disambiguator [ option, condition, "=", replacement/suggestion/action ]
                    // Tag           [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    // Immunity      [ option, condition, "!", "",                            iTokenStart, iTokenEnd ]
                    // Immunity      [ option, condition, "&", "",                            iTokenStart, iTokenEnd ]
                    // Test          [ option, condition, ">", "" ]
                    if (!sOption || dOptions.gl_get(sOption, false)) {
                        bCondMemo = !sFuncCond || gc_functions[sFuncCond](this.lTokens, nTokenOffset, nLastToken, sCountry, bCondMemo, this.dTags, this.sSentence, this.sSentence0);
                        if (bCondMemo) {
                            if (cActionType == "-") {
                                // grammar error
                                let [iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL] = eAct;
                                let nTokenErrorStart = (iTokenStart > 0) ? nTokenOffset + iTokenStart : nLastToken + iTokenStart;
                                if (!this.lTokens[nTokenErrorStart].hasOwnProperty("sImmunity") || (this.lTokens[nTokenErrorStart]["sImmunity"] != "*" && !this.lTokens[nTokenErrorStart]["sImmunity"].includes(sOption))) {
                                    let nTokenErrorEnd = (iTokenEnd > 0) ? nTokenOffset + iTokenEnd : nLastToken + iTokenEnd;
                                    let nErrorStart = this.nOffsetWithinParagraph + ((cStartLimit == "<") ? this.lTokens[nTokenErrorStart]["nStart"] : this.lTokens[nTokenErrorStart]["nEnd"]);
                                    let nErrorEnd = this.nOffsetWithinParagraph + ((cEndLimit == ">") ? this.lTokens[nTokenErrorEnd]["nEnd"] : this.lTokens[nTokenErrorEnd]["nStart"]);
                                    if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.gl_get(nErrorStart, -1)) {
                                        this.dError.set(nErrorStart, this._createErrorFromTokens(sAction, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty,
                                                                                                 sMessage, gc_rules_graph.dURL[iURL], bShowRuleId, sOption, bContext));
                                        this.dErrorPriority.set(nErrorStart, nPriority);
                                        this.dSentenceError.set(nErrorStart, this.dError.get(nErrorStart));
                                        if (bDebug) {
                                            console.log("    NEW_ERROR: ",  this.dError.get(nErrorStart));
                                        }
                                    }
                                }
                            }
                            else if (cActionType == "~") {
                                // text processor
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                this._tagAndPrepareTokenForRewriting(sAction, nTokenStart, nTokenEnd, nTokenOffset, nLastToken, eAct[2], bDebug);
                                bChange = true;
                                if (bDebug) {
                                    console.log(`    TEXT_PROCESSOR: [${this.lTokens[nTokenStart]["sValue"]}:${this.lTokens[nTokenEnd]["sValue"]}]  > ${sAction}`);
                                }
                            }
                            else if (cActionType == "=") {
                                // disambiguation
                                gc_functions[sAction](this.lTokens, nTokenOffset, nLastToken);
                                if (bDebug) {
                                    console.log(`    DISAMBIGUATOR: (${sAction})  [${this.lTokens[nTokenOffset+1]["sValue"]}:${this.lTokens[nLastToken]["sValue"]}]`);
                                }
                            }
                            else if (cActionType == ">") {
                                // we do nothing, this test is just a condition to apply all following actions
                                if (bDebug) {
                                    console.log("    COND_OK");
                                }
................................................................................
                            }
                            else if (cActionType == "/") {
                                // Tag
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                for (let i = nTokenStart; i <= nTokenEnd; i++) {
                                    if (this.lTokens[i].hasOwnProperty("aTags")) {
                                        this.lTokens[i]["aTags"].add(...sAction.split("|"))
                                    } else {
                                        this.lTokens[i]["aTags"] = new Set(sAction.split("|"));
                                    }
                                }
                                if (bDebug) {
                                    console.log(`    TAG:  ${sAction} > [${this.lTokens[nTokenStart]["sValue"]}:${this.lTokens[nTokenEnd]["sValue"]}]`);
                                }
                                for (let sTag of sAction.split("|")) {
                                    if (!this.dTags.has(sTag)) {
                                        this.dTags.set(sTag, [nTokenStart, nTokenEnd]);
                                    } else {
                                        this.dTags.set(sTag, [Math.min(nTokenStart, this.dTags.get(sTag)[0]), Math.max(nTokenEnd, this.dTags.get(sTag)[1])]);
                                    }
                                }
                            }
................................................................................
                            else if (cActionType == "!") {
                                // immunity
                                if (bDebug) {
                                    console.log("    IMMUNITY: " + sLineId + " / " + sRuleId);
                                }
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                let sImmunity = sAction || "*";
                                if (nTokenEnd - nTokenStart == 0) {
                                    this.lTokens[nTokenStart]["sImmunity"] = sImmunity;
                                    let nErrorStart = this.nOffsetWithinParagraph + this.lTokens[nTokenStart]["nStart"];
                                    if (this.dError.has(nErrorStart)) {
                                        this.dError.delete(nErrorStart);
                                    }
                                } else {
................................................................................
                                        this.lTokens[i]["sImmunity"] = sImmunity;
                                        let nErrorStart = this.nOffsetWithinParagraph + this.lTokens[i]["nStart"];
                                        if (this.dError.has(nErrorStart)) {
                                            this.dError.delete(nErrorStart);
                                        }
                                    }
                                }
                            }
                            else if (cActionType == "&") {
                                // multi-tokens
                                let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0];
                                let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1];
                                let oMultiToken = {
                                    "nTokenStart": nTokenStart,
                                    "nTokenEnd": nTokenEnd,
                                    "lTokens": this.lTokens.slice(nTokenStart, nTokenEnd+1),
                                    "lMorph": (sAction) ? sAction.split("|") : [":HM"]
                                }
                                this.lTokens[nTokenStart]["nMultiStartTo"] = this.lTokens[nTokenEnd]["i"];
                                this.lTokens[nTokenEnd]["nMultiEndFrom"] = this.lTokens[nTokenStart]["i"];
                                this.lTokens[nTokenStart]["oMultiToken"] = oMultiToken;
                                this.lTokens[nTokenEnd]["oMultiToken"] = oMultiToken;
                                if (bDebug) {
                                    console.log(`"    MULTI-TOKEN: ${sAction}  [${this.lTokens[nTokenStart]["sValue"]}:${this.lTokens[nTokenEnd]["sValue"]}]`);
                                }
                            }
                            else {
                                console.log("# error: unknown action at " + sLineId);
                            }
                        }
                        else if (cActionType == ">") {
                            if (bDebug) {
                                console.log("    COND_BREAK");
                            }
................................................................................
            sNew = sRepl.gl_expand(m);
            sNew = sNew + " ".repeat(ln-sNew.length);
        }
        //console.log(sText+"\nstart: "+m.start[iGroup]+" end:"+m.end[iGroup]);
        return sText.slice(0, m.start[iGroup]) + sNew + sText.slice(m.end[iGroup]);
    }

    _tagAndPrepareTokenForRewriting (sAction, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bCaseSvty, bDebug) {
        // text processor: rewrite tokens between <nTokenRewriteStart> and <nTokenRewriteEnd> position
        if (sAction === "*") {
            // purge text
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                this.lTokens[nTokenRewriteStart]["bToRemove"] = true;
            } else {
                for (let i = nTokenRewriteStart;  i <= nTokenRewriteEnd;  i++) {
                    this.lTokens[i]["bToRemove"] = true;
                }
            }
        }
        else if (sAction === "␣") {
            // merge tokens
            this.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd;
        }
        else if (sAction.startsWith("␣")) {
            sAction = this._expand(sAction, nTokenOffset, nLastToken);
            this.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd;
            this.lTokens[nTokenRewriteStart]["sMergedValue"] = sAction.slice(1);
        }
        else if (sAction === "_") {
            // neutralized token
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                this.lTokens[nTokenRewriteStart]["sNewValue"] = "_";
            } else {
                for (let i = nTokenRewriteStart;  i <= nTokenRewriteEnd;  i++) {
                    this.lTokens[i]["sNewValue"] = "_";
                }
            }
        }
        else {
            if (sAction.startsWith("=")) {
                sAction = gc_functions[sAction.slice(1)](this.lTokens, nTokenOffset, nLastToken);
            } else {
                sAction = this._expand(sAction, nTokenOffset, nLastToken);
            }
            let bUppercase = bCaseSvty && this.lTokens[nTokenRewriteStart]["sValue"].slice(0,1).gl_isUpperCase();
            if (nTokenRewriteEnd - nTokenRewriteStart == 0) {
                // one token
                if (bUppercase) {
                    sAction = sAction.gl_toCapitalize();
                }
                this.lTokens[nTokenRewriteStart]["sNewValue"] = sAction;
            }
            else {
                // several tokens
                let lTokenValue = sAction.split("|");
                if (lTokenValue.length != (nTokenRewriteEnd - nTokenRewriteStart + 1)) {
                    if (bDebug) {
                        console.log("Error. Text processor: number of replacements != number of tokens.");
                    }
                    return;
                }
                let j = 0;

Modified gc_core/js/lang_core/gc_functions.js from [d31e5f26d5] to [ed16810cd6].

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
...
234
235
236
237
238
239
240

























241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
        if (sValues.includes(sValue)) {
            return true;
        }
    }
    return false;
}

function g_morph (oToken, sPattern, sNegPattern="", nLeft=null, nRight=null, bMemorizeMorph=true) {
    // analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies
    let lMorph;
    if (oToken.hasOwnProperty("lMorph")) {
        lMorph = oToken["lMorph"];
    }
    else {
        if (nLeft !== null) {
            let sValue = (nRight !== null) ? oToken["sValue"].slice(nLeft, nRight) : oToken["sValue"].slice(nLeft);
            lMorph = gc_engine.oSpellChecker.getMorph(sValue);
            if (bMemorizeMorph) {
                oToken["lMorph"] = lMorph;
            }
        } else {
            lMorph = gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
        }
    }
    if (lMorph.length == 0) {
        return false;
    }
................................................................................
            }
        }
    }
    // search sPattern
    return lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1));
}


























function g_morph0 (oToken, sPattern, sNegPattern="", nLeft=null, nRight=null, bMemorizeMorph=true) {
    // analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies
    let lMorph;
    if (nLeft !== null) {
        let sValue = (nRight !== null) ? oToken["sValue"].slice(nLeft, nRight) : oToken["sValue"].slice(nLeft);
        lMorph = gc_engine.oSpellChecker.getMorph(sValue);
        if (bMemorizeMorph) {
            oToken["lMorph"] = lMorph;
        }
    } else {
        lMorph = gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    }
    if (lMorph.length == 0) {
        return false;
    }
    // check negative condition







|









<
<
<







 







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





<
<
<







198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214



215
216
217
218
219
220
221
...
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268



269
270
271
272
273
274
275
        if (sValues.includes(sValue)) {
            return true;
        }
    }
    return false;
}

function g_morph (oToken, sPattern, sNegPattern="", nLeft=null, nRight=null) {
    // analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies
    let lMorph;
    if (oToken.hasOwnProperty("lMorph")) {
        lMorph = oToken["lMorph"];
    }
    else {
        if (nLeft !== null) {
            let sValue = (nRight !== null) ? oToken["sValue"].slice(nLeft, nRight) : oToken["sValue"].slice(nLeft);
            lMorph = gc_engine.oSpellChecker.getMorph(sValue);



        } else {
            lMorph = gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
        }
    }
    if (lMorph.length == 0) {
        return false;
    }
................................................................................
            }
        }
    }
    // search sPattern
    return lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1));
}

function g_morphx (oToken, sPattern, sNegPattern="") {
    // analyse a multi-token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies
    if (!oToken.hasOwnProperty("oMultiToken")) {
        return false;
    }
    let lMorph = oToken["oMultiToken"]["lMorph"];
    if (lMorph.length == 0) {
        return false;
    }
    // check negative condition
    if (sNegPattern) {
        if (sNegPattern == "*") {
            // all morph must match sPattern
            return lMorph.every(sMorph  =>  (sMorph.search(sPattern) !== -1));
        }
        else {
            if (lMorph.some(sMorph  =>  (sMorph.search(sNegPattern) !== -1))) {
                return false;
            }
        }
    }
    // search sPattern
    return lMorph.some(sMorph  =>  (sMorph.search(sPattern) !== -1));
}

function g_morph0 (oToken, sPattern, sNegPattern="", nLeft=null, nRight=null) {
    // analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies
    let lMorph;
    if (nLeft !== null) {
        let sValue = (nRight !== null) ? oToken["sValue"].slice(nLeft, nRight) : oToken["sValue"].slice(nLeft);
        lMorph = gc_engine.oSpellChecker.getMorph(sValue);



    } else {
        lMorph = gc_engine.oSpellChecker.getMorph(oToken["sValue"]);
    }
    if (lMorph.length == 0) {
        return false;
    }
    // check negative condition

Modified gc_core/py/lang_core/gc_engine.py from [2b36e73536] to [db2ab5bd90].

250
251
252
253
254
255
256


257
258
259
260
261
262
263
...
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
...
505
506
507
508
509
510
511

























512
513
514
515
516
517
518
...
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545





546
547
548
549
550
551

552
553
554
555
556
557
558
559

560
561
562
563
564





565
566
567
568
569
570
571
...
577
578
579
580
581
582
583
584
585
586
587
588
589

590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660

















661
662
663
664
665
666
667
...
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
        s += "now:      " + self.sSentence  + "\n"
        for dToken in self.lTokens:
            s += '#{i}\t{nStart}:{nEnd}\t{sValue}\t{sType}'.format(**dToken)
            if "lMorph" in dToken:
                s += "\t" + str(dToken["lMorph"])
            if "aTags" in dToken:
                s += "\t" + str(dToken["aTags"])


            s += "\n"
        #for nPos, dToken in self.dTokenPos.items():
        #    s += "{}\t{}\n".format(nPos, dToken)
        return s

    def parse (self, sCountry="${country_default}", bDebug=False, dOptions=None, bContext=False, bFullInfo=False):
        "analyses <sText> and returns an iterable of errors or (with option <bFullInfo>) paragraphs errors and sentences with tokens and errors"
................................................................................
                        sText = self.parseGraph(_rules_graph.dAllGraph[sGraphName], sCountry, dOptions, bShowRuleId, bDebug, bContext)
            elif not sOption or dOptions.get(sOption, False):
                # regex rules
                for zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions in lRuleGroup:
                    if sRuleId not in _aIgnoredRules:
                        for m in zRegex.finditer(sText):
                            bCondMemo = None
                            for sFuncCond, cActionType, sWhat, *eAct in lActions:
                                # action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                                try:
                                    bCondMemo = not sFuncCond or getattr(gc_functions, sFuncCond)(sText, sText0, m, self.dTokenPos, sCountry, bCondMemo)
                                    if bCondMemo:
                                        if bDebug:
                                            echo("RULE: " + sLineId)
                                        if cActionType == "-":
                                            # grammar error
                                            nErrorStart = nOffset + m.start(eAct[0])
                                            if nErrorStart not in self.dError or nPriority > self.dErrorPriority.get(nErrorStart, -1):
                                                self.dError[nErrorStart] = self._createErrorFromRegex(sText, sText0, sWhat, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bShowRuleId, sOption, bContext)
                                                self.dErrorPriority[nErrorStart] = nPriority
                                                self.dSentenceError[nErrorStart] = self.dError[nErrorStart]
                                        elif cActionType == "~":
                                            # text processor
                                            sText = self.rewriteText(sText, sWhat, eAct[0], m, bUppercase)
                                            bChange = True
                                            if bDebug:
                                                echo("~ " + sText + "  -- " + m.group(eAct[0]) + "  # " + sLineId)
                                        elif cActionType == "=":
                                            # disambiguation
                                            if not bParagraph:
                                                getattr(gc_functions, sWhat)(sText, m, self.dTokenPos)
                                                if bDebug:
                                                    echo("= " + m.group(0) + "  # " + sLineId)
                                        elif cActionType == ">":
                                            # we do nothing, this test is just a condition to apply all following actions
                                            pass
                                        else:
                                            echo("# error: unknown action at " + sLineId)
................................................................................
                dToken["aTags"] = self.dTokenPos[dToken["nStart"]]["aTags"]
        self.lTokens = lNewTokens
        self.dTokenPos = { dToken["nStart"]: dToken  for dToken in self.lTokens  if dToken["sType"] != "INFO" }
        if bDebug:
            echo("UPDATE:")
            echo(self)

    def _getMatches (self, dGraph, dToken, dNode, bKeep=False):
        "generator: return matches where <dToken> “values” match <dNode> arcs"
        bTokenFound = False
        # token value
        if dToken["sValue"] in dNode:
            yield (" ", dToken["sValue"], dNode[dToken["sValue"]])
            bTokenFound = True
        if dToken["sValue"][0:2].istitle(): # we test only 2 first chars, to match words such as "Laissez-les", "Crève-cœur".
................................................................................
                                        bTokenFound = True
                            else:
                                if sNegPattern and any(re.search(sNegPattern, sMorph)  for sMorph in lMorph):
                                    continue
                                if not sPattern or any(re.search(sPattern, sMorph)  for sMorph in lMorph):
                                    yield ("@", sRegex, dNode["<re_morph>"][sRegex])
                                    bTokenFound = True

























        # token tags
        if "aTags" in dToken and "<tags>" in dNode:
            for sTag in dToken["aTags"]:
                if sTag in dNode["<tags>"]:
                    yield ("/", sTag, dNode["<tags>"][sTag])
                    bTokenFound = True
        # meta arc (for token type)
................................................................................
                        yield ("*", sMeta, dNode["<meta>"][sMeta])
                        bTokenFound = True
        if not bTokenFound and bKeep:
            yield (None, "", -1)
        # JUMP
        # Warning! Recursion!
        if "<>" in dNode:
            yield from self._getMatches(dGraph, dToken, dGraph[dNode["<>"]], bKeep=True)

    def parseGraph (self, dGraph, sCountry="${country_default}", dOptions=None, bShowRuleId=False, bDebug=False, bContext=False):
        "parse graph with tokens from the text and execute actions encountered"
        lPointer = []
        bTagAndRewrite = False
        for iToken, dToken in enumerate(self.lTokens):
            if bDebug:
                echo("TOKEN: " + dToken["sValue"])
            # check arcs for each existing pointer
            lNextPointer = []
            for dPointer in lPointer:





                for cActionType, sMatch, iNode in self._getMatches(dGraph, dToken, dGraph[dPointer["iNode"]]):
                    if cActionType is None:
                        lNextPointer.append(dPointer)
                        continue
                    if bDebug:
                        echo("  MATCH: " + cActionType + sMatch)

                    lNextPointer.append({ "iToken1": dPointer["iToken1"], "iNode": iNode })
            lPointer = lNextPointer
            # check arcs of first nodes
            for cActionType, sMatch, iNode in self._getMatches(dGraph, dToken, dGraph[0]):
                if cActionType is None:
                    continue
                if bDebug:
                    echo("  MATCH: " + cActionType + sMatch)

                lPointer.append({ "iToken1": iToken, "iNode": iNode })
            # check if there is rules to check for each pointer
            for dPointer in lPointer:
                #if bDebug:
                #    echo("+", dPointer)





                if "<rules>" in dGraph[dPointer["iNode"]]:
                    bChange = self._executeActions(dGraph, dGraph[dPointer["iNode"]]["<rules>"], dPointer["iToken1"]-1, iToken, dOptions, sCountry, bShowRuleId, bDebug, bContext)
                    if bChange:
                        bTagAndRewrite = True
        if bTagAndRewrite:
            self.rewriteFromTags(bDebug)
        if bDebug:
................................................................................
        bChange = False
        for sLineId, nextNodeKey in dNode.items():
            bCondMemo = None
            for sRuleId in dGraph[nextNodeKey]:
                try:
                    if bDebug:
                        echo("   >TRY: " + sRuleId + " " + sLineId)
                    _, sOption, sFuncCond, cActionType, sWhat, *eAct = _rules_graph.dRule[sRuleId]
                    # Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ]
                    # TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ]
                    # Disambiguator [ option, condition, "=", replacement/suggestion/action ]
                    # Tag           [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    # Immunity      [ option, condition, "!", option,                        iTokenStart, iTokenEnd ]

                    # Test          [ option, condition, ">", "" ]
                    if not sOption or dOptions.get(sOption, False):
                        bCondMemo = not sFuncCond or getattr(gc_functions, sFuncCond)(self.lTokens, nTokenOffset, nLastToken, sCountry, bCondMemo, self.dTags, self.sSentence, self.sSentence0)
                        if bCondMemo:
                            if cActionType == "-":
                                # grammar error
                                iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL = eAct
                                nTokenErrorStart = nTokenOffset + iTokenStart  if iTokenStart > 0  else nLastToken + iTokenStart
                                if "sImmunity" not in self.lTokens[nTokenErrorStart] or (self.lTokens[nTokenErrorStart]["sImmunity"] != "*" and sOption not in self.lTokens[nTokenErrorStart]["sImmunity"]):
                                    nTokenErrorEnd = nTokenOffset + iTokenEnd  if iTokenEnd > 0  else nLastToken + iTokenEnd
                                    nErrorStart = self.nOffsetWithinParagraph + (self.lTokens[nTokenErrorStart]["nStart"] if cStartLimit == "<"  else self.lTokens[nTokenErrorStart]["nEnd"])
                                    nErrorEnd = self.nOffsetWithinParagraph + (self.lTokens[nTokenErrorEnd]["nEnd"] if cEndLimit == ">"  else self.lTokens[nTokenErrorEnd]["nStart"])
                                    if nErrorStart not in self.dError or nPriority > self.dErrorPriority.get(nErrorStart, -1):
                                        self.dError[nErrorStart] = self._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, \
                                                                                               sMessage, _rules_graph.dURL.get(iURL, ""), bShowRuleId, sOption, bContext)
                                        self.dErrorPriority[nErrorStart] = nPriority
                                        self.dSentenceError[nErrorStart] = self.dError[nErrorStart]
                                        if bDebug:
                                            echo("    NEW_ERROR: {}".format(self.dError[nErrorStart]))
                            elif cActionType == "~":
                                # text processor
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                self._tagAndPrepareTokenForRewriting(sWhat, nTokenStart, nTokenEnd, nTokenOffset, nLastToken, eAct[2], bDebug)
                                bChange = True
                                if bDebug:
                                    echo("    TEXT_PROCESSOR: [{}:{}]  > {}".format(self.lTokens[nTokenStart]["sValue"], self.lTokens[nTokenEnd]["sValue"], sWhat))
                            elif cActionType == "=":
                                # disambiguation
                                getattr(gc_functions, sWhat)(self.lTokens, nTokenOffset, nLastToken)
                                if bDebug:
                                    echo("    DISAMBIGUATOR: ({})  [{}:{}]".format(sWhat, self.lTokens[nTokenOffset+1]["sValue"], self.lTokens[nLastToken]["sValue"]))
                            elif cActionType == ">":
                                # we do nothing, this test is just a condition to apply all following actions
                                if bDebug:
                                    echo("    COND_OK")
                            elif cActionType == "/":
                                # Tag
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                for i in range(nTokenStart, nTokenEnd+1):
                                    if "aTags" in self.lTokens[i]:
                                        self.lTokens[i]["aTags"].update(sWhat.split("|"))
                                    else:
                                        self.lTokens[i]["aTags"] = set(sWhat.split("|"))
                                if bDebug:
                                    echo("    TAG: {} >  [{}:{}]".format(sWhat, self.lTokens[nTokenStart]["sValue"], self.lTokens[nTokenEnd]["sValue"]))
                                for sTag in sWhat.split("|"):
                                    if sTag not in self.dTags:
                                        self.dTags[sTag] = [nTokenStart, nTokenEnd]
                                    else:
                                        self.dTags[sTag][0] = min(nTokenStart, self.dTags[sTag][0])
                                        self.dTags[sTag][1] = max(nTokenEnd, self.dTags[sTag][1])
                            elif cActionType == "!":
                                # immunity
                                if bDebug:
                                    echo("    IMMUNITY: " + sLineId + " / " + sRuleId)
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                sImmunity = sWhat or "*"
                                if nTokenEnd - nTokenStart == 0:
                                    self.lTokens[nTokenStart]["sImmunity"] = sImmunity
                                    nErrorStart = self.nOffsetWithinParagraph + self.lTokens[nTokenStart]["nStart"]
                                    if nErrorStart in self.dError:
                                        del self.dError[nErrorStart]
                                else:
                                    for i in range(nTokenStart, nTokenEnd+1):
                                        self.lTokens[i]["sImmunity"] = sImmunity
                                        nErrorStart = self.nOffsetWithinParagraph + self.lTokens[i]["nStart"]
                                        if nErrorStart in self.dError:
                                            del self.dError[nErrorStart]

















                            else:
                                echo("# error: unknown action at " + sLineId)
                        elif cActionType == ">":
                            if bDebug:
                                echo("    COND_BREAK")
                            break
                except Exception as e:
................................................................................
            if bUppercase and m.group(iGroup)[0:1].isupper():
                sNew = sNew.capitalize()
        else:
            sNew = m.expand(sRepl)
            sNew = sNew + " " * (nLen-len(sNew))
        return sText[0:m.start(iGroup)] + sNew + sText[m.end(iGroup):]

    def _tagAndPrepareTokenForRewriting (self, sWhat, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bCaseSvty, bDebug):
        "text processor: rewrite tokens between <nTokenRewriteStart> and <nTokenRewriteEnd> position"
        if sWhat == "*":
            # purge text
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lTokens[nTokenRewriteStart]["bToRemove"] = True
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lTokens[i]["bToRemove"] = True
        elif sWhat == "␣":
            # merge tokens
            self.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd
        elif sWhat.startswith("␣"):
            sWhat = self._expand(sWhat, nTokenOffset, nLastToken)
            self.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd
            self.lTokens[nTokenRewriteStart]["sMergedValue"] = sWhat[1:]
        elif sWhat == "_":
            # neutralized token
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lTokens[nTokenRewriteStart]["sNewValue"] = "_"
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lTokens[i]["sNewValue"] = "_"
        else:
            if sWhat.startswith("="):
                sWhat = getattr(gc_functions, sWhat[1:])(self.lTokens, nTokenOffset, nLastToken)
            else:
                sWhat = self._expand(sWhat, nTokenOffset, nLastToken)
            bUppercase = bCaseSvty and self.lTokens[nTokenRewriteStart]["sValue"][0:1].isupper()
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                # one token
                if bUppercase:
                    sWhat = sWhat[0:1].upper() + sWhat[1:]
                self.lTokens[nTokenRewriteStart]["sNewValue"] = sWhat
            else:
                # several tokens
                lTokenValue = sWhat.split("|")
                if len(lTokenValue) != (nTokenRewriteEnd - nTokenRewriteStart + 1):
                    if bDebug:
                        echo("Error. Text processor: number of replacements != number of tokens.")
                    return
                for i, sValue in zip(range(nTokenRewriteStart, nTokenRewriteEnd+1), lTokenValue):
                    if not sValue or sValue == "*":
                        self.lTokens[i]["bToRemove"] = True







>
>







 







|










|




|






|







 







|







 







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







 







|



|





|
|
>
>
>
>
>
|
|
|


|
>
|
|

|
|


|
>
|

|
<
<
>
>
>
>
>







 







|





>













|









|


|


|

|










|

|

|
|











|











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







 







|

|






|


|
|

|
|







|
|

|




|
|


|







250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
...
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
...
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
...
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
...
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596


597
598
599
600
601
602
603
604
605
606
607
608
...
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
...
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
        s += "now:      " + self.sSentence  + "\n"
        for dToken in self.lTokens:
            s += '#{i}\t{nStart}:{nEnd}\t{sValue}\t{sType}'.format(**dToken)
            if "lMorph" in dToken:
                s += "\t" + str(dToken["lMorph"])
            if "aTags" in dToken:
                s += "\t" + str(dToken["aTags"])
            if "nMultiStartTo" in dToken:
                s += "\t>>" + str(dToken["nMultiStartTo"])
            s += "\n"
        #for nPos, dToken in self.dTokenPos.items():
        #    s += "{}\t{}\n".format(nPos, dToken)
        return s

    def parse (self, sCountry="${country_default}", bDebug=False, dOptions=None, bContext=False, bFullInfo=False):
        "analyses <sText> and returns an iterable of errors or (with option <bFullInfo>) paragraphs errors and sentences with tokens and errors"
................................................................................
                        sText = self.parseGraph(_rules_graph.dAllGraph[sGraphName], sCountry, dOptions, bShowRuleId, bDebug, bContext)
            elif not sOption or dOptions.get(sOption, False):
                # regex rules
                for zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions in lRuleGroup:
                    if sRuleId not in _aIgnoredRules:
                        for m in zRegex.finditer(sText):
                            bCondMemo = None
                            for sFuncCond, cActionType, sAction, *eAct in lActions:
                                # action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                                try:
                                    bCondMemo = not sFuncCond or getattr(gc_functions, sFuncCond)(sText, sText0, m, self.dTokenPos, sCountry, bCondMemo)
                                    if bCondMemo:
                                        if bDebug:
                                            echo("RULE: " + sLineId)
                                        if cActionType == "-":
                                            # grammar error
                                            nErrorStart = nOffset + m.start(eAct[0])
                                            if nErrorStart not in self.dError or nPriority > self.dErrorPriority.get(nErrorStart, -1):
                                                self.dError[nErrorStart] = self._createErrorFromRegex(sText, sText0, sAction, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bShowRuleId, sOption, bContext)
                                                self.dErrorPriority[nErrorStart] = nPriority
                                                self.dSentenceError[nErrorStart] = self.dError[nErrorStart]
                                        elif cActionType == "~":
                                            # text processor
                                            sText = self.rewriteText(sText, sAction, eAct[0], m, bUppercase)
                                            bChange = True
                                            if bDebug:
                                                echo("~ " + sText + "  -- " + m.group(eAct[0]) + "  # " + sLineId)
                                        elif cActionType == "=":
                                            # disambiguation
                                            if not bParagraph:
                                                getattr(gc_functions, sAction)(sText, m, self.dTokenPos)
                                                if bDebug:
                                                    echo("= " + m.group(0) + "  # " + sLineId)
                                        elif cActionType == ">":
                                            # we do nothing, this test is just a condition to apply all following actions
                                            pass
                                        else:
                                            echo("# error: unknown action at " + sLineId)
................................................................................
                dToken["aTags"] = self.dTokenPos[dToken["nStart"]]["aTags"]
        self.lTokens = lNewTokens
        self.dTokenPos = { dToken["nStart"]: dToken  for dToken in self.lTokens  if dToken["sType"] != "INFO" }
        if bDebug:
            echo("UPDATE:")
            echo(self)

    def _getNextNodes (self, dGraph, dToken, dNode, bKeep=False):
        "generator: return matches where <dToken> “values” match <dNode> arcs"
        bTokenFound = False
        # token value
        if dToken["sValue"] in dNode:
            yield (" ", dToken["sValue"], dNode[dToken["sValue"]])
            bTokenFound = True
        if dToken["sValue"][0:2].istitle(): # we test only 2 first chars, to match words such as "Laissez-les", "Crève-cœur".
................................................................................
                                        bTokenFound = True
                            else:
                                if sNegPattern and any(re.search(sNegPattern, sMorph)  for sMorph in lMorph):
                                    continue
                                if not sPattern or any(re.search(sPattern, sMorph)  for sMorph in lMorph):
                                    yield ("@", sRegex, dNode["<re_morph>"][sRegex])
                                    bTokenFound = True
            # regex multi morph arcs
            if "<re_mmorph>" in dNode:
                if "nMultiStartTo" in dToken:
                    lMorph = dToken["dMultiToken"]["lMorph"]
                    for sRegex in dNode["<re_mmorph>"]:
                        if "¬" not in sRegex:
                            # no anti-pattern
                            if any(re.search(sRegex, sMorph)  for sMorph in lMorph):
                                yield ("&", sRegex, dNode["<re_mmorph>"][sRegex])
                                bTokenFound = True
                        else:
                            # there is an anti-pattern
                            sPattern, sNegPattern = sRegex.split("¬", 1)
                            if sNegPattern == "*":
                                # all morphologies must match with <sPattern>
                                if sPattern:
                                    if all(re.search(sPattern, sMorph)  for sMorph in lMorph):
                                        yield ("&", sRegex, dNode["<re_mmorph>"][sRegex])
                                        bTokenFound = True
                            else:
                                if sNegPattern and any(re.search(sNegPattern, sMorph)  for sMorph in lMorph):
                                    continue
                                if not sPattern or any(re.search(sPattern, sMorph)  for sMorph in lMorph):
                                    yield ("&", sRegex, dNode["<re_mmorph>"][sRegex])
                                    bTokenFound = True
        # token tags
        if "aTags" in dToken and "<tags>" in dNode:
            for sTag in dToken["aTags"]:
                if sTag in dNode["<tags>"]:
                    yield ("/", sTag, dNode["<tags>"][sTag])
                    bTokenFound = True
        # meta arc (for token type)
................................................................................
                        yield ("*", sMeta, dNode["<meta>"][sMeta])
                        bTokenFound = True
        if not bTokenFound and bKeep:
            yield (None, "", -1)
        # JUMP
        # Warning! Recursion!
        if "<>" in dNode:
            yield from self._getNextNodes(dGraph, dToken, dGraph[dNode["<>"]], bKeep=True)

    def parseGraph (self, dGraph, sCountry="${country_default}", dOptions=None, bShowRuleId=False, bDebug=False, bContext=False):
        "parse graph with tokens from the text and execute actions encountered"
        lPointers = []
        bTagAndRewrite = False
        for iToken, dToken in enumerate(self.lTokens):
            if bDebug:
                echo("TOKEN: " + dToken["sValue"])
            # check arcs for each existing pointer
            lNextPointers = []
            for dPointer in lPointers:
                if dPointer["nMultiEnd"] != -1:
                    if dToken["i"] <= dPointer["nMultiEnd"]:
                        lNextPointers.append(dPointer)
                    if dToken["i"] != dPointer["nMultiEnd"]:
                        continue
                for cNodeType, sMatch, iNode in self._getNextNodes(dGraph, dToken, dGraph[dPointer["iNode"]]):
                    if cNodeType is None:
                        lNextPointers.append(dPointer)
                        continue
                    if bDebug:
                        echo("  MATCH: " + cNodeType + sMatch)
                    nMultiEnd = -1  if cNodeType != "&"  else dToken["nMultiStartTo"]
                    lNextPointers.append({ "iToken1": dPointer["iToken1"], "iNode": iNode, "nMultiEnd": nMultiEnd })
            lPointers = lNextPointers
            # check arcs of first nodes
            for cNodeType, sMatch, iNode in self._getNextNodes(dGraph, dToken, dGraph[0]):
                if cNodeType is None:
                    continue
                if bDebug:
                    echo("  MATCH: " + cNodeType + sMatch)
                nMultiEnd = -1  if cNodeType != "&"  else dToken["nMultiStartTo"]
                lPointers.append({ "iToken1": iToken, "iNode": iNode, "nMultiEnd": nMultiEnd })
            # check if there is rules to check for each pointer
            for dPointer in lPointers:


                if dPointer["nMultiEnd"] != -1:
                    if dToken["i"] < dPointer["nMultiEnd"]:
                        continue
                    if dToken["i"] >= dPointer["nMultiEnd"]:
                        dPointer["nMultiEnd"] = -1
                if "<rules>" in dGraph[dPointer["iNode"]]:
                    bChange = self._executeActions(dGraph, dGraph[dPointer["iNode"]]["<rules>"], dPointer["iToken1"]-1, iToken, dOptions, sCountry, bShowRuleId, bDebug, bContext)
                    if bChange:
                        bTagAndRewrite = True
        if bTagAndRewrite:
            self.rewriteFromTags(bDebug)
        if bDebug:
................................................................................
        bChange = False
        for sLineId, nextNodeKey in dNode.items():
            bCondMemo = None
            for sRuleId in dGraph[nextNodeKey]:
                try:
                    if bDebug:
                        echo("   >TRY: " + sRuleId + " " + sLineId)
                    _, sOption, sFuncCond, cActionType, sAction, *eAct = _rules_graph.dRule[sRuleId]
                    # Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ]
                    # TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ]
                    # Disambiguator [ option, condition, "=", replacement/suggestion/action ]
                    # Tag           [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    # Immunity      [ option, condition, "!", option,                        iTokenStart, iTokenEnd ]
                    # Multi-token   [ option, condition, "&", morphologies,                  iTokenStart, iTokenEnd ]
                    # Test          [ option, condition, ">", "" ]
                    if not sOption or dOptions.get(sOption, False):
                        bCondMemo = not sFuncCond or getattr(gc_functions, sFuncCond)(self.lTokens, nTokenOffset, nLastToken, sCountry, bCondMemo, self.dTags, self.sSentence, self.sSentence0)
                        if bCondMemo:
                            if cActionType == "-":
                                # grammar error
                                iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL = eAct
                                nTokenErrorStart = nTokenOffset + iTokenStart  if iTokenStart > 0  else nLastToken + iTokenStart
                                if "sImmunity" not in self.lTokens[nTokenErrorStart] or (self.lTokens[nTokenErrorStart]["sImmunity"] != "*" and sOption not in self.lTokens[nTokenErrorStart]["sImmunity"]):
                                    nTokenErrorEnd = nTokenOffset + iTokenEnd  if iTokenEnd > 0  else nLastToken + iTokenEnd
                                    nErrorStart = self.nOffsetWithinParagraph + (self.lTokens[nTokenErrorStart]["nStart"] if cStartLimit == "<"  else self.lTokens[nTokenErrorStart]["nEnd"])
                                    nErrorEnd = self.nOffsetWithinParagraph + (self.lTokens[nTokenErrorEnd]["nEnd"] if cEndLimit == ">"  else self.lTokens[nTokenErrorEnd]["nStart"])
                                    if nErrorStart not in self.dError or nPriority > self.dErrorPriority.get(nErrorStart, -1):
                                        self.dError[nErrorStart] = self._createErrorFromTokens(sAction, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, \
                                                                                               sMessage, _rules_graph.dURL.get(iURL, ""), bShowRuleId, sOption, bContext)
                                        self.dErrorPriority[nErrorStart] = nPriority
                                        self.dSentenceError[nErrorStart] = self.dError[nErrorStart]
                                        if bDebug:
                                            echo("    NEW_ERROR: {}".format(self.dError[nErrorStart]))
                            elif cActionType == "~":
                                # text processor
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                self._tagAndPrepareTokenForRewriting(sAction, nTokenStart, nTokenEnd, nTokenOffset, nLastToken, eAct[2], bDebug)
                                bChange = True
                                if bDebug:
                                    echo("    TEXT_PROCESSOR: [{}:{}]  > {}".format(self.lTokens[nTokenStart]["sValue"], self.lTokens[nTokenEnd]["sValue"], sAction))
                            elif cActionType == "=":
                                # disambiguation
                                getattr(gc_functions, sAction)(self.lTokens, nTokenOffset, nLastToken)
                                if bDebug:
                                    echo("    DISAMBIGUATOR: ({})  [{}:{}]".format(sAction, self.lTokens[nTokenOffset+1]["sValue"], self.lTokens[nLastToken]["sValue"]))
                            elif cActionType == ">":
                                # we do nothing, this test is just a condition to apply all following actions
                                if bDebug:
                                    echo("    COND_OK")
                            elif cActionType == "/":
                                # Tag
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                for i in range(nTokenStart, nTokenEnd+1):
                                    if "aTags" in self.lTokens[i]:
                                        self.lTokens[i]["aTags"].update(sAction.split("|"))
                                    else:
                                        self.lTokens[i]["aTags"] = set(sAction.split("|"))
                                if bDebug:
                                    echo("    TAG: {} >  [{}:{}]".format(sAction, self.lTokens[nTokenStart]["sValue"], self.lTokens[nTokenEnd]["sValue"]))
                                for sTag in sAction.split("|"):
                                    if sTag not in self.dTags:
                                        self.dTags[sTag] = [nTokenStart, nTokenEnd]
                                    else:
                                        self.dTags[sTag][0] = min(nTokenStart, self.dTags[sTag][0])
                                        self.dTags[sTag][1] = max(nTokenEnd, self.dTags[sTag][1])
                            elif cActionType == "!":
                                # immunity
                                if bDebug:
                                    echo("    IMMUNITY: " + sLineId + " / " + sRuleId)
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                sImmunity = sAction or "*"
                                if nTokenEnd - nTokenStart == 0:
                                    self.lTokens[nTokenStart]["sImmunity"] = sImmunity
                                    nErrorStart = self.nOffsetWithinParagraph + self.lTokens[nTokenStart]["nStart"]
                                    if nErrorStart in self.dError:
                                        del self.dError[nErrorStart]
                                else:
                                    for i in range(nTokenStart, nTokenEnd+1):
                                        self.lTokens[i]["sImmunity"] = sImmunity
                                        nErrorStart = self.nOffsetWithinParagraph + self.lTokens[i]["nStart"]
                                        if nErrorStart in self.dError:
                                            del self.dError[nErrorStart]
                            elif cActionType == "&":
                                # multi-tokens
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                dMultiToken = {
                                    "nTokenStart": nTokenStart,
                                    "nTokenEnd": nTokenEnd,
                                    "lTokens": self.lTokens[nTokenStart:nTokenEnd+1],
                                    "lMorph": sAction.split("|")  if sAction else  [":HM"]
                                }
                                self.lTokens[nTokenStart]["nMultiStartTo"] = self.lTokens[nTokenEnd]["i"]
                                self.lTokens[nTokenEnd]["nMultiEndFrom"] = self.lTokens[nTokenStart]["i"]
                                self.lTokens[nTokenStart]["dMultiToken"] = dMultiToken
                                self.lTokens[nTokenEnd]["dMultiToken"] = dMultiToken
                                if bDebug:
                                    echo("    MULTI-TOKEN: ({})  [{}:{}]".format(sAction, self.lTokens[nTokenStart]["sValue"], self.lTokens[nTokenEnd]["sValue"]))
                                #print(dMultiToken)
                            else:
                                echo("# error: unknown action at " + sLineId)
                        elif cActionType == ">":
                            if bDebug:
                                echo("    COND_BREAK")
                            break
                except Exception as e:
................................................................................
            if bUppercase and m.group(iGroup)[0:1].isupper():
                sNew = sNew.capitalize()
        else:
            sNew = m.expand(sRepl)
            sNew = sNew + " " * (nLen-len(sNew))
        return sText[0:m.start(iGroup)] + sNew + sText[m.end(iGroup):]

    def _tagAndPrepareTokenForRewriting (self, sAction, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bCaseSvty, bDebug):
        "text processor: rewrite tokens between <nTokenRewriteStart> and <nTokenRewriteEnd> position"
        if sAction == "*":
            # purge text
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lTokens[nTokenRewriteStart]["bToRemove"] = True
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lTokens[i]["bToRemove"] = True
        elif sAction == "␣":
            # merge tokens
            self.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd
        elif sAction.startswith("␣"):
            sAction = self._expand(sAction, nTokenOffset, nLastToken)
            self.lTokens[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd
            self.lTokens[nTokenRewriteStart]["sMergedValue"] = sAction[1:]
        elif sAction == "_":
            # neutralized token
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lTokens[nTokenRewriteStart]["sNewValue"] = "_"
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lTokens[i]["sNewValue"] = "_"
        else:
            if sAction.startswith("="):
                sAction = getattr(gc_functions, sAction[1:])(self.lTokens, nTokenOffset, nLastToken)
            else:
                sAction = self._expand(sAction, nTokenOffset, nLastToken)
            bUppercase = bCaseSvty and self.lTokens[nTokenRewriteStart]["sValue"][0:1].isupper()
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                # one token
                if bUppercase:
                    sAction = sAction[0:1].upper() + sAction[1:]
                self.lTokens[nTokenRewriteStart]["sNewValue"] = sAction
            else:
                # several tokens
                lTokenValue = sAction.split("|")
                if len(lTokenValue) != (nTokenRewriteEnd - nTokenRewriteStart + 1):
                    if bDebug:
                        echo("Error. Text processor: number of replacements != number of tokens.")
                    return
                for i, sValue in zip(range(nTokenRewriteStart, nTokenRewriteEnd+1), lTokenValue):
                    if not sValue or sValue == "*":
                        self.lTokens[i]["bToRemove"] = True

Modified gc_core/py/lang_core/gc_functions.py from [069bca6c44] to [8b75051fd9].

184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
...
211
212
213
214
215
216
217





















218
219
220
221
222
223
224
225
226
227
228
229
230
            return True
        sValue = sValue.lower()
        if sValue in sValues:
            return True
    return False


def g_morph (dToken, sPattern, sNegPattern="", nLeft=None, nRight=None, bMemorizeMorph=True):
    "analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies"
    if "lMorph" in dToken:
        lMorph = dToken["lMorph"]
    else:
        if nLeft is not None:
            lMorph = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])
            if bMemorizeMorph:
                dToken["lMorph"] = lMorph
        else:
            lMorph = _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph:
        return False
    # check negative condition
    if sNegPattern:
        if sNegPattern == "*":
................................................................................
        if any(zNegPattern.search(sMorph)  for sMorph in lMorph):
            return False
    # search sPattern
    zPattern = re.compile(sPattern)
    return any(zPattern.search(sMorph)  for sMorph in lMorph)























def g_morph0 (dToken, sPattern, sNegPattern="", nLeft=None, nRight=None, bMemorizeMorph=True):
    "analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies (disambiguation off)"
    if nLeft is not None:
        lMorph = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])
        if bMemorizeMorph:
            dToken["lMorph"] = lMorph
    else:
        lMorph = _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph:
        return False
    # check negative condition
    if sNegPattern:
        if sNegPattern == "*":







|






<
<







 







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



<
<







184
185
186
187
188
189
190
191
192
193
194
195
196
197


198
199
200
201
202
203
204
...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240


241
242
243
244
245
246
247
            return True
        sValue = sValue.lower()
        if sValue in sValues:
            return True
    return False


def g_morph (dToken, sPattern, sNegPattern="", nLeft=None, nRight=None):
    "analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies"
    if "lMorph" in dToken:
        lMorph = dToken["lMorph"]
    else:
        if nLeft is not None:
            lMorph = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])


        else:
            lMorph = _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph:
        return False
    # check negative condition
    if sNegPattern:
        if sNegPattern == "*":
................................................................................
        if any(zNegPattern.search(sMorph)  for sMorph in lMorph):
            return False
    # search sPattern
    zPattern = re.compile(sPattern)
    return any(zPattern.search(sMorph)  for sMorph in lMorph)


def g_morphx (dToken, sPattern, sNegPattern=""):
    "analyse a multi-token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies"
    if not "dMultiToken" in dToken:
        return False
    lMorph = dToken["dMultiToken"]["lMorph"]
    if not lMorph:
        return False
    # check negative condition
    if sNegPattern:
        if sNegPattern == "*":
            # all morph must match sPattern
            zPattern = re.compile(sPattern)
            return all(zPattern.search(sMorph)  for sMorph in lMorph)
        zNegPattern = re.compile(sNegPattern)
        if any(zNegPattern.search(sMorph)  for sMorph in lMorph):
            return False
    # search sPattern
    zPattern = re.compile(sPattern)
    return any(zPattern.search(sMorph)  for sMorph in lMorph)


def g_morph0 (dToken, sPattern, sNegPattern="", nLeft=None, nRight=None):
    "analyse a token, return True if <sNegPattern> not in morphologies and <sPattern> in morphologies (disambiguation off)"
    if nLeft is not None:
        lMorph = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)])


    else:
        lMorph = _oSpellChecker.getMorph(dToken["sValue"])
    if not lMorph:
        return False
    # check negative condition
    if sNegPattern:
        if sNegPattern == "*":

Modified gc_lang/fr/modules-js/cregex.js from [c1ba0b4cea] to [2376d50b6d].

78
79
80
81
82
83
84
85




86
87
88
89
90
91
92
    _zNPf: new RegExp(":(?:M[12P]|T):f"),
    _zNPe: new RegExp(":(?:M[12P]|T):e"),


    ///// FONCTIONS

    getLemmaOfMorph: function (sMorph) {
        return this._zLemma.exec(sMorph)[1];




    },

    agreement: function (l1, l2) {
        // returns True if agreement in gender and number is possible between morphologies <l1> and <l2>
        let [sGender1, sNumber1] = this.getGenderNumber(l1);
        let [sGender2, sNumber2] = this.getGenderNumber(l2);
        if (sNumber1 !== ":i" && sNumber2 !== ":i" && sNumber1 !== sNumber2) {







|
>
>
>
>







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    _zNPf: new RegExp(":(?:M[12P]|T):f"),
    _zNPe: new RegExp(":(?:M[12P]|T):e"),


    ///// FONCTIONS

    getLemmaOfMorph: function (sMorph) {
        let m = this._zLemma.exec(sMorph);
        if (m) {
            return m[1];
        }
        return "";
    },

    agreement: function (l1, l2) {
        // returns True if agreement in gender and number is possible between morphologies <l1> and <l2>
        let [sGender1, sNumber1] = this.getGenderNumber(l1);
        let [sGender2, sNumber2] = this.getGenderNumber(l2);
        if (sNumber1 !== ":i" && sNumber2 !== ":i" && sNumber1 !== sNumber2) {

Modified gc_lang/fr/modules-js/gce_analyseur.js from [7da47c7f30] to [233e133202].

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        if (oToken["sValue"].includes("-t-")) {
            nEnd = nEnd - 2;
        }
        else if (oToken["sValue"].search(/-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$/) != -1) {
            nEnd = oToken["sValue"].slice(0,nEnd).lastIndexOf("-");
        }
    }
    return g_morph(oToken, sPattern, sNegPattern, 0, nEnd, false);
}

function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    return sWord2.length < 2 || (cregex.mbNomNotAdj(gc_engine.oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(gc_engine.oSpellChecker.getMorph(sWord1)));
}








|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        if (oToken["sValue"].includes("-t-")) {
            nEnd = nEnd - 2;
        }
        else if (oToken["sValue"].search(/-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$/) != -1) {
            nEnd = oToken["sValue"].slice(0,nEnd).lastIndexOf("-");
        }
    }
    return g_morph(oToken, sPattern, sNegPattern, 0, nEnd);
}

function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    return sWord2.length < 2 || (cregex.mbNomNotAdj(gc_engine.oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(gc_engine.oSpellChecker.getMorph(sWord1)));
}

Modified gc_lang/fr/modules/cregex.py from [d34aee52e1] to [412242b1dc].

78
79
80
81
82
83
84
85



86
87
88
89
90
91
92
NPe = re.compile(":(?:M[12P]|T):e")


#### FONCTIONS

def getLemmaOfMorph (s):
    "return lemma in morphology <s>"
    return Lemma.search(s).group(1)




def agreement (l1, l2):
    "returns True if agreement in gender and number is possible between morphologies <l1> and <l2>"
    sGender1, sNumber1 = getGenderNumber(l1)
    sGender2, sNumber2 = getGenderNumber(l2)
    if sNumber1 != ":i" and sNumber2 != ":i" and sNumber1 != sNumber2:
        return False







|
>
>
>







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
NPe = re.compile(":(?:M[12P]|T):e")


#### FONCTIONS

def getLemmaOfMorph (s):
    "return lemma in morphology <s>"
    m = Lemma.search(s)
    if m:
        return m.group(1)
    return ""

def agreement (l1, l2):
    "returns True if agreement in gender and number is possible between morphologies <l1> and <l2>"
    sGender1, sNumber1 = getGenderNumber(l1)
    sGender2, sNumber2 = getGenderNumber(l2)
    if sNumber1 != ":i" and sNumber2 != ":i" and sNumber1 != sNumber2:
        return False

Modified gc_lang/fr/modules/gce_analyseur.py from [af51223cf8] to [edfe6ed977].

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    "lance la fonction g_morph() sur la première partie d’un verbe composé (ex: vient-il)"
    nEnd = dToken["sValue"].rfind("-")
    if dToken["sValue"].count("-") > 1:
        if "-t-" in dToken["sValue"]:
            nEnd = nEnd - 2
        elif re.search("-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$", dToken["sValue"]):
            nEnd = dToken["sValue"][0:nEnd].rfind("-")
    return g_morph(dToken, sPattern, sNegPattern, 0, nEnd, False)


def apposition (sWord1, sWord2):
    "returns True if nom + nom (no agreement required)"
    return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)))









|







7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    "lance la fonction g_morph() sur la première partie d’un verbe composé (ex: vient-il)"
    nEnd = dToken["sValue"].rfind("-")
    if dToken["sValue"].count("-") > 1:
        if "-t-" in dToken["sValue"]:
            nEnd = nEnd - 2
        elif re.search("-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$", dToken["sValue"]):
            nEnd = dToken["sValue"][0:nEnd].rfind("-")
    return g_morph(dToken, sPattern, sNegPattern, 0, nEnd)


def apposition (sWord1, sWord2):
    "returns True if nom + nom (no agreement required)"
    return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1)))


Modified gc_lang/fr/rules.grx from [16699b2371] to [6c130c21b9].

428
429
430
431
432
433
434

435
436
437
438
439
440
441
....
1558
1559
1560
1561
1562
1563
1564























































1565
1566
1567
1568
1569
1570
1571
....
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
....
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
....
1768
1769
1770
1771
1772
1773
1774

1775
1776
1777
1778
1779
1780
1781


1782

1783
1784
1785
1786

1787
1788
1789
1790
1791
1792
1793
....
2948
2949
2950
2951
2952
2953
2954

2955
2956
2957
2958
2959
2960
2961
....
3671
3672
3673
3674
3675
3676
3677













































































3678
3679
3680
3681
3682
3683
3684
....
3866
3867
3868
3869
3870
3871
3872











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































3873
3874
3875
3876
3877
3878
3879
....
4899
4900
4901
4902
4903
4904
4905

4906
4907
4908
4909
4910
4911
4912
.....
15673
15674
15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
15709
15710
15711
15712
15713
15714
15715
15716
15717
15718
15719
15720
15721
15722
15723
15724
15725
15726
15727
15728
15729
15730
15731
15732
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807
15808
15809
15810
15811
15812
15813
15814
15815
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884
15885
15886
15887
15888
15889
15890
15891
15892
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913
15914
15915
15916
15917
15918
15919
15920
15921
15922
15923
15924
15925
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935
15936
15937
15938
15939
15940
15941
15942
15943
15944
15945
15946
15947
15948
15949
15950
15951
15952
15953
15954
15955
15956
15957
15958
15959
15960
15961
15962
15963
15964
15965
15966
15967
15968
15969
15970
15971
15972
15973
15974
15975
15976
15977
15978
15979
15980
15981
15982
15983
15984
15985
15986
15987
15988
15989
15990
15991
15992
15993
15994
15995
15996
15997
15998
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008
16009
16010
16011
16012
16013
16014
16015
16016
16017
16018
16019
16020
16021
16022
16023
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044
16045
16046
16047
16048
16049
16050
16051
16052
16053
16054
16055
16056
16057
16058
16059
16060
16061
16062
16063
16064
16065
16066
16067
16068
16069
16070
16071
16072
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
16104
16105
16106
16107
16108
16109
16110
16111
16112
16113
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133
16134
16135
16136
16137
16138
16139
16140
16141
16142
16143
16144
16145
16146
16147
16148
16149
16150
16151
16152
16153
16154
16155
16156
16157
16158
16159
16160
16161
16162
16163
16164
16165
16166
16167
16168
16169
16170
16171
16172
16173
16174
16175
16176
16177
16178
16179
16180
16181
16182
16183
16184
16185
16186
16187
16188
16189
16190
16191
16192
16193
16194
16195
16196
16197
16198
16199
16200
16201
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243
16244
16245
16246
16247
16248
16249
16250
16251
16252
16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
16427
16428
16429
16430
16431
16432
16433
16434
16435
16436
16437
16438
16439
16440
16441
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451
16452
16453
16454
16455
16456
16457
16458
16459
16460
16461
16462
16463
16464
16465
16466
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
16486
16487
16488
16489
16490

16491
16492
16493
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
16509
16510
16511
16512
16513
16514
16515
16516
16517
16518
16519
16520
16521
16522
16523
16524
16525
16526
16527
16528
16529
16530
16531
16532
16533
16534
16535
16536
16537
16538
16539
16540
16541

16542
16543

16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555
16556
16557
16558
16559
16560
16561
16562
16563
16564
16565
16566
16567
16568
16569
16570
16571
16572
16573
16574
16575
16576
16577
16578
16579
16580
16581
16582
16583
16584
16585
16586
16587
16588
16589
16590
16591
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
16609
16610
16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
16628
16629
16630
16631
16632
16633
16634
16635
16636
16637
16638
16639
16640
16641
16642
16643
16644
16645
16646
16647
16648
16649
16650
16651
16652
16653
16654
16655
16656
16657
16658
16659
16660

16661
16662


16663

16664
16665
16666
16667
16668

16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
16682
16683
16684
16685
16686
16687
16688
16689
16690
16691
16692
16693
16694
16695
16696
16697
16698
16699
16700
16701
16702
16703
16704
16705
16706
16707
16708
16709
16710
16711
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
16742
16743
16744
16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755
16756
16757
16758
16759
16760
16761
16762
16763
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
.....
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
16861
16862
16863
16864
16865
16866
16867
16868
16869
16870
16871
16872
16873
16874
16875
16876
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
16904
16905
16906
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917
16918
16919
16920
16921
16922
16923
16924
16925
16926
16927
16928
16929
16930
16931
16932
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
16959
16960
16961
16962
16963
16964
16965
16966
16967
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978
16979
16980
16981
16982
16983
16984
16985
16986
16987
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042
17043
17044
17045
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
17098
17099
17100
17101
17102
17103
17104
17105
17106
17107
17108
17109
17110
17111
17112
17113
17114
17115
17116
17117
17118
17119
17120
17121
17122
17123
17124
17125
17126
17127
17128
17129
17130
17131
17132
17133
17134
17135
17136
17137
17138
17139
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156
17157
17158
17159
17160
17161
17162
17163
17164
17165
17166
17167
17168
17169
17170
17171
17172
17173
17174
17175
17176
17177
17178
17179
17180
17181
17182
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194
17195
17196
17197
17198
17199
17200
17201
17202
17203
17204
17205
17206
17207
17208
17209
17210
17211
17212
17213
17214
17215
17216
17217
17218
17219
17220
17221
17222
17223
17224
17225
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236
17237
17238
17239
17240
17241
17242
17243
17244
17245
17246
17247
17248
17249
17250
17251
17252
17253
17254
17255
17256
17257
17258
17259
17260
17261
17262
17263
17264
17265
17266
17267
17268
17269
17270
17271
17272
17273
17274
17275
17276
17277
17278
17279
17280
17281
17282
17283
17284
17285
17286
17287
17288
17289
17290
17291
17292
17293
17294
17295
17296
17297
17298
17299
17300
17301
17302
17303
17304
17305
17306
17307
17308
17309
17310
17311
17312
17313
17314
17315
17316
17317
17318
17319
17320
17321
17322
17323
17324
17325
17326
17327
17328
17329
17330
17331
17332
17333
17334
17335
17336
17337
17338
17339
17340
17341
17342
17343
17344
17345
17346
17347
17348
17349
17350
17351
17352
17353
17354
17355
17356
17357
17358
17359
17360
17361
17362
17363
17364
17365
17366
17367
17368
17369
17370
17371
17372
17373
17374
17375
17376
17377
17378
17379
17380
17381
17382
17383
17384
17385
17386
17387
17388
17389
17390
17391
17392
17393
17394
17395
17396
17397
17398
17399
17400
17401
17402
17403
17404
17405
17406
17407
17408
17409
17410
17411
17412
17413
17414
17415
17416
17417
17418
17419
17420
17421
17422
17423
17424
17425
17426
17427
17428
17429
17430
17431
17432
17433
17434
17435
17436
17437
17438
17439
17440
17441
17442
17443
17444
17445
17446
17447
17448
17449
17450
17451
17452
17453
17454
17455
17456
17457
17458
17459
17460
17461
17462
17463
17464
17465
17466
17467
17468
17469
17470
17471
17472
17473
17474
17475
17476
17477
17478
17479
17480
17481
17482
17483
17484
17485
17486
17487
17488
17489
17490
17491
17492
17493
17494
17495
17496
17497
17498
17499
17500
17501
17502
17503
17504
17505
17506
17507
17508
17509
17510
17511
17512
17513
17514
17515
17516
17517
17518
17519
17520
17521
17522
17523
17524
17525
17526
17527
17528
17529
17530
17531
17532
17533
17534
17535
17536
17537
17538
17539
17540
17541
17542
17543
17544
17545
17546
17547
17548
17549
17550
17551
17552
17553
17554
17555
17556
17557
17558
17559
17560
17561
17562
17563
17564
17565
17566
17567
17568
17569
17570
17571
17572
17573
17574
17575
17576
17577
17578
17579
17580
17581
17582
17583
17584
17585
17586
17587
17588
17589
17590
17591
17592
17593
17594
17595
17596
17597
17598
17599
17600
17601
17602
17603
17604
17605
17606
17607
17608
17609
17610
17611
17612
17613
17614
17615
17616
17617
17618
17619
17620
17621
17622
17623
17624
17625
17626
17627
17628
17629
17630
17631
17632
17633
17634
17635
17636
17637
17638
17639
17640
17641
17642
17643
17644
17645
17646
17647
17648
17649
17650
17651
17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
17666
17667
17668
17669
17670
17671
17672
17673
17674
17675
17676
17677
17678
17679
17680
17681
17682
17683
17684
17685
17686
17687
17688
17689
17690
17691
17692
17693
17694
17695
17696
17697
17698
17699
17700
17701
17702
17703
17704
17705
17706
17707
17708
17709
17710
17711
17712
17713
17714
17715
17716
17717
17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760
17761
17762
17763
17764
17765
17766
17767
17768
17769
17770
17771
17772
17773
17774
17775
17776
17777
17778
17779
17780
17781
17782
17783
17784
17785
17786
17787
17788
17789
17790

17791
17792
17793
17794
17795
17796
17797
17798
17799
17800
17801
17802
17803
17804
17805
17806
17807
17808
17809
17810
17811
17812
17813
17814
17815
17816
17817
17818
17819
17820
17821
17822
17823
17824
17825
17826
17827
17828
17829
17830
17831
17832
17833
17834
17835
17836
17837
17838
17839
17840
17841
17842
17843
17844
17845
17846
17847
17848
17849
17850
17851
17852
17853
17854
17855
17856
17857
17858
17859
17860
17861
17862
17863
17864
17865
17866
17867
17868
17869
17870
17871
17872
17873
17874
17875
17876
17877
17878
17879
17880
17881
17882
17883
17884
17885
17886
17887
17888
17889
17890
17891
17892
17893
17894
17895
17896
17897
17898
17899
17900
17901
17902
17903
17904
17905
17906
17907
17908
17909
17910
17911
17912
17913
17914
17915
17916
17917
17918

17919
17920
17921
17922
17923
17924
17925
17926
17927
17928
17929
17930
17931
17932
17933
17934
17935
17936
17937
17938
17939
17940
17941
17942
17943
17944
17945
17946
17947
17948
17949
17950
17951
17952
17953
17954
17955
17956
17957
17958
17959
17960
17961

17962
17963
17964
17965
17966
17967
17968
.....
18085
18086
18087
18088
18089
18090
18091
18092
18093
18094
18095
18096
18097
18098
18099
18100
18101
18102
18103
18104
18105
18106
18107
18108
18109
18110
18111
18112
18113
18114
18115
18116
18117
18118
18119
18120
18121
18122
18123
18124
18125
18126
18127
18128
18129
18130
18131
18132
18133
18134
18135
18136
18137
18138
18139
18140
18141
18142
18143
18144
18145
18146
18147
18148
18149
18150
18151
18152
18153
18154
18155
18156
18157
18158
18159
18160
18161
18162
18163
18164
18165
18166
18167
18168
18169
18170
18171
18172
18173
18174
18175
18176
.....
20052
20053
20054
20055
20056
20057
20058
20059
20060
20061
20062
20063
20064
20065
20066
.....
21066
21067
21068
21069
21070
21071
21072

21073
21074
21075
21076
21077
21078
21079
.....
23205
23206
23207
23208
23209
23210
23211
23212


23213
23214
23215
23216
23217
23218
23219
.....
25838
25839
25840
25841
25842
25843
25844
25845
25846
25847
25848
25849
25850
25851
25852
.....
26761
26762
26763
26764
26765
26766
26767

26768
26769
26770
26771
26772
26773
26774
26775
26776
26777
26778
26779
26780
.....
28367
28368
28369
28370
28371
28372
28373
28374
28375
28376
28377
28378
28379
28380
28381
28382
28383
28384
.....
29698
29699
29700
29701
29702
29703
29704
29705

29706
29707


29708
29709
29710
29711
29712
29713
29714
29715
29716
29717




29718
29719
29720
29721
29722
29723
29724
.....
32771
32772
32773
32774
32775
32776
32777
32778
32779
32780
32781
32782
32783
32784
32785
.....
32786
32787
32788
32789
32790
32791
32792
32793
32794
32795
32796
32797
32798
32799
32800
32801
32802
32803
32804
.....
32810
32811
32812
32813
32814
32815
32816
32817
32818
32819
32820
32821
32822
32823
32824
32825
32826
32827
32828
32829
32830
32831
.....
32854
32855
32856
32857
32858
32859
32860
32861
32862
32863
32864
32865
32866
32867
32868
32869
32870
32871
32872
32873
32874
32875
32876
32877
32878
32879

32880
32881
32882
32883
32884
32885
32886
.....
33792
33793
33794
33795
33796
33797
33798



33799
33800
33801
33802
33803
33804
33805
.....
35730
35731
35732
35733
35734
35735
35736

35737
35738
35739
35740
35741
35742
35743
    [)]\b(?![s¹²³⁴⁵⁶⁷⁸⁹⁰]\b)
        <<- not before("\\((?:[rR][eéEÉ]|[qQ][uU]’|[nNmMtTsSdDlL]’)$") ->> ") "                               && Il manque un espace après la parenthèse.
__<s>/typo(typo_parenthèse_ouvrante_collée)__
    \b[(](?=[^)][^)][^)])
        <<- ->> " ("                                                                                && Il manque un espace avant la parenthèse.

TEST: C’est au fond du couloir{{(}}celui du deuxième étage{{)}}qu’il se trouve.     ->> " (|||) "

TEST: (a + b)²
TEST: il faut (re)former tout ça.
TEST: il (n’)est (qu’)ingénieur


# Points et espaces
__<s>/typo(typo_point_entre_deux_espaces)__      [  ][.](?=[  ])  <<- ->> .                         && Pas d’espace avant un point.
................................................................................

TEST: « Je suis donc perdu ? », dit Paul.
TEST: “C’est bon !”, croit savoir Marie.
TEST: “Parce que… ?” finit par demander Paul.
TEST: « Dans quel pays sommes-nous ? » demanda un manifestant.



























































!!
!!
!!
!!
!!
................................................................................
__[s]/num(num_lettre_O_zéro1)__  [\dO]+[O][\dO]+ <<- not option("ocr") ->> =\0.replace("O", "0")    && S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             && S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                        ->> 2011
TEST: {{3O}} (chiffre avec un O).                                           ->> 30



!!!! Purge des références aux notes                                                               !!

# les références aux notes
__<s>(p_exposants)__
    [¹²³⁴⁵⁶⁷⁸⁹⁰]+
        <<- ~>> *

__[i](p_références_aux_notes)__
    ({w_2})(\d+)  @@0,$
        <<- not morph(\0, ":") and morph(\1, ":") ~2>> *

TEST: POLITIQUESOCIÉTÉÉCONOMIEMONDECULTUREART DE VIVREMAGAZINE (qui peut faire boguer JavaScript avec certaines regex)


!!!! Traits d’union                                                                               !!

__[i]/tu(tu_trait_union_douteux)__
    ({w1})(?:--|—|–|−|⁃)({w1})  @@0,$
    <<- spell(\1+"-"+\2) and analyse(\1+"-"+\2, ":") ->> \1-\2                                      && Trait d’union : un tiret simple suffit.

TEST: Nous préparons une {{contre–attaque}}.                    ->> contre-attaque
TEST: Nous préparons une {{contre−attaque}}.                    ->> contre-attaque


__<i]/tu(tu_t_euphonique_incorrect)__
    ([-–—− ]t(?:[’' ][-–—−]?|[-–—−][’' ]?))(ie?ls?|elles?|on|tu)  @@0,$
        <<- re.search("(?i)^(?:ie?ls|elles|tu)$", \2) -1>> -    && Le “t” euphonique n’est pas nécessaire avec “\2”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
        <<- __else__ and \1 != "-t-" and \1 != "-T-" -1>> -t-   && Pour le “t” euphonique, il faut deux traits d’union. Pas d’apostrophe. Pas d’espace.
        <<- \1 != "-t-" ~1>> -t-
__<i]/tu(tu_t_euphonique_superflu)__
    [td]([- ]t[-’' ])(?:ie?l|elle|on)  @@1
        <<- -1>> -                                              && Le “t” euphonique est superflu quand le verbe se termine par “t” ou “d”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
        <<- \1 != "-t-" ~1>> -t-
__<i]/eleu(eleu_t_euphonique_manquant)__
    [aec](-(ie?l|elle|on))  @@1,2  <<- -1>> -t-\2               && Euphonie. Il faut un “t” euphonique.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513

TEST: va{{ t’}}il y parvenir ?                          ->> -t-
TEST: A{{ t’}}elle soif ?                               ->> -t-
TEST: A{{ t-}}elle faim ?                               ->> -t-
TEST: a{{ t'}}elle                                      ->> -t-
TEST: a{{-t'}}il                                        ->> -t-
TEST: a{{-t }}il.                                       ->> -t-
TEST: a{{ t’}}il.                                       ->> -t-
TEST: a{{ t-}}on.                                       ->> -t-
TEST: donne{{ t-}}il                                    ->> -t-
TEST: donne{{-t }}il                                    ->> -t-
TEST: vient{{-t-}}il                                    ->> -
TEST: viendras{{-t-}}tu                                 ->> -
TEST: Viendront{{ t-}}ils                               ->> -
TEST: viennent{{ t-}}ils                                ->> -
TEST: mangent{{-t-}}elles                               ->> -
TEST: Ont{{ t’}}ils                                     ->> -
TEST: Ont{{-t’}}ils                                     ->> -
TEST: l’ont{{ t’}}ils vu ?                              ->> -
TEST: exploite{{−t−}}il les ressources numériques       ->> -t-
TEST: vainc{{-il}} ses ennemis aisément                 ->> -t-il
TEST: Assis, gronde{{-t -}}elle                         ->> -t-
TEST: vient-il demain ?
TEST: prend-elle l’avantage ?
TEST: saura-t-on jamais la vérité ?
TEST: arrive-t-elle ce matin ?
TEST: y aura-t-il du poulet au dîner ?



@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: graphe0|g0                                                                              _
................................................................................


__purge_punc_début_phrase__
    <start>  [?|!|:|;|…|‘|’|'|¿|¡]
        <<- ~2>> *

    <start>  [-|–|—]  ?[-|–|—]¿
        <<- />> _tiret1_
        <<- ~2>> *

    <start>  [•|·|.]
        <<- />> _puce1_
        <<- ~2>> *


__purge_fin_phrase__
    [.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]  ?[.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]¿  ?[.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]¿  <end>
        <<- ~1:-2>> *

................................................................................
__purge_mot_nombre_parenthèses_crochets_accolades__
    (  [*WORD|*NUM]  )
    {  [*WORD|*NUM]  }
        <<- ~>> *

    ( … )
        <<- ->> […]                 && Pour indiquer une troncature de texte, on utilise usuellement des crochets.

        <<- ~>> *

    (  [re|ré]  )  *WORD
    [  [re|ré]  ]  *WORD
        <<- space(<1, 1) and space(\3, 0, 0) ~1:3>>  *

    [  *NUM  ]


    [  …  ]

        <<- ~>> *

    [  *WORD  ]
        <<- space(<1, 1, 3) and space(\-1, 1, 3) >>>

        <<- morph(\2, ":G") ~>> |\2|
        <<- __else__ ~>> *

    ## chapitres, références
    (  [*WORD|*NUM]  ,  *NUM  )
    [  [*WORD|*NUM]  ,  *NUM  ]
    {  [*WORD|*NUM]  ,  *NUM  }
................................................................................
    contre [moi|toi|soi|lui|elle|iel|nous|vous|eux|elles|iels]
        <<- =>> select(\1, ":R")

    [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+s|>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_courant__
    courant
................................................................................
__tag_ni__
    ni
        <<- />> _ni_



!!!! Fusions et immunités                                                                         !!














































































__fusions_mots_grammaticaux__
    c’ est-à-dire
        <<- ~>> ␣
        <<- =>> setmeta(\1, "WORD")

    le ou la  *WORD
................................................................................
        <<- morph(\1, ":V") !-2>>

    soit pour soit contre
        <<- !3>>

    y [a|avait|eut|aura|aurait|eût] ?@:[WX]¿ faute
        <<- !-1>>













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































!!
!!
!!!! Noms propres                                                                                 !!
!!
!!
................................................................................
#    <<- \1 == \2
#        and not value(\2, "|nous|vous|faire|en|la|lui|donnant|œuvre|ah|oh|eh|hé|ho|ha|hou|olé|joli|Bora|couvent|dément|sapiens|très|vroum|")
#        and not (value(\1, "|est|une|") and value(<1, "|l’|d’|"))
#        and not (\2 == "mieux" and value(<1, "|qui|"))
#    ->> \1                                                                                          && Doublon.
#
#TEST: Il y a un {{doublon doublon}}.                                                                ->> doublon



!!
!!
!!!! Élisions & euphonie                                                                          !!
!!
!!
................................................................................

!!!
!!!
!!! Processeur: épuration des adverbes, locutions adverbiales, interjections et expressions usuelles  !!
!!!
!!!

__purge_siècles_millénaires__
    à [compter|partir] du       [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    à [compter|partir] du       ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    ?jusqu’¿ à l’ orée du       [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    ?jusqu’¿ à l’ orée du       ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    ?jusqu’¿ au                 [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    ?jusqu’¿ au                 ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    [avant|après] le            [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    [avant|après] le            ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    au cours du                 [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    au cours du                 ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    dans le                     [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    dans le                     ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    dans le courant du          [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    dans le courant du          ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    [dès|depuis] le             [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    [dès|depuis] le             ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    du                          [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    du                          ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    par rapport à l’            [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    par rapport à l’            ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
        <<- ~>> *

    ?d’¿ av ?.¿ J.-C.
    ?d’¿ avant J.-C.
    ?d’¿ avant Jésus-Christ
    ?d’¿ avant notre ère ?[industrielle|technologique]¿
        <<- ~>> *

    au cours de notre ère ?[industrielle|technologique]¿
        <<- ~>> *


__purge_années__
    à [compter|partir] [de|d’] l’   an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] l’   année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] des          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à l’ orée de l’        an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’ orée de l’        année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’ orée des          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à l’                   an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’                   année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ aux                    années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] l’                an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] l’                année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] les               années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    au cours [de|d’] l’             an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours [de|d’] l’             année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    au cours des                    années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    dans l’                         an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans l’                         année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    dans les                        années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    dans le courant de l’           an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans le courant de l’           année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    dans le courant des             années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dès|depuis|de|d’] l’           an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’] l’           année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dès|depuis] [les|ces]          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport à l’                an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à l’                année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport aux                 années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- ~>> *

    à [compter|partir] du           [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] du           [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] du           [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ au                     [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au                     [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au                     [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] le                [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le                [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] le                [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dans|dès|depuis] le            [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dans|dès|depuis] le            [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dans|dès|depuis] le            [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport au                  [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au                  [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport au                  [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- ~>> *

    à [compter|partir] [de|d’] la   fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] la   fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] la   fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à la                   fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la                   fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la                   fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] la                fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la                fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] la                fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dans|dès|depuis|de|d’] la      fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dans|dès|depuis|de|d’] la      fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dans|dès|depuis|de|d’] la      fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport à la                fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la                fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport à la                fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- ~>> *

    en  l’  an  ~^[0-9]{2,5}$
    en  l’  an  de  grâce  ~^[0-9]{2,5}$
        <<- ~>> *

    en  ~^[0-9]{2,5}$  [,|<end>|)]
    en  ~^[0-9]{2,5}$  @:¬:[AN].*:[pi]
    de  ~^[0-9]{2,5}$  @:A.*:s
        <<- ~1:2>> *

    [de|d’] [plusieurs|quelques|$:B|*NUM] [ans|années|mois] [mon|ton|son|notre|votre|leur] [cadet|aîné+e]
    [de|d’] [plusieurs|quelques|$:B|*NUM] [ans|années|mois] [ma|ta|sa|notre|votre|leur] cadette
        <<- ~>> *


__purge_saisons__
    à [compter|partir] [de|d’]  l’ [automne|été|hiver]
    [à|dès|depuis|de|d’]        l’ [automne|été|hiver]
    à l’ orée [de|d’]           l’ [automne|été|hiver]
    au cours [de|d’]            l’ [automne|été|hiver]
    [avant|après]               l’ [automne|été|hiver]
    dans le courant [de|d’]     l’ [automne|été|hiver]
    jusqu’ à                    l’ [automne|été|hiver]
    par rapport à               l’ [automne|été|hiver]
    à [compter|partir] du       printemps
    [au|du]                     printemps
    à l’ orée du                printemps
    au cours du                 printemps
    [avant|après] le            printemps
    dans le courant du          printemps
    jusqu’ au                   printemps
    par rapport au              printemps
        <<- not morph(>1, ":A.*:[me]:[si]") ~>> *

    à [compter|partir] [de|d’]  l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    dans le courant [de|d’]     l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] du       printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    dans le courant du          printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- ~>> *

    à [compter|partir] du       [début|milieu] [de|d’] l’ [automne|été|hiver]
    [au|du]                     [début|milieu] [de|d’] l’ [automne|été|hiver]
    à l’ orée du                [début|milieu] [de|d’] l’ [automne|été|hiver]
    au cours du                 [début|milieu] [de|d’] l’ [automne|été|hiver]
    [avant|après] le            [début|milieu] [de|d’] l’ [automne|été|hiver]
    jusqu’ au                   [début|milieu] [de|d’] l’ [automne|été|hiver]
    par rapport au              [début|milieu] [de|d’] l’ [automne|été|hiver]
    à [compter|partir] du       [début|milieu] du printemps
    [au|du]                     [début|milieu] du printemps
    à l’ orée du                [début|milieu] du printemps
    au cours du                 [début|milieu] du printemps
    [avant|après] le            [début|milieu] du printemps
    jusqu’ au                   [début|milieu] du printemps
    par rapport au              [début|milieu] du printemps
        <<- not morph(>1, ":A.*:[me]:[si]") ~>> *

    à [compter|partir] du       [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] du       [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- ~>> *

    à [compter|partir] [de|d’]  la fin [de|d’] l’ [automne|été|hiver]
    [à|dès|depuis|de|d’]        la fin [de|d’] l’ [automne|été|hiver]
    à l’ orée [de|d’]           la fin [de|d’] l’ [automne|été|hiver]
    au cours [de|d’]            la fin [de|d’] l’ [automne|été|hiver]
    [avant|après]               la fin [de|d’] l’ [automne|été|hiver]
    jusqu’ à                    la fin [de|d’] l’ [automne|été|hiver]
    par rapport à               la fin [de|d’] l’ [automne|été|hiver]
    à [compter|partir] [de|d’]  la fin du printemps
    [à|dès|depuis|de|d’]        la fin du printemps
    à l’ orée [de|d’]           la fin du printemps
    au cours [de|d’]            la fin du printemps
    [avant|après]               la fin du printemps
    jusqu’ à                    la fin du printemps
    par rapport à               la fin du printemps
        <<- not morph(>1, ":A.*:[me]:[si]") ~>> *

    à [compter|partir] [de|d’]  la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] [de|d’]  la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- ~>> *

    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] du printemps ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] printemps ?~^[0-9]{2,5}$¿
    par un [bel|chaud|frais|froid] après-midi [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi du printemps ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par un [bel|chaud|frais|froid] après-midi [de|d’] printemps ?~^[0-9]{2,5}$¿
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] du printemps ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] printemps ?~^[0-9]{2,5}$¿
        <<- ~>> *

    au cours [de|d’] l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ et ?[de|d’]¿ l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    au cours [de|d’] l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ et du printemps ?~^[0-9]{2,5}$¿
    au cours du printemps ?~^[0-9]{2,5}$¿ et ?[de|d’]¿ l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    entre ?[le|l’]¿ [printemps|été|automne|hiver] ?~^[0-9]{2,5}$¿ et ?[le|l’]¿ [printemps|été|automne|hiver] ?~^[0-9]{2,5}$¿
    du printemps ?~^[0-9]{2,5}$¿ au printemps ?~^[0-9]{2,5}$¿
    du printemps ?~^[0-9]{2,5}$¿ à l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    de l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ au printemps ?~^[0-9]{2,5}$¿
    de l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ à l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
        <<- ~>> *


__purge_semestre_trimestre__
    à [compter|partir] du   ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [au|du]                 ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée du            ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du             ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    depuis le               ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ au               ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    à [compter|partir] du   [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [au|du]                 [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée du            [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du             [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    depuis le               [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ au               [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    à [compter|partir] de   la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [à|dès|depuis|de|d’]    la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée [de|d’]       la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours [de|d’]        la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ à                la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à           la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *


__purge_dates_mois__
    à [compter|partir] du   [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le         [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [le|du]                 [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le        [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au             [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    [les|des]               [1er|1ᵉʳ|~^\d\d?$] et ~^\d\d?$ {_mois_}    ?[derniers|passés|précédents|prochains|~^[0-9]{2,5}$]¿
        <<- ~>> *

    dans la nuit du         [1er|1ᵉʳ|~^\d\d?$]  {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans la nuit du         [1er|1ᵉʳ|~^\d\d?$]  ?{_mois_}¿ au  [1er|1ᵉʳ|~^\d\d?$]  {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    au cours         [de|d’]    {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du mois [de|d’]    {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    à l’ orée du mois [de|d’]   {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’]  {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ [en|à]             {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]               {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’]          {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au              {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    ?[à|avant|après|de|d’|depuis]¿ [début|milieu|fin] {_mois_} ?~^[0-9]{2,5}$¿
        <<- not morph(<1, ":D") ~>> *

    à [compter|partir]          [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ [en|à]             [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’]          [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à               [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    ?jusqu’¿ au         [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au         [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au         [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    ?jusqu’¿ à la           fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la           fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la           fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- ~>> *

    en ce début     {_mois_} ?~^[0-9]{2,5}$¿
    [à|en] la fin   {_mois_} ?~^[0-9]{2,5}$¿
        <<- ~>> *

    [début|fin] {_mois_} ~^[0-9]{2,5}$
        <<- not morph(<1, ":D") ~>> *

    entre {_mois_} ?~^[0-9]{2,5}$¿ et {_mois_} ?~^[0-9]{2,5}$¿
        <<- ~>> *

    ?jusqu’¿ à                      la {_mi_mois_} ?~^[0-9]{2,5}$¿
    [après|avant|dès|depuis|de|d’]  la {_mi_mois_} ?~^[0-9]{2,5}$¿
    par rapport à                   la {_mi_mois_} ?~^[0-9]{2,5}$¿
        <<- ~>> *


__purge_horaires_et_durée__
    24      [heures|h]      [sur|/]  24
    7       [jours|j]       [sur|/]  7
    sept    [jours|j]       [sur|/]  sept
    vingt-quatre  heures    [sur|/]  vingt-quatre
        <<- ~>> *

    ?jusqu’¿ à                   *NUM  h
    à [partir|compter] de        *NUM  h
    [avant|après|de|dès|depuis]  *NUM  h
    ?jusqu’¿ à                   [1|01]  heure
    à [partir|compter] de        [1|01]  heure
    [avant|après|de|dès|depuis]  [1|01]  heure
    ?jusqu’¿ à                   *HOUR
    à [partir|compter] de        *HOUR
    [avant|après|de|dès|depuis]  *HOUR
    ?jusqu’¿ à                   une        heure
    à [partir|compter] de        une        heure
    [avant|après|de|dès|depuis]  une        heure
    ?jusqu’¿ à                   @:B:.:p    heures
    à [partir|compter] de        @:B:.:p    heures
    [avant|après|de|dès|depuis]  @:B:.:p    heures
        <<- ~>> *

    ?jusqu’¿ à                   *NUM  heures
    à [partir|compter] de        *NUM  heures
    [avant|après|de|dès|depuis]  *NUM  heures
        <<- \-2.isdigit() and \-2 != "1" and \-2 != "01" ~>> *

    ?jusqu’¿ à                   [midi|minuit]
    à [partir|compter] de        [midi|minuit]
    [avant|après|de|dès|depuis]  [midi|minuit]
        <<- ~>> *

    [avant|après|dès|depuis] la nuit tombée
    [avant|après|dès|depuis] la tombée de la nuit
    [avant|après|dès|depuis] le jour levé
    [avant|après|dès|depuis] le lever [de|du] soleil
    [avant|après|dès|depuis] le lever du jour
    [avant|après|dès|depuis] l’ aube
    [avant|après|dès|depuis] le crépuscule
        <<- ~>> *

    dans la [matinée|nuit|soirée] de [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] à [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]
        <<- ~>> *

    dès le premier [jour|soir]
    dès la première [matinée|nuit]
        <<- ~>> *

    à la fin de [la|l’]             [après-midi|matinée|nuit|soirée]
    au [début|milieu] de [la|l’]    [après-midi|matinée|nuit|soirée]
    en [début|milieu|fin] [de|d’]   [après-midi|matinée|soirée]
        <<- ~>> *

    ## purge de queue
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   [du|ce]  [matin|soir]
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   de  l’ après-midi
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   cet  après-midi
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   [demain|hier|après-demain|avant-hier]  ?[matin|soir|après-midi]¿
    *HOUR  ?[tapantes|pétantes|pile]¿
    *HOUR  ?[tapantes|pétantes|pile]¿  [du|ce]  [matin|soir]
    *HOUR  ?[tapantes|pétantes|pile]¿  de  l’ après-midi
    *HOUR  ?[tapantes|pétantes|pile]¿  cet  après-midi
    *HOUR  ?[tapantes|pétantes|pile]¿  [demain|hier|après-demain|avant-hier]  ?[matin|soir|après-midi]¿
    >heure moins le quart
    >heure et [demie|quart]
    >heure ?,¿ @:B:.:p minutes
    >heure ?,¿ @:B:.:p minutes ?,¿ @:B:.:p secondes
    [midi|minuit] pile
    [midi|minuit] moins le quart
    [midi|minuit] et [demie|quart]
        <<- ~2:0>> *

    à cette heure ?[tardive|indue|matinale]¿
    à cette heure de la [journée|nuit]
    à cette heure du jour
    à l’ heure actuelle
    à l’ heure qu’ il est
    à la nuit [tombée|tombante]
    à n’importe quelle heure du jour et de la nuit
    à toute heure
    à toute heure de la nuit
    à toute heure de la nuit et du jour
    à toute heure du jour
    à toute heure du jour et de la nuit
    à une heure ?[aussi|très|trop]¿ [décente|indue|tardive]
    au jour et à l’ heure dits
    au cours de la [dernière|précédente|prochaine] [seconde|minute|heure]
    au cours de l’ heure ?[dernière|passée|précédente|prochaine]¿
    au cours de la [seconde|minute] ?[dernière|passée|précédente|prochaine]¿
    au cours [de|d’] la nuit
    [de|d’] ?[assez|si|très|trop]¿ bonne heure
    [de|d’] tout à l’ heure
    dès la première heure
    l’ heure venue
    jusqu’ à pas d’ heure
    sur l’ heure
    tout à l’ heure
    ?[de|d’]¿ trois quarts d’ heure plus [tôt|tard]
    ?[de|d’]¿ trois quarts d’ heure auparavant
    ?d’¿ un quart d’ heure plus [tôt|tard]
    ?d’¿ un quart d’ heure auparavant
    ?d’¿ une fraction [de|d’] seconde auparavant
    ?d’¿ une fraction [de|d’] seconde plus [tard|tôt]
    vers [midi|minuit]
        <<- ~>> *

DEF: unit_mesure_sing_mas   [jour|mois|trimestre|semestre|an|siècle|millénaire]
DEF: unit_mesure_sing_fem   [nanoseconde|milliseconde|seconde|minute|heure|journée|semaine|année|décennie]
DEF: unit_mesure_plur       [nanosecondes|millisecondes|secondes|minutes|heures|jours|journées|semaines|mois|trimestres|semestres|ans|années|décennies|siècles|millénaires]
DEF: unit_mesure_plur_mas   [jours|mois|trimestres|semestres|ans|siècles|millénaires]
DEF: unit_mesure_plur_fem   [nanosecondes|millisecondes|secondes|minutes|heures|journées|semaines|années|décennies]


__locutions_temporelles_communes__
    d’ un [jour|mois|trinestre|semestre|an|siècle|millénaire] à l’ autre
    d’ une [nanoseconde|milliseconde|seconde|minute|seconde|heure|journée|semaine|année|décennie] à l’ autre
    [de|d’] dernière [seconde|minute|heure|année]
        <<- ~>> *

    [*NUM|$:B]  {unit_mesure_plur}      [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
    un          {unit_mesure_sing_mas}  [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
    une         {unit_mesure_sing_fem}  [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
        <<- ~1:3>> *

    ## locutions au singulier
    au bout d’ un                                   {unit_mesure_sing_mas}
    après un                                        {unit_mesure_sing_mas}
    depuis un                                       {unit_mesure_sing_mas}
    en un                                           {unit_mesure_sing_mas}
    pendant un                                      {unit_mesure_sing_mas}
        <<- not morph(>1, ":A.*:[me]:[pi]") ~>> *

    au bout d’ une                                  {unit_mesure_sing_fem}
    après une                                       {unit_mesure_sing_fem}
    depuis une                                      {unit_mesure_sing_fem}
    en une                                          {unit_mesure_sing_fem}
    pendant une                                     {unit_mesure_sing_fem}
        <<- not morph(>1, ":A.*:[fe]:[pi]") and not (value(\-1, "|année|") and re.search("^[0-9]+$", >1)) ~>> *

    à un                                            {unit_mesure_sing_mas} près
    à une                                           {unit_mesure_sing_fem} près
    après un                                        {unit_mesure_sing_mas} de bons et loyaux services
    après une                                       {unit_mesure_sing_fem} de bons et loyaux services
    après près [de|d’] un                           {unit_mesure_sing_mas}
    après près [de|d’] un                           {unit_mesure_sing_mas} de bons et loyaux services
    après près [de|d’] une                          {unit_mesure_sing_fem}
    après près [de|d’] une                          {unit_mesure_sing_fem} de bons et loyaux services
    au fil du                                       {unit_mesure_sing_mas} à venir
    au fil de la                                    {unit_mesure_sing_fem} à venir
    au fil de l’                                    [an|année|heure] à venir
    dans le                                         {unit_mesure_sing_mas} à venir
    dans la                                         {unit_mesure_sing_fem} à venir
    dans l’                                         [an|année|heure] à venir
    depuis près [de|d’] un                          {unit_mesure_sing_mas}
    depuis près [de|d’] une                         {unit_mesure_sing_fem}
    d’ ici un                                       {unit_mesure_sing_mas}
    d’ ici une                                      {unit_mesure_sing_fem}
    ?d’¿ il y a un                                  {unit_mesure_sing_mas}
    ?d’¿ il y a une                                 {unit_mesure_sing_fem}
    ?d’¿ il y a [moins|plus] [de|d’] un             {unit_mesure_sing_mas}
    ?d’¿ il y a [moins|plus] [de|d’] une            {unit_mesure_sing_fem}
    pendant près d’ un                              {unit_mesure_sing_mas}
    pendant près d’ une                             {unit_mesure_sing_fem}
    un                                              {unit_mesure_sing_mas} [après|avant|auparavant]
    une                                             {unit_mesure_sing_fem} [après|avant|auparavant]
    un                                              {unit_mesure_sing_mas} plus [tard|tôt]
    une                                             {unit_mesure_sing_fem} plus [tard|tôt]
    un peu [moins|plus] d’un                        {unit_mesure_sing_mas} auparavant
    un peu [moins|plus] d’une                       {unit_mesure_sing_fem} auparavant
        <<- ~>> *

    au cours de l’          an                        [dernier|passé|précédent|prochain|suivant]
    au cours de l’          [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    au cours du             {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    au cours de la          {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    au fil de l’            an                        [dernier|passé|précédent|prochain|suivant]
    au fil de l’            [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    au fil du               {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    au fil de la            {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    dans l’                 an                        [dernier|passé|précédent|prochain|suivant]
    dans l’                 [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    dans le                 {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    dans la                 {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    dans le courant de l’   an                        [dernier|passé|précédent|prochain|suivant]
    dans le courant de l’   [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    dans le courant du      {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    dans le courant de la   {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    depuis l’               an                        [dernier|passé|précédent|prochain|suivant]
    depuis l’               [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    depuis le               {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    depuis la               {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    de l’                   an                        [dernier|passé|précédent|prochain|suivant]
    de l’                   [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    du                      {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    de la                   {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    par rapport à l’        an                        [dernier|passé|précédent|prochain|suivant]
    par rapport à l’        [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    par rapport au          {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    par rapport à la        {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    pendant l’              an                        [dernier|passé|précédent|prochain|suivant]
    pendant l’              [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    pendant le              {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    pendant la              {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    au cours du             [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    au cours de la          [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    au fil du               [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    au fil de la            [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    dans le                 [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    dans la                 [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    dans le courant du      [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    dans le courant de la   [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    depuis le               [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    depuis la               [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    du                      [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    de la                   [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    par rapport au          [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    par rapport à la        [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    pendant le              [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    pendant la              [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    depuis un               ?[assez|si|très|trop]¿ long     {unit_mesure_sing_mas}
    depuis une              ?[assez|si|très|trop]¿ longue   {unit_mesure_sing_fem}
    pendant un  ?[long]¿    {unit_mesure_sing_mas}
    pendant une ?[longue]¿  {unit_mesure_sing_fem}
        <<- ~>> *

    ## locutions plurielles
    au bout de [nombreux|plusieurs|quelques]        {unit_mesure_plur_mas}
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur_mas}
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur_mas}
    depuis @:B:.:p                                  {unit_mesure_plur_mas}
    depuis *NUM                                     {unit_mesure_plur_mas}
    depuis près [de|d’] @:B:.:p                     {unit_mesure_plur_mas}
    depuis près [de|d’] *NUM                        {unit_mesure_plur_mas}
    depuis quelques                                 {unit_mesure_plur_mas}
    en *NUM                                         {unit_mesure_plur_mas}
    pendant [des|plusieurs|quelques|*NUM|@:B:.:p]   {unit_mesure_plur_mas}
    pendant près [de|d’] [*NUM|@:B:.:p]             {unit_mesure_plur_mas}
    un ou deux                                      {unit_mesure_plur_mas} plus [tôt|tard]
        <<- not morph(>1, ":A.*:[me]:[pi]") ~>> *

    au bout de [nombreuses|plusieurs|quelques]      {unit_mesure_plur_fem}
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur_fem}
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur_fem}
    depuis @:B:.:p                                  {unit_mesure_plur_fem}
    depuis *NUM                                     {unit_mesure_plur_fem}
    depuis près [de|d’] @:B:.:p                     {unit_mesure_plur_fem}
    depuis près [de|d’] *NUM                        {unit_mesure_plur_fem}
    depuis quelques                                 {unit_mesure_plur_fem}
    en *NUM                                         {unit_mesure_plur_fem}
    pendant [des|plusieurs|quelques|*NUM|@:B:.:p]   {unit_mesure_plur_fem}
    pendant près [de|d’] [*NUM|@:B:.:p]             {unit_mesure_plur_fem}
    une ou deux                                     {unit_mesure_plur_fem} plus [tôt|tard]
        <<- not morph(>1, ":A.*:[fe]:[pi]") ~>> *

    @:B:.:p                                         {unit_mesure_plur} auparavant
    @:B:.:p                                         {unit_mesure_plur} plus [tôt|tard]
    @:B:.:p ou @:B:.:p                              {unit_mesure_plur} plus [tôt|tard]
    à quelques                                      {unit_mesure_plur} près
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur} de bons et loyaux services
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur} de bons et loyaux services
    au fil des                                      {unit_mesure_plur} à venir
    dans les                                        {unit_mesure_plur} à venir
    des                                             {unit_mesure_plur} plus [tôt|tard]
    des                                             {unit_mesure_plur} à venir
    d’ ici quelques                                 {unit_mesure_plur}
    ?d’¿ il y a [*NUM|@:B:.:p]                      {unit_mesure_plur}
    ?d’¿ il y a [moins|plus] [de|d’] [*NUM|@:B:.:p] {unit_mesure_plur}
    ?d’¿ il y a quelques                            {unit_mesure_plur}
    quelques                                        {unit_mesure_plur} [après|avant|auparavant]
    quelques                                        {unit_mesure_plur} plus [tard|tôt]
    un peu [moins|plus] de [@:B:.:p|*NUM]           {unit_mesure_plur} auparavant
        <<- ~>> *

    au cours des            ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    au cours des            ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    au fil des              ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    au fil des              ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    dans les                ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    dans les                ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    dans le courant des     ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    dans le courant des     ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    depuis les              ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    depuis les              ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    des                     ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    des                     ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    par rapport aux         ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    par rapport aux         ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    pendant les             ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    pendant les             ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    au cours des            ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    au cours des            ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    au fil des              ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    au fil des              ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    dans les                ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    dans les                ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    dans le courant des     ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    dans le courant des     ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    depuis les              ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    depuis les              ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    des                     ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    des                     ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    par rapport aux         ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    par rapport aux         ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    pendant les             ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    pendant les             ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    depuis [de|d’]          ?[assez|si|très|trop]¿ longs {unit_mesure_plur_mas}
    depuis [de|d’]          ?[assez|si|très|trop]¿ longues {unit_mesure_plur_fem}
    pendant de [nombreux|longs]         {unit_mesure_plur_mas}
    pendant de [nombreuses|longues]     {unit_mesure_plur_fem}
        <<- ~>> *


__purge_temps_après_avant__
    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     [après|avant]
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      [après|avant]
        <<- not value(<1, "|de|d’|")
            and ( morph(>1, ">[,)]|<end>|:(?:Ov|3[sp])", ":D") or ( value(>1, "|le|la|l’|leur|les|") and morph(>2, ":V", ":[NAQ]") ) )
        ~>> *

    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     auparavant
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      auparavant
        <<- ~>> *

    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     plus [tôt|tard]
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      plus [tôt|tard]
        <<- ~>> *


__purge_énumération_temporelle__
    [de|d’] nanoseconde   en  nanoseconde
    [de|d’] milliseconde  en  milliseconde
    [de|d’] seconde       en  seconde
    [de|d’] minute        en  minute
    [de|d’] heure         en  heure
    [de|d’] matin         en  matin
    [de|d’] matinée       en  matinée
    [de|d’] après         en  après
    [de|d’] soir          en  soir
    [de|d’] soirée        en  soirée
    [de|d’] jour          en  jour
    [de|d’] journée       en  journée
    [de|d’] nuit          en  nuit
    [de|d’] semaine       en  semaine
    [de|d’] mois          en  mois
    [de|d’] trimestre     en  trimestre
    [de|d’] semestre      en  semestre
    [de|d’] mois          en  mois
    [de|d’] année         en  année
    [de|d’] décennie      en  décennie
    [de|d’] génération    en  génération
    [de|d’] siècle        en  siècle
    [de|d’] millénaire    en  millénaire
        <<- ~>> *

    nanoseconde     [après|par]     nanoseconde
    milliseconde    [après|par]     milliseconde
    seconde         [après|par]     seconde
    minute          [après|par]     minute
    heure           [après|par]     heure
    matin           [après|par]     matin
    matinée         [après|par]     matinée
    après-midi      [après|par]     après-midi
    soir            [après|par]     soir
    soirée          [après|par]     soirée
    jour            [après|par]     jour
    journée         [après|par]     journée
    nuit            [après|par]     nuit
    semaine         [après|par]     semaine
    mois            [après|par]     mois
    trimestre       [après|par]     trimestre
    semestre        [après|par]     semestre
    mois            [après|par]     mois
    année           [après|par]     année
    décennie        [après|par]     décennie
    génération      [après|par]     génération
    siècle          [après|par]     siècle
    millénaire      [après|par]     millénaire
        <<- ~>> *


__purge_locutions_temps__
    à longueur [de|d’] temps
    après un ?bon¿ bout de temps ?passé¿
    après un certain temps ?passé¿
    au bout d’ un certain temps  ?passé¿
    au fil du temps
    avec un ?[léger|petit]¿ temps d’ avance
    avec un temps d’ avance ?$:W¿ [considérable|énorme|gigantesque|important|phénoménal]
    avec un ?[léger|petit]¿ temps [de|d’] retard
    avec un temps [de|d’] retard ?$:W¿ [considérable|énorme|gigantesque|important|phénoménal]
    comme au bon vieux temps
    dans peu de temps
    dans très peu de temps
    dans un [premier|second|troisième|quatrième] temps
    depuis ce temps-là
    depuis peu
    depuis ?[assez|si|très|trop]¿ peu de temps
    depuis la nuit des temps
    depuis quelque temps
    depuis tout ce temps ?passé¿
    d’ ici peu de temps
    ?[de|d’]¿ ces derniers temps
    ?d’¿ il y a ?[assez|si|très|trop]¿ peu [de|d’] temps
    ?d’¿ il y a quelque temps
    [de|d’] tous temps
    [de|d’] tout temps
    [de|d’] temps à autre
    [de|d’] temps en temps
    en ?[assez|si|très|trop]¿ peu [de|d’] temps
    en ce temps-là
    en d’ autres temps
    en d’ autres temps et d’ autres lieux
    en des temps [moins|plus] [anciens|récents]
    en des temps meilleurs
    en même temps
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour [le|l’] [dire|prononcer|raconter]
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour [le|l’] faire comprendre
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour l’ expliquer
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour [le|l’] [dire|prononcer|raconter]
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour [le|l’] faire comprendre
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour l’ expliquer
    en temps [de|d’] [guerre|paix]  ?[économique|religieuse]¿
    en temps [normal|opportun|ordinaire|utile|voulu]
    en temps et en heure
    en un temps record
    en un rien [de|d’] temps
    jusqu’ à la fin des temps
    la plupart du temps
    le [moins|plus] [de|d’] temps possible
    le plus clair de [mon|ton|son|notre|votre|leur] temps ?libre¿
    le plus clair de [mon|ton|son|notre|votre|leur] temps [de|d’] travail
    par les temps qui courent
    par temps [de|d’] pluie
    pendant ce temps-là
    pendant quelque temps
    pendant un [court|certain|petit] laps de temps
    pendant qu’ il ?en¿ est ?encore¿ temps
    peu [de|d’] temps auparavant
    pour quelque temps
    quelque temps
    tout le temps

        <<- ~>> *

    ?[bien|si|assez]¿ longtemps
    avant longtemps
    depuis ?[assez|si|très|trop]¿ longtemps
    depuis bien longtemps
    dès longtemps
    ?d’¿ il n’y a pas ?[assez|si|très|trop]¿ longtemps
    ?d’¿ il y a ?[assez|si|très|trop]¿ longtemps
    pendant ?[bien|si|assez|très]¿ longtemps
    [plus|moins|aussi] longtemps
    [plus|moins|aussi] longtemps que [prévu|nécessaire]
    [plus|moins|aussi] longtemps que d’ habitude
    un peu [plus|moins] longtemps
    un peu [plus|moins] longtemps que [prévu|nécessaire]
    un peu [plus|moins] longtemps que d’ habitude
        <<- ~>> *

__purge_locutions_instant_moment__
    à aucun moment
    à ce [moment|moment-là] ?[exact|particulier|précis]¿
    à cet [instant|instant-là] ?[exact|particulier|précis]¿
    à chaque [instant|moment] ?passé¿
    à un moment donné
    à un moment ou à un autre
    au [dernier|même|bon|mauvais] [moment|instant]
    au bon endroit ?,¿ au bon moment
    au mauvais endroit ?,¿ au mauvais moment
    au bout d’ un [instant|moment]
    dans ces moments-là
    d’ instant en instant
    d’ un [instant|moment] à l’ autre
    en ce [moment|moment-là] ?[particulier]¿
    en ces [temps-là|temps-ci]
    en cet instant ?[particulier|précis]¿
    le moment venu
    par [instants|moments]
    un court [instant|moment]
    un [instant|moment] plus [tôt|tard]
        <<- ~>> *

__purge_locutions_temporelles_diverses__
    à cette [date|occasion] ?fatidique¿
    à longueur [de|d’] [journée|année]
    à cette époque
    à cette époque de l’ année
    à durée [déterminée|indéterminée|limitée]
    à intervalles [irréguliers|réguliers]
    à partir [de|d’]  [aujourd’hui|ici|là|maintenant|rien]
    à partir [de|d’]  [demain|hier]  ?[matin|midi|soir]¿
    ?[d’|dès|jusqu’|pour|après|avant]¿ après demain

    ?[d’|dès|jusqu’|pour|après|avant]¿ après-demain
    après cette date ?fatidique¿

    auparavant
    aussitôt
    au commencement
    au début
    au fur et à mesure
    au jour j
    au jour le jour
    au milieu de la nuit
    au plus [tard|tôt] ?[lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]¿
    avant demain ?[matin|soir|après-midi]¿
    comme autrefois
    comme avant
    comme d’ [habitude|hab]
    comme toujours
    dans [ma|ta|sa|notre|votre|leur] prime jeunesse
    dans un lointain passé
    depuis belle lurette
    depuis des lustres
    depuis lors
    depuis toujours
    depuis un bail
    dès à présent
    dès [demain|hier] ?[soir|matin|après-midi]¿
    dès [maintenant|lors|aujourd’hui]
    dès [mon|ton|son|notre|votre|leur] plus jeune âge
    dès [ma|ta|sa|notre|votre|leur] première rencontre
    dès potron-minet
    dès que possible
    du début à la fin
    du jour au lendemain
    du jour j
    d’ antan
    d’ après-guerre
    d’ avant-guerre
    d’ aujourd’hui
    d’ autrefois
    d’ habitude
    d’ ici ?[là|peu|demain|après-demain]¿
    d’ ici une [seconde|minute|journée|semaine|année|décennie]
    d’ ici un [mois|trimestre|semestre|siècle|millénaire]
    ?[de|d’]¿ jadis
    ?[de|d’]¿ maintenant
    ?d’¿ [hier|avant-hier] ?[matin|soir|après-midi]¿
    ?d’¿ aujourd’hui
    ?d’¿ il y a belle lurette
    ?[de|d’]¿ [demain|après-demain] ?[matin|soir|après-midi]¿
    [de|d’] ?[assez|si|très|trop]¿ [courte|longue] durée
    [de|d’] ?[assez|si|très|trop]¿ bon matin
    [de|d’] ?[assez|si|très|trop]¿ longue [date|haleine]
    [de|d’] ?[assez|si|très|trop]¿ nombreuses années plus [tôt|tard]
    [de|d’] courte [durée|vue]
    [de|d’] demain ?[matin|soir|après-midi]¿
    [de|d’] dernière minute
    [de|d’] jour comme [de|d’] nuit
    [de|d’] nos jours
    [de|d’] si bon matin
    [de|d’] toute éternité
    en début [de|d’] [journée|matinée|soirée|après-midi]
    en milieu [de|d’] [journée|matinée|soirée|après-midi]
    en fin [de|d’] [journée|matinée|soirée|après-midi]
    en un claquement de doigts
    en un clin d’ œil
    été comme hiver
    jour pour jour
    jusqu’ [alors|ici|aujourd’hui|Noël|Pâques]
    jusqu’ au nouvel an
    jusqu’ à [demain|hier] ?[matin|soir|après-midi]¿
    jusqu’ à [ma|sa|ta|notre|votre|leur] mort
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier [souffle|soupir]
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle [de|d’] vie
    jusqu’ à aujourd’hui
    jusqu’ à ce que [ils|elles|iels] en sachent plus
    jusqu’ à ce que [j’|il|elle|on] en sache plus
    jusqu’ à ce que mort s’ ensuive
    jusqu’ à ce que nous en sachions plus
    jusqu’ à ce que tu en saches plus
    jusqu’ à ce que vous en sachiez plus
    jusqu’ à la dernière [minute|seconde]
    jusqu’ à la fin
    jusqu’ à la fin [de|d’] [mes|tes|ses|nos|vos|leurs] jours
    jusqu’ à la tombée [de|d’] la nuit
    jusqu’ à maintenant
    jusqu’ à nouvel ordre
    jusqu’ à plus ample informé
    jusqu’ à présent
    jusqu’ à récemment
    le jour venu
    le [moins|plus] [de|d’] [gens|monde] possible
    le [moins|plus] [tôt|tard|souvent] ?possible¿
    moins [près|loin|tôt|tard]
    moins ?[près|loin|tôt|tard]¿ que d’ habitude
    moins ?[près|loin|tôt|tard]¿ que [prévu|nécessaire]
    plus [près|loin|tôt|tard]
    plus ?[près|loin|tôt|tard]¿ que [prévu|nécessaire]
    plus ?[près|loin|tôt|tard]¿ que d’ habitude
    par la suite
    par le passé
    plus jamais
    plus que d’ habitude
    pour lors
    pour le restant [de|d’] [mes|tes|ses|nos|vos|leurs] jours
    quant à présent
    sine die
    sans délai ?supplémentaire¿
    sur ces entrefaites
    séance tenante
    tout [de|d’] [suite|go]
    tout à coup
    toute affaire cessante
    toutes affaires cessantes
    tôt ou tard
    un jour ou l’autre
    un peu [moins|plus] ?[près|loin|tôt|tard]¿ que prévu
    [voici|voilà] belle lurette
        <<- ~>> *

    déjà

    désormais
    dorénavant


    parfois

    soudain
    souvent
    sur-le-champ
    tard
    toujours

        <<- ~>> *

    tôt
        <<- not (value(>1, "|fait|") and value(>2, "|de|d’|") and morph(<1, ">avoir/")) ~>> *

__purge_locutions_échéance__
    à ?[si|très|trop]¿ [brève|courte|longue] échéance
    à moyenne échéance
    à plus ou moins [brève|courte|longue] échéance
        <<- ~>> *

__purge_locutions_terme__
    à ?[si|très|trop]¿ court terme
    à ?[si|très|trop]¿ long terme
    à moyen terme
    à moyen [et|ou] ?à¿ [court|long] terme
    à court [et|ou] ?à¿ [moyen|long] terme
    à long [et|ou] ?à¿ [court|moyen] terme
    à ?[si|très|trop]¿ long [et|ou] ?à¿ ?[si|très|trop]¿ [court|moyen] terme
    à ?[si|très|trop]¿ court [et|ou] ?à¿ ?[si|très|trop]¿ [long|moyen] terme
    avant terme
    sur le ?[très|trop]¿ [long|moyen|court] terme
        <<- ~>> *

__purge_locutions_fois__
    à la fois
    à chaque fois
    bien des fois
    à d’ autres fois
    d’ innombrables fois
    [de|d’] ?[assez|si|très|trop]¿ nombreuses fois
    [de|d’] ?[assez|si|très|trop]¿ nombreuses fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    depuis la [première|dernière|~ième$] fois
    encore une fois
    par $:B fois
    pas plus [de|d’] [une|$:B] fois
    plein [de|d’] fois
    plus d’ une fois
    plus d’ une fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    pour la [première|seconde|dernière|~ième$] fois
    pour la [première|seconde|dernière|~ième$] fois [de|d’] [mon|ton|son|ma|ta|sa|notre|votre|leur] ?[misérable|insignifiante|palpitante]¿ [existence|vie] ?[misérable|insignifiante|palpitante]¿
    pour la [première|seconde|~ième$] et dernière fois
    pour la [première|seconde|~ième$] et dernière fois [de|d’] [mon|ton|son|ma|ta|sa|notre|votre|leur] ?[misérable|insignifiante|palpitante]¿ [existence|vie] ?[misérable|insignifiante|palpitante]¿
    pour la [seconde|dernière|~ième$] fois [de|d’] suite
    pour [trois|3] fois rien
    pour [cette|une] fois
    quelquefois
    quelques fois
    sans y [réfléchir|songer|penser] à [deux|2] fois
    souventes fois
    toutefois
    tant de fois
        <<- ~>> *

    cette [fois|fois-là|fois-ci]
    chaque fois
    d’ autres fois
    des fois
    des [dizaines|douzaines|vingtaines|trentaines|quarantaines|cinquantaines|soixantaines|centaines|milliers|millions|milliards] de fois
    des [dizaines|douzaines|vingtaines|trentaines|quarantaines|cinquantaines|soixantaines|centaines|milliers|millions|milliards] de fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    $:B fois
    $:B fois [de|d’] suite
    $:B fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    la derrière fois
    la prochaine fois
    maintes fois
    plusieurs fois
    plusieurs fois [de|d’] suite
    plusieurs fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    une autre fois
    un [millier|million|milliard] [de|d’] fois
    une [autre|nouvelle|première|seconde|troisième|quatrième|cinquième|sixième|septième|huitième|neuvième|dixième|onzième|douzième|treizième|quatorzième|quinzième|seizième|dix-septième|dix-huitième|dix-huitième|dix-neuvième|vingtième|centième|millième] fois
    une bonne fois pour toutes
    une dernière fois
    une fois [de|d’] plus
    une fois n’ est pas coutume
    une ?bonne¿ fois pour toutes
    une prochaine fois
    une seule fois
        <<- not morph(<1, ":R") ~>> *

__purge_locutions_circonstances__
    dans d’ autres circonstances
    dans certaines circonstances ?particulières¿
    dans cette circonstance ?particulière¿
    dans cette circonstance-là
    dans ces circonstances ?particulières¿
    dans ces circonstances-là
    en aucune circonstance
    en certaines circonstances ?particulières¿
    en cette circonstance ?particulière¿
    en cette circonstance-là
    en ces circonstances ?particulières¿
    en ces circonstances-là
    en d’ autres circonstances
    en [de|d’] [semblables|telles] circonstances
    en toute circonstance ?semblables¿
    en toutes circonstances ?semblables¿
    en [certaines|quelques|plusieurs] circonstances
        <<- ~>> *

__purge_locutions_occasion__
    à l’ occasion
    à la [dernière|moindre|première|prochaine] occasion
    à la toute première occasion
    à cette occasion ?particulière¿
    à cette occasion-là
    en cette occasion ?particulière¿
    en cette occasion-là
    en ces occasions ?particulières¿
    en ces occasions-là
    en d’ [autres|innombrables] occasions
    en [de|d’] [rares|semblables|telles] occasions
    en [certaines|quelques|toutes|plusieurs] occasions
    en maintes occasions
    en toute occasion
    en une ?tout¿ autre occasion
    par la même occasion
        <<- ~>> *


TEST: Le train de 2 h 47 {{arriveraient}} en retard.                        ->> arriverait
TEST: Le train de 2 h 47 du matin {{arriveraient}} en retard.               ->> arriverait
TEST: Le train de 2h47 du matin {{arriveraient}} en retard.                 ->> arriverait
TEST: ils sont depuis le 2 janvier {{parti}} à l’étranger.                  ->> partis
TEST: ils sont depuis le 2 janvier 2012 {{parti}} à l’étranger.             ->> partis
TEST: Une étude de 2005 publiée dans le Journal
TEST: Les cinq variantes de la couverture du magazine Wired d’avril 2016 consacrée à Silicon Valley.
TEST: c’est donc la cinquième en 50 ans
TEST: profanation de plusieurs églises françaises début février.


__purge_un_nombre__
    un  *NUM  @:A.*:s¬:G
        <<- ~2>> *

TEST: l’équipe veut aussi voir dans la lettre le nombre d’or, un symbole d’harmonie, ainsi qu’un 6 retourné.

................................................................................
    <start>  mais
    <start>  m’  est   avis  [que|qu’]
    <start>  or  donc
    <start>  puis
    [<start>|,|(] grand bien lui fasse
        <<- ~2:0>> *


__purge_locutions_latines__
    [a|à]       [contrario|cappella|fortiori|giorno|minima|priori|postériori|posteriori]
        <<- ~>> *
        <<- !1>>

    ab          [absurdo|initio|ovo]
    ad          [hoc|hominem|infinitum|libitum|limina|nauseam|nutum|valorem|patres]
    ad          majorem dei gloriam
    ad          vitam æternam
    alea        jacta est
    de          [facto|jure|plano|profondis]
    et          [cætera|cetera]
    ex          [abrupto|absurdo|cathedra|nihilo|professo]
    grosso      modo
    hic         et nunc
    id          est
    in          [abstracto|extenso|extremis|fine|memoriam|petto|situ|utero|vitro|vivo]
    ipso        facto
    mutatis     mutandis
    ne          varietur
    pro         domo
    recto       tono
        <<- ~>> *

    in anima vili
    in cauda venenum
    in vino veritas
    sursum corda
    sic transit gloria mundi
        <<- ~>> ␣
        <<- =>> define(\1, ":LP")


__purge_locutions_incises__
    [<start>|,|(] [oui|non] [<end>|,|)]
    [<start>|,|(] ?oui¿ ou non [<end>|,|)]
    [<start>|,|(] et non l’ inverse [<end>|,|)]
    [<start>|,|(] fait remarquable [<end>|,|)]
    [<start>|,|(] entre autres ?choses¿ [<end>|,|)]
    [<start>|,|(] mieux encore [<end>|,|)]
    [<start>|,|(] n’ est-ce pas [<end>|)]
        <<- ~2:-2>> *


__purge_locutions_distance__
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] [de|d’] [distance|ici]
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] en [amont|aval]
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] plus loin
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] à la ronde
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] aux alentours
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] [de|d’] [distance|ici]
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] en [amont|aval]
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] plus loin
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] à la ronde
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] aux alentours
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] [de|d’] [distance|ici]
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] en [amont|aval]
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] plus loin
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] à la ronde
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] aux alentours
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] [de|d’] [distance|ici]
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] en [amont|aval]
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] plus loin
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] à la ronde
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] aux alentours
    à un jet [de|d’] pierre [de|d’] [distance|ici]
    à un jet [de|d’] pierre en [amont|aval]
    à un jet [de|d’] pierre plus loin
    à un jet [de|d’] pierre à la ronde
    à un jet [de|d’] pierre aux alentours
        <<- ~>> *

    à ?[moins|plus|si|très|trop]¿ haute altitude
    à ?[moins|plus|si|très|trop]¿ grande profondeur
    à ?[si|très|trop]¿ peu [de|d’] distance
        <<- ~>> *

    au loin
    au plus [près|loin]
    d’ un peu trop [près|loin]
    [de|d’] loin en loin
    [de|d’] près ou [de|d’] loin
    ?[de|d’]¿ ?[assez|aussi|moins|fort|plus|si|très|trop]¿ [loin|près]
    [loin|près] [de|d’] [là|ici]
    [loin|près] [de|d’] tout [ça|cela|ceci]
    ni [de|d’] près ?,¿ ni [de|d’] loin
        <<- ~>> *


__purge_locutions__
    à *NUM  %
    à [autrui|bâbord|brûle-pourpoint|califourchon|chacun|cheval|cloche-pied|confesse|contre-courant|contrecœur|contre-cœur|contre-pied|contre-sens|contretemps|contre-temps|>demi-mot|demi-voix|dessein|foison|grand-peine|genoux|gogo|jamais|jeun|loisir|merveille|moitié|nouveau|outrance|peine|perpète|perpette|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|revers|risque|sec|tâtons|tire-d’aile|tire-larigot|tort|tribord|tout-va|vif]
    à [mi-chemin|mi-côte|mi-jambe+s|mi-mandat|mi-mot+s|mi-parcours|mi-temps|mi-voix]
    à air comprimé
    à angle droit
    à armes égales
    à aucun prix
    à autre chose
    à ?[si|très|trop]¿ bas [bruit|cout|coût|prix]
    à bâtons rompus
    à beaucoup près
    à belles dents
    à bien des égards
    à bien pire
    à ?[si|très|trop]¿ courte portée
    à ?[si|très|trop]¿ bon [compte|escient|droit]
    à bout [de|d’] [bras|souffle|force|forces|nerf|nerfs]
    à bout [portant|touchant]
    à bras ouverts
    à bras-le-corps
    à bride abattue
    à but ?non¿ lucratif
    à cadence forcée
    à canon [court|long|scié]
    à cause [de|d’]  [ça|cela|ceci|moi|toi|lui|nous|vous|elle|elles|eux|iel|iels]
    à ce [compte-là|moment-là|titre]
    à ce [que|qu’] je [peux|pouvais|pus|pourrai|pourrais] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] tu [peux|pouvais|pus|pourras|pourrais] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce qu’ [il|elle|on|iel] [peut|pouvait|put|pourra|pourrait] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] nous [pouvons|pouvions|pûmes|pourrons|pourrions] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] vous [pouvez|pouviez|pûtes|pourrez|pourriez] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce qu’ [ils|elles|iels] [pouvent|pouvaient|purent|pourront|pourraient] en [apercevoir|comprendre|juger|percevoir|voir]
    à certains égards
    à cet égard
    à ciel ouvert
    à charge [de|d’] revanche
    à ?[si|très|trop]¿ chaudes larmes
    à cœur [joie|ouvert|perdu]
    à compter [de|d’] [demain|aujourd’hui|hier|maintenant]
    à connotation sexuelle
    à contre-jour
    à corps perdu
    à côté  [de|d’]  [ça|moi|toi|lui|nous|vous|elle|elles|eux|iel|iels]
    à couilles rabattues
    à coup sûr
    à couper le souffle
    à >coussin d’ air
    à couteaux tirés
    à défaut d’ autre chose
    à domicile ?fixe¿
    à dormir debout
    à dose homéopathique
    à *NUM reprises
    à @:B:[fe]:p reprises
    à [plusieurs|quelques|maintes] reprises
    à [de|d’]  ?[assez|aussi|si|très|trop]¿  [nombreuses|multiples|innombrables]  reprises
    à double [titre|tranchant]
    à en juger par [mon|ton|son|notre|votre|leur] ?immense¿ expérience
    à en juger par [ma|ta|sa|notre|votre|leur] [grande|petite] expérience
    à en perdre haleine
    à en perdre la tête
    à ?[moins|plus|si|très|trop]¿ faible [allure|revenu]
    à ?[moins|plus|si|très|trop]¿ faible tirant d’ eau
    à feu et à sang
    à flanc [de|d’] [colline|montagne]
    à fleur [de|d’] peau
    à franchement parler
    à fond [de|d’] train
    à fonds perdus
    à géométrie variable
    à glacer le sang
    à glacer les sangs
    à gorge déployée
    à ?[moins|plus|si|très|trop]¿ grand bruit
    à ?[moins|plus|si|très|trop]¿ grande échelle
    à ?[moins|plus|si|très|trop]¿ grands frais
    à ?[moins|plus|si|très|trop]¿ grands traits ?[imprécis|rageurs|précis|vagues]¿
    à ?[moins|plus|si|très|trop]¿ haut risque
    à ?[moins|plus|si|très|trop]¿ haute voix
    à ?[moins|plus|si|très|trop]¿ haute et intelligible voix
    à heure fixe
    à hue et à dia
    à huis clos
    à hurler [de|d’] rire
    à juste [raison|titre]
    à l’ [accoutumée|amiable|arrache|arraché|arrachée|avance|avenant|aveuglette|emporte-pièce|envi|évidence|étouffée|improviste|inverse|unanimité|unisson]
    à l’ air libre
    à l’ autre bout du fil
    à l’ avenir ?[incertain|prometteur]¿
    à l’ échelon [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    à l’ échelle [locale|cantonale|départementale|régionale|nationale|européenne|américaine|africaine|asiatique|continentale|internationale|planétaire|galactique|universelle]
    à l’ en croire
    à l’ environ
    à l’ état pur
    à l’ exclusion [de|d’] toute autre chose
    à l’ extrémité [est|ouest|nord|sud]
    à l’ ordre du jour
    à l’ un d’ entre [nous|vous|eux|iels]
    à l’ une d’ entre [nous|vous|elles|iels]
    à l’ échelle [nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle]
    à l’ exclusion [de|d’] toute autre chose
    à l’ œil nu
    à l’ [un|une] des leurs
    à l’ [un|une] comme à l’ autre
    à la [bourre|con|coule|dérobée|diable|leur|manque|mords-moi-le-nœud|papa|ramasse|renverse|redresse|rescousse|sauvette|va-vite|volée]
    à la belle étoile
    à la bonne franquette
    à la limite du supportable
    à la lumière [de|d’] tout [ceci|cela|ça]
    à la mords-moi le nœud
    à la petite semaine
    à la [force|pointe] [de|d’] l’ épée
    à la pointe du progrès ?[algorithmique|biologique|cybernétique|écologique|industriel|informatique|numérique|scientifique|social|spatial|technique|technologique]¿
    à la queue leu leu
    à la surprise générale
    à la virgule près
    à la vitesse [de|d’] l’ éclair
    à [un|cet|l’] instant t
    à ?[moins|plus|si|très|trop]¿ large échelle
    à ?[moins|plus|si|très|trop]¿ large spectre
    à ?[moins|plus|si|très|trop]¿ [court|moyen|long] rayon d’ action
    à ?[moins|plus|si|très|trop]¿ longue [distance|portée]
    à loyer modéré
    à main [armée|droite|gauche|levée|nue]
    à mains nues
    à maints égards
    à marche forcée
    à marée [basse|haute]
    à même le sol
    à merveille
    à [mi-course|mi-distance|mi-temps]
    à moindre [coût|cout]
    à moindres frais
    à mots couverts
    à [mes|tes|ses|nos|vos|leurs] [côtés|dépens|trousses]
    à [mes|tes|ses|nos|vos|leurs] risques et périls
    à [ma|ta|sa|notre|votre|leur] [connaissance|disposition|guise|portée]
    à [ma|ta|sa|notre|votre|leur] grande [surprise|tristesse]
    à [ma|ta|sa|notre|votre|leur] juste mesure
    à [mon|ton|son|notre|votre|leur] [avis|détriment|encontre|égard|gré|insu|sujet|tour]
    à [mon|ton|son|notre|votre|leur] [cœur|corps] défendant
    à [mon|ton|son|notre|votre|leur] grand [dam|désarroi|soulagement]
    à n’ en [pas|point] douter
    à n’ en plus finir
    à n’importe quel prix
    à nul autre pareil
    à nulle autre pareille
    à parler [franc|franchement|strictement]
    à part [entière|ça|cela|ceci]
    à parts égales
    à partir [de|d’]  rien
    à pas [de|d’] [géant|loup|tortue|velours]
    à pas feutrés
    à personne en danger
    à perte [de|d’] vue
    à petit feu
    à ?[si|très|trop|plus|moins]¿  petite [dose|échelle]
    à ?[si|très|trop]¿ peu [de|d’] choses près
    à ?[si|très|trop]¿ peu [de|d’] frais
    à peine
    à peu près
    à pied d’ œuvre
    à pieds joints
    à pile ou face
    à plat ventre
    à plate couture
    à plein [régime|temps|nez]
    à pleine gorge
    à pleins poumons
    à plus forte raison
    à plus d’ un titre
    à poil [court|dur|long|rêche]
    à poings fermés
    à point nommé
    à portée [de|d’] [main|tir|voix]
    à première vue
    à prix [coûtant|coutant|cassé+s|>modique]
    à [ma|ta|sa|notre|votre|leur] propre initiative
    à proprement parler
    à quatre pattes
    à qui [de|d’] droit
    à qui mieux mieux
    à qui [que|qu’] ce soit
    à quelque distance
    à quelques [degrés|exceptions|nuances|pourcents|variations|nanomètres|millimètres|centimètres|décimètres|mètres|kilomètres|parsecs|années-lumière] près
    à quelques-uns d’ entre [nous|vous|eux]
    à quelques-unes d’ entre [nous|vous|elles]
    à ras [de|d’] terre
    à ras [bord|bords]
    à ras [le|du] sol
    à rude épreuve
    à s’ y méprendre
    à somme nulle
    à spectre ?[assez|si|très|trop]¿ large
    à strictement parler
    à tarif réduit
    à tarifs réduits
    à taux [>fixe|>variable|zéro|nul+s]
    à tel point
    à temps  [plein|partiel|complet]
    à tête reposée
    à tire d’ [aile|ailes]
    à [tire-d’aile|tire-d’ailes]
    à titre [amical|bénévole|conservatoire|commercial|comparatif|confidentiel|consultatif|dérogatoire|exceptionnel|expérimental|fiduciaire|facultatif|indicatif|informatif|grâcieux|gratuit|honorifique|honoraire|humanitaire|informatif|indicatif|informel|juridique|liminaire|lucratif|nominatif|officieux|onéreux|personnel|posthume|préventif|provisoire|provisionnel|subsidiaire|temporaire|transitoire|universel|volontaire]
    à titre d’ [exemple|illustration|information]
    à titre [de|d’] comparaison
    à tombeau ouvert
    à tort ou à raison
    à tort et à travers
    à tour [de|d’] [bras|rôle]
    à tout [âge|coup|crin|instant|jamais|moment|prix]
    à tout bout [de|d’] champ
    à tout le [moins|monde]
    à tout point [de|d’] vue
    à tout un chacun
    à toute [allure|berzingue|bride|épreuve|force|reste|vapeur|vitesse|volée]
    à tous crins
    à tous points [de|d’] vue
    à toutes fins utiles
    à toutes jambes
    à travers terre et mer
    à tu et à toi
    à tue-tête
    à usage [interne|unique]
    à ?[moins|plus|si|très|trop]¿ vaste échelle
    à visage [découvert|humain]
    à vitesse constante
    à vitesse grand V
    à vive allure
    à voile et à vapeur
    à voix [haute|basse]
    à vol d’ oiseau
    à vrai dire
    à vue d’ œil
    à ?bien¿ y regarder [de|d’] plus près
    à ?bien¿ y [penser|réfléchir|songer|repenser]
    advienne [que|qu’] pourra
    ah
    ailleurs
    alors
    après [moi|toi|soi|lui|eux]
    après coup
    après mûre réflexion
    après tout ,
    au bas mot
    au beau fixe
    au bon moment
    au bout du [compte|rouleau]
    au cas par cas
    au chômage partiel
    ?bien¿ au contraire
    au coude à coude
    au coup par coup
    au demeurant
    au doigt mouillé
    au doigt et à l’ [œil|oeil]
    au débotté
    au fait et au prendre
    au fil [de|d’] l’ épée
    au grand [complet|jamais]
    au hasard
    au jugé
    au lieu [de|d’] [cela|ceci|ça|quoi]
    au milieu [de|d’] nulle part
    au moment opportun
    au même titre [que|qu’] n’importe [laquelle|lequel] d’ entre [nous|vous|eux|elles]
    au pas [de|d’] [charge|course]
    au petit bonheur la chance
    au plan [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    au plus [près|pressé|vite]
    au plus haut [degré|point]
    au premier abord
    au premier coup d’ œil
    au prime abord
    au propre comme au figuré
    au préalable
    au ras des pâquerettes
    au saut du lit
    au second plan
    au sens [figuré|large|littéral|propre]
    au sens figuré comme au sens [littéral|propre]
    au sens [littéral|propre] comme au sens figuré
    au sens [étroit|figuré|large|littéral] du terme
    au surplus
    au-delà du descriptible
    ?tout¿ aussi
    à la [mienne|tienne|sienne|nôtre|vôtre|leur]
    au [mien|tien|sien|nôtre|vôtre|leur]
    aussi [con|étonnant|habile|idiot|inattendu|insolite|invraisemblable|maladroit|stupide|surprenant] [que|qu’] que [cela|ceci|ça] puisse [paraitre|paraître]
    aux [abois|aguets|miens|miennes|tiens|tiennes|siens|siennes|nôtres|vôtres|leurs]
    autant [que|qu’] [nécessaire|possible|prévu]
    autant [que|qu’] faire se peut
    autrement dit
    avant tout le monde
    avant toute chose
    avant toutes choses
    avant d’ aller plus loin
    avant d’ en arriver là
    avant [de|d’] faire quoi [que|qu’] ce soit
    avant [de|d’] faire quoi [que|qu’] ce soit [de|d’] ?$:W¿ [absurde|stupide|crétin|con|idiot|inconsidéré]
    avant qu’ il ne soit trop tard
    avant un bon bout [de|d’] temps
    avec beaucoup [de|d’] [circonspection|prudence]
    avec [aplomb|brio|constance|emphase|joie|légèreté|insistance|peine]
    avec autre chose
    avec le plus grand soin
    avec pertes et fracas
    avec tout le respect [que|qu’] je [vous|te|leur|lui] dois
    avec tout le respect [que|qu’] nous [vous|te|leur|lui] devons
    avec tout un chacun
    avec un peu [de|d’] chance
    ayant pignon sur rue
    beaucoup [plus|moins]
    bel et bien
    bien assez tôt
    bien souvent
    bientôt
    bon gré ?,¿ mal gré
    bras dessus ?,¿ bras dessous
    çà et là
    cahin-caha
    ce faisant
    ce qui [ne|n’] [est|était|fut|sera|serait] [pas|jamais|guère] pour [me|m’|te|t’|lui|nous|vous|leur] déplaire
    ce qui [ne|n’] [a|aura|aurait|avait|eut|eût] [pas|jamais|guère] été pour [me|m’|te|t’|lui|nous|vous|leur] déplaire
    cependant
    [cela|ça|ceci] mis à part
    [cela|ça|ceci] va sans dire
    [cela|ceci] étant dit
    certes
    ci-dessous
    ci-dessus
    chaque chose en son temps
    chose promise ?,¿ chose due
    comme [de|d’] juste
    comme bon [me|te|lui|leur|nous|vous] semble
    comme ci ?,¿ comme ça
    comme cul et chemise
    comme des fétus [de|d’] paille
    comme [frappé+ses] par la foudre
    comme gage [de|d’] bonne foi
    comme n’importe où ?ailleurs¿
    comme par [enchantement|magie]
    comme par un fait exprès
    comme pas deux
    comme peau [de|d’] chagrin
    comme prévu
    comme promis
    comme qui dirait
    comme si [de|d’] rien n’ était
    comme sur des roulettes
    comme un lion en cage
    comme un fétu [de|d’] paille
    comme une lettre à la poste
    contrairement aux apparences
    contre mauvaise fortune ?,¿ bon cœur
    contre nature
    contre toute [attente|vraisemblance]
    contre vents et marées
    contre [mon|ton|son|notre|votre|leur] gré
    côte à côte
    côté [face|pile]
    [coute|coûte] [que|qu’] [coute|coûte]
    [crois-le|croyons-le|croyez-le] ou [non|pas]
    cul par-dessus tête
    dans le cas contraire
    dans [ce|ces] [cas-là|cas-ci]
    dans ce cas [précis|particulier]
    dans ces cas [précis|particuliers]
    dans l’ état actuel
    dans l’ état actuel des choses
    dans l’ [idéal|immédiat]
    dans la mesure du possible
    dans la dernière ligne droite
    dans le feu [de|d’] l’ action
    dans leur globalité
    dans leur ?très¿ grande majorité
    dans tout [cela|ça|ceci]
    dans un cas comme dans l’autre
    dans une [certaine|large|moindre] mesure
    dans une mauvaise passe
    d’ abord
    d’ affilée
    d’ ailleurs
    d’ alors
    d’ [arrache-pied|arrachepied]
    d’ arrière en avant
    d’ autant [plus|moins]
    d’ autre part
    d’ avant en arrière
    d’ avant-guerre
    d’ à côté
    d’ âge mûr
    d’ emblée
    d’ empoigne
    d’ en [bas|dessous|face|haut]
    d’ entre [eux|elles|iels]
    d’ entrée [de|d’] jeu
    d’ est en ouest
    d’ extrême [droite|gauche] ?radicale¿
    d’ [extrême-droite|extrême-gauche] ?radicale¿
    d’ [égal|égale] à [égal|égale]
    d’ intérêt général
    d’ ordinaire
    d’ origine [inconnue|douteuse|étrangère|plébéienne|aristocratique]
    d’ ordre [général|public|privé]
    d’ où qu’ [il|elle|on|iel] vienne
    d’ où qu’ [ils|elles|iels] viennent
    d’ ouest en est
    d’ [ors|ores] et déjà
    d’ un autre côté
    d’ un [bout|jour] à l’ autre
    d’ un côté [comme|et] [de|d’] l’ autre
    d’ un commun accord
    d’ un pas [alerte|mesuré]
    d’ un peu partout
    d’ un revers [de|d’] main
    d’ un revers [de|d’] la main ?[droite|gauche]¿
    d’ un ?tout¿ autre ordre [de|d’] grandeur
    d’ une autre trempe
    d’ une [façon|manière] ou d’ une autre
    d’ une [façon|manière] aussi @:A.*:[fe]:[si] que possible
    d’ une certaine [façon|manière]
    d’ une tout autre ampleur
    d’ utilité publique
    de-ci ?,¿ de-là
    [de|d’] ?[assez|si|très|trop]¿ [faible|grande|médiocre|moindre|petite] [taille|envergure|stature|valeur]
    [de|d’] ?[assez|si|très|trop]¿ haute [lignée|lutte|naissance|stature|taille|valeur|volée]
    [de|d’] ?[assez|si|très|trop]¿ basse [condition|extraction|lignée|naissance]
    [de|d’] ?[assez|si|très|trop]¿ bon [aloi|cœur|goût|gout|gré|poil|sens|ton]
    [de|d’] ?[assez|si|très|trop]¿ mauvais [aloi|cœur|goût|gout|gré|poil]
    [de|d’] ?[assez|si|très|trop]¿ bonne [compagnie|facture|famille|foi|grâce|heure|humeur|qualité]
    [de|d’] ?[assez|si|très|trop]¿ haut [rang|vol]
    [de|d’] ?[assez|si|très|trop]¿ mauvaise [compagnie|facture|foi|grâce|humeur|qualité]
    [de|d’] *NUM %
    [de|d’] [conserve|fait|guingois|luxe|nouveau|permanence|partout|plain-pied|pacotille|préférence|rechange|routine|surcroît|surcroit|traviole|visu]
    [de|d’] A à Z
    [de|d’] bas en haut
    [de|d’] bas étage
    [de|d’] basse extraction
    [de|d’] belle [allure|prestance]
    [de|d’] bonne [compagnie|réputation]
    [de|d’] bouche en bouche
    [de|d’] bric et [de|d’] broc
    [de|d’] but en blanc
    [de|d’] ce fait ?[incontestable|irréfutable|même]¿
    [de|d’] ce seul fait
    [de|d’] ce point [de|d’] vue
    [de|d’] cette sorte
    [de|d’] cet acabit
    [de|d’] chaque côté
    [de|d’] côté
    [de|d’] courte vue
    [de|d’] deux choses l’ une
    [de|d’] droite à gauche
    [de|d’] droite comme [de|d’] gauche
    [de|d’] fâcheuse mémoire
    [de|d’] fil en aiguille
    [de|d’] fond en comble
    [de|d’] ?[assez|si|très|trop]¿ [fraîche|fraiche] date
    [de|d’] [gaieté|gaîté|gaité] [de|d’] cœur
    [de|d’] grand renom
    [de|d’] grande ampleur
    [de|d’] gauche à droite
    [de|d’] gauche comme [de|d’] droite
    [de|d’] génération en génération
    [de|d’] gré à gré
    [de|d’] gré ou [de|d’] force
    [de|d’] guerre lasse
    [de|d’] haut en bas
    [de|d’] haute main
    [de|d’] là-bas
    [de|d’] la meilleure [manière|façon] possible
    [de|d’] la même [façon|manière]
    [de|d’] la plus haute importance
    [de|d’] la sorte
    [de|d’] la tête aux pieds
    [de|d’] la veille
    [de|d’] long en large
    [de|d’] main [de|d’] [maître|maitre]
    [de|d’] mal en pis
    [de|d’] même nature
    [de|d’] mieux en mieux
    [de|d’] moindre [envergure|valeur]
    [de|d’] moins en moins
    [de|d’] nature [étrangère|inconnue|indéterminée|insolite]
    [de|d’] notoriété publique
    [de|d’] nulle part
    [de|d’] pire en pire
    [de|d’] par le monde ?entier¿
    [de|d’] part en part
    [de|d’] part et d’ autre
    [de|d’] ?presque¿ partout
    [de|d’] peu d’ importance
    [de|d’] pied ferme
    [de|d’] pire en pire
    [de|d’] pis en pis
    [de|d’] place en place
    [de|d’] plein [droit|fouet]
    [de|d’] plus belle ?[façon|manière]¿
    [de|d’] plus en plus
    [de|d’] point en point
    [de|d’] ?tout¿ premier [choix|ordre|plan]
    [de|d’] première [catégorie|main|nécessité]
    [de|d’] prime abord
    [de|d’] proche en proche
    [de|d’] [ma|ta|sa|notre|votre|leur] propre initiative
    [de|d’] pure forme
    [de|d’] sang-froid
    [de|d’] sang mêlé
    [de|d’] seconde [catégorie|importance|main|zone]
    [de|d’] sinistre mémoire
    [de|d’] source sûre
    [de|d’] taille moyenne
    [de|d’] telle sorte
    [de|d’] vive voix
    [de|d’] [nous|vous] tous
    [de|d’] tous [côtés|bords]
    [de|d’] tous les cas [de|d’] figure [possibles|imaginables|existants|rencontrés]
    [de|d’] tous les cas [de|d’] figure possibles et imaginables
    [de|d’] tous les cas [de|d’] figure imaginables et possibles
    [de|d’] tout poil
    [de|d’] tout premier [ordre|plan]
    [de|d’] tout [mon|ton|son|notre|votre|leur] cœur
    [de|d’] toute [évidence|façon|part|urgence]
    [de|d’] toutes [parts|pièces|sortes]
    [de|d’] toutes les possibilités [existantes|imaginables|rencontrées]
    [de|d’] toutes [mes|tes|ses|nos|vos|leurs] forces
    [de|d’] [mon|ton|son|notre|votre|leur] acabit
    [de|d’] [mon|ton|son|notre|votre|leur] mieux
    [de|d’] [mon|ton|son|notre|votre|leur] plein gré
    [de|d’] [mon|ton|son|notre|votre|leur] point [de|d’] vue
    [de|d’] [mon|ton|son|notre|votre|leur] propre [cru|chef|fait]
    [de|d’] [mon|ton|son|notre|votre|leur] vivant
    [de|d’] [ma|ta|sa|notre|votre|leur] part
    [de|d’] [ma|ta|sa|notre|votre|leur] propre volonté
    debout
    derechef
    derrière tout [cela|ceci|ça]
    donc
    des pieds à la tête
    Dieu [m’|t’|l’|nous|vous|les] en [garde|préserve]
    Dieu [m’|t’|lui|nous|vous|leur] en soit témoin
    Dieu seul le sait
    dos à dos
    du bout des lèvres
    du coin [de|d’] l’ [œil|oeil]
    du fond du cœur
    du haut en bas
    du même [acabit|coup|ordre|tonneau]
    du moins ?,¿ pas
    du [nord|sud] au [nord|sud]
    du tac au tac
    du tout au tout
    eh bien
    en [aparté|apparence|arrière|avance|avant|catimini|cachette|ceci|cela|clair|commun|conséquence|continu|contrebas|contrepartie|dedans|définitive|détail|direct|distanciel|douce|effet|émoi|filigrane|général|goguette|hâte|loucedé|majorité|moyenne|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|présentiel|prime|privé|principe|priorité|public|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|tapinois|théorie|trompe-l’œil|vain|vérité]
    en réalité ?[augmentée|virtuelle]¿
    en âge [de|d’] procréer
    en aucun cas
    en aucune [façon|manière]
    en ?[assez|si|très|trop]¿ bas âge
    en ?[assez|si|très|trop]¿ bon état ?général¿
    en ?[assez|si|très|trop]¿ bon état [de|d’] [fonctionnement|marche]
    en ?[assez|si|très|trop]¿ bonne [compagnie|logique|place|posture|voie]
    en bonne et due forme
    en ?[assez|si|très|trop]¿ bonne santé ?[générale|physique|mentale|psychique]¿
    en bout [de|d’] course
    en cas [de|d’] besoin ?[absolu|impérieux]¿
    en cas [de|d’] doute ?[légitime|suffisant]¿
    en cas [de|d’] nécessité ?[absolue|impérieuse]¿
    en cas d’ urgence ?[absolue|impérieuse]¿
    en [chacun|chacune] [de|d’] ?entre¿ [nous|vous|eux|elles|iels]
    en chair et en os
    en chômage partiel
    en chute libre
    en comparution immédiate
    en ?[parfaite|pleine]¿ connaissance [de|d’] cause
    en contrebas
    en contrepoint
    en coup [de|d’] vent
    en coupe réglée
    en cours [de|d’] route
    en d’ autres termes
    en définitive
    en dehors [de|d’] ?tout¿ [ça|cela|ceci]
    en dents [de|d’] scie
    en dernier [lieu|recours|ressort]
    en dépit du bon sens ?[commun|élémentaire]¿
    en dépit du bon sens le plus [commun|élémentaire]
    en désespoir [de|d’] cause
    en détention provisoire
    en direction [de|d’] l’ [est|ouest]
    en direction du [nord|nord-est|nord-ouest|sud|sud-est|sud-ouest]
    en double aveugle
    en eau ?peu¿ profonde
    en eaux troubles
    en état [de|d’] choc ?circulatoire¿
    en ?[excellent|mauvais|parfait]¿ état [de|d’] [fonctionnement|marche]
    en état d’ ébriété ?avancée¿
    en ?[assez|si|très|trop]¿ excellent état ?général¿
    en ?[assez|si|très|trop]¿ fâcheuse posture
    en file indienne
    en fin [de|d’] compte
    en formation ?[assez|moins|peu|plus|si|très|trop]¿ serrée
    en ?[assez|si|très|trop]¿ forte [baisse|hausse]
    en gage [de|d’] bonne foi
    en garde à vue ?prolongée¿
    en ?[assez|si|très|trop|plus|moins]¿ grand nombre
    en ?[assez|si|très|trop]¿            grande [difficulté|majorité|partie|pompe]
    en ?[assez|si|très|trop|plus|moins]¿ haut lieu
    en ?[assez|si|très|trop]¿            haute [estime|mer|montagne]
    en l’ absence [de|d’] preuve suffisante
    en l’ absence [de|d’] preuve suffisante du contraire
    en l’ absence [de|d’] preuves suffisantes
    en l’ absence [de|d’] preuves suffisantes du contraire
    en l’ état actuel
    en l’ état actuel des choses
    en l’ occurrence
    en lieu sûr
    en ligne [de|d’] [compte|mire]
    en main propre
    en mains propres
    en ?[assez|si|très|trop]¿ mauvais état
    en ?[assez|si|très|trop]¿ mauvais état [de|d’] [fonctionnement|marche]
    en ?[assez|si|très|trop]¿ mauvaise [posture|santé]
    en nombre ?[assez|si|très|trop|relativement]¿ [insuffisant|limité|suffisant]
    en nombre plus [que|qu’] suffisant
    en odeur [de|d’] sainteté
    en ordre [dispersé|serré]
    en partant [de|d’] zéro
    en partie ou en totalité
    en pente douce
    en ?[assez|si|très|trop]¿ petit nombre
    en place publique
    en plein [air|cœur|essor|marasme|jour|visage]
    en plein dans le mille
    en pleine [face|gueule|figure|forme|nuit|poire|tronche]
    en perte [de|d’] vitesse
    en ?[assez|si|très|trop]¿ [piteux|piètre] état
    en ?[assez|si|très|trop]¿ [piteux|piètre] état [de|d’] conservation
    en point [de|d’] [mire|orgue]
    en porte-à-faux
    en position [de|d’] [force|faiblesse]
    en premier lieu
    en première [instance|ligne]
    en [première|seconde|~ième$] [classe|instance|position]
    en [1ʳᵉ|2ᵉ|3ᵉ|4ᵉ|5ᵉ|6ᵉ|7ᵉ|8ᵉ|9ᵉ|10ᵉ|11ᵉ|12ᵉ|13ᵉ|14ᵉ|15ᵉ|16ᵉ|17ᵉ|18ᵉ|19ᵉ|20ᵉ] [classe|position]
    en provenance du monde entier
    en pure perte
    en quantité suffisante
    en quantité plus [que|qu’] suffisante
    en quelque sorte
    en queue [de|d’] peloton
    en rangs [dispersés|serrés]
    en rangs d’ oignons ?serrés¿
    en rase campagne
    en rase-mottes
    en règle générale
    en roue libre
    en second lieu
    en sens inverse
    en simultané
    en situation [irrégulière|régulière]
    en sous-main
    en sous-nombre ?[évident|flagrant]¿
    en sous nombre ?[évident|flagrant]¿
    en tant [que|qu’] >tel
    en tête à tête
    en tête-à-tête
    en si peu [de|d’] temps
    en terrain [découvert|miné]
    en termes choisis
    en terrain [accidenté|conquis]
    en terre battue ?[claire|ocre|jaune|rouge|noire|sombre|humide|sèche|maculée|sale|dégueulasse]¿
    en terre étrangère
    en toile [de|d’] fond
    en totalité ou en partie
    en tout cas
    en tous les cas
    en tous les sens
    en tout bien tout honneur
    en tout [cas|genre|lieu|sens|point|temps]
    en tout et pour tout
    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
    en [mon|ton|son|leur|notre|votre] for intérieur
    en [mon|ton|son|leur|notre|votre] nom propre
    en ce qui [me|te|le|la|les|nous|vous] [concerne|concernait]
    en voilà ?bien¿ [assez|trop|suffisamment]
    encore et [encore|toujours]
    enfin
    entre chien et loup
    entre [de|d’] [bonnes|mauvaises] mains
    entre nous soit dit
    entre [quatre|quatr’|quat’] [zyeux|yeux]
    entre [quatre-zyeux|quatr’zyeux|quat’zyeux|quatre-yeux|quatr’yeux|quat’yeux]
    entre-temps
    entretemps
    ensuite
    envers et contre tout
    épaule contre épaule
    et ainsi [de|d’] suite
    et pas qu’ un peu
    et tutti quanti
    et vice versa
    et vice-versa
    euh
    excepté le [mien|tien|sien|nôtre|vôtre|leur]
    excepté la [mienne|tienne|sienne|nôtre|vôtre|leur]
    excepté les [miens|miennes|siennes|nôtres|vôtres|leurs]
    face à face
    flanc contre flanc
    guère
    ?d’¿ hors d’ ici
    ?d’¿ hors [de|d’] [contrôle|portée|atteinte]
    ?d’¿ hors d’ état [de|d’] [fonctionner|nuire]
    ?d’¿ hors [de|d’] [ma|ta|sa|notre|votre|leur] portée
    ?d’¿ hors du commun
    ?d’¿ ici
    ?d’¿ ici [comme|ou] ailleurs
    ?d’¿ ici et [là|maintenant]
    ?d’¿ ici même
    ?d’¿ ici-bas
    illico ?presto¿
    ?d’¿ intra-muros
    j’ en [passe|passai+s] et des [meilleurs|meilleures]
    jusqu’ au bout des ongles
    jusqu’ à bac
    jusqu’ à plus soif
    jusqu’ à >preuve du contraire
    jusqu’ à satiété
    jusqu’ à un certain point
    jusqu’ à l’ écœurement
    jusqu’ au trognon
    jusque-    ?[de|d’]¿ là
    ?[de|d’]¿ là-bas
    ?[de|d’]¿ là-haut
    ?[de|d’]¿ là-dedans
    ?[de|d’]¿ là-dehors
    ?[de|d’]¿ là-derrière
    ?[de|d’]¿ là-dessous
    ?[de|d’]¿ là-dessus
    ?[de|d’]¿ là-devant
    ?[de|d’]¿ là non plus
    ¿[de|d’]¿ la fleur au fusil
    ¿[de|d’]¿ la main dans la main
    ¿[de|d’]¿ la mort dans l’ âme
    ¿[de|d’]¿ la queue entre les jambes
    ¿[de|d’]¿ la peur au ventre
    l’ air [de|d’] rien
    la gorge [nouée|serrée]
    la mort dans l’ âme
    la tête entre [mes|tes|ses|nos|vos|leurs] mains
    ?le¿ dos au mur
    le cas échéant
    le cœur battant la chamade
    le cœur [gros|serré]
    le moins du monde
    le moment venu
    les [choses|événements|évènements] suivant leur cours ?[endiablé|effréné|frénétique|implacable|inarrêtable]¿
    loin d’ être
    loin s’ en [faut|fallait]
    malgré [ça|cela|ceci|tout]
    manu militari
    mezza voce
    mieux [vaut|valait] tard [que|qu’] jamais
    moins [tôt|tard]
    moins [que|qu’] [nécessaire|prévu]
    moitié *WORD ?,¿ moitié *WORD
    mot [à|pour] mot
    mouais
    naguère
    ne [lui|leur|m’|t’|nous|vous] en déplaise
    néanmoins
    nez à nez
    ?[de|d’]¿ n’importe où
    ni plus ?,¿ ni moins
    ni vu ?,¿ ni connu
    non [plus|seulement]
    non sans raison
    non sans mal
    ¿[de|d’|vers]¿ nulle part
    ô combien
    oh
    ou quelque chose d’ [approchant|identique]
    ou quelque chose [de|d’] similaire
    où bon [me|te|lui|nous|vous|leur] semble
    oui [ou|et] non
    outre mesure
    par [à-coups|ailleurs|avance|chance|conséquent|curiosité|contre|défaut|définition|endroits|essence|excellence|exemple|hasard|ici|inadvertance|là|mégarde|nature|principe|terre]
    par ?simple¿ acquit [de|d’] conscience
    par [beau|mauvais] temps
    par bien des [aspects|côtés]
    par ?[pure|simple]¿ bonté [de|d’] [âme|cœur]
    par ce biais
    par certains [aspects|côtés]
    par définition
    par ex .
    p. ex .
    par grand froid
    par gros temps
    par la force des choses
    par mesure [de|d’] sécurité
    par monts et par vaux
    par personne interposée
    par personnes interposées
    par tout le monde
    par voie [de|d’] [conséquence|mer|terre]
    par voie d’ exception
    par-ci ?,¿ par-là
    par-derrière
    par-dessus le marché
    par-dessus tout
    par-devant
    par là ?même¿
    par [un|le] simple effet du hasard
    partant [de|d’] là
    partout
    pas du tout
    pas [le|l’] moins du monde
    pas à pas
    petit à petit
    peu ou prou
    peu à peu
    peut-être
    pile poil
    plein [nord|sud|ouest]
    plus bas [que|qu’] terre
    plus du tout
    plus ou moins
    plus [que|qu’] [nécessaire|prévu|jamais]
    plus [que|qu’] tout au monde
    plus [que|qu’] toute autre chose
    plutôt
    pour [ce|c’] [que|qu’] [ça|cela|ceci] vaut
    pour [ce|c’] [que|qu’] j’ en [sais|savais|sus|saurai|saurais]
    pour [ce|c’] [que|qu’] tu en [sais|savais|sus|sauras|saurais]
    pour [ce|c’] [que|qu’] [il|elle|on|iel] en [sait|savait|sut|saura|saurait]
    pour [ce|c’] [que|qu’] nous en [savons|savions|sûmes|saurons|saurions]
    pour [ce|c’] [que|qu’] vous en [savez|saviez|sûtes|saurez|sauriez]
    pour [ce|c’] [que|qu’] [ils|elles|iels] en [savent|savaient|surent|sauront|sauraient]
    pour [celui|celle|ceux|celles] et [celui|celle|ceux|celles] [que|qu’] [ça|cela|ceci] intéresse
    pour [celui|celle|ceux|celles] [que|qu’] [ça|cela|ceci] intéresse
    pour [ma|ta|sa|notre|votre|leur] [gouverne|part]
    pour [mon|ton|son|notre|votre|leur] propre [compte|bien]
    pour [m’|t’|s’|nous|vous|leur] en rendre compte
    pour ainsi dire
    pour ce faire
    pour ce [que|qu’] [j’|tu] en [sais|savais]
    pour couronner le tout
    pour [de|d’] bon
    pour faire bonne mesure
    pour faire simple
    pour la plupart
    pour la suite
    pour [le|l’] [mieux|moment|moins]
    pour [le|l’] meilleur et pour [le|l’] pire
    pour l’ amour du ciel
    pour l’ [essentiel|instant|heure]
    pour quelque part
    pour >raison [de|d’] santé ?[défaillante|déficiente|fragile]¿
    pour rien au monde
    pour tout dire
    pour un oui ou pour un non
    pour une bonne part
    pour y parvenir
    pour ça [vaut|valait]
    pourtant

    presque
    primo
    quand bien même
    quand bon [me|te|lui|nous|vous|leur] [semble|semblera|semblait]
    quant à [ça|cela|ceci]
    qu’ à cela ne tienne
    [que|qu’] [ça|ceci|cela] [me|te|lui|leur|nous|vous] plaise ou non
    ##
    [que|qu’] je [le|l’] veuille ou non
    [que|qu’] tu [le|l’] veuilles ou non
    qu’ [il|elle|on|iel] [le|l’] veuille ou non
    [que|qu’] vous [le|l’] vouliez ou non
    [que|qu’] nous [le|l’] voulions ou non
    qu’ [ils|elles|iels] [le|l’] veuillent ou non
    ##
    [que|qu’] [je|j’] m’ en réjouisse ou que [je|j’] le déplore
    [que|qu’] tu t’ en réjouisses ou que tu le déplores
    qu’ [il|elle|iel|on] s’ en réjouisse ou qu’ [il|elle|iel|on] le déplore
    [que|qu’] nous nous en réjouissions ou que nous le déplorions
    [que|qu’] vous vous en réjouissez ou que vous le déploriez
    qu’ [ils|elles|iels] s’ en réjouissent ou qu’ [ils|elles|iels] le déplorent
    ##
    quel qu’ en soit [le|l’] [moyen|prix|danger]
    quel qu’ en soit [le|l’] risque ?[économique|financier|légal|juridique|militaire]¿
    quelle qu’ en soit la [cause|raison]
    quelque peu
    ?[de|d’]¿ quelque part
    qui plus est
    quoi qu’ il [arrive|arrivât|advienne|advînt]
    quoi qu’ il soit [arrivé|advenu]
    quoi qu’ il en [coûte|coûtât|coute|coutât]
    ric et rac
    rien [que|qu’] d’ y penser
    sauf >erreur [de|d’] [ma|ta|sa|notre|votre|leur] part
    sans ?grand¿ succès
    sans [broncher|déconner|réagir|tarder]
    sans [ambages|arrêt|cesse|conteste|doute|encombre|encombres|équivalent|fin|relâche|répit|trêve|vergogne]
    sans [grande|grosse] difficulté ?[apparente|aucune|financière|majeure|particulière]¿
    sans aucun doute
    sans autre forme [de|d’] procès
    sans commune mesure
    sans contredit
    sans coup férir
    sans crier gare
    sans difficulté ?[apparente|aucune|financière|majeure|particulière]¿
    sans dire mot
    sans en avoir conscience
    sans >état d’ âme
    sans [m’|t’|s’|nous|vous] en apercevoir
    sans [m’|t’|s’|nous|vous] en rendre compte
    sans [me|m’|te|t’|se|s’|nous|vous] faire [attendre|avoir|comprendre|désirer|entendre|prier|remarquer|repérer|surprendre|voir]
    sans [me|m’|te|t’|se|s’|nous|vous] douter [de|d’] rien
    sans faire [de|d’] vagues
    sans foi ?,¿ ni loi
    sans grand résultat
    sans [le|l’] faire exprès
    sans [le|l’] vouloir
    sans l’ aide [de|d’] personne
    sans l’ ombre d’ un doute
    sans mot dire
    sans nul doute
    sans perdre [de|d’] temps
    sans pour autant y [parvenir|réussir|réfléchir|songer|penser]
    sans pour autant y [faire|prêter] attention
    sans pour autant y prendre [garde|goût|gout]
    sans [me|m’|te|t’|lui|nous|vous|leur|y] prêter attention
    sans [que|qu’] je [le|l’] [sache|susse]
    sans [que|qu’] tu [le|l’] [saches|susses]
    sans [que|qu’] [il|elle|on|$:M] [le|l’] [sache|sût]
    sans [que|qu’] nous [le|l’] [sachions|sussions]
    sans [que|qu’] vous [le|l’] [sachiez|sussiez]
    sans [que|qu’] [ils|elles|iels] [le|l’] [sachent|sussent]
    sans s’ en rendre compte
    sans que [je|j’] m’ en [rende|rendisse] compte
    sans que tu t’ en [rendes|rendisses] compte
    sans qu’ [il|elle|on|iel] s’ en [rende|rendît] compte
    sans que nous nous en [rendions|rendissions] compte
    sans que vous vous en [rendions|rendissiez] compte
    sans qu’ [ils|elles|iels] s’ en [rendent|rendissent] compte
    sans queue ni tête
    sans précédent
    sans raison apparente
    sans résultat probant
    sans tambour ?,¿ ni trompette
    sans [croiser|rencontrer|voir] personne
    sans [croiser|rencontrer|voir] âme qui vive
    sans ?jamais¿ [ciller|flancher|tergiverser]
    sans vouloir [me|m’|te|t’|lui|nous|vous|leur] manquer [de|d’] respect
    sans y [croire|parvenir|réussir|réfléchir|songer|penser]
    sans y [faire|prêter] attention
    sans y prendre [garde|goût|gout|ombrage]
    secondo
    selon toute [apparence|vraisemblance]
    sens dessus dessous
    sens devant derrière
    >seul à >seul
    s’ il le [faut|fallait|fallut|faudra|faudrait]
    s’ il l’ [a|avait|eut|aura|aurait] fallu
    si [bas|haut|longtemps|nécessaire|peu|possible|soudain]
    si [cela|ça|ceci] ne tenait qu’ à [moi|toi|lui|eux|elle|elles|nous|vous|iel|iels]
    si besoin est
    si le besoin s’ en [fait|faisait] sentir
    si le besoin [doit|devait] s’en faire sentir
    si tel est le cas
    si tant est que ce ?[ne|n’]¿ [soit|fût] ?pas¿ @:A.*:[me]:[si]
    sine qua non
    sitôt dit ?,¿ sitôt fait
    six pieds sous terre
    soi-disant
    soit dit en passant
    sous aucun prétexte
    sous bonne [escorte|garde]
    sous coupe réglée
    sous haute [surveillance|tension]
    stricto sensu
    sur [mon|ton|son|notre|votre|leur] [trente-et-un|31]
    sur [mon|ton|son|notre|votre|leur] trente et un
    sur ce ,
    sur ce plan-là
    sur la défensive
    sur le devant [de|d’] la scène
    sur la forme comme sur le fond
    sur la même longueur d’ onde
    sur la sellette
    sur le fil du rasoir
    sur le plan [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    sur le pied [de|d’] guerre
    sur le qui-vive

    surtout
    s’ il [te|vous] [plaît|plait]
    tant bien que mal
    tant s’ en faut
    tantôt
    tertio
    tour à tour
    tous comptes faits
    tous ensemble
    tous frais payés
    tout [bonnement|simplement]
    tout au plus
    tout aussi bien
    tout bien [considéré|réfléchi|pesé]
    tout compte fait
    tout [de|d’] même ?[pas|jamais]¿
    tout du long
    tout feu ?,¿ tout >flamme
    tout à fait
    tout [de|d’] go
    toute honte bue
    toutes choses égales par ailleurs
    toutes ensemble
    toutes griffes dehors
    toutes proportions gardées
    toutes voiles dehors
    trait pour trait
    tremblant de tout [mon|ton|son|notre|votre|leur] corps
    très ?[bas|haut|bien|mal]¿
    un à un
    une à une
    un petit peu
    un peu
    un peu mieux
    un peu moins bien
    un peu partout
    un tant soit peu
    un tout petit peu
    urbi et orbi
    vaille que vaille
    ventre à terre
    vers nulle part
    vite fait ?,¿ bien fait

    volontiers
        <<- ~>> *


__purge_l_un_l_autre_les_uns_les_autres__
    à l’ un et ?à¿ l’ autre ?>sexe¿
    à l’ un comme à l’ autre ?>sexe¿
................................................................................
    village [après|par] village
    voiture [après|par] voiture
    wagon [après|par] wagon
        <<- not morph(<1, ":D") ~>> *


__gestion_mots_grammaticaux__
    à [bord|bout|charge|cause|contre-courant|côté|défaut|destination|disposition|distance|droite]                       [de|du|d’|des]
    à [flanc|gauche|hauteur|mesure|mi-chemin|portée|proximité|propos|raison|rebours]                                    [de|du|d’|des]
    à [compter|partir]                                                                                                  [de|du|d’|des]
    à [base|concurrence|court|titre]                                                                                    [de|d’]
    à [bonne|faible|grande] distance                                                                                    [de|du|d’|des]
    à peu [de|d’] distance                                                                                              [de|du|d’|des]
    à l’ [abri|adresse|affût|affut|approche|arrière|attention|aune|aulne|avant]                                         [de|du|d’|des]
    à l’ [écart|égal|égard|encontre|endroit|entour|épreuve|est|exception|exclusion|exemple|extérieur]                   [de|du|d’|des]
    à l’ [imitation|insu|instar|instigation|intension|intérieur|inverse|issue|occasion|ombre|opposé|orée|ouest|unisson] [de|du|d’|des]
    à l’ autre bout                                                                                                     [de|du|d’|des]
    à la [barbe|différence|faveur|hauteur|lumière|manière|merci|portée|proximité|recherche|suite|tête|vue]              [de|du|d’|des]
    à la grande surprise                                                                                                [de|du|d’|des]
    à [quelques|plusieurs] [mètres|kilomètres|lieues|pas|minutes|heures]                                                [de|du|d’|des]
    à [quelques|plusieurs] [dizaines|centaines|milliers] [de|d’] [mètres|kilomètres]                                    [de|du|d’|des]
    à [base|force|raison]                                                                                               [de|d’]
    à grand renfort                                                                                                     [de|d’]
    à grands coups                                                                                                      [de|d’]
    au [bénéfice|bord|bout|chevet|contraire|courant|côté|cours|début|détour|détriment|fil|fond|gré|hasard|large|lieu]   [de|du|d’|des]
    au [long|mépris|moyen|nord|préjudice|profit|ras|rebours|regard|sein|secours|sommet|sud|sujet|travers|voisinage|vu]  [de|du|d’|des]
    ?d’¿ au ?beau¿ milieu                                                                                               [de|du|d’|des]
    au fin fond                                                                                                         [de|du|d’|des]
    au grand [dam|désespoir]                                                                                            [de|du|d’|des]
    au plus [près|profond]                                                                                              [de|du|d’|des]
    au fur et à mesure                                                                                                  [de|du|d’|des]
    au lieu et place                                                                                                    [de|du|d’|des]
    au vu et ?au¿ su                                                                                                    [de|du|d’|des]
    au nez et à la barbe                                                                                                [de|du|d’|des]
    au secours                                                                                                          [de|du|d’|des]
    au sortir                                                                                                           [de|du|d’|des]
    aux [abords|côtés|dépens]                                                                                           [de|du|d’|des]
    aux [dizaines|douzaines|vingtaines|centaines|milliers|millions|milliards|trillions|trilliards]                      [de|d’]
    aux [dizaines|douzaines|vingtaines|centaines|milliers|millions|milliards|trillions|trilliards]
        || [de|d’] [milliers|millions|milliards|trillions|trilliards]                                                   [de|d’]
    aux bons soins                                                                                                      [de|du|d’|des]
    aux lieu et place                                                                                                   [de|du|d’|des]
    compte tenu                                                                                                         [de|du|d’|des]
    d’ un bout à l’ autre                                                                                               [de|du|d’|des]
    dans l’ [attente|éventualité]                                                                                       [de|du|d’|des]
    dans la ligne de mire                                                                                               [de|du|d’|des]
    dans le sillage                                                                                                     [de|du|d’|des]
    des [quatre|4] coins                                                                                                [de|du|d’|des]
    en [arrière|attente|amont|arrière|aval|avant|bas|cas|conséquence|considération|cours|deçà|dehors|dépit|direction|face|faveur|fonction|haut|marge]  [de|du|d’|des]
    en [mémoire|possession|présence|pproportion|provenance|quête|raison|surplomb|sus|tête|termes|travers|vertu|vue]     [de|du|d’|des]
    en [ma|ta|sa|notre|votre|leur] qualité                                                                              [de|d’]
    en dépit de la proximité                                                                                            [de|du|d’|des]
    en [comparaison|forme|guise|matière|qualité|signe]                                                                  [de|d’]
    en flagrant délit                                                                                                   [de|d’]
    en [hommage|proie|réaction]                                                                                         [à|au|aux]
    en l’ [absence|attente|honneur]                                                                                     [de|du|d’|des]
    en lieu et place                                                                                                    [de|du|d’|des]
    en plein milieu                                                                                                     [de|du|d’|des]
    le long                                                                                                             [de|du|d’|des]
    jusqu’ à concurrence                                                                                                [de|d’]
    par égard                                                                                                           pour
    par le biais                                                                                                        [de|du|d’|des]
    par l’ [entremise|intermédiaire]                                                                                    [de|du|d’|des]
    par [manière|manque]                                                                                                [de|d’]
    par [crainte|habitude|suite]                                                                                        [de|du|d’|des]
    pour le compte                                                                                                      [de|du|d’|des]
    sans distinction                                                                                                    [de|d’]
    sans parler                                                                                                         [de|du|d’|des]
    sous l’ aile                                                                                                        [de|du|d’|des]
    sous l’ œil attentif                                                                                                [de|du|d’|des]
    sous la [coupe|houlette]                                                                                            [de|du|d’|des]
    sous le [coup|couvert|nez]                                                                                          [de|du|d’|des]
    sous [couleur|couvert|forme]                                                                                        [de|d’]
    sur les talons                                                                                                      [de|du|d’|des]
        <<- ~1:-2>> ␣
        <<- =>> define(\1, ":G:R:ÉR")

    tout au [bout|long] [de|du|d’|des]
        <<- not morph(<1, ":R") ~1>> *

    à travers $:D
    à travers >différent
        <<- ~1:2>> ␣
        <<- =>> define(\1, ":G:R:ÉR")

    ainsi
        <<- not value(>1, "|que|qu’|") ~>> *

    alentour
        <<- not morph(<1, ":D") ~>> *

    au moins  @:[DB]
................................................................................
    pas [assez|trop]
        <<- not morph(<1, ":D.*:(?:m:s|[me]:p)") ~1>> *

    pour  toujours  @:[AQ]
        <<- ~1:2>> *


__purge_adverbes__
    [assez|trop]  ~ment$
        <<- morph(\2, ":W", ":3p") ~>> *

    @:[NAQ]  [le|la]  [plus|moins]  ~.ment$  $:A
        <<- morph(\-2, ":W", ":A") ~2:-2>> *

    complètement
................................................................................
TEST: Il n’y avait plus qu’à faucher le blé noir, arracher les pommes de terre et gauler noix et châtaignes ; de ceci les gamins se chargeaient le jeudi et le dimanche, pour se distraire.
TEST: Les études révèlent un risque d’écrêtement du trafic ferroviaire dès 2025, lorsque la demande est la plus critique, c’est-à-dire le vendredi soir à l’heure de pointe.
TEST: Beaucoup de conciles émaneront des normes pour que soient nommés des curés idoines, qui soient vraiment au service de la paroisse, qui se distinguent par leur science et qui soient de vrais pasteurs au sein de la communauté de fidèles.
TEST: Les ailes de cet avion viennent de Grande-Bretagne.
TEST: La liberté passait sur le monde, l’internationale était sa voix criant par-dessus les frontières les revendications des déshérités.
TEST: La danse est d’ailleurs en ce sens salvatrice.
TEST: La gauche a fait main basse sur la plupart des villes vaudoises, les Verts bondissent aux législatifs.




@@@@
@@@@
@@@@
@@@@
................................................................................
        <<- /conf/ -3>> nues                                    && Confusion. Écrivez “nues” (ancien terme pour “nuages”).|https://fr.wiktionary.org/wiki/tomber_des_nues

TEST: Elle en est tombée des {{nus}}.                           ->> nues


# numérique / digital
__conf_numérique_digital__
    [>agence|>appareil|>banque|>caméra|>colonie|>colonisation|>communication|>compagnie|>connexion|>économie|>entreprise|>ère|>expérience|>identité|>industrie|>présence|>prise|>service|>solution|>stratégie|>télévision|>transformation|>transition] >digital


        <<- /conf/ -2>> numérique|numériques
        && Confusion : “digital” est un adjectif se rapportant aux doigts (empreinte digitale, arthrose digitale, etc.). Écrivez “numérique”.

    [le|du|au] digital
        <<- /conf/ -2>> numérique
        && Confusion : “digital” est un adjectif se rapportant aux doigts (empreinte digitale, arthrose digitale, etc.). Écrivez “numérique”.

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

TEST: deux femmes, {{blessé}} par deux fois                                                 ->> blessées
TEST: trois hommes, {{blessée}} dans leur orgueil                                           ->> blessés


__gn_des_2m__
    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: à {{grande}} {{enjambées}}                                ->> grandes|||enjambée
TEST: pour {{grande}} {{appartement}}                           ->> grand|||
TEST: une femme sans a priori


__gn_pfx_de_2m__
    [de|d’]  @:[NA]¬:[YG]  @:[NA]¬*

        <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) )
            and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/")
        -3>> =switchGender(\3)                                                                      && Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 && Accord de genre erroné avec « \3 ».
        <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) )
            and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/")
        -3>> =switchPlural(\3)                                                                      && Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    && Accord de nombre erroné avec « \3 ».

TEST: Ils ont de {{grandes}} {{oreille}}                        ->> grande|||oreilles
TEST: de {{grands}} {{homme}}                                   ->> grand|||hommes
TEST: de {{petite}} {{homme}}                                   ->> petit|||
TEST: de {{pousse}} {{actif}}                                   ->> poussé|||active
................................................................................

    à deux doigts                               [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “à deux doigts de”, le verbe devrait être à l’infinitif.

    à >seul >fin                                [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “à seule fin de”, le verbe devrait être à l’infinitif.

    aulieu                                     [de|d’]  ?[le|les|nous|vous|lui]¿             ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “au lieu de”, le verbe devrait être à l’infinitif.

    aulieu                                     [de|d’]  [l’|la|leur]                         ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":[MN]") --1>> =suggVerbInfi(\-1)                       && Après “au lieu de”, le verbe devrait être à l’infinitif.

    >avoir l’ air                               [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “avoir l’air de”, le verbe devrait être à l’infinitif.

    >avoir la chance                            [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “avoir la chance de”, le verbe devrait être à l’infinitif.
................................................................................
    de  [la|l’|leur]  @:[NA]¬:Y  <end>
    de  [la|l’|leur]  @:[NA]¬:Y  ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    de  [la|l’|leur]  @:[NA]¬:Y  @:[VR]¬:[NAP]
    de  [la|l’|leur]  @:[NA]¬:Y  , @¬:[NA]
    de  [la|l’|leur]  @:[NA]¬:Y  ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:3>> *

    $:ÉR [de|d’]  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  <end>

    $:ÉR [de|d’]  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    $:ÉR [de|d’]  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  @:[VR]¬:[NAP]


    $:ÉR [de|d’]  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  , @¬:[NA]
    $:ÉR [de|d’]  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:4>> *

    $:ÉR [des|du|de|d’] @:[NA] <end>
    $:ÉR [des|du|de|d’] @:[NA] ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    $:ÉR [des|du|de|d’] @:[NA] @:[VR]¬:[NAP]
    $:ÉR [des|du|de|d’] @:[NA] , @¬:[NA]
    $:ÉR [des|du|de|d’] @:[NA] ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:3>> *





    en [plein|pleine] @:[NA]  <end>
    en [plein|pleine] @:[NA]  ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    en [plein|pleine] @:[NA]  @:[VR]¬:[NAP]
    en [plein|pleine] @:[NA]  , @¬:[NA]
    en [plein|pleine] @:[NA]  ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:3>> *
................................................................................


    [<start>|,|(]  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  vas
    [<start>|,|(]  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          vas
    [<start>|,|(]  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              vas
    [<start>|,|(]  [ne|n’]  [lui|leur]               en                           vas
    [<start>|,|(]  vas
        <<- /imp/ not value(>1, "|tu|") --1>> va                                   && S’il s’agit d’un impératif, pas de “s”.

TEST: {{Vas}} lui mettre une branlée.                                                       ->> Va
TEST: {{Vas}} au diable !                                                                   ->> Va
TEST: N’y {{vas}} pas                                                                       ->> va
TEST: Si vraiment tu es d’attaque et que Martine est d’accord, {{vas}} dans…                ->> va
TEST: — Va-t’en ! [Firefox]

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

# verbes du 1ᵉʳ et du 3ᵉ groupe en -e
__imp_verbe_groupe1__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+es$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+es$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+es$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+es$
        <<- /imp/ morph(\-1, ":V[13].*:Ip.*:2s", ":G") and not value(>1, "|tu|")
        --1>> =\-1[:-1]                                                             && S’il s’agit d’un impératif, pas de “s”.

    <start>  ~\w\w+es$
        <<- /imp/ morph(\-1, ":V[13].*:Ip.*:2s", ":[GNAM]") and not value(>1, "|tu|")
        --1>> =\-1[:-1]                                                             && S’il s’agit d’un impératif, pas de “s”.

TEST: {{Apportes}} ton fric à cet homme.                                                    ->> Apporte
TEST: N’{{abandonnes}} pas si vite.                                                         ->> abandonne
TEST: Ne {{demandes}} rien, tais-toi.                                                       ->> demande
TEST: — {{Abandonnes}}.                                                                     ->> Abandonne
TEST: {{Écartes}} de moi cette coupe.                                                       ->> Écarte
................................................................................

# verbes du 2ᵉ et du 3ᵉ groupe en -t
__imp_verbe_groupe2_groupe3_t__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+t$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+t$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+t$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+t$
        <<- /imp/ not value(>1, "|il|elle|on|ils|elles|iel|iels|")
            and not value(\-1, "|provient|")
            and not (value(\-1, "|vient|dit|surgit|survient|périt|") and morph(>1, ":(?:[MD]|Oo)|>[A-Z]/"))
            and morph(\-1, ":V[23].*:Ip.*:3s", ":G|>(?:devoir|suffire|para[îi]tre)/") and analyse(\-1[:-1]+"s", ":E:2s")
        --1>> =\-1[:-1]+"s"                                                         && S’il s’agit d’un impératif, la terminaison est “s”, non “t”.

    <start>  ~\w\w+t$
        <<- /imp/ not value(>1, "|il|elle|on|ils|elles|iel|iels|")
            and not value(\-1, "|provient|")
            and not (value(\-1, "|vient|dit|surgit|survient|périt|") and morph(>1, ":(?:[MDR]|Oo)|>[A-Z]/"))
            and morph(\-1, ":V[23].*:Ip.*:3s", ":[GNA]|>(?:devoir|suffire|para[îi]tre)/") and analyse(\-1[:-1]+"s", ":E:2s")
        --1>> =\-1[:-1]+"s"                                                         && S’il s’agit d’un impératif, la terminaison est “s”, non “t”.

TEST: {{Finit}} ton assiette.                                           ->> Finis
TEST: Ne {{pourrit}} pas l’ambiance.                                    ->> pourris
................................................................................

# verbes du 3ᵉ groupe en -d
__imp_verbe_groupe3_d__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+d$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+d$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+d$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+d$
        <<- /imp/ not value(>1, "|il|elle|on|")
            and not ( value(\-1, "|répond|") and (morph(>1, ":[MD]|>[A-Z]/") or value(>1, "|l’|d’|")) )
            and morph(\-1, ":V3.*:Ip.*:3s", ":G")
        --1>> \-1s                                                                  && S’il s’agit d’un impératif, ajoutez un “s”.

    <start>  ~\w\w+d$
        <<- /imp/ not value(>1, "|il|elle|on|")
            and not ( value(\-1, "|répond|") and (morph(>1, ":[MD]|>[A-Z]/") or value(>1, "|l’|d’|")) )
            and morph(\-1, ":V3.*:Ip.*:3s", ":[GNA]")
        --1>> \-1s                                                                  && S’il s’agit d’un impératif, ajoutez un “s”.

TEST: {{Prend}} le chemin de droite.                                    ->> Prends
TEST: N’{{attend}} pas qu’elle vienne.                                  ->> attends
TEST: Ne me {{prend}} pas pour un idiot                                 ->> prends
TEST: Ne l’{{attend}} pas                                               ->> attends
TEST: Ne m’y {{attend}} pas                                             ->> attends
TEST: {{Attend}} la correction.                                         ->> Attends
TEST: {{Répond}}.                                                       ->> Réponds
TEST: — Pour ma part, répond P., je crois que tout va bien.



!!
!!
!!!! Impératif : traits d’union manquants                                                         !!
!!
!!
................................................................................

    ## _VCOD_
    [ne|n’] [le|l’|la|les] ?[lui|leur]¿                 @:V¬:[GQ]
    [ne|n’] [nous|vous] [le|l’|la|les]                  @:V¬:[GQ]
    [je|tu|il|ils|me|m’|te|t’|se|s’] [le|l’|la|les]     @:V¬:[GQ]
    [le|l’|la|les]                                      @:V¬:[GNAWQTML]
        <<- /-1>> _VCOD_




    [elle|elles|iel|iels|nous|vous]  [le|l’|la|les]    @:V¬:[GQ]
        <<- not morph(<1, ":R") /-1>> _VCOD_


__purge_préverbes2__
    nous              [le|la|l’|les|en|y]  @:(?:[123][sp]|P|Y)¬:(?:X|1p)
................................................................................

    >attendre  [que|qu’]  [les|ces|mes|tes|ses|nos|vos|leurs|plusieurs|quelques|certains|certaines|maints|maintes]   @:N.*:[pi]  @:I¬:[GYSA]
        <<- /vmode/ not morph(\1, ":Q") --1>> =suggVerbMode(\-1, ":S", ":3p")                       && Après “attendre que”, ce verbe devrait être au subjonctif.

TEST: j’attends que tu {{viens}}.                                                   ->> viennes|vinsses
TEST: Attends que Céline {{dort}}                                                   ->> dorme|dormît
TEST: nous attendions que les petits {{étaient}} partis                             ->> soient|fussent|étayent|étayassent



__vmode_il_importe_que_subjonctif__
    il  >importer  [que|qu’]  [je|j’|tu|il|elle|iel|nous|vous|ils|elles|iels]  @:I¬:[GYS]
        <<- /vmode/ --1>> =suggVerbMode(\-1, ":S", \-2)                                             && Après le syntagme “il importe que”, ce verbe devrait être au subjonctif.

    il  >importer  [que|qu’]  $:M  @:I¬:[GYS]







>







 







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







 







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










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







 







|



|







 







>







>
>

>




>







 







>







 







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







 







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







 







>







 







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

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


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

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


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

>


>
>

>





>





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







 








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











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



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

<
<
<

<
<
<







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


<

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

<
<
<
<
<



<
<
<
<
<
<
<

<
<
<
<
<

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


<

<
<
<
<
<
<
<
<
<

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

<
<
<
<
<
<

<
<
<
<
<
<
<
<

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

>


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

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
>

<
<
<


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
>







 







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



<
<
<
<
<







 







|







 







>







 







|
>
>







 







|







 







>
|
<


|
<







 







|


|







 







|
>
|
|
>
>
|
|
|

|
|
|
<
|
|
>
>
>
>







 







|







 







|



|







 







|






|







 







|





|












>







 







>
>
>







 







>







428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
....
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
....
1691
1692
1693
1694
1695
1696
1697














1698
1699
1700
1701
1702
1703
1704
1705
1706
1707








































1708
1709
1710
1711
1712
1713
1714
....
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
....
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
....
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
....
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
....
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
....
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
.....
17978
17979
17980
17981
17982
17983
17984






















17985























































































































































































































































































































































































































































































































































































































































































































































17986




























































17987
17988
17989















17990

































17991
17992

17993
17994
17995









17996








































































































17997
17998
17999
18000
18001
18002
18003
18004
18005
18006
18007
18008
18009
18010
18011
18012
18013
18014
18015






























































































































18016
18017
18018
18019
18020
18021
18022
.....
18028
18029
18030
18031
18032
18033
18034
18035

































18036
18037
18038
18039
18040
18041
18042
18043
18044
18045
18046













































18047













































































































































































































































18048
18049
18050













































18051






























18052



18053



18054
18055
18056
18057
18058
18059
18060












































































































































































































18061
18062

18063



































































































































































18064





18065
18066
18067







18068





18069











18070









18071

18072
18073
18074
18075
18076
18077
18078
18079

















18080









18081
18082

18083









18084

































18085






18086








18087

































18088
18089
18090
18091










































































































18092



















18093
18094



18095
18096





































18097
18098
18099
18100
18101
18102
18103
18104
.....
18221
18222
18223
18224
18225
18226
18227






































































18228
18229
18230





18231
18232
18233
18234
18235
18236
18237
.....
20113
20114
20115
20116
20117
20118
20119
20120
20121
20122
20123
20124
20125
20126
20127
.....
21127
21128
21129
21130
21131
21132
21133
21134
21135
21136
21137
21138
21139
21140
21141
.....
23267
23268
23269
23270
23271
23272
23273
23274
23275
23276
23277
23278
23279
23280
23281
23282
23283
.....
25902
25903
25904
25905
25906
25907
25908
25909
25910
25911
25912
25913
25914
25915
25916
.....
26825
26826
26827
26828
26829
26830
26831
26832
26833

26834
26835
26836

26837
26838
26839
26840
26841
26842
26843
.....
28430
28431
28432
28433
28434
28435
28436
28437
28438
28439
28440
28441
28442
28443
28444
28445
28446
28447
.....
29761
29762
29763
29764
29765
29766
29767
29768
29769
29770
29771
29772
29773
29774
29775
29776
29777
29778
29779
29780

29781
29782
29783
29784
29785
29786
29787
29788
29789
29790
29791
29792
29793
.....
32840
32841
32842
32843
32844
32845
32846
32847
32848
32849
32850
32851
32852
32853
32854
.....
32855
32856
32857
32858
32859
32860
32861
32862
32863
32864
32865
32866
32867
32868
32869
32870
32871
32872
32873
.....
32879
32880
32881
32882
32883
32884
32885
32886
32887
32888
32889
32890
32891
32892
32893
32894
32895
32896
32897
32898
32899
32900
.....
32923
32924
32925
32926
32927
32928
32929
32930
32931
32932
32933
32934
32935
32936
32937
32938
32939
32940
32941
32942
32943
32944
32945
32946
32947
32948
32949
32950
32951
32952
32953
32954
32955
32956
.....
33862
33863
33864
33865
33866
33867
33868
33869
33870
33871
33872
33873
33874
33875
33876
33877
33878
.....
35803
35804
35805
35806
35807
35808
35809
35810
35811
35812
35813
35814
35815
35816
35817
    [)]\b(?![s¹²³⁴⁵⁶⁷⁸⁹⁰]\b)
        <<- not before("\\((?:[rR][eéEÉ]|[qQ][uU]’|[nNmMtTsSdDlL]’)$") ->> ") "                               && Il manque un espace après la parenthèse.
__<s>/typo(typo_parenthèse_ouvrante_collée)__
    \b[(](?=[^)][^)][^)])
        <<- ->> " ("                                                                                && Il manque un espace avant la parenthèse.

TEST: C’est au fond du couloir{{(}}celui du deuxième étage{{)}}qu’il se trouve.     ->> " (|||) "
TEST: de gain différentiel 𝐴 (𝑉ᵣ = 𝐴·𝑣H{{)}}et associé                              ->> ") "
TEST: (a + b)²
TEST: il faut (re)former tout ça.
TEST: il (n’)est (qu’)ingénieur


# Points et espaces
__<s>/typo(typo_point_entre_deux_espaces)__      [  ][.](?=[  ])  <<- ->> .                         && Pas d’espace avant un point.
................................................................................

TEST: « Je suis donc perdu ? », dit Paul.
TEST: “C’est bon !”, croit savoir Marie.
TEST: “Parce que… ?” finit par demander Paul.
TEST: « Dans quel pays sommes-nous ? » demanda un manifestant.


!!!! Purge des références aux notes                                                               !!

# les références aux notes
__<s>(p_exposants)__
    [¹²³⁴⁵⁶⁷⁸⁹⁰]+
        <<- ~>> *

__[i](p_références_aux_notes)__
    ({w_2})(\d+)  @@0,$
        <<- not morph(\0, ":") and morph(\1, ":") ~2>> *

TEST: POLITIQUESOCIÉTÉÉCONOMIEMONDECULTUREART DE VIVREMAGAZINE (qui peut faire boguer JavaScript avec certaines regex)


!!!! Normalisation du “t” euphonique                                                              !!

__<i]/tu(tu_t_euphonique_incorrect)__
    ([-–—− ]t(?:[’' ][-–—−]?|[-–—−][’' ]?))(ie?ls?|elles?|on|tu)  @@0,$
        <<- re.search("(?i)^(?:ie?ls|elles|tu)$", \2) -1>> -    && Le “t” euphonique n’est pas nécessaire avec “\2”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
        <<- __else__ and \1 != "-t-" and \1 != "-T-" -1>> -t-   && Pour le “t” euphonique, il faut deux traits d’union. Pas d’apostrophe. Pas d’espace.
        <<- \1 != "-t-" ~1>> -t-
__<i]/tu(tu_t_euphonique_superflu)__
    [td]([- ]t[-’' ])(?:ie?l|elle|on)  @@1
        <<- -1>> -                                              && Le “t” euphonique est superflu quand le verbe se termine par “t” ou “d”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
        <<- \1 != "-t-" ~1>> -t-
__<i]/eleu(eleu_t_euphonique_manquant)__
    [aec](-(ie?l|elle|on))  @@1,2  <<- -1>> -t-\2               && Euphonie. Il faut un “t” euphonique.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513

TEST: va{{ t’}}il y parvenir ?                          ->> -t-
TEST: A{{ t’}}elle soif ?                               ->> -t-
TEST: A{{ t-}}elle faim ?                               ->> -t-
TEST: a{{ t'}}elle                                      ->> -t-
TEST: a{{-t'}}il                                        ->> -t-
TEST: a{{-t }}il.                                       ->> -t-
TEST: a{{ t’}}il.                                       ->> -t-
TEST: a{{ t-}}on.                                       ->> -t-
TEST: donne{{ t-}}il                                    ->> -t-
TEST: donne{{-t }}il                                    ->> -t-
TEST: vient{{-t-}}il                                    ->> -
TEST: viendras{{-t-}}tu                                 ->> -
TEST: Viendront{{ t-}}ils                               ->> -
TEST: viennent{{ t-}}ils                                ->> -
TEST: mangent{{-t-}}elles                               ->> -
TEST: Ont{{ t’}}ils                                     ->> -
TEST: Ont{{-t’}}ils                                     ->> -
TEST: l’ont{{ t’}}ils vu ?                              ->> -
TEST: exploite{{−t−}}il les ressources numériques       ->> -t-
TEST: vainc{{-il}} ses ennemis aisément                 ->> -t-il
TEST: Assis, gronde{{-t -}}elle                         ->> -t-
TEST: vient-il demain ?
TEST: prend-elle l’avantage ?
TEST: saura-t-on jamais la vérité ?
TEST: arrive-t-elle ce matin ?
TEST: y aura-t-il du poulet au dîner ?



!!
!!
!!
!!
!!
................................................................................
__[s]/num(num_lettre_O_zéro1)__  [\dO]+[O][\dO]+ <<- not option("ocr") ->> =\0.replace("O", "0")    && S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             && S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                        ->> 2011
TEST: {{3O}} (chiffre avec un O).                                           ->> 30

















!!!! Traits d’union                                                                               !!

__[i]/tu(tu_trait_union_douteux)__
    ({w1})(?:--|—|–|−|⁃)({w1})  @@0,$
    <<- spell(\1+"-"+\2) and analyse(\1+"-"+\2, ":") ->> \1-\2                                      && Trait d’union : un tiret simple suffit.

TEST: Nous préparons une {{contre–attaque}}.                    ->> contre-attaque
TEST: Nous préparons une {{contre−attaque}}.                    ->> contre-attaque











































@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: graphe0|g0                                                                              _
................................................................................


__purge_punc_début_phrase__
    <start>  [?|!|:|;|…|‘|’|'|¿|¡]
        <<- ~2>> *

    <start>  [-|–|—]  ?[-|–|—]¿
        <<- /2>> _tiret1_
        <<- ~2>> *

    <start>  [•|·|.]
        <<- /2>> _puce1_
        <<- ~2>> *


__purge_fin_phrase__
    [.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]  ?[.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]¿  ?[.|…|?|!|:|;|–|—|•|·|…|«|»|‘|’|“|”|"|'|¿|¡|-]¿  <end>
        <<- ~1:-2>> *

................................................................................
__purge_mot_nombre_parenthèses_crochets_accolades__
    (  [*WORD|*NUM]  )
    {  [*WORD|*NUM]  }
        <<- ~>> *

    ( … )
        <<- ->> […]                 && Pour indiquer une troncature de texte, on utilise usuellement des crochets.
        <<- />> _CUT_
        <<- ~>> *

    (  [re|ré]  )  *WORD
    [  [re|ré]  ]  *WORD
        <<- space(<1, 1) and space(\3, 0, 0) ~1:3>>  *

    [  *NUM  ]
        <<- ~>> *

    [  …  ]
        <<- />> _CUT_
        <<- ~>> *

    [  *WORD  ]
        <<- space(<1, 1, 3) and space(\-1, 1, 3) >>>
        <<- />> _CUT_
        <<- morph(\2, ":G") ~>> |\2|
        <<- __else__ ~>> *

    ## chapitres, références
    (  [*WORD|*NUM]  ,  *NUM  )
    [  [*WORD|*NUM]  ,  *NUM  ]
    {  [*WORD|*NUM]  ,  *NUM  }
................................................................................
    contre [moi|toi|soi|lui|elle|iel|nous|vous|eux|elles|iels]
        <<- =>> select(\1, ":R")

    [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+s|>ratonnade|>sortilège|>violence]    ?$:A¬:G¿  contre
    [>antidote|>crime|>philtre|>remède|>sérum|>vaccin|>solution]    ?$:A¬:G¿  contre
    >mandat d’ arrêt                                                ?$:A¬:G¿  contre
        <<- =>> select(\-1, ":R")

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

__da_courant__
    courant
................................................................................
__tag_ni__
    ni
        <<- />> _ni_



!!!! Fusions et immunités                                                                         !!


__locutions_prépositives__
    à [bord|bout|charge|cause|contre-courant|côté|défaut|destination|disposition|distance|droite]                       [de|du|d’|des]
    à [flanc|gauche|hauteur|mesure|mi-chemin|portée|proximité|propos|raison|rebours]                                    [de|du|d’|des]
    à [compter|partir]                                                                                                  [de|du|d’|des]
    à [base|concurrence|court|titre]                                                                                    [de|d’]
    à [bonne|faible|grande] distance                                                                                    [de|du|d’|des]
    à peu [de|d’] distance                                                                                              [de|du|d’|des]
    à l’ [abri|adresse|affût|affut|approche|arrière|attention|aune|aulne|avant]                                         [de|du|d’|des]
    à l’ [écart|égal|égard|encontre|endroit|entour|épreuve|est|exception|exclusion|exemple|extérieur]                   [de|du|d’|des]
    à l’ [imitation|insu|instar|instigation|intension|intérieur|inverse|issue|occasion|ombre|opposé|orée|ouest|unisson] [de|du|d’|des]
    à l’ autre bout                                                                                                     [de|du|d’|des]
    à la [barbe|différence|faveur|hauteur|lumière|manière|merci|portée|proximité|recherche|suite|tête|vue]              [de|du|d’|des]
    à la grande surprise                                                                                                [de|du|d’|des]
    à [quelques|plusieurs] [mètres|kilomètres|lieues|pas|minutes|heures]                                                [de|du|d’|des]
    à [quelques|plusieurs] [dizaines|centaines|milliers] [de|d’] [mètres|kilomètres]                                    [de|du|d’|des]
    à [base|force|raison]                                                                                               [de|d’]
    à grand renfort                                                                                                     [de|d’]
    à grands coups                                                                                                      [de|d’]
    au [bénéfice|bord|bout|chevet|contraire|courant|côté|cours|début|détour|détriment|fil|fond|gré|hasard|large|lieu]   [de|du|d’|des]
    au [long|mépris|moyen|nord|préjudice|profit|ras|rebours|regard|sein|secours|sommet|sud|sujet|travers|voisinage|vu]  [de|du|d’|des]
    ?d’¿ au ?beau¿ milieu                                                                                               [de|du|d’|des]
    au fin fond                                                                                                         [de|du|d’|des]
    au grand [dam|désespoir]                                                                                            [de|du|d’|des]
    au plus [près|profond]                                                                                              [de|du|d’|des]
    au fur et à mesure                                                                                                  [de|du|d’|des]
    au lieu et place                                                                                                    [de|du|d’|des]
    au vu et ?au¿ su                                                                                                    [de|du|d’|des]
    au nez et à la barbe                                                                                                [de|du|d’|des]
    au secours                                                                                                          [de|du|d’|des]
    au sortir                                                                                                           [de|du|d’|des]
    aux [abords|côtés|dépens]                                                                                           [de|du|d’|des]
    aux [dizaines|douzaines|vingtaines|centaines|milliers|millions|milliards|trillions|trilliards]                      [de|d’]
    aux [dizaines|douzaines|vingtaines|centaines|milliers|millions|milliards|trillions|trilliards]
        || [de|d’] [milliers|millions|milliards|trillions|trilliards]                                                   [de|d’]
    aux bons soins                                                                                                      [de|du|d’|des]
    aux lieu et place                                                                                                   [de|du|d’|des]
    compte tenu                                                                                                         [de|du|d’|des]
    d’ un bout à l’ autre                                                                                               [de|du|d’|des]
    dans l’ [attente|éventualité]                                                                                       [de|du|d’|des]
    dans la ligne de mire                                                                                               [de|du|d’|des]
    dans le sillage                                                                                                     [de|du|d’|des]
    des [quatre|4] coins                                                                                                [de|du|d’|des]
    en [arrière|attente|amont|arrière|aval|avant|bas|cas|conséquence|considération|cours|deçà|dehors|dépit|direction|face|faveur|fonction|haut|marge]  [de|du|d’|des]
    en [mémoire|possession|présence|pproportion|provenance|quête|raison|surplomb|sus|tête|termes|travers|vertu|vue]     [de|du|d’|des]
    en [ma|ta|sa|notre|votre|leur] qualité                                                                              [de|d’]
    en dépit de la proximité                                                                                            [de|du|d’|des]
    en [comparaison|forme|guise|matière|qualité|signe]                                                                  [de|d’]
    en flagrant délit                                                                                                   [de|d’]
    en [hommage|proie|réaction]                                                                                         [à|au|aux]
    en l’ [absence|attente|honneur]                                                                                     [de|du|d’|des]
    en lieu et place                                                                                                    [de|du|d’|des]
    en plein milieu                                                                                                     [de|du|d’|des]
    le long                                                                                                             [de|du|d’|des]
    jusqu’ à concurrence                                                                                                [de|d’]
    par égard                                                                                                           pour
    par le biais                                                                                                        [de|du|d’|des]
    par l’ [entremise|intermédiaire]                                                                                    [de|du|d’|des]
    par [manière|manque]                                                                                                [de|d’]
    par [crainte|habitude|suite]                                                                                        [de|du|d’|des]
    pour le compte                                                                                                      [de|du|d’|des]
    sans distinction                                                                                                    [de|d’]
    sans parler                                                                                                         [de|du|d’|des]
    sous l’ aile                                                                                                        [de|du|d’|des]
    sous l’ œil attentif                                                                                                [de|du|d’|des]
    sous la [coupe|houlette]                                                                                            [de|du|d’|des]
    sous le [coup|couvert|nez]                                                                                          [de|du|d’|des]
    sous [couleur|couvert|forme]                                                                                        [de|d’]
    sur les talons                                                                                                      [de|du|d’|des]
        <<- &>> :LR

    à travers $:D
    à travers >différent
        <<- =>> define(\2, ">travers/:ÉR")
        <<- &1:2>> :LR


__fusions_mots_grammaticaux__
    c’ est-à-dire
        <<- ~>> ␣
        <<- =>> setmeta(\1, "WORD")

    le ou la  *WORD
................................................................................
        <<- morph(\1, ":V") !-2>>

    soit pour soit contre
        <<- !3>>

    y [a|avait|eut|aura|aurait|eût] ?@:[WX]¿ faute
        <<- !-1>>




__purge_siècles_millénaires__
    à [compter|partir] du       [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    à [compter|partir] du       ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    ?jusqu’¿ à l’ orée du       [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    ?jusqu’¿ à l’ orée du       ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    ?jusqu’¿ au                 [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    ?jusqu’¿ au                 ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    [avant|après] le            [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    [avant|après] le            ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    au cours du                 [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    au cours du                 ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    dans le                     [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    dans le                     ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    dans le courant du          [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    dans le courant du          ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    [dès|depuis] le             [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    [dès|depuis] le             ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    du                          [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    du                          ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
    par rapport à l’            [Ier|Iᵉʳ|IId|Ind|IIᵈ|IIⁿᵈ] [siècle|millénaire]
    par rapport à l’            ~^[xXvViI]+(?:[eᵉ]|i?[èe]me)$ [siècle|millénaire]
        <<- &>> :LW;T

    ?d’¿ av ?.¿ J.-C.
    ?d’¿ avant J.-C.
    ?d’¿ avant Jésus-Christ
    ?d’¿ avant notre ère ?[industrielle|technologique]¿
        <<- &>> :LW;T

    au cours de notre ère ?[industrielle|technologique]¿
        <<- &>> :LW;T


!!!
!!!
!!! Locutions                                                                                     !!
!!!
!!!

__locutions_années__
    à [compter|partir] [de|d’] l’   an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] l’   année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] des          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à l’ orée de l’        an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’ orée de l’        année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’ orée des          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à l’                   an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à l’                   année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ aux                    années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] l’                an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] l’                année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] les               années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    au cours [de|d’] l’             an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours [de|d’] l’             année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    au cours des                    années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    dans l’                         an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans l’                         année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    dans les                        années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    dans le courant de l’           an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans le courant de l’           année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    dans le courant des             années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dès|depuis|de|d’] l’           an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’] l’           année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dès|depuis] [les|ces]          années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport à l’                an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à l’                année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport aux                 années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    à [compter|partir] du           [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] du           [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] du           [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ au                     [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au                     [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au                     [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] le                [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le                [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] le                [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dans|dès|depuis] le            [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dans|dès|depuis] le            [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dans|dès|depuis] le            [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport au                  [début|milieu] de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au                  [début|milieu] de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport au                  [début|milieu] des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    à [compter|partir] [de|d’] la   fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] la   fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’] la   fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    ?jusqu’¿ à la                   fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la                   fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la                   fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [avant|après] la                fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la                fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [avant|après] la                fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    [dans|dès|depuis|de|d’] la      fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dans|dès|depuis|de|d’] la      fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    [dans|dès|depuis|de|d’] la      fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
    par rapport à la                fin de l’ an ?[dernier|nouveau|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la                fin de l’ année ?[dernière|nouvelle|passée|précédente|prochaine|~^[0-9]{2,5}$]¿
    par rapport à la                fin des années [dernières|passées|précédentes|prochaines|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    à [compter|partir] [de|d’]  ~^[0-9]{2,5}$
    [avant|après]               ~^[0-9]{2,5}$
    [dès|depuis]                ~^[0-9]{2,5}$
    jusqu’ à                    ~^[0-9]{2,5}$
    par rapport à               ~^[0-9]{2,5}$
        <<- not morph(>1, ":N.*:p|;S") &>> :LW;T

    en  ~^[0-9]{2,5}$  [,|<end>|)]
    en  ~^[0-9]{2,5}$  @:¬:[AN].*:[pi]
    de  ~^[0-9]{2,5}$  @:A.*:s
        <<- &1:2>> :LW;T

    en  l’  an  ~^[0-9]{2,5}$
    en  l’  an  de  grâce  ~^[0-9]{2,5}$
        <<- &>> :LW;T

    [de|d’] [plusieurs|quelques|$:B|*NUM] [ans|années|mois] [mon|ton|son|notre|votre|leur] [cadet|aîné+e]
    [de|d’] [plusieurs|quelques|$:B|*NUM] [ans|années|mois] [ma|ta|sa|notre|votre|leur] cadette
        <<- &>> :LW;T


__locutions_saisons__
    à [compter|partir] [de|d’]  l’ [automne|été|hiver]
    [à|dès|depuis|de|d’]        l’ [automne|été|hiver]
    à l’ orée [de|d’]           l’ [automne|été|hiver]
    au cours [de|d’]            l’ [automne|été|hiver]
    [avant|après]               l’ [automne|été|hiver]
    dans le courant [de|d’]     l’ [automne|été|hiver]
    jusqu’ à                    l’ [automne|été|hiver]
    par rapport à               l’ [automne|été|hiver]
    à [compter|partir] du       printemps
    [au|du]                     printemps
    à l’ orée du                printemps
    au cours du                 printemps
    [avant|après] le            printemps
    dans le courant du          printemps
    jusqu’ au                   printemps
    par rapport au              printemps
        <<- not morph(>1, ":A.*:[me]:[si]") &>> :LW;T

    à [compter|partir] [de|d’]  l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    dans le courant [de|d’]     l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] du       printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    dans le courant du          printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    à [compter|partir] du       [début|milieu] [de|d’] l’ [automne|été|hiver]
    [au|du]                     [début|milieu] [de|d’] l’ [automne|été|hiver]
    à l’ orée du                [début|milieu] [de|d’] l’ [automne|été|hiver]
    au cours du                 [début|milieu] [de|d’] l’ [automne|été|hiver]
    [avant|après] le            [début|milieu] [de|d’] l’ [automne|été|hiver]
    jusqu’ au                   [début|milieu] [de|d’] l’ [automne|été|hiver]
    par rapport au              [début|milieu] [de|d’] l’ [automne|été|hiver]
    à [compter|partir] du       [début|milieu] du printemps
    [au|du]                     [début|milieu] du printemps
    à l’ orée du                [début|milieu] du printemps
    au cours du                 [début|milieu] du printemps
    [avant|après] le            [début|milieu] du printemps
    jusqu’ au                   [début|milieu] du printemps
    par rapport au              [début|milieu] du printemps
        <<- not morph(>1, ":A.*:[me]:[si]") &>> :LW;T

    à [compter|partir] du       [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              [début|milieu] [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] du       [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [au|du]                     [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée du                [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours du                 [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après] le            [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ au                   [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport au              [début|milieu] du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    à [compter|partir] [de|d’]  la fin [de|d’] l’ [automne|été|hiver]
    [à|dès|depuis|de|d’]        la fin [de|d’] l’ [automne|été|hiver]
    à l’ orée [de|d’]           la fin [de|d’] l’ [automne|été|hiver]
    au cours [de|d’]            la fin [de|d’] l’ [automne|été|hiver]
    [avant|après]               la fin [de|d’] l’ [automne|été|hiver]
    jusqu’ à                    la fin [de|d’] l’ [automne|été|hiver]
    par rapport à               la fin [de|d’] l’ [automne|été|hiver]
    à [compter|partir] [de|d’]  la fin du printemps
    [à|dès|depuis|de|d’]        la fin du printemps
    à l’ orée [de|d’]           la fin du printemps
    au cours [de|d’]            la fin du printemps
    [avant|après]               la fin du printemps
    jusqu’ à                    la fin du printemps
    par rapport à               la fin du printemps
        <<- not morph(>1, ":A.*:[me]:[si]") &>> :LW;T

    à [compter|partir] [de|d’]  la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               la fin [de|d’] l’ [automne|été|hiver]  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à [compter|partir] [de|d’]  la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [à|dès|depuis|de|d’]        la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    à l’ orée [de|d’]           la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    au cours [de|d’]            la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    [avant|après]               la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    jusqu’ à                    la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
    par rapport à               la fin du printemps  [dernier|passé|précédent|prochain|~^[0-9]{2,5}$]
        <<- &>> :LW;T

    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] du printemps ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par un [beau|chaud|frais|froid] [matin|soir|lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] [de|d’] printemps ?~^[0-9]{2,5}$¿
    par un [bel|chaud|frais|froid] après-midi [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi du printemps ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par un [bel|chaud|frais|froid] après-midi d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par un [bel|chaud|frais|froid] après-midi [de|d’] printemps ?~^[0-9]{2,5}$¿
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] l’ [été|automne|hiver] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] l’ [été|automne|hiver] de l’ [an|année] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] du printemps ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] du printemps de l’ [an|année] ~^[0-9]{2,5}$
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] d’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    par une [belle|chaude|fraîche|froide] [journée|matinée|nuit|soirée] [de|d’] printemps ?~^[0-9]{2,5}$¿
        <<- &>> :LW;T

    au cours [de|d’] l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ et ?[de|d’]¿ l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    au cours [de|d’] l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ et du printemps ?~^[0-9]{2,5}$¿
    au cours du printemps ?~^[0-9]{2,5}$¿ et ?[de|d’]¿ l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    entre ?[le|l’]¿ [printemps|été|automne|hiver] ?~^[0-9]{2,5}$¿ et ?[le|l’]¿ [printemps|été|automne|hiver] ?~^[0-9]{2,5}$¿
    du printemps ?~^[0-9]{2,5}$¿ au printemps ?~^[0-9]{2,5}$¿
    du printemps ?~^[0-9]{2,5}$¿ à l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
    de l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ au printemps ?~^[0-9]{2,5}$¿
    de l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿ à l’ [été|automne|hiver] ?~^[0-9]{2,5}$¿
        <<- &>> :LW;T


__locutions_semestre_trimestre__
    à [compter|partir] du   ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [au|du]                 ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée du            ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du             ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    depuis le               ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ au               ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    à [compter|partir] du   [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [au|du]                 [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée du            [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du             [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    depuis le               [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ au               [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          [début|milieu] du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    à [compter|partir] de   la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [à|dès|depuis|de|d’]    la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à l’ orée [de|d’]       la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours [de|d’]        la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]           la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    jusqu’ à                la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à           la fin du ?[premier|deuxième|troisième|quatrième]¿ [semestre|trimestre]  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T


__locutions_dates_mois__
    à [compter|partir] du   [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le         [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [le|du]                 [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le        [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au             [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au          [1er|1ᵉʳ|~^\d\d?$]  {_mois_}    ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    [les|des]               [1er|1ᵉʳ|~^\d\d?$] et ~^\d\d?$ {_mois_}    ?[derniers|passés|précédents|prochains|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    dans la nuit du         [1er|1ᵉʳ|~^\d\d?$]  {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    dans la nuit du         [1er|1ᵉʳ|~^\d\d?$]  ?{_mois_}¿ au  [1er|1ᵉʳ|~^\d\d?$]  {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    au cours         [de|d’]    {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    au cours du mois [de|d’]    {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    à l’ orée du mois [de|d’]   {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    à [compter|partir] [de|d’]  {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ [en|à]             {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après]               {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’]          {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au              {_mois_}  ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    ?[à|avant|après|de|d’|depuis]¿ [début|milieu|fin] {_mois_} ?~^[0-9]{2,5}$¿
        <<- not morph(<1, ":D") &>> :LW;T

    à [compter|partir]          [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ [en|à]             [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis|de|d’]          [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à               [début|milieu|fin] {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    ?jusqu’¿ au         [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au         [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ au         [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] le    [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [dès|depuis] le     [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    du                  [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu]                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu] [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport au      [début|milieu] du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    ?jusqu’¿ à la           fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la           fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    ?jusqu’¿ à la           fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [avant|après] la        fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    [de|d’|dès|depuis] la   fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin                   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin [de|d’]           {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
    par rapport à la        fin du mois [de|d’]   {_mois_} ?[dernier|passé|précédent|prochain|~^[0-9]{2,5}$]¿
        <<- &>> :LW;T

    en ce début     {_mois_} ?~^[0-9]{2,5}$¿
    [à|en] la fin   {_mois_} ?~^[0-9]{2,5}$¿
        <<- &>> :LW;T

    [début|fin] {_mois_} ~^[0-9]{2,5}$
        <<- not morph(<1, ":D") &>> :LW;T

    entre {_mois_} ?~^[0-9]{2,5}$¿ et {_mois_} ?~^[0-9]{2,5}$¿
        <<- &>> :LW;T

    ?jusqu’¿ à                      la {_mi_mois_} ?~^[0-9]{2,5}$¿
    [après|avant|dès|depuis|de|d’]  la {_mi_mois_} ?~^[0-9]{2,5}$¿
    par rapport à                   la {_mi_mois_} ?~^[0-9]{2,5}$¿
        <<- &>> :LW;T


__locutions_horaires_et_durée__
    24      [heures|h]      [sur|/]  24
    7       [jours|j]       [sur|/]  7
    sept    [jours|j]       [sur|/]  sept
    vingt-quatre  heures    [sur|/]  vingt-quatre
        <<- &>> :LW;T

    ?jusqu’¿ à                   *NUM  h
    à [partir|compter] de        *NUM  h
    [avant|après|de|dès|depuis]  *NUM  h
    ?jusqu’¿ à                   [1|01]  heure
    à [partir|compter] de        [1|01]  heure
    [avant|après|de|dès|depuis]  [1|01]  heure
    ?jusqu’¿ à                   *HOUR
    à [partir|compter] de        *HOUR
    [avant|après|de|dès|depuis]  *HOUR
    ?jusqu’¿ à                   une        heure
    à [partir|compter] de        une        heure
    [avant|après|de|dès|depuis]  une        heure
    ?jusqu’¿ à                   @:B:.:p    heures
    à [partir|compter] de        @:B:.:p    heures
    [avant|après|de|dès|depuis]  @:B:.:p    heures
        <<- &>> :LW;T

    ?jusqu’¿ à                   *NUM  heures
    à [partir|compter] de        *NUM  heures
    [avant|après|de|dès|depuis]  *NUM  heures
        <<- \-2.isdigit() and \-2 != "1" and \-2 != "01" &>> :LW;T

    ?jusqu’¿ à                   [midi|minuit]
    à [partir|compter] de        [midi|minuit]
    [avant|après|de|dès|depuis]  [midi|minuit]
        <<- &>> :LW;T

    [avant|après|dès|depuis] la nuit tombée
    [avant|après|dès|depuis] la tombée de la nuit
    [avant|après|dès|depuis] le jour levé
    [avant|après|dès|depuis] le lever [de|du] soleil
    [avant|après|dès|depuis] le lever du jour
    [avant|après|dès|depuis] l’ aube
    [avant|après|dès|depuis] le crépuscule
        <<- &>> :LW;T

    dans la [matinée|nuit|soirée] de [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche] à [lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]
        <<- &>> :LW;T

    dès le premier [jour|soir]
    dès la première [matinée|nuit]
        <<- &>> :LW;T

    à la fin de [la|l’]             [après-midi|matinée|nuit|soirée]
    au [début|milieu] de [la|l’]    [après-midi|matinée|nuit|soirée]
    en [début|milieu|fin] [de|d’]   [après-midi|matinée|soirée]
        <<- &>> :LW;T

    ## purge de queue
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   [du|ce]  [matin|soir]
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   de  l’ après-midi
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   cet  après-midi
    ~^\d\d?$  h  ?~^\d\d?$¿  ?[tapantes|pétantes|pile]¿   [demain|hier|après-demain|avant-hier]  ?[matin|soir|après-midi]¿
        <<- ~3:0>> *

    *HOUR  ?[tapantes|pétantes|pile]¿
    *HOUR  ?[tapantes|pétantes|pile]¿  [du|ce]  [matin|soir]
    *HOUR  ?[tapantes|pétantes|pile]¿  de  l’ après-midi
    *HOUR  ?[tapantes|pétantes|pile]¿  cet  après-midi
    *HOUR  ?[tapantes|pétantes|pile]¿  [demain|hier|après-demain|avant-hier]  ?[matin|soir|après-midi]¿
    >heure moins le quart
    >heure et [demie|quart]
    >heure ?,¿ @:B:.:p minutes
    >heure ?,¿ @:B:.:p minutes ?,¿ @:B:.:p secondes
    [midi|minuit] pile
    [midi|minuit] moins le quart
    [midi|minuit] et [demie|quart]
        <<- ~2:0>> *

    à cette heure ?[tardive|indue|matinale]¿
    à cette heure de la [journée|nuit]
    à cette heure du jour
    à l’ heure actuelle
    à l’ heure qu’ il est
    à la nuit [tombée|tombante]
    à n’importe quelle heure du jour et de la nuit
    à toute heure
    à toute heure de la nuit
    à toute heure de la nuit et du jour
    à toute heure du jour
    à toute heure du jour et de la nuit
    à une heure ?[aussi|très|trop]¿ [décente|indue|tardive]
    au jour et à l’ heure dits
    au cours de la [dernière|précédente|prochaine] [seconde|minute|heure]
    au cours de l’ heure ?[dernière|passée|précédente|prochaine]¿
    au cours de la [seconde|minute] ?[dernière|passée|précédente|prochaine]¿
    au cours [de|d’] la nuit
    [de|d’] ?[assez|si|très|trop]¿ bonne heure
    [de|d’] tout à l’ heure
    dès la première heure
    l’ heure venue
    jusqu’ à pas d’ heure
    sur l’ heure
    tout à l’ heure
    ?[de|d’]¿ trois quarts d’ heure plus [tôt|tard]
    ?[de|d’]¿ trois quarts d’ heure auparavant
    ?d’¿ un quart d’ heure plus [tôt|tard]
    ?d’¿ un quart d’ heure auparavant
    ?d’¿ une fraction [de|d’] seconde auparavant
    ?d’¿ une fraction [de|d’] seconde plus [tard|tôt]
    vers [midi|minuit]
        <<- &>> :LW;T

DEF: unit_mesure_sing_mas   [jour|mois|trimestre|semestre|an|siècle|millénaire]
DEF: unit_mesure_sing_fem   [nanoseconde|milliseconde|seconde|minute|heure|journée|semaine|année|décennie]
DEF: unit_mesure_plur       [nanosecondes|millisecondes|secondes|minutes|heures|jours|journées|semaines|mois|trimestres|semestres|ans|années|décennies|siècles|millénaires]
DEF: unit_mesure_plur_mas   [jours|mois|trimestres|semestres|ans|siècles|millénaires]
DEF: unit_mesure_plur_fem   [nanosecondes|millisecondes|secondes|minutes|heures|journées|semaines|années|décennies]


__locutions_temporelles_communes__
    d’ un [jour|mois|trinestre|semestre|an|siècle|millénaire] à l’ autre
    d’ une [nanoseconde|milliseconde|seconde|minute|seconde|heure|journée|semaine|année|décennie] à l’ autre
    [de|d’] dernière [seconde|minute|heure|année]
        <<- &>> :LW;T

    [*NUM|$:B]  {unit_mesure_plur}      [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
    un          {unit_mesure_sing_mas}  [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
    une         {unit_mesure_sing_fem}  [plus|moins]  [>ancien|>jeune|>récent|>vieux]  <>  [que|qu’]
        <<- &1:3>> :LW;T

    ## locutions au singulier
    au bout d’ un                                   {unit_mesure_sing_mas}
    après un                                        {unit_mesure_sing_mas}
    depuis un                                       {unit_mesure_sing_mas}
    en un                                           {unit_mesure_sing_mas}
    pendant un                                      {unit_mesure_sing_mas}
        <<- not morph(>1, ":A.*:[me]:[pi]") &>> :LW;T

    au bout d’ une                                  {unit_mesure_sing_fem}
    après une                                       {unit_mesure_sing_fem}
    depuis une                                      {unit_mesure_sing_fem}
    en une                                          {unit_mesure_sing_fem}
    pendant une                                     {unit_mesure_sing_fem}
        <<- not morph(>1, ":A.*:[fe]:[pi]") and not (value(\-1, "|année|") and re.search("^[0-9]+$", >1)) &>> :LW;T

    à un                                            {unit_mesure_sing_mas} près
    à une                                           {unit_mesure_sing_fem} près
    après un                                        {unit_mesure_sing_mas} de bons et loyaux services
    après une                                       {unit_mesure_sing_fem} de bons et loyaux services
    après près [de|d’] un                           {unit_mesure_sing_mas}
    après près [de|d’] un                           {unit_mesure_sing_mas} de bons et loyaux services
    après près [de|d’] une                          {unit_mesure_sing_fem}
    après près [de|d’] une                          {unit_mesure_sing_fem} de bons et loyaux services
    au fil du                                       {unit_mesure_sing_mas} à venir
    au fil de la                                    {unit_mesure_sing_fem} à venir
    au fil de l’                                    [an|année|heure] à venir
    dans le                                         {unit_mesure_sing_mas} à venir
    dans la                                         {unit_mesure_sing_fem} à venir
    dans l’                                         [an|année|heure] à venir
    depuis près [de|d’] un                          {unit_mesure_sing_mas}
    depuis près [de|d’] une                         {unit_mesure_sing_fem}
    d’ ici un                                       {unit_mesure_sing_mas}
    d’ ici une                                      {unit_mesure_sing_fem}
    ?d’¿ il y a un                                  {unit_mesure_sing_mas}
    ?d’¿ il y a une                                 {unit_mesure_sing_fem}
    ?d’¿ il y a [moins|plus] [de|d’] un             {unit_mesure_sing_mas}
    ?d’¿ il y a [moins|plus] [de|d’] une            {unit_mesure_sing_fem}
    pendant près d’ un                              {unit_mesure_sing_mas}
    pendant près d’ une                             {unit_mesure_sing_fem}
    un                                              {unit_mesure_sing_mas} [après|avant|auparavant]
    une                                             {unit_mesure_sing_fem} [après|avant|auparavant]
    un                                              {unit_mesure_sing_mas} plus [tard|tôt]
    une                                             {unit_mesure_sing_fem} plus [tard|tôt]
    un peu [moins|plus] d’un                        {unit_mesure_sing_mas} auparavant
    un peu [moins|plus] d’une                       {unit_mesure_sing_fem} auparavant
        <<- &>> :LW;T

    au cours de l’          an                        [dernier|passé|précédent|prochain|suivant]
    au cours de l’          [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    au cours du             {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    au cours de la          {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    au fil de l’            an                        [dernier|passé|précédent|prochain|suivant]
    au fil de l’            [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    au fil du               {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    au fil de la            {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    dans l’                 an                        [dernier|passé|précédent|prochain|suivant]
    dans l’                 [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    dans le                 {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    dans la                 {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    dans le courant de l’   an                        [dernier|passé|précédent|prochain|suivant]
    dans le courant de l’   [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    dans le courant du      {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    dans le courant de la   {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    depuis l’               an                        [dernier|passé|précédent|prochain|suivant]
    depuis l’               [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    depuis le               {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    depuis la               {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    de l’                   an                        [dernier|passé|précédent|prochain|suivant]
    de l’                   [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    du                      {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    de la                   {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    par rapport à l’        an                        [dernier|passé|précédent|prochain|suivant]
    par rapport à l’        [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    par rapport au          {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    par rapport à la        {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    pendant l’              an                        [dernier|passé|précédent|prochain|suivant]
    pendant l’              [heure|année]             [dernière|passée|précédente|prochaine|suivante]
    pendant le              {unit_mesure_sing_mas}    [dernier|passé|précédent|prochain|suivant]
    pendant la              {unit_mesure_sing_fem}    [dernière|passée|précédente|prochaine|suivante]
    au cours du             [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    au cours de la          [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    au fil du               [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    au fil de la            [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    dans le                 [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    dans la                 [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    dans le courant du      [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    dans le courant de la   [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    depuis le               [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    depuis la               [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    du                      [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    de la                   [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    par rapport au          [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    par rapport à la        [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    pendant le              [dernier|précédent|prochain]        {unit_mesure_sing_mas}
    pendant la              [dernière|précédente|prochaine]     {unit_mesure_sing_fem}
    depuis un               ?[assez|si|très|trop]¿ long     {unit_mesure_sing_mas}
    depuis une              ?[assez|si|très|trop]¿ longue   {unit_mesure_sing_fem}
    pendant un  ?[long]¿    {unit_mesure_sing_mas}
    pendant une ?[longue]¿  {unit_mesure_sing_fem}
        <<- &>> :LW;T

    ## locutions plurielles
    au bout de [nombreux|plusieurs|quelques]        {unit_mesure_plur_mas}
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur_mas}
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur_mas}
    depuis @:B:.:p                                  {unit_mesure_plur_mas}
    depuis *NUM                                     {unit_mesure_plur_mas}
    depuis près [de|d’] @:B:.:p                     {unit_mesure_plur_mas}
    depuis près [de|d’] *NUM                        {unit_mesure_plur_mas}
    depuis quelques                                 {unit_mesure_plur_mas}
    en *NUM                                         {unit_mesure_plur_mas}
    pendant [des|plusieurs|quelques|*NUM|@:B:.:p]   {unit_mesure_plur_mas}
    pendant près [de|d’] [*NUM|@:B:.:p]             {unit_mesure_plur_mas}
    un ou deux                                      {unit_mesure_plur_mas} plus [tôt|tard]
        <<- not morph(>1, ":A.*:[me]:[pi]") &>> :LW;T

    au bout de [nombreuses|plusieurs|quelques]      {unit_mesure_plur_fem}
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur_fem}
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur_fem}
    depuis @:B:.:p                                  {unit_mesure_plur_fem}
    depuis *NUM                                     {unit_mesure_plur_fem}
    depuis près [de|d’] @:B:.:p                     {unit_mesure_plur_fem}
    depuis près [de|d’] *NUM                        {unit_mesure_plur_fem}
    depuis quelques                                 {unit_mesure_plur_fem}
    en *NUM                                         {unit_mesure_plur_fem}
    pendant [des|plusieurs|quelques|*NUM|@:B:.:p]   {unit_mesure_plur_fem}
    pendant près [de|d’] [*NUM|@:B:.:p]             {unit_mesure_plur_fem}
    une ou deux                                     {unit_mesure_plur_fem} plus [tôt|tard]
        <<- not morph(>1, ":A.*:[fe]:[pi]") &>> :LW;T

    @:B:.:p                                         {unit_mesure_plur} auparavant
    @:B:.:p                                         {unit_mesure_plur} plus [tôt|tard]
    @:B:.:p ou @:B:.:p                              {unit_mesure_plur} plus [tôt|tard]
    à quelques                                      {unit_mesure_plur} près
    après [des|plusieurs|quelques|*NUM|@:B:.:p]     {unit_mesure_plur} de bons et loyaux services
    après près [de|d’] [*NUM|@:B:.:p]               {unit_mesure_plur} de bons et loyaux services
    au fil des                                      {unit_mesure_plur} à venir
    dans les                                        {unit_mesure_plur} à venir
    des                                             {unit_mesure_plur} plus [tôt|tard]
    des                                             {unit_mesure_plur} à venir
    d’ ici quelques                                 {unit_mesure_plur}
    ?d’¿ il y a [*NUM|@:B:.:p]                      {unit_mesure_plur}
    ?d’¿ il y a [moins|plus] [de|d’] [*NUM|@:B:.:p] {unit_mesure_plur}
    ?d’¿ il y a quelques                            {unit_mesure_plur}
    quelques                                        {unit_mesure_plur} [après|avant|auparavant]
    quelques                                        {unit_mesure_plur} plus [tard|tôt]
    un peu [moins|plus] de [@:B:.:p|*NUM]           {unit_mesure_plur} auparavant
        <<- &>> :LW;T

    au cours des            ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    au cours des            ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    au fil des              ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    au fil des              ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    dans les                ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    dans les                ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    dans le courant des     ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    dans le courant des     ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    depuis les              ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    depuis les              ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    des                     ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    des                     ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    par rapport aux         ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    par rapport aux         ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    pendant les             ?@:B:.:p¿ {unit_mesure_plur_mas}    [derniers|passés|précédents|prochains|suivants]
    pendant les             ?@:B:.:p¿ {unit_mesure_plur_fem}    [dernières|passées|précédentes|prochaines|suivantes]
    au cours des            ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    au cours des            ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    au fil des              ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    au fil des              ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    dans les                ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    dans les                ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    dans le courant des     ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    dans le courant des     ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    depuis les              ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    depuis les              ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    des                     ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    des                     ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    par rapport aux         ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    par rapport aux         ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    pendant les             ?@:B:.:p¿ [derniers|précédents|prochains]       {unit_mesure_plur_mas}
    pendant les             ?@:B:.:p¿ [dernières|précédentes|prochaines]    {unit_mesure_plur_fem}
    depuis [de|d’]          ?[assez|si|très|trop]¿ longs {unit_mesure_plur_mas}
    depuis [de|d’]          ?[assez|si|très|trop]¿ longues {unit_mesure_plur_fem}
    pendant de [nombreux|longs]         {unit_mesure_plur_mas}
    pendant de [nombreuses|longues]     {unit_mesure_plur_fem}
        <<- &>> :LW;T


__locutions_temps_après_avant__
    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   [après|avant]
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     [après|avant]
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      [après|avant]
        <<- not value(<1, "|de|d’|")
            and ( morph(>1, ">[,)]|<end>|:(?:Ov|3[sp])", ":D") or ( value(>1, "|le|la|l’|leur|les|") and morph(>2, ":V", ":[NAQ]") ) )
        &>> :LW;T

    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   auparavant
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     auparavant
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      auparavant
        <<- &>> :LW;T

    peu de          [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    plusieurs       [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    quelques        [nanosecondes|millisecondes|secondes|minutes|heures|jours|semaines|mois|années|ans|décennies|siècles|millénaires]   plus [tôt|tard]
    de nombreux     [jours|ans|siècles|millénaires]                                                                                     plus [tôt|tard]
    de nombreuses   [nanosecondes|millisecondes|secondes|minutes|heures|semaines|années|décennies]                                      plus [tôt|tard]
        <<- &>> :LW;T


__locutions_énumération_temporelle__
    [de|d’] nanoseconde   en  nanoseconde
    [de|d’] milliseconde  en  milliseconde
    [de|d’] seconde       en  seconde
    [de|d’] minute        en  minute
    [de|d’] heure         en  heure
    [de|d’] matin         en  matin
    [de|d’] matinée       en  matinée
    [de|d’] après         en  après
    [de|d’] soir          en  soir
    [de|d’] soirée        en  soirée
    [de|d’] jour          en  jour
    [de|d’] journée       en  journée
    [de|d’] nuit          en  nuit
    [de|d’] semaine       en  semaine
    [de|d’] mois          en  mois
    [de|d’] trimestre     en  trimestre
    [de|d’] semestre      en  semestre
    [de|d’] mois          en  mois
    [de|d’] année         en  année
    [de|d’] décennie      en  décennie
    [de|d’] génération    en  génération
    [de|d’] siècle        en  siècle
    [de|d’] millénaire    en  millénaire
        <<- &>> :LW;T

    nanoseconde     [après|par]     nanoseconde
    milliseconde    [après|par]     milliseconde
    seconde         [après|par]     seconde
    minute          [après|par]     minute
    heure           [après|par]     heure
    matin           [après|par]     matin
    matinée         [après|par]     matinée
    après-midi      [après|par]     après-midi
    soir            [après|par]     soir
    soirée          [après|par]     soirée
    jour            [après|par]     jour
    journée         [après|par]     journée
    nuit            [après|par]     nuit
    semaine         [après|par]     semaine
    mois            [après|par]     mois
    trimestre       [après|par]     trimestre
    semestre        [après|par]     semestre
    mois            [après|par]     mois
    année           [après|par]     année
    décennie        [après|par]     décennie
    génération      [après|par]     génération
    siècle          [après|par]     siècle
    millénaire      [après|par]     millénaire
        <<- &>> :LW;T


__locutions_locutions_temps__
    à longueur [de|d’] temps
    après un ?bon¿ bout de temps ?passé¿
    après un certain temps ?passé¿
    au bout d’ un certain temps  ?passé¿
    au fil du temps
    avec un ?[léger|petit]¿ temps d’ avance
    avec un temps d’ avance ?$:W¿ [considérable|énorme|gigantesque|important|phénoménal]
    avec un ?[léger|petit]¿ temps [de|d’] retard
    avec un temps [de|d’] retard ?$:W¿ [considérable|énorme|gigantesque|important|phénoménal]
    comme au bon vieux temps
    dans peu de temps
    dans très peu de temps
    dans un [premier|second|troisième|quatrième] temps
    depuis ce temps-là
    depuis peu
    depuis ?[assez|si|très|trop]¿ peu de temps
    depuis la nuit des temps
    depuis quelque temps
    depuis tout ce temps ?passé¿
    d’ ici peu de temps
    ?[de|d’]¿ ces derniers temps
    ?d’¿ il y a ?[assez|si|très|trop]¿ peu [de|d’] temps
    ?d’¿ il y a quelque temps
    [de|d’] tous temps
    [de|d’] tout temps
    [de|d’] temps à autre
    [de|d’] temps en temps
    en ?[assez|si|très|trop]¿ peu [de|d’] temps
    en ce temps-là
    en d’ autres temps
    en d’ autres temps et d’ autres lieux
    en des temps [moins|plus] [anciens|récents]
    en des temps meilleurs
    en même temps
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour [le|l’] [dire|prononcer|raconter]
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour [le|l’] faire comprendre
    en moins [de|d’] temps qu’ il ?[ne|n’]¿ [faut|fallut|faudra|faudrait] pour l’ expliquer
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour [le|l’] [dire|prononcer|raconter]
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour [le|l’] faire comprendre
    en moins [de|d’] temps qu’ il ?n’¿ [a|eut|aura|aurait] fallu pour l’ expliquer
    en temps [de|d’] [guerre|paix]  ?[économique|religieuse]¿
    en temps [normal|opportun|ordinaire|utile|voulu]
    en temps et en heure
    en un temps record
    en un rien [de|d’] temps
    jusqu’ à la fin des temps
    la plupart du temps
    le [moins|plus] [de|d’] temps possible
    le plus clair de [mon|ton|son|notre|votre|leur] temps ?libre¿
    le plus clair de [mon|ton|son|notre|votre|leur] temps [de|d’] travail
    par les temps qui courent
    par temps [de|d’] pluie
    pendant ce temps-là
    pendant quelque temps
    pendant un [court|certain|petit] laps de temps
    pendant qu’ il ?en¿ est ?encore¿ temps
    peu [de|d’] temps auparavant
    pour quelque temps
    quelque temps
    tout le temps
        <<- &>> :LW;T

    ?[bien|si|assez]¿ longtemps
    avant longtemps
    depuis ?[assez|si|très|trop]¿ longtemps
    depuis bien longtemps
    dès longtemps
    ?d’¿ il n’y a pas ?[assez|si|très|trop]¿ longtemps
    ?d’¿ il y a ?[assez|si|très|trop]¿ longtemps
    pendant ?[bien|si|assez|très]¿ longtemps
    [plus|moins|aussi] longtemps
    [plus|moins|aussi] longtemps que [prévu|nécessaire]
    [plus|moins|aussi] longtemps que d’ habitude
    un peu [plus|moins] longtemps
    un peu [plus|moins] longtemps que [prévu|nécessaire]
    un peu [plus|moins] longtemps que d’ habitude
        <<- &>> :LW;T

__locutions_instant_moment__
    à aucun moment
    à ce [moment|moment-là] ?[exact|particulier|précis]¿
    à cet [instant|instant-là] ?[exact|particulier|précis]¿
    à chaque [instant|moment] ?passé¿
    à un moment donné
    à un moment ou à un autre
    au [dernier|même|bon|mauvais] [moment|instant]
    au bon endroit ?,¿ au bon moment
    au mauvais endroit ?,¿ au mauvais moment
    au bout d’ un [instant|moment]
    dans ces moments-là
    d’ instant en instant
    d’ un [instant|moment] à l’ autre
    en ce [moment|moment-là] ?[particulier]¿
    en ces [temps-là|temps-ci]
    en cet instant ?[particulier|précis]¿
    le moment venu
    par [instants|moments]
    un court [instant|moment]
    un [instant|moment] plus [tôt|tard]
        <<- &>> :LW;T

__locutions_temporelles_diverses__
    à cette [date|occasion] ?fatidique¿
    à longueur [de|d’] [journée|année]
    à cette époque
    à cette époque de l’ année
    à durée [déterminée|indéterminée|limitée]
    à intervalles [irréguliers|réguliers]
    à partir [de|d’]  [aujourd’hui|ici|là|maintenant|rien]
    à partir [de|d’]  [demain|hier]  ?[matin|midi|soir]¿
    ?[d’|dès|jusqu’|pour|après|avant]¿ après demain
    [d’|dès|jusqu’|pour|après|avant] après-demain
    après cette date ?fatidique¿
    au commencement
    au début
    au fur et à mesure
    au jour j
    au jour le jour
    au milieu de la nuit
    au plus [tard|tôt] ?[lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]¿
    avant demain ?[matin|soir|après-midi]¿
    comme autrefois
    comme avant
    comme d’ [habitude|hab]
    comme toujours
    dans [ma|ta|sa|notre|votre|leur] prime jeunesse
    dans un lointain passé
    depuis belle lurette
    depuis des lustres
    depuis lors
    depuis toujours
    depuis un bail
    dès à présent
    dès [demain|hier] ?[soir|matin|après-midi]¿
    dès [maintenant|lors|aujourd’hui]
    dès [mon|ton|son|notre|votre|leur] plus jeune âge
    dès [ma|ta|sa|notre|votre|leur] première rencontre
    dès potron-minet
    dès que possible
    du début à la fin
    du jour au lendemain
    du jour j
    d’ antan
    d’ après-guerre
    d’ avant-guerre
    d’ aujourd’hui
    d’ autrefois
    d’ habitude
    d’ ici ?[là|peu|demain|après-demain]¿
    d’ ici une [seconde|minute|journée|semaine|année|décennie]
    d’ ici un [mois|trimestre|semestre|siècle|millénaire]
    d’ [hier|avant-hier] ?[matin|soir|après-midi]¿
    [de|d’] jadis
    [de|d’] maintenant
    ?d’¿ il y a belle lurette
    ?[de|d’]¿ [demain|après-demain] ?[matin|soir|après-midi]¿
    [de|d’] ?[assez|si|très|trop]¿ [courte|longue] durée
    [de|d’] ?[assez|si|très|trop]¿ bon matin
    [de|d’] ?[assez|si|très|trop]¿ longue [date|haleine]
    [de|d’] ?[assez|si|très|trop]¿ nombreuses années plus [tôt|tard]
    [de|d’] courte [durée|vue]
    [de|d’] demain ?[matin|soir|après-midi]¿
    [de|d’] dernière minute
    [de|d’] jour comme [de|d’] nuit
    [de|d’] nos jours
    [de|d’] si bon matin
    [de|d’] toute éternité
    en début [de|d’] [journée|matinée|soirée|après-midi]
    en milieu [de|d’] [journée|matinée|soirée|après-midi]
    en fin [de|d’] [journée|matinée|soirée|après-midi]
    en un claquement de doigts
    en un clin d’ œil
    été comme hiver
    jour pour jour
    jusqu’ [alors|ici|aujourd’hui|Noël|Pâques]
    jusqu’ au nouvel an
    jusqu’ à [demain|hier] ?[matin|soir|après-midi]¿
    jusqu’ à [ma|sa|ta|notre|votre|leur] mort
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier [souffle|soupir]
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle [de|d’] vie
    jusqu’ à aujourd’hui
    jusqu’ à ce que [ils|elles|iels] en sachent plus
    jusqu’ à ce que [j’|il|elle|on] en sache plus
    jusqu’ à ce que mort s’ ensuive
    jusqu’ à ce que nous en sachions plus
    jusqu’ à ce que tu en saches plus
    jusqu’ à ce que vous en sachiez plus
    jusqu’ à la dernière [minute|seconde]
    jusqu’ à la fin
    jusqu’ à la fin [de|d’] [mes|tes|ses|nos|vos|leurs] jours
    jusqu’ à la tombée [de|d’] la nuit
    jusqu’ à maintenant
    jusqu’ à nouvel ordre
    jusqu’ à plus ample informé
    jusqu’ à présent
    jusqu’ à récemment
    le jour venu
    le [moins|plus] [de|d’] [gens|monde] possible
    le [moins|plus] [tôt|tard|souvent] ?possible¿
    moins [près|loin|tôt|tard]
    moins ?[près|loin|tôt|tard]¿ que d’ habitude
    moins ?[près|loin|tôt|tard]¿ que [prévu|nécessaire]
    plus [près|loin|tôt|tard]
    plus ?[près|loin|tôt|tard]¿ que [prévu|nécessaire]
    plus ?[près|loin|tôt|tard]¿ que d’ habitude
    par la suite
    par le passé
    plus jamais
    plus que d’ habitude
    pour lors
    pour le restant [de|d’] [mes|tes|ses|nos|vos|leurs] jours
    quant à présent
    sine die
    sans délai ?supplémentaire¿
    sur ces entrefaites
    séance tenante
    tout [de|d’] [suite|go]
    tout à coup
    toute affaire cessante
    toutes affaires cessantes
    tôt ou tard
    un jour ou l’autre
    un peu [moins|plus] ?[près|loin|tôt|tard]¿ que prévu
    [voici|voilà] belle lurette
        <<- &>> :LW;T

__locutions_échéance__
    à ?[si|très|trop]¿ [brève|courte|longue] échéance
    à moyenne échéance
    à plus ou moins [brève|courte|longue] échéance
        <<- &>> :LW;T

__locutions_terme__
    à ?[si|très|trop]¿ court terme
    à ?[si|très|trop]¿ long terme
    à moyen terme
    à moyen [et|ou] ?à¿ [court|long] terme
    à court [et|ou] ?à¿ [moyen|long] terme
    à long [et|ou] ?à¿ [court|moyen] terme
    à ?[si|très|trop]¿ long [et|ou] ?à¿ ?[si|très|trop]¿ [court|moyen] terme
    à ?[si|très|trop]¿ court [et|ou] ?à¿ ?[si|très|trop]¿ [long|moyen] terme
    avant terme
    sur le ?[très|trop]¿ [long|moyen|court] terme
        <<- &>> :LW;T

__locutions_fois__
    à la fois
    à chaque fois
    bien des fois
    à d’ autres fois
    d’ innombrables fois
    [de|d’] ?[assez|si|très|trop]¿ nombreuses fois
    [de|d’] ?[assez|si|très|trop]¿ nombreuses fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    depuis la [première|dernière|~ième$] fois
    encore une fois
    par $:B fois
    pas plus [de|d’] [une|$:B] fois
    plein [de|d’] fois
    plus d’ une fois
    plus d’ une fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    pour la [première|seconde|dernière|~ième$] fois
    pour la [première|seconde|dernière|~ième$] fois [de|d’] [mon|ton|son|ma|ta|sa|notre|votre|leur] ?[misérable|insignifiante|palpitante]¿ [existence|vie] ?[misérable|insignifiante|palpitante]¿
    pour la [première|seconde|~ième$] et dernière fois
    pour la [première|seconde|~ième$] et dernière fois [de|d’] [mon|ton|son|ma|ta|sa|notre|votre|leur] ?[misérable|insignifiante|palpitante]¿ [existence|vie] ?[misérable|insignifiante|palpitante]¿
    pour la [seconde|dernière|~ième$] fois [de|d’] suite
    pour [trois|3] fois rien
    pour [cette|une] fois
    quelques fois
    sans y [réfléchir|songer|penser] à [deux|2] fois
    souventes fois
    tant de fois
        <<- &>> :LW;T

    cette [fois|fois-là|fois-ci]
    chaque fois
    d’ autres fois
    des fois
    des [dizaines|douzaines|vingtaines|trentaines|quarantaines|cinquantaines|soixantaines|centaines|milliers|millions|milliards] de fois
    des [dizaines|douzaines|vingtaines|trentaines|quarantaines|cinquantaines|soixantaines|centaines|milliers|millions|milliards] de fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    $:B fois
    $:B fois [de|d’] suite
    $:B fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    la derrière fois
    la prochaine fois
    maintes fois
    plusieurs fois
    plusieurs fois [de|d’] suite
    plusieurs fois par [seconde|minute|heure|jour|semaine|mois|trimestre|semestre|an|année|décennie|siècle|millénaire]
    une autre fois
    un [millier|million|milliard] [de|d’] fois
    une [autre|nouvelle|première|seconde|troisième|quatrième|cinquième|sixième|septième|huitième|neuvième|dixième|onzième|douzième|treizième|quatorzième|quinzième|seizième|dix-septième|dix-huitième|dix-huitième|dix-neuvième|vingtième|centième|millième] fois
    une bonne fois pour toutes
    une dernière fois
    une fois [de|d’] plus
    une fois n’ est pas coutume
    une ?bonne¿ fois pour toutes
    une prochaine fois
    une seule fois
        <<- not morph(<1, ":R") &>> :LW;T

__locutions_circonstances__
    dans d’ autres circonstances
    dans certaines circonstances ?particulières¿
    dans cette circonstance ?particulière¿
    dans cette circonstance-là
    dans ces circonstances ?particulières¿
    dans ces circonstances-là
    en aucune circonstance
    en certaines circonstances ?particulières¿
    en cette circonstance ?particulière¿
    en cette circonstance-là
    en ces circonstances ?particulières¿
    en ces circonstances-là
    en d’ autres circonstances
    en [de|d’] [semblables|telles] circonstances
    en toute circonstance ?semblables¿
    en toutes circonstances ?semblables¿
    en [certaines|quelques|plusieurs] circonstances
        <<- &>> :LW;T

__locutions_occasion__
    à l’ occasion
    à la [dernière|moindre|première|prochaine] occasion
    à la toute première occasion
    à cette occasion ?particulière¿
    à cette occasion-là
    en cette occasion ?particulière¿
    en cette occasion-là
    en ces occasions ?particulières¿
    en ces occasions-là
    en d’ [autres|innombrables] occasions
    en [de|d’] [rares|semblables|telles] occasions
    en [certaines|quelques|toutes|plusieurs] occasions
    en maintes occasions
    en toute occasion
    en toutes occasions
    en une ?tout¿ autre occasion
    par la même occasion
        <<- &>> :LW;T


TEST: Le train de 2 h 47 {{arriveraient}} en retard.                        ->> arriverait
TEST: Le train de 2 h 47 du matin {{arriveraient}} en retard.               ->> arriverait
TEST: Le train de 2h47 du matin {{arriveraient}} en retard.                 ->> arriverait
TEST: ils sont depuis le 2 janvier {{parti}} à l’étranger.                  ->> partis
TEST: ils sont depuis le 2 janvier 2012 {{parti}} à l’étranger.             ->> partis
TEST: Une étude de 2005 publiée dans le Journal
TEST: Les cinq variantes de la couverture du magazine Wired d’avril 2016 consacrée à Silicon Valley.
TEST: c’est donc la cinquième en 50 ans
TEST: profanation de plusieurs églises françaises début février.


__locutions_distance__
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] [de|d’] [distance|ici]
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] en [amont|aval]
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] plus loin
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] à la ronde
    à ?seulement¿ [*NUM|@:B:.:p|quelques|plusieurs] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] aux alentours
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] [de|d’] [distance|ici]
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] en [amont|aval]
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] plus loin
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] à la ronde
    à [de|d’] nombreux [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|parsecs] aux alentours
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] [de|d’] [distance|ici]
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] en [amont|aval]
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] plus loin
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] à la ronde
    à [de|d’] nombreuses [lieues|verstes|UA|années-lumière] aux alentours
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] [de|d’] [distance|ici]
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] en [amont|aval]
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] plus loin
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] à la ronde
    à des [dizaines|douzaines|centaines|milliers|millions|milliards] [de|d’] [nanomètres|millimètres|centimètres|décamètres|pas|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] aux alentours
    à un jet [de|d’] pierre [de|d’] [distance|ici]
    à un jet [de|d’] pierre en [amont|aval]
    à un jet [de|d’] pierre plus loin
    à un jet [de|d’] pierre à la ronde
    à un jet [de|d’] pierre aux alentours
        <<- &>> :LW

    à ?[moins|plus|si|très|trop]¿ haute altitude
    à ?[moins|plus|si|très|trop]¿ grande profondeur
    à ?[si|très|trop]¿ peu [de|d’] distance
        <<- &>> :LW

    au loin
    au plus [près|loin]
    d’ un peu trop [près|loin]
    [de|d’] loin en loin
    [de|d’] près ou [de|d’] loin
    [de|d’] ?[assez|aussi|moins|fort|plus|si|très|trop]¿ [loin|près]
    [assez|aussi|moins|fort|plus|si|très|trop] [loin|près]
    [loin|près] [de|d’] [là|ici]
    [loin|près] [de|d’] tout [ça|cela|ceci]
    ni [de|d’] près ?,¿ ni [de|d’] loin
        <<- &>> :LW


__locutions_latines__
    [a|à] [contrario|cappella|fortiori|giorno|minima|priori|postériori|posteriori]
        <<- &>> :LW
        <<- !1>>

    ab [absurdo|initio|ovo]
    ad [hoc|hominem|infinitum|libitum|limina|nauseam|nutum|valorem|patres]
    ad majorem dei gloriam
    ad vitam æternam
    alea jacta est
    de [facto|jure|plano|profondis]
    et [cætera|cetera]
    ex [abrupto|absurdo|cathedra|nihilo|professo]
    grosso modo
    hic et nunc
    id est
    in [abstracto|extenso|extremis|fine|memoriam|petto|situ|utero|vitro|vivo]
    ipso facto
    mutatis mutandis
    ne varietur
    pro domo
    recto tono
        <<- &>> :LW

    in anima vili
    in cauda venenum
    in vino veritas
    sursum corda
    sic transit gloria mundi
        <<- &>> :LP


__locutions__
    à *NUM  [%|‰]
    à [autrui|bâbord|brûle-pourpoint|califourchon|chacun|cheval|cloche-pied|confesse|contre-courant|contrecœur|contre-cœur|contre-pied|contre-sens|contretemps|contre-temps|>demi-mot|demi-voix|dessein|foison|grand-peine|genoux|gogo|jamais|jeun|loisir|merveille|moitié|nouveau|outrance|peine|perpète|perpette|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|revers|risque|sec|tâtons|tire-d’aile|tire-larigot|tort|tribord|tout-va|vif]
    à [mi-chemin|mi-côte|mi-jambe+s|mi-mandat|mi-mot+s|mi-parcours|mi-temps|mi-voix]
    à air comprimé
    à angle droit
    à armes égales
    à aucun prix
    à autre chose
    à ?[si|très|trop]¿ bas [bruit|cout|coût|prix]
    à bâtons rompus
    à beaucoup près
    à belles dents
    à bien des égards
    à bien pire
    à ?[si|très|trop]¿ courte portée
    à ?[si|très|trop]¿ bon [compte|escient|droit]
    à bout [de|d’] [bras|souffle|force|forces|nerf|nerfs]
    à bout [portant|touchant]
    à bras ouverts
    à bras-le-corps
    à bride abattue
    à but ?non¿ lucratif
    à cadence forcée
    à canon [court|long|scié]
    à cause [de|d’]  [ça|cela|ceci|moi|toi|lui|nous|vous|elle|elles|eux|iel|iels]
    à ce [compte-là|moment-là|titre]
    à ce [que|qu’] je [peux|pouvais|pus|pourrai|pourrais] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] tu [peux|pouvais|pus|pourras|pourrais] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce qu’ [il|elle|on|iel] [peut|pouvait|put|pourra|pourrait] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] nous [pouvons|pouvions|pûmes|pourrons|pourrions] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce [que|qu’] vous [pouvez|pouviez|pûtes|pourrez|pourriez] en [apercevoir|comprendre|juger|percevoir|voir]
    à ce qu’ [ils|elles|iels] [pouvent|pouvaient|purent|pourront|pourraient] en [apercevoir|comprendre|juger|percevoir|voir]
    à certains égards
    à cet égard
    à ciel ouvert
    à charge [de|d’] revanche
    à ?[si|très|trop]¿ chaudes larmes
    à cœur [joie|ouvert|perdu]
    à compter [de|d’] [demain|aujourd’hui|hier|maintenant]
    à connotation sexuelle
    à contre-jour
    à corps perdu
    à côté  [de|d’]  [ça|moi|toi|lui|nous|vous|elle|elles|eux|iel|iels]
    à couilles rabattues
    à coup sûr
    à couper le souffle
    à >coussin d’ air
    à couteaux tirés
    à défaut d’ autre chose
    à domicile ?fixe¿
    à dormir debout
    à dose homéopathique
    à *NUM reprises
    à @:B:[fe]:p reprises
    à [plusieurs|quelques|maintes] reprises
    à [de|d’]  ?[assez|aussi|si|très|trop]¿  [nombreuses|multiples|innombrables]  reprises
    à double [titre|tranchant]
    à en juger par [mon|ton|son|notre|votre|leur] ?immense¿ expérience
    à en juger par [ma|ta|sa|notre|votre|leur] [grande|petite] expérience
    à en perdre haleine
    à en perdre la tête
    à ?[moins|plus|si|très|trop]¿ faible [allure|revenu]
    à ?[moins|plus|si|très|trop]¿ faible tirant d’ eau
    à feu et à sang
    à flanc [de|d’] [colline|montagne]
    à fleur [de|d’] peau
    à franchement parler
    à fond [de|d’] train
    à fonds perdus
    à géométrie variable
    à glacer le sang
    à glacer les sangs
    à gorge déployée
    à ?[moins|plus|si|très|trop]¿ grand bruit
    à ?[moins|plus|si|très|trop]¿ grande échelle
    à ?[moins|plus|si|très|trop]¿ grands frais
    à ?[moins|plus|si|très|trop]¿ grands traits ?[imprécis|rageurs|précis|vagues]¿
    à ?[moins|plus|si|très|trop]¿ haut risque
    à ?[moins|plus|si|très|trop]¿ haute voix
    à ?[moins|plus|si|très|trop]¿ haute et intelligible voix
    à heure fixe
    à hue et à dia
    à huis clos
    à hurler [de|d’] rire
    à juste [raison|titre]
    à l’ [accoutumée|amiable|arrache|arraché|arrachée|avance|avenant|aveuglette|emporte-pièce|envi|évidence|étouffée|improviste|inverse|unanimité|unisson]
    à l’ air libre
    à l’ autre bout du fil
    à l’ avenir ?[incertain|prometteur]¿
    à l’ échelon [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    à l’ échelle [locale|cantonale|départementale|régionale|nationale|européenne|américaine|africaine|asiatique|continentale|internationale|planétaire|galactique|universelle]
    à l’ en croire
    à l’ environ
    à l’ état pur
    à l’ exclusion [de|d’] toute autre chose
    à l’ extrémité [est|ouest|nord|sud]
    à l’ ordre du jour
    à l’ un d’ entre [nous|vous|eux|iels]
    à l’ une d’ entre [nous|vous|elles|iels]
    à l’ échelle [nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle]
    à l’ exclusion [de|d’] toute autre chose
    à l’ œil nu
    à l’ [un|une] des leurs
    à l’ [un|une] comme à l’ autre
    à la [bourre|con|coule|dérobée|diable|leur|manque|mords-moi-le-nœud|papa|ramasse|renverse|redresse|rescousse|sauvette|va-vite|volée]
    à la belle étoile
    à la bonne franquette
    à la limite du supportable
    à la lumière [de|d’] tout [ceci|cela|ça]
    à la mords-moi le nœud
    à la petite semaine
    à la [force|pointe] [de|d’] l’ épée
    à la pointe du progrès ?[algorithmique|biologique|cybernétique|écologique|industriel|informatique|numérique|scientifique|social|spatial|technique|technologique]¿
    à la queue leu leu
    à la surprise générale
    à la virgule près
    à la vitesse [de|d’] l’ éclair
    à [un|cet|l’] instant t
    à ?[moins|plus|si|très|trop]¿ large échelle
    à ?[moins|plus|si|très|trop]¿ large spectre
    à ?[moins|plus|si|très|trop]¿ [court|moyen|long] rayon d’ action
    à ?[moins|plus|si|très|trop]¿ longue [distance|portée]
    à loyer modéré
    à main [armée|droite|gauche|levée|nue]
    à mains nues
    à maints égards
    à marche forcée
    à marée [basse|haute]
    à même le sol
    à merveille
    à [mi-course|mi-distance|mi-temps]
    à moindre [coût|cout]
    à moindres frais
    à mots couverts
    à [mes|tes|ses|nos|vos|leurs] [côtés|dépens|trousses]
    à [mes|tes|ses|nos|vos|leurs] risques et périls
    à [ma|ta|sa|notre|votre|leur] [connaissance|disposition|guise|portée]
    à [ma|ta|sa|notre|votre|leur] grande [surprise|tristesse]
    à [ma|ta|sa|notre|votre|leur] juste mesure
    à [mon|ton|son|notre|votre|leur] [avis|détriment|encontre|égard|gré|insu|sujet|tour]
    à [mon|ton|son|notre|votre|leur] [cœur|corps] défendant
    à [mon|ton|son|notre|votre|leur] grand [dam|désarroi|soulagement]
    à n’ en [pas|point] douter
    à n’ en plus finir
    à n’importe quel prix
    à nul autre pareil
    à nulle autre pareille
    à parler [franc|franchement|strictement]
    à part [entière|ça|cela|ceci]
    à parts égales
    à partir [de|d’]  rien
    à pas [de|d’] [géant|loup|tortue|velours]
    à pas feutrés
    à personne en danger
    à perte [de|d’] vue
    à petit feu
    à ?[si|très|trop|plus|moins]¿  petite [dose|échelle]
    à ?[si|très|trop]¿ peu [de|d’] choses près
    à ?[si|très|trop]¿ peu [de|d’] frais
    à peine
    à peu près
    à pied d’ œuvre
    à pieds joints
    à pile ou face
    à plat ventre
    à plate couture
    à plein [régime|temps|nez]
    à pleine gorge
    à pleins poumons
    à plus forte raison
    à plus d’ un titre
    à poil [court|dur|long|rêche]
    à poings fermés
    à point nommé
    à portée [de|d’] [main|tir|voix]
    à première vue
    à prix [coûtant|coutant|cassé+s|>modique]
    à [ma|ta|sa|notre|votre|leur] propre initiative
    à proprement parler
    à quatre pattes
    à qui [de|d’] droit
    à qui mieux mieux
    à qui [que|qu’] ce soit
    à quelque distance
    à quelques [degrés|exceptions|nuances|pourcents|variations|nanomètres|millimètres|centimètres|décimètres|mètres|kilomètres|parsecs|années-lumière] près
    à quelques-uns d’ entre [nous|vous|eux]
    à quelques-unes d’ entre [nous|vous|elles]
    à ras [de|d’] terre
    à ras [bord|bords]
    à ras [le|du] sol
    à rude épreuve
    à s’ y méprendre
    à somme nulle
    à spectre ?[assez|si|très|trop]¿ large
    à strictement parler
    à tarif réduit
    à tarifs réduits
    à taux [>fixe|>variable|zéro|nul+s]
    à tel point
    à temps  [plein|partiel|complet]
    à tête reposée
    à tire d’ [aile|ailes]
    à [tire-d’aile|tire-d’ailes]
    à titre [amical|bénévole|conservatoire|commercial|comparatif|confidentiel|consultatif|dérogatoire|exceptionnel|expérimental|fiduciaire|facultatif|indicatif|informatif|grâcieux|gratuit|honorifique|honoraire|humanitaire|informatif|indicatif|informel|juridique|liminaire|lucratif|nominatif|officieux|onéreux|personnel|posthume|préventif|provisoire|provisionnel|subsidiaire|temporaire|transitoire|universel|volontaire]
    à titre d’ [exemple|illustration|information]
    à titre [de|d’] comparaison
    à tombeau ouvert
    à tort ou à raison
    à tort et à travers
    à tour [de|d’] [bras|rôle]
    à tout [âge|coup|crin|instant|jamais|moment|prix]
    à tout bout [de|d’] champ
    à tout le [moins|monde]
    à tout point [de|d’] vue
    à tout un chacun
    à toute [allure|berzingue|bride|épreuve|force|reste|vapeur|vitesse|volée]
    à tous crins
    à tous points [de|d’] vue
    à toutes fins utiles
    à toutes jambes
    à travers terre et mer
    à tu et à toi
    à tue-tête
    à usage [interne|unique]
    à ?[moins|plus|si|très|trop]¿ vaste échelle
    à visage [découvert|humain]
    à vitesse constante
    à vitesse grand V
    à vive allure
    à voile et à vapeur
    à voix [haute|basse]
    à vol d’ oiseau
    à vrai dire
    à vue d’ œil
    à ?bien¿ y regarder [de|d’] plus près
    à ?bien¿ y [penser|réfléchir|songer|repenser]
    advienne [que|qu’] pourra
    après [moi|toi|soi|lui|eux]
    après coup
    après mûre réflexion
    après tout ,
    au bas mot
    au beau fixe
    au bon moment
    au bout du [compte|rouleau]
    au cas par cas
    au chômage partiel
    ?bien¿ au contraire
    au coude à coude
    au coup par coup
    au demeurant
    au doigt mouillé
    au doigt et à l’ [œil|oeil]
    au débotté
    au fait et au prendre
    au fil [de|d’] l’ épée
    au grand [complet|jamais]
    au hasard
    au jugé
    au lieu [de|d’] [cela|ceci|ça|quoi]
    au milieu [de|d’] nulle part
    au moment opportun
    au même titre [que|qu’] n’importe [laquelle|lequel] d’ entre [nous|vous|eux|elles]
    au pas [de|d’] [charge|course]
    au petit bonheur la chance
    au plan [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    au plus [près|pressé|vite]
    au plus haut [degré|point]
    au premier abord
    au premier coup d’ œil
    au prime abord
    au propre comme au figuré
    au préalable
    au ras des pâquerettes
    au saut du lit
    au second plan
    au sens [figuré|large|littéral|propre]
    au sens figuré comme au sens [littéral|propre]
    au sens [littéral|propre] comme au sens figuré
    au sens [étroit|figuré|large|littéral] du terme
    au surplus
    au-delà du descriptible
    à la [mienne|tienne|sienne|nôtre|vôtre|leur]
    au [mien|tien|sien|nôtre|vôtre|leur]
    aussi [con|étonnant|habile|idiot|inattendu|insolite|invraisemblable|maladroit|stupide|surprenant] [que|qu’] que [cela|ceci|ça] puisse [paraitre|paraître]
    aux [abois|aguets|miens|miennes|tiens|tiennes|siens|siennes|nôtres|vôtres|leurs]
    autant [que|qu’] [nécessaire|possible|prévu]
    autant [que|qu’] faire se peut
    autrement dit
    avant tout le monde
    avant toute chose
    avant toutes choses
    avant d’ aller plus loin
    avant d’ en arriver là
    avant [de|d’] faire quoi [que|qu’] ce soit
    avant [de|d’] faire quoi [que|qu’] ce soit [de|d’] ?$:W¿ [absurde|stupide|crétin|con|idiot|inconsidéré]
    avant qu’ il ne soit trop tard
    avant un bon bout [de|d’] temps
    avec beaucoup [de|d’] [circonspection|prudence]
    avec [aplomb|brio|constance|emphase|joie|légèreté|insistance|peine]
    avec autre chose
    avec le plus grand soin
    avec pertes et fracas
    avec tout le respect [que|qu’] je [vous|te|leur|lui] dois
    avec tout le respect [que|qu’] nous [vous|te|leur|lui] devons
    avec tout un chacun
    avec un peu [de|d’] chance
    ayant pignon sur rue
    beaucoup [plus|moins]
    bel et bien
    bien assez tôt
    bien souvent
    bon gré ?,¿ mal gré
    bras dessus ?,¿ bras dessous
    çà et là
    ce faisant
    ce qui [ne|n’] [est|était|fut|sera|serait] [pas|jamais|guère] pour [me|m’|te|t’|lui|nous|vous|leur] déplaire
    ce qui [ne|n’] [a|aura|aurait|avait|eut|eût] [pas|jamais|guère] été pour [me|m’|te|t’|lui|nous|vous|leur] déplaire
    chaque chose en son temps
    chose promise ?,¿ chose due
    comme [de|d’] juste
    comme bon [me|te|lui|leur|nous|vous] semble
    comme ci ?,¿ comme ça
    comme cul et chemise
    comme des fétus [de|d’] paille
    comme [frappé+ses] par la foudre
    comme gage [de|d’] bonne foi
    comme n’importe où ?ailleurs¿
    comme par [enchantement|magie]
    comme par un fait exprès
    comme pas deux
    comme peau [de|d’] chagrin
    comme prévu
    comme promis
    comme qui dirait
    comme si [de|d’] rien n’ était
    comme sur des roulettes
    comme un lion en cage
    comme un fétu [de|d’] paille
    comme une lettre à la poste
    contrairement aux apparences
    contre mauvaise fortune ?,¿ bon cœur
    contre nature
    contre toute [attente|vraisemblance]
    contre vents et marées
    contre [mon|ton|son|notre|votre|leur] gré
    côte à côte
    côté [face|pile]
    [coute|coûte] [que|qu’] [coute|coûte]
    [crois-le|croyons-le|croyez-le] ou [non|pas]
    cul par-dessus tête
    dans le cas contraire
    dans [ce|ces] [cas-là|cas-ci]
    dans ce cas [précis|particulier]
    dans ces cas [précis|particuliers]
    dans l’ état actuel
    dans l’ état actuel des choses
    dans l’ [idéal|immédiat]
    dans la mesure du possible
    dans la dernière ligne droite
    dans le feu [de|d’] l’ action
    dans leur globalité
    dans leur ?très¿ grande majorité
    dans tout [cela|ça|ceci]
    dans un cas comme dans l’autre
    dans une [certaine|large|moindre] mesure
    dans une mauvaise passe
    d’ abord
    d’ affilée
    d’ ailleurs
    d’ alors
    d’ [arrache-pied|arrachepied]
    d’ arrière en avant
    d’ autant [plus|moins]
    d’ autre part
    d’ avant en arrière
    d’ avant-guerre
    d’ à côté
    d’ âge mûr
    d’ emblée
    d’ empoigne
    d’ en [bas|dessous|face|haut]
    d’ entre [eux|elles|iels]
    d’ entrée [de|d’] jeu
    d’ est en ouest
    d’ extrême [droite|gauche] ?radicale¿
    d’ [extrême-droite|extrême-gauche] ?radicale¿
    d’ [égal|égale] à [égal|égale]
    d’ intérêt général
    d’ ordinaire
    d’ origine [inconnue|douteuse|étrangère|plébéienne|aristocratique]
    d’ ordre [général|public|privé]
    d’ où qu’ [il|elle|on|iel] vienne
    d’ où qu’ [ils|elles|iels] viennent
    d’ ouest en est
    d’ [ors|ores] et déjà
    d’ un autre côté
    d’ un [bout|jour] à l’ autre
    d’ un côté [comme|et] [de|d’] l’ autre
    d’ un commun accord
    d’ un pas [alerte|mesuré]
    d’ un peu partout
    d’ un revers [de|d’] main
    d’ un revers [de|d’] la main ?[droite|gauche]¿
    d’ un ?tout¿ autre ordre [de|d’] grandeur
    d’ une autre trempe
    d’ une [façon|manière] ou d’ une autre
    d’ une [façon|manière] aussi @:A.*:[fe]:[si] que possible
    d’ une certaine [façon|manière]
    d’ une tout autre ampleur
    d’ utilité publique
    de-ci ?,¿ de-là
    [de|d’] ?[assez|si|très|trop]¿ [faible|grande|médiocre|moindre|petite] [taille|envergure|stature|valeur]
    [de|d’] ?[assez|si|très|trop]¿ haute [lignée|lutte|naissance|stature|taille|valeur|volée]
    [de|d’] ?[assez|si|très|trop]¿ basse [condition|extraction|lignée|naissance]
    [de|d’] ?[assez|si|très|trop]¿ bon [aloi|cœur|goût|gout|gré|poil|sens|ton]
    [de|d’] ?[assez|si|très|trop]¿ mauvais [aloi|cœur|goût|gout|gré|poil]
    [de|d’] ?[assez|si|très|trop]¿ bonne [compagnie|facture|famille|foi|grâce|heure|humeur|qualité]
    [de|d’] ?[assez|si|très|trop]¿ haut [rang|vol]
    [de|d’] ?[assez|si|très|trop]¿ mauvaise [compagnie|facture|foi|grâce|humeur|qualité]
    [de|d’] *NUM %
    [de|d’] [conserve|fait|guingois|luxe|nouveau|permanence|partout|plain-pied|pacotille|préférence|rechange|routine|surcroît|surcroit|traviole|visu]
    [de|d’] A à Z
    [de|d’] bas en haut
    [de|d’] bas étage
    [de|d’] basse extraction
    [de|d’] belle [allure|prestance]
    [de|d’] bonne [compagnie|réputation]
    [de|d’] bouche en bouche
    [de|d’] bric et [de|d’] broc
    [de|d’] but en blanc
    [de|d’] ce fait ?[incontestable|irréfutable|même]¿
    [de|d’] ce seul fait
    [de|d’] ce point [de|d’] vue
    [de|d’] cette sorte
    [de|d’] cet acabit
    [de|d’] chaque côté
    [de|d’] côté
    [de|d’] courte vue
    [de|d’] deux choses l’ une
    [de|d’] droite à gauche
    [de|d’] droite comme [de|d’] gauche
    [de|d’] fâcheuse mémoire
    [de|d’] fil en aiguille
    [de|d’] fond en comble
    [de|d’] ?[assez|si|très|trop]¿ [fraîche|fraiche] date
    [de|d’] [gaieté|gaîté|gaité] [de|d’] cœur
    [de|d’] grand renom
    [de|d’] grande ampleur
    [de|d’] gauche à droite
    [de|d’] gauche comme [de|d’] droite
    [de|d’] génération en génération
    [de|d’] gré à gré
    [de|d’] gré ou [de|d’] force
    [de|d’] guerre lasse
    [de|d’] haut en bas
    [de|d’] haute main
    [de|d’] là-bas
    [de|d’] la meilleure [manière|façon] possible
    [de|d’] la même [façon|manière]
    [de|d’] la plus haute importance
    [de|d’] la sorte
    [de|d’] la tête aux pieds
    [de|d’] la veille
    [de|d’] long en large
    [de|d’] main [de|d’] [maître|maitre]
    [de|d’] mal en pis
    [de|d’] même nature
    [de|d’] mieux en mieux
    [de|d’] moindre [envergure|valeur]
    [de|d’] moins en moins
    [de|d’] nature [étrangère|inconnue|indéterminée|insolite]
    [de|d’] notoriété publique
    [de|d’] nulle part
    [de|d’] pire en pire
    [de|d’] par le monde ?entier¿
    [de|d’] part en part
    [de|d’] part et d’ autre
    [de|d’] ?presque¿ partout
    [de|d’] peu d’ importance
    [de|d’] pied ferme
    [de|d’] pire en pire
    [de|d’] pis en pis
    [de|d’] place en place
    [de|d’] plein [droit|fouet]
    [de|d’] plus belle ?[façon|manière]¿
    [de|d’] plus en plus
    [de|d’] point en point
    [de|d’] ?tout¿ premier [choix|ordre|plan]
    [de|d’] première [catégorie|main|nécessité]
    [de|d’] prime abord
    [de|d’] proche en proche
    [de|d’] [ma|ta|sa|notre|votre|leur] propre initiative
    [de|d’] pure forme
    [de|d’] sang-froid
    [de|d’] sang mêlé
    [de|d’] seconde [catégorie|importance|main|zone]
    [de|d’] sinistre mémoire
    [de|d’] source sûre
    [de|d’] taille moyenne
    [de|d’] telle sorte
    [de|d’] vive voix
    [de|d’] [nous|vous] tous
    [de|d’] tous [côtés|bords]
    [de|d’] tous les cas [de|d’] figure [possibles|imaginables|existants|rencontrés]
    [de|d’] tous les cas [de|d’] figure possibles et imaginables
    [de|d’] tous les cas [de|d’] figure imaginables et possibles
    [de|d’] tout poil
    [de|d’] tout premier [ordre|plan]
    [de|d’] tout [mon|ton|son|notre|votre|leur] cœur
    [de|d’] toute [évidence|façon|part|urgence]
    [de|d’] toutes [parts|pièces|sortes]
    [de|d’] toutes les possibilités [existantes|imaginables|rencontrées]
    [de|d’] toutes [mes|tes|ses|nos|vos|leurs] forces
    [de|d’] [mon|ton|son|notre|votre|leur] acabit
    [de|d’] [mon|ton|son|notre|votre|leur] mieux
    [de|d’] [mon|ton|son|notre|votre|leur] plein gré
    [de|d’] [mon|ton|son|notre|votre|leur] point [de|d’] vue
    [de|d’] [mon|ton|son|notre|votre|leur] propre [cru|chef|fait]
    [de|d’] [mon|ton|son|notre|votre|leur] vivant
    [de|d’] [ma|ta|sa|notre|votre|leur] part
    [de|d’] [ma|ta|sa|notre|votre|leur] propre volonté
    derrière tout [cela|ceci|ça]
    des pieds à la tête
    Dieu [m’|t’|l’|nous|vous|les] en [garde|préserve]
    Dieu [m’|t’|lui|nous|vous|leur] en soit témoin
    Dieu seul le sait
    dos à dos
    du bout des lèvres
    du coin [de|d’] l’ [œil|oeil]
    du fond du cœur
    du haut en bas
    du même [acabit|coup|ordre|tonneau]
    du moins ?,¿ pas
    du [nord|sud] au [nord|sud]
    du tac au tac
    du tout au tout
    eh bien
    en [aparté|apparence|arrière|avance|avant|catimini|cachette|ceci|cela|clair|commun|conséquence|continu|contrebas|contrepartie|dedans|définitive|détail|direct|distanciel|douce|effet|émoi|filigrane|général|goguette|hâte|loucedé|majorité|moyenne|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|présentiel|prime|privé|principe|priorité|public|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|tapinois|théorie|trompe-l’œil|vain|vérité]
    en réalité ?[augmentée|virtuelle]¿
    en âge [de|d’] procréer
    en aucun cas
    en aucune [façon|manière]
    en ?[assez|si|très|trop]¿ bas âge
    en ?[assez|si|très|trop]¿ bon état ?général¿
    en ?[assez|si|très|trop]¿ bon état [de|d’] [fonctionnement|marche]
    en ?[assez|si|très|trop]¿ bonne [compagnie|logique|place|posture|voie]
    en bonne et due forme
    en ?[assez|si|très|trop]¿ bonne santé ?[générale|physique|mentale|psychique]¿
    en bout [de|d’] course
    en cas [de|d’] besoin ?[absolu|impérieux]¿
    en cas [de|d’] doute ?[légitime|suffisant]¿
    en cas [de|d’] nécessité ?[absolue|impérieuse]¿
    en cas d’ urgence ?[absolue|impérieuse]¿
    en [chacun|chacune] [de|d’] ?entre¿ [nous|vous|eux|elles|iels]
    en chair et en os
    en chômage partiel
    en chute libre
    en comparution immédiate
    en ?[parfaite|pleine]¿ connaissance [de|d’] cause
    en contrebas
    en contrepoint
    en coup [de|d’] vent
    en coupe réglée
    en cours [de|d’] route
    en d’ autres termes
    en définitive
    en dehors [de|d’] ?tout¿ [ça|cela|ceci]
    en dents [de|d’] scie
    en dernier [lieu|recours|ressort]
    en dépit du bon sens ?[commun|élémentaire]¿
    en dépit du bon sens le plus [commun|élémentaire]
    en désespoir [de|d’] cause
    en détention provisoire
    en direction [de|d’] l’ [est|ouest]
    en direction du [nord|nord-est|nord-ouest|sud|sud-est|sud-ouest]
    en double aveugle
    en eau ?peu¿ profonde
    en eaux troubles
    en état [de|d’] choc ?circulatoire¿
    en ?[excellent|mauvais|parfait]¿ état [de|d’] [fonctionnement|marche]
    en état d’ ébriété ?avancée¿
    en ?[assez|si|très|trop]¿ excellent état ?général¿
    en ?[assez|si|très|trop]¿ fâcheuse posture
    en file indienne
    en fin [de|d’] compte
    en formation ?[assez|moins|peu|plus|si|très|trop]¿ serrée
    en ?[assez|si|très|trop]¿ forte [baisse|hausse]
    en gage [de|d’] bonne foi
    en garde à vue ?prolongée¿
    en ?[assez|si|très|trop|plus|moins]¿ grand nombre
    en ?[assez|si|très|trop]¿            grande [difficulté|majorité|partie|pompe]
    en ?[assez|si|très|trop|plus|moins]¿ haut lieu
    en ?[assez|si|très|trop]¿            haute [estime|mer|montagne]
    en l’ absence [de|d’] preuve suffisante
    en l’ absence [de|d’] preuve suffisante du contraire
    en l’ absence [de|d’] preuves suffisantes
    en l’ absence [de|d’] preuves suffisantes du contraire
    en l’ état actuel
    en l’ état actuel des choses
    en l’ occurrence
    en lieu sûr
    en ligne [de|d’] [compte|mire]
    en main propre
    en mains propres
    en ?[assez|si|très|trop]¿ mauvais état
    en ?[assez|si|très|trop]¿ mauvais état [de|d’] [fonctionnement|marche]
    en ?[assez|si|très|trop]¿ mauvaise [posture|santé]
    en nombre ?[assez|si|très|trop|relativement]¿ [insuffisant|limité|suffisant]
    en nombre plus [que|qu’] suffisant
    en odeur [de|d’] sainteté
    en ordre [dispersé|serré]
    en partant [de|d’] zéro
    en partie ou en totalité
    en pente douce
    en ?[assez|si|très|trop]¿ petit nombre
    en place publique
    en plein [air|cœur|essor|marasme|jour|visage]
    en plein dans le mille
    en pleine [face|gueule|figure|forme|nuit|poire|tronche]
    en perte [de|d’] vitesse
    en ?[assez|si|très|trop]¿ [piteux|piètre] état
    en ?[assez|si|très|trop]¿ [piteux|piètre] état [de|d’] conservation
    en point [de|d’] [mire|orgue]
    en porte-à-faux
    en position [de|d’] [force|faiblesse]
    en premier lieu
    en première [instance|ligne]
    en [première|seconde|~ième$] [classe|instance|position]
    en [1ʳᵉ|2ᵉ|3ᵉ|4ᵉ|5ᵉ|6ᵉ|7ᵉ|8ᵉ|9ᵉ|10ᵉ|11ᵉ|12ᵉ|13ᵉ|14ᵉ|15ᵉ|16ᵉ|17ᵉ|18ᵉ|19ᵉ|20ᵉ] [classe|position]
    en provenance du monde entier
    en pure perte
    en quantité suffisante
    en quantité plus [que|qu’] suffisante
    en quelque sorte
    en queue [de|d’] peloton
    en rangs [dispersés|serrés]
    en rangs d’ oignons ?serrés¿
    en rase campagne
    en rase-mottes
    en règle générale
    en roue libre
    en second lieu
    en sens inverse
    en simultané
    en situation [irrégulière|régulière]
    en sous-main
    en sous-nombre ?[évident|flagrant]¿
    en sous nombre ?[évident|flagrant]¿
    en tant [que|qu’] >tel
    en tête à tête
    en tête-à-tête
    en si peu [de|d’] temps
    en terrain [découvert|miné]
    en termes choisis
    en terrain [accidenté|conquis]
    en terre battue ?[claire|ocre|jaune|rouge|noire|sombre|humide|sèche|maculée|sale|dégueulasse]¿
    en terre étrangère
    en toile [de|d’] fond
    en totalité ou en partie
    en tout cas
    en tous les cas
    en tous les sens
    en tout bien tout honneur
    en tout [cas|genre|lieu|sens|point|temps]
    en tout et pour tout
    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
    en [mon|ton|son|leur|notre|votre] for intérieur
    en [mon|ton|son|leur|notre|votre] nom propre
    en ce qui [me|te|le|la|les|nous|vous] [concerne|concernait]
    en voilà ?bien¿ [assez|trop|suffisamment]
    encore et [encore|toujours]
    entre chien et loup
    entre [de|d’] [bonnes|mauvaises] mains
    entre nous soit dit
    entre [quatre|quatr’|quat’] [zyeux|yeux]
    entre [quatre-zyeux|quatr’zyeux|quat’zyeux|quatre-yeux|quatr’yeux|quat’yeux]
    envers et contre tout
    épaule contre épaule
    et ainsi [de|d’] suite
    et pas qu’ un peu
    et tutti quanti
    et vice versa
    et vice-versa
    excepté le [mien|tien|sien|nôtre|vôtre|leur]
    excepté la [mienne|tienne|sienne|nôtre|vôtre|leur]
    excepté les [miens|miennes|siennes|nôtres|vôtres|leurs]
    face à face
    flanc contre flanc
    ?d’¿ hors d’ ici
    ?d’¿ hors [de|d’] [contrôle|portée|atteinte]
    ?d’¿ hors d’ état [de|d’] [fonctionner|nuire]
    ?d’¿ hors [de|d’] [ma|ta|sa|notre|votre|leur] portée
    ?d’¿ hors du commun
    ?d’¿ ici
    ?d’¿ ici [comme|ou] ailleurs
    ?d’¿ ici et [là|maintenant]
    ?d’¿ ici même
    ?d’¿ ici-bas
    illico ?presto¿
    d’ intra-muros
    j’ en [passe|passai+s] et des [meilleurs|meilleures]
    jusqu’ au bout des ongles
    jusqu’ à bac
    jusqu’ à plus soif
    jusqu’ à >preuve du contraire
    jusqu’ à satiété
    jusqu’ à un certain point
    jusqu’ à l’ écœurement
    jusqu’ au trognon
    jusque-là
    [de|d’] là
    [de|d’] là-bas
    [de|d’] là-haut
    [de|d’] là-dedans
    [de|d’] là-dehors
    [de|d’] là-derrière
    [de|d’] là-dessous
    [de|d’] là-dessus
    [de|d’] là-devant
    ?[de|d’]¿ là non plus
    ¿[de|d’]¿ la fleur au fusil
    ¿[de|d’]¿ la main dans la main
    ¿[de|d’]¿ la mort dans l’ âme
    ¿[de|d’]¿ la queue entre les jambes
    ¿[de|d’]¿ la peur au ventre
    l’ air [de|d’] rien
    la gorge [nouée|serrée]
    la mort dans l’ âme
    la tête entre [mes|tes|ses|nos|vos|leurs] mains
    ?le¿ dos au mur
    le cas échéant
    le cœur battant la chamade
    le cœur [gros|serré]
    le moins du monde
    le moment venu
    les [choses|événements|évènements] suivant leur cours ?[endiablé|effréné|frénétique|implacable|inarrêtable]¿
    loin d’ être
    loin s’ en [faut|fallait]
    malgré [ça|cela|ceci|tout]
    manu militari
    mezza voce
    mieux [vaut|valait] tard [que|qu’] jamais
    moins [tôt|tard]
    moins [que|qu’] [nécessaire|prévu]
    moitié *WORD ?,¿ moitié *WORD
    mot [à|pour] mot
    ne [lui|leur|m’|t’|nous|vous] en déplaise
    nez à nez
    ?[de|d’]¿ n’importe où
    ni plus ?,¿ ni moins
    ni vu ?,¿ ni connu
    non [plus|seulement]
    non sans raison
    non sans mal
    ¿[de|d’|vers]¿ nulle part
    ô combien
    ou quelque chose d’ [approchant|identique]
    ou quelque chose [de|d’] similaire
    où bon [me|te|lui|nous|vous|leur] semble
    oui [ou|et] non
    outre mesure
    par [à-coups|ailleurs|avance|chance|conséquent|curiosité|contre|défaut|définition|endroits|essence|excellence|exemple|hasard|ici|inadvertance|là|mégarde|nature|principe|terre]
    par ?simple¿ acquit [de|d’] conscience
    par [beau|mauvais] temps
    par bien des [aspects|côtés]
    par ?[pure|simple]¿ bonté [de|d’] [âme|cœur]
    par ce biais
    par certains [aspects|côtés]
    par définition
    par ex .
    p. ex .
    par grand froid
    par gros temps
    par la force des choses
    par mesure [de|d’] sécurité
    par monts et par vaux
    par personne interposée
    par personnes interposées
    par tout le monde
    par voie [de|d’] [conséquence|mer|terre]
    par voie d’ exception
    par-ci ?,¿ par-là
    par-derrière
    par-dessus le marché
    par-dessus tout
    par-devant
    par là ?même¿
    par [un|le] simple effet du hasard
    partant [de|d’] là
    pas du tout
    pas [le|l’] moins du monde
    pas à pas
    petit à petit
    peu ou prou
    peu à peu
    pile poil
    plein [nord|sud|ouest]
    plus bas [que|qu’] terre
    plus du tout
    plus ou moins
    plus [que|qu’] [nécessaire|prévu|jamais]
    plus [que|qu’] tout au monde
    plus [que|qu’] toute autre chose
    pour [ce|c’] [que|qu’] [ça|cela|ceci] vaut
    pour [ce|c’] [que|qu’] j’ en [sais|savais|sus|saurai|saurais]
    pour [ce|c’] [que|qu’] tu en [sais|savais|sus|sauras|saurais]
    pour [ce|c’] [que|qu’] [il|elle|on|iel] en [sait|savait|sut|saura|saurait]
    pour [ce|c’] [que|qu’] nous en [savons|savions|sûmes|saurons|saurions]
    pour [ce|c’] [que|qu’] vous en [savez|saviez|sûtes|saurez|sauriez]
    pour [ce|c’] [que|qu’] [ils|elles|iels] en [savent|savaient|surent|sauront|sauraient]
    pour [celui|celle|ceux|celles] et [celui|celle|ceux|celles] [que|qu’] [ça|cela|ceci] intéresse
    pour [celui|celle|ceux|celles] [que|qu’] [ça|cela|ceci] intéresse
    pour [ma|ta|sa|notre|votre|leur] [gouverne|part]
    pour [mon|ton|son|notre|votre|leur] propre [compte|bien]
    pour [m’|t’|s’|nous|vous|leur] en rendre compte
    pour ainsi dire
    pour ce faire
    pour ce [que|qu’] [j’|tu] en [sais|savais]
    pour couronner le tout
    pour [de|d’] bon
    pour faire bonne mesure
    pour faire simple
    pour la plupart
    pour la suite
    pour [le|l’] [mieux|moment|moins]
    pour [le|l’] meilleur et pour [le|l’] pire
    pour l’ amour du ciel
    pour l’ [essentiel|instant|heure]
    pour quelque part
    pour >raison [de|d’] santé ?[défaillante|déficiente|fragile]¿
    pour rien au monde
    pour tout dire
    pour un oui ou pour un non
    pour une bonne part
    pour y parvenir
    pour ça [vaut|valait]
    quand bien même
    quand bon [me|te|lui|nous|vous|leur] [semble|semblera|semblait]
    quant à [ça|cela|ceci]
    qu’ à cela ne tienne
    [que|qu’] [ça|ceci|cela] [me|te|lui|leur|nous|vous] plaise ou non
    ##
    [que|qu’] je [le|l’] veuille ou non
    [que|qu’] tu [le|l’] veuilles ou non
    qu’ [il|elle|on|iel] [le|l’] veuille ou non
    [que|qu’] vous [le|l’] vouliez ou non
    [que|qu’] nous [le|l’] voulions ou non
    qu’ [ils|elles|iels] [le|l’] veuillent ou non
    ##
    [que|qu’] [je|j’] m’ en réjouisse ou que [je|j’] le déplore
    [que|qu’] tu t’ en réjouisses ou que tu le déplores
    qu’ [il|elle|iel|on] s’ en réjouisse ou qu’ [il|elle|iel|on] le déplore
    [que|qu’] nous nous en réjouissions ou que nous le déplorions
    [que|qu’] vous vous en réjouissez ou que vous le déploriez
    qu’ [ils|elles|iels] s’ en réjouissent ou qu’ [ils|elles|iels] le déplorent
    ##
    quel qu’ en soit [le|l’] [moyen|prix|danger]
    quel qu’ en soit [le|l’] risque ?[économique|financier|légal|juridique|militaire]¿
    quelle qu’ en soit la [cause|raison]
    quelque peu
    ?[de|d’]¿ quelque part
    qui plus est
    quoi qu’ il [arrive|arrivât|advienne|advînt]
    quoi qu’ il soit [arrivé|advenu]
    quoi qu’ il en [coûte|coûtât|coute|coutât]
    ric et rac
    rien [que|qu’] d’ y penser
    sauf >erreur [de|d’] [ma|ta|sa|notre|votre|leur] part
    sans ?grand¿ succès
    sans [broncher|déconner|réagir|tarder]
    sans [ambages|arrêt|cesse|conteste|doute|encombre|encombres|équivalent|fin|relâche|répit|trêve|vergogne]
    sans [grande|grosse] difficulté ?[apparente|aucune|financière|majeure|particulière]¿
    sans aucun doute
    sans autre forme [de|d’] procès
    sans commune mesure
    sans contredit
    sans coup férir
    sans crier gare
    sans difficulté ?[apparente|aucune|financière|majeure|particulière]¿
    sans dire mot
    sans en avoir conscience
    sans >état d’ âme
    sans [m’|t’|s’|nous|vous] en apercevoir
    sans [m’|t’|s’|nous|vous] en rendre compte
    sans [me|m’|te|t’|se|s’|nous|vous] faire [attendre|avoir|comprendre|désirer|entendre|prier|remarquer|repérer|surprendre|voir]
    sans [me|m’|te|t’|se|s’|nous|vous] douter [de|d’] rien
    sans faire [de|d’] vagues
    sans foi ?,¿ ni loi
    sans grand résultat
    sans [le|l’] faire exprès
    sans [le|l’] vouloir
    sans l’ aide [de|d’] personne
    sans l’ ombre d’ un doute
    sans mot dire
    sans nul doute
    sans perdre [de|d’] temps
    sans pour autant y [parvenir|réussir|réfléchir|songer|penser]
    sans pour autant y [faire|prêter] attention
    sans pour autant y prendre [garde|goût|gout]
    sans [me|m’|te|t’|lui|nous|vous|leur|y] prêter attention
    sans [que|qu’] je [le|l’] [sache|susse]
    sans [que|qu’] tu [le|l’] [saches|susses]
    sans [que|qu’] [il|elle|on|$:M] [le|l’] [sache|sût]
    sans [que|qu’] nous [le|l’] [sachions|sussions]
    sans [que|qu’] vous [le|l’] [sachiez|sussiez]
    sans [que|qu’] [ils|elles|iels] [le|l’] [sachent|sussent]
    sans s’ en rendre compte
    sans que [je|j’] m’ en [rende|rendisse] compte
    sans que tu t’ en [rendes|rendisses] compte
    sans qu’ [il|elle|on|iel] s’ en [rende|rendît] compte
    sans que nous nous en [rendions|rendissions] compte
    sans que vous vous en [rendions|rendissiez] compte
    sans qu’ [ils|elles|iels] s’ en [rendent|rendissent] compte
    sans queue ni tête
    sans précédent
    sans raison apparente
    sans résultat probant
    sans tambour ?,¿ ni trompette
    sans [croiser|rencontrer|voir] personne
    sans [croiser|rencontrer|voir] âme qui vive
    sans ?jamais¿ [ciller|flancher|tergiverser]
    sans vouloir [me|m’|te|t’|lui|nous|vous|leur] manquer [de|d’] respect
    sans y [croire|parvenir|réussir|réfléchir|songer|penser]
    sans y [faire|prêter] attention
    sans y prendre [garde|goût|gout|ombrage]
    selon toute [apparence|vraisemblance]
    sens dessus dessous
    sens devant derrière
    >seul à >seul
    s’ il le [faut|fallait|fallut|faudra|faudrait]
    s’ il l’ [a|avait|eut|aura|aurait] fallu
    si [bas|haut|longtemps|nécessaire|peu|possible|soudain]
    si [cela|ça|ceci] ne tenait qu’ à [moi|toi|lui|eux|elle|elles|nous|vous|iel|iels]
    si besoin est
    si le besoin s’ en [fait|faisait] sentir
    si le besoin [doit|devait] s’en faire sentir
    si tel est le cas
    si tant est que ce ?[ne|n’]¿ [soit|fût] ?pas¿ @:A.*:[me]:[si]
    sine qua non
    sitôt dit ?,¿ sitôt fait
    six pieds sous terre
    soit dit en passant
    sous aucun prétexte
    sous bonne [escorte|garde]
    sous coupe réglée
    sous haute [surveillance|tension]
    stricto sensu
    sur [mon|ton|son|notre|votre|leur] [trente-et-un|31]
    sur [mon|ton|son|notre|votre|leur] trente et un
    sur ce ,
    sur ce plan-là
    sur la défensive
    sur le devant [de|d’] la scène
    sur la forme comme sur le fond
    sur la même longueur d’ onde
    sur la sellette
    sur le fil du rasoir
    sur le plan [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel]
    sur le pied [de|d’] guerre
    sur le qui-vive
    s’ il [te|vous] [plaît|plait]
    tant bien que mal
    tant s’ en faut
    tour à tour
    tout aussi
    tous comptes faits
    tous ensemble
    tous frais payés
    tout [bonnement|simplement]
    tout au plus
    tout aussi bien
    tout bien [considéré|réfléchi|pesé]
    tout compte fait
    tout [de|d’] même ?[pas|jamais]¿
    tout du long
    tout feu ?,¿ tout >flamme
    tout à fait
    tout [de|d’] go
    toute honte bue
    toutes choses égales par ailleurs
    toutes ensemble
    toutes griffes dehors
    toutes proportions gardées
    toutes voiles dehors
    trait pour trait
    tremblant de tout [mon|ton|son|notre|votre|leur] corps
    très [bas|haut|bien|mal]
    un à un
    une à une
    un petit peu
    un peu
    un peu mieux
    un peu moins bien
    un peu partout
    un tant soit peu
    un tout petit peu
    urbi et orbi
    vaille que vaille
    ventre à terre
    vers nulle part
    vite fait ?,¿ bien fait
        <<- &>> :LW



!!
!!
!!!! Noms propres                                                                                 !!
!!
!!
................................................................................
#    <<- \1 == \2
#        and not value(\2, "|nous|vous|faire|en|la|lui|donnant|œuvre|ah|oh|eh|hé|ho|ha|hou|olé|joli|Bora|couvent|dément|sapiens|très|vroum|")
#        and not (value(\1, "|est|une|") and value(<1, "|l’|d’|"))
#        and not (\2 == "mieux" and value(<1, "|qui|"))
#    ->> \1                                                                                          && Doublon.
#
#TEST: Il y a un {{doublon doublon}}.                                                                ->> doublon



!!
!!
!!!! Élisions & euphonie                                                                          !!
!!
!!
................................................................................

!!!
!!!
!!! Processeur: épuration des adverbes, locutions adverbiales, interjections et expressions usuelles  !!
!!!
!!!















































































































































































































































































































































































































































































































































































































































































































































































__purge_locutions_adverbiales__




























































    &:LW
        <<- ~>> *


















































__purge_adverbes_temporels__
    après-demain

    aujourd’hui
    auparavant
    aussitôt









    avant-hier








































































































    déjà
    demain
    désormais
    dorénavant
    hier
    maintenant
    parfois
    quelquefois
    soudain
    souvent
    sur-le-champ
    tard
    toujours
    toutefois
        <<- ~>> *

    tôt
        <<- not (value(>1, "|fait|") and value(>2, "|de|d’|") and morph(<1, ">avoir/")) ~>> *
































































































































__purge_un_nombre__
    un  *NUM  @:A.*:s¬:G
        <<- ~2>> *

TEST: l’équipe veut aussi voir dans la lettre le nombre d’or, un symbole d’harmonie, ainsi qu’un 6 retourné.

................................................................................
    <start>  mais
    <start>  m’  est   avis  [que|qu’]
    <start>  or  donc
    <start>  puis
    [<start>|,|(] grand bien lui fasse
        <<- ~2:0>> *



































__purge_locutions_incises__
    [<start>|,|(] [oui|non] [<end>|,|)]
    [<start>|,|(] ?oui¿ ou non [<end>|,|)]
    [<start>|,|(] et non l’ inverse [<end>|,|)]
    [<start>|,|(] fait remarquable [<end>|,|)]
    [<start>|,|(] entre autres ?choses¿ [<end>|,|)]
    [<start>|,|(] mieux encore [<end>|,|)]
    [<start>|,|(] n’ est-ce pas [<end>|)]
        <<- ~2:-2>> *















































__purge_adverbes__













































































































































































































































    ah
    ailleurs
    alors













































    aussi






























    bientôt



    cahin-caha



    cependant
    [cela|ça|ceci] mis à part
    [cela|ça|ceci] va sans dire
    [cela|ceci] étant dit
    certes
    ci-dessous
    ci-dessus












































































































































































































    debout
    derechef

    donc



































































































































































    enfin





    entre-temps
    entretemps
    ensuite







    euh





    guère











    intra-muros









    là

    là-bas
    là-haut
    là-dedans
    là-dehors
    là-derrière
    là-dessous
    là-dessus
    là-devant

















    loin









    mouais
    naguère

    néanmoins









    oh

































    partout






    peut-être








    plutôt

































    pourtant
    près
    presque
    primo










































































































    soi-disant



















    secondo
    surtout



    tantôt
    tertio





































    très
    volontiers
        <<- ~>> *


__purge_l_un_l_autre_les_uns_les_autres__
    à l’ un et ?à¿ l’ autre ?>sexe¿
    à l’ un comme à l’ autre ?>sexe¿
................................................................................
    village [après|par] village
    voiture [après|par] voiture
    wagon [après|par] wagon
        <<- not morph(<1, ":D") ~>> *


__gestion_mots_grammaticaux__






































































    tout au [bout|long] [de|du|d’|des]
        <<- not morph(<1, ":R") ~1>> *






    ainsi
        <<- not value(>1, "|que|qu’|") ~>> *

    alentour
        <<- not morph(<1, ":D") ~>> *

    au moins  @:[DB]
................................................................................
    pas [assez|trop]
        <<- not morph(<1, ":D.*:(?:m:s|[me]:p)") ~1>> *

    pour  toujours  @:[AQ]
        <<- ~1:2>> *


__purge_adverbes2__
    [assez|trop]  ~ment$
        <<- morph(\2, ":W", ":3p") ~>> *

    @:[NAQ]  [le|la]  [plus|moins]  ~.ment$  $:A
        <<- morph(\-2, ":W", ":A") ~2:-2>> *

    complètement
................................................................................
TEST: Il n’y avait plus qu’à faucher le blé noir, arracher les pommes de terre et gauler noix et châtaignes ; de ceci les gamins se chargeaient le jeudi et le dimanche, pour se distraire.
TEST: Les études révèlent un risque d’écrêtement du trafic ferroviaire dès 2025, lorsque la demande est la plus critique, c’est-à-dire le vendredi soir à l’heure de pointe.
TEST: Beaucoup de conciles émaneront des normes pour que soient nommés des curés idoines, qui soient vraiment au service de la paroisse, qui se distinguent par leur science et qui soient de vrais pasteurs au sein de la communauté de fidèles.
TEST: Les ailes de cet avion viennent de Grande-Bretagne.
TEST: La liberté passait sur le monde, l’internationale était sa voix criant par-dessus les frontières les revendications des déshérités.
TEST: La danse est d’ailleurs en ce sens salvatrice.
TEST: La gauche a fait main basse sur la plupart des villes vaudoises, les Verts bondissent aux législatifs.
TEST: cette organisation est à partir de 1945 composée de membres venus de…



@@@@
@@@@
@@@@
@@@@
................................................................................
        <<- /conf/ -3>> nues                                    && Confusion. Écrivez “nues” (ancien terme pour “nuages”).|https://fr.wiktionary.org/wiki/tomber_des_nues

TEST: Elle en est tombée des {{nus}}.                           ->> nues


# numérique / digital
__conf_numérique_digital__
    [>agence|>appareil|>banque|>caméra|>colonie|>colonisation|>communication|>compagnie|>connexion]     >digital
    [>document|>économie|>entreprise|>ère|>expérience|>fichier|>identité|>industrie|>présence|>prise]   >digital
    [>service|>solution|>stratégie|>télévision|>transformation|>transition|>révolution]                 >digital
        <<- /conf/ -2>> numérique|numériques
        && Confusion : “digital” est un adjectif se rapportant aux doigts (empreinte digitale, arthrose digitale, etc.). Écrivez “numérique”.

    [le|du|au] digital
        <<- /conf/ -2>> numérique
        && Confusion : “digital” est un adjectif se rapportant aux doigts (empreinte digitale, arthrose digitale, etc.). Écrivez “numérique”.

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

TEST: deux femmes, {{blessé}} par deux fois                                                 ->> blessées
TEST: trois hommes, {{blessée}} dans leur orgueil                                           ->> blessés


__gn_des_2m__
    des  *WORD  *WORD
        <<- /gn/ (morphx(\1, ":LR") or 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: à {{grande}} {{enjambées}}                                ->> grandes|||enjambée
TEST: pour {{grande}} {{appartement}}                           ->> grand|||
TEST: une femme sans a priori


__gn_pfx_de_2m__
    [de|d’]  @:[NA]¬:[YG]  @:[NA]¬*
        <<- /gn/ (morphx(\1, ":LR") or not morph(<1, ":[NA]|>(?:et|ou)/")) and not apposition(\2, \3) >>>
        <<- /gn/ (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*"))

        -3>> =switchGender(\3)                                                                      && Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 && Accord de genre erroné avec « \3 ».
        <<- /gn/ (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*"))

        -3>> =switchPlural(\3)                                                                      && Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    && Accord de nombre erroné avec « \3 ».

TEST: Ils ont de {{grandes}} {{oreille}}                        ->> grande|||oreilles
TEST: de {{grands}} {{homme}}                                   ->> grand|||hommes
TEST: de {{petite}} {{homme}}                                   ->> petit|||
TEST: de {{pousse}} {{actif}}                                   ->> poussé|||active
................................................................................

    à deux doigts                               [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “à deux doigts de”, le verbe devrait être à l’infinitif.

    à >seul >fin                                [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “à seule fin de”, le verbe devrait être à l’infinitif.

    au lieu                                     [de|d’]  ?[le|les|nous|vous|lui]¿             ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “au lieu de”, le verbe devrait être à l’infinitif.

    au lieu                                     [de|d’]  [l’|la|leur]                         ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":[MN]") --1>> =suggVerbInfi(\-1)                       && Après “au lieu de”, le verbe devrait être à l’infinitif.

    >avoir l’ air                               [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “avoir l’air de”, le verbe devrait être à l’infinitif.

    >avoir la chance                            [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..(?:ée?s?|ez)$
        <<- /infi/ morph0(\-1, ":(?:Q|2p)", ":M") --1>> =suggVerbInfi(\-1)                          && Après “avoir la chance de”, le verbe devrait être à l’infinitif.
................................................................................
    de  [la|l’|leur]  @:[NA]¬:Y  <end>
    de  [la|l’|leur]  @:[NA]¬:Y  ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    de  [la|l’|leur]  @:[NA]¬:Y  @:[VR]¬:[NAP]
    de  [la|l’|leur]  @:[NA]¬:Y  , @¬:[NA]
    de  [la|l’|leur]  @:[NA]¬:Y  ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:3>> *

    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  <end>
    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  @:[VR]¬:[NAP]
    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  [/_VCint_|/_VCimp_]
        <<- ~1:-2>> *

    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  ,  @:¬:A
    &:LR  [la|l’|leur|un|une|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leurs]  @:[NA]  ,  [/_VCint_|/_VCimp_]
        <<- ~1:-3>> *

    &:LR @:[NA] <end>
    &:LR @:[NA] [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    &:LR @:[NA] @:[VR]¬:[NAP]

    &:LR @:[NA] [/_VCint_|/_VCimp_]
        <<- ~1:-2>> *

    &:LR @:[NA] ,  @:¬:A
    &:LR @:[NA] ,  [/_VCint_|/_VCimp_]
        <<- ~1:-3>> *

    en [plein|pleine] @:[NA]  <end>
    en [plein|pleine] @:[NA]  ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles|est]
    en [plein|pleine] @:[NA]  @:[VR]¬:[NAP]
    en [plein|pleine] @:[NA]  , @¬:[NA]
    en [plein|pleine] @:[NA]  ?,¿  [/_VCint_|/_VCimp_]
        <<- ~1:3>> *
................................................................................


    [<start>|,|(]  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  vas
    [<start>|,|(]  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          vas
    [<start>|,|(]  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              vas
    [<start>|,|(]  [ne|n’]  [lui|leur]               en                           vas
    [<start>|,|(]  vas
        <<- /imp/ not tagbefore(\2, "_CUT_") and not value(>1, "|tu|") --1>> va     && S’il s’agit d’un impératif, pas de “s”.

TEST: {{Vas}} lui mettre une branlée.                                                       ->> Va
TEST: {{Vas}} au diable !                                                                   ->> Va
TEST: N’y {{vas}} pas                                                                       ->> va
TEST: Si vraiment tu es d’attaque et que Martine est d’accord, {{vas}} dans…                ->> va
TEST: — Va-t’en ! [Firefox]

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

# verbes du 1ᵉʳ et du 3ᵉ groupe en -e
__imp_verbe_groupe1__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+es$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+es$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+es$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+es$
        <<- /imp/ not tagbefore(\2, "_CUT_") and morph(\-1, ":V[13].*:Ip.*:2s", ":G") and not value(>1, "|tu|")
        --1>> =\-1[:-1]                                                             && S’il s’agit d’un impératif, pas de “s”.

    <start>  ~\w\w+es$
        <<- /imp/ not tagbefore(\2, "_CUT_") and morph(\-1, ":V[13].*:Ip.*:2s", ":[GNAM]") and not value(>1, "|tu|")
        --1>> =\-1[:-1]                                                             && S’il s’agit d’un impératif, pas de “s”.

TEST: {{Apportes}} ton fric à cet homme.                                                    ->> Apporte
TEST: N’{{abandonnes}} pas si vite.                                                         ->> abandonne
TEST: Ne {{demandes}} rien, tais-toi.                                                       ->> demande
TEST: — {{Abandonnes}}.                                                                     ->> Abandonne
TEST: {{Écartes}} de moi cette coupe.                                                       ->> Écarte
................................................................................

# verbes du 2ᵉ et du 3ᵉ groupe en -t
__imp_verbe_groupe2_groupe3_t__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+t$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+t$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+t$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+t$
        <<- /imp/ not tagbefore(\2, "_CUT_") and not value(>1, "|il|elle|on|ils|elles|iel|iels|")
            and not value(\-1, "|provient|")
            and not (value(\-1, "|vient|dit|surgit|survient|périt|") and morph(>1, ":(?:[MD]|Oo)|>[A-Z]/"))
            and morph(\-1, ":V[23].*:Ip.*:3s", ":G|>(?:devoir|suffire|para[îi]tre)/") and analyse(\-1[:-1]+"s", ":E:2s")
        --1>> =\-1[:-1]+"s"                                                         && S’il s’agit d’un impératif, la terminaison est “s”, non “t”.

    <start>  ~\w\w+t$
        <<- /imp/ not tagbefore(\2, "_CUT_") and not value(>1, "|il|elle|on|ils|elles|iel|iels|")
            and not value(\-1, "|provient|")
            and not (value(\-1, "|vient|dit|surgit|survient|périt|") and morph(>1, ":(?:[MDR]|Oo)|>[A-Z]/"))
            and morph(\-1, ":V[23].*:Ip.*:3s", ":[GNA]|>(?:devoir|suffire|para[îi]tre)/") and analyse(\-1[:-1]+"s", ":E:2s")
        --1>> =\-1[:-1]+"s"                                                         && S’il s’agit d’un impératif, la terminaison est “s”, non “t”.

TEST: {{Finit}} ton assiette.                                           ->> Finis
TEST: Ne {{pourrit}} pas l’ambiance.                                    ->> pourris
................................................................................

# verbes du 3ᵉ groupe en -d
__imp_verbe_groupe3_d__
    <start>  [ne|n’]  ?[le|la|l’|les|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  ~\w\w+d$
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|la|l’|les|en|y]          ~\w\w+d$
    <start>  [ne|n’]  [le|la|l’|les]           [lui|leur|en|y]              ~\w\w+d$
    <start>  [ne|n’]  [lui|leur]               en                           ~\w\w+d$
        <<- /imp/ not tagbefore(\2, "_CUT_") and not value(>1, "|il|elle|on|")
            and not ( value(\-1, "|répond|") and (morph(>1, ":[MD]|>[A-Z]/") or value(>1, "|l’|d’|")) )
            and morph(\-1, ":V3.*:Ip.*:3s", ":G")
        --1>> \-1s                                                                  && S’il s’agit d’un impératif, ajoutez un “s”.

    <start>  ~\w\w+d$
        <<- /imp/ not tagbefore(\2, "_CUT_") and not value(>1, "|il|elle|on|")
            and not ( value(\-1, "|répond|") and (morph(>1, ":[MD]|>[A-Z]/") or value(>1, "|l’|d’|")) )
            and morph(\-1, ":V3.*:Ip.*:3s", ":[GNA]")
        --1>> \-1s                                                                  && S’il s’agit d’un impératif, ajoutez un “s”.

TEST: {{Prend}} le chemin de droite.                                    ->> Prends
TEST: N’{{attend}} pas qu’elle vienne.                                  ->> attends
TEST: Ne me {{prend}} pas pour un idiot                                 ->> prends
TEST: Ne l’{{attend}} pas                                               ->> attends
TEST: Ne m’y {{attend}} pas                                             ->> attends
TEST: {{Attend}} la correction.                                         ->> Attends
TEST: {{Répond}}.                                                       ->> Réponds
TEST: — Pour ma part, répond P., je crois que tout va bien.
TEST: […] vient nous faire la morale


!!
!!
!!!! Impératif : traits d’union manquants                                                         !!
!!
!!
................................................................................

    ## _VCOD_
    [ne|n’] [le|l’|la|les] ?[lui|leur]¿                 @:V¬:[GQ]
    [ne|n’] [nous|vous] [le|l’|la|les]                  @:V¬:[GQ]
    [je|tu|il|ils|me|m’|te|t’|se|s’] [le|l’|la|les]     @:V¬:[GQ]
    [le|l’|la|les]                                      @:V¬:[GNAWQTML]
        <<- /-1>> _VCOD_

    [me|m’|te|t’] @:V...t¬:[GQ]
        <<- /-1>> _VCOD_

    [elle|elles|iel|iels|nous|vous]  [le|l’|la|les]    @:V¬:[GQ]
        <<- not morph(<1, ":R") /-1>> _VCOD_


__purge_préverbes2__
    nous              [le|la|l’|les|en|y]  @:(?:[123][sp]|P|Y)¬:(?:X|1p)
................................................................................

    >attendre  [que|qu’]  [les|ces|mes|tes|ses|nos|vos|leurs|plusieurs|quelques|certains|certaines|maints|maintes]   @:N.*:[pi]  @:I¬:[GYSA]
        <<- /vmode/ not morph(\1, ":Q") --1>> =suggVerbMode(\-1, ":S", ":3p")                       && Après “attendre que”, ce verbe devrait être au subjonctif.

TEST: j’attends que tu {{viens}}.                                                   ->> viennes|vinsses
TEST: Attends que Céline {{dort}}                                                   ->> dorme|dormît
TEST: nous attendions que les petits {{étaient}} partis                             ->> soient|fussent|étayent|étayassent
TEST: c’était si attendu qu’il avait renoncé avant même d’y aller


__vmode_il_importe_que_subjonctif__
    il  >importer  [que|qu’]  [je|j’|tu|il|elle|iel|nous|vous|ils|elles|iels]  @:I¬:[GYS]
        <<- /vmode/ --1>> =suggVerbMode(\-1, ":S", \-2)                                             && Après le syntagme “il importe que”, ce verbe devrait être au subjonctif.

    il  >importer  [que|qu’]  $:M  @:I¬:[GYS]

Modified misc/grammalecte.sublime-color-scheme from [c24fa9f267] to [a8384ba127].

64
65
66
67
68
69
70
71
72
73
74
75

76
77
78
79
80
81
82

        {   "name": "Entity Valid",         "scope": "entity.valid",        "foreground": "hsl(150, 100%, 80%)",    "background": "hsl(150, 100%, 20%)",    "font_style": "bold",   },
        {   "name": "Entity Invalid",       "scope": "entity.invalid",      "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold",   },
        {   "name": "Token meta",           "scope": "string.meta",         "foreground": "hsl(270, 100%, 90%)",    "background": "hsl(270, 100%, 40%)",  },
        {   "name": "Token token",          "scope": "string.token",        "foreground": "hsl(240, 50%, 90%)",     "background": "hsl(240, 50%, 40%)",  },
        {   "name": "Token Jumptoken",      "scope": "string.jumptoken",    "foreground": "hsl(0, 50%, 90%)",       "background": "hsl(10, 50%, 40%)",  },
        {   "name": "Token lemma",          "scope": "string.lemma",        "foreground": "hsl(210, 100%, 80%)",    "background": "hsl(210, 100%, 15%)",  },
        {   "name": "Token phonet",         "scope": "string.phonet",       "foreground": "hsl(90, 100%, 80%)",    "background": "hsl(90, 100%, 10%)",  },
        {   "name": "Token tag",            "scope": "string.tag",          "foreground": "hsl(30, 100%, 90%)",     "background": "hsl(30, 100%, 20%)",  },
        {   "name": "Token regex",          "scope": "string.regex",        "foreground": "hsl(60, 100%, 80%)",     "background": "hsl(60, 100%, 10%)",  },
        {   "name": "Token morph regex",    "scope": "string.morph.regex",  "foreground": "hsl(150, 80%, 90%)",     "background": "hsl(150, 80%, 10%)",  },
        {   "name": "Token morph negregex", "scope": "string.morph.negregex","foreground": "hsl(0, 80%, 90%)",      "background": "hsl(0, 80%, 10%)",  },



        {   "name": "Keyword Python",       "scope": "keyword.python",      "foreground": "#A0A0A0",  },

        {   "name": "Keyword",              "scope": "keyword - (source.c keyword.operator | source.c++ keyword.operator | source.objc keyword.operator | source.objc++ keyword.operator), keyword.operator.word",  "foreground": "#F06070", },
        {   "name": "String",               "scope": "string",              "foreground": "hsl(40, 100%, 80%)",  },
        {   "name": "Number",               "scope": "constant.numeric",    "foreground": "hsl(270, 100%, 70%)",                                            "font_style": "bold",  },







|



|
>







64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

        {   "name": "Entity Valid",         "scope": "entity.valid",        "foreground": "hsl(150, 100%, 80%)",    "background": "hsl(150, 100%, 20%)",    "font_style": "bold",   },
        {   "name": "Entity Invalid",       "scope": "entity.invalid",      "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold",   },
        {   "name": "Token meta",           "scope": "string.meta",         "foreground": "hsl(270, 100%, 90%)",    "background": "hsl(270, 100%, 40%)",  },
        {   "name": "Token token",          "scope": "string.token",        "foreground": "hsl(240, 50%, 90%)",     "background": "hsl(240, 50%, 40%)",  },
        {   "name": "Token Jumptoken",      "scope": "string.jumptoken",    "foreground": "hsl(0, 50%, 90%)",       "background": "hsl(10, 50%, 40%)",  },
        {   "name": "Token lemma",          "scope": "string.lemma",        "foreground": "hsl(210, 100%, 80%)",    "background": "hsl(210, 100%, 15%)",  },
        {   "name": "Token phonet",         "scope": "string.phonet",       "foreground": "hsl(90, 100%, 80%)",     "background": "hsl(90, 100%, 10%)",  },
        {   "name": "Token tag",            "scope": "string.tag",          "foreground": "hsl(30, 100%, 90%)",     "background": "hsl(30, 100%, 20%)",  },
        {   "name": "Token regex",          "scope": "string.regex",        "foreground": "hsl(60, 100%, 80%)",     "background": "hsl(60, 100%, 10%)",  },
        {   "name": "Token morph regex",    "scope": "string.morph.regex",  "foreground": "hsl(150, 80%, 90%)",     "background": "hsl(150, 80%, 10%)",  },
        {   "name": "Token morph negregex", "scope": "string.morph.negregex", "foreground": "hsl(0, 80%, 90%)",     "background": "hsl(0, 80%, 10%)",  },
        {   "name": "MulToken morph regex", "scope": "string.mt.morph.regex", "foreground": "hsl(180, 80%, 90%)",   "background": "hsl(180, 80%, 10%)",  },


        {   "name": "Keyword Python",       "scope": "keyword.python",      "foreground": "#A0A0A0",  },

        {   "name": "Keyword",              "scope": "keyword - (source.c keyword.operator | source.c++ keyword.operator | source.objc keyword.operator | source.objc++ keyword.operator), keyword.operator.word",  "foreground": "#F06070", },
        {   "name": "String",               "scope": "string",              "foreground": "hsl(40, 100%, 80%)",  },
        {   "name": "Number",               "scope": "constant.numeric",    "foreground": "hsl(270, 100%, 70%)",                                            "font_style": "bold",  },

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

166
167
168
169
170
171
172
173
174
175
176
177
178






179
180
181
182
183
184
185

    - match: '(@)([^@\s¬]*)'
      scope: string.morph
      captures:
        1: entity.valid
        2: string.morph.regex

    - match: '(\$)([^@\s¬]*)'
      scope: string.morph
      captures:
        1: entity.valid
        2: string.morph.regex







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

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







|





>
>
>
>
>
>







166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

    - match: '(@)([^@\s¬]*)'
      scope: string.morph
      captures:
        1: entity.valid
        2: string.morph.regex

    - match: '(\$)([^\s¬]*)'
      scope: string.morph
      captures:
        1: entity.valid
        2: string.morph.regex

    - match: '(&)([^\s¬]*)'
      scope: string.morph
      captures:
        1: entity.valid
        2: string.mt.morph.regex

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

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