Grammalecte  Hex Artifact Content

Artifact cb7c6efd584fe53cda272ea03f964092dd0823dc1d608db000c1628ca96cf115:


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 6c 54 6f 6b 65 6e 2e 6a 6f 69 6e 28 22 20 22  (lToken.join(" "
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 69 66 20 69 4c 69            if iLi
1d10: 6e 65 20 3d 3d 20 31 33 33 34 31 3a 0a 20 20 20  ne == 13341:.   
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 70 72 69 6e 74 28 22 20 20 22 2e       print("  ".
1d40: 6a 6f 69 6e 28 6c 54 6f 6b 65 6e 29 29 0a 20 20  join(lToken)).  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 70 72 69 6e 74 28 73 41 63 74        print(sAct
1d70: 69 6f 6e 49 64 2c 20 61 41 63 74 69 6f 6e 29 0a  ionId, aAction).
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 79 69 65 6c 64 20 6c 52 65 73 75 6c      yield lResul
1da0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
1db0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
1dd0: 74 28 22 20 23 20 45 72 72 6f 72 20 6f 6e 20 61  t(" # Error on a
1de0: 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 3a 22 2c  ction at line:",
1df0: 20 69 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20   iLine).        
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
1e10: 74 28 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 22 5c  t(sTokenLine, "\
1e20: 6e 22 2c 20 73 41 63 74 69 6f 6e 73 29 0a 0a 0a  n", sActions)...
1e30: 64 65 66 20 63 68 61 6e 67 65 52 65 66 65 72 65  def changeRefere
1e40: 6e 63 65 54 6f 6b 65 6e 20 28 73 54 65 78 74 2c  nceToken (sText,
1e50: 20 64 50 6f 73 29 3a 0a 20 20 20 20 22 63 68 61   dPos):.    "cha
1e60: 6e 67 65 20 67 72 6f 75 70 20 72 65 66 65 72 65  nge group refere
1e70: 6e 63 65 20 69 6e 20 3c 73 54 65 78 74 3e 20 77  nce in <sText> w
1e80: 69 74 68 20 76 61 6c 75 65 73 20 69 6e 20 3c 64  ith values in <d
1e90: 50 6f 73 3e 22 0a 20 20 20 20 66 6f 72 20 69 20  Pos>".    for i 
1ea0: 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28 64 50 6f  in range(len(dPo
1eb0: 73 29 2c 20 30 2c 20 2d 31 29 3a 0a 20 20 20 20  s), 0, -1):.    
1ec0: 20 20 20 20 73 54 65 78 74 20 3d 20 73 54 65 78      sText = sTex
1ed0: 74 2e 72 65 70 6c 61 63 65 28 22 5c 5c 22 2b 73  t.replace("\\"+s
1ee0: 74 72 28 69 29 2c 20 22 5c 5c 22 2b 73 74 72 28  tr(i), "\\"+str(
1ef0: 64 50 6f 73 5b 69 5d 29 29 0a 20 20 20 20 72 65  dPos[i])).    re
1f00: 74 75 72 6e 20 73 54 65 78 74 0a 0a 0a 64 65 66  turn sText...def
1f10: 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d 62 65   checkTokenNumbe
1f20: 72 73 20 28 73 54 65 78 74 2c 20 73 41 63 74 69  rs (sText, sActi
1f30: 6f 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29 3a 0a 20  onId, nToken):. 
1f40: 20 20 20 22 63 68 65 63 6b 20 69 66 20 74 6f 6b     "check if tok
1f50: 65 6e 20 72 65 66 65 72 65 6e 63 65 73 20 69 6e  en references in
1f60: 20 3c 73 54 65 78 74 3e 20 67 72 65 61 74 65 72   <sText> greater
1f70: 20 74 68 61 6e 20 3c 6e 54 6f 6b 65 6e 3e 20 28   than <nToken> (
1f80: 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20 20 20  debugging)".    
1f90: 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69 6e 64  for x in re.find
1fa0: 69 74 65 72 28 72 22 5c 5c 28 5c 64 2b 29 22 2c  iter(r"\\(\d+)",
1fb0: 20 73 54 65 78 74 29 3a 0a 20 20 20 20 20 20 20   sText):.       
1fc0: 20 69 66 20 69 6e 74 28 78 2e 67 72 6f 75 70 28   if int(x.group(
1fd0: 31 29 29 20 3e 20 6e 54 6f 6b 65 6e 3a 0a 20 20  1)) > nToken:.  
1fe0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
1ff0: 22 23 20 45 72 72 6f 72 20 69 6e 20 74 6f 6b 65  "# Error in toke
2000: 6e 20 69 6e 64 65 78 20 61 74 20 6c 69 6e 65 20  n index at line 
2010: 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b 20  " + sActionId + 
2020: 22 20 28 22 2b 73 74 72 28 6e 54 6f 6b 65 6e 29  " ("+str(nToken)
2030: 2b 22 20 74 6f 6b 65 6e 73 20 6f 6e 6c 79 29 22  +" tokens only)"
2040: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ).            pr
2050: 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a 64 65 66  int(sText)...def
2060: 20 63 68 65 63 6b 49 66 54 68 65 72 65 49 73 43   checkIfThereIsC
2070: 6f 64 65 20 28 73 54 65 78 74 2c 20 73 41 63 74  ode (sText, sAct
2080: 69 6f 6e 49 64 29 3a 0a 20 20 20 20 22 63 68 65  ionId):.    "che
2090: 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 63  ck if there is c
20a0: 6f 64 65 20 69 6e 20 3c 73 54 65 78 74 3e 20 28  ode in <sText> (
20b0: 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20 20 20  debugging)".    
20c0: 69 66 20 72 65 2e 73 65 61 72 63 68 28 22 5b 2e  if re.search("[.
20d0: 5d 5c 5c 77 2b 5b 28 5d 7c 73 75 67 67 5c 5c 77  ]\\w+[(]|sugg\\w
20e0: 2b 5b 28 5d 7c 5c 5c 28 5b 30 2d 39 5d 7c 5c 5c  +[(]|\\([0-9]|\\
20f0: 5b 5b 30 2d 39 5d 22 2c 20 73 54 65 78 74 29 3a  [[0-9]", sText):
2100: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
2110: 23 20 57 61 72 6e 69 6e 67 20 61 74 20 6c 69 6e  # Warning at lin
2120: 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20  e " + sActionId 
2130: 2b 20 22 3a 20 20 54 68 69 73 20 6d 65 73 73 61  + ":  This messa
2140: 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 63 6f  ge looks like co
2150: 64 65 2e 20 4c 69 6e 65 20 73 68 6f 75 6c 64 20  de. Line should 
2160: 70 72 6f 62 61 62 6c 79 20 62 65 67 69 6e 20 77  probably begin w
2170: 69 74 68 20 3d 22 29 0a 20 20 20 20 20 20 20 20  ith =").        
2180: 70 72 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a 64  print(sText)...d
2190: 65 66 20 63 72 65 61 74 65 41 63 74 69 6f 6e 20  ef createAction 
21a0: 28 73 41 63 74 69 6f 6e 49 64 2c 20 73 41 63 74  (sActionId, sAct
21b0: 69 6f 6e 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20  ion, nPriority, 
21c0: 64 4f 70 74 50 72 69 6f 72 69 74 79 2c 20 6e 54  dOptPriority, nT
21d0: 6f 6b 65 6e 2c 20 64 50 6f 73 29 3a 0a 20 20 20  oken, dPos):.   
21e0: 20 22 63 72 65 61 74 65 20 61 63 74 69 6f 6e 20   "create action 
21f0: 72 75 6c 65 20 61 73 20 61 20 6c 69 73 74 22 0a  rule as a list".
2200: 20 20 20 20 23 20 4f 70 74 69 6f 6e 0a 20 20 20      # Option.   
2210: 20 73 4f 70 74 69 6f 6e 20 3d 20 46 61 6c 73 65   sOption = False
2220: 0a 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63  .    m = re.matc
2230: 68 28 22 2f 28 5c 5c 77 2b 29 2f 22 2c 20 73 41  h("/(\\w+)/", sA
2240: 63 74 69 6f 6e 29 0a 20 20 20 20 69 66 20 6d 3a  ction).    if m:
2250: 0a 20 20 20 20 20 20 20 20 73 4f 70 74 69 6f 6e  .        sOption
2260: 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29 0a 20 20   = m.group(1).  
2270: 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20        sAction = 
2280: 73 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64 28 29 3a  sAction[m.end():
2290: 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20 69 66  ].strip().    if
22a0: 20 6e 50 72 69 6f 72 69 74 79 20 3d 3d 20 2d 31   nPriority == -1
22b0: 3a 0a 20 20 20 20 20 20 20 20 6e 50 72 69 6f 72  :.        nPrior
22c0: 69 74 79 20 3d 20 64 4f 70 74 50 72 69 6f 72 69  ity = dOptPriori
22d0: 74 79 2e 67 65 74 28 73 4f 70 74 69 6f 6e 2c 20  ty.get(sOption, 
22e0: 34 29 0a 0a 20 20 20 20 23 20 76 61 6c 69 64 20  4)..    # valid 
22f0: 61 63 74 69 6f 6e 3f 0a 20 20 20 20 6d 20 3d 20  action?.    m = 
2300: 72 65 2e 73 65 61 72 63 68 28 72 22 28 3f 50 3c  re.search(r"(?P<
2310: 61 63 74 69 6f 6e 3e 5b 2d 7e 3d 2f 25 3e 5d 29  action>[-~=/%>])
2320: 28 3f 50 3c 73 74 61 72 74 3e 2d 3f 5c 64 2b 5c  (?P<start>-?\d+\
2330: 2e 3f 7c 29 28 3f 50 3c 65 6e 64 3e 3a 5c 2e 3f  .?|)(?P<end>:\.?
2340: 2d 3f 5c 64 2b 7c 29 28 3f 50 3c 63 61 73 69 6e  -?\d+|)(?P<casin
2350: 67 3e 3a 7c 29 3e 3e 22 2c 20 73 41 63 74 69 6f  g>:|)>>", sActio
2360: 6e 29 0a 20 20 20 20 69 66 20 6e 6f 74 20 6d 3a  n).    if not m:
2370: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
2380: 20 23 20 45 72 72 6f 72 2e 20 4e 6f 20 61 63 74   # Error. No act
2390: 69 6f 6e 20 66 6f 75 6e 64 20 61 74 3a 20 22 2c  ion found at: ",
23a0: 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20 20   sActionId).    
23b0: 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a      return None.
23c0: 0a 20 20 20 20 23 20 43 6f 6e 64 69 74 69 6f 6e  .    # Condition
23d0: 0a 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20  .    sCondition 
23e0: 3d 20 73 41 63 74 69 6f 6e 5b 3a 6d 2e 73 74 61  = sAction[:m.sta
23f0: 72 74 28 29 5d 2e 73 74 72 69 70 28 29 0a 20 20  rt()].strip().  
2400: 20 20 69 66 20 73 43 6f 6e 64 69 74 69 6f 6e 3a    if sCondition:
2410: 0a 20 20 20 20 20 20 20 20 73 43 6f 6e 64 69 74  .        sCondit
2420: 69 6f 6e 20 3d 20 63 68 61 6e 67 65 52 65 66 65  ion = changeRefe
2430: 72 65 6e 63 65 54 6f 6b 65 6e 28 73 43 6f 6e 64  renceToken(sCond
2440: 69 74 69 6f 6e 2c 20 64 50 6f 73 29 0a 20 20 20  ition, dPos).   
2450: 20 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20       sCondition 
2460: 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  = createFunction
2470: 28 22 63 6f 6e 64 22 2c 20 73 41 63 74 69 6f 6e  ("cond", sAction
2480: 49 64 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 29 0a  Id, sCondition).
2490: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
24a0: 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 22    sCondition = "
24b0: 22 0a 0a 20 20 20 20 23 20 43 61 73 65 20 73 65  "..    # Case se
24c0: 6e 73 69 74 69 76 69 74 79 0a 20 20 20 20 62 43  nsitivity.    bC
24d0: 61 73 65 53 65 6e 73 69 74 69 76 69 74 79 20 3d  aseSensitivity =
24e0: 20 46 61 6c 73 65 20 69 66 20 6d 2e 67 72 6f 75   False if m.grou
24f0: 70 28 22 63 61 73 69 6e 67 22 29 20 3d 3d 20 22  p("casing") == "
2500: 3a 22 20 65 6c 73 65 20 54 72 75 65 0a 0a 20 20  :" else True..  
2510: 20 20 23 20 41 63 74 69 6f 6e 0a 20 20 20 20 63    # Action.    c
2520: 41 63 74 69 6f 6e 20 3d 20 6d 2e 67 72 6f 75 70  Action = m.group
2530: 28 22 61 63 74 69 6f 6e 22 29 0a 20 20 20 20 73  ("action").    s
2540: 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e  Action = sAction
2550: 5b 6d 2e 65 6e 64 28 29 3a 5d 2e 73 74 72 69 70  [m.end():].strip
2560: 28 29 0a 20 20 20 20 73 41 63 74 69 6f 6e 20 3d  ().    sAction =
2570: 20 63 68 61 6e 67 65 52 65 66 65 72 65 6e 63 65   changeReference
2580: 54 6f 6b 65 6e 28 73 41 63 74 69 6f 6e 2c 20 64  Token(sAction, d
2590: 50 6f 73 29 0a 20 20 20 20 23 20 74 61 72 67 65  Pos).    # targe
25a0: 74 0a 20 20 20 20 63 53 74 61 72 74 4c 69 6d 69  t.    cStartLimi
25b0: 74 20 3d 20 22 3c 22 0a 20 20 20 20 63 45 6e 64  t = "<".    cEnd
25c0: 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20 20 20 20  Limit = ">".    
25d0: 69 66 20 6e 6f 74 20 6d 2e 67 72 6f 75 70 28 22  if not m.group("
25e0: 73 74 61 72 74 22 29 3a 0a 20 20 20 20 20 20 20  start"):.       
25f0: 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20 3d 20   iStartAction = 
2600: 31 0a 20 20 20 20 20 20 20 20 69 45 6e 64 41 63  1.        iEndAc
2610: 74 69 6f 6e 20 3d 20 30 0a 20 20 20 20 65 6c 73  tion = 0.    els
2620: 65 3a 0a 20 20 20 20 20 20 20 20 69 66 20 63 41  e:.        if cA
2630: 63 74 69 6f 6e 20 21 3d 20 22 2d 22 20 61 6e 64  ction != "-" and
2640: 20 28 6d 2e 67 72 6f 75 70 28 22 73 74 61 72 74   (m.group("start
2650: 22 29 2e 65 6e 64 73 77 69 74 68 28 22 2e 22 29  ").endswith(".")
2660: 20 6f 72 20 6d 2e 67 72 6f 75 70 28 22 65 6e 64   or m.group("end
2670: 22 29 2e 73 74 61 72 74 73 77 69 74 68 28 22 3a  ").startswith(":
2680: 2e 22 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20  .")):.          
2690: 20 20 70 72 69 6e 74 28 22 20 23 20 45 72 72 6f    print(" # Erro
26a0: 72 2e 20 57 72 6f 6e 67 20 73 65 6c 65 63 74 69  r. Wrong selecti
26b0: 6f 6e 20 6f 6e 20 74 6f 6b 65 6e 73 2e 22 2c 20  on on tokens.", 
26c0: 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20 20 20  sActionId).     
26d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f         return No
26e0: 6e 65 0a 20 20 20 20 20 20 20 20 69 66 20 6d 2e  ne.        if m.
26f0: 67 72 6f 75 70 28 22 73 74 61 72 74 22 29 2e 65  group("start").e
2700: 6e 64 73 77 69 74 68 28 22 2e 22 29 3a 0a 20 20  ndswith("."):.  
2710: 20 20 20 20 20 20 20 20 20 20 63 53 74 61 72 74            cStart
2720: 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20 20 20 20  Limit = ">".    
2730: 20 20 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e      iStartAction
2740: 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 22   = int(m.group("
2750: 73 74 61 72 74 22 29 2e 72 73 74 72 69 70 28 22  start").rstrip("
2760: 2e 22 29 29 0a 20 20 20 20 20 20 20 20 69 66 20  .")).        if 
2770: 6e 6f 74 20 6d 2e 67 72 6f 75 70 28 22 65 6e 64  not m.group("end
2780: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
2790: 69 45 6e 64 41 63 74 69 6f 6e 20 3d 20 69 53 74  iEndAction = iSt
27a0: 61 72 74 41 63 74 69 6f 6e 0a 20 20 20 20 20 20  artAction.      
27b0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
27c0: 20 20 20 20 69 66 20 6d 2e 67 72 6f 75 70 28 22      if m.group("
27d0: 65 6e 64 22 29 2e 73 74 61 72 74 73 77 69 74 68  end").startswith
27e0: 28 22 3a 2e 22 29 3a 0a 20 20 20 20 20 20 20 20  (":."):.        
27f0: 20 20 20 20 20 20 20 20 63 45 6e 64 4c 69 6d 69          cEndLimi
2800: 74 20 3d 20 22 3c 22 0a 20 20 20 20 20 20 20 20  t = "<".        
2810: 20 20 20 20 69 45 6e 64 41 63 74 69 6f 6e 20 3d      iEndAction =
2820: 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 22 65 6e   int(m.group("en
2830: 64 22 29 2e 6c 73 74 72 69 70 28 22 3a 2e 22 29  d").lstrip(":.")
2840: 29 0a 20 20 20 20 69 66 20 64 50 6f 73 20 61 6e  ).    if dPos an
2850: 64 20 6d 2e 67 72 6f 75 70 28 22 73 74 61 72 74  d m.group("start
2860: 22 29 3a 0a 20 20 20 20 20 20 20 20 74 72 79 3a  "):.        try:
2870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74  .            iSt
2880: 61 72 74 41 63 74 69 6f 6e 20 3d 20 64 50 6f 73  artAction = dPos
2890: 2e 67 65 74 28 69 53 74 61 72 74 41 63 74 69 6f  .get(iStartActio
28a0: 6e 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e 29  n, iStartAction)
28b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
28c0: 69 45 6e 64 41 63 74 69 6f 6e 3a 0a 20 20 20 20  iEndAction:.    
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 45 6e 64              iEnd
28e0: 41 63 74 69 6f 6e 20 3d 20 64 50 6f 73 2e 67 65  Action = dPos.ge
28f0: 74 28 69 45 6e 64 41 63 74 69 6f 6e 2c 20 69 45  t(iEndAction, iE
2900: 6e 64 41 63 74 69 6f 6e 29 0a 20 20 20 20 20 20  ndAction).      
2910: 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20    except:.      
2920: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
2930: 72 72 6f 72 2e 20 57 72 6f 6e 67 20 67 72 6f 75  rror. Wrong grou
2940: 70 73 20 69 6e 3a 20 22 20 2b 20 73 41 63 74 69  ps in: " + sActi
2950: 6f 6e 49 64 29 0a 20 20 20 20 20 20 20 20 20 20  onId).          
2960: 20 20 70 72 69 6e 74 28 22 20 20 69 53 74 61 72    print("  iStar
2970: 74 41 63 74 69 6f 6e 3a 22 2c 20 69 53 74 61 72  tAction:", iStar
2980: 74 41 63 74 69 6f 6e 2c 20 22 69 45 6e 64 41 63  tAction, "iEndAc
2990: 74 69 6f 6e 3a 22 2c 20 69 45 6e 64 41 63 74 69  tion:", iEndActi
29a0: 6f 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  on).            
29b0: 70 72 69 6e 74 28 22 20 22 2c 20 64 50 6f 73 29  print(" ", dPos)
29c0: 0a 20 20 20 20 69 66 20 69 53 74 61 72 74 41 63  .    if iStartAc
29d0: 74 69 6f 6e 20 3c 20 30 3a 0a 20 20 20 20 20 20  tion < 0:.      
29e0: 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20 2b    iStartAction +
29f0: 3d 20 31 0a 20 20 20 20 69 66 20 69 45 6e 64 41  = 1.    if iEndA
2a00: 63 74 69 6f 6e 20 3c 20 30 3a 0a 20 20 20 20 20  ction < 0:.     
2a10: 20 20 20 69 45 6e 64 41 63 74 69 6f 6e 20 2b 3d     iEndAction +=
2a20: 20 31 0a 0a 20 20 20 20 69 66 20 63 41 63 74 69   1..    if cActi
2a30: 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20 20  on == "-":.     
2a40: 20 20 20 23 23 20 65 72 72 6f 72 0a 20 20 20 20     ## error.    
2a50: 20 20 20 20 69 4d 73 67 20 3d 20 73 41 63 74 69      iMsg = sActi
2a60: 6f 6e 2e 66 69 6e 64 28 22 20 23 20 22 29 0a 20  on.find(" # "). 
2a70: 20 20 20 20 20 20 20 69 66 20 69 4d 73 67 20 3d         if iMsg =
2a80: 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20 20 20 20  = -1:.          
2a90: 20 20 73 4d 73 67 20 3d 20 22 23 20 45 72 72 6f    sMsg = "# Erro
2aa0: 72 2e 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  r. Error message
2ab0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 22 0a 20 20 20   not found.".   
2ac0: 20 20 20 20 20 20 20 20 20 73 55 52 4c 20 3d 20           sURL = 
2ad0: 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  "".            p
2ae0: 72 69 6e 74 28 73 4d 73 67 20 2b 20 22 20 41 63  rint(sMsg + " Ac
2af0: 74 69 6f 6e 20 69 64 3a 20 22 20 2b 20 73 41 63  tion id: " + sAc
2b00: 74 69 6f 6e 49 64 29 0a 20 20 20 20 20 20 20 20  tionId).        
2b10: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
2b20: 20 20 73 4d 73 67 20 3d 20 73 41 63 74 69 6f 6e    sMsg = sAction
2b30: 5b 69 4d 73 67 2b 33 3a 5d 2e 73 74 72 69 70 28  [iMsg+3:].strip(
2b40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  ).            sA
2b50: 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b  ction = sAction[
2b60: 3a 69 4d 73 67 5d 2e 73 74 72 69 70 28 29 0a 20  :iMsg].strip(). 
2b70: 20 20 20 20 20 20 20 20 20 20 20 73 55 52 4c 20             sURL 
2b80: 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  = "".           
2b90: 20 6d 55 52 4c 20 3d 20 72 65 2e 73 65 61 72 63   mURL = re.searc
2ba0: 68 28 22 5b 7c 5d 20 2a 28 68 74 74 70 73 3f 3a  h("[|] *(https?:
2bb0: 2f 2f 2e 2a 29 22 2c 20 73 4d 73 67 29 0a 20 20  //.*)", sMsg).  
2bc0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6d 55 52            if mUR
2bd0: 4c 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L:.             
2be0: 20 20 20 73 55 52 4c 20 3d 20 6d 55 52 4c 2e 67     sURL = mURL.g
2bf0: 72 6f 75 70 28 31 29 2e 73 74 72 69 70 28 29 0a  roup(1).strip().
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 73 4d 73 67 20 3d 20 73 4d 73 67 5b 3a 6d 55 52  sMsg = sMsg[:mUR
2c20: 4c 2e 73 74 61 72 74 28 30 29 5d 2e 73 74 72 69  L.start(0)].stri
2c30: 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p().            
2c40: 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d 62 65 72  checkTokenNumber
2c50: 73 28 73 4d 73 67 2c 20 73 41 63 74 69 6f 6e 49  s(sMsg, sActionI
2c60: 64 2c 20 6e 54 6f 6b 65 6e 29 0a 20 20 20 20 20  d, nToken).     
2c70: 20 20 20 20 20 20 20 69 66 20 73 4d 73 67 5b 30         if sMsg[0
2c80: 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20 20 20  :1] == "=":.    
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 73 4d 73 67              sMsg
2ca0: 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f   = createFunctio
2cb0: 6e 28 22 6d 73 67 22 2c 20 73 41 63 74 69 6f 6e  n("msg", sAction
2cc0: 49 64 2c 20 73 4d 73 67 2c 20 54 72 75 65 29 0a  Id, sMsg, True).
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2ce0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2cf0: 20 20 63 68 65 63 6b 49 66 54 68 65 72 65 49 73    checkIfThereIs
2d00: 43 6f 64 65 28 73 4d 73 67 2c 20 73 41 63 74 69  Code(sMsg, sActi
2d10: 6f 6e 49 64 29 0a 0a 20 20 20 20 23 20 63 68 65  onId)..    # che
2d20: 63 6b 69 6e 67 20 63 6f 6e 73 69 73 74 61 6e 63  cking consistanc
2d30: 79 0a 20 20 20 20 63 68 65 63 6b 54 6f 6b 65 6e  y.    checkToken
2d40: 4e 75 6d 62 65 72 73 28 73 41 63 74 69 6f 6e 2c  Numbers(sAction,
2d50: 20 73 41 63 74 69 6f 6e 49 64 2c 20 6e 54 6f 6b   sActionId, nTok
2d60: 65 6e 29 0a 0a 20 20 20 20 69 66 20 63 41 63 74  en)..    if cAct
2d70: 69 6f 6e 20 3d 3d 20 22 3e 22 3a 0a 20 20 20 20  ion == ">":.    
2d80: 20 20 20 20 23 23 20 6e 6f 20 61 63 74 69 6f 6e      ## no action
2d90: 2c 20 62 72 65 61 6b 20 6c 6f 6f 70 20 69 66 20  , break loop if 
2da0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 46 61 6c  condition is Fal
2db0: 73 65 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  se.        retur
2dc0: 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 43 6f 6e  n [sOption, sCon
2dd0: 64 69 74 69 6f 6e 2c 20 63 41 63 74 69 6f 6e 2c  dition, cAction,
2de0: 20 22 22 5d 0a 0a 20 20 20 20 69 66 20 6e 6f 74   ""]..    if not
2df0: 20 73 41 63 74 69 6f 6e 20 61 6e 64 20 63 41 63   sAction and cAc
2e00: 74 69 6f 6e 20 21 3d 20 22 25 22 3a 0a 20 20 20  tion != "%":.   
2e10: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72       print("# Er
2e20: 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61 74  ror in action at
2e30: 20 6c 69 6e 65 20 22 20 2b 20 73 41 63 74 69 6f   line " + sActio
2e40: 6e 49 64 20 2b 20 22 3a 20 20 54 68 69 73 20 61  nId + ":  This a
2e50: 63 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 2e 22  ction is empty."
2e60: 29 0a 0a 20 20 20 20 69 66 20 73 41 63 74 69 6f  )..    if sActio
2e70: 6e 5b 30 3a 31 5d 20 21 3d 20 22 3d 22 20 61 6e  n[0:1] != "=" an
2e80: 64 20 63 41 63 74 69 6f 6e 20 21 3d 20 22 3d 22  d cAction != "="
2e90: 3a 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 49  :.        checkI
2ea0: 66 54 68 65 72 65 49 73 43 6f 64 65 28 73 41 63  fThereIsCode(sAc
2eb0: 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 49 64 29  tion, sActionId)
2ec0: 0a 0a 20 20 20 20 69 66 20 63 41 63 74 69 6f 6e  ..    if cAction
2ed0: 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20 20 20 20   == "-":.       
2ee0: 20 23 23 20 65 72 72 6f 72 20 64 65 74 65 63 74   ## error detect
2ef0: 65 64 20 2d 2d 3e 20 73 75 67 67 65 73 74 69 6f  ed --> suggestio
2f00: 6e 0a 20 20 20 20 20 20 20 20 69 66 20 73 41 63  n.        if sAc
2f10: 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22  tion[0:1] == "="
2f20: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  :.            sA
2f30: 63 74 69 6f 6e 20 3d 20 63 72 65 61 74 65 46 75  ction = createFu
2f40: 6e 63 74 69 6f 6e 28 22 73 75 67 67 22 2c 20 73  nction("sugg", s
2f50: 41 63 74 69 6f 6e 49 64 2c 20 73 41 63 74 69 6f  ActionId, sActio
2f60: 6e 2c 20 54 72 75 65 29 0a 20 20 20 20 20 20 20  n, True).       
2f70: 20 65 6c 69 66 20 73 41 63 74 69 6f 6e 2e 73 74   elif sAction.st
2f80: 61 72 74 73 77 69 74 68 28 27 22 27 29 20 61 6e  artswith('"') an
2f90: 64 20 73 41 63 74 69 6f 6e 2e 65 6e 64 73 77 69  d sAction.endswi
2fa0: 74 68 28 27 22 27 29 3a 0a 20 20 20 20 20 20 20  th('"'):.       
2fb0: 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73       sAction = s
2fc0: 41 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20  Action[1:-1].   
2fd0: 20 20 20 20 20 69 66 20 6e 6f 74 20 73 4d 73 67       if not sMsg
2fe0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
2ff0: 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20  int("# Error in 
3000: 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 22  action at line "
3010: 20 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b 20 22   + sActionId + "
3020: 3a 20 20 54 68 65 20 6d 65 73 73 61 67 65 20 69  :  The message i
3030: 73 20 65 6d 70 74 79 2e 22 29 0a 20 20 20 20 20  s empty.").     
3040: 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69     return [sOpti
3050: 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20  on, sCondition, 
3060: 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e  cAction, sAction
3070: 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20  , iStartAction, 
3080: 69 45 6e 64 41 63 74 69 6f 6e 2c 20 63 53 74 61  iEndAction, cSta
3090: 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c 69 6d  rtLimit, cEndLim
30a0: 69 74 2c 20 62 43 61 73 65 53 65 6e 73 69 74 69  it, bCaseSensiti
30b0: 76 69 74 79 2c 20 6e 50 72 69 6f 72 69 74 79 2c  vity, nPriority,
30c0: 20 73 4d 73 67 2c 20 73 55 52 4c 5d 0a 20 20 20   sMsg, sURL].   
30d0: 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d   elif cAction ==
30e0: 20 22 7e 22 3a 0a 20 20 20 20 20 20 20 20 23 23   "~":.        ##
30f0: 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72 0a   text processor.
3100: 20 20 20 20 20 20 20 20 69 66 20 73 41 63 74 69          if sActi
3110: 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a  on[0:1] == "=":.
3120: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63 74              sAct
3130: 69 6f 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63  ion = createFunc
3140: 74 69 6f 6e 28 22 74 70 22 2c 20 73 41 63 74 69  tion("tp", sActi
3150: 6f 6e 49 64 2c 20 73 41 63 74 69 6f 6e 2c 20 54  onId, sAction, T
3160: 72 75 65 29 0a 20 20 20 20 20 20 20 20 65 6c 69  rue).        eli
3170: 66 20 73 41 63 74 69 6f 6e 2e 73 74 61 72 74 73  f sAction.starts
3180: 77 69 74 68 28 27 22 27 29 20 61 6e 64 20 73 41  with('"') and sA
3190: 63 74 69 6f 6e 2e 65 6e 64 73 77 69 74 68 28 27  ction.endswith('
31a0: 22 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "'):.           
31b0: 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69   sAction = sActi
31c0: 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20  on[1:-1].       
31d0: 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69 6f 6e   return [sOption
31e0: 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41  , sCondition, cA
31f0: 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c 20  ction, sAction, 
3200: 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20 69 45  iStartAction, iE
3210: 6e 64 41 63 74 69 6f 6e 2c 20 62 43 61 73 65 53  ndAction, bCaseS
3220: 65 6e 73 69 74 69 76 69 74 79 5d 0a 20 20 20 20  ensitivity].    
3230: 65 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20  elif cAction == 
3240: 22 25 22 20 6f 72 20 63 41 63 74 69 6f 6e 20 3d  "%" or cAction =
3250: 3d 20 22 2f 22 3a 0a 20 20 20 20 20 20 20 20 23  = "/":.        #
3260: 23 20 74 61 67 73 0a 20 20 20 20 20 20 20 20 72  # tags.        r
3270: 65 74 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20  eturn [sOption, 
3280: 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74  sCondition, cAct
3290: 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c 20 69 53  ion, sAction, iS
32a0: 74 61 72 74 41 63 74 69 6f 6e 2c 20 69 45 6e 64  tartAction, iEnd
32b0: 41 63 74 69 6f 6e 5d 0a 20 20 20 20 65 6c 69 66  Action].    elif
32c0: 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22 3d 22 3a   cAction == "=":
32d0: 0a 20 20 20 20 20 20 20 20 23 23 20 64 69 73 61  .        ## disa
32e0: 6d 62 69 67 75 61 74 6f 72 0a 20 20 20 20 20 20  mbiguator.      
32f0: 20 20 69 66 20 22 64 65 66 69 6e 65 28 22 20 69    if "define(" i
3300: 6e 20 73 41 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  n sAction and no
3310: 74 20 72 65 2e 73 65 61 72 63 68 28 72 22 64 65  t re.search(r"de
3320: 66 69 6e 65 5c 28 5c 5c 5c 64 2b 20 2a 2c 20 2a  fine\(\\\d+ *, *
3330: 5c 5b 2e 2a 5c 5d 20 2a 5c 29 22 2c 20 73 41 63  \[.*\] *\)", sAc
3340: 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20 20 20 20  tion):.         
3350: 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f     print("# Erro
3360: 72 20 69 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c  r in action at l
3370: 69 6e 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49  ine " + sActionI
3380: 64 20 2b 20 22 3a 20 73 65 63 6f 6e 64 20 61 72  d + ": second ar
3390: 67 75 6d 65 6e 74 20 66 6f 72 20 3c 64 65 66 69  gument for <defi
33a0: 6e 65 3e 20 6d 75 73 74 20 62 65 20 61 20 6c 69  ne> must be a li
33b0: 73 74 20 6f 66 20 73 74 72 69 6e 67 73 22 29 0a  st of strings").
33c0: 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20          sAction 
33d0: 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  = createFunction
33e0: 28 22 64 61 22 2c 20 73 41 63 74 69 6f 6e 49 64  ("da", sActionId
33f0: 2c 20 73 41 63 74 69 6f 6e 29 0a 20 20 20 20 20  , sAction).     
3400: 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69     return [sOpti
3410: 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20  on, sCondition, 
3420: 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e  cAction, sAction
3430: 5d 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ].    else:.    
3440: 20 20 20 20 70 72 69 6e 74 28 22 20 23 20 55 6e      print(" # Un
3450: 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 2e 22 2c 20  known action.", 
3460: 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20 20 20  sActionId).     
3470: 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 0a     return None..
3480: 0a 64 65 66 20 6d 61 6b 65 20 28 6c 52 75 6c 65  .def make (lRule
3490: 2c 20 64 44 65 66 2c 20 73 4c 61 6e 67 2c 20 64  , dDef, sLang, d
34a0: 4f 70 74 50 72 69 6f 72 69 74 79 2c 20 62 4a 61  OptPriority, bJa
34b0: 76 61 53 63 72 69 70 74 29 3a 0a 20 20 20 20 22  vaScript):.    "
34c0: 63 6f 6d 70 69 6c 65 20 72 75 6c 65 73 2c 20 72  compile rules, r
34d0: 65 74 75 72 6e 73 20 61 20 64 69 63 74 69 6f 6e  eturns a diction
34e0: 61 72 79 20 6f 66 20 76 61 6c 75 65 73 22 0a 20  ary of values". 
34f0: 20 20 20 23 20 66 6f 72 20 63 6c 61 72 69 74 79     # for clarity
3500: 20 70 75 72 70 6f 73 65 2c 20 64 6f 6e e2 80 99   purpose, don...
3510: 74 20 63 72 65 61 74 65 20 61 6e 79 20 66 69 6c  t create any fil
3520: 65 20 68 65 72 65 0a 0a 20 20 20 20 23 20 72 65  e here..    # re
3530: 6d 6f 76 69 6e 67 20 63 6f 6d 6d 65 6e 74 73 2c  moving comments,
3540: 20 7a 65 72 6f 69 6e 67 20 65 6d 70 74 79 20 6c   zeroing empty l
3550: 69 6e 65 73 2c 20 63 72 65 61 74 69 6e 67 20 64  ines, creating d
3560: 65 66 69 6e 69 74 69 6f 6e 73 2c 20 73 74 6f 72  efinitions, stor
3570: 69 6e 67 20 74 65 73 74 73 2c 20 6d 65 72 67 69  ing tests, mergi
3580: 6e 67 20 72 75 6c 65 20 6c 69 6e 65 73 0a 20 20  ng rule lines.  
3590: 20 20 70 72 69 6e 74 28 22 20 20 70 61 72 73 69    print("  parsi
35a0: 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29 0a 20 20  ng rules...").  
35b0: 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 20 3d 20 5b    lTokenLine = [
35c0: 5d 0a 20 20 20 20 73 41 63 74 69 6f 6e 73 20 3d  ].    sActions =
35d0: 20 22 22 0a 20 20 20 20 6e 50 72 69 6f 72 69 74   "".    nPriorit
35e0: 79 20 3d 20 2d 31 0a 20 20 20 20 64 41 6c 6c 47  y = -1.    dAllG
35f0: 72 61 70 68 20 3d 20 7b 7d 0a 20 20 20 20 73 47  raph = {}.    sG
3600: 72 61 70 68 4e 61 6d 65 20 3d 20 22 22 0a 20 20  raphName = "".  
3610: 20 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b 20 3d    iActionBlock =
3620: 20 30 0a 0a 20 20 20 20 66 6f 72 20 69 2c 20 73   0..    for i, s
3630: 4c 69 6e 65 20 69 6e 20 6c 52 75 6c 65 3a 0a 20  Line in lRule:. 
3640: 20 20 20 20 20 20 20 73 4c 69 6e 65 20 3d 20 73         sLine = s
3650: 4c 69 6e 65 2e 72 73 74 72 69 70 28 29 0a 20 20  Line.rstrip().  
3660: 20 20 20 20 20 20 69 66 20 22 5c 74 22 20 69 6e        if "\t" in
3670: 20 73 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20 20   sLine:.        
3680: 20 20 20 20 23 20 74 61 62 75 6c 61 74 69 6f 6e      # tabulation
3690: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 20 20 20   not allowed.   
36a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
36b0: 45 72 72 6f 72 2e 20 54 61 62 75 6c 61 74 69 6f  Error. Tabulatio
36c0: 6e 20 61 74 20 6c 69 6e 65 3a 20 22 2c 20 69 29  n at line: ", i)
36d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69  .            exi
36e0: 74 28 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66  t().        elif
36f0: 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74   sLine.startswit
3700: 68 28 22 40 40 40 40 47 52 41 50 48 3a 20 22 29  h("@@@@GRAPH: ")
3710: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  :.            # 
3720: 72 75 6c 65 73 20 67 72 61 70 68 20 63 61 6c 6c  rules graph call
3730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d  .            m =
3740: 20 72 65 2e 6d 61 74 63 68 28 72 22 40 40 40 40   re.match(r"@@@@
3750: 47 52 41 50 48 3a 20 2a 28 5c 77 2b 29 22 2c 20  GRAPH: *(\w+)", 
3760: 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 29 0a 20  sLine.strip()). 
3770: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6d 3a             if m:
3780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3790: 20 73 47 72 61 70 68 4e 61 6d 65 20 3d 20 6d 2e   sGraphName = m.
37a0: 67 72 6f 75 70 28 31 29 0a 20 20 20 20 20 20 20  group(1).       
37b0: 20 20 20 20 20 20 20 20 20 69 66 20 73 47 72 61           if sGra
37c0: 70 68 4e 61 6d 65 20 69 6e 20 64 41 6c 6c 47 72  phName in dAllGr
37d0: 61 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20  aph:.           
37e0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
37f0: 45 72 72 6f 72 2e 20 47 72 61 70 68 20 6e 61 6d  Error. Graph nam
3800: 65 20 22 20 2b 20 73 47 72 61 70 68 4e 61 6d 65  e " + sGraphName
3810: 20 2b 20 22 20 61 6c 72 65 61 64 79 20 65 78 69   + " already exi
3820: 73 74 73 2e 22 29 0a 20 20 20 20 20 20 20 20 20  sts.").         
3830: 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74 28             exit(
3840: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3850: 20 20 64 41 6c 6c 47 72 61 70 68 5b 73 47 72 61    dAllGraph[sGra
3860: 70 68 4e 61 6d 65 5d 20 3d 20 5b 5d 0a 20 20 20  phName] = [].   
3870: 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20           else:. 
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3890: 72 69 6e 74 28 22 45 72 72 6f 72 2e 20 47 72 61  rint("Error. Gra
38a0: 70 68 20 6e 61 6d 65 20 6e 6f 74 20 66 6f 75 6e  ph name not foun
38b0: 64 20 61 74 20 6c 69 6e 65 22 2c 20 69 29 0a 20  d at line", i). 
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
38d0: 78 69 74 28 29 0a 20 20 20 20 20 20 20 20 65 6c  xit().        el
38e0: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
38f0: 69 74 68 28 22 5f 5f 22 29 20 61 6e 64 20 73 4c  ith("__") and sL
3900: 69 6e 65 2e 65 6e 64 73 77 69 74 68 28 22 5f 5f  ine.endswith("__
3910: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
3920: 23 20 6e 65 77 20 72 75 6c 65 20 67 72 6f 75 70  # new rule group
3930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d  .            m =
3940: 20 72 65 2e 6d 61 74 63 68 28 22 5f 5f 28 5c 5c   re.match("__(\\
3950: 77 2b 29 28 21 5c 5c 64 7c 29 5f 5f 22 2c 20 73  w+)(!\\d|)__", s
3960: 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20  Line).          
3970: 20 20 69 66 20 6d 3a 0a 20 20 20 20 20 20 20 20    if m:.        
3980: 20 20 20 20 20 20 20 20 73 52 75 6c 65 4e 61 6d          sRuleNam
3990: 65 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29 0a 20  e = m.group(1). 
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
39b0: 41 63 74 69 6f 6e 42 6c 6f 63 6b 20 3d 20 31 0a  ActionBlock = 1.
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 6e 50 72 69 6f 72 69 74 79 20 3d 20 69 6e 74 28  nPriority = int(
39e0: 6d 2e 67 72 6f 75 70 28 32 29 5b 31 3a 5d 29 20  m.group(2)[1:]) 
39f0: 69 66 20 6d 2e 67 72 6f 75 70 28 32 29 20 20 65  if m.group(2)  e
3a00: 6c 73 65 20 2d 31 0a 20 20 20 20 20 20 20 20 20  lse -1.         
3a10: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
3a20: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
3a30: 53 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20  Syntax error in 
3a40: 72 75 6c 65 20 67 72 6f 75 70 3a 20 22 2c 20 73  rule group: ", s
3a50: 4c 69 6e 65 2c 20 22 20 2d 2d 20 6c 69 6e 65 3a  Line, " -- line:
3a60: 22 2c 20 69 29 0a 20 20 20 20 20 20 20 20 20 20  ", i).          
3a70: 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20 20        exit().   
3a80: 20 20 20 20 20 65 6c 69 66 20 72 65 2e 73 65 61       elif re.sea
3a90: 72 63 68 28 22 5e 20 20 20 20 2b 3c 3c 2d 20 22  rch("^    +<<- "
3aa0: 2c 20 73 4c 69 6e 65 29 20 6f 72 20 28 73 4c 69  , sLine) or (sLi
3ab0: 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 20  ne.startswith(" 
3ac0: 20 20 20 20 20 20 20 22 29 20 61 6e 64 20 6e 6f         ") and no
3ad0: 74 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69  t sLine.startswi
3ae0: 74 68 28 22 20 20 20 20 20 20 20 20 7c 7c 22 29  th("        ||")
3af0: 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) \.            
3b00: 20 20 20 20 6f 72 20 72 65 2e 73 65 61 72 63 68      or re.search
3b10: 28 22 5e 20 20 20 20 2b 23 22 2c 20 73 4c 69 6e  ("^    +#", sLin
3b20: 65 29 20 6f 72 20 72 65 2e 73 65 61 72 63 68 28  e) or re.search(
3b30: 72 22 5b 2d 7e 3d 3e 2f 25 5d 28 3f 3a 2d 3f 5c  r"[-~=>/%](?:-?\
3b40: 64 5c 2e 3f 28 3f 3a 3a 5c 2e 3f 2d 3f 5c 64 2b  d\.?(?::\.?-?\d+
3b50: 7c 29 7c 29 3e 3e 20 22 2c 20 73 4c 69 6e 65 29  |)|)>> ", sLine)
3b60: 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23   :.            #
3b70: 20 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20   actions.       
3b80: 20 20 20 20 20 73 41 63 74 69 6f 6e 73 20 2b 3d       sActions +=
3b90: 20 22 20 22 20 2b 20 73 4c 69 6e 65 2e 73 74 72   " " + sLine.str
3ba0: 69 70 28 29 0a 20 20 20 20 20 20 20 20 65 6c 69  ip().        eli
3bb0: 66 20 72 65 2e 6d 61 74 63 68 28 22 5b 20 c2 a0  f re.match("[ ..
3bc0: 5d 2a 24 22 2c 20 73 4c 69 6e 65 29 3a 0a 20 20  ]*$", sLine):.  
3bd0: 20 20 20 20 20 20 20 20 20 20 23 20 65 6d 70 74            # empt
3be0: 79 20 6c 69 6e 65 20 74 6f 20 65 6e 64 20 6d 65  y line to end me
3bf0: 72 67 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rging.          
3c00: 20 20 69 66 20 6e 6f 74 20 6c 54 6f 6b 65 6e 4c    if not lTokenL
3c10: 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ine:.           
3c20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20       continue.  
3c30: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
3c40: 20 73 41 63 74 69 6f 6e 73 3a 0a 20 20 20 20 20   sActions:.     
3c50: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
3c60: 28 22 45 72 72 6f 72 2e 20 4e 6f 20 61 63 74 69  ("Error. No acti
3c70: 6f 6e 20 66 6f 75 6e 64 20 61 74 20 6c 69 6e 65  on found at line
3c80: 3a 22 2c 20 69 29 0a 20 20 20 20 20 20 20 20 20  :", i).         
3c90: 20 20 20 20 20 20 20 65 78 69 74 28 29 0a 20 20         exit().  
3ca0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
3cb0: 20 73 47 72 61 70 68 4e 61 6d 65 3a 0a 20 20 20   sGraphName:.   
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
3cd0: 6e 74 28 22 45 72 72 6f 72 2e 20 41 6c 6c 20 72  nt("Error. All r
3ce0: 75 6c 65 73 20 6d 75 73 74 20 62 65 6c 6f 6e 67  ules must belong
3cf0: 20 74 6f 20 61 20 6e 61 6d 65 64 20 67 72 61 70   to a named grap
3d00: 68 2e 20 4c 69 6e 65 3a 20 22 2c 20 69 29 0a 20  h. Line: ", i). 
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
3d20: 78 69 74 28 29 0a 20 20 20 20 20 20 20 20 20 20  xit().          
3d30: 20 20 66 6f 72 20 6a 2c 20 73 54 6f 6b 65 6e 4c    for j, sTokenL
3d40: 69 6e 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e  ine in lTokenLin
3d50: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
3d60: 20 20 20 64 41 6c 6c 47 72 61 70 68 5b 73 47 72     dAllGraph[sGr
3d70: 61 70 68 4e 61 6d 65 5d 2e 61 70 70 65 6e 64 28  aphName].append(
3d80: 28 6a 2c 20 73 52 75 6c 65 4e 61 6d 65 2c 20 73  (j, sRuleName, s
3d90: 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74 69  TokenLine, iActi
3da0: 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f 6e  onBlock, sAction
3db0: 73 2c 20 6e 50 72 69 6f 72 69 74 79 29 29 0a 20  s, nPriority)). 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f 6b 65             lToke
3dd0: 6e 4c 69 6e 65 2e 63 6c 65 61 72 28 29 0a 20 20  nLine.clear().  
3de0: 20 20 20 20 20 20 20 20 20 20 73 41 63 74 69 6f            sActio
3df0: 6e 73 20 3d 20 22 22 0a 20 20 20 20 20 20 20 20  ns = "".        
3e00: 20 20 20 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b      iActionBlock
3e10: 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 65 6c   += 1.        el
3e20: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
3e30: 69 74 68 28 22 20 20 20 20 22 29 3a 0a 20 20 20  ith("    "):.   
3e40: 20 20 20 20 20 20 20 20 20 23 20 74 6f 6b 65 6e           # token
3e50: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4c  s.            sL
3e60: 69 6e 65 20 3d 20 73 4c 69 6e 65 2e 73 74 72 69  ine = sLine.stri
3e70: 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p().            
3e80: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
3e90: 69 74 68 28 22 7c 7c 22 29 3a 0a 20 20 20 20 20  ith("||"):.     
3ea0: 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
3eb0: 4c 69 6e 65 2c 20 73 50 72 65 76 4c 69 6e 65 20  Line, sPrevLine 
3ec0: 3d 20 6c 54 6f 6b 65 6e 4c 69 6e 65 5b 2d 31 5d  = lTokenLine[-1]
3ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ee0: 20 6c 54 6f 6b 65 6e 4c 69 6e 65 5b 2d 31 5d 20   lTokenLine[-1] 
3ef0: 3d 20 5b 69 50 72 65 76 4c 69 6e 65 2c 20 73 50  = [iPrevLine, sP
3f00: 72 65 76 4c 69 6e 65 20 2b 20 22 20 22 20 2b 20  revLine + " " + 
3f10: 73 4c 69 6e 65 5b 32 3a 5d 5d 0a 20 20 20 20 20  sLine[2:]].     
3f20: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f               lTo
3f40: 6b 65 6e 4c 69 6e 65 2e 61 70 70 65 6e 64 28 5b  kenLine.append([
3f50: 69 2c 20 73 4c 69 6e 65 5d 29 0a 20 20 20 20 20  i, sLine]).     
3f60: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
3f70: 20 20 20 20 20 70 72 69 6e 74 28 22 55 6e 6b 6e       print("Unkn
3f80: 6f 77 6e 20 6c 69 6e 65 3a 22 29 0a 20 20 20 20  own line:").    
3f90: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 4c          print(sL
3fa0: 69 6e 65 29 0a 0a 20 20 20 20 23 20 70 72 6f 63  ine)..    # proc
3fb0: 65 73 73 69 6e 67 20 72 75 6c 65 73 0a 20 20 20  essing rules.   
3fc0: 20 70 72 69 6e 74 28 22 20 20 70 72 65 70 61 72   print("  prepar
3fd0: 69 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29 0a 20  ing rules..."). 
3fe0: 20 20 20 66 6f 72 20 73 47 72 61 70 68 4e 61 6d     for sGraphNam
3ff0: 65 2c 20 6c 52 75 6c 65 4c 69 6e 65 20 69 6e 20  e, lRuleLine in 
4000: 64 41 6c 6c 47 72 61 70 68 2e 69 74 65 6d 73 28  dAllGraph.items(
4010: 29 3a 0a 20 20 20 20 20 20 20 20 6c 50 72 65 70  ):.        lPrep
4020: 61 72 65 64 52 75 6c 65 20 3d 20 5b 5d 0a 20 20  aredRule = [].  
4030: 20 20 20 20 20 20 66 6f 72 20 69 2c 20 73 52 75        for i, sRu
4040: 6c 65 47 72 6f 75 70 2c 20 73 54 6f 6b 65 6e 4c  leGroup, sTokenL
4050: 69 6e 65 2c 20 69 41 63 74 69 6f 6e 42 6c 6f 63  ine, iActionBloc
4060: 6b 2c 20 73 41 63 74 69 6f 6e 73 2c 20 6e 50 72  k, sActions, nPr
4070: 69 6f 72 69 74 79 20 69 6e 20 6c 52 75 6c 65 4c  iority in lRuleL
4080: 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ine:.           
4090: 20 66 6f 72 20 6c 52 75 6c 65 20 69 6e 20 63 72   for lRule in cr
40a0: 65 61 74 65 52 75 6c 65 28 69 2c 20 73 52 75 6c  eateRule(i, sRul
40b0: 65 47 72 6f 75 70 2c 20 73 54 6f 6b 65 6e 4c 69  eGroup, sTokenLi
40c0: 6e 65 2c 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b  ne, iActionBlock
40d0: 2c 20 73 41 63 74 69 6f 6e 73 2c 20 6e 50 72 69  , sActions, nPri
40e0: 6f 72 69 74 79 2c 20 64 4f 70 74 50 72 69 6f 72  ority, dOptPrior
40f0: 69 74 79 2c 20 64 44 65 66 29 3a 0a 20 20 20 20  ity, dDef):.    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 72 65              lPre
4110: 70 61 72 65 64 52 75 6c 65 2e 61 70 70 65 6e 64  paredRule.append
4120: 28 6c 52 75 6c 65 29 0a 20 20 20 20 20 20 20 20  (lRule).        
4130: 23 20 47 72 61 70 68 20 63 72 65 61 74 69 6f 6e  # Graph creation
4140: 0a 20 20 20 20 20 20 20 20 6f 44 41 52 47 20 3d  .        oDARG =
4150: 20 64 61 72 67 2e 44 41 52 47 28 6c 50 72 65 70   darg.DARG(lPrep
4160: 61 72 65 64 52 75 6c 65 2c 20 73 4c 61 6e 67 29  aredRule, sLang)
4170: 0a 20 20 20 20 20 20 20 20 64 41 6c 6c 47 72 61  .        dAllGra
4180: 70 68 5b 73 47 72 61 70 68 4e 61 6d 65 5d 20 3d  ph[sGraphName] =
4190: 20 6f 44 41 52 47 2e 63 72 65 61 74 65 47 72 61   oDARG.createGra
41a0: 70 68 28 29 0a 20 20 20 20 20 20 20 20 23 20 44  ph().        # D
41b0: 65 62 75 67 67 69 6e 67 0a 20 20 20 20 20 20 20  ebugging.       
41c0: 20 69 66 20 46 61 6c 73 65 3a 0a 20 20 20 20 20   if False:.     
41d0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e         print("\n
41e0: 52 55 4c 45 53 3a 22 29 0a 20 20 20 20 20 20 20  RULES:").       
41f0: 20 20 20 20 20 66 6f 72 20 65 20 69 6e 20 6c 50       for e in lP
4200: 72 65 70 61 72 65 64 52 75 6c 65 3a 0a 20 20 20  reparedRule:.   
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4220: 65 5b 2d 32 5d 20 3d 3d 20 22 23 23 32 32 31 31  e[-2] == "##2211
4230: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
4240: 20 20 20 20 20 20 20 70 72 69 6e 74 28 65 29 0a         print(e).
4250: 20 20 20 20 20 20 20 20 69 66 20 46 61 6c 73 65          if False
4260: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
4270: 69 6e 74 28 22 5c 6e 47 52 41 50 48 3a 22 2c 20  int("\nGRAPH:", 
4280: 73 47 72 61 70 68 4e 61 6d 65 29 0a 20 20 20 20  sGraphName).    
4290: 20 20 20 20 20 20 20 20 66 6f 72 20 6b 2c 20 76          for k, v
42a0: 20 69 6e 20 64 41 6c 6c 47 72 61 70 68 5b 73 47   in dAllGraph[sG
42b0: 72 61 70 68 4e 61 6d 65 5d 2e 69 74 65 6d 73 28  raphName].items(
42c0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
42d0: 20 20 20 70 72 69 6e 74 28 6b 2c 20 22 5c 74 22     print(k, "\t"
42e0: 2c 20 76 29 0a 0a 20 20 20 20 23 20 63 72 65 61  , v)..    # crea
42f0: 74 69 6e 67 20 66 69 6c 65 20 77 69 74 68 20 61  ting file with a
4300: 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6c  ll functions cal
4310: 6c 61 62 6c 65 20 62 79 20 72 75 6c 65 73 0a 20  lable by rules. 
4320: 20 20 20 70 72 69 6e 74 28 22 20 20 63 72 65 61     print("  crea
4330: 74 69 6e 67 20 63 61 6c 6c 61 62 6c 65 73 2e 2e  ting callables..
4340: 2e 22 29 0a 20 20 20 20 73 50 79 43 61 6c 6c 61  .").    sPyCalla
4350: 62 6c 65 73 20 3d 20 22 23 20 67 65 6e 65 72 61  bles = "# genera
4360: 74 65 64 20 63 6f 64 65 2c 20 64 6f 20 6e 6f 74  ted code, do not
4370: 20 65 64 69 74 5c 6e 22 0a 20 20 20 20 23 73 4a   edit\n".    #sJ
4380: 53 43 61 6c 6c 61 62 6c 65 73 20 3d 20 22 2f 2f  SCallables = "//
4390: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2c   generated code,
43a0: 20 64 6f 20 6e 6f 74 20 65 64 69 74 5c 6e 63 6f   do not edit\nco
43b0: 6e 73 74 20 6f 45 76 61 6c 46 75 6e 63 20 3d 20  nst oEvalFunc = 
43c0: 7b 5c 6e 22 0a 20 20 20 20 66 6f 72 20 73 46 75  {\n".    for sFu
43d0: 6e 63 4e 61 6d 65 2c 20 73 52 65 74 75 72 6e 20  ncName, sReturn 
43e0: 69 6e 20 64 46 55 4e 43 54 49 4f 4e 53 2e 69 74  in dFUNCTIONS.it
43f0: 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20 20 69  ems():.        i
4400: 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72  f sFuncName.star
4410: 74 73 77 69 74 68 28 22 5f 67 5f 63 6f 6e 64 5f  tswith("_g_cond_
4420: 22 29 3a 20 23 20 63 6f 6e 64 69 74 69 6f 6e 0a  "): # condition.
4430: 20 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72              sPar
4440: 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e  ams = "lToken, n
4450: 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61  TokenOffset, nLa
4460: 73 74 54 6f 6b 65 6e 2c 20 73 43 6f 75 6e 74 72  stToken, sCountr
4470: 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 2c 20 64 54  y, bCondMemo, dT
4480: 61 67 73 2c 20 73 53 65 6e 74 65 6e 63 65 2c 20  ags, sSentence, 
4490: 73 53 65 6e 74 65 6e 63 65 30 22 0a 20 20 20 20  sSentence0".    
44a0: 20 20 20 20 65 6c 69 66 20 73 46 75 6e 63 4e 61      elif sFuncNa
44b0: 6d 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 67  me.startswith("g
44c0: 5f 6d 73 67 5f 22 29 3a 20 23 20 6d 65 73 73 61  _msg_"): # messa
44d0: 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ge.            s
44e0: 50 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e  Params = "lToken
44f0: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 22 0a  , nTokenOffset".
4500: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 46 75          elif sFu
4510: 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73 77 69 74  ncName.startswit
4520: 68 28 22 5f 67 5f 73 75 67 67 5f 22 29 3a 20 23  h("_g_sugg_"): #
4530: 20 73 75 67 67 65 73 74 69 6f 6e 0a 20 20 20 20   suggestion.    
4540: 20 20 20 20 20 20 20 20 73 50 61 72 61 6d 73 20          sParams 
4550: 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  = "lToken, nToke
4560: 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f  nOffset, nLastTo
4570: 6b 65 6e 22 0a 20 20 20 20 20 20 20 20 65 6c 69  ken".        eli
4580: 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72  f sFuncName.star
4590: 74 73 77 69 74 68 28 22 5f 67 5f 74 70 5f 22 29  tswith("_g_tp_")
45a0: 3a 20 23 20 74 65 78 74 20 70 72 65 70 72 6f 63  : # text preproc
45b0: 65 73 73 6f 72 0a 20 20 20 20 20 20 20 20 20 20  essor.          
45c0: 20 20 73 50 61 72 61 6d 73 20 3d 20 22 6c 54 6f    sParams = "lTo
45d0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  ken, nTokenOffse
45e0: 74 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  t".        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 64 61 5f 22 29 3a 20  with("_g_da_"): 
4610: 23 20 64 69 73 61 6d 62 69 67 75 61 74 6f 72 0a  # disambiguator.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72              sPar
4630: 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e  ams = "lToken, n
4640: 54 6f 6b 65 6e 4f 66 66 73 65 74 22 0a 20 20 20  TokenOffset".   
4650: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
4660: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
4670: 55 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  Unknown function
4680: 20 74 79 70 65 20 69 6e 20 5b 22 20 2b 20 73 46   type in [" + sF
4690: 75 6e 63 4e 61 6d 65 20 2b 20 22 5d 22 29 0a 20  uncName + "]"). 
46a0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
46b0: 6e 75 65 0a 20 20 20 20 20 20 20 20 73 50 79 43  nue.        sPyC
46c0: 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 64 65 66  allables += "def
46d0: 20 7b 7d 20 28 7b 7d 29 3a 5c 6e 22 2e 66 6f 72   {} ({}):\n".for
46e0: 6d 61 74 28 73 46 75 6e 63 4e 61 6d 65 2c 20 73  mat(sFuncName, s
46f0: 50 61 72 61 6d 73 29 0a 20 20 20 20 20 20 20 20  Params).        
4700: 73 50 79 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20  sPyCallables += 
4710: 22 20 20 20 20 72 65 74 75 72 6e 20 22 20 2b 20  "    return " + 
4720: 73 52 65 74 75 72 6e 20 2b 20 22 5c 6e 22 0a 20  sReturn + "\n". 
4730: 20 20 20 20 20 20 20 23 73 4a 53 43 61 6c 6c 61         #sJSCalla
4740: 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 7b 7d 3a  bles += "    {}:
4750: 20 66 75 6e 63 74 69 6f 6e 20 28 7b 7d 29 22 2e   function ({})".
4760: 66 6f 72 6d 61 74 28 73 46 75 6e 63 4e 61 6d 65  format(sFuncName
4770: 2c 20 73 50 61 72 61 6d 73 29 20 2b 20 22 20 7b  , sParams) + " {
4780: 5c 6e 22 0a 20 20 20 20 20 20 20 20 23 73 4a 53  \n".        #sJS
4790: 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20  Callables += "  
47a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 20 2b        return " +
47b0: 20 6a 73 63 6f 6e 76 2e 70 79 32 6a 73 28 73 52   jsconv.py2js(sR
47c0: 65 74 75 72 6e 29 20 2b 20 22 3b 5c 6e 22 0a 20  eturn) + ";\n". 
47d0: 20 20 20 20 20 20 20 23 73 4a 53 43 61 6c 6c 61         #sJSCalla
47e0: 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 7d 2c 5c  bles += "    },\
47f0: 6e 22 0a 20 20 20 20 23 73 4a 53 43 61 6c 6c 61  n".    #sJSCalla
4800: 62 6c 65 73 20 2b 3d 20 22 7d 5c 6e 22 0a 0a 20  bles += "}\n".. 
4810: 20 20 20 23 20 44 65 62 75 67 67 69 6e 67 0a 20     # Debugging. 
4820: 20 20 20 69 66 20 46 61 6c 73 65 3a 0a 20 20 20     if False:.   
4830: 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e 41 63       print("\nAc
4840: 74 69 6f 6e 73 3a 22 29 0a 20 20 20 20 20 20 20  tions:").       
4850: 20 66 6f 72 20 73 41 63 74 69 6f 6e 4e 61 6d 65   for sActionName
4860: 2c 20 61 41 63 74 69 6f 6e 20 69 6e 20 64 41 43  , aAction in dAC
4870: 54 49 4f 4e 53 2e 69 74 65 6d 73 28 29 3a 0a 20  TIONS.items():. 
4880: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
4890: 28 73 41 63 74 69 6f 6e 4e 61 6d 65 2c 20 61 41  (sActionName, aA
48a0: 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 70  ction).        p
48b0: 72 69 6e 74 28 22 5c 6e 46 75 6e 63 74 69 6f 6e  rint("\nFunction
48c0: 73 3a 22 29 0a 20 20 20 20 20 20 20 20 70 72 69  s:").        pri
48d0: 6e 74 28 73 50 79 43 61 6c 6c 61 62 6c 65 73 29  nt(sPyCallables)
48e0: 0a 0a 20 20 20 20 23 20 52 65 73 75 6c 74 0a 20  ..    # Result. 
48f0: 20 20 20 72 65 74 75 72 6e 20 7b 0a 20 20 20 20     return {.    
4900: 20 20 20 20 22 67 72 61 70 68 5f 63 61 6c 6c 61      "graph_calla
4910: 62 6c 65 73 22 3a 20 73 50 79 43 61 6c 6c 61 62  bles": sPyCallab
4920: 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 22 72 75  les,.        "ru
4930: 6c 65 73 5f 67 72 61 70 68 73 22 3a 20 64 41 6c  les_graphs": dAl
4940: 6c 47 72 61 70 68 2c 0a 20 20 20 20 20 20 20 20  lGraph,.        
4950: 22 72 75 6c 65 73 5f 61 63 74 69 6f 6e 73 22 3a  "rules_actions":
4960: 20 64 41 43 54 49 4f 4e 53 0a 20 20 20 20 7d 0a   dACTIONS.    }.