Grammalecte  Hex Artifact Content

Artifact d34aee52e1d3c3719d7ef001f17acf84fa609d73507bb6df04380795b00507fb:


0000: 22 22 22 0a 47 72 61 6d 6d 61 6c 65 63 74 65 20  """.Grammalecte 
0010: 2d 20 43 6f 6d 70 69 6c 65 64 20 72 65 67 75 6c  - Compiled regul
0020: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 22  ar expressions."
0030: 22 22 0a 0a 69 6d 70 6f 72 74 20 72 65 0a 0a 23  ""..import re..#
0040: 23 23 23 20 4c 65 6d 6d 65 0a 4c 65 6d 6d 61 20  ### Lemme.Lemma 
0050: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 72 22 5e  = re.compile(r"^
0060: 3e 28 5c 77 5b 5c 77 2d 5d 2a 29 22 29 0a 0a 23  >(\w[\w-]*)")..#
0070: 23 23 23 20 41 6e 61 6c 79 73 65 73 0a 47 65 6e  ### Analyses.Gen
0080: 64 65 72 4e 75 6d 62 65 72 20 3d 20 72 65 2e 63  derNumber = re.c
0090: 6f 6d 70 69 6c 65 28 22 3a 5b 6d 66 65 5d 3a 5b  ompile(":[mfe]:[
00a0: 73 70 69 5d 22 29 0a 0a 23 23 23 23 20 4e 6f 6d  spi]")..#### Nom
00b0: 20 65 74 20 61 64 6a 65 63 74 69 66 0a 4e 41 20   et adjectif.NA 
00c0: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
00d0: 4e 41 5d 22 29 0a 0a 23 23 20 6e 6f 6d 62 72 65  NA]")..## nombre
00e0: 0a 4e 41 73 20 3d 20 72 65 2e 63 6f 6d 70 69 6c  .NAs = re.compil
00f0: 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 73 22 29 0a 4e  e(":[NA].*:s").N
0100: 41 70 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28  Ap = re.compile(
0110: 22 3a 5b 4e 41 5d 2e 2a 3a 70 22 29 0a 4e 41 69  ":[NA].*:p").NAi
0120: 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a   = re.compile(":
0130: 5b 4e 41 5d 2e 2a 3a 69 22 29 0a 4e 41 73 69 20  [NA].*:i").NAsi 
0140: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
0150: 4e 41 5d 2e 2a 3a 5b 73 69 5d 22 29 0a 4e 41 70  NA].*:[si]").NAp
0160: 69 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  i = re.compile("
0170: 3a 5b 4e 41 5d 2e 2a 3a 5b 70 69 5d 22 29 0a 0a  :[NA].*:[pi]")..
0180: 23 23 20 67 65 6e 72 65 0a 4e 41 6d 20 3d 20 72  ## genre.NAm = r
0190: 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d  e.compile(":[NA]
01a0: 2e 2a 3a 6d 22 29 0a 4e 41 66 20 3d 20 72 65 2e  .*:m").NAf = re.
01b0: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a  compile(":[NA].*
01c0: 3a 66 22 29 0a 4e 41 65 20 3d 20 72 65 2e 63 6f  :f").NAe = re.co
01d0: 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 65  mpile(":[NA].*:e
01e0: 22 29 0a 4e 41 6d 65 20 3d 20 72 65 2e 63 6f 6d  ").NAme = re.com
01f0: 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d  pile(":[NA].*:[m
0200: 65 5d 22 29 0a 4e 41 66 65 20 3d 20 72 65 2e 63  e]").NAfe = re.c
0210: 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a  ompile(":[NA].*:
0220: 5b 66 65 5d 22 29 0a 0a 23 23 20 6e 6f 6d 62 72  [fe]")..## nombr
0230: 65 20 65 74 20 67 65 6e 72 65 0a 23 20 73 69 6e  e et genre.# sin
0240: 67 75 69 6c 69 65 72 0a 4e 41 6d 73 20 3d 20 72  guilier.NAms = r
0250: 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d  e.compile(":[NA]
0260: 2e 2a 3a 6d 2e 2a 3a 73 22 29 0a 4e 41 66 73 20  .*:m.*:s").NAfs 
0270: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
0280: 4e 41 5d 2e 2a 3a 66 2e 2a 3a 73 22 29 0a 4e 41  NA].*:f.*:s").NA
0290: 65 73 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28  es = re.compile(
02a0: 22 3a 5b 4e 41 5d 2e 2a 3a 65 2e 2a 3a 73 22 29  ":[NA].*:e.*:s")
02b0: 0a 4e 41 6d 65 73 20 3d 20 72 65 2e 63 6f 6d 70  .NAmes = re.comp
02c0: 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65  ile(":[NA].*:[me
02d0: 5d 2e 2a 3a 73 22 29 0a 4e 41 66 65 73 20 3d 20  ].*:s").NAfes = 
02e0: 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41  re.compile(":[NA
02f0: 5d 2e 2a 3a 5b 66 65 5d 2e 2a 3a 73 22 29 0a 0a  ].*:[fe].*:s")..
0300: 23 20 73 69 6e 67 75 6c 69 65 72 20 65 74 20 69  # singulier et i
0310: 6e 76 61 72 69 61 62 6c 65 0a 4e 41 6d 73 69 20  nvariable.NAmsi 
0320: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
0330: 4e 41 5d 2e 2a 3a 6d 2e 2a 3a 5b 73 69 5d 22 29  NA].*:m.*:[si]")
0340: 0a 4e 41 66 73 69 20 3d 20 72 65 2e 63 6f 6d 70  .NAfsi = re.comp
0350: 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 66 2e 2a  ile(":[NA].*:f.*
0360: 3a 5b 73 69 5d 22 29 0a 4e 41 65 73 69 20 3d 20  :[si]").NAesi = 
0370: 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41  re.compile(":[NA
0380: 5d 2e 2a 3a 65 2e 2a 3a 5b 73 69 5d 22 29 0a 4e  ].*:e.*:[si]").N
0390: 41 6d 65 73 69 20 3d 20 72 65 2e 63 6f 6d 70 69  Amesi = re.compi
03a0: 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d  le(":[NA].*:[me]
03b0: 2e 2a 3a 5b 73 69 5d 22 29 0a 4e 41 66 65 73 69  .*:[si]").NAfesi
03c0: 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a   = re.compile(":
03d0: 5b 4e 41 5d 2e 2a 3a 5b 66 65 5d 2e 2a 3a 5b 73  [NA].*:[fe].*:[s
03e0: 69 5d 22 29 0a 0a 23 20 70 6c 75 72 69 65 6c 0a  i]")..# pluriel.
03f0: 4e 41 6d 70 20 3d 20 72 65 2e 63 6f 6d 70 69 6c  NAmp = re.compil
0400: 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 6d 2e 2a 3a 70  e(":[NA].*:m.*:p
0410: 22 29 0a 4e 41 66 70 20 3d 20 72 65 2e 63 6f 6d  ").NAfp = re.com
0420: 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 66 2e  pile(":[NA].*:f.
0430: 2a 3a 70 22 29 0a 4e 41 65 70 20 3d 20 72 65 2e  *:p").NAep = re.
0440: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a  compile(":[NA].*
0450: 3a 65 2e 2a 3a 70 22 29 0a 4e 41 6d 65 70 20 3d  :e.*:p").NAmep =
0460: 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e   re.compile(":[N
0470: 41 5d 2e 2a 3a 5b 6d 65 5d 2e 2a 3a 70 22 29 0a  A].*:[me].*:p").
0480: 4e 41 66 65 70 20 3d 20 72 65 2e 63 6f 6d 70 69  NAfep = re.compi
0490: 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d  le(":[NA].*:[me]
04a0: 2e 2a 3a 70 22 29 0a 0a 23 20 70 6c 75 72 69 65  .*:p")..# plurie
04b0: 6c 20 65 74 20 69 6e 76 61 72 69 61 62 6c 65 0a  l et invariable.
04c0: 4e 41 6d 70 69 20 3d 20 72 65 2e 63 6f 6d 70 69  NAmpi = re.compi
04d0: 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 6d 2e 2a 3a  le(":[NA].*:m.*:
04e0: 5b 70 69 5d 22 29 0a 4e 41 66 70 69 20 3d 20 72  [pi]").NAfpi = r
04f0: 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d  e.compile(":[NA]
0500: 2e 2a 3a 66 2e 2a 3a 5b 70 69 5d 22 29 0a 4e 41  .*:f.*:[pi]").NA
0510: 65 70 69 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65  epi = re.compile
0520: 28 22 3a 5b 4e 41 5d 2e 2a 3a 65 2e 2a 3a 5b 70  (":[NA].*:e.*:[p
0530: 69 5d 22 29 0a 4e 41 6d 65 70 69 20 3d 20 72 65  i]").NAmepi = re
0540: 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e  .compile(":[NA].
0550: 2a 3a 5b 6d 65 5d 2e 2a 3a 5b 70 69 5d 22 29 0a  *:[me].*:[pi]").
0560: 4e 41 66 65 70 69 20 3d 20 72 65 2e 63 6f 6d 70  NAfepi = re.comp
0570: 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 66 65  ile(":[NA].*:[fe
0580: 5d 2e 2a 3a 5b 70 69 5d 22 29 0a 0a 23 20 64 69  ].*:[pi]")..# di
0590: 76 65 72 73 0a 41 44 20 3d 20 72 65 2e 63 6f 6d  vers.AD = re.com
05a0: 70 69 6c 65 28 22 3a 5b 41 42 5d 22 29 0a 0a 23  pile(":[AB]")..#
05b0: 23 23 23 20 56 65 72 62 65 0a 56 63 6f 6e 6a 20  ### Verbe.Vconj 
05c0: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
05d0: 31 32 33 5d 5b 73 70 5d 22 29 0a 56 63 6f 6e 6a  123][sp]").Vconj
05e0: 31 32 33 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65  123 = re.compile
05f0: 28 22 3a 56 5b 31 32 33 5d 2e 2a 3a 5b 31 32 33  (":V[123].*:[123
0600: 5d 5b 73 70 5d 22 29 0a 0a 23 23 23 23 20 4e 6f  ][sp]")..#### No
0610: 6d 20 7c 20 41 64 6a 65 63 74 69 66 20 7c 20 56  m | Adjectif | V
0620: 65 72 62 65 0a 4e 56 63 6f 6e 6a 20 3d 20 72 65  erbe.NVconj = re
0630: 2e 63 6f 6d 70 69 6c 65 28 22 3a 28 3f 3a 4e 7c  .compile(":(?:N|
0640: 5b 31 32 33 5d 5b 73 70 5d 29 22 29 0a 4e 41 56  [123][sp])").NAV
0650: 63 6f 6e 6a 20 3d 20 72 65 2e 63 6f 6d 70 69 6c  conj = re.compil
0660: 65 28 22 3a 28 3f 3a 4e 7c 41 7c 5b 31 32 33 5d  e(":(?:N|A|[123]
0670: 5b 73 70 5d 29 22 29 0a 0a 23 23 23 23 20 53 70  [sp])")..#### Sp
0680: c3 a9 63 69 66 69 71 75 65 0a 4e 6e 6f 74 41 20  ..cifique.NnotA 
0690: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 4e  = re.compile(":N
06a0: 28 3f 21 3a 41 29 22 29 0a 50 4e 6e 6f 74 41 20  (?!:A)").PNnotA 
06b0: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 28  = re.compile(":(
06c0: 3f 3a 4e 28 3f 21 3a 41 29 7c 51 29 22 29 0a 0a  ?:N(?!:A)|Q)")..
06d0: 23 23 23 23 20 4e 6f 6d 73 20 70 72 6f 70 72 65  #### Noms propre
06e0: 73 0a 4e 50 20 3d 20 72 65 2e 63 6f 6d 70 69 6c  s.NP = re.compil
06f0: 65 28 22 3a 28 3f 3a 4d 5b 31 32 50 5d 7c 54 29  e(":(?:M[12P]|T)
0700: 22 29 0a 4e 50 6d 20 3d 20 72 65 2e 63 6f 6d 70  ").NPm = re.comp
0710: 69 6c 65 28 22 3a 28 3f 3a 4d 5b 31 32 50 5d 7c  ile(":(?:M[12P]|
0720: 54 29 3a 6d 22 29 0a 4e 50 66 20 3d 20 72 65 2e  T):m").NPf = re.
0730: 63 6f 6d 70 69 6c 65 28 22 3a 28 3f 3a 4d 5b 31  compile(":(?:M[1
0740: 32 50 5d 7c 54 29 3a 66 22 29 0a 4e 50 65 20 3d  2P]|T):f").NPe =
0750: 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 28 3f   re.compile(":(?
0760: 3a 4d 5b 31 32 50 5d 7c 54 29 3a 65 22 29 0a 0a  :M[12P]|T):e")..
0770: 0a 23 23 23 23 20 46 4f 4e 43 54 49 4f 4e 53 0a  .#### FONCTIONS.
0780: 0a 64 65 66 20 67 65 74 4c 65 6d 6d 61 4f 66 4d  .def getLemmaOfM
0790: 6f 72 70 68 20 28 73 29 3a 0a 20 20 20 20 22 72  orph (s):.    "r
07a0: 65 74 75 72 6e 20 6c 65 6d 6d 61 20 69 6e 20 6d  eturn lemma in m
07b0: 6f 72 70 68 6f 6c 6f 67 79 20 3c 73 3e 22 0a 20  orphology <s>". 
07c0: 20 20 20 72 65 74 75 72 6e 20 4c 65 6d 6d 61 2e     return Lemma.
07d0: 73 65 61 72 63 68 28 73 29 2e 67 72 6f 75 70 28  search(s).group(
07e0: 31 29 0a 0a 64 65 66 20 61 67 72 65 65 6d 65 6e  1)..def agreemen
07f0: 74 20 28 6c 31 2c 20 6c 32 29 3a 0a 20 20 20 20  t (l1, l2):.    
0800: 22 72 65 74 75 72 6e 73 20 54 72 75 65 20 69 66  "returns True if
0810: 20 61 67 72 65 65 6d 65 6e 74 20 69 6e 20 67 65   agreement in ge
0820: 6e 64 65 72 20 61 6e 64 20 6e 75 6d 62 65 72 20  nder and number 
0830: 69 73 20 70 6f 73 73 69 62 6c 65 20 62 65 74 77  is possible betw
0840: 65 65 6e 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  een morphologies
0850: 20 3c 6c 31 3e 20 61 6e 64 20 3c 6c 32 3e 22 0a   <l1> and <l2>".
0860: 20 20 20 20 73 47 65 6e 64 65 72 31 2c 20 73 4e      sGender1, sN
0870: 75 6d 62 65 72 31 20 3d 20 67 65 74 47 65 6e 64  umber1 = getGend
0880: 65 72 4e 75 6d 62 65 72 28 6c 31 29 0a 20 20 20  erNumber(l1).   
0890: 20 73 47 65 6e 64 65 72 32 2c 20 73 4e 75 6d 62   sGender2, sNumb
08a0: 65 72 32 20 3d 20 67 65 74 47 65 6e 64 65 72 4e  er2 = getGenderN
08b0: 75 6d 62 65 72 28 6c 32 29 0a 20 20 20 20 69 66  umber(l2).    if
08c0: 20 73 4e 75 6d 62 65 72 31 20 21 3d 20 22 3a 69   sNumber1 != ":i
08d0: 22 20 61 6e 64 20 73 4e 75 6d 62 65 72 32 20 21  " and sNumber2 !
08e0: 3d 20 22 3a 69 22 20 61 6e 64 20 73 4e 75 6d 62  = ":i" and sNumb
08f0: 65 72 31 20 21 3d 20 73 4e 75 6d 62 65 72 32 3a  er1 != sNumber2:
0900: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0910: 46 61 6c 73 65 0a 20 20 20 20 69 66 20 73 47 65  False.    if sGe
0920: 6e 64 65 72 31 20 21 3d 20 22 3a 65 22 20 61 6e  nder1 != ":e" an
0930: 64 20 73 47 65 6e 64 65 72 32 20 21 3d 20 22 3a  d sGender2 != ":
0940: 65 22 20 61 6e 64 20 73 47 65 6e 64 65 72 31 20  e" and sGender1 
0950: 21 3d 20 73 47 65 6e 64 65 72 32 3a 0a 20 20 20  != sGender2:.   
0960: 20 20 20 20 20 72 65 74 75 72 6e 20 46 61 6c 73       return Fals
0970: 65 0a 20 20 20 20 72 65 74 75 72 6e 20 54 72 75  e.    return Tru
0980: 65 0a 0a 64 65 66 20 63 68 65 63 6b 43 6f 6e 6a  e..def checkConj
0990: 56 65 72 62 20 28 6c 4d 6f 72 70 68 2c 20 73 52  Verb (lMorph, sR
09a0: 65 71 43 6f 6e 6a 29 3a 0a 20 20 20 20 22 72 65  eqConj):.    "re
09b0: 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 3c 73  turns True if <s
09c0: 52 65 71 43 6f 6e 6a 3e 20 69 6e 20 3c 6c 4d 6f  ReqConj> in <lMo
09d0: 72 70 68 3e 22 0a 20 20 20 20 72 65 74 75 72 6e  rph>".    return
09e0: 20 61 6e 79 28 73 52 65 71 43 6f 6e 6a 20 69 6e   any(sReqConj in
09f0: 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f   s  for s in lMo
0a00: 72 70 68 29 0a 0a 64 65 66 20 67 65 74 47 65 6e  rph)..def getGen
0a10: 64 65 72 4e 75 6d 62 65 72 20 28 6c 4d 6f 72 70  derNumber (lMorp
0a20: 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  h):.    "returns
0a30: 20 74 75 70 6c 65 20 28 67 65 6e 64 65 72 2c 20   tuple (gender, 
0a40: 6e 75 6d 62 65 72 29 20 6f 66 20 77 6f 72 64 3a  number) of word:
0a50: 20 28 27 3a 6d 27 2c 20 27 3a 66 27 2c 20 27 3a   (':m', ':f', ':
0a60: 65 27 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69  e' or empty stri
0a70: 6e 67 29 20 61 6e 64 20 28 27 3a 73 27 2c 20 27  ng) and (':s', '
0a80: 3a 70 27 2c 20 27 3a 69 27 20 6f 72 20 65 6d 70  :p', ':i' or emp
0a90: 74 79 20 73 74 72 69 6e 67 29 22 0a 20 20 20 20  ty string)".    
0aa0: 73 47 65 6e 64 65 72 20 3d 20 22 22 0a 20 20 20  sGender = "".   
0ab0: 20 73 4e 75 6d 62 65 72 20 3d 20 22 22 0a 20 20   sNumber = "".  
0ac0: 20 20 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20    for sMorph in 
0ad0: 6c 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20  lMorph:.        
0ae0: 6d 20 3d 20 47 65 6e 64 65 72 4e 75 6d 62 65 72  m = GenderNumber
0af0: 2e 73 65 61 72 63 68 28 73 4d 6f 72 70 68 29 0a  .search(sMorph).
0b00: 20 20 20 20 20 20 20 20 69 66 20 6d 3a 0a 20 20          if m:.  
0b10: 20 20 20 20 20 20 20 20 20 20 73 47 65 6e 64 65            sGende
0b20: 72 78 20 3d 20 6d 2e 67 72 6f 75 70 28 30 29 5b  rx = m.group(0)[
0b30: 30 3a 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20  0:2].           
0b40: 20 73 4e 75 6d 62 65 72 78 20 3d 20 6d 2e 67 72   sNumberx = m.gr
0b50: 6f 75 70 28 30 29 5b 32 3a 34 5d 0a 20 20 20 20  oup(0)[2:4].    
0b60: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73          if not s
0b70: 47 65 6e 64 65 72 3a 0a 20 20 20 20 20 20 20 20  Gender:.        
0b80: 20 20 20 20 20 20 20 20 73 47 65 6e 64 65 72 20          sGender 
0b90: 3d 20 73 47 65 6e 64 65 72 78 0a 20 20 20 20 20  = sGenderx.     
0ba0: 20 20 20 20 20 20 20 65 6c 69 66 20 73 47 65 6e         elif sGen
0bb0: 64 65 72 20 21 3d 20 73 47 65 6e 64 65 72 78 3a  der != sGenderx:
0bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0bd0: 20 73 47 65 6e 64 65 72 20 3d 20 22 3a 65 22 0a   sGender = ":e".
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
0bf0: 6f 74 20 73 4e 75 6d 62 65 72 3a 0a 20 20 20 20  ot sNumber:.    
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 75 6d              sNum
0c10: 62 65 72 20 3d 20 73 4e 75 6d 62 65 72 78 0a 20  ber = sNumberx. 
0c20: 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66 20             elif 
0c30: 73 4e 75 6d 62 65 72 20 21 3d 20 73 4e 75 6d 62  sNumber != sNumb
0c40: 65 72 78 3a 0a 20 20 20 20 20 20 20 20 20 20 20  erx:.           
0c50: 20 20 20 20 20 73 4e 75 6d 62 65 72 20 3d 20 22       sNumber = "
0c60: 3a 69 22 0a 20 20 20 20 72 65 74 75 72 6e 20 73  :i".    return s
0c70: 47 65 6e 64 65 72 2c 20 73 4e 75 6d 62 65 72 0a  Gender, sNumber.
0c80: 0a 0a 23 20 4e 4f 54 45 20 3a 20 20 69 73 57 68  ..# NOTE :  isWh
0c90: 61 74 20 28 6c 4d 6f 72 70 68 29 20 20 20 20 72  at (lMorph)    r
0ca0: 65 74 75 72 6e 73 20 54 72 75 65 20 20 20 69 66  eturns True   if
0cb0: 20 6c 4d 6f 72 70 68 20 63 6f 6e 74 61 69 6e 73   lMorph contains
0cc0: 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 74 68   nothing else th
0cd0: 61 6e 20 57 68 61 74 0a 23 20 20 20 20 20 20 20  an What.#       
0ce0: 20 20 6d 62 57 68 61 74 20 28 6c 4d 6f 72 70 68    mbWhat (lMorph
0cf0: 29 20 20 20 20 72 65 74 75 72 6e 73 20 54 72 75  )    returns Tru
0d00: 65 20 20 20 69 66 20 6c 4d 6f 72 70 68 20 63 6f  e   if lMorph co
0d10: 6e 74 61 69 6e 73 20 57 68 61 74 20 61 74 20 6c  ntains What at l
0d20: 65 61 73 74 20 6f 6e 63 65 0a 0a 23 23 20 69 73  east once..## is
0d30: 58 58 58 20 3d 20 69 74 e2 80 99 73 20 63 65 72  XXX = it...s cer
0d40: 74 61 69 6e 0a 0a 64 65 66 20 69 73 4e 6f 6d 20  tain..def isNom 
0d50: 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72  (lMorph):.    "r
0d60: 65 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 61  eturns True if a
0d70: 6c 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  ll morphologies 
0d80: 61 72 65 20 e2 80 9c 6e 6f 6d e2 80 9d 22 0a 20  are ...nom...". 
0d90: 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22 3a     return all(":
0da0: 4e 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69  N" in s  for s i
0db0: 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 69  n lMorph)..def i
0dc0: 73 4e 6f 6d 4e 6f 74 41 64 6a 20 28 6c 4d 6f 72  sNomNotAdj (lMor
0dd0: 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e  ph):.    "return
0de0: 73 20 54 72 75 65 20 69 66 20 61 6c 6c 20 6d 6f  s True if all mo
0df0: 72 70 68 6f 6c 6f 67 69 65 73 20 61 72 65 20 e2  rphologies are .
0e00: 80 9c 6e 6f 6d e2 80 9d 2c 20 62 75 74 20 6e 6f  ..nom..., but no
0e10: 74 20 e2 80 9c 61 64 6a 65 63 74 69 66 e2 80 9d  t ...adjectif...
0e20: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c  ".    return all
0e30: 28 4e 6e 6f 74 41 2e 73 65 61 72 63 68 28 73 29  (NnotA.search(s)
0e40: 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70    for s in lMorp
0e50: 68 29 0a 0a 64 65 66 20 69 73 41 64 6a 20 28 6c  h)..def isAdj (l
0e60: 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74  Morph):.    "ret
0e70: 75 72 6e 73 20 54 72 75 65 20 69 66 20 61 6c 6c  urns True if all
0e80: 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61 72   morphologies ar
0e90: 65 20 e2 80 9c 61 64 6a 65 63 74 69 66 e2 80 9d  e ...adjectif...
0ea0: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c  ".    return all
0eb0: 28 22 3a 41 22 20 69 6e 20 73 20 20 66 6f 72 20  (":A" in s  for 
0ec0: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
0ed0: 66 20 69 73 4e 6f 6d 41 64 6a 20 28 6c 4d 6f 72  f isNomAdj (lMor
0ee0: 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e  ph):.    "return
0ef0: 73 20 54 72 75 65 20 69 66 20 61 6c 6c 20 6d 6f  s True if all mo
0f00: 72 70 68 6f 6c 6f 67 69 65 73 20 61 72 65 20 e2  rphologies are .
0f10: 80 9c 6e 6f 6d e2 80 9d 20 6f 72 20 e2 80 9c 61  ..nom... or ...a
0f20: 64 6a 65 63 74 69 66 e2 80 9d 22 0a 20 20 20 20  djectif...".    
0f30: 72 65 74 75 72 6e 20 61 6c 6c 28 4e 41 2e 73 65  return all(NA.se
0f40: 61 72 63 68 28 73 29 20 20 66 6f 72 20 73 20 69  arch(s)  for s i
0f50: 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 69  n lMorph)..def i
0f60: 73 4e 6f 6d 56 63 6f 6e 6a 20 28 6c 4d 6f 72 70  sNomVconj (lMorp
0f70: 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  h):.    "returns
0f80: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 6d 6f 72   True if all mor
0f90: 70 68 6f 6c 6f 67 69 65 73 20 61 72 65 20 e2 80  phologies are ..
0fa0: 9c 6e 6f 6d e2 80 9d 20 6f 72 20 e2 80 9c 76 65  .nom... or ...ve
0fb0: 72 62 65 20 63 6f 6e 6a 75 67 75 c3 a9 e2 80 9d  rbe conjugu.....
0fc0: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c  ".    return all
0fd0: 28 4e 56 63 6f 6e 6a 2e 73 65 61 72 63 68 28 73  (NVconj.search(s
0fe0: 29 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72  )  for s in lMor
0ff0: 70 68 29 0a 0a 64 65 66 20 69 73 49 6e 76 20 28  ph)..def isInv (
1000: 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65  lMorph):.    "re
1010: 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 61 6c  turns True if al
1020: 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61  l morphologies a
1030: 72 65 20 e2 80 9c 69 6e 76 61 72 69 61 62 6c 65  re ...invariable
1040: e2 80 9d 22 0a 20 20 20 20 72 65 74 75 72 6e 20  ...".    return 
1050: 61 6c 6c 28 22 3a 69 22 20 69 6e 20 73 20 20 66  all(":i" in s  f
1060: 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a  or s in lMorph).
1070: 0a 64 65 66 20 69 73 53 67 20 28 6c 4d 6f 72 70  .def isSg (lMorp
1080: 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  h):.    "returns
1090: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 6d 6f 72   True if all mor
10a0: 70 68 6f 6c 6f 67 69 65 73 20 61 72 65 20 e2 80  phologies are ..
10b0: 9c 73 69 6e 67 75 6c 69 65 72 e2 80 9d 22 0a 20  .singulier...". 
10c0: 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22 3a     return all(":
10d0: 73 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69  s" in s  for s i
10e0: 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 69  n lMorph)..def i
10f0: 73 50 6c 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20  sPl (lMorph):.  
1100: 20 20 22 72 65 74 75 72 6e 73 20 54 72 75 65 20    "returns True 
1110: 69 66 20 61 6c 6c 20 6d 6f 72 70 68 6f 6c 6f 67  if all morpholog
1120: 69 65 73 20 61 72 65 20 e2 80 9c 70 6c 75 72 69  ies are ...pluri
1130: 65 6c e2 80 9d 22 0a 20 20 20 20 72 65 74 75 72  el...".    retur
1140: 6e 20 61 6c 6c 28 22 3a 70 22 20 69 6e 20 73 20  n all(":p" in s 
1150: 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68   for s in lMorph
1160: 29 0a 0a 64 65 66 20 69 73 45 70 69 20 28 6c 4d  )..def isEpi (lM
1170: 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75  orph):.    "retu
1180: 72 6e 73 20 54 72 75 65 20 69 66 20 61 6c 6c 20  rns True if all 
1190: 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61 72 65  morphologies are
11a0: 20 e2 80 9c c3 a9 70 69 63 c3 a8 6e 65 e2 80 9d   .....pic..ne...
11b0: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c  ".    return all
11c0: 28 22 3a 65 22 20 69 6e 20 73 20 20 66 6f 72 20  (":e" in s  for 
11d0: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
11e0: 66 20 69 73 4d 61 73 20 28 6c 4d 6f 72 70 68 29  f isMas (lMorph)
11f0: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 54  :.    "returns T
1200: 72 75 65 20 69 66 20 61 6c 6c 20 6d 6f 72 70 68  rue if all morph
1210: 6f 6c 6f 67 69 65 73 20 61 72 65 20 e2 80 9c 6d  ologies are ...m
1220: 61 73 63 75 6c 69 6e e2 80 9d 22 0a 20 20 20 20  asculin...".    
1230: 72 65 74 75 72 6e 20 61 6c 6c 28 22 3a 6d 22 20  return all(":m" 
1240: 69 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c  in s  for s in l
1250: 4d 6f 72 70 68 29 0a 0a 64 65 66 20 69 73 46 65  Morph)..def isFe
1260: 6d 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20  m (lMorph):.    
1270: 22 72 65 74 75 72 6e 73 20 54 72 75 65 20 69 66  "returns True if
1280: 20 61 6c 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65   all morphologie
1290: 73 20 61 72 65 20 e2 80 9c 66 c3 a9 6d 69 6e 69  s are ...f..mini
12a0: 6e e2 80 9d 22 0a 20 20 20 20 72 65 74 75 72 6e  n...".    return
12b0: 20 61 6c 6c 28 22 3a 66 22 20 69 6e 20 73 20 20   all(":f" in s  
12c0: 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29  for s in lMorph)
12d0: 0a 0a 0a 23 23 20 6d 62 58 58 58 20 3d 20 4d 41  ...## mbXXX = MA
12e0: 59 42 45 20 58 58 58 0a 0a 64 65 66 20 6d 62 4e  YBE XXX..def mbN
12f0: 6f 6d 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20  om (lMorph):.   
1300: 20 22 72 65 74 75 72 6e 73 20 54 72 75 65 20 69   "returns True i
1310: 66 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f 67 79  f one morphology
1320: 20 69 73 20 e2 80 9c 6e 6f 6d e2 80 9d 22 0a 20   is ...nom...". 
1330: 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 22 3a     return any(":
1340: 4e 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69  N" in s  for s i
1350: 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d  n lMorph)..def m
1360: 62 41 64 6a 20 28 6c 4d 6f 72 70 68 29 3a 0a 20  bAdj (lMorph):. 
1370: 20 20 20 22 72 65 74 75 72 6e 73 20 54 72 75 65     "returns True
1380: 20 69 66 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f   if one morpholo
1390: 67 79 20 69 73 20 e2 80 9c 61 64 6a 65 63 74 69  gy is ...adjecti
13a0: 66 e2 80 9d 22 0a 20 20 20 20 72 65 74 75 72 6e  f...".    return
13b0: 20 61 6e 79 28 22 3a 41 22 20 69 6e 20 73 20 20   any(":A" in s  
13c0: 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29  for s in lMorph)
13d0: 0a 0a 64 65 66 20 6d 62 41 64 6a 4e 62 20 28 6c  ..def mbAdjNb (l
13e0: 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74  Morph):.    "ret
13f0: 75 72 6e 73 20 54 72 75 65 20 69 66 20 6f 6e 65  urns True if one
1400: 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 69 73 20 e2   morphology is .
1410: 80 9c 61 64 6a 65 63 74 69 66 e2 80 9d 20 6f 72  ..adjectif... or
1420: 20 e2 80 9c 6e 6f 6d 62 72 65 e2 80 9d 22 0a 20   ...nombre...". 
1430: 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 41 44     return any(AD
1440: 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72 20  .search(s)  for 
1450: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
1460: 66 20 6d 62 4e 6f 6d 41 64 6a 20 28 6c 4d 6f 72  f mbNomAdj (lMor
1470: 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e  ph):.    "return
1480: 73 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f  s True if one mo
1490: 72 70 68 6f 6c 6f 67 79 20 69 73 20 e2 80 9c 6e  rphology is ...n
14a0: 6f 6d e2 80 9d 20 6f 72 20 e2 80 9c 61 64 6a 65  om... or ...adje
14b0: 63 74 69 66 e2 80 9d 22 0a 20 20 20 20 72 65 74  ctif...".    ret
14c0: 75 72 6e 20 61 6e 79 28 4e 41 2e 73 65 61 72 63  urn any(NA.searc
14d0: 68 28 73 29 20 20 66 6f 72 20 73 20 69 6e 20 6c  h(s)  for s in l
14e0: 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4e 6f  Morph)..def mbNo
14f0: 6d 4e 6f 74 41 64 6a 20 28 6c 4d 6f 72 70 68 29  mNotAdj (lMorph)
1500: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 54  :.    "returns T
1510: 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f 72 70 68  rue if one morph
1520: 6f 6c 6f 67 79 20 69 73 20 e2 80 9c 6e 6f 6d e2  ology is ...nom.
1530: 80 9d 2c 20 62 75 74 20 6e 6f 74 20 e2 80 9c 61  .., but not ...a
1540: 64 6a 65 63 74 69 66 e2 80 9d 22 0a 20 20 20 20  djectif...".    
1550: 62 52 65 73 75 6c 74 20 3d 20 46 61 6c 73 65 0a  bResult = False.
1560: 20 20 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f      for s in lMo
1570: 72 70 68 3a 0a 20 20 20 20 20 20 20 20 69 66 20  rph:.        if 
1580: 22 3a 41 22 20 69 6e 20 73 3a 0a 20 20 20 20 20  ":A" in s:.     
1590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 61         return Fa
15a0: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 20 22  lse.        if "
15b0: 3a 4e 22 20 69 6e 20 73 3a 0a 20 20 20 20 20 20  :N" in s:.      
15c0: 20 20 20 20 20 20 62 52 65 73 75 6c 74 20 3d 20        bResult = 
15d0: 54 72 75 65 0a 20 20 20 20 72 65 74 75 72 6e 20  True.    return 
15e0: 62 52 65 73 75 6c 74 0a 0a 64 65 66 20 6d 62 50  bResult..def mbP
15f0: 70 61 73 4e 6f 6d 4e 6f 74 41 64 6a 20 28 6c 4d  pasNomNotAdj (lM
1600: 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75  orph):.    "retu
1610: 72 6e 73 20 54 72 75 65 20 69 66 20 6f 6e 65 20  rns True if one 
1620: 6d 6f 72 70 68 6f 6c 6f 67 79 20 69 73 20 e2 80  morphology is ..
1630: 9c 6e 6f 6d e2 80 9d 20 6f 72 20 e2 80 9c 70 61  .nom... or ...pa
1640: 72 74 69 63 69 70 65 20 70 61 73 73 c3 a9 e2 80  rticipe pass....
1650: 9d 2c 20 62 75 74 20 6e 6f 74 20 e2 80 9c 61 64  ., but not ...ad
1660: 6a 65 63 74 69 66 e2 80 9d 22 0a 20 20 20 20 72  jectif...".    r
1670: 65 74 75 72 6e 20 61 6e 79 28 50 4e 6e 6f 74 41  eturn any(PNnotA
1680: 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72 20  .search(s)  for 
1690: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
16a0: 66 20 6d 62 56 63 6f 6e 6a 20 28 6c 4d 6f 72 70  f mbVconj (lMorp
16b0: 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  h):.    "returns
16c0: 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f 72   True if one mor
16d0: 70 68 6f 6c 6f 67 79 20 69 73 20 e2 80 9c 6e 6f  phology is ...no
16e0: 6d e2 80 9d 20 6f 72 20 e2 80 9c 76 65 72 62 65  m... or ...verbe
16f0: 20 63 6f 6e 6a 75 67 75 c3 a9 e2 80 9d 22 0a 20   conjugu.....". 
1700: 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 56 63     return any(Vc
1710: 6f 6e 6a 2e 73 65 61 72 63 68 28 73 29 20 20 66  onj.search(s)  f
1720: 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a  or s in lMorph).
1730: 0a 64 65 66 20 6d 62 56 63 6f 6e 6a 31 32 33 20  .def mbVconj123 
1740: 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72  (lMorph):.    "r
1750: 65 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 6f  eturns True if o
1760: 6e 65 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 69 73  ne morphology is
1770: 20 e2 80 9c 6e 6f 6d e2 80 9d 20 6f 72 20 e2 80   ...nom... or ..
1780: 9c 76 65 72 62 65 20 63 6f 6e 6a 75 67 75 c3 a9  .verbe conjugu..
1790: e2 80 9d 20 28 62 75 74 20 6e 6f 74 20 e2 80 9c  ... (but not ...
17a0: 61 76 6f 69 72 e2 80 9d 20 6f 72 20 e2 80 9c c3  avoir... or ....
17b0: aa 74 72 65 e2 80 9d 29 22 0a 20 20 20 20 72 65  .tre...)".    re
17c0: 74 75 72 6e 20 61 6e 79 28 56 63 6f 6e 6a 31 32  turn any(Vconj12
17d0: 33 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72  3.search(s)  for
17e0: 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64   s in lMorph)..d
17f0: 65 66 20 6d 62 4d 47 20 28 6c 4d 6f 72 70 68 29  ef mbMG (lMorph)
1800: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 54  :.    "returns T
1810: 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f 72 70 68  rue if one morph
1820: 6f 6c 6f 67 79 20 69 73 20 e2 80 9c 6d 6f 74 20  ology is ...mot 
1830: 67 72 61 6d 6d 61 74 69 63 61 6c e2 80 9d 22 0a  grammatical...".
1840: 20 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 22      return any("
1850: 3a 47 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :G" in s  for s 
1860: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
1870: 6d 62 49 6e 76 20 28 6c 4d 6f 72 70 68 29 3a 0a  mbInv (lMorph):.
1880: 20 20 20 20 22 72 65 74 75 72 6e 73 20 54 72 75      "returns Tru
1890: 65 20 69 66 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c  e if one morphol
18a0: 6f 67 79 20 69 73 20 e2 80 9c 69 6e 76 61 72 69  ogy is ...invari
18b0: 61 62 6c 65 e2 80 9d 22 0a 20 20 20 20 72 65 74  able...".    ret
18c0: 75 72 6e 20 61 6e 79 28 22 3a 69 22 20 69 6e 20  urn any(":i" in 
18d0: 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72  s  for s in lMor
18e0: 70 68 29 0a 0a 64 65 66 20 6d 62 53 67 20 28 6c  ph)..def mbSg (l
18f0: 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74  Morph):.    "ret
1900: 75 72 6e 73 20 54 72 75 65 20 69 66 20 6f 6e 65  urns True if one
1910: 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 69 73 20 e2   morphology is .
1920: 80 9c 73 69 6e 67 75 6c 69 65 72 e2 80 9d 22 0a  ..singulier...".
1930: 20 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 22      return any("
1940: 3a 73 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :s" in s  for s 
1950: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
1960: 6d 62 50 6c 20 28 6c 4d 6f 72 70 68 29 3a 0a 20  mbPl (lMorph):. 
1970: 20 20 20 22 72 65 74 75 72 6e 73 20 54 72 75 65     "returns True
1980: 20 69 66 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f   if one morpholo
1990: 67 79 20 69 73 20 e2 80 9c 70 6c 75 72 69 65 6c  gy is ...pluriel
19a0: e2 80 9d 22 0a 20 20 20 20 72 65 74 75 72 6e 20  ...".    return 
19b0: 61 6e 79 28 22 3a 70 22 20 69 6e 20 73 20 20 66  any(":p" in s  f
19c0: 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a  or s in lMorph).
19d0: 0a 64 65 66 20 6d 62 45 70 69 20 28 6c 4d 6f 72  .def mbEpi (lMor
19e0: 70 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e  ph):.    "return
19f0: 73 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f  s True if one mo
1a00: 72 70 68 6f 6c 6f 67 79 20 69 73 20 e2 80 9c c3  rphology is ....
1a10: a9 70 69 63 c3 a8 6e 65 e2 80 9d 22 0a 20 20 20  .pic..ne...".   
1a20: 20 72 65 74 75 72 6e 20 61 6e 79 28 22 3a 65 22   return any(":e"
1a30: 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20   in s  for s in 
1a40: 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4d  lMorph)..def mbM
1a50: 61 73 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20  as (lMorph):.   
1a60: 20 22 72 65 74 75 72 6e 73 20 54 72 75 65 20 69   "returns True i
1a70: 66 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f 67 79  f one morphology
1a80: 20 69 73 20 e2 80 9c 6d 61 73 63 75 6c 69 6e e2   is ...masculin.
1a90: 80 9d 22 0a 20 20 20 20 72 65 74 75 72 6e 20 61  ..".    return a
1aa0: 6e 79 28 22 3a 6d 22 20 69 6e 20 73 20 20 66 6f  ny(":m" in s  fo
1ab0: 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a  r s in lMorph)..
1ac0: 64 65 66 20 6d 62 46 65 6d 20 28 6c 4d 6f 72 70  def mbFem (lMorp
1ad0: 68 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73  h):.    "returns
1ae0: 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6d 6f 72   True if one mor
1af0: 70 68 6f 6c 6f 67 79 20 69 73 20 e2 80 9c 66 c3  phology is ...f.
1b00: a9 6d 69 6e 69 6e e2 80 9d 22 0a 20 20 20 20 72  .minin...".    r
1b10: 65 74 75 72 6e 20 61 6e 79 28 22 3a 66 22 20 69  eturn any(":f" i
1b20: 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d  n s  for s in lM
1b30: 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4e 70 72  orph)..def mbNpr
1b40: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22   (lMorph):.    "
1b50: 72 65 74 75 72 6e 73 20 54 72 75 65 20 69 66 20  returns True if 
1b60: 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 69  one morphology i
1b70: 73 20 e2 80 9c 6e 6f 6d 20 70 72 6f 70 72 65 e2  s ...nom propre.
1b80: 80 9d 20 6f 72 20 e2 80 9c 74 69 74 72 65 20 64  .. or ...titre d
1b90: 65 20 63 69 76 69 6c 69 74 c3 a9 e2 80 9d 22 0a  e civilit.....".
1ba0: 20 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 4e      return any(N
1bb0: 50 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72  P.search(s)  for
1bc0: 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64   s in lMorph)..d
1bd0: 65 66 20 6d 62 4e 70 72 4d 61 73 4e 6f 74 46 65  ef mbNprMasNotFe
1be0: 6d 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20  m (lMorph):.    
1bf0: 22 72 65 74 75 72 6e 73 20 54 72 75 65 20 69 66  "returns True if
1c00: 20 6f 6e 65 20 6d 6f 72 70 68 6f 6c 6f 67 79 20   one morphology 
1c10: 69 73 20 e2 80 9c 6e 6f 6d 20 70 72 6f 70 72 65  is ...nom propre
1c20: 20 6d 61 73 63 75 6c 69 6e e2 80 9d 20 62 75 74   masculin... but
1c30: 20 6e 6f 74 20 e2 80 9c 66 c3 a9 6d 69 6e 69 6e   not ...f..minin
1c40: e2 80 9d 22 0a 20 20 20 20 69 66 20 61 6e 79 28  ...".    if any(
1c50: 4e 50 66 2e 73 65 61 72 63 68 28 73 29 20 20 66  NPf.search(s)  f
1c60: 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 3a  or s in lMorph):
1c70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c80: 46 61 6c 73 65 0a 20 20 20 20 72 65 74 75 72 6e  False.    return
1c90: 20 61 6e 79 28 4e 50 6d 2e 73 65 61 72 63 68 28   any(NPm.search(
1ca0: 73 29 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f  s)  for s in lMo
1cb0: 72 70 68 29 0a                                   rph).