Grammalecte  Hex Artifact Content

Artifact 98519668b7b68214b4decf1a81203067b7f98ee17c82b70188b076865ca80499:


0000: 22 22 22 0a 47 72 61 6d 6d 61 6c 65 63 74 65 3a  """.Grammalecte:
0010: 20 63 6f 6d 70 69 6c 65 20 72 75 6c 65 73 0a 43   compile rules.C
0020: 72 65 61 74 65 20 61 20 44 69 72 65 63 74 20 41  reate a Direct A
0030: 63 79 63 6c 69 63 20 52 75 6c 65 20 47 72 61 70  cyclic Rule Grap
0040: 68 73 20 28 44 41 52 47 73 29 0a 22 22 22 0a 0a  hs (DARGs)."""..
0050: 69 6d 70 6f 72 74 20 72 65 0a 69 6d 70 6f 72 74  import re.import
0060: 20 74 72 61 63 65 62 61 63 6b 0a 69 6d 70 6f 72   traceback.impor
0070: 74 20 6a 73 6f 6e 0a 0a 69 6d 70 6f 72 74 20 64  t json..import d
0080: 61 72 67 0a 0a 0a 64 41 43 54 49 4f 4e 53 20 3d  arg...dACTIONS =
0090: 20 7b 7d 0a 64 46 55 4e 43 54 49 4f 4e 53 20 3d   {}.dFUNCTIONS =
00a0: 20 7b 7d 0a 64 46 55 4e 43 4e 41 4d 45 20 3d 20   {}.dFUNCNAME = 
00b0: 7b 7d 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 46  {}...def createF
00c0: 75 6e 63 74 69 6f 6e 20 28 73 54 79 70 65 2c 20  unction (sType, 
00d0: 73 41 63 74 69 6f 6e 49 64 2c 20 73 43 6f 64 65  sActionId, sCode
00e0: 2c 20 62 53 74 61 72 74 57 69 74 68 45 71 75 61  , bStartWithEqua
00f0: 6c 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 22 63  l=False):.    "c
0100: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
0110: 20 28 73 74 6f 72 65 64 20 69 6e 20 64 46 55 4e   (stored in dFUN
0120: 43 54 49 4f 4e 53 29 20 61 6e 64 20 72 65 74 75  CTIONS) and retu
0130: 72 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  rn function name
0140: 22 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 70 72  ".    sCode = pr
0150: 65 70 61 72 65 46 75 6e 63 74 69 6f 6e 28 73 43  epareFunction(sC
0160: 6f 64 65 29 0a 20 20 20 20 69 66 20 73 54 79 70  ode).    if sTyp
0170: 65 20 6e 6f 74 20 69 6e 20 64 46 55 4e 43 4e 41  e not in dFUNCNA
0180: 4d 45 3a 0a 20 20 20 20 20 20 20 20 64 46 55 4e  ME:.        dFUN
0190: 43 4e 41 4d 45 5b 73 54 79 70 65 5d 20 3d 20 7b  CNAME[sType] = {
01a0: 7d 0a 20 20 20 20 69 66 20 73 43 6f 64 65 20 6e  }.    if sCode n
01b0: 6f 74 20 69 6e 20 64 46 55 4e 43 4e 41 4d 45 5b  ot in dFUNCNAME[
01c0: 73 54 79 70 65 5d 3a 0a 20 20 20 20 20 20 20 20  sType]:.        
01d0: 64 46 55 4e 43 4e 41 4d 45 5b 73 54 79 70 65 5d  dFUNCNAME[sType]
01e0: 5b 73 43 6f 64 65 5d 20 3d 20 6c 65 6e 28 64 46  [sCode] = len(dF
01f0: 55 4e 43 4e 41 4d 45 5b 73 54 79 70 65 5d 29 2b  UNCNAME[sType])+
0200: 31 0a 20 20 20 20 73 46 75 6e 63 4e 61 6d 65 20  1.    sFuncName 
0210: 3d 20 22 5f 67 5f 22 20 2b 20 73 54 79 70 65 20  = "_g_" + sType 
0220: 2b 20 22 5f 22 20 2b 20 73 74 72 28 64 46 55 4e  + "_" + str(dFUN
0230: 43 4e 41 4d 45 5b 73 54 79 70 65 5d 5b 73 43 6f  CNAME[sType][sCo
0240: 64 65 5d 29 0a 20 20 20 20 64 46 55 4e 43 54 49  de]).    dFUNCTI
0250: 4f 4e 53 5b 73 46 75 6e 63 4e 61 6d 65 5d 20 3d  ONS[sFuncName] =
0260: 20 73 43 6f 64 65 0a 20 20 20 20 72 65 74 75 72   sCode.    retur
0270: 6e 20 73 46 75 6e 63 4e 61 6d 65 20 20 69 66 20  n sFuncName  if 
0280: 6e 6f 74 20 62 53 74 61 72 74 57 69 74 68 45 71  not bStartWithEq
0290: 75 61 6c 20 20 65 6c 73 65 20 22 3d 22 2b 73 46  ual  else "="+sF
02a0: 75 6e 63 4e 61 6d 65 0a 0a 0a 64 65 66 20 70 72  uncName...def pr
02b0: 65 70 61 72 65 46 75 6e 63 74 69 6f 6e 20 28 73  epareFunction (s
02c0: 43 6f 64 65 29 3a 0a 20 20 20 20 22 63 6f 6e 76  Code):.    "conv
02d0: 65 72 74 20 73 69 6d 70 6c 65 20 72 75 6c 65 20  ert simple rule 
02e0: 73 79 6e 74 61 78 20 74 6f 20 61 20 73 74 72 69  syntax to a stri
02f0: 6e 67 20 6f 66 20 50 79 74 68 6f 6e 20 63 6f 64  ng of Python cod
0300: 65 22 0a 20 20 20 20 69 66 20 73 43 6f 64 65 5b  e".    if sCode[
0310: 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20 20  0:1] == "=":.   
0320: 20 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f       sCode = sCo
0330: 64 65 5b 31 3a 5d 0a 20 20 20 20 73 43 6f 64 65  de[1:].    sCode
0340: 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65   = sCode.replace
0350: 28 22 5f 5f 61 6c 73 6f 5f 5f 22 2c 20 22 62 43  ("__also__", "bC
0360: 6f 6e 64 4d 65 6d 6f 22 29 0a 20 20 20 20 73 43  ondMemo").    sC
0370: 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c  ode = sCode.repl
0380: 61 63 65 28 22 5f 5f 65 6c 73 65 5f 5f 22 2c 20  ace("__else__", 
0390: 22 6e 6f 74 20 62 43 6f 6e 64 4d 65 6d 6f 22 29  "not bCondMemo")
03a0: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f  .    sCode = sCo
03b0: 64 65 2e 72 65 70 6c 61 63 65 28 22 73 43 6f 6e  de.replace("sCon
03c0: 74 65 78 74 22 2c 20 22 5f 73 41 70 70 43 6f 6e  text", "_sAppCon
03d0: 74 65 78 74 22 29 0a 20 20 20 20 73 43 6f 64 65  text").    sCode
03e0: 20 3d 20 72 65 2e 73 75 62 28 72 22 28 6d 6f 72   = re.sub(r"(mor
03f0: 70 68 7c 6d 6f 72 70 68 56 43 7c 61 6e 61 6c 79  ph|morphVC|analy
0400: 73 65 7c 76 61 6c 75 65 7c 64 69 73 70 6c 61 79  se|value|display
0410: 49 6e 66 6f 29 5b 28 5d 5c 5c 28 5c 64 2b 29 22  Info)[(]\\(\d+)"
0420: 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b  , 'g_\\1(lToken[
0430: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 32  nTokenOffset+\\2
0440: 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73  ]', sCode).    s
0450: 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22  Code = re.sub(r"
0460: 28 6d 6f 72 70 68 7c 6d 6f 72 70 68 56 43 7c 61  (morph|morphVC|a
0470: 6e 61 6c 79 73 65 7c 76 61 6c 75 65 7c 64 69 73  nalyse|value|dis
0480: 70 6c 61 79 49 6e 66 6f 29 5b 28 5d 5c 5c 2d 28  playInfo)[(]\\-(
0490: 5c 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 6c 54  \d+)", 'g_\\1(lT
04a0: 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d  oken[nLastToken-
04b0: 5c 5c 32 2b 31 5d 27 2c 20 73 43 6f 64 65 29 0a  \\2+1]', sCode).
04c0: 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73      sCode = re.s
04d0: 75 62 28 72 22 28 73 65 6c 65 63 74 7c 65 78 63  ub(r"(select|exc
04e0: 6c 75 64 65 7c 64 65 66 69 6e 65 7c 64 65 66 69  lude|define|defi
04f0: 6e 65 5f 66 72 6f 6d 29 5b 28 5d 5b 5c 5c 5d 28  ne_from)[(][\\](
0500: 5c 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 6c 54  \d+)", 'g_\\1(lT
0510: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65  oken[nTokenOffse
0520: 74 2b 5c 5c 32 5d 27 2c 20 73 43 6f 64 65 29 0a  t+\\2]', sCode).
0530: 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73      sCode = re.s
0540: 75 62 28 72 22 28 73 65 6c 65 63 74 7c 65 78 63  ub(r"(select|exc
0550: 6c 75 64 65 7c 64 65 66 69 6e 65 7c 64 65 66 69  lude|define|defi
0560: 6e 65 5f 66 72 6f 6d 29 5b 28 5d 5b 5c 5c 5d 2d  ne_from)[(][\\]-
0570: 28 5c 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 6c  (\d+)", 'g_\\1(l
0580: 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e  Token[nLastToken
0590: 2d 5c 5c 32 2b 31 5d 27 2c 20 73 43 6f 64 65 29  -\\2+1]', sCode)
05a0: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e  .    sCode = re.
05b0: 73 75 62 28 72 22 28 74 61 67 5f 62 65 66 6f 72  sub(r"(tag_befor
05c0: 65 7c 74 61 67 5f 61 66 74 65 72 29 5b 28 5d 5b  e|tag_after)[(][
05d0: 5c 5c 5d 28 5c 64 2b 29 22 2c 20 27 67 5f 5c 5c  \\](\d+)", 'g_\\
05e0: 31 28 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f  1(lToken[nTokenO
05f0: 66 66 73 65 74 2b 5c 5c 32 5d 2c 20 64 54 61 67  ffset+\\2], dTag
0600: 73 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73  s', sCode).    s
0610: 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22  Code = re.sub(r"
0620: 28 74 61 67 5f 62 65 66 6f 72 65 7c 74 61 67 5f  (tag_before|tag_
0630: 61 66 74 65 72 29 5b 28 5d 5b 5c 5c 5d 2d 28 5c  after)[(][\\]-(\
0640: 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f  d+)", 'g_\\1(lTo
0650: 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c  ken[nLastToken-\
0660: 5c 32 2b 31 5d 2c 20 64 54 61 67 73 27 2c 20 73  \2+1], dTags', s
0670: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
0680: 3d 20 72 65 2e 73 75 62 28 72 22 73 70 61 63 65  = re.sub(r"space
0690: 5f 61 66 74 65 72 5b 28 5d 5b 5c 5c 5d 28 5c 64  _after[(][\\](\d
06a0: 2b 29 22 2c 20 27 67 5f 73 70 61 63 65 5f 62 65  +)", 'g_space_be
06b0: 74 77 65 65 6e 5f 74 6f 6b 65 6e 73 28 6c 54 6f  tween_tokens(lTo
06c0: 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  ken[nTokenOffset
06d0: 2b 5c 5c 31 5d 2c 20 6c 54 6f 6b 65 6e 5b 6e 54  +\\1], lToken[nT
06e0: 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 2b 31  okenOffset+\\1+1
06f0: 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73  ]', sCode).    s
0700: 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22  Code = re.sub(r"
0710: 73 70 61 63 65 5f 61 66 74 65 72 5b 28 5d 5b 5c  space_after[(][\
0720: 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 67 5f 73 70  \]-(\d+)", 'g_sp
0730: 61 63 65 5f 62 65 74 77 65 65 6e 5f 74 6f 6b 65  ace_between_toke
0740: 6e 73 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  ns(lToken[nLastT
0750: 6f 6b 65 6e 2d 5c 5c 31 2b 31 5d 2c 20 6c 54 6f  oken-\\1+1], lTo
0760: 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c  ken[nLastToken-\
0770: 5c 31 2b 32 5d 27 2c 20 73 43 6f 64 65 29 0a 20  \1+2]', sCode). 
0780: 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75     sCode = re.su
0790: 62 28 72 22 61 6e 61 6c 79 73 65 5f 77 69 74 68  b(r"analyse_with
07a0: 5f 6e 65 78 74 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b  _next[(][\\](\d+
07b0: 29 22 2c 20 27 67 5f 6d 65 72 67 65 64 5f 61 6e  )", 'g_merged_an
07c0: 61 6c 79 73 65 28 6c 54 6f 6b 65 6e 5b 6e 54 6f  alyse(lToken[nTo
07d0: 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 5d 2c 20  kenOffset+\\1], 
07e0: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66  lToken[nTokenOff
07f0: 73 65 74 2b 5c 5c 31 2b 31 5d 27 2c 20 73 43 6f  set+\\1+1]', sCo
0800: 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  de).    sCode = 
0810: 72 65 2e 73 75 62 28 72 22 61 6e 61 6c 79 73 65  re.sub(r"analyse
0820: 5f 77 69 74 68 5f 6e 65 78 74 5b 28 5d 5b 5c 5c  _with_next[(][\\
0830: 5d 2d 28 5c 64 2b 29 22 2c 20 27 67 5f 6d 65 72  ]-(\d+)", 'g_mer
0840: 67 65 64 5f 61 6e 61 6c 79 73 65 28 6c 54 6f 6b  ged_analyse(lTok
0850: 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c 5c  en[nLastToken-\\
0860: 31 2b 31 5d 2c 20 6c 54 6f 6b 65 6e 5b 6e 4c 61  1+1], lToken[nLa
0870: 73 74 54 6f 6b 65 6e 2d 5c 5c 31 2b 32 5d 27 2c  stToken-\\1+2]',
0880: 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64   sCode).    sCod
0890: 65 20 3d 20 72 65 2e 73 75 62 28 72 22 28 6d 6f  e = re.sub(r"(mo
08a0: 72 70 68 7c 61 6e 61 6c 79 73 65 7c 76 61 6c 75  rph|analyse|valu
08b0: 65 29 5c 28 3e 31 22 2c 20 27 67 5f 5c 5c 31 28  e)\(>1", 'g_\\1(
08c0: 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65  lToken[nLastToke
08d0: 6e 2b 31 5d 27 2c 20 73 43 6f 64 65 29 20 20 20  n+1]', sCode)   
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 23 20 6e 65 78 74 20 74 6f 6b 65 6e      # next token
0900: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e  .    sCode = re.
0910: 73 75 62 28 72 22 28 6d 6f 72 70 68 7c 61 6e 61  sub(r"(morph|ana
0920: 6c 79 73 65 7c 76 61 6c 75 65 29 5c 28 3c 31 22  lyse|value)\(<1"
0930: 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b  , 'g_\\1(lToken[
0940: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 5d 27 2c 20  nTokenOffset]', 
0950: 73 43 6f 64 65 29 20 20 20 20 20 20 20 20 20 20  sCode)          
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 70               # p
0970: 72 65 76 69 6f 75 73 20 74 6f 6b 65 6e 0a 20 20  revious token.  
0980: 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62    sCode = re.sub
0990: 28 72 22 28 6d 6f 72 70 68 7c 61 6e 61 6c 79 73  (r"(morph|analys
09a0: 65 7c 76 61 6c 75 65 29 5c 28 3e 28 5c 64 2b 29  e|value)\(>(\d+)
09b0: 22 2c 20 27 67 5f 5c 5c 31 28 67 5f 74 6f 6b 65  ", 'g_\\1(g_toke
09c0: 6e 28 6c 54 6f 6b 65 6e 2c 20 6e 4c 61 73 74 54  n(lToken, nLastT
09d0: 6f 6b 65 6e 2b 5c 5c 32 29 27 2c 20 73 43 6f 64  oken+\\2)', sCod
09e0: 65 29 20 20 20 20 20 20 20 20 23 20 6e 65 78 74  e)        # next
09f0: 20 74 6f 6b 65 6e 0a 20 20 20 20 73 43 6f 64 65   token.    sCode
0a00: 20 3d 20 72 65 2e 73 75 62 28 72 22 28 6d 6f 72   = re.sub(r"(mor
0a10: 70 68 7c 61 6e 61 6c 79 73 65 7c 76 61 6c 75 65  ph|analyse|value
0a20: 29 5c 28 3c 28 5c 64 2b 29 22 2c 20 27 67 5f 5c  )\(<(\d+)", 'g_\
0a30: 5c 31 28 67 5f 74 6f 6b 65 6e 28 6c 54 6f 6b 65  \1(g_token(lToke
0a40: 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b  n, nTokenOffset+
0a50: 31 2d 5c 5c 32 29 27 2c 20 73 43 6f 64 65 29 20  1-\\2)', sCode) 
0a60: 20 20 20 23 20 70 72 65 76 69 6f 75 73 20 74 6f     # previous to
0a70: 6b 65 6e 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  ken.    sCode = 
0a80: 72 65 2e 73 75 62 28 72 22 5c 62 73 70 65 6c 6c  re.sub(r"\bspell
0a90: 20 2a 5b 28 5d 22 2c 20 27 5f 6f 53 70 65 6c 6c   *[(]", '_oSpell
0aa0: 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69 64 28  Checker.isValid(
0ab0: 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43  ', sCode).    sC
0ac0: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c  ode = re.sub(r"\
0ad0: 62 62 65 66 6f 72 65 5c 28 5c 73 2a 22 2c 20 27  bbefore\(\s*", '
0ae0: 6c 6f 6f 6b 28 73 53 65 6e 74 65 6e 63 65 5b 3a  look(sSentence[:
0af0: 6c 54 6f 6b 65 6e 5b 31 2b 6e 54 6f 6b 65 6e 4f  lToken[1+nTokenO
0b00: 66 66 73 65 74 5d 5b 22 6e 53 74 61 72 74 22 5d  ffset]["nStart"]
0b10: 5d 2c 20 27 2c 20 73 43 6f 64 65 29 20 20 20 20  ], ', sCode)    
0b20: 20 20 20 20 20 20 23 20 62 65 66 6f 72 65 28 73        # before(s
0b30: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
0b40: 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 61 66 74  = re.sub(r"\baft
0b50: 65 72 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28  er\(\s*", 'look(
0b60: 73 53 65 6e 74 65 6e 63 65 5b 6c 54 6f 6b 65 6e  sSentence[lToken
0b70: 5b 6e 4c 61 73 74 54 6f 6b 65 6e 5d 5b 22 6e 45  [nLastToken]["nE
0b80: 6e 64 22 5d 3a 5d 2c 20 27 2c 20 73 43 6f 64 65  nd"]:], ', sCode
0b90: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
0ba0: 20 20 23 20 61 66 74 65 72 28 73 43 6f 64 65 29    # after(sCode)
0bb0: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e  .    sCode = re.
0bc0: 73 75 62 28 72 22 5c 62 62 65 66 6f 72 65 30 5c  sub(r"\bbefore0\
0bd0: 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73 53 65  (\s*", 'look(sSe
0be0: 6e 74 65 6e 63 65 30 5b 3a 6c 54 6f 6b 65 6e 5b  ntence0[:lToken[
0bf0: 31 2b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 5d 5b  1+nTokenOffset][
0c00: 22 6e 53 74 61 72 74 22 5d 5d 2c 20 27 2c 20 73  "nStart"]], ', s
0c10: 43 6f 64 65 29 20 20 20 20 20 20 20 20 23 20 62  Code)        # b
0c20: 65 66 6f 72 65 30 28 73 43 6f 64 65 29 0a 20 20  efore0(sCode).  
0c30: 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62    sCode = re.sub
0c40: 28 72 22 5c 62 61 66 74 65 72 30 5c 28 5c 73 2a  (r"\bafter0\(\s*
0c50: 22 2c 20 27 6c 6f 6f 6b 28 73 53 65 6e 74 65 6e  ", 'look(sSenten
0c60: 63 65 5b 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  ce[lToken[nLastT
0c70: 6f 6b 65 6e 5d 5b 22 6e 45 6e 64 22 5d 3a 5d 2c  oken]["nEnd"]:],
0c80: 20 27 2c 20 73 43 6f 64 65 29 20 20 20 20 20 20   ', sCode)      
0c90: 20 20 20 20 20 20 20 20 20 20 23 20 61 66 74 65            # afte
0ca0: 72 30 28 73 43 6f 64 65 29 0a 20 20 20 20 73 43  r0(sCode).    sC
0cb0: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5b  ode = re.sub(r"[
0cc0: 5c 5c 5d 28 5c 64 2b 29 22 2c 20 27 6c 54 6f 6b  \\](\d+)", 'lTok
0cd0: 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b  en[nTokenOffset+
0ce0: 5c 5c 31 5d 5b 22 73 56 61 6c 75 65 22 5d 27 2c  \\1]["sValue"]',
0cf0: 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64   sCode).    sCod
0d00: 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5b 5c 5c  e = re.sub(r"[\\
0d10: 5d 2d 28 5c 64 2b 29 22 2c 20 27 6c 54 6f 6b 65  ]-(\d+)", 'lToke
0d20: 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c 5c 31  n[nLastToken-\\1
0d30: 2b 31 5d 5b 22 73 56 61 6c 75 65 22 5d 27 2c 20  +1]["sValue"]', 
0d40: 73 43 6f 64 65 29 0a 20 20 20 20 72 65 74 75 72  sCode).    retur
0d50: 6e 20 73 43 6f 64 65 0a 0a 0a 64 65 66 20 67 65  n sCode...def ge
0d60: 6e 54 6f 6b 65 6e 4c 69 6e 65 73 20 28 73 54 6f  nTokenLines (sTo
0d70: 6b 65 6e 4c 69 6e 65 2c 20 64 44 65 66 29 3a 0a  kenLine, dDef):.
0d80: 20 20 20 20 22 74 6f 6b 65 6e 69 7a 65 20 61 20      "tokenize a 
0d90: 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72  string and retur
0da0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 6c 69 6e 65  n a list of line
0db0: 73 20 6f 66 20 74 6f 6b 65 6e 73 22 0a 20 20 20  s of tokens".   
0dc0: 20 6c 54 6f 6b 65 6e 20 3d 20 73 54 6f 6b 65 6e   lToken = sToken
0dd0: 4c 69 6e 65 2e 73 70 6c 69 74 28 29 0a 20 20 20  Line.split().   
0de0: 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 20 3d 20 4e   lTokenLines = N
0df0: 6f 6e 65 0a 20 20 20 20 66 6f 72 20 73 54 6f 6b  one.    for sTok
0e00: 65 6e 20 69 6e 20 6c 54 6f 6b 65 6e 3a 0a 20 20  en in lToken:.  
0e10: 20 20 20 20 20 20 23 20 6f 70 74 69 6f 6e 61 6c        # optional
0e20: 20 74 6f 6b 65 6e 3f 0a 20 20 20 20 20 20 20 20   token?.        
0e30: 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65 20 3d 20  bNullPossible = 
0e40: 73 54 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74  sToken.startswit
0e50: 68 28 22 3f 22 29 20 61 6e 64 20 73 54 6f 6b 65  h("?") and sToke
0e60: 6e 2e 65 6e 64 73 77 69 74 68 28 22 c2 bf 22 29  n.endswith("..")
0e70: 0a 20 20 20 20 20 20 20 20 69 66 20 62 4e 75 6c  .        if bNul
0e80: 6c 50 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 20  lPossible:.     
0e90: 20 20 20 20 20 20 20 73 54 6f 6b 65 6e 20 3d 20         sToken = 
0ea0: 73 54 6f 6b 65 6e 5b 31 3a 2d 31 5d 0a 20 20 20  sToken[1:-1].   
0eb0: 20 20 20 20 20 23 20 74 6f 6b 65 6e 20 77 69 74       # token wit
0ec0: 68 20 64 65 66 69 6e 69 74 69 6f 6e 3f 0a 20 20  h definition?.  
0ed0: 20 20 20 20 20 20 69 66 20 73 54 6f 6b 65 6e 2e        if sToken.
0ee0: 73 74 61 72 74 73 77 69 74 68 28 22 28 7b 22 29  startswith("({")
0ef0: 20 61 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73   and sToken.ends
0f00: 77 69 74 68 28 22 7d 29 22 29 20 61 6e 64 20 73  with("})") and s
0f10: 54 6f 6b 65 6e 5b 31 3a 2d 31 5d 20 69 6e 20 64  Token[1:-1] in d
0f20: 44 65 66 3a 0a 20 20 20 20 20 20 20 20 20 20 20  Def:.           
0f30: 20 73 54 6f 6b 65 6e 20 3d 20 22 28 22 20 2b 20   sToken = "(" + 
0f40: 64 44 65 66 5b 73 54 6f 6b 65 6e 5b 31 3a 2d 31  dDef[sToken[1:-1
0f50: 5d 5d 20 2b 20 22 29 22 0a 20 20 20 20 20 20 20  ]] + ")".       
0f60: 20 65 6c 69 66 20 73 54 6f 6b 65 6e 2e 73 74 61   elif sToken.sta
0f70: 72 74 73 77 69 74 68 28 22 7b 22 29 20 61 6e 64  rtswith("{") and
0f80: 20 73 54 6f 6b 65 6e 2e 65 6e 64 73 77 69 74 68   sToken.endswith
0f90: 28 22 7d 22 29 20 61 6e 64 20 73 54 6f 6b 65 6e  ("}") and sToken
0fa0: 20 69 6e 20 64 44 65 66 3a 0a 20 20 20 20 20 20   in dDef:.      
0fb0: 20 20 20 20 20 20 73 54 6f 6b 65 6e 20 3d 20 64        sToken = d
0fc0: 44 65 66 5b 73 54 6f 6b 65 6e 5d 0a 20 20 20 20  Def[sToken].    
0fd0: 20 20 20 20 69 66 20 28 20 28 73 54 6f 6b 65 6e      if ( (sToken
0fe0: 2e 73 74 61 72 74 73 77 69 74 68 28 22 5b 22 29  .startswith("[")
0ff0: 20 61 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73   and sToken.ends
1000: 77 69 74 68 28 22 5d 22 29 29 20 6f 72 20 28 73  with("]")) or (s
1010: 54 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74 68  Token.startswith
1020: 28 22 28 5b 22 29 20 61 6e 64 20 73 54 6f 6b 65  ("([") and sToke
1030: 6e 2e 65 6e 64 73 77 69 74 68 28 22 5d 29 22 29  n.endswith("])")
1040: 29 20 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ) ):.           
1050: 20 23 20 6d 75 6c 74 69 70 6c 65 20 74 6f 6b 65   # multiple toke
1060: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 53  n.            bS
1070: 65 6c 65 63 74 65 64 47 72 6f 75 70 20 3d 20 73  electedGroup = s
1080: 54 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74 68  Token.startswith
1090: 28 22 28 22 29 20 61 6e 64 20 73 54 6f 6b 65 6e  ("(") and sToken
10a0: 2e 65 6e 64 73 77 69 74 68 28 22 29 22 29 0a 20  .endswith(")"). 
10b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 62 53             if bS
10c0: 65 6c 65 63 74 65 64 47 72 6f 75 70 3a 0a 20 20  electedGroup:.  
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54                sT
10e0: 6f 6b 65 6e 20 3d 20 73 54 6f 6b 65 6e 5b 31 3a  oken = sToken[1:
10f0: 2d 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1].            
1100: 6c 4e 65 77 54 6f 6b 65 6e 20 3d 20 73 54 6f 6b  lNewToken = sTok
1110: 65 6e 5b 31 3a 2d 31 5d 2e 73 70 6c 69 74 28 22  en[1:-1].split("
1120: 7c 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  |").            
1130: 69 66 20 6e 6f 74 20 6c 54 6f 6b 65 6e 4c 69 6e  if not lTokenLin
1140: 65 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  es:.            
1150: 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 20      lTokenLines 
1160: 3d 20 5b 20 5b 22 28 22 2b 73 2b 22 29 22 5d 20  = [ ["("+s+")"] 
1170: 20 66 6f 72 20 73 20 20 69 6e 20 6c 4e 65 77 54   for s  in lNewT
1180: 6f 6b 65 6e 20 5d 20 20 69 66 20 62 53 65 6c 65  oken ]  if bSele
1190: 63 74 65 64 47 72 6f 75 70 20 20 65 6c 73 65 20  ctedGroup  else 
11a0: 5b 20 5b 73 5d 20 20 66 6f 72 20 73 20 20 69 6e  [ [s]  for s  in
11b0: 20 6c 4e 65 77 54 6f 6b 65 6e 20 5d 0a 20 20 20   lNewToken ].   
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
11d0: 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65 3a 0a 20  bNullPossible:. 
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 2e 65     lTokenLines.e
1200: 78 74 65 6e 64 28 5b 20 5b 5d 20 20 66 6f 72 20  xtend([ []  for 
1210: 69 20 20 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28  i  in range(len(
1220: 6c 4e 65 77 54 6f 6b 65 6e 29 2b 31 29 20 5d 29  lNewToken)+1) ])
1230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
1240: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1250: 20 20 20 6c 4e 65 77 54 65 6d 70 20 3d 20 5b 5d     lNewTemp = []
1260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1270: 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c   if bNullPossibl
1280: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1290: 20 20 20 20 20 20 20 66 6f 72 20 61 52 75 6c 65         for aRule
12a0: 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a   in lTokenLines:
12b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12c0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 73 45 6c           for sEl
12d0: 65 6d 20 69 6e 20 6c 4e 65 77 54 6f 6b 65 6e 3a  em in lNewToken:
12e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65               aNe
1300: 77 52 75 6c 65 20 3d 20 6c 69 73 74 28 61 52 75  wRule = list(aRu
1310: 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  le).            
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 61 4e 65 77 52 75 6c 65 2e 61 70 70 65 6e 64 28  aNewRule.append(
1340: 73 45 6c 65 6d 29 0a 20 20 20 20 20 20 20 20 20  sElem).         
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 6c 4e 65 77 54 65 6d 70 2e 61 70 70 65     lNewTemp.appe
1370: 6e 64 28 61 4e 65 77 52 75 6c 65 29 0a 20 20 20  nd(aNewRule).   
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
1390: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
13a0: 20 20 20 20 20 20 20 73 45 6c 65 6d 31 20 3d 20         sElem1 = 
13b0: 6c 4e 65 77 54 6f 6b 65 6e 2e 70 6f 70 28 30 29  lNewToken.pop(0)
13c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d0: 20 20 20 20 20 66 6f 72 20 61 52 75 6c 65 20 69       for aRule i
13e0: 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20  n lTokenLines:. 
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 66 6f 72 20 73 45 6c 65 6d         for sElem
1410: 20 69 6e 20 6c 4e 65 77 54 6f 6b 65 6e 3a 0a 20   in lNewToken:. 
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 52             aNewR
1440: 75 6c 65 20 3d 20 6c 69 73 74 28 61 52 75 6c 65  ule = list(aRule
1450: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 4e                aN
1470: 65 77 52 75 6c 65 2e 61 70 70 65 6e 64 28 22 28  ewRule.append("(
1480: 22 20 2b 20 73 45 6c 65 6d 20 2b 20 22 29 22 20  " + sElem + ")" 
1490: 20 69 66 20 62 53 65 6c 65 63 74 65 64 47 72 6f   if bSelectedGro
14a0: 75 70 20 20 65 6c 73 65 20 73 45 6c 65 6d 29 0a  up  else sElem).
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77              lNew
14d0: 54 65 6d 70 2e 61 70 70 65 6e 64 28 61 4e 65 77  Temp.append(aNew
14e0: 52 75 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20  Rule).          
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 52                aR
1500: 75 6c 65 2e 61 70 70 65 6e 64 28 22 28 22 20 2b  ule.append("(" +
1510: 20 73 45 6c 65 6d 31 20 2b 20 22 29 22 20 20 69   sElem1 + ")"  i
1520: 66 20 62 53 65 6c 65 63 74 65 64 47 72 6f 75 70  f bSelectedGroup
1530: 20 20 65 6c 73 65 20 73 45 6c 65 6d 31 29 0a 20    else sElem1). 
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1550: 54 6f 6b 65 6e 4c 69 6e 65 73 2e 65 78 74 65 6e  TokenLines.exten
1560: 64 28 6c 4e 65 77 54 65 6d 70 29 0a 20 20 20 20  d(lNewTemp).    
1570: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
1580: 20 20 20 20 20 20 23 20 73 69 6d 70 6c 65 20 74        # simple t
1590: 6f 6b 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  oken.           
15a0: 20 69 66 20 6e 6f 74 20 6c 54 6f 6b 65 6e 4c 69   if not lTokenLi
15b0: 6e 65 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20  nes:.           
15c0: 20 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73       lTokenLines
15d0: 20 3d 20 5b 5b 73 54 6f 6b 65 6e 5d 2c 20 5b 5d   = [[sToken], []
15e0: 5d 20 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69  ]  if bNullPossi
15f0: 62 6c 65 20 20 65 6c 73 65 20 5b 5b 73 54 6f 6b  ble  else [[sTok
1600: 65 6e 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  en]].           
1610: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
1620: 20 20 20 20 20 20 20 69 66 20 62 4e 75 6c 6c 50         if bNullP
1630: 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 20 20 20  ossible:.       
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65               lNe
1650: 77 54 65 6d 70 20 3d 20 5b 5d 0a 20 20 20 20 20  wTemp = [].     
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1670: 6f 72 20 61 52 75 6c 65 20 69 6e 20 6c 54 6f 6b  or aRule in lTok
1680: 65 6e 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20 20  enLines:.       
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 6c 4e 65 77 20 3d 20 6c 69 73 74 28 61 52 75   lNew = list(aRu
16b0: 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  le).            
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77              lNew
16d0: 2e 61 70 70 65 6e 64 28 73 54 6f 6b 65 6e 29 0a  .append(sToken).
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 6c 4e 65 77 54 65 6d 70          lNewTemp
1700: 2e 61 70 70 65 6e 64 28 6c 4e 65 77 29 0a 20 20  .append(lNew).  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 2e 65 78    lTokenLines.ex
1730: 74 65 6e 64 28 6c 4e 65 77 54 65 6d 70 29 0a 20  tend(lNewTemp). 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1750: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
1760: 20 20 20 20 20 20 20 20 20 66 6f 72 20 61 52 75           for aRu
1770: 6c 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65  le in lTokenLine
1780: 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s:.             
1790: 20 20 20 20 20 20 20 20 20 20 20 61 52 75 6c 65             aRule
17a0: 2e 61 70 70 65 6e 64 28 73 54 6f 6b 65 6e 29 0a  .append(sToken).
17b0: 20 20 20 20 66 6f 72 20 61 52 75 6c 65 20 69 6e      for aRule in
17c0: 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20   lTokenLines:.  
17d0: 20 20 20 20 20 20 79 69 65 6c 64 20 61 52 75 6c        yield aRul
17e0: 65 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 52 75  e...def createRu
17f0: 6c 65 20 28 69 4c 69 6e 65 2c 20 73 52 75 6c 65  le (iLine, sRule
1800: 4e 61 6d 65 2c 20 73 54 6f 6b 65 6e 4c 69 6e 65  Name, sTokenLine
1810: 2c 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b 2c 20  , iActionBlock, 
1820: 73 41 63 74 69 6f 6e 73 2c 20 6e 50 72 69 6f 72  sActions, nPrior
1830: 69 74 79 2c 20 64 4f 70 74 50 72 69 6f 72 69 74  ity, dOptPriorit
1840: 79 2c 20 64 44 65 66 29 3a 0a 20 20 20 20 22 67  y, dDef):.    "g
1850: 65 6e 65 72 61 74 6f 72 3a 20 63 72 65 61 74 65  enerator: create
1860: 20 72 75 6c 65 20 61 73 20 6c 69 73 74 22 0a 20   rule as list". 
1870: 20 20 20 23 20 70 72 69 6e 74 28 69 4c 69 6e 65     # print(iLine
1880: 2c 20 22 2f 2f 22 2c 20 73 52 75 6c 65 4e 61 6d  , "//", sRuleNam
1890: 65 2c 20 22 2f 2f 22 2c 20 73 54 6f 6b 65 6e 4c  e, "//", sTokenL
18a0: 69 6e 65 2c 20 22 2f 2f 22 2c 20 73 41 63 74 69  ine, "//", sActi
18b0: 6f 6e 73 2c 20 22 2f 2f 22 2c 20 6e 50 72 69 6f  ons, "//", nPrio
18c0: 72 69 74 79 29 0a 20 20 20 20 66 6f 72 20 6c 54  rity).    for lT
18d0: 6f 6b 65 6e 20 69 6e 20 67 65 6e 54 6f 6b 65 6e  oken in genToken
18e0: 4c 69 6e 65 73 28 73 54 6f 6b 65 6e 4c 69 6e 65  Lines(sTokenLine
18f0: 2c 20 64 44 65 66 29 3a 0a 20 20 20 20 20 20 20  , dDef):.       
1900: 20 23 20 43 61 6c 63 75 6c 61 74 65 20 70 6f 73   # Calculate pos
1910: 69 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 64  itions.        d
1920: 50 6f 73 20 3d 20 7b 7d 20 20 20 23 20 6b 65 79  Pos = {}   # key
1930: 3a 20 69 47 72 6f 75 70 2c 20 76 61 6c 75 65 3a  : iGroup, value:
1940: 20 69 54 6f 6b 65 6e 0a 20 20 20 20 20 20 20 20   iToken.        
1950: 69 47 72 6f 75 70 20 3d 20 30 0a 20 20 20 20 20  iGroup = 0.     
1960: 20 20 20 23 69 66 20 69 4c 69 6e 65 20 3d 3d 20     #if iLine == 
1970: 33 39 37 31 3a 20 23 20 64 65 62 75 67 0a 20 20  3971: # debug.  
1980: 20 20 20 20 20 20 23 20 20 20 20 70 72 69 6e 74        #    print
1990: 28 22 20 22 2e 6a 6f 69 6e 28 6c 54 6f 6b 65 6e  (" ".join(lToken
19a0: 29 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69  )).        for i
19b0: 2c 20 73 54 6f 6b 65 6e 20 69 6e 20 65 6e 75 6d  , sToken in enum
19c0: 65 72 61 74 65 28 6c 54 6f 6b 65 6e 29 3a 0a 20  erate(lToken):. 
19d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 54             if sT
19e0: 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74 68 28  oken.startswith(
19f0: 22 28 22 29 20 61 6e 64 20 73 54 6f 6b 65 6e 2e  "(") and sToken.
1a00: 65 6e 64 73 77 69 74 68 28 22 29 22 29 3a 0a 20  endswith(")"):. 
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1a20: 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73 54 6f 6b 65  Token[i] = sToke
1a30: 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20  n[1:-1].        
1a40: 20 20 20 20 20 20 20 20 69 47 72 6f 75 70 20 2b          iGroup +
1a50: 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  = 1.            
1a60: 20 20 20 20 64 50 6f 73 5b 69 47 72 6f 75 70 5d      dPos[iGroup]
1a70: 20 3d 20 69 20 2b 20 31 20 20 20 20 23 20 77 65   = i + 1    # we
1a80: 20 61 64 64 20 31 2c 20 66 6f 72 20 77 65 20 63   add 1, for we c
1a90: 6f 75 6e 74 20 74 6f 6b 65 6e 73 20 66 72 6f 6d  ount tokens from
1aa0: 20 31 20 74 6f 20 6e 20 28 6e 6f 74 20 66 72 6f   1 to n (not fro
1ab0: 6d 20 30 29 0a 0a 20 20 20 20 20 20 20 20 23 20  m 0)..        # 
1ac0: 50 61 72 73 65 20 61 63 74 69 6f 6e 73 0a 20 20  Parse actions.  
1ad0: 20 20 20 20 20 20 66 6f 72 20 69 41 63 74 69 6f        for iActio
1ae0: 6e 2c 20 73 41 63 74 69 6f 6e 20 69 6e 20 65 6e  n, sAction in en
1af0: 75 6d 65 72 61 74 65 28 73 41 63 74 69 6f 6e 73  umerate(sActions
1b00: 2e 73 70 6c 69 74 28 22 20 3c 3c 2d 20 22 29 29  .split(" <<- "))
1b10: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  :.            sA
1b20: 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 2e  ction = sAction.
1b30: 73 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20  strip().        
1b40: 20 20 20 20 69 66 20 73 41 63 74 69 6f 6e 3a 0a      if sAction:.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 73 41 63 74 69 6f 6e 49 64 20 3d 20 73 52 75 6c  sActionId = sRul
1b70: 65 4e 61 6d 65 20 2b 20 22 5f 5f 62 22 20 2b 20  eName + "__b" + 
1b80: 73 74 72 28 69 41 63 74 69 6f 6e 42 6c 6f 63 6b  str(iActionBlock
1b90: 29 20 2b 20 22 5f 6c 22 20 2b 20 73 74 72 28 69  ) + "_l" + str(i
1ba0: 4c 69 6e 65 29 20 2b 20 22 5f 61 22 20 2b 20 73  Line) + "_a" + s
1bb0: 74 72 28 69 41 63 74 69 6f 6e 29 20 2b 20 22 5f  tr(iAction) + "_
1bc0: 22 20 2b 20 73 74 72 28 6c 65 6e 28 6c 54 6f 6b  " + str(len(lTok
1bd0: 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  en)).           
1be0: 20 20 20 20 20 61 41 63 74 69 6f 6e 20 3d 20 63       aAction = c
1bf0: 72 65 61 74 65 41 63 74 69 6f 6e 28 73 41 63 74  reateAction(sAct
1c00: 69 6f 6e 49 64 2c 20 73 41 63 74 69 6f 6e 2c 20  ionId, sAction, 
1c10: 6e 50 72 69 6f 72 69 74 79 2c 20 64 4f 70 74 50  nPriority, dOptP
1c20: 72 69 6f 72 69 74 79 2c 20 6c 65 6e 28 6c 54 6f  riority, len(lTo
1c30: 6b 65 6e 29 2c 20 64 50 6f 73 29 0a 20 20 20 20  ken), dPos).    
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 61              if a
1c50: 41 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  Action:.        
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 64 41 43 54              dACT
1c70: 49 4f 4e 53 5b 73 41 63 74 69 6f 6e 49 64 5d 20  IONS[sActionId] 
1c80: 3d 20 61 41 63 74 69 6f 6e 0a 20 20 20 20 20 20  = aAction.      
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 52                lR
1ca0: 65 73 75 6c 74 20 3d 20 6c 69 73 74 28 6c 54 6f  esult = list(lTo
1cb0: 6b 65 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  ken).           
1cc0: 20 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74           lResult
1cd0: 2e 65 78 74 65 6e 64 28 5b 22 23 23 22 2b 73 74  .extend(["##"+st
1ce0: 72 28 69 4c 69 6e 65 29 2c 20 73 41 63 74 69 6f  r(iLine), sActio
1cf0: 6e 49 64 5d 29 0a 20 20 20 20 20 20 20 20 20 20  nId]).          
1d00: 20 20 20 20 20 20 20 20 20 20 23 69 66 20 69 4c            #if iL
1d10: 69 6e 65 20 3d 3d 20 31 33 33 34 31 3a 0a 20 20  ine == 13341:.  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 23 20 20 20 20 70 72 69 6e 74 28 22 20 20    #    print("  
1d40: 22 2e 6a 6f 69 6e 28 6c 54 6f 6b 65 6e 29 29 0a  ".join(lToken)).
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 23 20 20 20 20 70 72 69 6e 74 28 73      #    print(s
1d70: 41 63 74 69 6f 6e 49 64 2c 20 61 41 63 74 69 6f  ActionId, aActio
1d80: 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
1d90: 20 20 20 20 20 20 20 79 69 65 6c 64 20 6c 52 65         yield lRe
1da0: 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1db0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1dd0: 72 69 6e 74 28 22 20 23 20 45 72 72 6f 72 20 6f  rint(" # Error o
1de0: 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65  n action at line
1df0: 3a 22 2c 20 69 4c 69 6e 65 29 0a 20 20 20 20 20  :", iLine).     
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e10: 72 69 6e 74 28 73 54 6f 6b 65 6e 4c 69 6e 65 2c  rint(sTokenLine,
1e20: 20 22 5c 6e 22 2c 20 73 41 63 74 69 6f 6e 73 29   "\n", sActions)
1e30: 0a 0a 0a 64 65 66 20 63 68 61 6e 67 65 52 65 66  ...def changeRef
1e40: 65 72 65 6e 63 65 54 6f 6b 65 6e 20 28 73 54 65  erenceToken (sTe
1e50: 78 74 2c 20 64 50 6f 73 29 3a 0a 20 20 20 20 22  xt, dPos):.    "
1e60: 63 68 61 6e 67 65 20 67 72 6f 75 70 20 72 65 66  change group ref
1e70: 65 72 65 6e 63 65 20 69 6e 20 3c 73 54 65 78 74  erence in <sText
1e80: 3e 20 77 69 74 68 20 76 61 6c 75 65 73 20 69 6e  > with values in
1e90: 20 3c 64 50 6f 73 3e 22 0a 20 20 20 20 66 6f 72   <dPos>".    for
1ea0: 20 69 20 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28   i in range(len(
1eb0: 64 50 6f 73 29 2c 20 30 2c 20 2d 31 29 3a 0a 20  dPos), 0, -1):. 
1ec0: 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73         sText = s
1ed0: 54 65 78 74 2e 72 65 70 6c 61 63 65 28 22 5c 5c  Text.replace("\\
1ee0: 22 2b 73 74 72 28 69 29 2c 20 22 5c 5c 22 2b 73  "+str(i), "\\"+s
1ef0: 74 72 28 64 50 6f 73 5b 69 5d 29 29 0a 20 20 20  tr(dPos[i])).   
1f00: 20 72 65 74 75 72 6e 20 73 54 65 78 74 0a 0a 0a   return sText...
1f10: 64 65 66 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75  def checkTokenNu
1f20: 6d 62 65 72 73 20 28 73 54 65 78 74 2c 20 73 41  mbers (sText, sA
1f30: 63 74 69 6f 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29  ctionId, nToken)
1f40: 3a 0a 20 20 20 20 22 63 68 65 63 6b 20 69 66 20  :.    "check if 
1f50: 74 6f 6b 65 6e 20 72 65 66 65 72 65 6e 63 65 73  token references
1f60: 20 69 6e 20 3c 73 54 65 78 74 3e 20 67 72 65 61   in <sText> grea
1f70: 74 65 72 20 74 68 61 6e 20 3c 6e 54 6f 6b 65 6e  ter than <nToken
1f80: 3e 20 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20  > (debugging)". 
1f90: 20 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e 66     for x in re.f
1fa0: 69 6e 64 69 74 65 72 28 72 22 5c 5c 28 5c 64 2b  inditer(r"\\(\d+
1fb0: 29 22 2c 20 73 54 65 78 74 29 3a 0a 20 20 20 20  )", sText):.    
1fc0: 20 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f      if int(x.gro
1fd0: 75 70 28 31 29 29 20 3e 20 6e 54 6f 6b 65 6e 3a  up(1)) > nToken:
1fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
1ff0: 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20 74  nt("# Error in t
2000: 6f 6b 65 6e 20 69 6e 64 65 78 20 61 74 20 6c 69  oken index at li
2010: 6e 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64  ne " + sActionId
2020: 20 2b 20 22 20 28 22 2b 73 74 72 28 6e 54 6f 6b   + " ("+str(nTok
2030: 65 6e 29 2b 22 20 74 6f 6b 65 6e 73 20 6f 6e 6c  en)+" tokens onl
2040: 79 29 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  y)").           
2050: 20 70 72 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a   print(sText)...
2060: 64 65 66 20 63 68 65 63 6b 49 66 54 68 65 72 65  def checkIfThere
2070: 49 73 43 6f 64 65 20 28 73 54 65 78 74 2c 20 73  IsCode (sText, s
2080: 41 63 74 69 6f 6e 49 64 29 3a 0a 20 20 20 20 22  ActionId):.    "
2090: 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20a0: 73 20 63 6f 64 65 20 69 6e 20 3c 73 54 65 78 74  s code in <sText
20b0: 3e 20 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20  > (debugging)". 
20c0: 20 20 20 69 66 20 72 65 2e 73 65 61 72 63 68 28     if re.search(
20d0: 22 5b 2e 5d 5c 5c 77 2b 5b 28 5d 7c 73 75 67 67  "[.]\\w+[(]|sugg
20e0: 5c 5c 77 2b 5b 28 5d 7c 5c 5c 28 5b 30 2d 39 5d  \\w+[(]|\\([0-9]
20f0: 7c 5c 5c 5b 5b 30 2d 39 5d 22 2c 20 73 54 65 78  |\\[[0-9]", sTex
2100: 74 29 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e  t):.        prin
2110: 74 28 22 23 20 57 61 72 6e 69 6e 67 20 61 74 20  t("# Warning at 
2120: 6c 69 6e 65 20 22 20 2b 20 73 41 63 74 69 6f 6e  line " + sAction
2130: 49 64 20 2b 20 22 3a 20 20 54 68 69 73 20 6d 65  Id + ":  This me
2140: 73 73 61 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ssage looks like
2150: 20 63 6f 64 65 2e 20 4c 69 6e 65 20 73 68 6f 75   code. Line shou
2160: 6c 64 20 70 72 6f 62 61 62 6c 79 20 62 65 67 69  ld probably begi
2170: 6e 20 77 69 74 68 20 3d 22 29 0a 20 20 20 20 20  n with =").     
2180: 20 20 20 70 72 69 6e 74 28 73 54 65 78 74 29 0a     print(sText).
2190: 0a 0a 64 65 66 20 63 72 65 61 74 65 41 63 74 69  ..def createActi
21a0: 6f 6e 20 28 73 41 63 74 69 6f 6e 49 64 2c 20 73  on (sActionId, s
21b0: 41 63 74 69 6f 6e 2c 20 6e 50 72 69 6f 72 69 74  Action, nPriorit
21c0: 79 2c 20 64 4f 70 74 50 72 69 6f 72 69 74 79 2c  y, dOptPriority,
21d0: 20 6e 54 6f 6b 65 6e 2c 20 64 50 6f 73 29 3a 0a   nToken, dPos):.
21e0: 20 20 20 20 22 63 72 65 61 74 65 20 61 63 74 69      "create acti
21f0: 6f 6e 20 72 75 6c 65 20 61 73 20 61 20 6c 69 73  on rule as a lis
2200: 74 22 0a 20 20 20 20 23 20 4f 70 74 69 6f 6e 0a  t".    # Option.
2210: 20 20 20 20 73 4f 70 74 69 6f 6e 20 3d 20 46 61      sOption = Fa
2220: 6c 73 65 0a 20 20 20 20 6d 20 3d 20 72 65 2e 6d  lse.    m = re.m
2230: 61 74 63 68 28 22 2f 28 5c 5c 77 2b 29 2f 22 2c  atch("/(\\w+)/",
2240: 20 73 41 63 74 69 6f 6e 29 0a 20 20 20 20 69 66   sAction).    if
2250: 20 6d 3a 0a 20 20 20 20 20 20 20 20 73 4f 70 74   m:.        sOpt
2260: 69 6f 6e 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29  ion = m.group(1)
2270: 0a 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e  .        sAction
2280: 20 3d 20 73 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64   = sAction[m.end
2290: 28 29 3a 5d 2e 73 74 72 69 70 28 29 0a 20 20 20  ():].strip().   
22a0: 20 69 66 20 6e 50 72 69 6f 72 69 74 79 20 3d 3d   if nPriority ==
22b0: 20 2d 31 3a 0a 20 20 20 20 20 20 20 20 6e 50 72   -1:.        nPr
22c0: 69 6f 72 69 74 79 20 3d 20 64 4f 70 74 50 72 69  iority = dOptPri
22d0: 6f 72 69 74 79 2e 67 65 74 28 73 4f 70 74 69 6f  ority.get(sOptio
22e0: 6e 2c 20 34 29 0a 0a 20 20 20 20 23 20 76 61 6c  n, 4)..    # val
22f0: 69 64 20 61 63 74 69 6f 6e 3f 0a 20 20 20 20 6d  id action?.    m
2300: 20 3d 20 72 65 2e 73 65 61 72 63 68 28 72 22 28   = re.search(r"(
2310: 3f 50 3c 61 63 74 69 6f 6e 3e 5b 2d 7e 3d 2f 25  ?P<action>[-~=/%
2320: 3e 5d 29 28 3f 50 3c 73 74 61 72 74 3e 2d 3f 5c  >])(?P<start>-?\
2330: 64 2b 5c 2e 3f 7c 29 28 3f 50 3c 65 6e 64 3e 3a  d+\.?|)(?P<end>:
2340: 5c 2e 3f 2d 3f 5c 64 2b 7c 29 28 3f 50 3c 63 61  \.?-?\d+|)(?P<ca
2350: 73 69 6e 67 3e 3a 7c 29 3e 3e 22 2c 20 73 41 63  sing>:|)>>", sAc
2360: 74 69 6f 6e 29 0a 20 20 20 20 69 66 20 6e 6f 74  tion).    if not
2370: 20 6d 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e   m:.        prin
2380: 74 28 22 20 23 20 45 72 72 6f 72 2e 20 4e 6f 20  t(" # Error. No 
2390: 61 63 74 69 6f 6e 20 66 6f 75 6e 64 20 61 74 3a  action found at:
23a0: 20 22 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20   ", sActionId). 
23b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f         return No
23c0: 6e 65 0a 0a 20 20 20 20 23 20 43 6f 6e 64 69 74  ne..    # Condit
23d0: 69 6f 6e 0a 20 20 20 20 73 43 6f 6e 64 69 74 69  ion.    sConditi
23e0: 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 3a 6d 2e  on = sAction[:m.
23f0: 73 74 61 72 74 28 29 5d 2e 73 74 72 69 70 28 29  start()].strip()
2400: 0a 20 20 20 20 69 66 20 73 43 6f 6e 64 69 74 69  .    if sConditi
2410: 6f 6e 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e  on:.        sCon
2420: 64 69 74 69 6f 6e 20 3d 20 63 68 61 6e 67 65 52  dition = changeR
2430: 65 66 65 72 65 6e 63 65 54 6f 6b 65 6e 28 73 43  eferenceToken(sC
2440: 6f 6e 64 69 74 69 6f 6e 2c 20 64 50 6f 73 29 0a  ondition, dPos).
2450: 20 20 20 20 20 20 20 20 73 43 6f 6e 64 69 74 69          sConditi
2460: 6f 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74  on = createFunct
2470: 69 6f 6e 28 22 63 6f 6e 64 22 2c 20 73 41 63 74  ion("cond", sAct
2480: 69 6f 6e 49 64 2c 20 73 43 6f 6e 64 69 74 69 6f  ionId, sConditio
2490: 6e 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20  n).    else:.   
24a0: 20 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20       sCondition 
24b0: 3d 20 22 22 0a 0a 20 20 20 20 23 20 43 61 73 65  = ""..    # Case
24c0: 20 73 65 6e 73 69 74 69 76 69 74 79 0a 20 20 20   sensitivity.   
24d0: 20 62 43 61 73 65 53 65 6e 73 69 74 69 76 69 74   bCaseSensitivit
24e0: 79 20 3d 20 46 61 6c 73 65 20 69 66 20 6d 2e 67  y = False if m.g
24f0: 72 6f 75 70 28 22 63 61 73 69 6e 67 22 29 20 3d  roup("casing") =
2500: 3d 20 22 3a 22 20 65 6c 73 65 20 54 72 75 65 0a  = ":" else True.
2510: 0a 20 20 20 20 23 20 41 63 74 69 6f 6e 0a 20 20  .    # Action.  
2520: 20 20 63 41 63 74 69 6f 6e 20 3d 20 6d 2e 67 72    cAction = m.gr
2530: 6f 75 70 28 22 61 63 74 69 6f 6e 22 29 0a 20 20  oup("action").  
2540: 20 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74    sAction = sAct
2550: 69 6f 6e 5b 6d 2e 65 6e 64 28 29 3a 5d 2e 73 74  ion[m.end():].st
2560: 72 69 70 28 29 0a 20 20 20 20 73 41 63 74 69 6f  rip().    sActio
2570: 6e 20 3d 20 63 68 61 6e 67 65 52 65 66 65 72 65  n = changeRefere
2580: 6e 63 65 54 6f 6b 65 6e 28 73 41 63 74 69 6f 6e  nceToken(sAction
2590: 2c 20 64 50 6f 73 29 0a 20 20 20 20 23 20 74 61  , dPos).    # ta
25a0: 72 67 65 74 0a 20 20 20 20 63 53 74 61 72 74 4c  rget.    cStartL
25b0: 69 6d 69 74 20 3d 20 22 3c 22 0a 20 20 20 20 63  imit = "<".    c
25c0: 45 6e 64 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20  EndLimit = ">". 
25d0: 20 20 20 69 66 20 6e 6f 74 20 6d 2e 67 72 6f 75     if not m.grou
25e0: 70 28 22 73 74 61 72 74 22 29 3a 0a 20 20 20 20  p("start"):.    
25f0: 20 20 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e      iStartAction
2600: 20 3d 20 31 0a 20 20 20 20 20 20 20 20 69 45 6e   = 1.        iEn
2610: 64 41 63 74 69 6f 6e 20 3d 20 30 0a 20 20 20 20  dAction = 0.    
2620: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 69 66  else:.        if
2630: 20 63 41 63 74 69 6f 6e 20 21 3d 20 22 2d 22 20   cAction != "-" 
2640: 61 6e 64 20 28 6d 2e 67 72 6f 75 70 28 22 73 74  and (m.group("st
2650: 61 72 74 22 29 2e 65 6e 64 73 77 69 74 68 28 22  art").endswith("
2660: 2e 22 29 20 6f 72 20 6d 2e 67 72 6f 75 70 28 22  .") or m.group("
2670: 65 6e 64 22 29 2e 73 74 61 72 74 73 77 69 74 68  end").startswith
2680: 28 22 3a 2e 22 29 29 3a 0a 20 20 20 20 20 20 20  (":.")):.       
2690: 20 20 20 20 20 70 72 69 6e 74 28 22 20 23 20 45       print(" # E
26a0: 72 72 6f 72 2e 20 57 72 6f 6e 67 20 73 65 6c 65  rror. Wrong sele
26b0: 63 74 69 6f 6e 20 6f 6e 20 74 6f 6b 65 6e 73 2e  ction on tokens.
26c0: 22 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20  ", sActionId).  
26d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26e0: 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 69 66   None.        if
26f0: 20 6d 2e 67 72 6f 75 70 28 22 73 74 61 72 74 22   m.group("start"
2700: 29 2e 65 6e 64 73 77 69 74 68 28 22 2e 22 29 3a  ).endswith("."):
2710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 53 74  .            cSt
2720: 61 72 74 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20  artLimit = ">". 
2730: 20 20 20 20 20 20 20 69 53 74 61 72 74 41 63 74         iStartAct
2740: 69 6f 6e 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75  ion = int(m.grou
2750: 70 28 22 73 74 61 72 74 22 29 2e 72 73 74 72 69  p("start").rstri
2760: 70 28 22 2e 22 29 29 0a 20 20 20 20 20 20 20 20  p(".")).        
2770: 69 66 20 6e 6f 74 20 6d 2e 67 72 6f 75 70 28 22  if not m.group("
2780: 65 6e 64 22 29 3a 0a 20 20 20 20 20 20 20 20 20  end"):.         
2790: 20 20 20 69 45 6e 64 41 63 74 69 6f 6e 20 3d 20     iEndAction = 
27a0: 69 53 74 61 72 74 41 63 74 69 6f 6e 0a 20 20 20  iStartAction.   
27b0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
27c0: 20 20 20 20 20 20 20 69 66 20 6d 2e 67 72 6f 75         if m.grou
27d0: 70 28 22 65 6e 64 22 29 2e 73 74 61 72 74 73 77  p("end").startsw
27e0: 69 74 68 28 22 3a 2e 22 29 3a 0a 20 20 20 20 20  ith(":."):.     
27f0: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 4c             cEndL
2800: 69 6d 69 74 20 3d 20 22 3c 22 0a 20 20 20 20 20  imit = "<".     
2810: 20 20 20 20 20 20 20 69 45 6e 64 41 63 74 69 6f         iEndActio
2820: 6e 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28  n = int(m.group(
2830: 22 65 6e 64 22 29 2e 6c 73 74 72 69 70 28 22 3a  "end").lstrip(":
2840: 2e 22 29 29 0a 20 20 20 20 69 66 20 64 50 6f 73  .")).    if dPos
2850: 20 61 6e 64 20 6d 2e 67 72 6f 75 70 28 22 73 74   and m.group("st
2860: 61 72 74 22 29 3a 0a 20 20 20 20 20 20 20 20 74  art"):.        t
2870: 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry:.            
2880: 69 53 74 61 72 74 41 63 74 69 6f 6e 20 3d 20 64  iStartAction = d
2890: 50 6f 73 2e 67 65 74 28 69 53 74 61 72 74 41 63  Pos.get(iStartAc
28a0: 74 69 6f 6e 2c 20 69 53 74 61 72 74 41 63 74 69  tion, iStartActi
28b0: 6f 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  on).            
28c0: 69 66 20 69 45 6e 64 41 63 74 69 6f 6e 3a 0a 20  if iEndAction:. 
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
28e0: 45 6e 64 41 63 74 69 6f 6e 20 3d 20 64 50 6f 73  EndAction = dPos
28f0: 2e 67 65 74 28 69 45 6e 64 41 63 74 69 6f 6e 2c  .get(iEndAction,
2900: 20 69 45 6e 64 41 63 74 69 6f 6e 29 0a 20 20 20   iEndAction).   
2910: 20 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20       except:.   
2920: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
2930: 23 20 45 72 72 6f 72 2e 20 57 72 6f 6e 67 20 67  # Error. Wrong g
2940: 72 6f 75 70 73 20 69 6e 3a 20 22 20 2b 20 73 41  roups in: " + sA
2950: 63 74 69 6f 6e 49 64 29 0a 20 20 20 20 20 20 20  ctionId).       
2960: 20 20 20 20 20 70 72 69 6e 74 28 22 20 20 69 53       print("  iS
2970: 74 61 72 74 41 63 74 69 6f 6e 3a 22 2c 20 69 53  tartAction:", iS
2980: 74 61 72 74 41 63 74 69 6f 6e 2c 20 22 69 45 6e  tartAction, "iEn
2990: 64 41 63 74 69 6f 6e 3a 22 2c 20 69 45 6e 64 41  dAction:", iEndA
29a0: 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 20  ction).         
29b0: 20 20 20 70 72 69 6e 74 28 22 20 22 2c 20 64 50     print(" ", dP
29c0: 6f 73 29 0a 20 20 20 20 69 66 20 69 53 74 61 72  os).    if iStar
29d0: 74 41 63 74 69 6f 6e 20 3c 20 30 3a 0a 20 20 20  tAction < 0:.   
29e0: 20 20 20 20 20 69 53 74 61 72 74 41 63 74 69 6f       iStartActio
29f0: 6e 20 2b 3d 20 31 0a 20 20 20 20 69 66 20 69 45  n += 1.    if iE
2a00: 6e 64 41 63 74 69 6f 6e 20 3c 20 30 3a 0a 20 20  ndAction < 0:.  
2a10: 20 20 20 20 20 20 69 45 6e 64 41 63 74 69 6f 6e        iEndAction
2a20: 20 2b 3d 20 31 0a 0a 20 20 20 20 69 66 20 63 41   += 1..    if cA
2a30: 63 74 69 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20  ction == "-":.  
2a40: 20 20 20 20 20 20 23 23 20 65 72 72 6f 72 0a 20        ## error. 
2a50: 20 20 20 20 20 20 20 69 4d 73 67 20 3d 20 73 41         iMsg = sA
2a60: 63 74 69 6f 6e 2e 66 69 6e 64 28 22 20 23 20 22  ction.find(" # "
2a70: 29 0a 20 20 20 20 20 20 20 20 69 66 20 69 4d 73  ).        if iMs
2a80: 67 20 3d 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20  g == -1:.       
2a90: 20 20 20 20 20 73 4d 73 67 20 3d 20 22 23 20 45       sMsg = "# E
2aa0: 72 72 6f 72 2e 20 45 72 72 6f 72 20 6d 65 73 73  rror. Error mess
2ab0: 61 67 65 20 6e 6f 74 20 66 6f 75 6e 64 2e 22 0a  age not found.".
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 73 55 52 4c              sURL
2ad0: 20 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20 20   = "".          
2ae0: 20 20 70 72 69 6e 74 28 73 4d 73 67 20 2b 20 22    print(sMsg + "
2af0: 20 41 63 74 69 6f 6e 20 69 64 3a 20 22 20 2b 20   Action id: " + 
2b00: 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20 20 20  sActionId).     
2b10: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
2b20: 20 20 20 20 20 73 4d 73 67 20 3d 20 73 41 63 74       sMsg = sAct
2b30: 69 6f 6e 5b 69 4d 73 67 2b 33 3a 5d 2e 73 74 72  ion[iMsg+3:].str
2b40: 69 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  ip().           
2b50: 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69   sAction = sActi
2b60: 6f 6e 5b 3a 69 4d 73 67 5d 2e 73 74 72 69 70 28  on[:iMsg].strip(
2b70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 55  ).            sU
2b80: 52 4c 20 3d 20 22 22 0a 20 20 20 20 20 20 20 20  RL = "".        
2b90: 20 20 20 20 6d 55 52 4c 20 3d 20 72 65 2e 73 65      mURL = re.se
2ba0: 61 72 63 68 28 22 5b 7c 5d 20 2a 28 68 74 74 70  arch("[|] *(http
2bb0: 73 3f 3a 2f 2f 2e 2a 29 22 2c 20 73 4d 73 67 29  s?://.*)", sMsg)
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2bd0: 6d 55 52 4c 3a 0a 20 20 20 20 20 20 20 20 20 20  mURL:.          
2be0: 20 20 20 20 20 20 73 55 52 4c 20 3d 20 6d 55 52        sURL = mUR
2bf0: 4c 2e 67 72 6f 75 70 28 31 29 2e 73 74 72 69 70  L.group(1).strip
2c00: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
2c10: 20 20 20 73 4d 73 67 20 3d 20 73 4d 73 67 5b 3a     sMsg = sMsg[:
2c20: 6d 55 52 4c 2e 73 74 61 72 74 28 30 29 5d 2e 73  mURL.start(0)].s
2c30: 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 20  trip().         
2c40: 20 20 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d     checkTokenNum
2c50: 62 65 72 73 28 73 4d 73 67 2c 20 73 41 63 74 69  bers(sMsg, sActi
2c60: 6f 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29 0a 20 20  onId, nToken).  
2c70: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 4d 73            if sMs
2c80: 67 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20  g[0:1] == "=":. 
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ca0: 4d 73 67 20 3d 20 63 72 65 61 74 65 46 75 6e 63  Msg = createFunc
2cb0: 74 69 6f 6e 28 22 6d 73 67 22 2c 20 73 41 63 74  tion("msg", sAct
2cc0: 69 6f 6e 49 64 2c 20 73 4d 73 67 2c 20 54 72 75  ionId, sMsg, Tru
2cd0: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  e).            e
2ce0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
2cf0: 20 20 20 20 20 63 68 65 63 6b 49 66 54 68 65 72       checkIfTher
2d00: 65 49 73 43 6f 64 65 28 73 4d 73 67 2c 20 73 41  eIsCode(sMsg, sA
2d10: 63 74 69 6f 6e 49 64 29 0a 0a 20 20 20 20 23 20  ctionId)..    # 
2d20: 63 68 65 63 6b 69 6e 67 20 63 6f 6e 73 69 73 74  checking consist
2d30: 61 6e 63 79 0a 20 20 20 20 63 68 65 63 6b 54 6f  ancy.    checkTo
2d40: 6b 65 6e 4e 75 6d 62 65 72 73 28 73 41 63 74 69  kenNumbers(sActi
2d50: 6f 6e 2c 20 73 41 63 74 69 6f 6e 49 64 2c 20 6e  on, sActionId, n
2d60: 54 6f 6b 65 6e 29 0a 0a 20 20 20 20 69 66 20 63  Token)..    if c
2d70: 41 63 74 69 6f 6e 20 3d 3d 20 22 3e 22 3a 0a 20  Action == ">":. 
2d80: 20 20 20 20 20 20 20 23 23 20 6e 6f 20 61 63 74         ## no act
2d90: 69 6f 6e 2c 20 62 72 65 61 6b 20 6c 6f 6f 70 20  ion, break loop 
2da0: 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  if condition is 
2db0: 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 72 65  False.        re
2dc0: 74 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73  turn [sOption, s
2dd0: 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74 69  Condition, cActi
2de0: 6f 6e 2c 20 22 22 5d 0a 0a 20 20 20 20 69 66 20  on, ""]..    if 
2df0: 6e 6f 74 20 73 41 63 74 69 6f 6e 20 61 6e 64 20  not sAction and 
2e00: 63 41 63 74 69 6f 6e 20 21 3d 20 22 25 22 3a 0a  cAction != "%":.
2e10: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23          print("#
2e20: 20 45 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e   Error in action
2e30: 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 41 63   at line " + sAc
2e40: 74 69 6f 6e 49 64 20 2b 20 22 3a 20 20 54 68 69  tionId + ":  Thi
2e50: 73 20 61 63 74 69 6f 6e 20 69 73 20 65 6d 70 74  s action is empt
2e60: 79 2e 22 29 0a 0a 20 20 20 20 69 66 20 73 41 63  y.")..    if sAc
2e70: 74 69 6f 6e 5b 30 3a 31 5d 20 21 3d 20 22 3d 22  tion[0:1] != "="
2e80: 20 61 6e 64 20 63 41 63 74 69 6f 6e 20 21 3d 20   and cAction != 
2e90: 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 63 68 65  "=":.        che
2ea0: 63 6b 49 66 54 68 65 72 65 49 73 43 6f 64 65 28  ckIfThereIsCode(
2eb0: 73 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e  sAction, sAction
2ec0: 49 64 29 0a 0a 20 20 20 20 69 66 20 63 41 63 74  Id)..    if cAct
2ed0: 69 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20  ion == "-":.    
2ee0: 20 20 20 20 23 23 20 65 72 72 6f 72 20 64 65 74      ## error det
2ef0: 65 63 74 65 64 20 2d 2d 3e 20 73 75 67 67 65 73  ected --> sugges
2f00: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20  tion.        if 
2f10: 73 41 63 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20  sAction[0:1] == 
2f20: 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "=":.           
2f30: 20 73 41 63 74 69 6f 6e 20 3d 20 63 72 65 61 74   sAction = creat
2f40: 65 46 75 6e 63 74 69 6f 6e 28 22 73 75 67 67 22  eFunction("sugg"
2f50: 2c 20 73 41 63 74 69 6f 6e 49 64 2c 20 73 41 63  , sActionId, sAc
2f60: 74 69 6f 6e 2c 20 54 72 75 65 29 0a 20 20 20 20  tion, True).    
2f70: 20 20 20 20 65 6c 69 66 20 73 41 63 74 69 6f 6e      elif sAction
2f80: 2e 73 74 61 72 74 73 77 69 74 68 28 27 22 27 29  .startswith('"')
2f90: 20 61 6e 64 20 73 41 63 74 69 6f 6e 2e 65 6e 64   and sAction.end
2fa0: 73 77 69 74 68 28 27 22 27 29 3a 0a 20 20 20 20  swith('"'):.    
2fb0: 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20          sAction 
2fc0: 3d 20 73 41 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a  = sAction[1:-1].
2fd0: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73          if not s
2fe0: 4d 73 67 3a 0a 20 20 20 20 20 20 20 20 20 20 20  Msg:.           
2ff0: 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20   print("# Error 
3000: 69 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e  in action at lin
3010: 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20  e " + sActionId 
3020: 2b 20 22 3a 20 20 54 68 65 20 6d 65 73 73 61 67  + ":  The messag
3030: 65 20 69 73 20 65 6d 70 74 79 2e 22 29 0a 20 20  e is empty.").  
3040: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f        return [sO
3050: 70 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f  ption, sConditio
3060: 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74  n, cAction, sAct
3070: 69 6f 6e 2c 20 69 53 74 61 72 74 41 63 74 69 6f  ion, iStartActio
3080: 6e 2c 20 69 45 6e 64 41 63 74 69 6f 6e 2c 20 63  n, iEndAction, c
3090: 53 74 61 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64  StartLimit, cEnd
30a0: 4c 69 6d 69 74 2c 20 62 43 61 73 65 53 65 6e 73  Limit, bCaseSens
30b0: 69 74 69 76 69 74 79 2c 20 6e 50 72 69 6f 72 69  itivity, nPriori
30c0: 74 79 2c 20 73 4d 73 67 2c 20 73 55 52 4c 5d 0a  ty, sMsg, sURL].
30d0: 20 20 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e      elif cAction
30e0: 20 3d 3d 20 22 7e 22 3a 0a 20 20 20 20 20 20 20   == "~":.       
30f0: 20 23 23 20 74 65 78 74 20 70 72 6f 63 65 73 73   ## text process
3100: 6f 72 0a 20 20 20 20 20 20 20 20 69 66 20 73 41  or.        if sA
3110: 63 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d  ction[0:1] == "=
3120: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ":.            s
3130: 41 63 74 69 6f 6e 20 3d 20 63 72 65 61 74 65 46  Action = createF
3140: 75 6e 63 74 69 6f 6e 28 22 74 70 22 2c 20 73 41  unction("tp", sA
3150: 63 74 69 6f 6e 49 64 2c 20 73 41 63 74 69 6f 6e  ctionId, sAction
3160: 2c 20 54 72 75 65 29 0a 20 20 20 20 20 20 20 20  , True).        
3170: 65 6c 69 66 20 73 41 63 74 69 6f 6e 2e 73 74 61  elif sAction.sta
3180: 72 74 73 77 69 74 68 28 27 22 27 29 20 61 6e 64  rtswith('"') and
3190: 20 73 41 63 74 69 6f 6e 2e 65 6e 64 73 77 69 74   sAction.endswit
31a0: 68 28 27 22 27 29 3a 0a 20 20 20 20 20 20 20 20  h('"'):.        
31b0: 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73 41      sAction = sA
31c0: 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20  ction[1:-1].    
31d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74      return [sOpt
31e0: 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c  ion, sCondition,
31f0: 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f   cAction, sActio
3200: 6e 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e 2c  n, iStartAction,
3210: 20 69 45 6e 64 41 63 74 69 6f 6e 2c 20 62 43 61   iEndAction, bCa
3220: 73 65 53 65 6e 73 69 74 69 76 69 74 79 5d 0a 20  seSensitivity]. 
3230: 20 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20     elif cAction 
3240: 3d 3d 20 22 25 22 20 6f 72 20 63 41 63 74 69 6f  == "%" or cActio
3250: 6e 20 3d 3d 20 22 2f 22 3a 0a 20 20 20 20 20 20  n == "/":.      
3260: 20 20 23 23 20 74 61 67 73 0a 20 20 20 20 20 20    ## tags.      
3270: 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69 6f    return [sOptio
3280: 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63  n, sCondition, c
3290: 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c  Action, sAction,
32a0: 20 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20 69   iStartAction, i
32b0: 45 6e 64 41 63 74 69 6f 6e 5d 0a 20 20 20 20 65  EndAction].    e
32c0: 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22  lif cAction == "
32d0: 3d 22 3a 0a 20 20 20 20 20 20 20 20 23 23 20 64  =":.        ## d
32e0: 69 73 61 6d 62 69 67 75 61 74 6f 72 0a 20 20 20  isambiguator.   
32f0: 20 20 20 20 20 69 66 20 22 64 65 66 69 6e 65 28       if "define(
3300: 22 20 69 6e 20 73 41 63 74 69 6f 6e 20 61 6e 64  " in sAction and
3310: 20 6e 6f 74 20 72 65 2e 73 65 61 72 63 68 28 72   not re.search(r
3320: 22 64 65 66 69 6e 65 5c 28 5c 5c 5c 64 2b 20 2a  "define\(\\\d+ *
3330: 2c 20 2a 5c 5b 2e 2a 5c 5d 20 2a 5c 29 22 2c 20  , *\[.*\] *\)", 
3340: 73 41 63 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20  sAction):.      
3350: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
3360: 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61  rror in action a
3370: 74 20 6c 69 6e 65 20 22 20 2b 20 73 41 63 74 69  t line " + sActi
3380: 6f 6e 49 64 20 2b 20 22 3a 20 73 65 63 6f 6e 64  onId + ": second
3390: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 3c 64   argument for <d
33a0: 65 66 69 6e 65 3e 20 6d 75 73 74 20 62 65 20 61  efine> must be a
33b0: 20 6c 69 73 74 20 6f 66 20 73 74 72 69 6e 67 73   list of strings
33c0: 22 29 0a 20 20 20 20 20 20 20 20 73 41 63 74 69  ").        sActi
33d0: 6f 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74  on = createFunct
33e0: 69 6f 6e 28 22 64 61 22 2c 20 73 41 63 74 69 6f  ion("da", sActio
33f0: 6e 49 64 2c 20 73 41 63 74 69 6f 6e 29 0a 20 20  nId, sAction).  
3400: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f        return [sO
3410: 70 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f  ption, sConditio
3420: 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74  n, cAction, sAct
3430: 69 6f 6e 5d 0a 20 20 20 20 65 6c 73 65 3a 0a 20  ion].    else:. 
3440: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 20 23         print(" #
3450: 20 55 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 2e   Unknown action.
3460: 22 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20  ", sActionId).  
3470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e        return Non
3480: 65 0a 0a 0a 64 65 66 20 6d 61 6b 65 20 28 6c 52  e...def make (lR
3490: 75 6c 65 2c 20 64 44 65 66 2c 20 73 4c 61 6e 67  ule, dDef, sLang
34a0: 2c 20 64 4f 70 74 50 72 69 6f 72 69 74 79 2c 20  , dOptPriority, 
34b0: 62 4a 61 76 61 53 63 72 69 70 74 29 3a 0a 20 20  bJavaScript):.  
34c0: 20 20 22 63 6f 6d 70 69 6c 65 20 72 75 6c 65 73    "compile rules
34d0: 2c 20 72 65 74 75 72 6e 73 20 61 20 64 69 63 74  , returns a dict
34e0: 69 6f 6e 61 72 79 20 6f 66 20 76 61 6c 75 65 73  ionary of values
34f0: 22 0a 20 20 20 20 23 20 66 6f 72 20 63 6c 61 72  ".    # for clar
3500: 69 74 79 20 70 75 72 70 6f 73 65 2c 20 64 6f 6e  ity purpose, don
3510: e2 80 99 74 20 63 72 65 61 74 65 20 61 6e 79 20  ...t create any 
3520: 66 69 6c 65 20 68 65 72 65 0a 0a 20 20 20 20 23  file here..    #
3530: 20 72 65 6d 6f 76 69 6e 67 20 63 6f 6d 6d 65 6e   removing commen
3540: 74 73 2c 20 7a 65 72 6f 69 6e 67 20 65 6d 70 74  ts, zeroing empt
3550: 79 20 6c 69 6e 65 73 2c 20 63 72 65 61 74 69 6e  y lines, creatin
3560: 67 20 64 65 66 69 6e 69 74 69 6f 6e 73 2c 20 73  g definitions, s
3570: 74 6f 72 69 6e 67 20 74 65 73 74 73 2c 20 6d 65  toring tests, me
3580: 72 67 69 6e 67 20 72 75 6c 65 20 6c 69 6e 65 73  rging rule lines
3590: 0a 20 20 20 20 70 72 69 6e 74 28 22 20 20 70 61  .    print("  pa
35a0: 72 73 69 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29  rsing rules...")
35b0: 0a 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 20  .    lTokenLine 
35c0: 3d 20 5b 5d 0a 20 20 20 20 73 41 63 74 69 6f 6e  = [].    sAction
35d0: 73 20 3d 20 22 22 0a 20 20 20 20 6e 50 72 69 6f  s = "".    nPrio
35e0: 72 69 74 79 20 3d 20 2d 31 0a 20 20 20 20 64 41  rity = -1.    dA
35f0: 6c 6c 47 72 61 70 68 20 3d 20 7b 7d 0a 20 20 20  llGraph = {}.   
3600: 20 73 47 72 61 70 68 4e 61 6d 65 20 3d 20 22 22   sGraphName = ""
3610: 0a 20 20 20 20 69 41 63 74 69 6f 6e 42 6c 6f 63  .    iActionBloc
3620: 6b 20 3d 20 30 0a 20 20 20 20 61 52 75 6c 65 4e  k = 0.    aRuleN
3630: 61 6d 65 20 3d 20 73 65 74 28 29 0a 0a 20 20 20  ame = set()..   
3640: 20 66 6f 72 20 69 2c 20 73 4c 69 6e 65 20 69 6e   for i, sLine in
3650: 20 6c 52 75 6c 65 3a 0a 20 20 20 20 20 20 20 20   lRule:.        
3660: 73 4c 69 6e 65 20 3d 20 73 4c 69 6e 65 2e 72 73  sLine = sLine.rs
3670: 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 69  trip().        i
3680: 66 20 22 5c 74 22 20 69 6e 20 73 4c 69 6e 65 3a  f "\t" in sLine:
3690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 74  .            # t
36a0: 61 62 75 6c 61 74 69 6f 6e 20 6e 6f 74 20 61 6c  abulation not al
36b0: 6c 6f 77 65 64 0a 20 20 20 20 20 20 20 20 20 20  lowed.          
36c0: 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72 2e 20    print("Error. 
36d0: 54 61 62 75 6c 61 74 69 6f 6e 20 61 74 20 6c 69  Tabulation at li
36e0: 6e 65 3a 20 22 2c 20 69 29 0a 20 20 20 20 20 20  ne: ", i).      
36f0: 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20 20        exit().   
3700: 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e       elif sLine.
3710: 73 74 61 72 74 73 77 69 74 68 28 22 40 40 40 40  startswith("@@@@
3720: 47 52 41 50 48 3a 20 22 29 3a 0a 20 20 20 20 20  GRAPH: "):.     
3730: 20 20 20 20 20 20 20 23 20 72 75 6c 65 73 20 67         # rules g
3740: 72 61 70 68 20 63 61 6c 6c 0a 20 20 20 20 20 20  raph call.      
3750: 20 20 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74        m = re.mat
3760: 63 68 28 72 22 40 40 40 40 47 52 41 50 48 3a 20  ch(r"@@@@GRAPH: 
3770: 2a 28 5c 77 2b 29 22 2c 20 73 4c 69 6e 65 2e 73  *(\w+)", sLine.s
3780: 74 72 69 70 28 29 29 0a 20 20 20 20 20 20 20 20  trip()).        
3790: 20 20 20 20 69 66 20 6d 3a 0a 20 20 20 20 20 20      if m:.      
37a0: 20 20 20 20 20 20 20 20 20 20 73 47 72 61 70 68            sGraph
37b0: 4e 61 6d 65 20 3d 20 6d 2e 67 72 6f 75 70 28 31  Name = m.group(1
37c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
37d0: 20 20 69 66 20 73 47 72 61 70 68 4e 61 6d 65 20    if sGraphName 
37e0: 69 6e 20 64 41 6c 6c 47 72 61 70 68 3a 0a 20 20  in dAllGraph:.  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72 20 61    print("Error a
3810: 74 20 6c 69 6e 65 20 22 20 2b 20 69 20 2b 20 22  t line " + i + "
3820: 2e 20 47 72 61 70 68 20 6e 61 6d 65 20 3c 22 20  . Graph name <" 
3830: 2b 20 73 47 72 61 70 68 4e 61 6d 65 20 2b 20 22  + sGraphName + "
3840: 3e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  > already exists
3850: 2e 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  .").            
3860: 20 20 20 20 20 20 20 20 65 78 69 74 28 29 0a 20          exit(). 
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
3880: 41 6c 6c 47 72 61 70 68 5b 73 47 72 61 70 68 4e  AllGraph[sGraphN
3890: 61 6d 65 5d 20 3d 20 5b 5d 0a 20 20 20 20 20 20  ame] = [].      
38a0: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
38c0: 74 28 22 45 72 72 6f 72 2e 20 47 72 61 70 68 20  t("Error. Graph 
38d0: 6e 61 6d 65 20 6e 6f 74 20 66 6f 75 6e 64 20 61  name not found a
38e0: 74 20 6c 69 6e 65 22 2c 20 69 29 0a 20 20 20 20  t line", i).    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74              exit
3900: 28 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  ().        elif 
3910: 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68  sLine.startswith
3920: 28 22 5f 5f 22 29 20 61 6e 64 20 73 4c 69 6e 65  ("__") and sLine
3930: 2e 65 6e 64 73 77 69 74 68 28 22 5f 5f 22 29 3a  .endswith("__"):
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6e  .            # n
3950: 65 77 20 72 75 6c 65 20 67 72 6f 75 70 0a 20 20  ew rule group.  
3960: 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20 72 65            m = re
3970: 2e 6d 61 74 63 68 28 22 5f 5f 28 5c 5c 77 2b 29  .match("__(\\w+)
3980: 28 21 5c 5c 64 7c 29 5f 5f 22 2c 20 73 4c 69 6e  (!\\d|)__", sLin
3990: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e).            i
39a0: 66 20 6d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  f m:.           
39b0: 20 20 20 20 20 73 52 75 6c 65 4e 61 6d 65 20 3d       sRuleName =
39c0: 20 6d 2e 67 72 6f 75 70 28 31 29 0a 20 20 20 20   m.group(1).    
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
39e0: 52 75 6c 65 4e 61 6d 65 20 69 6e 20 61 52 75 6c  RuleName in aRul
39f0: 65 4e 61 6d 65 3a 0a 20 20 20 20 20 20 20 20 20  eName:.         
3a00: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
3a10: 28 22 45 72 72 6f 72 20 61 74 20 6c 69 6e 65 20  ("Error at line 
3a20: 22 20 2b 20 69 20 2b 20 22 2e 20 52 75 6c 65 20  " + i + ". Rule 
3a30: 6e 61 6d 65 20 3c 22 20 2b 20 73 52 75 6c 65 4e  name <" + sRuleN
3a40: 61 6d 65 20 2b 20 22 3e 20 61 6c 72 65 61 64 79  ame + "> already
3a50: 20 65 78 69 73 74 73 2e 22 29 0a 20 20 20 20 20   exists.").     
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
3a70: 78 69 74 28 29 0a 20 20 20 20 20 20 20 20 20 20  xit().          
3a80: 20 20 20 20 20 20 69 41 63 74 69 6f 6e 42 6c 6f        iActionBlo
3a90: 63 6b 20 3d 20 31 0a 20 20 20 20 20 20 20 20 20  ck = 1.         
3aa0: 20 20 20 20 20 20 20 6e 50 72 69 6f 72 69 74 79         nPriority
3ab0: 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 32   = int(m.group(2
3ac0: 29 5b 31 3a 5d 29 20 69 66 20 6d 2e 67 72 6f 75  )[1:]) if m.grou
3ad0: 70 28 32 29 20 20 65 6c 73 65 20 2d 31 0a 20 20  p(2)  else -1.  
3ae0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a            else:.
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 70 72 69 6e 74 28 22 53 79 6e 74 61 78 20 65 72  print("Syntax er
3b10: 72 6f 72 20 69 6e 20 72 75 6c 65 20 67 72 6f 75  ror in rule grou
3b20: 70 3a 20 22 2c 20 73 4c 69 6e 65 2c 20 22 20 2d  p: ", sLine, " -
3b30: 2d 20 6c 69 6e 65 3a 22 2c 20 69 29 0a 20 20 20  - line:", i).   
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69               exi
3b50: 74 28 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66  t().        elif
3b60: 20 72 65 2e 73 65 61 72 63 68 28 22 5e 20 20 20   re.search("^   
3b70: 20 2b 3c 3c 2d 20 22 2c 20 73 4c 69 6e 65 29 20   +<<- ", sLine) 
3b80: 6f 72 20 28 73 4c 69 6e 65 2e 73 74 61 72 74 73  or (sLine.starts
3b90: 77 69 74 68 28 22 20 20 20 20 20 20 20 20 22 29  with("        ")
3ba0: 20 61 6e 64 20 6e 6f 74 20 73 4c 69 6e 65 2e 73   and not sLine.s
3bb0: 74 61 72 74 73 77 69 74 68 28 22 20 20 20 20 20  tartswith("     
3bc0: 20 20 20 7c 7c 22 29 29 20 5c 0a 20 20 20 20 20     ||")) \.     
3bd0: 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 72 65             or re
3be0: 2e 73 65 61 72 63 68 28 22 5e 20 20 20 20 2b 23  .search("^    +#
3bf0: 22 2c 20 73 4c 69 6e 65 29 20 6f 72 20 72 65 2e  ", sLine) or re.
3c00: 73 65 61 72 63 68 28 72 22 5b 2d 7e 3d 3e 2f 25  search(r"[-~=>/%
3c10: 5d 28 3f 3a 2d 3f 5c 64 5c 2e 3f 28 3f 3a 3a 5c  ](?:-?\d\.?(?::\
3c20: 2e 3f 2d 3f 5c 64 2b 7c 29 7c 29 3e 3e 20 22 2c  .?-?\d+|)|)>> ",
3c30: 20 73 4c 69 6e 65 29 20 3a 0a 20 20 20 20 20 20   sLine) :.      
3c40: 20 20 20 20 20 20 23 20 61 63 74 69 6f 6e 73 0a        # actions.
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63 74              sAct
3c60: 69 6f 6e 73 20 2b 3d 20 22 20 22 20 2b 20 73 4c  ions += " " + sL
3c70: 69 6e 65 2e 73 74 72 69 70 28 29 0a 20 20 20 20  ine.strip().    
3c80: 20 20 20 20 65 6c 69 66 20 72 65 2e 6d 61 74 63      elif re.matc
3c90: 68 28 22 5b 20 c2 a0 5d 2a 24 22 2c 20 73 4c 69  h("[ ..]*$", sLi
3ca0: 6e 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ne):.           
3cb0: 20 23 20 65 6d 70 74 79 20 6c 69 6e 65 20 74 6f   # empty line to
3cc0: 20 65 6e 64 20 6d 65 72 67 69 6e 67 0a 20 20 20   end merging.   
3cd0: 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20           if not 
3ce0: 6c 54 6f 6b 65 6e 4c 69 6e 65 3a 0a 20 20 20 20  lTokenLine:.    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
3d00: 69 6e 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  inue.           
3d10: 20 69 66 20 6e 6f 74 20 73 41 63 74 69 6f 6e 73   if not sActions
3d20: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3d30: 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72 2e 20    print("Error. 
3d40: 4e 6f 20 61 63 74 69 6f 6e 20 66 6f 75 6e 64 20  No action found 
3d50: 61 74 20 6c 69 6e 65 3a 22 2c 20 69 29 0a 20 20  at line:", i).  
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
3d70: 69 74 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  it().           
3d80: 20 69 66 20 6e 6f 74 20 73 47 72 61 70 68 4e 61   if not sGraphNa
3d90: 6d 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  me:.            
3da0: 20 20 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72      print("Error
3db0: 2e 20 41 6c 6c 20 72 75 6c 65 73 20 6d 75 73 74  . All rules must
3dc0: 20 62 65 6c 6f 6e 67 20 74 6f 20 61 20 6e 61 6d   belong to a nam
3dd0: 65 64 20 67 72 61 70 68 2e 20 4c 69 6e 65 3a 20  ed graph. Line: 
3de0: 22 2c 20 69 29 0a 20 20 20 20 20 20 20 20 20 20  ", i).          
3df0: 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20 20        exit().   
3e00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 6a 2c 20           for j, 
3e10: 73 54 6f 6b 65 6e 4c 69 6e 65 20 69 6e 20 6c 54  sTokenLine in lT
3e20: 6f 6b 65 6e 4c 69 6e 65 3a 0a 20 20 20 20 20 20  okenLine:.      
3e30: 20 20 20 20 20 20 20 20 20 20 64 41 6c 6c 47 72            dAllGr
3e40: 61 70 68 5b 73 47 72 61 70 68 4e 61 6d 65 5d 2e  aph[sGraphName].
3e50: 61 70 70 65 6e 64 28 28 6a 2c 20 73 52 75 6c 65  append((j, sRule
3e60: 4e 61 6d 65 2c 20 73 54 6f 6b 65 6e 4c 69 6e 65  Name, sTokenLine
3e70: 2c 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b 2c 20  , iActionBlock, 
3e80: 73 41 63 74 69 6f 6e 73 2c 20 6e 50 72 69 6f 72  sActions, nPrior
3e90: 69 74 79 29 29 0a 20 20 20 20 20 20 20 20 20 20  ity)).          
3ea0: 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 2e 63 6c 65    lTokenLine.cle
3eb0: 61 72 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar().           
3ec0: 20 73 41 63 74 69 6f 6e 73 20 3d 20 22 22 0a 20   sActions = "". 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 69 41 63 74 69             iActi
3ee0: 6f 6e 42 6c 6f 63 6b 20 2b 3d 20 31 0a 20 20 20  onBlock += 1.   
3ef0: 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e       elif sLine.
3f00: 73 74 61 72 74 73 77 69 74 68 28 22 20 20 20 20  startswith("    
3f10: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
3f20: 23 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20 20  # tokens.       
3f30: 20 20 20 20 20 73 4c 69 6e 65 20 3d 20 73 4c 69       sLine = sLi
3f40: 6e 65 2e 73 74 72 69 70 28 29 0a 20 20 20 20 20  ne.strip().     
3f50: 20 20 20 20 20 20 20 69 66 20 73 4c 69 6e 65 2e         if sLine.
3f60: 73 74 61 72 74 73 77 69 74 68 28 22 7c 7c 22 29  startswith("||")
3f70: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3f80: 20 20 69 50 72 65 76 4c 69 6e 65 2c 20 73 50 72    iPrevLine, sPr
3f90: 65 76 4c 69 6e 65 20 3d 20 6c 54 6f 6b 65 6e 4c  evLine = lTokenL
3fa0: 69 6e 65 5b 2d 31 5d 0a 20 20 20 20 20 20 20 20  ine[-1].        
3fb0: 20 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e 4c 69          lTokenLi
3fc0: 6e 65 5b 2d 31 5d 20 3d 20 5b 69 50 72 65 76 4c  ne[-1] = [iPrevL
3fd0: 69 6e 65 2c 20 73 50 72 65 76 4c 69 6e 65 20 2b  ine, sPrevLine +
3fe0: 20 22 20 22 20 2b 20 73 4c 69 6e 65 5b 32 3a 5d   " " + sLine[2:]
3ff0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ].            el
4000: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
4010: 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 2e 61      lTokenLine.a
4020: 70 70 65 6e 64 28 5b 69 2c 20 73 4c 69 6e 65 5d  ppend([i, sLine]
4030: 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a  ).        else:.
4040: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4050: 74 28 22 55 6e 6b 6e 6f 77 6e 20 6c 69 6e 65 3a  t("Unknown line:
4060: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ").            p
4070: 72 69 6e 74 28 73 4c 69 6e 65 29 0a 0a 20 20 20  rint(sLine)..   
4080: 20 23 20 70 72 6f 63 65 73 73 69 6e 67 20 72 75   # processing ru
4090: 6c 65 73 0a 20 20 20 20 70 72 69 6e 74 28 22 20  les.    print(" 
40a0: 20 70 72 65 70 61 72 69 6e 67 20 72 75 6c 65 73   preparing rules
40b0: 2e 2e 2e 22 29 0a 20 20 20 20 66 6f 72 20 73 47  ...").    for sG
40c0: 72 61 70 68 4e 61 6d 65 2c 20 6c 52 75 6c 65 4c  raphName, lRuleL
40d0: 69 6e 65 20 69 6e 20 64 41 6c 6c 47 72 61 70 68  ine in dAllGraph
40e0: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
40f0: 20 20 6c 50 72 65 70 61 72 65 64 52 75 6c 65 20    lPreparedRule 
4100: 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20 66 6f 72  = [].        for
4110: 20 69 2c 20 73 52 75 6c 65 47 72 6f 75 70 2c 20   i, sRuleGroup, 
4120: 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74  sTokenLine, iAct
4130: 69 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f  ionBlock, sActio
4140: 6e 73 2c 20 6e 50 72 69 6f 72 69 74 79 20 69 6e  ns, nPriority in
4150: 20 6c 52 75 6c 65 4c 69 6e 65 3a 0a 20 20 20 20   lRuleLine:.    
4160: 20 20 20 20 20 20 20 20 66 6f 72 20 6c 52 75 6c          for lRul
4170: 65 20 69 6e 20 63 72 65 61 74 65 52 75 6c 65 28  e in createRule(
4180: 69 2c 20 73 52 75 6c 65 47 72 6f 75 70 2c 20 73  i, sRuleGroup, s
4190: 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74 69  TokenLine, iActi
41a0: 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f 6e  onBlock, sAction
41b0: 73 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 64 4f  s, nPriority, dO
41c0: 70 74 50 72 69 6f 72 69 74 79 2c 20 64 44 65 66  ptPriority, dDef
41d0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
41e0: 20 20 20 6c 50 72 65 70 61 72 65 64 52 75 6c 65     lPreparedRule
41f0: 2e 61 70 70 65 6e 64 28 6c 52 75 6c 65 29 0a 20  .append(lRule). 
4200: 20 20 20 20 20 20 20 23 20 47 72 61 70 68 20 63         # Graph c
4210: 72 65 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  reation.        
4220: 6f 44 41 52 47 20 3d 20 64 61 72 67 2e 44 41 52  oDARG = darg.DAR
4230: 47 28 6c 50 72 65 70 61 72 65 64 52 75 6c 65 2c  G(lPreparedRule,
4240: 20 73 4c 61 6e 67 29 0a 20 20 20 20 20 20 20 20   sLang).        
4250: 64 41 6c 6c 47 72 61 70 68 5b 73 47 72 61 70 68  dAllGraph[sGraph
4260: 4e 61 6d 65 5d 20 3d 20 6f 44 41 52 47 2e 63 72  Name] = oDARG.cr
4270: 65 61 74 65 47 72 61 70 68 28 29 0a 20 20 20 20  eateGraph().    
4280: 20 20 20 20 23 20 44 65 62 75 67 67 69 6e 67 0a      # Debugging.
4290: 20 20 20 20 20 20 20 20 69 66 20 46 61 6c 73 65          if False
42a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
42b0: 69 6e 74 28 22 5c 6e 52 55 4c 45 53 3a 22 29 0a  int("\nRULES:").
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
42d0: 65 20 69 6e 20 6c 50 72 65 70 61 72 65 64 52 75  e in lPreparedRu
42e0: 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  le:.            
42f0: 20 20 20 20 69 66 20 65 5b 2d 32 5d 20 3d 3d 20      if e[-2] == 
4300: 22 23 23 32 32 31 31 22 3a 0a 20 20 20 20 20 20  "##2211":.      
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
4320: 69 6e 74 28 65 29 0a 20 20 20 20 20 20 20 20 69  int(e).        i
4330: 66 20 46 61 6c 73 65 3a 0a 20 20 20 20 20 20 20  f False:.       
4340: 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e 47 52       print("\nGR
4350: 41 50 48 3a 22 2c 20 73 47 72 61 70 68 4e 61 6d  APH:", sGraphNam
4360: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e).            f
4370: 6f 72 20 6b 2c 20 76 20 69 6e 20 64 41 6c 6c 47  or k, v in dAllG
4380: 72 61 70 68 5b 73 47 72 61 70 68 4e 61 6d 65 5d  raph[sGraphName]
4390: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
43a0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
43b0: 6b 2c 20 22 5c 74 22 2c 20 76 29 0a 0a 20 20 20  k, "\t", v)..   
43c0: 20 23 20 63 72 65 61 74 69 6e 67 20 66 69 6c 65   # creating file
43d0: 20 77 69 74 68 20 61 6c 6c 20 66 75 6e 63 74 69   with all functi
43e0: 6f 6e 73 20 63 61 6c 6c 61 62 6c 65 20 62 79 20  ons callable by 
43f0: 72 75 6c 65 73 0a 20 20 20 20 70 72 69 6e 74 28  rules.    print(
4400: 22 20 20 63 72 65 61 74 69 6e 67 20 63 61 6c 6c  "  creating call
4410: 61 62 6c 65 73 2e 2e 2e 22 29 0a 20 20 20 20 73  ables...").    s
4420: 50 79 43 61 6c 6c 61 62 6c 65 73 20 3d 20 22 23  PyCallables = "#
4430: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2c   generated code,
4440: 20 64 6f 20 6e 6f 74 20 65 64 69 74 5c 6e 22 0a   do not edit\n".
4450: 20 20 20 20 23 73 4a 53 43 61 6c 6c 61 62 6c 65      #sJSCallable
4460: 73 20 3d 20 22 2f 2f 20 67 65 6e 65 72 61 74 65  s = "// generate
4470: 64 20 63 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 65  d code, do not e
4480: 64 69 74 5c 6e 63 6f 6e 73 74 20 6f 45 76 61 6c  dit\nconst oEval
4490: 46 75 6e 63 20 3d 20 7b 5c 6e 22 0a 20 20 20 20  Func = {\n".    
44a0: 66 6f 72 20 73 46 75 6e 63 4e 61 6d 65 2c 20 73  for sFuncName, s
44b0: 52 65 74 75 72 6e 20 69 6e 20 64 46 55 4e 43 54  Return in dFUNCT
44c0: 49 4f 4e 53 2e 69 74 65 6d 73 28 29 3a 0a 20 20  IONS.items():.  
44d0: 20 20 20 20 20 20 69 66 20 73 46 75 6e 63 4e 61        if sFuncNa
44e0: 6d 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 5f  me.startswith("_
44f0: 67 5f 63 6f 6e 64 5f 22 29 3a 20 23 20 63 6f 6e  g_cond_"): # con
4500: 64 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  dition.         
4510: 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 6c 54     sParams = "lT
4520: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73  oken, nTokenOffs
4530: 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20  et, nLastToken, 
4540: 73 43 6f 75 6e 74 72 79 2c 20 62 43 6f 6e 64 4d  sCountry, bCondM
4550: 65 6d 6f 2c 20 64 54 61 67 73 2c 20 73 53 65 6e  emo, dTags, sSen
4560: 74 65 6e 63 65 2c 20 73 53 65 6e 74 65 6e 63 65  tence, sSentence
4570: 30 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  0".        elif 
4580: 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73  sFuncName.starts
4590: 77 69 74 68 28 22 67 5f 6d 73 67 5f 22 29 3a 20  with("g_msg_"): 
45a0: 23 20 6d 65 73 73 61 67 65 0a 20 20 20 20 20 20  # message.      
45b0: 20 20 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20        sParams = 
45c0: 22 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f  "lToken, nTokenO
45d0: 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65  ffset, nLastToke
45e0: 6e 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  n".        elif 
45f0: 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73  sFuncName.starts
4600: 77 69 74 68 28 22 5f 67 5f 73 75 67 67 5f 22 29  with("_g_sugg_")
4610: 3a 20 23 20 73 75 67 67 65 73 74 69 6f 6e 0a 20  : # suggestion. 
4620: 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72 61             sPara
4630: 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e 54  ms = "lToken, nT
4640: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
4650: 74 54 6f 6b 65 6e 22 0a 20 20 20 20 20 20 20 20  tToken".        
4660: 65 6c 69 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73  elif sFuncName.s
4670: 74 61 72 74 73 77 69 74 68 28 22 5f 67 5f 74 70  tartswith("_g_tp
4680: 5f 22 29 3a 20 23 20 74 65 78 74 20 70 72 65 70  _"): # text prep
4690: 72 6f 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20  rocessor.       
46a0: 20 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22       sParams = "
46b0: 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66  lToken, nTokenOf
46c0: 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e  fset, nLastToken
46d0: 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73  ".        elif s
46e0: 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73 77  FuncName.startsw
46f0: 69 74 68 28 22 5f 67 5f 64 61 5f 22 29 3a 20 23  ith("_g_da_"): #
4700: 20 64 69 73 61 6d 62 69 67 75 61 74 6f 72 0a 20   disambiguator. 
4710: 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72 61             sPara
4720: 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e 54  ms = "lToken, nT
4730: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
4740: 74 54 6f 6b 65 6e 22 0a 20 20 20 20 20 20 20 20  tToken".        
4750: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
4760: 20 20 70 72 69 6e 74 28 22 23 20 55 6e 6b 6e 6f    print("# Unkno
4770: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 74 79 70 65  wn function type
4780: 20 69 6e 20 5b 22 20 2b 20 73 46 75 6e 63 4e 61   in [" + sFuncNa
4790: 6d 65 20 2b 20 22 5d 22 29 0a 20 20 20 20 20 20  me + "]").      
47a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20        continue. 
47b0: 20 20 20 20 20 20 20 73 50 79 43 61 6c 6c 61 62         sPyCallab
47c0: 6c 65 73 20 2b 3d 20 22 64 65 66 20 7b 7d 20 28  les += "def {} (
47d0: 7b 7d 29 3a 5c 6e 22 2e 66 6f 72 6d 61 74 28 73  {}):\n".format(s
47e0: 46 75 6e 63 4e 61 6d 65 2c 20 73 50 61 72 61 6d  FuncName, sParam
47f0: 73 29 0a 20 20 20 20 20 20 20 20 73 50 79 43 61  s).        sPyCa
4800: 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20 20 20  llables += "    
4810: 72 65 74 75 72 6e 20 22 20 2b 20 73 52 65 74 75  return " + sRetu
4820: 72 6e 20 2b 20 22 5c 6e 22 0a 20 20 20 20 20 20  rn + "\n".      
4830: 20 20 23 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20    #sJSCallables 
4840: 2b 3d 20 22 20 20 20 20 7b 7d 3a 20 66 75 6e 63  += "    {}: func
4850: 74 69 6f 6e 20 28 7b 7d 29 22 2e 66 6f 72 6d 61  tion ({})".forma
4860: 74 28 73 46 75 6e 63 4e 61 6d 65 2c 20 73 50 61  t(sFuncName, sPa
4870: 72 61 6d 73 29 20 2b 20 22 20 7b 5c 6e 22 0a 20  rams) + " {\n". 
4880: 20 20 20 20 20 20 20 23 73 4a 53 43 61 6c 6c 61         #sJSCalla
4890: 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 20 20 20  bles += "       
48a0: 20 72 65 74 75 72 6e 20 22 20 2b 20 6a 73 63 6f   return " + jsco
48b0: 6e 76 2e 70 79 32 6a 73 28 73 52 65 74 75 72 6e  nv.py2js(sReturn
48c0: 29 20 2b 20 22 3b 5c 6e 22 0a 20 20 20 20 20 20  ) + ";\n".      
48d0: 20 20 23 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20    #sJSCallables 
48e0: 2b 3d 20 22 20 20 20 20 7d 2c 5c 6e 22 0a 20 20  += "    },\n".  
48f0: 20 20 23 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20    #sJSCallables 
4900: 2b 3d 20 22 7d 5c 6e 22 0a 0a 20 20 20 20 23 20  += "}\n"..    # 
4910: 44 65 62 75 67 67 69 6e 67 0a 20 20 20 20 69 66  Debugging.    if
4920: 20 46 61 6c 73 65 3a 0a 20 20 20 20 20 20 20 20   False:.        
4930: 70 72 69 6e 74 28 22 5c 6e 41 63 74 69 6f 6e 73  print("\nActions
4940: 3a 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20  :").        for 
4950: 73 41 63 74 69 6f 6e 4e 61 6d 65 2c 20 61 41 63  sActionName, aAc
4960: 74 69 6f 6e 20 69 6e 20 64 41 43 54 49 4f 4e 53  tion in dACTIONS
4970: 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20  .items():.      
4980: 20 20 20 20 20 20 70 72 69 6e 74 28 73 41 63 74        print(sAct
4990: 69 6f 6e 4e 61 6d 65 2c 20 61 41 63 74 69 6f 6e  ionName, aAction
49a0: 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28  ).        print(
49b0: 22 5c 6e 46 75 6e 63 74 69 6f 6e 73 3a 22 29 0a  "\nFunctions:").
49c0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 50          print(sP
49d0: 79 43 61 6c 6c 61 62 6c 65 73 29 0a 0a 20 20 20  yCallables)..   
49e0: 20 23 20 52 65 73 75 6c 74 0a 20 20 20 20 72 65   # Result.    re
49f0: 74 75 72 6e 20 7b 0a 20 20 20 20 20 20 20 20 22  turn {.        "
4a00: 67 72 61 70 68 5f 63 61 6c 6c 61 62 6c 65 73 22  graph_callables"
4a10: 3a 20 73 50 79 43 61 6c 6c 61 62 6c 65 73 2c 0a  : sPyCallables,.
4a20: 20 20 20 20 20 20 20 20 22 72 75 6c 65 73 5f 67          "rules_g
4a30: 72 61 70 68 73 22 3a 20 64 41 6c 6c 47 72 61 70  raphs": dAllGrap
4a40: 68 2c 0a 20 20 20 20 20 20 20 20 22 72 75 6c 65  h,.        "rule
4a50: 73 5f 61 63 74 69 6f 6e 73 22 3a 20 64 41 43 54  s_actions": dACT
4a60: 49 4f 4e 53 0a 20 20 20 20 7d 0a                 IONS.    }.