Grammalecte  Hex Artifact Content

Artifact f91ed363c6420858eb1e722b5345d188b3229a3fa9678cad47b8b031d9f94ee5:


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 41 63 74  ode).    if sAct
0170: 69 6f 6e 49 64 20 6e 6f 74 20 69 6e 20 64 46 55  ionId not in dFU
0180: 4e 43 4e 41 4d 45 3a 0a 20 20 20 20 20 20 20 20  NCNAME:.        
0190: 64 46 55 4e 43 4e 41 4d 45 5b 73 41 63 74 69 6f  dFUNCNAME[sActio
01a0: 6e 49 64 5d 20 3d 20 7b 7d 0a 20 20 20 20 69 66  nId] = {}.    if
01b0: 20 73 43 6f 64 65 20 6e 6f 74 20 69 6e 20 64 46   sCode not in dF
01c0: 55 4e 43 4e 41 4d 45 5b 73 41 63 74 69 6f 6e 49  UNCNAME[sActionI
01d0: 64 5d 3a 0a 20 20 20 20 20 20 20 20 64 46 55 4e  d]:.        dFUN
01e0: 43 4e 41 4d 45 5b 73 41 63 74 69 6f 6e 49 64 5d  CNAME[sActionId]
01f0: 5b 73 43 6f 64 65 5d 20 3d 20 6c 65 6e 28 64 46  [sCode] = len(dF
0200: 55 4e 43 4e 41 4d 45 5b 73 41 63 74 69 6f 6e 49  UNCNAME[sActionI
0210: 64 5d 29 2b 31 0a 20 20 20 20 73 46 75 6e 63 4e  d])+1.    sFuncN
0220: 61 6d 65 20 3d 20 22 5f 67 5f 22 20 2b 20 73 54  ame = "_g_" + sT
0230: 79 70 65 20 2b 20 22 5f 22 20 2b 20 73 41 63 74  ype + "_" + sAct
0240: 69 6f 6e 49 64 20 2b 20 22 5f 22 20 2b 20 73 74  ionId + "_" + st
0250: 72 28 64 46 55 4e 43 4e 41 4d 45 5b 73 41 63 74  r(dFUNCNAME[sAct
0260: 69 6f 6e 49 64 5d 5b 73 43 6f 64 65 5d 29 0a 20  ionId][sCode]). 
0270: 20 20 20 64 46 55 4e 43 54 49 4f 4e 53 5b 73 46     dFUNCTIONS[sF
0280: 75 6e 63 4e 61 6d 65 5d 20 3d 20 73 43 6f 64 65  uncName] = sCode
0290: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 46 75 6e  .    return sFun
02a0: 63 4e 61 6d 65 20 20 69 66 20 6e 6f 74 20 62 53  cName  if not bS
02b0: 74 61 72 74 57 69 74 68 45 71 75 61 6c 20 20 65  tartWithEqual  e
02c0: 6c 73 65 20 22 3d 22 2b 73 46 75 6e 63 4e 61 6d  lse "="+sFuncNam
02d0: 65 0a 0a 0a 64 65 66 20 70 72 65 70 61 72 65 46  e...def prepareF
02e0: 75 6e 63 74 69 6f 6e 20 28 73 29 3a 0a 20 20 20  unction (s):.   
02f0: 20 22 63 6f 6e 76 65 72 74 20 73 69 6d 70 6c 65   "convert simple
0300: 20 72 75 6c 65 20 73 79 6e 74 61 78 20 74 6f 20   rule syntax to 
0310: 61 20 73 74 72 69 6e 67 20 6f 66 20 50 79 74 68  a string of Pyth
0320: 6f 6e 20 63 6f 64 65 22 0a 20 20 20 20 69 66 20  on code".    if 
0330: 73 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20  s[0:1] == "=":. 
0340: 20 20 20 20 20 20 20 73 20 3d 20 73 5b 31 3a 5d         s = s[1:]
0350: 0a 20 20 20 20 73 20 3d 20 73 2e 72 65 70 6c 61  .    s = s.repla
0360: 63 65 28 22 5f 5f 61 6c 73 6f 5f 5f 22 2c 20 22  ce("__also__", "
0370: 62 43 6f 6e 64 4d 65 6d 6f 22 29 0a 20 20 20 20  bCondMemo").    
0380: 73 20 3d 20 73 2e 72 65 70 6c 61 63 65 28 22 5f  s = s.replace("_
0390: 5f 65 6c 73 65 5f 5f 22 2c 20 22 6e 6f 74 20 62  _else__", "not b
03a0: 43 6f 6e 64 4d 65 6d 6f 22 29 0a 20 20 20 20 73  CondMemo").    s
03b0: 20 3d 20 73 2e 72 65 70 6c 61 63 65 28 22 73 43   = s.replace("sC
03c0: 6f 6e 74 65 78 74 22 2c 20 22 5f 73 41 70 70 43  ontext", "_sAppC
03d0: 6f 6e 74 65 78 74 22 29 0a 20 20 20 20 73 20 3d  ontext").    s =
03e0: 20 72 65 2e 73 75 62 28 72 22 28 6d 6f 72 70 68   re.sub(r"(morph
03f0: 7c 6d 6f 72 70 68 56 43 7c 61 6e 61 6c 79 73 65  |morphVC|analyse
0400: 7c 76 61 6c 75 65 7c 64 69 73 70 6c 61 79 49 6e  |value|displayIn
0410: 66 6f 29 5b 28 5d 5c 5c 28 5c 64 2b 29 22 2c 20  fo)[(]\\(\d+)", 
0420: 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 54  'g_\\1(lToken[nT
0430: 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 32 5d 27  okenOffset+\\2]'
0440: 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  , s).    s = re.
0450: 73 75 62 28 72 22 28 6d 6f 72 70 68 7c 6d 6f 72  sub(r"(morph|mor
0460: 70 68 56 43 7c 61 6e 61 6c 79 73 65 7c 76 61 6c  phVC|analyse|val
0470: 75 65 7c 64 69 73 70 6c 61 79 49 6e 66 6f 29 5b  ue|displayInfo)[
0480: 28 5d 5c 5c 2d 28 5c 64 2b 29 22 2c 20 27 67 5f  (]\\-(\d+)", 'g_
0490: 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74  \\1(lToken[nLast
04a0: 54 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 27 2c 20 73  Token-\\2+1]', s
04b0: 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62  ).    s = re.sub
04c0: 28 72 22 28 73 65 6c 65 63 74 7c 65 78 63 6c 75  (r"(select|exclu
04d0: 64 65 7c 64 65 66 69 6e 65 7c 64 65 66 69 6e 65  de|define|define
04e0: 5f 66 72 6f 6d 29 5b 28 5d 5b 5c 5c 5d 28 5c 64  _from)[(][\\](\d
04f0: 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b  +)", 'g_\\1(lTok
0500: 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b  en[nTokenOffset+
0510: 5c 5c 32 5d 27 2c 20 73 29 0a 20 20 20 20 73 20  \\2]', s).    s 
0520: 3d 20 72 65 2e 73 75 62 28 72 22 28 73 65 6c 65  = re.sub(r"(sele
0530: 63 74 7c 65 78 63 6c 75 64 65 7c 64 65 66 69 6e  ct|exclude|defin
0540: 65 7c 64 65 66 69 6e 65 5f 66 72 6f 6d 29 5b 28  e|define_from)[(
0550: 5d 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 67  ][\\]-(\d+)", 'g
0560: 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73  _\\1(lToken[nLas
0570: 74 54 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 27 2c 20  tToken-\\2+1]', 
0580: 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  s).    s = re.su
0590: 62 28 72 22 28 74 61 67 5f 62 65 66 6f 72 65 7c  b(r"(tag_before|
05a0: 74 61 67 5f 61 66 74 65 72 29 5b 28 5d 5b 5c 5c  tag_after)[(][\\
05b0: 5d 28 5c 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28  ](\d+)", 'g_\\1(
05c0: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66  lToken[nTokenOff
05d0: 73 65 74 2b 5c 5c 32 5d 2c 20 64 54 61 67 73 27  set+\\2], dTags'
05e0: 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  , s).    s = re.
05f0: 73 75 62 28 72 22 28 74 61 67 5f 62 65 66 6f 72  sub(r"(tag_befor
0600: 65 7c 74 61 67 5f 61 66 74 65 72 29 5b 28 5d 5b  e|tag_after)[(][
0610: 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 67 5f 5c  \\]-(\d+)", 'g_\
0620: 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  \1(lToken[nLastT
0630: 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 2c 20 64 54 61  oken-\\2+1], dTa
0640: 67 73 27 2c 20 73 29 0a 20 20 20 20 73 20 3d 20  gs', s).    s = 
0650: 72 65 2e 73 75 62 28 72 22 73 70 61 63 65 5f 61  re.sub(r"space_a
0660: 66 74 65 72 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29  fter[(][\\](\d+)
0670: 22 2c 20 27 67 5f 73 70 61 63 65 5f 62 65 74 77  ", 'g_space_betw
0680: 65 65 6e 5f 74 6f 6b 65 6e 73 28 6c 54 6f 6b 65  een_tokens(lToke
0690: 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c  n[nTokenOffset+\
06a0: 5c 31 5d 2c 20 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b  \1], lToken[nTok
06b0: 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 2b 31 5d 27  enOffset+\\1+1]'
06c0: 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  , s).    s = re.
06d0: 73 75 62 28 72 22 73 70 61 63 65 5f 61 66 74 65  sub(r"space_afte
06e0: 72 5b 28 5d 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c  r[(][\\]-(\d+)",
06f0: 20 27 67 5f 73 70 61 63 65 5f 62 65 74 77 65 65   'g_space_betwee
0700: 6e 5f 74 6f 6b 65 6e 73 28 6c 54 6f 6b 65 6e 5b  n_tokens(lToken[
0710: 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c 5c 31 2b 31  nLastToken-\\1+1
0720: 5d 2c 20 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  ], lToken[nLastT
0730: 6f 6b 65 6e 2d 5c 5c 31 2b 32 5d 27 2c 20 73 29  oken-\\1+2]', s)
0740: 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28  .    s = re.sub(
0750: 72 22 61 6e 61 6c 79 73 65 5f 77 69 74 68 5f 6e  r"analyse_with_n
0760: 65 78 74 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29 22  ext[(][\\](\d+)"
0770: 2c 20 27 67 5f 6d 65 72 67 65 64 5f 61 6e 61 6c  , 'g_merged_anal
0780: 79 73 65 28 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  yse(lToken[nToke
0790: 6e 4f 66 66 73 65 74 2b 5c 5c 31 5d 2c 20 6c 54  nOffset+\\1], lT
07a0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65  oken[nTokenOffse
07b0: 74 2b 5c 5c 31 2b 31 5d 27 2c 20 73 29 0a 20 20  t+\\1+1]', s).  
07c0: 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22 61    s = re.sub(r"a
07d0: 6e 61 6c 79 73 65 5f 77 69 74 68 5f 6e 65 78 74  nalyse_with_next
07e0: 5b 28 5d 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20  [(][\\]-(\d+)", 
07f0: 27 67 5f 6d 65 72 67 65 64 5f 61 6e 61 6c 79 73  'g_merged_analys
0800: 65 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f  e(lToken[nLastTo
0810: 6b 65 6e 2d 5c 5c 31 2b 31 5d 2c 20 6c 54 6f 6b  ken-\\1+1], lTok
0820: 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c 5c  en[nLastToken-\\
0830: 31 2b 32 5d 27 2c 20 73 29 0a 20 20 20 20 73 20  1+2]', s).    s 
0840: 3d 20 72 65 2e 73 75 62 28 72 22 28 6d 6f 72 70  = re.sub(r"(morp
0850: 68 7c 61 6e 61 6c 79 73 65 7c 76 61 6c 75 65 29  h|analyse|value)
0860: 5c 28 3e 31 22 2c 20 27 67 5f 5c 5c 31 28 6c 54  \(>1", 'g_\\1(lT
0870: 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2b  oken[nLastToken+
0880: 31 5d 27 2c 20 73 29 20 20 20 20 20 20 20 20 20  1]', s)         
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
08a0: 6e 65 78 74 20 74 6f 6b 65 6e 0a 20 20 20 20 73  next token.    s
08b0: 20 3d 20 72 65 2e 73 75 62 28 72 22 28 6d 6f 72   = re.sub(r"(mor
08c0: 70 68 7c 61 6e 61 6c 79 73 65 7c 76 61 6c 75 65  ph|analyse|value
08d0: 29 5c 28 3c 31 22 2c 20 27 67 5f 5c 5c 31 28 6c  )\(<1", 'g_\\1(l
08e0: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73  Token[nTokenOffs
08f0: 65 74 5d 27 2c 20 73 29 20 20 20 20 20 20 20 20  et]', s)        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
0910: 20 70 72 65 76 69 6f 75 73 20 74 6f 6b 65 6e 0a   previous token.
0920: 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72      s = re.sub(r
0930: 22 28 6d 6f 72 70 68 7c 61 6e 61 6c 79 73 65 7c  "(morph|analyse|
0940: 76 61 6c 75 65 29 5c 28 3e 28 5c 64 2b 29 22 2c  value)\(>(\d+)",
0950: 20 27 67 5f 5c 5c 31 28 67 5f 74 6f 6b 65 6e 28   'g_\\1(g_token(
0960: 6c 54 6f 6b 65 6e 2c 20 6e 4c 61 73 74 54 6f 6b  lToken, nLastTok
0970: 65 6e 2b 5c 5c 32 29 27 2c 20 73 29 20 20 20 20  en+\\2)', s)    
0980: 20 20 20 20 20 20 23 20 6e 65 78 74 20 74 6f 6b        # next tok
0990: 65 6e 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  en.    s = re.su
09a0: 62 28 72 22 28 6d 6f 72 70 68 7c 61 6e 61 6c 79  b(r"(morph|analy
09b0: 73 65 7c 76 61 6c 75 65 29 5c 28 3c 28 5c 64 2b  se|value)\(<(\d+
09c0: 29 22 2c 20 27 67 5f 5c 5c 31 28 67 5f 74 6f 6b  )", 'g_\\1(g_tok
09d0: 65 6e 28 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(lToken, nToke
09e0: 6e 4f 66 66 73 65 74 2b 31 2d 5c 5c 32 29 27 2c  nOffset+1-\\2)',
09f0: 20 73 29 20 20 20 20 20 20 23 20 70 72 65 76 69   s)      # previ
0a00: 6f 75 73 20 74 6f 6b 65 6e 0a 20 20 20 20 73 20  ous token.    s 
0a10: 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 73 70 65  = re.sub(r"\bspe
0a20: 6c 6c 20 2a 5b 28 5d 22 2c 20 27 5f 6f 53 70 65  ll *[(]", '_oSpe
0a30: 6c 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69  llChecker.isVali
0a40: 64 28 27 2c 20 73 29 0a 20 20 20 20 73 20 3d 20  d(', s).    s = 
0a50: 72 65 2e 73 75 62 28 72 22 5c 62 62 65 66 6f 72  re.sub(r"\bbefor
0a60: 65 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73  e\(\s*", 'look(s
0a70: 53 65 6e 74 65 6e 63 65 5b 3a 6c 54 6f 6b 65 6e  Sentence[:lToken
0a80: 5b 31 2b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 5d  [1+nTokenOffset]
0a90: 5b 22 6e 53 74 61 72 74 22 5d 5d 2c 20 27 2c 20  ["nStart"]], ', 
0aa0: 73 29 20 20 20 20 20 20 20 20 20 20 23 20 62 65  s)          # be
0ab0: 66 6f 72 65 28 73 29 0a 20 20 20 20 73 20 3d 20  fore(s).    s = 
0ac0: 72 65 2e 73 75 62 28 72 22 5c 62 61 66 74 65 72  re.sub(r"\bafter
0ad0: 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73 53  \(\s*", 'look(sS
0ae0: 65 6e 74 65 6e 63 65 5b 6c 54 6f 6b 65 6e 5b 6e  entence[lToken[n
0af0: 4c 61 73 74 54 6f 6b 65 6e 5d 5b 22 6e 45 6e 64  LastToken]["nEnd
0b00: 22 5d 3a 5d 2c 20 27 2c 20 73 29 20 20 20 20 20  "]:], ', s)     
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 61 66              # af
0b20: 74 65 72 28 73 29 0a 20 20 20 20 73 20 3d 20 72  ter(s).    s = r
0b30: 65 2e 73 75 62 28 72 22 5c 62 62 65 66 6f 72 65  e.sub(r"\bbefore
0b40: 30 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73  0\(\s*", 'look(s
0b50: 53 65 6e 74 65 6e 63 65 30 5b 3a 6c 54 6f 6b 65  Sentence0[:lToke
0b60: 6e 5b 31 2b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  n[1+nTokenOffset
0b70: 5d 5b 22 6e 53 74 61 72 74 22 5d 5d 2c 20 27 2c  ]["nStart"]], ',
0b80: 20 73 29 20 20 20 20 20 20 20 20 23 20 62 65 66   s)        # bef
0b90: 6f 72 65 30 28 73 29 0a 20 20 20 20 73 20 3d 20  ore0(s).    s = 
0ba0: 72 65 2e 73 75 62 28 72 22 5c 62 61 66 74 65 72  re.sub(r"\bafter
0bb0: 30 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73  0\(\s*", 'look(s
0bc0: 53 65 6e 74 65 6e 63 65 5b 6c 54 6f 6b 65 6e 5b  Sentence[lToken[
0bd0: 6e 4c 61 73 74 54 6f 6b 65 6e 5d 5b 22 6e 45 6e  nLastToken]["nEn
0be0: 64 22 5d 3a 5d 2c 20 27 2c 20 73 29 20 20 20 20  d"]:], ', s)    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 61 66              # af
0c00: 74 65 72 30 28 73 29 0a 20 20 20 20 73 20 3d 20  ter0(s).    s = 
0c10: 72 65 2e 73 75 62 28 72 22 5b 5c 5c 5d 28 5c 64  re.sub(r"[\\](\d
0c20: 2b 29 22 2c 20 27 6c 54 6f 6b 65 6e 5b 6e 54 6f  +)", 'lToken[nTo
0c30: 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 5d 5b 22  kenOffset+\\1]["
0c40: 73 56 61 6c 75 65 22 5d 27 2c 20 73 29 0a 20 20  sValue"]', s).  
0c50: 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22 5b    s = re.sub(r"[
0c60: 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 6c 54 6f  \\]-(\d+)", 'lTo
0c70: 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c  ken[nLastToken-\
0c80: 5c 31 2b 31 5d 5b 22 73 56 61 6c 75 65 22 5d 27  \1+1]["sValue"]'
0c90: 2c 20 73 29 0a 20 20 20 20 72 65 74 75 72 6e 20  , s).    return 
0ca0: 73 0a 0a 0a 64 65 66 20 67 65 6e 54 6f 6b 65 6e  s...def genToken
0cb0: 4c 69 6e 65 73 20 28 73 54 6f 6b 65 6e 4c 69 6e  Lines (sTokenLin
0cc0: 65 2c 20 64 44 65 66 29 3a 0a 20 20 20 20 22 74  e, dDef):.    "t
0cd0: 6f 6b 65 6e 69 7a 65 20 61 20 73 74 72 69 6e 67  okenize a string
0ce0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6c 69   and return a li
0cf0: 73 74 20 6f 66 20 6c 69 6e 65 73 20 6f 66 20 74  st of lines of t
0d00: 6f 6b 65 6e 73 22 0a 20 20 20 20 6c 54 6f 6b 65  okens".    lToke
0d10: 6e 20 3d 20 73 54 6f 6b 65 6e 4c 69 6e 65 2e 73  n = sTokenLine.s
0d20: 70 6c 69 74 28 29 0a 20 20 20 20 6c 54 6f 6b 65  plit().    lToke
0d30: 6e 4c 69 6e 65 73 20 3d 20 4e 6f 6e 65 0a 20 20  nLines = None.  
0d40: 20 20 66 6f 72 20 73 54 6f 6b 65 6e 20 69 6e 20    for sToken in 
0d50: 6c 54 6f 6b 65 6e 3a 0a 20 20 20 20 20 20 20 20  lToken:.        
0d60: 23 20 6f 70 74 69 6f 6e 61 6c 20 74 6f 6b 65 6e  # optional token
0d70: 3f 0a 20 20 20 20 20 20 20 20 62 4e 75 6c 6c 50  ?.        bNullP
0d80: 6f 73 73 69 62 6c 65 20 3d 20 73 54 6f 6b 65 6e  ossible = sToken
0d90: 2e 73 74 61 72 74 73 77 69 74 68 28 22 3f 22 29  .startswith("?")
0da0: 20 61 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73   and sToken.ends
0db0: 77 69 74 68 28 22 c2 bf 22 29 0a 20 20 20 20 20  with("..").     
0dc0: 20 20 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69     if bNullPossi
0dd0: 62 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ble:.           
0de0: 20 73 54 6f 6b 65 6e 20 3d 20 73 54 6f 6b 65 6e   sToken = sToken
0df0: 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20 23  [1:-1].        #
0e00: 20 74 6f 6b 65 6e 20 77 69 74 68 20 64 65 66 69   token with defi
0e10: 6e 69 74 69 6f 6e 3f 0a 20 20 20 20 20 20 20 20  nition?.        
0e20: 69 66 20 73 54 6f 6b 65 6e 2e 73 74 61 72 74 73  if sToken.starts
0e30: 77 69 74 68 28 22 28 7b 22 29 20 61 6e 64 20 73  with("({") and s
0e40: 54 6f 6b 65 6e 2e 65 6e 64 73 77 69 74 68 28 22  Token.endswith("
0e50: 7d 29 22 29 20 61 6e 64 20 73 54 6f 6b 65 6e 5b  })") and sToken[
0e60: 31 3a 2d 31 5d 20 69 6e 20 64 44 65 66 3a 0a 20  1:-1] in dDef:. 
0e70: 20 20 20 20 20 20 20 20 20 20 20 73 54 6f 6b 65             sToke
0e80: 6e 20 3d 20 22 28 22 20 2b 20 64 44 65 66 5b 73  n = "(" + dDef[s
0e90: 54 6f 6b 65 6e 5b 31 3a 2d 31 5d 5d 20 2b 20 22  Token[1:-1]] + "
0ea0: 29 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  )".        elif 
0eb0: 73 54 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74  sToken.startswit
0ec0: 68 28 22 7b 22 29 20 61 6e 64 20 73 54 6f 6b 65  h("{") and sToke
0ed0: 6e 2e 65 6e 64 73 77 69 74 68 28 22 7d 22 29 20  n.endswith("}") 
0ee0: 61 6e 64 20 73 54 6f 6b 65 6e 20 69 6e 20 64 44  and sToken in dD
0ef0: 65 66 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ef:.            
0f00: 73 54 6f 6b 65 6e 20 3d 20 64 44 65 66 5b 73 54  sToken = dDef[sT
0f10: 6f 6b 65 6e 5d 0a 20 20 20 20 20 20 20 20 69 66  oken].        if
0f20: 20 28 20 28 73 54 6f 6b 65 6e 2e 73 74 61 72 74   ( (sToken.start
0f30: 73 77 69 74 68 28 22 5b 22 29 20 61 6e 64 20 73  swith("[") and s
0f40: 54 6f 6b 65 6e 2e 65 6e 64 73 77 69 74 68 28 22  Token.endswith("
0f50: 5d 22 29 29 20 6f 72 20 28 73 54 6f 6b 65 6e 2e  ]")) or (sToken.
0f60: 73 74 61 72 74 73 77 69 74 68 28 22 28 5b 22 29  startswith("([")
0f70: 20 61 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73   and sToken.ends
0f80: 77 69 74 68 28 22 5d 29 22 29 29 20 29 3a 0a 20  with("])")) ):. 
0f90: 20 20 20 20 20 20 20 20 20 20 20 23 20 6d 75 6c             # mul
0fa0: 74 69 70 6c 65 20 74 6f 6b 65 6e 0a 20 20 20 20  tiple token.    
0fb0: 20 20 20 20 20 20 20 20 62 53 65 6c 65 63 74 65          bSelecte
0fc0: 64 47 72 6f 75 70 20 3d 20 73 54 6f 6b 65 6e 2e  dGroup = sToken.
0fd0: 73 74 61 72 74 73 77 69 74 68 28 22 28 22 29 20  startswith("(") 
0fe0: 61 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73 77  and sToken.endsw
0ff0: 69 74 68 28 22 29 22 29 0a 20 20 20 20 20 20 20  ith(")").       
1000: 20 20 20 20 20 69 66 20 62 53 65 6c 65 63 74 65       if bSelecte
1010: 64 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20 20  dGroup:.        
1020: 20 20 20 20 20 20 20 20 73 54 6f 6b 65 6e 20 3d          sToken =
1030: 20 73 54 6f 6b 65 6e 5b 31 3a 2d 31 5d 0a 20 20   sToken[1:-1].  
1040: 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77 54 6f            lNewTo
1050: 6b 65 6e 20 3d 20 73 54 6f 6b 65 6e 5b 31 3a 2d  ken = sToken[1:-
1060: 31 5d 2e 73 70 6c 69 74 28 22 7c 22 29 0a 20 20  1].split("|").  
1070: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
1080: 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20   lTokenLines:.  
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54                lT
10a0: 6f 6b 65 6e 4c 69 6e 65 73 20 3d 20 5b 20 5b 22  okenLines = [ ["
10b0: 28 22 2b 73 2b 22 29 22 5d 20 20 66 6f 72 20 73  ("+s+")"]  for s
10c0: 20 20 69 6e 20 6c 4e 65 77 54 6f 6b 65 6e 20 5d    in lNewToken ]
10d0: 20 20 69 66 20 62 53 65 6c 65 63 74 65 64 47 72    if bSelectedGr
10e0: 6f 75 70 20 20 65 6c 73 65 20 5b 20 5b 73 5d 20  oup  else [ [s] 
10f0: 20 66 6f 72 20 73 20 20 69 6e 20 6c 4e 65 77 54   for s  in lNewT
1100: 6f 6b 65 6e 20 5d 0a 20 20 20 20 20 20 20 20 20  oken ].         
1110: 20 20 20 20 20 20 20 69 66 20 62 4e 75 6c 6c 50         if bNullP
1120: 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 20 20 20  ossible:.       
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f               lTo
1140: 6b 65 6e 4c 69 6e 65 73 2e 65 78 74 65 6e 64 28  kenLines.extend(
1150: 5b 20 5b 5d 20 20 66 6f 72 20 69 20 20 69 6e 20  [ []  for i  in 
1160: 72 61 6e 67 65 28 6c 65 6e 28 6c 4e 65 77 54 6f  range(len(lNewTo
1170: 6b 65 6e 29 2b 31 29 20 5d 29 0a 20 20 20 20 20  ken)+1) ]).     
1180: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65               lNe
11a0: 77 54 65 6d 70 20 3d 20 5b 5d 0a 20 20 20 20 20  wTemp = [].     
11b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 62 4e             if bN
11c0: 75 6c 6c 50 6f 73 73 69 62 6c 65 3a 0a 20 20 20  ullPossible:.   
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 66 6f 72 20 61 52 75 6c 65 20 69 6e 20 6c 54   for aRule in lT
11f0: 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20 20 20 20  okenLines:.     
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 66 6f 72 20 73 45 6c 65 6d 20 69 6e 20     for sElem in 
1220: 6c 4e 65 77 54 6f 6b 65 6e 3a 0a 20 20 20 20 20  lNewToken:.     
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 20 20 20 61 4e 65 77 52 75 6c 65 20         aNewRule 
1250: 3d 20 6c 69 73 74 28 61 52 75 6c 65 29 0a 20 20  = list(aRule).  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 52 75            aNewRu
1280: 6c 65 2e 61 70 70 65 6e 64 28 73 45 6c 65 6d 29  le.append(sElem)
1290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65               lNe
12b0: 77 54 65 6d 70 2e 61 70 70 65 6e 64 28 61 4e 65  wTemp.append(aNe
12c0: 77 52 75 6c 65 29 0a 20 20 20 20 20 20 20 20 20  wRule).         
12d0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 73 45 6c 65 6d 31 20 3d 20 6c 4e 65 77 54 6f   sElem1 = lNewTo
1300: 6b 65 6e 2e 70 6f 70 28 30 29 0a 20 20 20 20 20  ken.pop(0).     
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1320: 6f 72 20 61 52 75 6c 65 20 69 6e 20 6c 54 6f 6b  or aRule in lTok
1330: 65 6e 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20 20  enLines:.       
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 66 6f 72 20 73 45 6c 65 6d 20 69 6e 20 6c 4e   for sElem in lN
1360: 65 77 54 6f 6b 65 6e 3a 0a 20 20 20 20 20 20 20  ewToken:.       
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 61 4e 65 77 52 75 6c 65 20 3d 20       aNewRule = 
1390: 6c 69 73 74 28 61 52 75 6c 65 29 0a 20 20 20 20  list(aRule).    
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 61 4e 65 77 52 75 6c 65          aNewRule
13c0: 2e 61 70 70 65 6e 64 28 22 28 22 20 2b 20 73 45  .append("(" + sE
13d0: 6c 65 6d 20 2b 20 22 29 22 20 20 69 66 20 62 53  lem + ")"  if bS
13e0: 65 6c 65 63 74 65 64 47 72 6f 75 70 20 20 65 6c  electedGroup  el
13f0: 73 65 20 73 45 6c 65 6d 29 0a 20 20 20 20 20 20  se sElem).      
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 6c 4e 65 77 54 65 6d 70 2e 61        lNewTemp.a
1420: 70 70 65 6e 64 28 61 4e 65 77 52 75 6c 65 29 0a  ppend(aNewRule).
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 61 52 75 6c 65 2e 61 70          aRule.ap
1450: 70 65 6e 64 28 22 28 22 20 2b 20 73 45 6c 65 6d  pend("(" + sElem
1460: 31 20 2b 20 22 29 22 20 20 69 66 20 62 53 65 6c  1 + ")"  if bSel
1470: 65 63 74 65 64 47 72 6f 75 70 20 20 65 6c 73 65  ectedGroup  else
1480: 20 73 45 6c 65 6d 31 29 0a 20 20 20 20 20 20 20   sElem1).       
1490: 20 20 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e 4c           lTokenL
14a0: 69 6e 65 73 2e 65 78 74 65 6e 64 28 6c 4e 65 77  ines.extend(lNew
14b0: 54 65 6d 70 29 0a 20 20 20 20 20 20 20 20 65 6c  Temp).        el
14c0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
14d0: 23 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 0a 20  # simple token. 
14e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f             if no
14f0: 74 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20  t lTokenLines:. 
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1510: 54 6f 6b 65 6e 4c 69 6e 65 73 20 3d 20 5b 5b 73  TokenLines = [[s
1520: 54 6f 6b 65 6e 5d 2c 20 5b 5d 5d 20 20 69 66 20  Token], []]  if 
1530: 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65 20 20 65  bNullPossible  e
1540: 6c 73 65 20 5b 5b 73 54 6f 6b 65 6e 5d 5d 0a 20  lse [[sToken]]. 
1550: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
1560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1570: 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c   if bNullPossibl
1580: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1590: 20 20 20 20 20 20 20 6c 4e 65 77 54 65 6d 70 20         lNewTemp 
15a0: 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 20  = [].           
15b0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 61 52 75           for aRu
15c0: 6c 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65  le in lTokenLine
15d0: 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s:.             
15e0: 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77 20             lNew 
15f0: 3d 20 6c 69 73 74 28 61 52 75 6c 65 29 0a 20 20  = list(aRule).  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 6c 4e 65 77 2e 61 70 70 65 6e        lNew.appen
1620: 64 28 73 54 6f 6b 65 6e 29 0a 20 20 20 20 20 20  d(sToken).      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 6c 4e 65 77 54 65 6d 70 2e 61 70 70 65 6e    lNewTemp.appen
1650: 64 28 6c 4e 65 77 29 0a 20 20 20 20 20 20 20 20  d(lNew).        
1660: 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f 6b              lTok
1670: 65 6e 4c 69 6e 65 73 2e 65 78 74 65 6e 64 28 6c  enLines.extend(l
1680: 4e 65 77 54 65 6d 70 29 0a 20 20 20 20 20 20 20  NewTemp).       
1690: 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20           else:. 
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 66 6f 72 20 61 52 75 6c 65 20 69 6e 20     for aRule in 
16c0: 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20 20  lTokenLines:.   
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 61 52 75 6c 65 2e 61 70 70 65 6e       aRule.appen
16f0: 64 28 73 54 6f 6b 65 6e 29 0a 20 20 20 20 66 6f  d(sToken).    fo
1700: 72 20 61 52 75 6c 65 20 69 6e 20 6c 54 6f 6b 65  r aRule in lToke
1710: 6e 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20 20 20  nLines:.        
1720: 79 69 65 6c 64 20 61 52 75 6c 65 0a 0a 0a 64 65  yield aRule...de
1730: 66 20 63 72 65 61 74 65 52 75 6c 65 20 28 69 4c  f createRule (iL
1740: 69 6e 65 2c 20 73 52 75 6c 65 4e 61 6d 65 2c 20  ine, sRuleName, 
1750: 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74  sTokenLine, iAct
1760: 69 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f  ionBlock, sActio
1770: 6e 73 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 64  ns, nPriority, d
1780: 4f 70 74 50 72 69 6f 72 69 74 79 2c 20 64 44 65  OptPriority, dDe
1790: 66 29 3a 0a 20 20 20 20 22 67 65 6e 65 72 61 74  f):.    "generat
17a0: 6f 72 3a 20 63 72 65 61 74 65 20 72 75 6c 65 20  or: create rule 
17b0: 61 73 20 6c 69 73 74 22 0a 20 20 20 20 23 20 70  as list".    # p
17c0: 72 69 6e 74 28 69 4c 69 6e 65 2c 20 22 2f 2f 22  rint(iLine, "//"
17d0: 2c 20 73 52 75 6c 65 4e 61 6d 65 2c 20 22 2f 2f  , sRuleName, "//
17e0: 22 2c 20 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 22  ", sTokenLine, "
17f0: 2f 2f 22 2c 20 73 41 63 74 69 6f 6e 73 2c 20 22  //", sActions, "
1800: 2f 2f 22 2c 20 6e 50 72 69 6f 72 69 74 79 29 0a  //", nPriority).
1810: 20 20 20 20 66 6f 72 20 6c 54 6f 6b 65 6e 20 69      for lToken i
1820: 6e 20 67 65 6e 54 6f 6b 65 6e 4c 69 6e 65 73 28  n genTokenLines(
1830: 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 64 44 65 66  sTokenLine, dDef
1840: 29 3a 0a 20 20 20 20 20 20 20 20 23 20 43 61 6c  ):.        # Cal
1850: 63 75 6c 61 74 65 20 70 6f 73 69 74 69 6f 6e 73  culate positions
1860: 0a 20 20 20 20 20 20 20 20 64 50 6f 73 20 3d 20  .        dPos = 
1870: 7b 7d 20 20 20 23 20 6b 65 79 3a 20 69 47 72 6f  {}   # key: iGro
1880: 75 70 2c 20 76 61 6c 75 65 3a 20 69 54 6f 6b 65  up, value: iToke
1890: 6e 0a 20 20 20 20 20 20 20 20 69 47 72 6f 75 70  n.        iGroup
18a0: 20 3d 20 30 0a 20 20 20 20 20 20 20 20 23 69 66   = 0.        #if
18b0: 20 69 4c 69 6e 65 20 3d 3d 20 33 39 37 31 3a 20   iLine == 3971: 
18c0: 23 20 64 65 62 75 67 0a 20 20 20 20 20 20 20 20  # debug.        
18d0: 23 20 20 20 20 70 72 69 6e 74 28 6c 54 6f 6b 65  #    print(lToke
18e0: 6e 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69  n).        for i
18f0: 2c 20 73 54 6f 6b 65 6e 20 69 6e 20 65 6e 75 6d  , sToken in enum
1900: 65 72 61 74 65 28 6c 54 6f 6b 65 6e 29 3a 0a 20  erate(lToken):. 
1910: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 54             if sT
1920: 6f 6b 65 6e 2e 73 74 61 72 74 73 77 69 74 68 28  oken.startswith(
1930: 22 28 22 29 20 61 6e 64 20 73 54 6f 6b 65 6e 2e  "(") and sToken.
1940: 65 6e 64 73 77 69 74 68 28 22 29 22 29 3a 0a 20  endswith(")"):. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1960: 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73 54 6f 6b 65  Token[i] = sToke
1970: 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20  n[1:-1].        
1980: 20 20 20 20 20 20 20 20 69 47 72 6f 75 70 20 2b          iGroup +
1990: 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  = 1.            
19a0: 20 20 20 20 64 50 6f 73 5b 69 47 72 6f 75 70 5d      dPos[iGroup]
19b0: 20 3d 20 69 20 2b 20 31 20 20 20 20 23 20 77 65   = i + 1    # we
19c0: 20 61 64 64 20 31 2c 20 66 6f 72 20 77 65 20 63   add 1, for we c
19d0: 6f 75 6e 74 20 74 6f 6b 65 6e 73 20 66 72 6f 6d  ount tokens from
19e0: 20 31 20 74 6f 20 6e 20 28 6e 6f 74 20 66 72 6f   1 to n (not fro
19f0: 6d 20 30 29 0a 0a 20 20 20 20 20 20 20 20 23 20  m 0)..        # 
1a00: 50 61 72 73 65 20 61 63 74 69 6f 6e 73 0a 20 20  Parse actions.  
1a10: 20 20 20 20 20 20 66 6f 72 20 69 41 63 74 69 6f        for iActio
1a20: 6e 2c 20 73 41 63 74 69 6f 6e 20 69 6e 20 65 6e  n, sAction in en
1a30: 75 6d 65 72 61 74 65 28 73 41 63 74 69 6f 6e 73  umerate(sActions
1a40: 2e 73 70 6c 69 74 28 22 20 3c 3c 2d 20 22 29 29  .split(" <<- "))
1a50: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  :.            sA
1a60: 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 2e  ction = sAction.
1a70: 73 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20  strip().        
1a80: 20 20 20 20 69 66 20 73 41 63 74 69 6f 6e 3a 0a      if sAction:.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 73 41 63 74 69 6f 6e 49 64 20 3d 20 73 52 75 6c  sActionId = sRul
1ab0: 65 4e 61 6d 65 20 2b 20 22 5f 5f 62 22 20 2b 20  eName + "__b" + 
1ac0: 73 74 72 28 69 41 63 74 69 6f 6e 42 6c 6f 63 6b  str(iActionBlock
1ad0: 29 20 2b 20 22 5f 61 22 20 2b 20 73 74 72 28 69  ) + "_a" + str(i
1ae0: 41 63 74 69 6f 6e 29 20 2b 20 22 5f 22 20 2b 20  Action) + "_" + 
1af0: 73 74 72 28 6c 65 6e 28 6c 54 6f 6b 65 6e 29 29  str(len(lToken))
1b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b10: 20 61 41 63 74 69 6f 6e 20 3d 20 63 72 65 61 74   aAction = creat
1b20: 65 41 63 74 69 6f 6e 28 73 41 63 74 69 6f 6e 49  eAction(sActionI
1b30: 64 2c 20 73 41 63 74 69 6f 6e 2c 20 6e 50 72 69  d, sAction, nPri
1b40: 6f 72 69 74 79 2c 20 64 4f 70 74 50 72 69 6f 72  ority, dOptPrior
1b50: 69 74 79 2c 20 6c 65 6e 28 6c 54 6f 6b 65 6e 29  ity, len(lToken)
1b60: 2c 20 64 50 6f 73 29 0a 20 20 20 20 20 20 20 20  , dPos).        
1b70: 20 20 20 20 20 20 20 20 69 66 20 61 41 63 74 69          if aActi
1b80: 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  on:.            
1b90: 20 20 20 20 20 20 20 20 64 41 43 54 49 4f 4e 53          dACTIONS
1ba0: 5b 73 41 63 74 69 6f 6e 49 64 5d 20 3d 20 61 41  [sActionId] = aA
1bb0: 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
1bc0: 20 20 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c            lResul
1bd0: 74 20 3d 20 6c 69 73 74 28 6c 54 6f 6b 65 6e 29  t = list(lToken)
1be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bf0: 20 20 20 20 20 6c 52 65 73 75 6c 74 2e 65 78 74       lResult.ext
1c00: 65 6e 64 28 5b 22 23 23 22 2b 73 74 72 28 69 4c  end(["##"+str(iL
1c10: 69 6e 65 29 2c 20 73 41 63 74 69 6f 6e 49 64 5d  ine), sActionId]
1c20: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1c30: 20 20 20 20 20 20 79 69 65 6c 64 20 6c 52 65 73        yield lRes
1c40: 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
1c50: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1c70: 69 6e 74 28 22 20 23 20 45 72 72 6f 72 20 6f 6e  int(" # Error on
1c80: 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 3a   action at line:
1c90: 22 2c 20 69 4c 69 6e 65 29 0a 20 20 20 20 20 20  ", iLine).      
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1cb0: 69 6e 74 28 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20  int(sTokenLine, 
1cc0: 22 5c 6e 22 2c 20 73 41 63 74 69 6f 6e 73 29 0a  "\n", sActions).
1cd0: 0a 0a 64 65 66 20 63 68 61 6e 67 65 52 65 66 65  ..def changeRefe
1ce0: 72 65 6e 63 65 54 6f 6b 65 6e 20 28 73 54 65 78  renceToken (sTex
1cf0: 74 2c 20 64 50 6f 73 29 3a 0a 20 20 20 20 22 63  t, dPos):.    "c
1d00: 68 61 6e 67 65 20 67 72 6f 75 70 20 72 65 66 65  hange group refe
1d10: 72 65 6e 63 65 20 69 6e 20 3c 73 54 65 78 74 3e  rence in <sText>
1d20: 20 77 69 74 68 20 76 61 6c 75 65 73 20 69 6e 20   with values in 
1d30: 3c 64 50 6f 73 3e 22 0a 20 20 20 20 66 6f 72 20  <dPos>".    for 
1d40: 69 20 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28 64  i in range(len(d
1d50: 50 6f 73 29 2c 20 30 2c 20 2d 31 29 3a 0a 20 20  Pos), 0, -1):.  
1d60: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
1d70: 65 78 74 2e 72 65 70 6c 61 63 65 28 22 5c 5c 22  ext.replace("\\"
1d80: 2b 73 74 72 28 69 29 2c 20 22 5c 5c 22 2b 73 74  +str(i), "\\"+st
1d90: 72 28 64 50 6f 73 5b 69 5d 29 29 0a 20 20 20 20  r(dPos[i])).    
1da0: 72 65 74 75 72 6e 20 73 54 65 78 74 0a 0a 0a 64  return sText...d
1db0: 65 66 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d  ef checkTokenNum
1dc0: 62 65 72 73 20 28 73 54 65 78 74 2c 20 73 41 63  bers (sText, sAc
1dd0: 74 69 6f 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29 3a  tionId, nToken):
1de0: 0a 20 20 20 20 22 63 68 65 63 6b 20 69 66 20 74  .    "check if t
1df0: 6f 6b 65 6e 20 72 65 66 65 72 65 6e 63 65 73 20  oken references 
1e00: 69 6e 20 3c 73 54 65 78 74 3e 20 67 72 65 61 74  in <sText> great
1e10: 65 72 20 74 68 61 6e 20 3c 6e 54 6f 6b 65 6e 3e  er than <nToken>
1e20: 20 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20   (debugging)".  
1e30: 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69    for x in re.fi
1e40: 6e 64 69 74 65 72 28 72 22 5c 5c 28 5c 64 2b 29  nditer(r"\\(\d+)
1e50: 22 2c 20 73 54 65 78 74 29 3a 0a 20 20 20 20 20  ", sText):.     
1e60: 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f 75     if int(x.grou
1e70: 70 28 31 29 29 20 3e 20 6e 54 6f 6b 65 6e 3a 0a  p(1)) > nToken:.
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
1e90: 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20 74 6f  t("# Error in to
1ea0: 6b 65 6e 20 69 6e 64 65 78 20 61 74 20 6c 69 6e  ken index at lin
1eb0: 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20  e " + sActionId 
1ec0: 2b 20 22 20 28 22 2b 73 74 72 28 6e 54 6f 6b 65  + " ("+str(nToke
1ed0: 6e 29 2b 22 20 74 6f 6b 65 6e 73 20 6f 6e 6c 79  n)+" tokens only
1ee0: 29 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  )").            
1ef0: 70 72 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a 64  print(sText)...d
1f00: 65 66 20 63 68 65 63 6b 49 66 54 68 65 72 65 49  ef checkIfThereI
1f10: 73 43 6f 64 65 20 28 73 54 65 78 74 2c 20 73 41  sCode (sText, sA
1f20: 63 74 69 6f 6e 49 64 29 3a 0a 20 20 20 20 22 63  ctionId):.    "c
1f30: 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  heck if there is
1f40: 20 63 6f 64 65 20 69 6e 20 3c 73 54 65 78 74 3e   code in <sText>
1f50: 20 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20   (debugging)".  
1f60: 20 20 69 66 20 72 65 2e 73 65 61 72 63 68 28 22    if re.search("
1f70: 5b 2e 5d 5c 5c 77 2b 5b 28 5d 7c 73 75 67 67 5c  [.]\\w+[(]|sugg\
1f80: 5c 77 2b 5b 28 5d 7c 5c 5c 28 5b 30 2d 39 5d 7c  \w+[(]|\\([0-9]|
1f90: 5c 5c 5b 5b 30 2d 39 5d 22 2c 20 73 54 65 78 74  \\[[0-9]", sText
1fa0: 29 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ):.        print
1fb0: 28 22 23 20 57 61 72 6e 69 6e 67 20 61 74 20 6c  ("# Warning at l
1fc0: 69 6e 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49  ine " + sActionI
1fd0: 64 20 2b 20 22 3a 20 20 54 68 69 73 20 6d 65 73  d + ":  This mes
1fe0: 73 61 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  sage looks like 
1ff0: 63 6f 64 65 2e 20 4c 69 6e 65 20 73 68 6f 75 6c  code. Line shoul
2000: 64 20 70 72 6f 62 61 62 6c 79 20 62 65 67 69 6e  d probably begin
2010: 20 77 69 74 68 20 3d 22 29 0a 20 20 20 20 20 20   with =").      
2020: 20 20 70 72 69 6e 74 28 73 54 65 78 74 29 0a 0a    print(sText)..
2030: 0a 64 65 66 20 63 72 65 61 74 65 41 63 74 69 6f  .def createActio
2040: 6e 20 28 73 41 63 74 69 6f 6e 49 64 2c 20 73 41  n (sActionId, sA
2050: 63 74 69 6f 6e 2c 20 6e 50 72 69 6f 72 69 74 79  ction, nPriority
2060: 2c 20 64 4f 70 74 50 72 69 6f 72 69 74 79 2c 20  , dOptPriority, 
2070: 6e 54 6f 6b 65 6e 2c 20 64 50 6f 73 29 3a 0a 20  nToken, dPos):. 
2080: 20 20 20 22 63 72 65 61 74 65 20 61 63 74 69 6f     "create actio
2090: 6e 20 72 75 6c 65 20 61 73 20 61 20 6c 69 73 74  n rule as a list
20a0: 22 0a 20 20 20 20 23 20 4f 70 74 69 6f 6e 0a 20  ".    # Option. 
20b0: 20 20 20 73 4f 70 74 69 6f 6e 20 3d 20 46 61 6c     sOption = Fal
20c0: 73 65 0a 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61  se.    m = re.ma
20d0: 74 63 68 28 22 2f 28 5c 5c 77 2b 29 2f 22 2c 20  tch("/(\\w+)/", 
20e0: 73 41 63 74 69 6f 6e 29 0a 20 20 20 20 69 66 20  sAction).    if 
20f0: 6d 3a 0a 20 20 20 20 20 20 20 20 73 4f 70 74 69  m:.        sOpti
2100: 6f 6e 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29 0a  on = m.group(1).
2110: 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20          sAction 
2120: 3d 20 73 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64 28  = sAction[m.end(
2130: 29 3a 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20  ):].strip().    
2140: 69 66 20 6e 50 72 69 6f 72 69 74 79 20 3d 3d 20  if nPriority == 
2150: 2d 31 3a 0a 20 20 20 20 20 20 20 20 6e 50 72 69  -1:.        nPri
2160: 6f 72 69 74 79 20 3d 20 64 4f 70 74 50 72 69 6f  ority = dOptPrio
2170: 72 69 74 79 2e 67 65 74 28 73 4f 70 74 69 6f 6e  rity.get(sOption
2180: 2c 20 34 29 0a 0a 20 20 20 20 23 20 76 61 6c 69  , 4)..    # vali
2190: 64 20 61 63 74 69 6f 6e 3f 0a 20 20 20 20 6d 20  d action?.    m 
21a0: 3d 20 72 65 2e 73 65 61 72 63 68 28 72 22 28 3f  = re.search(r"(?
21b0: 50 3c 61 63 74 69 6f 6e 3e 5b 2d 7e 3d 2f 25 3e  P<action>[-~=/%>
21c0: 5d 29 28 3f 50 3c 73 74 61 72 74 3e 2d 3f 5c 64  ])(?P<start>-?\d
21d0: 2b 5c 2e 3f 7c 29 28 3f 50 3c 65 6e 64 3e 3a 5c  +\.?|)(?P<end>:\
21e0: 2e 3f 2d 3f 5c 64 2b 7c 29 28 3f 50 3c 63 61 73  .?-?\d+|)(?P<cas
21f0: 69 6e 67 3e 3a 7c 29 3e 3e 22 2c 20 73 41 63 74  ing>:|)>>", sAct
2200: 69 6f 6e 29 0a 20 20 20 20 69 66 20 6e 6f 74 20  ion).    if not 
2210: 6d 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  m:.        print
2220: 28 22 20 23 20 45 72 72 6f 72 2e 20 4e 6f 20 61  (" # Error. No a
2230: 63 74 69 6f 6e 20 66 6f 75 6e 64 20 61 74 3a 20  ction found at: 
2240: 22 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20  ", sActionId).  
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e        return Non
2260: 65 0a 0a 20 20 20 20 23 20 43 6f 6e 64 69 74 69  e..    # Conditi
2270: 6f 6e 0a 20 20 20 20 73 43 6f 6e 64 69 74 69 6f  on.    sConditio
2280: 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 3a 6d 2e 73  n = sAction[:m.s
2290: 74 61 72 74 28 29 5d 2e 73 74 72 69 70 28 29 0a  tart()].strip().
22a0: 20 20 20 20 69 66 20 73 43 6f 6e 64 69 74 69 6f      if sConditio
22b0: 6e 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e 64  n:.        sCond
22c0: 69 74 69 6f 6e 20 3d 20 63 68 61 6e 67 65 52 65  ition = changeRe
22d0: 66 65 72 65 6e 63 65 54 6f 6b 65 6e 28 73 43 6f  ferenceToken(sCo
22e0: 6e 64 69 74 69 6f 6e 2c 20 64 50 6f 73 29 0a 20  ndition, dPos). 
22f0: 20 20 20 20 20 20 20 73 43 6f 6e 64 69 74 69 6f         sConditio
2300: 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69  n = createFuncti
2310: 6f 6e 28 22 63 6f 6e 64 22 2c 20 73 41 63 74 69  on("cond", sActi
2320: 6f 6e 49 64 2c 20 73 43 6f 6e 64 69 74 69 6f 6e  onId, sCondition
2330: 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ).    else:.    
2340: 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20 3d      sCondition =
2350: 20 22 22 0a 0a 20 20 20 20 23 20 43 61 73 65 20   ""..    # Case 
2360: 73 65 6e 73 69 74 69 76 69 74 79 0a 20 20 20 20  sensitivity.    
2370: 62 43 61 73 65 53 65 6e 73 69 74 69 76 69 74 79  bCaseSensitivity
2380: 20 3d 20 46 61 6c 73 65 20 69 66 20 6d 2e 67 72   = False if m.gr
2390: 6f 75 70 28 22 63 61 73 69 6e 67 22 29 20 3d 3d  oup("casing") ==
23a0: 20 22 3a 22 20 65 6c 73 65 20 54 72 75 65 0a 0a   ":" else True..
23b0: 20 20 20 20 23 20 41 63 74 69 6f 6e 0a 20 20 20      # Action.   
23c0: 20 63 41 63 74 69 6f 6e 20 3d 20 6d 2e 67 72 6f   cAction = m.gro
23d0: 75 70 28 22 61 63 74 69 6f 6e 22 29 0a 20 20 20  up("action").   
23e0: 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69   sAction = sActi
23f0: 6f 6e 5b 6d 2e 65 6e 64 28 29 3a 5d 2e 73 74 72  on[m.end():].str
2400: 69 70 28 29 0a 20 20 20 20 73 41 63 74 69 6f 6e  ip().    sAction
2410: 20 3d 20 63 68 61 6e 67 65 52 65 66 65 72 65 6e   = changeReferen
2420: 63 65 54 6f 6b 65 6e 28 73 41 63 74 69 6f 6e 2c  ceToken(sAction,
2430: 20 64 50 6f 73 29 0a 20 20 20 20 23 20 74 61 72   dPos).    # tar
2440: 67 65 74 0a 20 20 20 20 63 53 74 61 72 74 4c 69  get.    cStartLi
2450: 6d 69 74 20 3d 20 22 3c 22 0a 20 20 20 20 63 45  mit = "<".    cE
2460: 6e 64 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20 20  ndLimit = ">".  
2470: 20 20 69 66 20 6e 6f 74 20 6d 2e 67 72 6f 75 70    if not m.group
2480: 28 22 73 74 61 72 74 22 29 3a 0a 20 20 20 20 20  ("start"):.     
2490: 20 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20     iStartAction 
24a0: 3d 20 31 0a 20 20 20 20 20 20 20 20 69 45 6e 64  = 1.        iEnd
24b0: 41 63 74 69 6f 6e 20 3d 20 30 0a 20 20 20 20 65  Action = 0.    e
24c0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 69 66 20  lse:.        if 
24d0: 63 41 63 74 69 6f 6e 20 21 3d 20 22 2d 22 20 61  cAction != "-" a
24e0: 6e 64 20 28 6d 2e 67 72 6f 75 70 28 22 73 74 61  nd (m.group("sta
24f0: 72 74 22 29 2e 65 6e 64 73 77 69 74 68 28 22 2e  rt").endswith(".
2500: 22 29 20 6f 72 20 6d 2e 67 72 6f 75 70 28 22 65  ") or m.group("e
2510: 6e 64 22 29 2e 73 74 61 72 74 73 77 69 74 68 28  nd").startswith(
2520: 22 3a 2e 22 29 29 3a 0a 20 20 20 20 20 20 20 20  ":.")):.        
2530: 20 20 20 20 70 72 69 6e 74 28 22 20 23 20 45 72      print(" # Er
2540: 72 6f 72 2e 20 57 72 6f 6e 67 20 73 65 6c 65 63  ror. Wrong selec
2550: 74 69 6f 6e 20 6f 6e 20 74 6f 6b 65 6e 73 2e 22  tion on tokens."
2560: 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20  , sActionId).   
2570: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2580: 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 69 66 20  None.        if 
2590: 6d 2e 67 72 6f 75 70 28 22 73 74 61 72 74 22 29  m.group("start")
25a0: 2e 65 6e 64 73 77 69 74 68 28 22 2e 22 29 3a 0a  .endswith("."):.
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 53 74 61              cSta
25c0: 72 74 4c 69 6d 69 74 20 3d 20 22 3e 22 0a 20 20  rtLimit = ">".  
25d0: 20 20 20 20 20 20 69 53 74 61 72 74 41 63 74 69        iStartActi
25e0: 6f 6e 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70  on = int(m.group
25f0: 28 22 73 74 61 72 74 22 29 2e 72 73 74 72 69 70  ("start").rstrip
2600: 28 22 2e 22 29 29 0a 20 20 20 20 20 20 20 20 69  (".")).        i
2610: 66 20 6e 6f 74 20 6d 2e 67 72 6f 75 70 28 22 65  f not m.group("e
2620: 6e 64 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  nd"):.          
2630: 20 20 69 45 6e 64 41 63 74 69 6f 6e 20 3d 20 69    iEndAction = i
2640: 53 74 61 72 74 41 63 74 69 6f 6e 0a 20 20 20 20  StartAction.    
2650: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
2660: 20 20 20 20 20 20 69 66 20 6d 2e 67 72 6f 75 70        if m.group
2670: 28 22 65 6e 64 22 29 2e 73 74 61 72 74 73 77 69  ("end").startswi
2680: 74 68 28 22 3a 2e 22 29 3a 0a 20 20 20 20 20 20  th(":."):.      
2690: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 4c 69            cEndLi
26a0: 6d 69 74 20 3d 20 22 3c 22 0a 20 20 20 20 20 20  mit = "<".      
26b0: 20 20 20 20 20 20 69 45 6e 64 41 63 74 69 6f 6e        iEndAction
26c0: 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 22   = int(m.group("
26d0: 65 6e 64 22 29 2e 6c 73 74 72 69 70 28 22 3a 2e  end").lstrip(":.
26e0: 22 29 29 0a 20 20 20 20 69 66 20 64 50 6f 73 20  ")).    if dPos 
26f0: 61 6e 64 20 6d 2e 67 72 6f 75 70 28 22 73 74 61  and m.group("sta
2700: 72 74 22 29 3a 0a 20 20 20 20 20 20 20 20 74 72  rt"):.        tr
2710: 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y:.            i
2720: 53 74 61 72 74 41 63 74 69 6f 6e 20 3d 20 64 50  StartAction = dP
2730: 6f 73 2e 67 65 74 28 69 53 74 61 72 74 41 63 74  os.get(iStartAct
2740: 69 6f 6e 2c 20 69 53 74 61 72 74 41 63 74 69 6f  ion, iStartActio
2750: 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  n).            i
2760: 66 20 69 45 6e 64 41 63 74 69 6f 6e 3a 0a 20 20  f iEndAction:.  
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 45                iE
2780: 6e 64 41 63 74 69 6f 6e 20 3d 20 64 50 6f 73 2e  ndAction = dPos.
2790: 67 65 74 28 69 45 6e 64 41 63 74 69 6f 6e 2c 20  get(iEndAction, 
27a0: 69 45 6e 64 41 63 74 69 6f 6e 29 0a 20 20 20 20  iEndAction).    
27b0: 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20      except:.    
27c0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23          print("#
27d0: 20 45 72 72 6f 72 2e 20 57 72 6f 6e 67 20 67 72   Error. Wrong gr
27e0: 6f 75 70 73 20 69 6e 3a 20 22 20 2b 20 73 41 63  oups in: " + sAc
27f0: 74 69 6f 6e 49 64 29 0a 20 20 20 20 20 20 20 20  tionId).        
2800: 20 20 20 20 70 72 69 6e 74 28 22 20 20 69 53 74      print("  iSt
2810: 61 72 74 41 63 74 69 6f 6e 3a 22 2c 20 69 53 74  artAction:", iSt
2820: 61 72 74 41 63 74 69 6f 6e 2c 20 22 69 45 6e 64  artAction, "iEnd
2830: 41 63 74 69 6f 6e 3a 22 2c 20 69 45 6e 64 41 63  Action:", iEndAc
2840: 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 20 20  tion).          
2850: 20 20 70 72 69 6e 74 28 22 20 22 2c 20 64 50 6f    print(" ", dPo
2860: 73 29 0a 20 20 20 20 69 66 20 69 53 74 61 72 74  s).    if iStart
2870: 41 63 74 69 6f 6e 20 3c 20 30 3a 0a 20 20 20 20  Action < 0:.    
2880: 20 20 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e      iStartAction
2890: 20 2b 3d 20 31 0a 20 20 20 20 69 66 20 69 45 6e   += 1.    if iEn
28a0: 64 41 63 74 69 6f 6e 20 3c 20 30 3a 0a 20 20 20  dAction < 0:.   
28b0: 20 20 20 20 20 69 45 6e 64 41 63 74 69 6f 6e 20       iEndAction 
28c0: 2b 3d 20 31 0a 0a 20 20 20 20 69 66 20 63 41 63  += 1..    if cAc
28d0: 74 69 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20  tion == "-":.   
28e0: 20 20 20 20 20 23 23 20 65 72 72 6f 72 0a 20 20       ## error.  
28f0: 20 20 20 20 20 20 69 4d 73 67 20 3d 20 73 41 63        iMsg = sAc
2900: 74 69 6f 6e 2e 66 69 6e 64 28 22 20 23 20 22 29  tion.find(" # ")
2910: 0a 20 20 20 20 20 20 20 20 69 66 20 69 4d 73 67  .        if iMsg
2920: 20 3d 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20 20   == -1:.        
2930: 20 20 20 20 73 4d 73 67 20 3d 20 22 23 20 45 72      sMsg = "# Er
2940: 72 6f 72 2e 20 45 72 72 6f 72 20 6d 65 73 73 61  ror. Error messa
2950: 67 65 20 6e 6f 74 20 66 6f 75 6e 64 2e 22 0a 20  ge not found.". 
2960: 20 20 20 20 20 20 20 20 20 20 20 73 55 52 4c 20             sURL 
2970: 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  = "".           
2980: 20 70 72 69 6e 74 28 73 4d 73 67 20 2b 20 22 20   print(sMsg + " 
2990: 41 63 74 69 6f 6e 20 69 64 3a 20 22 20 2b 20 73  Action id: " + s
29a0: 41 63 74 69 6f 6e 49 64 29 0a 20 20 20 20 20 20  ActionId).      
29b0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
29c0: 20 20 20 20 73 4d 73 67 20 3d 20 73 41 63 74 69      sMsg = sActi
29d0: 6f 6e 5b 69 4d 73 67 2b 33 3a 5d 2e 73 74 72 69  on[iMsg+3:].stri
29e0: 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p().            
29f0: 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f  sAction = sActio
2a00: 6e 5b 3a 69 4d 73 67 5d 2e 73 74 72 69 70 28 29  n[:iMsg].strip()
2a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 55 52  .            sUR
2a20: 4c 20 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20  L = "".         
2a30: 20 20 20 6d 55 52 4c 20 3d 20 72 65 2e 73 65 61     mURL = re.sea
2a40: 72 63 68 28 22 5b 7c 5d 20 2a 28 68 74 74 70 73  rch("[|] *(https
2a50: 3f 3a 2f 2f 2e 2a 29 22 2c 20 73 4d 73 67 29 0a  ?://.*)", sMsg).
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6d              if m
2a70: 55 52 4c 3a 0a 20 20 20 20 20 20 20 20 20 20 20  URL:.           
2a80: 20 20 20 20 20 73 55 52 4c 20 3d 20 6d 55 52 4c       sURL = mURL
2a90: 2e 67 72 6f 75 70 28 31 29 2e 73 74 72 69 70 28  .group(1).strip(
2aa0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2ab0: 20 20 73 4d 73 67 20 3d 20 73 4d 73 67 5b 3a 6d    sMsg = sMsg[:m
2ac0: 55 52 4c 2e 73 74 61 72 74 28 30 29 5d 2e 73 74  URL.start(0)].st
2ad0: 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 20 20  rip().          
2ae0: 20 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d 62    checkTokenNumb
2af0: 65 72 73 28 73 4d 73 67 2c 20 73 41 63 74 69 6f  ers(sMsg, sActio
2b00: 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29 0a 20 20 20  nId, nToken).   
2b10: 20 20 20 20 20 20 20 20 20 69 66 20 73 4d 73 67           if sMsg
2b20: 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20  [0:1] == "=":.  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 4d                sM
2b40: 73 67 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74  sg = createFunct
2b50: 69 6f 6e 28 22 6d 73 67 22 2c 20 73 41 63 74 69  ion("msg", sActi
2b60: 6f 6e 49 64 2c 20 73 4d 73 67 2c 20 54 72 75 65  onId, sMsg, True
2b70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
2b80: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
2b90: 20 20 20 20 63 68 65 63 6b 49 66 54 68 65 72 65      checkIfThere
2ba0: 49 73 43 6f 64 65 28 73 4d 73 67 2c 20 73 41 63  IsCode(sMsg, sAc
2bb0: 74 69 6f 6e 49 64 29 0a 0a 20 20 20 20 23 20 63  tionId)..    # c
2bc0: 68 65 63 6b 69 6e 67 20 63 6f 6e 73 69 73 74 61  hecking consista
2bd0: 6e 63 79 0a 20 20 20 20 63 68 65 63 6b 54 6f 6b  ncy.    checkTok
2be0: 65 6e 4e 75 6d 62 65 72 73 28 73 41 63 74 69 6f  enNumbers(sActio
2bf0: 6e 2c 20 73 41 63 74 69 6f 6e 49 64 2c 20 6e 54  n, sActionId, nT
2c00: 6f 6b 65 6e 29 0a 0a 20 20 20 20 69 66 20 63 41  oken)..    if cA
2c10: 63 74 69 6f 6e 20 3d 3d 20 22 3e 22 3a 0a 20 20  ction == ">":.  
2c20: 20 20 20 20 20 20 23 23 20 6e 6f 20 61 63 74 69        ## no acti
2c30: 6f 6e 2c 20 62 72 65 61 6b 20 6c 6f 6f 70 20 69  on, break loop i
2c40: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 46  f condition is F
2c50: 61 6c 73 65 0a 20 20 20 20 20 20 20 20 72 65 74  alse.        ret
2c60: 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 43  urn [sOption, sC
2c70: 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74 69 6f  ondition, cActio
2c80: 6e 2c 20 22 22 5d 0a 0a 20 20 20 20 69 66 20 6e  n, ""]..    if n
2c90: 6f 74 20 73 41 63 74 69 6f 6e 20 61 6e 64 20 63  ot sAction and c
2ca0: 41 63 74 69 6f 6e 20 21 3d 20 22 25 22 3a 0a 20  Action != "%":. 
2cb0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
2cc0: 45 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20  Error in action 
2cd0: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 41 63 74  at line " + sAct
2ce0: 69 6f 6e 49 64 20 2b 20 22 3a 20 20 54 68 69 73  ionId + ":  This
2cf0: 20 61 63 74 69 6f 6e 20 69 73 20 65 6d 70 74 79   action is empty
2d00: 2e 22 29 0a 0a 20 20 20 20 69 66 20 73 41 63 74  .")..    if sAct
2d10: 69 6f 6e 5b 30 3a 31 5d 20 21 3d 20 22 3d 22 20  ion[0:1] != "=" 
2d20: 61 6e 64 20 63 41 63 74 69 6f 6e 20 21 3d 20 22  and cAction != "
2d30: 3d 22 3a 0a 20 20 20 20 20 20 20 20 63 68 65 63  =":.        chec
2d40: 6b 49 66 54 68 65 72 65 49 73 43 6f 64 65 28 73  kIfThereIsCode(s
2d50: 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 49  Action, sActionI
2d60: 64 29 0a 0a 20 20 20 20 69 66 20 63 41 63 74 69  d)..    if cActi
2d70: 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20 20  on == "-":.     
2d80: 20 20 20 23 23 20 65 72 72 6f 72 20 64 65 74 65     ## error dete
2d90: 63 74 65 64 20 2d 2d 3e 20 73 75 67 67 65 73 74  cted --> suggest
2da0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20 73  ion.        if s
2db0: 41 63 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22  Action[0:1] == "
2dc0: 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  =":.            
2dd0: 73 41 63 74 69 6f 6e 20 3d 20 63 72 65 61 74 65  sAction = create
2de0: 46 75 6e 63 74 69 6f 6e 28 22 73 75 67 67 22 2c  Function("sugg",
2df0: 20 73 41 63 74 69 6f 6e 49 64 2c 20 73 41 63 74   sActionId, sAct
2e00: 69 6f 6e 2c 20 54 72 75 65 29 0a 20 20 20 20 20  ion, True).     
2e10: 20 20 20 65 6c 69 66 20 73 41 63 74 69 6f 6e 2e     elif sAction.
2e20: 73 74 61 72 74 73 77 69 74 68 28 27 22 27 29 20  startswith('"') 
2e30: 61 6e 64 20 73 41 63 74 69 6f 6e 2e 65 6e 64 73  and sAction.ends
2e40: 77 69 74 68 28 27 22 27 29 3a 0a 20 20 20 20 20  with('"'):.     
2e50: 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d         sAction =
2e60: 20 73 41 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20   sAction[1:-1]. 
2e70: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73 4d         if not sM
2e80: 73 67 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg:.            
2e90: 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69  print("# Error i
2ea0: 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65  n action at line
2eb0: 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b   " + sActionId +
2ec0: 20 22 3a 20 20 54 68 65 20 6d 65 73 73 61 67 65   ":  The message
2ed0: 20 69 73 20 65 6d 70 74 79 2e 22 29 0a 20 20 20   is empty.").   
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70       return [sOp
2ef0: 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e  tion, sCondition
2f00: 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69  , cAction, sActi
2f10: 6f 6e 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e  on, iStartAction
2f20: 2c 20 69 45 6e 64 41 63 74 69 6f 6e 2c 20 63 53  , iEndAction, cS
2f30: 74 61 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c  tartLimit, cEndL
2f40: 69 6d 69 74 2c 20 62 43 61 73 65 53 65 6e 73 69  imit, bCaseSensi
2f50: 74 69 76 69 74 79 2c 20 6e 50 72 69 6f 72 69 74  tivity, nPriorit
2f60: 79 2c 20 73 4d 73 67 2c 20 73 55 52 4c 5d 0a 20  y, sMsg, sURL]. 
2f70: 20 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20     elif cAction 
2f80: 3d 3d 20 22 7e 22 3a 0a 20 20 20 20 20 20 20 20  == "~":.        
2f90: 23 23 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f  ## text processo
2fa0: 72 0a 20 20 20 20 20 20 20 20 69 66 20 73 41 63  r.        if sAc
2fb0: 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22  tion[0:1] == "="
2fc0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  :.            sA
2fd0: 63 74 69 6f 6e 20 3d 20 63 72 65 61 74 65 46 75  ction = createFu
2fe0: 6e 63 74 69 6f 6e 28 22 74 70 22 2c 20 73 41 63  nction("tp", sAc
2ff0: 74 69 6f 6e 49 64 2c 20 73 41 63 74 69 6f 6e 2c  tionId, sAction,
3000: 20 54 72 75 65 29 0a 20 20 20 20 20 20 20 20 65   True).        e
3010: 6c 69 66 20 73 41 63 74 69 6f 6e 2e 73 74 61 72  lif sAction.star
3020: 74 73 77 69 74 68 28 27 22 27 29 20 61 6e 64 20  tswith('"') and 
3030: 73 41 63 74 69 6f 6e 2e 65 6e 64 73 77 69 74 68  sAction.endswith
3040: 28 27 22 27 29 3a 0a 20 20 20 20 20 20 20 20 20  ('"'):.         
3050: 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63     sAction = sAc
3060: 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20  tion[1:-1].     
3070: 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69     return [sOpti
3080: 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20  on, sCondition, 
3090: 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e  cAction, sAction
30a0: 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20  , iStartAction, 
30b0: 69 45 6e 64 41 63 74 69 6f 6e 2c 20 62 43 61 73  iEndAction, bCas
30c0: 65 53 65 6e 73 69 74 69 76 69 74 79 5d 0a 20 20  eSensitivity].  
30d0: 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d    elif cAction =
30e0: 3d 20 22 25 22 20 6f 72 20 63 41 63 74 69 6f 6e  = "%" or cAction
30f0: 20 3d 3d 20 22 2f 22 3a 0a 20 20 20 20 20 20 20   == "/":.       
3100: 20 23 23 20 74 61 67 73 0a 20 20 20 20 20 20 20   ## tags.       
3110: 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69 6f 6e   return [sOption
3120: 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41  , sCondition, cA
3130: 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c 20  ction, sAction, 
3140: 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20 69 45  iStartAction, iE
3150: 6e 64 41 63 74 69 6f 6e 5d 0a 20 20 20 20 65 6c  ndAction].    el
3160: 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22 3d  if cAction == "=
3170: 22 3a 0a 20 20 20 20 20 20 20 20 23 23 20 64 69  ":.        ## di
3180: 73 61 6d 62 69 67 75 61 74 6f 72 0a 20 20 20 20  sambiguator.    
3190: 20 20 20 20 69 66 20 22 64 65 66 69 6e 65 28 22      if "define("
31a0: 20 69 6e 20 73 41 63 74 69 6f 6e 20 61 6e 64 20   in sAction and 
31b0: 6e 6f 74 20 72 65 2e 73 65 61 72 63 68 28 72 22  not re.search(r"
31c0: 64 65 66 69 6e 65 5c 28 5c 5c 5c 64 2b 20 2a 2c  define\(\\\d+ *,
31d0: 20 2a 5c 5b 2e 2a 5c 5d 20 2a 5c 29 22 2c 20 73   *\[.*\] *\)", s
31e0: 41 63 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20 20  Action):.       
31f0: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72       print("# Er
3200: 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61 74  ror in action at
3210: 20 6c 69 6e 65 20 22 20 2b 20 73 41 63 74 69 6f   line " + sActio
3220: 6e 49 64 20 2b 20 22 3a 20 73 65 63 6f 6e 64 20  nId + ": second 
3230: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 3c 64 65  argument for <de
3240: 66 69 6e 65 3e 20 6d 75 73 74 20 62 65 20 61 20  fine> must be a 
3250: 6c 69 73 74 20 6f 66 20 73 74 72 69 6e 67 73 22  list of strings"
3260: 29 0a 20 20 20 20 20 20 20 20 73 41 63 74 69 6f  ).        sActio
3270: 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69  n = createFuncti
3280: 6f 6e 28 22 64 61 22 2c 20 73 41 63 74 69 6f 6e  on("da", sAction
3290: 49 64 2c 20 73 41 63 74 69 6f 6e 29 0a 20 20 20  Id, sAction).   
32a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70       return [sOp
32b0: 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e  tion, sCondition
32c0: 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69  , cAction, sActi
32d0: 6f 6e 5d 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20  on].    else:.  
32e0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 20 23 20        print(" # 
32f0: 55 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 2e 22  Unknown action."
3300: 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20  , sActionId).   
3310: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65       return None
3320: 0a 0a 0a 64 65 66 20 6d 61 6b 65 20 28 6c 52 75  ...def make (lRu
3330: 6c 65 2c 20 64 44 65 66 2c 20 73 4c 61 6e 67 2c  le, dDef, sLang,
3340: 20 64 4f 70 74 50 72 69 6f 72 69 74 79 2c 20 62   dOptPriority, b
3350: 4a 61 76 61 53 63 72 69 70 74 29 3a 0a 20 20 20  JavaScript):.   
3360: 20 22 63 6f 6d 70 69 6c 65 20 72 75 6c 65 73 2c   "compile rules,
3370: 20 72 65 74 75 72 6e 73 20 61 20 64 69 63 74 69   returns a dicti
3380: 6f 6e 61 72 79 20 6f 66 20 76 61 6c 75 65 73 22  onary of values"
3390: 0a 20 20 20 20 23 20 66 6f 72 20 63 6c 61 72 69  .    # for clari
33a0: 74 79 20 70 75 72 70 6f 73 65 2c 20 64 6f 6e e2  ty purpose, don.
33b0: 80 99 74 20 63 72 65 61 74 65 20 61 6e 79 20 66  ..t create any f
33c0: 69 6c 65 20 68 65 72 65 0a 0a 20 20 20 20 23 20  ile here..    # 
33d0: 72 65 6d 6f 76 69 6e 67 20 63 6f 6d 6d 65 6e 74  removing comment
33e0: 73 2c 20 7a 65 72 6f 69 6e 67 20 65 6d 70 74 79  s, zeroing empty
33f0: 20 6c 69 6e 65 73 2c 20 63 72 65 61 74 69 6e 67   lines, creating
3400: 20 64 65 66 69 6e 69 74 69 6f 6e 73 2c 20 73 74   definitions, st
3410: 6f 72 69 6e 67 20 74 65 73 74 73 2c 20 6d 65 72  oring tests, mer
3420: 67 69 6e 67 20 72 75 6c 65 20 6c 69 6e 65 73 0a  ging rule lines.
3430: 20 20 20 20 70 72 69 6e 74 28 22 20 20 70 61 72      print("  par
3440: 73 69 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29 0a  sing rules...").
3450: 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 20 3d      lTokenLine =
3460: 20 5b 5d 0a 20 20 20 20 73 41 63 74 69 6f 6e 73   [].    sActions
3470: 20 3d 20 22 22 0a 20 20 20 20 6e 50 72 69 6f 72   = "".    nPrior
3480: 69 74 79 20 3d 20 2d 31 0a 20 20 20 20 64 41 6c  ity = -1.    dAl
3490: 6c 47 72 61 70 68 20 3d 20 7b 7d 0a 20 20 20 20  lGraph = {}.    
34a0: 73 47 72 61 70 68 4e 61 6d 65 20 3d 20 22 22 0a  sGraphName = "".
34b0: 20 20 20 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b      iActionBlock
34c0: 20 3d 20 30 0a 0a 20 20 20 20 66 6f 72 20 69 2c   = 0..    for i,
34d0: 20 73 4c 69 6e 65 20 69 6e 20 6c 52 75 6c 65 3a   sLine in lRule:
34e0: 0a 20 20 20 20 20 20 20 20 73 4c 69 6e 65 20 3d  .        sLine =
34f0: 20 73 4c 69 6e 65 2e 72 73 74 72 69 70 28 29 0a   sLine.rstrip().
3500: 20 20 20 20 20 20 20 20 69 66 20 22 5c 74 22 20          if "\t" 
3510: 69 6e 20 73 4c 69 6e 65 3a 0a 20 20 20 20 20 20  in sLine:.      
3520: 20 20 20 20 20 20 23 20 74 61 62 75 6c 61 74 69        # tabulati
3530: 6f 6e 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 20  on not allowed. 
3540: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
3550: 28 22 45 72 72 6f 72 2e 20 54 61 62 75 6c 61 74  ("Error. Tabulat
3560: 69 6f 6e 20 61 74 20 6c 69 6e 65 3a 20 22 2c 20  ion at line: ", 
3570: 69 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  i).            e
3580: 78 69 74 28 29 0a 20 20 20 20 20 20 20 20 65 6c  xit().        el
3590: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
35a0: 69 74 68 28 22 40 40 40 40 47 52 41 50 48 3a 20  ith("@@@@GRAPH: 
35b0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
35c0: 23 20 72 75 6c 65 73 20 67 72 61 70 68 20 63 61  # rules graph ca
35d0: 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ll.            m
35e0: 20 3d 20 72 65 2e 6d 61 74 63 68 28 72 22 40 40   = re.match(r"@@
35f0: 40 40 47 52 41 50 48 3a 20 2a 28 5c 77 2b 29 22  @@GRAPH: *(\w+)"
3600: 2c 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 29  , sLine.strip())
3610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3620: 6d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m:.             
3630: 20 20 20 73 47 72 61 70 68 4e 61 6d 65 20 3d 20     sGraphName = 
3640: 6d 2e 67 72 6f 75 70 28 31 29 0a 20 20 20 20 20  m.group(1).     
3650: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 47             if sG
3660: 72 61 70 68 4e 61 6d 65 20 69 6e 20 64 41 6c 6c  raphName in dAll
3670: 47 72 61 70 68 3a 0a 20 20 20 20 20 20 20 20 20  Graph:.         
3680: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
3690: 28 22 45 72 72 6f 72 2e 20 47 72 61 70 68 20 6e  ("Error. Graph n
36a0: 61 6d 65 20 22 20 2b 20 73 47 72 61 70 68 4e 61  ame " + sGraphNa
36b0: 6d 65 20 2b 20 22 20 61 6c 72 65 61 64 79 20 65  me + " already e
36c0: 78 69 73 74 73 2e 22 29 0a 20 20 20 20 20 20 20  xists.").       
36d0: 20 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 20 20 20 20  t().            
36f0: 20 20 20 20 64 41 6c 6c 47 72 61 70 68 5b 73 47      dAllGraph[sG
3700: 72 61 70 68 4e 61 6d 65 5d 20 3d 20 5b 5d 0a 20  raphName] = []. 
3710: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3730: 20 70 72 69 6e 74 28 22 45 72 72 6f 72 2e 20 47   print("Error. G
3740: 72 61 70 68 20 6e 61 6d 65 20 6e 6f 74 20 66 6f  raph name not fo
3750: 75 6e 64 20 61 74 20 6c 69 6e 65 22 2c 20 69 29  und at line", i)
3760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3770: 20 65 78 69 74 28 29 0a 20 20 20 20 20 20 20 20   exit().        
3780: 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74  elif sLine.start
3790: 73 77 69 74 68 28 22 5f 5f 22 29 20 61 6e 64 20  swith("__") and 
37a0: 73 4c 69 6e 65 2e 65 6e 64 73 77 69 74 68 28 22  sLine.endswith("
37b0: 5f 5f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  __"):.          
37c0: 20 20 23 20 6e 65 77 20 72 75 6c 65 20 67 72 6f    # new rule gro
37d0: 75 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  up.            m
37e0: 20 3d 20 72 65 2e 6d 61 74 63 68 28 22 5f 5f 28   = re.match("__(
37f0: 5c 5c 77 2b 29 28 21 5c 5c 64 7c 29 5f 5f 22 2c  \\w+)(!\\d|)__",
3800: 20 73 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20   sLine).        
3810: 20 20 20 20 69 66 20 6d 3a 0a 20 20 20 20 20 20      if m:.      
3820: 20 20 20 20 20 20 20 20 20 20 73 52 75 6c 65 4e            sRuleN
3830: 61 6d 65 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29  ame = m.group(1)
3840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3850: 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b 20 3d 20   iActionBlock = 
3860: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
3870: 20 20 6e 50 72 69 6f 72 69 74 79 20 3d 20 69 6e    nPriority = in
3880: 74 28 6d 2e 67 72 6f 75 70 28 32 29 5b 31 3a 5d  t(m.group(2)[1:]
3890: 29 20 69 66 20 6d 2e 67 72 6f 75 70 28 32 29 20  ) if m.group(2) 
38a0: 20 65 6c 73 65 20 2d 31 0a 20 20 20 20 20 20 20   else -1.       
38b0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
38c0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
38d0: 28 22 53 79 6e 74 61 78 20 65 72 72 6f 72 20 69  ("Syntax error i
38e0: 6e 20 72 75 6c 65 20 67 72 6f 75 70 3a 20 22 2c  n rule group: ",
38f0: 20 73 4c 69 6e 65 2c 20 22 20 2d 2d 20 6c 69 6e   sLine, " -- lin
3900: 65 3a 22 2c 20 69 29 0a 20 20 20 20 20 20 20 20  e:", i).        
3910: 20 20 20 20 20 20 20 20 65 78 69 74 28 29 0a 20          exit(). 
3920: 20 20 20 20 20 20 20 65 6c 69 66 20 72 65 2e 73         elif re.s
3930: 65 61 72 63 68 28 22 5e 20 20 20 20 2b 3c 3c 2d  earch("^    +<<-
3940: 20 22 2c 20 73 4c 69 6e 65 29 20 6f 72 20 28 73   ", sLine) or (s
3950: 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28  Line.startswith(
3960: 22 20 20 20 20 20 20 20 20 22 29 20 61 6e 64 20  "        ") and 
3970: 6e 6f 74 20 73 4c 69 6e 65 2e 73 74 61 72 74 73  not sLine.starts
3980: 77 69 74 68 28 22 20 20 20 20 20 20 20 20 7c 7c  with("        ||
3990: 22 29 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ")) \.          
39a0: 20 20 20 20 20 20 6f 72 20 72 65 2e 73 65 61 72        or re.sear
39b0: 63 68 28 22 5e 20 20 20 20 2b 23 22 2c 20 73 4c  ch("^    +#", sL
39c0: 69 6e 65 29 20 6f 72 20 72 65 2e 73 65 61 72 63  ine) or re.searc
39d0: 68 28 72 22 5b 2d 7e 3d 3e 2f 25 5d 28 3f 3a 2d  h(r"[-~=>/%](?:-
39e0: 3f 5c 64 5c 2e 3f 28 3f 3a 3a 5c 2e 3f 2d 3f 5c  ?\d\.?(?::\.?-?\
39f0: 64 2b 7c 29 7c 29 3e 3e 20 22 2c 20 73 4c 69 6e  d+|)|)>> ", sLin
3a00: 65 29 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e) :.           
3a10: 20 23 20 61 63 74 69 6f 6e 73 0a 20 20 20 20 20   # actions.     
3a20: 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 73 20         sActions 
3a30: 2b 3d 20 22 20 22 20 2b 20 73 4c 69 6e 65 2e 73  += " " + sLine.s
3a40: 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 65  trip().        e
3a50: 6c 69 66 20 72 65 2e 6d 61 74 63 68 28 22 5b 20  lif re.match("[ 
3a60: c2 a0 5d 2a 24 22 2c 20 73 4c 69 6e 65 29 3a 0a  ..]*$", sLine):.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 65 6d              # em
3a80: 70 74 79 20 6c 69 6e 65 20 74 6f 20 65 6e 64 20  pty line to end 
3a90: 6d 65 72 67 69 6e 67 0a 20 20 20 20 20 20 20 20  merging.        
3aa0: 20 20 20 20 69 66 20 6e 6f 74 20 6c 54 6f 6b 65      if not lToke
3ab0: 6e 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 20  nLine:.         
3ac0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a         continue.
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
3ae0: 6f 74 20 73 41 63 74 69 6f 6e 73 3a 0a 20 20 20  ot sActions:.   
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
3b00: 6e 74 28 22 45 72 72 6f 72 2e 20 4e 6f 20 61 63  nt("Error. No ac
3b10: 74 69 6f 6e 20 66 6f 75 6e 64 20 61 74 20 6c 69  tion found at li
3b20: 6e 65 3a 22 2c 20 69 29 0a 20 20 20 20 20 20 20  ne:", i).       
3b30: 20 20 20 20 20 20 20 20 20 65 78 69 74 28 29 0a           exit().
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
3b50: 6f 74 20 73 47 72 61 70 68 4e 61 6d 65 3a 0a 20  ot sGraphName:. 
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3b70: 72 69 6e 74 28 22 45 72 72 6f 72 2e 20 41 6c 6c  rint("Error. All
3b80: 20 72 75 6c 65 73 20 6d 75 73 74 20 62 65 6c 6f   rules must belo
3b90: 6e 67 20 74 6f 20 61 20 6e 61 6d 65 64 20 67 72  ng to a named gr
3ba0: 61 70 68 2e 20 4c 69 6e 65 3a 20 22 2c 20 69 29  aph. Line: ", i)
3bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3bc0: 20 65 78 69 74 28 29 0a 20 20 20 20 20 20 20 20   exit().        
3bd0: 20 20 20 20 66 6f 72 20 6a 2c 20 73 54 6f 6b 65      for j, sToke
3be0: 6e 4c 69 6e 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c  nLine in lTokenL
3bf0: 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ine:.           
3c00: 20 20 20 20 20 64 41 6c 6c 47 72 61 70 68 5b 73       dAllGraph[s
3c10: 47 72 61 70 68 4e 61 6d 65 5d 2e 61 70 70 65 6e  GraphName].appen
3c20: 64 28 28 6a 2c 20 73 52 75 6c 65 4e 61 6d 65 2c  d((j, sRuleName,
3c30: 20 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63   sTokenLine, iAc
3c40: 74 69 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69  tionBlock, sActi
3c50: 6f 6e 73 2c 20 6e 50 72 69 6f 72 69 74 79 29 29  ons, nPriority))
3c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f  .            lTo
3c70: 6b 65 6e 4c 69 6e 65 2e 63 6c 65 61 72 28 29 0a  kenLine.clear().
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63 74              sAct
3c90: 69 6f 6e 73 20 3d 20 22 22 0a 20 20 20 20 20 20  ions = "".      
3ca0: 20 20 20 20 20 20 69 41 63 74 69 6f 6e 42 6c 6f        iActionBlo
3cb0: 63 6b 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20  ck += 1.        
3cc0: 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74  elif sLine.start
3cd0: 73 77 69 74 68 28 22 20 20 20 20 22 29 3a 0a 20  swith("    "):. 
3ce0: 20 20 20 20 20 20 20 20 20 20 20 23 20 74 6f 6b             # tok
3cf0: 65 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ens.            
3d00: 73 4c 69 6e 65 20 3d 20 73 4c 69 6e 65 2e 73 74  sLine = sLine.st
3d10: 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 20 20  rip().          
3d20: 20 20 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74    if sLine.start
3d30: 73 77 69 74 68 28 22 7c 7c 22 29 3a 0a 20 20 20  swith("||"):.   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 72               iPr
3d50: 65 76 4c 69 6e 65 2c 20 73 50 72 65 76 4c 69 6e  evLine, sPrevLin
3d60: 65 20 3d 20 6c 54 6f 6b 65 6e 4c 69 6e 65 5b 2d  e = lTokenLine[-
3d70: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1].             
3d80: 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 5b 2d 31     lTokenLine[-1
3d90: 5d 20 3d 20 5b 69 50 72 65 76 4c 69 6e 65 2c 20  ] = [iPrevLine, 
3da0: 73 50 72 65 76 4c 69 6e 65 20 2b 20 22 20 22 20  sPrevLine + " " 
3db0: 2b 20 73 4c 69 6e 65 5b 32 3a 5d 5d 0a 20 20 20  + sLine[2:]].   
3dc0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20           else:. 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
3de0: 54 6f 6b 65 6e 4c 69 6e 65 2e 61 70 70 65 6e 64  TokenLine.append
3df0: 28 5b 69 2c 20 73 4c 69 6e 65 5d 29 0a 20 20 20  ([i, sLine]).   
3e00: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
3e10: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 55 6e         print("Un
3e20: 6b 6e 6f 77 6e 20 6c 69 6e 65 3a 22 29 0a 20 20  known line:").  
3e30: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
3e40: 73 4c 69 6e 65 29 0a 0a 20 20 20 20 23 20 70 72  sLine)..    # pr
3e50: 6f 63 65 73 73 69 6e 67 20 72 75 6c 65 73 0a 20  ocessing rules. 
3e60: 20 20 20 70 72 69 6e 74 28 22 20 20 70 72 65 70     print("  prep
3e70: 61 72 69 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29  aring rules...")
3e80: 0a 20 20 20 20 66 6f 72 20 73 47 72 61 70 68 4e  .    for sGraphN
3e90: 61 6d 65 2c 20 6c 52 75 6c 65 4c 69 6e 65 20 69  ame, lRuleLine i
3ea0: 6e 20 64 41 6c 6c 47 72 61 70 68 2e 69 74 65 6d  n dAllGraph.item
3eb0: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 6c 50 72  s():.        lPr
3ec0: 65 70 61 72 65 64 52 75 6c 65 20 3d 20 5b 5d 0a  eparedRule = [].
3ed0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 2c 20 73          for i, s
3ee0: 52 75 6c 65 47 72 6f 75 70 2c 20 73 54 6f 6b 65  RuleGroup, sToke
3ef0: 6e 4c 69 6e 65 2c 20 69 41 63 74 69 6f 6e 42 6c  nLine, iActionBl
3f00: 6f 63 6b 2c 20 73 41 63 74 69 6f 6e 73 2c 20 6e  ock, sActions, n
3f10: 50 72 69 6f 72 69 74 79 20 69 6e 20 6c 52 75 6c  Priority in lRul
3f20: 65 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 20  eLine:.         
3f30: 20 20 20 66 6f 72 20 6c 52 75 6c 65 20 69 6e 20     for lRule in 
3f40: 63 72 65 61 74 65 52 75 6c 65 28 69 2c 20 73 52  createRule(i, sR
3f50: 75 6c 65 47 72 6f 75 70 2c 20 73 54 6f 6b 65 6e  uleGroup, sToken
3f60: 4c 69 6e 65 2c 20 69 41 63 74 69 6f 6e 42 6c 6f  Line, iActionBlo
3f70: 63 6b 2c 20 73 41 63 74 69 6f 6e 73 2c 20 6e 50  ck, sActions, nP
3f80: 72 69 6f 72 69 74 79 2c 20 64 4f 70 74 50 72 69  riority, dOptPri
3f90: 6f 72 69 74 79 2c 20 64 44 65 66 29 3a 0a 20 20  ority, dDef):.  
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
3fb0: 72 65 70 61 72 65 64 52 75 6c 65 2e 61 70 70 65  reparedRule.appe
3fc0: 6e 64 28 6c 52 75 6c 65 29 0a 20 20 20 20 20 20  nd(lRule).      
3fd0: 20 20 23 20 47 72 61 70 68 20 63 72 65 61 74 69    # Graph creati
3fe0: 6f 6e 0a 20 20 20 20 20 20 20 20 6f 44 41 52 47  on.        oDARG
3ff0: 20 3d 20 64 61 72 67 2e 44 41 52 47 28 6c 50 72   = darg.DARG(lPr
4000: 65 70 61 72 65 64 52 75 6c 65 2c 20 73 4c 61 6e  eparedRule, sLan
4010: 67 29 0a 20 20 20 20 20 20 20 20 64 41 6c 6c 47  g).        dAllG
4020: 72 61 70 68 5b 73 47 72 61 70 68 4e 61 6d 65 5d  raph[sGraphName]
4030: 20 3d 20 6f 44 41 52 47 2e 63 72 65 61 74 65 47   = oDARG.createG
4040: 72 61 70 68 28 29 0a 20 20 20 20 20 20 20 20 23  raph().        #
4050: 20 44 65 62 75 67 67 69 6e 67 0a 20 20 20 20 20   Debugging.     
4060: 20 20 20 69 66 20 46 61 6c 73 65 3a 0a 20 20 20     if False:.   
4070: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
4080: 5c 6e 52 55 4c 45 53 3a 22 29 0a 20 20 20 20 20  \nRULES:").     
4090: 20 20 20 20 20 20 20 66 6f 72 20 65 20 69 6e 20         for e in 
40a0: 6c 50 72 65 70 61 72 65 64 52 75 6c 65 3a 0a 20  lPreparedRule:. 
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
40c0: 66 20 65 5b 2d 32 5d 20 3d 3d 20 22 23 23 32 32  f e[-2] == "##22
40d0: 31 31 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  11":.           
40e0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 65           print(e
40f0: 29 0a 20 20 20 20 20 20 20 20 69 66 20 46 61 6c  ).        if Fal
4100: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
4110: 70 72 69 6e 74 28 22 5c 6e 47 52 41 50 48 3a 22  print("\nGRAPH:"
4120: 2c 20 73 47 72 61 70 68 4e 61 6d 65 29 0a 20 20  , sGraphName).  
4130: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 6b 2c            for k,
4140: 20 76 20 69 6e 20 64 41 6c 6c 47 72 61 70 68 5b   v in dAllGraph[
4150: 73 47 72 61 70 68 4e 61 6d 65 5d 2e 69 74 65 6d  sGraphName].item
4160: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s():.           
4170: 20 20 20 20 20 70 72 69 6e 74 28 6b 2c 20 22 5c       print(k, "\
4180: 74 22 2c 20 76 29 0a 0a 20 20 20 20 23 20 63 72  t", v)..    # cr
4190: 65 61 74 69 6e 67 20 66 69 6c 65 20 77 69 74 68  eating file with
41a0: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63   all functions c
41b0: 61 6c 6c 61 62 6c 65 20 62 79 20 72 75 6c 65 73  allable by rules
41c0: 0a 20 20 20 20 70 72 69 6e 74 28 22 20 20 63 72  .    print("  cr
41d0: 65 61 74 69 6e 67 20 63 61 6c 6c 61 62 6c 65 73  eating callables
41e0: 2e 2e 2e 22 29 0a 20 20 20 20 73 50 79 43 61 6c  ...").    sPyCal
41f0: 6c 61 62 6c 65 73 20 3d 20 22 23 20 67 65 6e 65  lables = "# gene
4200: 72 61 74 65 64 20 63 6f 64 65 2c 20 64 6f 20 6e  rated code, do n
4210: 6f 74 20 65 64 69 74 5c 6e 22 0a 20 20 20 20 23  ot edit\n".    #
4220: 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20 3d 20 22  sJSCallables = "
4230: 2f 2f 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  // generated cod
4240: 65 2c 20 64 6f 20 6e 6f 74 20 65 64 69 74 5c 6e  e, do not edit\n
4250: 63 6f 6e 73 74 20 6f 45 76 61 6c 46 75 6e 63 20  const oEvalFunc 
4260: 3d 20 7b 5c 6e 22 0a 20 20 20 20 66 6f 72 20 73  = {\n".    for s
4270: 46 75 6e 63 4e 61 6d 65 2c 20 73 52 65 74 75 72  FuncName, sRetur
4280: 6e 20 69 6e 20 64 46 55 4e 43 54 49 4f 4e 53 2e  n in dFUNCTIONS.
4290: 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20  items():.       
42a0: 20 69 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74   if sFuncName.st
42b0: 61 72 74 73 77 69 74 68 28 22 5f 67 5f 63 6f 6e  artswith("_g_con
42c0: 64 5f 22 29 3a 20 23 20 63 6f 6e 64 69 74 69 6f  d_"): # conditio
42d0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 50  n.            sP
42e0: 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c  arams = "lToken,
42f0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e   nTokenOffset, n
4300: 4c 61 73 74 54 6f 6b 65 6e 2c 20 73 43 6f 75 6e  LastToken, sCoun
4310: 74 72 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 2c 20  try, bCondMemo, 
4320: 64 54 61 67 73 2c 20 73 53 65 6e 74 65 6e 63 65  dTags, sSentence
4330: 2c 20 73 53 65 6e 74 65 6e 63 65 30 22 0a 20 20  , sSentence0".  
4340: 20 20 20 20 20 20 65 6c 69 66 20 73 46 75 6e 63        elif sFunc
4350: 4e 61 6d 65 2e 73 74 61 72 74 73 77 69 74 68 28  Name.startswith(
4360: 22 67 5f 6d 73 67 5f 22 29 3a 20 23 20 6d 65 73  "g_msg_"): # mes
4370: 73 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20  sage.           
4380: 20 73 50 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b   sParams = "lTok
4390: 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  en, nTokenOffset
43a0: 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73  ".        elif s
43b0: 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73 77  FuncName.startsw
43c0: 69 74 68 28 22 5f 67 5f 73 75 67 67 5f 22 29 3a  ith("_g_sugg_"):
43d0: 20 23 20 73 75 67 67 65 73 74 69 6f 6e 0a 20 20   # suggestion.  
43e0: 20 20 20 20 20 20 20 20 20 20 73 50 61 72 61 6d            sParam
43f0: 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e 54 6f  s = "lToken, nTo
4400: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
4410: 54 6f 6b 65 6e 22 0a 20 20 20 20 20 20 20 20 65  Token".        e
4420: 6c 69 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74  lif sFuncName.st
4430: 61 72 74 73 77 69 74 68 28 22 5f 67 5f 74 70 5f  artswith("_g_tp_
4440: 22 29 3a 20 23 20 74 65 78 74 20 70 72 65 70 72  "): # text prepr
4450: 6f 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20 20  ocessor.        
4460: 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 6c      sParams = "l
4470: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
4480: 73 65 74 22 0a 20 20 20 20 20 20 20 20 65 6c 69  set".        eli
4490: 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72  f sFuncName.star
44a0: 74 73 77 69 74 68 28 22 5f 67 5f 64 61 5f 22 29  tswith("_g_da_")
44b0: 3a 20 23 20 64 69 73 61 6d 62 69 67 75 61 74 6f  : # disambiguato
44c0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 50  r.            sP
44d0: 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c  arams = "lToken,
44e0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 22 0a 20   nTokenOffset". 
44f0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
4500: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
4510: 23 20 55 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69  # Unknown functi
4520: 6f 6e 20 74 79 70 65 20 69 6e 20 5b 22 20 2b 20  on type in [" + 
4530: 73 46 75 6e 63 4e 61 6d 65 20 2b 20 22 5d 22 29  sFuncName + "]")
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
4550: 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 73 50  tinue.        sP
4560: 79 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 64  yCallables += "d
4570: 65 66 20 7b 7d 20 28 7b 7d 29 3a 5c 6e 22 2e 66  ef {} ({}):\n".f
4580: 6f 72 6d 61 74 28 73 46 75 6e 63 4e 61 6d 65 2c  ormat(sFuncName,
4590: 20 73 50 61 72 61 6d 73 29 0a 20 20 20 20 20 20   sParams).      
45a0: 20 20 73 50 79 43 61 6c 6c 61 62 6c 65 73 20 2b    sPyCallables +
45b0: 3d 20 22 20 20 20 20 72 65 74 75 72 6e 20 22 20  = "    return " 
45c0: 2b 20 73 52 65 74 75 72 6e 20 2b 20 22 5c 6e 22  + sReturn + "\n"
45d0: 0a 20 20 20 20 20 20 20 20 23 73 4a 53 43 61 6c  .        #sJSCal
45e0: 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 7b  lables += "    {
45f0: 7d 3a 20 66 75 6e 63 74 69 6f 6e 20 28 7b 7d 29  }: function ({})
4600: 22 2e 66 6f 72 6d 61 74 28 73 46 75 6e 63 4e 61  ".format(sFuncNa
4610: 6d 65 2c 20 73 50 61 72 61 6d 73 29 20 2b 20 22  me, sParams) + "
4620: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 23 73   {\n".        #s
4630: 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22  JSCallables += "
4640: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
4650: 20 2b 20 6a 73 63 6f 6e 76 2e 70 79 32 6a 73 28   + jsconv.py2js(
4660: 73 52 65 74 75 72 6e 29 20 2b 20 22 3b 5c 6e 22  sReturn) + ";\n"
4670: 0a 20 20 20 20 20 20 20 20 23 73 4a 53 43 61 6c  .        #sJSCal
4680: 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 7d  lables += "    }
4690: 2c 5c 6e 22 0a 20 20 20 20 23 73 4a 53 43 61 6c  ,\n".    #sJSCal
46a0: 6c 61 62 6c 65 73 20 2b 3d 20 22 7d 5c 6e 22 0a  lables += "}\n".
46b0: 0a 20 20 20 20 23 20 44 65 62 75 67 67 69 6e 67  .    # Debugging
46c0: 0a 20 20 20 20 69 66 20 46 61 6c 73 65 3a 0a 20  .    if False:. 
46d0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e         print("\n
46e0: 41 63 74 69 6f 6e 73 3a 22 29 0a 20 20 20 20 20  Actions:").     
46f0: 20 20 20 66 6f 72 20 73 41 63 74 69 6f 6e 4e 61     for sActionNa
4700: 6d 65 2c 20 61 41 63 74 69 6f 6e 20 69 6e 20 64  me, aAction in d
4710: 41 43 54 49 4f 4e 53 2e 69 74 65 6d 73 28 29 3a  ACTIONS.items():
4720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
4730: 6e 74 28 73 41 63 74 69 6f 6e 4e 61 6d 65 2c 20  nt(sActionName, 
4740: 61 41 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20  aAction).       
4750: 20 70 72 69 6e 74 28 22 5c 6e 46 75 6e 63 74 69   print("\nFuncti
4760: 6f 6e 73 3a 22 29 0a 20 20 20 20 20 20 20 20 70  ons:").        p
4770: 72 69 6e 74 28 73 50 79 43 61 6c 6c 61 62 6c 65  rint(sPyCallable
4780: 73 29 0a 0a 20 20 20 20 23 20 52 65 73 75 6c 74  s)..    # Result
4790: 0a 20 20 20 20 72 65 74 75 72 6e 20 7b 0a 20 20  .    return {.  
47a0: 20 20 20 20 20 20 22 67 72 61 70 68 5f 63 61 6c        "graph_cal
47b0: 6c 61 62 6c 65 73 22 3a 20 73 50 79 43 61 6c 6c  lables": sPyCall
47c0: 61 62 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 22  ables,.        "
47d0: 72 75 6c 65 73 5f 67 72 61 70 68 73 22 3a 20 64  rules_graphs": d
47e0: 41 6c 6c 47 72 61 70 68 2c 0a 20 20 20 20 20 20  AllGraph,.      
47f0: 20 20 22 72 75 6c 65 73 5f 61 63 74 69 6f 6e 73    "rules_actions
4800: 22 3a 20 64 41 43 54 49 4f 4e 53 0a 20 20 20 20  ": dACTIONS.    
4810: 7d 0a                                            }.