Grammalecte  Hex Artifact Content

Artifact a0df0d139751a4ceb7703d4184f23d584af3ecad3cf847c1cabf75778142d403:


0000: 23 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 2d 20  # Grammalecte - 
0010: 43 6f 6d 70 69 6c 65 64 20 72 65 67 75 6c 61 72  Compiled regular
0020: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 0a 69 6d   expressions..im
0030: 70 6f 72 74 20 72 65 0a 0a 23 23 23 23 20 4c 65  port re..#### Le
0040: 6d 6d 65 0a 4c 65 6d 6d 61 20 3d 20 72 65 2e 63  mme.Lemma = re.c
0050: 6f 6d 70 69 6c 65 28 22 5e 3e 28 5c 77 5b 5c 77  ompile("^>(\w[\w
0060: 2d 5d 2a 29 22 29 0a 0a 23 23 23 23 20 41 6e 61  -]*)")..#### Ana
0070: 6c 79 73 65 73 0a 47 65 6e 64 65 72 20 3d 20 72  lyses.Gender = r
0080: 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 6d 66 65  e.compile(":[mfe
0090: 5d 22 29 0a 4e 75 6d 62 65 72 20 3d 20 72 65 2e  ]").Number = re.
00a0: 63 6f 6d 70 69 6c 65 28 22 3a 5b 73 70 69 5d 22  compile(":[spi]"
00b0: 29 0a 0a 23 23 23 23 20 4e 6f 6d 20 65 74 20 61  )..#### Nom et a
00c0: 64 6a 65 63 74 69 66 0a 4e 41 20 3d 20 72 65 2e  djectif.NA = re.
00d0: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 22 29  compile(":[NA]")
00e0: 0a 0a 23 23 20 6e 6f 6d 62 72 65 0a 4e 41 73 20  ..## nombre.NAs 
00f0: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
0100: 4e 41 5d 2e 2a 3a 73 22 29 0a 4e 41 70 20 3d 20  NA].*:s").NAp = 
0110: 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41  re.compile(":[NA
0120: 5d 2e 2a 3a 70 22 29 0a 4e 41 69 20 3d 20 72 65  ].*:p").NAi = re
0130: 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e  .compile(":[NA].
0140: 2a 3a 69 22 29 0a 4e 41 73 69 20 3d 20 72 65 2e  *:i").NAsi = re.
0150: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a  compile(":[NA].*
0160: 3a 5b 73 69 5d 22 29 0a 4e 41 70 69 20 3d 20 72  :[si]").NApi = r
0170: 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d  e.compile(":[NA]
0180: 2e 2a 3a 5b 70 69 5d 22 29 0a 0a 23 23 20 67 65  .*:[pi]")..## ge
0190: 6e 72 65 0a 4e 41 6d 20 3d 20 72 65 2e 63 6f 6d  nre.NAm = re.com
01a0: 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 6d 22  pile(":[NA].*:m"
01b0: 29 0a 4e 41 66 20 3d 20 72 65 2e 63 6f 6d 70 69  ).NAf = re.compi
01c0: 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 66 22 29 0a  le(":[NA].*:f").
01d0: 4e 41 65 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65  NAe = re.compile
01e0: 28 22 3a 5b 4e 41 5d 2e 2a 3a 65 22 29 0a 4e 41  (":[NA].*:e").NA
01f0: 6d 65 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28  me = re.compile(
0200: 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d 22 29 0a  ":[NA].*:[me]").
0210: 4e 41 66 65 20 3d 20 72 65 2e 63 6f 6d 70 69 6c  NAfe = re.compil
0220: 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 66 65 5d 22  e(":[NA].*:[fe]"
0230: 29 0a 0a 23 23 20 6e 6f 6d 62 72 65 20 65 74 20  )..## nombre et 
0240: 67 65 6e 72 65 0a 23 20 73 69 6e 67 75 69 6c 69  genre.# singuili
0250: 65 72 0a 4e 41 6d 73 20 3d 20 72 65 2e 63 6f 6d  er.NAms = re.com
0260: 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 6d 2e  pile(":[NA].*:m.
0270: 2a 3a 73 22 29 0a 4e 41 66 73 20 3d 20 72 65 2e  *:s").NAfs = re.
0280: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a  compile(":[NA].*
0290: 3a 66 2e 2a 3a 73 22 29 0a 4e 41 65 73 20 3d 20  :f.*:s").NAes = 
02a0: 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41  re.compile(":[NA
02b0: 5d 2e 2a 3a 65 2e 2a 3a 73 22 29 0a 4e 41 6d 65  ].*:e.*:s").NAme
02c0: 73 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  s = re.compile("
02d0: 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d 2e 2a 3a 73  :[NA].*:[me].*:s
02e0: 22 29 0a 4e 41 66 65 73 20 3d 20 72 65 2e 63 6f  ").NAfes = re.co
02f0: 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b  mpile(":[NA].*:[
0300: 66 65 5d 2e 2a 3a 73 22 29 0a 0a 23 20 73 69 6e  fe].*:s")..# sin
0310: 67 75 6c 69 65 72 20 65 74 20 69 6e 76 61 72 69  gulier et invari
0320: 61 62 6c 65 0a 4e 41 6d 73 69 20 3d 20 72 65 2e  able.NAmsi = re.
0330: 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a  compile(":[NA].*
0340: 3a 6d 2e 2a 3a 5b 73 69 5d 22 29 0a 4e 41 66 73  :m.*:[si]").NAfs
0350: 69 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  i = re.compile("
0360: 3a 5b 4e 41 5d 2e 2a 3a 66 2e 2a 3a 5b 73 69 5d  :[NA].*:f.*:[si]
0370: 22 29 0a 4e 41 65 73 69 20 3d 20 72 65 2e 63 6f  ").NAesi = re.co
0380: 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 65  mpile(":[NA].*:e
0390: 2e 2a 3a 5b 73 69 5d 22 29 0a 4e 41 6d 65 73 69  .*:[si]").NAmesi
03a0: 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a   = re.compile(":
03b0: 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d 2e 2a 3a 5b 73  [NA].*:[me].*:[s
03c0: 69 5d 22 29 0a 4e 41 66 65 73 69 20 3d 20 72 65  i]").NAfesi = re
03d0: 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e  .compile(":[NA].
03e0: 2a 3a 5b 66 65 5d 2e 2a 3a 5b 73 69 5d 22 29 0a  *:[fe].*:[si]").
03f0: 0a 23 20 70 6c 75 72 69 65 6c 0a 4e 41 6d 70 20  .# pluriel.NAmp 
0400: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b  = re.compile(":[
0410: 4e 41 5d 2e 2a 3a 6d 2e 2a 3a 70 22 29 0a 4e 41  NA].*:m.*:p").NA
0420: 66 70 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28  fp = re.compile(
0430: 22 3a 5b 4e 41 5d 2e 2a 3a 66 2e 2a 3a 70 22 29  ":[NA].*:f.*:p")
0440: 0a 4e 41 65 70 20 3d 20 72 65 2e 63 6f 6d 70 69  .NAep = re.compi
0450: 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 65 2e 2a 3a  le(":[NA].*:e.*:
0460: 70 22 29 0a 4e 41 6d 65 70 20 3d 20 72 65 2e 63  p").NAmep = re.c
0470: 6f 6d 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a  ompile(":[NA].*:
0480: 5b 6d 65 5d 2e 2a 3a 70 22 29 0a 4e 41 66 65 70  [me].*:p").NAfep
0490: 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a   = re.compile(":
04a0: 5b 4e 41 5d 2e 2a 3a 5b 6d 65 5d 2e 2a 3a 70 22  [NA].*:[me].*:p"
04b0: 29 0a 0a 23 20 70 6c 75 72 69 65 6c 20 65 74 20  )..# pluriel et 
04c0: 69 6e 76 61 72 69 61 62 6c 65 0a 4e 41 6d 70 69  invariable.NAmpi
04d0: 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a   = re.compile(":
04e0: 5b 4e 41 5d 2e 2a 3a 6d 2e 2a 3a 5b 70 69 5d 22  [NA].*:m.*:[pi]"
04f0: 29 0a 4e 41 66 70 69 20 3d 20 72 65 2e 63 6f 6d  ).NAfpi = re.com
0500: 70 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 66 2e  pile(":[NA].*:f.
0510: 2a 3a 5b 70 69 5d 22 29 0a 4e 41 65 70 69 20 3d  *:[pi]").NAepi =
0520: 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 5b 4e   re.compile(":[N
0530: 41 5d 2e 2a 3a 65 2e 2a 3a 5b 70 69 5d 22 29 0a  A].*:e.*:[pi]").
0540: 4e 41 6d 65 70 69 20 3d 20 72 65 2e 63 6f 6d 70  NAmepi = re.comp
0550: 69 6c 65 28 22 3a 5b 4e 41 5d 2e 2a 3a 5b 6d 65  ile(":[NA].*:[me
0560: 5d 2e 2a 3a 5b 70 69 5d 22 29 0a 4e 41 66 65 70  ].*:[pi]").NAfep
0570: 69 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  i = re.compile("
0580: 3a 5b 4e 41 5d 2e 2a 3a 5b 66 65 5d 2e 2a 3a 5b  :[NA].*:[fe].*:[
0590: 70 69 5d 22 29 0a 0a 23 20 64 69 76 65 72 73 0a  pi]")..# divers.
05a0: 41 44 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28  AD = re.compile(
05b0: 22 3a 5b 41 42 5d 22 29 0a 0a 23 23 23 23 20 56  ":[AB]")..#### V
05c0: 65 72 62 65 0a 56 63 6f 6e 6a 20 3d 20 72 65 2e  erbe.Vconj = re.
05d0: 63 6f 6d 70 69 6c 65 28 22 3a 5b 31 32 33 5d 5b  compile(":[123][
05e0: 73 70 5d 22 29 0a 56 63 6f 6e 6a 31 32 33 20 3d  sp]").Vconj123 =
05f0: 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 56 5b   re.compile(":V[
0600: 31 32 33 5d 2e 2a 3a 5b 31 32 33 5d 5b 73 70 5d  123].*:[123][sp]
0610: 22 29 0a 0a 23 23 23 23 20 4e 6f 6d 20 7c 20 41  ")..#### Nom | A
0620: 64 6a 65 63 74 69 66 20 7c 20 56 65 72 62 65 0a  djectif | Verbe.
0630: 4e 56 63 6f 6e 6a 20 3d 20 72 65 2e 63 6f 6d 70  NVconj = re.comp
0640: 69 6c 65 28 22 3a 28 3f 3a 4e 7c 5b 31 32 33 5d  ile(":(?:N|[123]
0650: 5b 73 70 5d 29 22 29 0a 4e 41 56 63 6f 6e 6a 20  [sp])").NAVconj 
0660: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 28  = re.compile(":(
0670: 3f 3a 4e 7c 41 7c 5b 31 32 33 5d 5b 73 70 5d 29  ?:N|A|[123][sp])
0680: 22 29 0a 0a 23 23 23 23 20 53 70 c3 a9 63 69 66  ")..#### Sp..cif
0690: 69 71 75 65 0a 4e 6e 6f 74 41 20 3d 20 72 65 2e  ique.NnotA = re.
06a0: 63 6f 6d 70 69 6c 65 28 22 3a 4e 28 3f 21 3a 41  compile(":N(?!:A
06b0: 29 22 29 0a 50 4e 6e 6f 74 41 20 3d 20 72 65 2e  )").PNnotA = re.
06c0: 63 6f 6d 70 69 6c 65 28 22 3a 28 3f 3a 4e 28 3f  compile(":(?:N(?
06d0: 21 3a 41 29 7c 51 29 22 29 0a 0a 23 23 23 23 20  !:A)|Q)")..#### 
06e0: 4e 6f 6d 73 20 70 72 6f 70 72 65 73 0a 4e 50 20  Noms propres.NP 
06f0: 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22 3a 28  = re.compile(":(
0700: 3f 3a 4d 5b 31 32 50 5d 7c 54 29 22 29 0a 4e 50  ?:M[12P]|T)").NP
0710: 6d 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  m = re.compile("
0720: 3a 28 3f 3a 4d 5b 31 32 50 5d 7c 54 29 3a 6d 22  :(?:M[12P]|T):m"
0730: 29 0a 4e 50 66 20 3d 20 72 65 2e 63 6f 6d 70 69  ).NPf = re.compi
0740: 6c 65 28 22 3a 28 3f 3a 4d 5b 31 32 50 5d 7c 54  le(":(?:M[12P]|T
0750: 29 3a 66 22 29 0a 4e 50 65 20 3d 20 72 65 2e 63  ):f").NPe = re.c
0760: 6f 6d 70 69 6c 65 28 22 3a 28 3f 3a 4d 5b 31 32  ompile(":(?:M[12
0770: 50 5d 7c 54 29 3a 65 22 29 0a 0a 0a 23 23 23 23  P]|T):e")...####
0780: 20 46 4f 4e 43 54 49 4f 4e 53 0a 0a 64 65 66 20   FONCTIONS..def 
0790: 67 65 74 4c 65 6d 6d 61 4f 66 4d 6f 72 70 68 20  getLemmaOfMorph 
07a0: 28 73 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  (s):.    return 
07b0: 4c 65 6d 6d 61 2e 73 65 61 72 63 68 28 73 29 2e  Lemma.search(s).
07c0: 67 72 6f 75 70 28 31 29 0a 0a 64 65 66 20 63 68  group(1)..def ch
07d0: 65 63 6b 41 67 72 65 65 6d 65 6e 74 20 28 6c 31  eckAgreement (l1
07e0: 2c 20 6c 32 29 3a 0a 20 20 20 20 23 20 63 68 65  , l2):.    # che
07f0: 63 6b 20 6e 75 6d 62 65 72 20 61 67 72 65 65 6d  ck number agreem
0800: 65 6e 74 0a 20 20 20 20 69 66 20 6e 6f 74 20 6d  ent.    if not m
0810: 62 49 6e 76 28 6c 31 29 20 61 6e 64 20 6e 6f 74  bInv(l1) and not
0820: 20 6d 62 49 6e 76 28 6c 32 29 3a 0a 20 20 20 20   mbInv(l2):.    
0830: 20 20 20 20 69 66 20 6d 62 53 67 28 6c 31 29 20      if mbSg(l1) 
0840: 61 6e 64 20 6e 6f 74 20 6d 62 53 67 28 6c 32 29  and not mbSg(l2)
0850: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
0860: 74 75 72 6e 20 46 61 6c 73 65 0a 20 20 20 20 20  turn False.     
0870: 20 20 20 69 66 20 6d 62 50 6c 28 6c 31 29 20 61     if mbPl(l1) a
0880: 6e 64 20 6e 6f 74 20 6d 62 50 6c 28 6c 32 29 3a  nd not mbPl(l2):
0890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
08a0: 75 72 6e 20 46 61 6c 73 65 0a 20 20 20 20 23 20  urn False.    # 
08b0: 63 68 65 63 6b 20 67 65 6e 64 65 72 20 61 67 72  check gender agr
08c0: 65 65 6d 65 6e 74 0a 20 20 20 20 69 66 20 6d 62  eement.    if mb
08d0: 45 70 69 28 6c 31 29 20 6f 72 20 6d 62 45 70 69  Epi(l1) or mbEpi
08e0: 28 6c 32 29 3a 0a 20 20 20 20 20 20 20 20 72 65  (l2):.        re
08f0: 74 75 72 6e 20 54 72 75 65 0a 20 20 20 20 69 66  turn True.    if
0900: 20 6d 62 4d 61 73 28 6c 31 29 20 61 6e 64 20 6e   mbMas(l1) and n
0910: 6f 74 20 6d 62 4d 61 73 28 6c 32 29 3a 0a 20 20  ot mbMas(l2):.  
0920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 61 6c        return Fal
0930: 73 65 0a 20 20 20 20 69 66 20 6d 62 46 65 6d 28  se.    if mbFem(
0940: 6c 31 29 20 61 6e 64 20 6e 6f 74 20 6d 62 46 65  l1) and not mbFe
0950: 6d 28 6c 32 29 3a 0a 20 20 20 20 20 20 20 20 72  m(l2):.        r
0960: 65 74 75 72 6e 20 46 61 6c 73 65 0a 20 20 20 20  eturn False.    
0970: 72 65 74 75 72 6e 20 54 72 75 65 0a 0a 64 65 66  return True..def
0980: 20 63 68 65 63 6b 43 6f 6e 6a 56 65 72 62 20 28   checkConjVerb (
0990: 6c 4d 6f 72 70 68 2c 20 73 52 65 71 43 6f 6e 6a  lMorph, sReqConj
09a0: 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6e  ):.    return an
09b0: 79 28 73 52 65 71 43 6f 6e 6a 20 69 6e 20 73 20  y(sReqConj in s 
09c0: 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68   for s in lMorph
09d0: 29 0a 0a 64 65 66 20 67 65 74 47 65 6e 64 65 72  )..def getGender
09e0: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22   (lMorph):.    "
09f0: 72 65 74 75 72 6e 73 20 67 65 6e 64 65 72 20 6f  returns gender o
0a00: 66 20 77 6f 72 64 20 28 27 3a 6d 27 2c 20 27 3a  f word (':m', ':
0a10: 66 27 2c 20 27 3a 65 27 20 6f 72 20 65 6d 70 74  f', ':e' or empt
0a20: 79 20 73 74 72 69 6e 67 29 2e 22 0a 20 20 20 20  y string).".    
0a30: 73 47 65 6e 64 65 72 20 3d 20 22 22 0a 20 20 20  sGender = "".   
0a40: 20 66 6f 72 20 73 4d 6f 72 70 68 20 69 6e 20 6c   for sMorph in l
0a50: 4d 6f 72 70 68 3a 0a 20 20 20 20 20 20 20 20 6d  Morph:.        m
0a60: 20 3d 20 47 65 6e 64 65 72 2e 73 65 61 72 63 68   = Gender.search
0a70: 28 73 4d 6f 72 70 68 29 0a 20 20 20 20 20 20 20  (sMorph).       
0a80: 20 69 66 20 6d 3a 0a 20 20 20 20 20 20 20 20 20   if m:.         
0a90: 20 20 20 69 66 20 6e 6f 74 20 73 47 65 6e 64 65     if not sGende
0aa0: 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r:.             
0ab0: 20 20 20 73 47 65 6e 64 65 72 20 3d 20 6d 2e 67     sGender = m.g
0ac0: 72 6f 75 70 28 30 29 0a 20 20 20 20 20 20 20 20  roup(0).        
0ad0: 20 20 20 20 65 6c 69 66 20 73 47 65 6e 64 65 72      elif sGender
0ae0: 20 21 3d 20 6d 2e 67 72 6f 75 70 28 30 29 3a 0a   != m.group(0):.
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 72 65 74 75 72 6e 20 22 3a 65 22 0a 20 20 20 20  return ":e".    
0b10: 72 65 74 75 72 6e 20 73 47 65 6e 64 65 72 0a 0a  return sGender..
0b20: 64 65 66 20 67 65 74 4e 75 6d 62 65 72 20 28 6c  def getNumber (l
0b30: 4d 6f 72 70 68 29 3a 0a 20 20 20 20 22 72 65 74  Morph):.    "ret
0b40: 75 72 6e 73 20 6e 75 6d 62 65 72 20 6f 66 20 77  urns number of w
0b50: 6f 72 64 20 28 27 3a 73 27 2c 20 27 3a 70 27 2c  ord (':s', ':p',
0b60: 20 27 3a 69 27 20 6f 72 20 65 6d 70 74 79 20 73   ':i' or empty s
0b70: 74 72 69 6e 67 29 2e 22 0a 20 20 20 20 73 4e 75  tring).".    sNu
0b80: 6d 62 65 72 20 3d 20 22 22 0a 20 20 20 20 66 6f  mber = "".    fo
0b90: 72 20 73 4d 6f 72 70 68 20 69 6e 20 6c 4d 6f 72  r sMorph in lMor
0ba0: 70 68 3a 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  ph:.        m = 
0bb0: 4e 75 6d 62 65 72 2e 73 65 61 72 63 68 28 73 57  Number.search(sW
0bc0: 6f 72 64 29 0a 20 20 20 20 20 20 20 20 69 66 20  ord).        if 
0bd0: 6d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  m:.            i
0be0: 66 20 6e 6f 74 20 73 4e 75 6d 62 65 72 3a 0a 20  f not sNumber:. 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0c00: 4e 75 6d 62 65 72 20 3d 20 6d 2e 67 72 6f 75 70  Number = m.group
0c10: 28 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (0).            
0c20: 65 6c 69 66 20 73 4e 75 6d 62 65 72 20 21 3d 20  elif sNumber != 
0c30: 6d 2e 67 72 6f 75 70 28 30 29 3a 0a 20 20 20 20  m.group(0):.    
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0c50: 72 6e 20 22 3a 69 22 0a 20 20 20 20 72 65 74 75  rn ":i".    retu
0c60: 72 6e 20 73 4e 75 6d 62 65 72 0a 0a 23 20 4e 4f  rn sNumber..# NO
0c70: 54 45 20 3a 20 20 69 73 57 68 61 74 20 28 6c 4d  TE :  isWhat (lM
0c80: 6f 72 70 68 29 20 20 20 20 72 65 74 75 72 6e 73  orph)    returns
0c90: 20 54 72 75 65 20 20 20 69 66 20 6c 4d 6f 72 70   True   if lMorp
0ca0: 68 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 74 68 69  h contains nothi
0cb0: 6e 67 20 65 6c 73 65 20 74 68 61 6e 20 57 68 61  ng else than Wha
0cc0: 74 0a 23 20 20 20 20 20 20 20 20 20 6d 62 57 68  t.#         mbWh
0cd0: 61 74 20 28 6c 4d 6f 72 70 68 29 20 20 20 20 72  at (lMorph)    r
0ce0: 65 74 75 72 6e 73 20 54 72 75 65 20 20 20 69 66  eturns True   if
0cf0: 20 6c 4d 6f 72 70 68 20 63 6f 6e 74 61 69 6e 73   lMorph contains
0d00: 20 57 68 61 74 20 61 74 20 6c 65 61 73 74 20 6f   What at least o
0d10: 6e 63 65 0a 0a 23 23 20 69 73 58 58 58 20 3d 20  nce..## isXXX = 
0d20: 69 74 e2 80 99 73 20 63 65 72 74 61 69 6e 0a 0a  it...s certain..
0d30: 64 65 66 20 69 73 4e 6f 6d 20 28 6c 4d 6f 72 70  def isNom (lMorp
0d40: 68 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 61  h):.    return a
0d50: 6c 6c 28 22 3a 4e 22 20 69 6e 20 73 20 20 66 6f  ll(":N" in s  fo
0d60: 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a  r s in lMorph)..
0d70: 64 65 66 20 69 73 4e 6f 6d 4e 6f 74 41 64 6a 20  def isNomNotAdj 
0d80: 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72 65  (lMorph):.    re
0d90: 74 75 72 6e 20 61 6c 6c 28 4e 6e 6f 74 41 2e 73  turn all(NnotA.s
0da0: 65 61 72 63 68 28 73 29 20 20 66 6f 72 20 73 20  earch(s)  for s 
0db0: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
0dc0: 69 73 41 64 6a 20 28 6c 4d 6f 72 70 68 29 3a 0a  isAdj (lMorph):.
0dd0: 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22      return all("
0de0: 3a 41 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :A" in s  for s 
0df0: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
0e00: 69 73 4e 6f 6d 41 64 6a 20 28 6c 4d 6f 72 70 68  isNomAdj (lMorph
0e10: 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c  ):.    return al
0e20: 6c 28 4e 41 2e 73 65 61 72 63 68 28 73 29 20 20  l(NA.search(s)  
0e30: 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68 29  for s in lMorph)
0e40: 0a 0a 64 65 66 20 69 73 4e 6f 6d 56 63 6f 6e 6a  ..def isNomVconj
0e50: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
0e60: 65 74 75 72 6e 20 61 6c 6c 28 4e 56 63 6f 6e 6a  eturn all(NVconj
0e70: 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72 20  .search(s)  for 
0e80: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
0e90: 66 20 69 73 49 6e 76 20 28 6c 4d 6f 72 70 68 29  f isInv (lMorph)
0ea0: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c  :.    return all
0eb0: 28 22 3a 69 22 20 69 6e 20 73 20 20 66 6f 72 20  (":i" 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 53 67 20 28 6c 4d 6f 72 70 68 29 3a  f isSg (lMorph):
0ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28  .    return all(
0ef0: 22 3a 73 22 20 69 6e 20 73 20 20 66 6f 72 20 73  ":s" in s  for s
0f00: 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66   in lMorph)..def
0f10: 20 69 73 50 6c 20 28 6c 4d 6f 72 70 68 29 3a 0a   isPl (lMorph):.
0f20: 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22      return all("
0f30: 3a 70 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :p" in s  for s 
0f40: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
0f50: 69 73 45 70 69 20 28 6c 4d 6f 72 70 68 29 3a 0a  isEpi (lMorph):.
0f60: 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22      return all("
0f70: 3a 65 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :e" in s  for s 
0f80: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
0f90: 69 73 4d 61 73 20 28 6c 4d 6f 72 70 68 29 3a 0a  isMas (lMorph):.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22      return all("
0fb0: 3a 6d 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :m" in s  for s 
0fc0: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
0fd0: 69 73 46 65 6d 20 28 6c 4d 6f 72 70 68 29 3a 0a  isFem (lMorph):.
0fe0: 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 28 22      return all("
0ff0: 3a 66 22 20 69 6e 20 73 20 20 66 6f 72 20 73 20  :f" in s  for s 
1000: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 0a 23 23 20  in lMorph)...## 
1010: 6d 62 58 58 58 20 3d 20 4d 41 59 42 45 20 58 58  mbXXX = MAYBE XX
1020: 58 0a 0a 64 65 66 20 6d 62 4e 6f 6d 20 28 6c 4d  X..def mbNom (lM
1030: 6f 72 70 68 29 3a 0a 20 20 20 20 72 65 74 75 72  orph):.    retur
1040: 6e 20 61 6e 79 28 22 3a 4e 22 20 69 6e 20 73 20  n any(":N" in s 
1050: 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68   for s in lMorph
1060: 29 0a 0a 64 65 66 20 6d 62 41 64 6a 20 28 6c 4d  )..def mbAdj (lM
1070: 6f 72 70 68 29 3a 0a 20 20 20 20 72 65 74 75 72  orph):.    retur
1080: 6e 20 61 6e 79 28 22 3a 41 22 20 69 6e 20 73 20  n any(":A" in s 
1090: 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68   for s in lMorph
10a0: 29 0a 0a 64 65 66 20 6d 62 41 64 6a 4e 62 20 28  )..def mbAdjNb (
10b0: 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72 65 74  lMorph):.    ret
10c0: 75 72 6e 20 61 6e 79 28 41 44 2e 73 65 61 72 63  urn any(AD.searc
10d0: 68 28 73 29 20 20 66 6f 72 20 73 20 69 6e 20 6c  h(s)  for s in l
10e0: 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4e 6f  Morph)..def mbNo
10f0: 6d 41 64 6a 20 28 6c 4d 6f 72 70 68 29 3a 0a 20  mAdj (lMorph):. 
1100: 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28 4e 41     return any(NA
1110: 2e 73 65 61 72 63 68 28 73 29 20 20 66 6f 72 20  .search(s)  for 
1120: 73 20 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65  s in lMorph)..de
1130: 66 20 6d 62 4e 6f 6d 4e 6f 74 41 64 6a 20 28 6c  f mbNomNotAdj (l
1140: 4d 6f 72 70 68 29 3a 0a 20 20 20 20 62 20 3d 20  Morph):.    b = 
1150: 46 61 6c 73 65 0a 20 20 20 20 66 6f 72 20 73 20  False.    for s 
1160: 69 6e 20 6c 4d 6f 72 70 68 3a 0a 20 20 20 20 20  in lMorph:.     
1170: 20 20 20 69 66 20 22 3a 41 22 20 69 6e 20 73 3a     if ":A" in s:
1180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1190: 75 72 6e 20 46 61 6c 73 65 0a 20 20 20 20 20 20  urn False.      
11a0: 20 20 69 66 20 22 3a 4e 22 20 69 6e 20 73 3a 0a    if ":N" in s:.
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 3d 20              b = 
11c0: 54 72 75 65 0a 20 20 20 20 72 65 74 75 72 6e 20  True.    return 
11d0: 62 0a 0a 64 65 66 20 6d 62 50 70 61 73 4e 6f 6d  b..def mbPpasNom
11e0: 4e 6f 74 41 64 6a 20 28 6c 4d 6f 72 70 68 29 3a  NotAdj (lMorph):
11f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 6e 79 28  .    return any(
1200: 50 4e 6e 6f 74 41 2e 73 65 61 72 63 68 28 73 29  PNnotA.search(s)
1210: 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70    for s in lMorp
1220: 68 29 0a 0a 64 65 66 20 6d 62 56 63 6f 6e 6a 20  h)..def mbVconj 
1230: 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72 65  (lMorph):.    re
1240: 74 75 72 6e 20 61 6e 79 28 56 63 6f 6e 6a 2e 73  turn any(Vconj.s
1250: 65 61 72 63 68 28 73 29 20 20 66 6f 72 20 73 20  earch(s)  for s 
1260: 69 6e 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20  in lMorph)..def 
1270: 6d 62 56 63 6f 6e 6a 31 32 33 20 28 6c 4d 6f 72  mbVconj123 (lMor
1280: 70 68 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  ph):.    return 
1290: 61 6e 79 28 56 63 6f 6e 6a 31 32 33 2e 73 65 61  any(Vconj123.sea
12a0: 72 63 68 28 73 29 20 20 66 6f 72 20 73 20 69 6e  rch(s)  for s in
12b0: 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62   lMorph)..def mb
12c0: 4d 47 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20  MG (lMorph):.   
12d0: 20 72 65 74 75 72 6e 20 61 6e 79 28 22 3a 47 22   return any(":G"
12e0: 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20   in s  for s in 
12f0: 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 49  lMorph)..def mbI
1300: 6e 76 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20  nv (lMorph):.   
1310: 20 72 65 74 75 72 6e 20 61 6e 79 28 22 3a 69 22   return any(":i"
1320: 20 69 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20   in s  for s in 
1330: 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 53  lMorph)..def mbS
1340: 67 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20  g (lMorph):.    
1350: 72 65 74 75 72 6e 20 61 6e 79 28 22 3a 73 22 20  return any(":s" 
1360: 69 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c  in s  for s in l
1370: 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 50 6c  Morph)..def mbPl
1380: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
1390: 65 74 75 72 6e 20 61 6e 79 28 22 3a 70 22 20 69  eturn any(":p" i
13a0: 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d  n s  for s in lM
13b0: 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 45 70 69  orph)..def mbEpi
13c0: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
13d0: 65 74 75 72 6e 20 61 6e 79 28 22 3a 65 22 20 69  eturn any(":e" i
13e0: 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d  n s  for s in lM
13f0: 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4d 61 73  orph)..def mbMas
1400: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
1410: 65 74 75 72 6e 20 61 6e 79 28 22 3a 6d 22 20 69  eturn any(":m" i
1420: 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d  n s  for s in lM
1430: 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 46 65 6d  orph)..def mbFem
1440: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
1450: 65 74 75 72 6e 20 61 6e 79 28 22 3a 66 22 20 69  eturn any(":f" i
1460: 6e 20 73 20 20 66 6f 72 20 73 20 69 6e 20 6c 4d  n s  for s in lM
1470: 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62 4e 70 72  orph)..def mbNpr
1480: 20 28 6c 4d 6f 72 70 68 29 3a 0a 20 20 20 20 72   (lMorph):.    r
1490: 65 74 75 72 6e 20 61 6e 79 28 4e 50 2e 73 65 61  eturn any(NP.sea
14a0: 72 63 68 28 73 29 20 20 66 6f 72 20 73 20 69 6e  rch(s)  for s in
14b0: 20 6c 4d 6f 72 70 68 29 0a 0a 64 65 66 20 6d 62   lMorph)..def mb
14c0: 4e 70 72 4d 61 73 4e 6f 74 46 65 6d 20 28 6c 4d  NprMasNotFem (lM
14d0: 6f 72 70 68 29 3a 0a 20 20 20 20 69 66 20 61 6e  orph):.    if an
14e0: 79 28 4e 50 66 2e 73 65 61 72 63 68 28 73 29 20  y(NPf.search(s) 
14f0: 20 66 6f 72 20 73 20 69 6e 20 6c 4d 6f 72 70 68   for s in lMorph
1500: 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ):.        retur
1510: 6e 20 46 61 6c 73 65 0a 20 20 20 20 72 65 74 75  n False.    retu
1520: 72 6e 20 61 6e 79 28 4e 50 6d 2e 73 65 61 72 63  rn any(NPm.searc
1530: 68 28 73 29 20 20 66 6f 72 20 73 20 69 6e 20 6c  h(s)  for s in l
1540: 4d 6f 72 70 68 29 0a                             Morph).