Grammalecte  Hex Artifact Content

Artifact 9a310e2206a11dd9eeb77cef43f0c32ab043378f9e09c4d851ecad21fb0cb380:


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 0a 69 6d 70 6f 72  import re..impor
0060: 74 20 64 61 72 67 0a 69 6d 70 6f 72 74 20 63 6f  t darg.import co
0070: 6d 70 69 6c 65 5f 72 75 6c 65 73 5f 6a 73 5f 63  mpile_rules_js_c
0080: 6f 6e 76 65 72 74 20 61 73 20 6a 73 63 6f 6e 76  onvert as jsconv
0090: 0a 0a 0a 64 41 43 54 49 4f 4e 53 20 3d 20 7b 7d  ...dACTIONS = {}
00a0: 0a 64 46 55 4e 43 54 49 4f 4e 53 20 3d 20 7b 7d  .dFUNCTIONS = {}
00b0: 0a 64 46 55 4e 43 4e 41 4d 45 20 3d 20 7b 7d 0a  .dFUNCNAME = {}.
00c0: 64 44 45 43 4c 45 4e 53 49 4f 4e 53 20 3d 20 7b  dDECLENSIONS = {
00d0: 7d 0a 64 41 4e 54 49 50 41 54 54 45 52 4e 53 20  }.dANTIPATTERNS 
00e0: 3d 20 7b 7d 0a 0a 0a 64 65 66 20 63 72 65 61 74  = {}...def creat
00f0: 65 46 75 6e 63 74 69 6f 6e 20 28 73 54 79 70 65  eFunction (sType
0100: 2c 20 73 43 6f 64 65 2c 20 62 53 74 61 72 74 57  , sCode, bStartW
0110: 69 74 68 45 71 75 61 6c 3d 46 61 6c 73 65 29 3a  ithEqual=False):
0120: 0a 20 20 20 20 22 63 72 65 61 74 65 20 61 20 66  .    "create a f
0130: 75 6e 63 74 69 6f 6e 20 28 73 74 6f 72 65 64 20  unction (stored 
0140: 69 6e 20 3c 64 46 55 4e 43 54 49 4f 4e 53 3e 29  in <dFUNCTIONS>)
0150: 20 61 6e 64 20 72 65 74 75 72 6e 20 66 75 6e 63   and return func
0160: 74 69 6f 6e 20 6e 61 6d 65 22 0a 20 20 20 20 73  tion name".    s
0170: 43 6f 64 65 20 3d 20 70 72 65 70 61 72 65 46 75  Code = prepareFu
0180: 6e 63 74 69 6f 6e 28 73 43 6f 64 65 29 0a 20 20  nction(sCode).  
0190: 20 20 69 66 20 73 54 79 70 65 20 6e 6f 74 20 69    if sType not i
01a0: 6e 20 64 46 55 4e 43 4e 41 4d 45 3a 0a 20 20 20  n dFUNCNAME:.   
01b0: 20 20 20 20 20 64 46 55 4e 43 4e 41 4d 45 5b 73       dFUNCNAME[s
01c0: 54 79 70 65 5d 20 3d 20 7b 7d 0a 20 20 20 20 69  Type] = {}.    i
01d0: 66 20 73 43 6f 64 65 20 6e 6f 74 20 69 6e 20 64  f sCode not in d
01e0: 46 55 4e 43 4e 41 4d 45 5b 73 54 79 70 65 5d 3a  FUNCNAME[sType]:
01f0: 0a 20 20 20 20 20 20 20 20 64 46 55 4e 43 4e 41  .        dFUNCNA
0200: 4d 45 5b 73 54 79 70 65 5d 5b 73 43 6f 64 65 5d  ME[sType][sCode]
0210: 20 3d 20 6c 65 6e 28 64 46 55 4e 43 4e 41 4d 45   = len(dFUNCNAME
0220: 5b 73 54 79 70 65 5d 29 2b 31 0a 20 20 20 20 73  [sType])+1.    s
0230: 46 75 6e 63 4e 61 6d 65 20 3d 20 22 5f 67 5f 22  FuncName = "_g_"
0240: 20 2b 20 73 54 79 70 65 20 2b 20 22 5f 22 20 2b   + sType + "_" +
0250: 20 73 74 72 28 64 46 55 4e 43 4e 41 4d 45 5b 73   str(dFUNCNAME[s
0260: 54 79 70 65 5d 5b 73 43 6f 64 65 5d 29 0a 20 20  Type][sCode]).  
0270: 20 20 64 46 55 4e 43 54 49 4f 4e 53 5b 73 46 75    dFUNCTIONS[sFu
0280: 6e 63 4e 61 6d 65 5d 20 3d 20 73 43 6f 64 65 0a  ncName] = sCode.
0290: 20 20 20 20 72 65 74 75 72 6e 20 73 46 75 6e 63      return sFunc
02a0: 4e 61 6d 65 20 20 69 66 20 6e 6f 74 20 62 53 74  Name  if not bSt
02b0: 61 72 74 57 69 74 68 45 71 75 61 6c 20 20 65 6c  artWithEqual  el
02c0: 73 65 20 22 3d 22 2b 73 46 75 6e 63 4e 61 6d 65  se "="+sFuncName
02d0: 0a 0a 0a 64 65 66 20 73 74 6f 72 65 41 63 74 69  ...def storeActi
02e0: 6f 6e 20 28 73 41 63 74 69 6f 6e 49 64 2c 20 61  on (sActionId, a
02f0: 41 63 74 69 6f 6e 29 3a 0a 20 20 20 20 22 73 74  Action):.    "st
0300: 6f 72 65 20 3c 61 41 63 74 69 6f 6e 3e 20 69 6e  ore <aAction> in
0310: 20 3c 64 41 43 54 49 4f 4e 53 3e 20 61 76 6f 69   <dACTIONS> avoi
0320: 64 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 22  ding duplicates"
0330: 0a 20 20 20 20 6e 56 61 72 20 3d 20 30 0a 20 20  .    nVar = 0.  
0340: 20 20 77 68 69 6c 65 20 54 72 75 65 3a 0a 20 20    while True:.  
0350: 20 20 20 20 20 20 73 41 63 74 69 6f 6e 4e 61 6d        sActionNam
0360: 65 20 3d 20 73 41 63 74 69 6f 6e 49 64 20 2b 20  e = sActionId + 
0370: 22 5f 22 20 2b 20 73 74 72 28 6e 56 61 72 29 0a  "_" + str(nVar).
0380: 20 20 20 20 20 20 20 20 69 66 20 73 41 63 74 69          if sActi
0390: 6f 6e 4e 61 6d 65 20 6e 6f 74 20 69 6e 20 64 41  onName not in dA
03a0: 43 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20  CTIONS:.        
03b0: 20 20 20 20 64 41 43 54 49 4f 4e 53 5b 73 41 63      dACTIONS[sAc
03c0: 74 69 6f 6e 4e 61 6d 65 5d 20 3d 20 61 41 63 74  tionName] = aAct
03d0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
03e0: 72 65 74 75 72 6e 20 73 41 63 74 69 6f 6e 4e 61  return sActionNa
03f0: 6d 65 0a 20 20 20 20 20 20 20 20 69 66 20 61 41  me.        if aA
0400: 63 74 69 6f 6e 20 3d 3d 20 64 41 43 54 49 4f 4e  ction == dACTION
0410: 53 5b 73 41 63 74 69 6f 6e 4e 61 6d 65 5d 3a 0a  S[sActionName]:.
0420: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0430: 72 6e 20 73 41 63 74 69 6f 6e 4e 61 6d 65 0a 20  rn sActionName. 
0440: 20 20 20 20 20 20 20 6e 56 61 72 20 2b 3d 20 31         nVar += 1
0450: 0a 0a 0a 64 65 66 20 70 72 65 70 61 72 65 46 75  ...def prepareFu
0460: 6e 63 74 69 6f 6e 20 28 73 43 6f 64 65 29 3a 0a  nction (sCode):.
0470: 20 20 20 20 22 63 6f 6e 76 65 72 74 20 73 69 6d      "convert sim
0480: 70 6c 65 20 72 75 6c 65 20 73 79 6e 74 61 78 20  ple rule syntax 
0490: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 66 20 50  to a string of P
04a0: 79 74 68 6f 6e 20 63 6f 64 65 22 0a 20 20 20 20  ython code".    
04b0: 69 66 20 73 43 6f 64 65 5b 30 3a 31 5d 20 3d 3d  if sCode[0:1] ==
04c0: 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 73 43   "=":.        sC
04d0: 6f 64 65 20 3d 20 73 43 6f 64 65 5b 31 3a 5d 0a  ode = sCode[1:].
04e0: 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64      sCode = sCod
04f0: 65 2e 72 65 70 6c 61 63 65 28 22 5f 5f 61 6c 73  e.replace("__als
0500: 6f 5f 5f 22 2c 20 22 62 43 6f 6e 64 4d 65 6d 6f  o__", "bCondMemo
0510: 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73  ").    sCode = s
0520: 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 5f 5f  Code.replace("__
0530: 65 6c 73 65 5f 5f 22 2c 20 22 6e 6f 74 20 62 43  else__", "not bC
0540: 6f 6e 64 4d 65 6d 6f 22 29 0a 20 20 20 20 73 43  ondMemo").    sC
0550: 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c  ode = sCode.repl
0560: 61 63 65 28 22 73 43 6f 6e 74 65 78 74 22 2c 20  ace("sContext", 
0570: 22 5f 73 41 70 70 43 6f 6e 74 65 78 74 22 29 0a  "_sAppContext").
0580: 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73      sCode = re.s
0590: 75 62 28 72 22 5c 62 28 6d 6f 72 70 68 7c 6d 6f  ub(r"\b(morph|mo
05a0: 72 70 68 56 43 7c 61 6e 61 6c 79 73 65 7c 76 61  rphVC|analyse|va
05b0: 6c 75 65 7c 74 61 67 7c 64 69 73 70 6c 61 79 49  lue|tag|displayI
05c0: 6e 66 6f 29 5b 28 5d 5c 5c 28 5c 64 2b 29 22 2c  nfo)[(]\\(\d+)",
05d0: 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e   'g_\\1(lToken[n
05e0: 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 32 5d  TokenOffset+\\2]
05f0: 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43  ', sCode).    sC
0600: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c  ode = re.sub(r"\
0610: 62 28 6d 6f 72 70 68 7c 6d 6f 72 70 68 56 43 7c  b(morph|morphVC|
0620: 61 6e 61 6c 79 73 65 7c 76 61 6c 75 65 7c 74 61  analyse|value|ta
0630: 67 7c 64 69 73 70 6c 61 79 49 6e 66 6f 29 5b 28  g|displayInfo)[(
0640: 5d 5c 5c 2d 28 5c 64 2b 29 22 2c 20 27 67 5f 5c  ]\\-(\d+)", 'g_\
0650: 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  \1(lToken[nLastT
0660: 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 27 2c 20 73 43  oken-\\2+1]', sC
0670: 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  ode).    sCode =
0680: 20 72 65 2e 73 75 62 28 72 22 5c 62 28 73 65 6c   re.sub(r"\b(sel
0690: 65 63 74 7c 65 78 63 6c 75 64 65 7c 64 65 66 69  ect|exclude|defi
06a0: 6e 65 7c 64 65 66 69 6e 65 5f 66 72 6f 6d 7c 61  ne|define_from|a
06b0: 64 64 5f 6d 6f 72 70 68 7c 63 68 61 6e 67 65 5f  dd_morph|change_
06c0: 6d 65 74 61 29 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b  meta)[(][\\](\d+
06d0: 29 22 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65  )", 'g_\\1(lToke
06e0: 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c  n[nTokenOffset+\
06f0: 5c 32 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20  \2]', sCode).   
0700: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
0710: 72 22 5c 62 28 73 65 6c 65 63 74 7c 65 78 63 6c  r"\b(select|excl
0720: 75 64 65 7c 64 65 66 69 6e 65 7c 64 65 66 69 6e  ude|define|defin
0730: 65 5f 66 72 6f 6d 7c 61 64 64 5f 6d 6f 72 70 68  e_from|add_morph
0740: 7c 63 68 61 6e 67 65 5f 6d 65 74 61 29 5b 28 5d  |change_meta)[(]
0750: 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 67 5f  [\\]-(\d+)", 'g_
0760: 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74  \\1(lToken[nLast
0770: 54 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 27 2c 20 73  Token-\\2+1]', s
0780: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
0790: 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 28 74 61  = re.sub(r"\b(ta
07a0: 67 5f 62 65 66 6f 72 65 7c 74 61 67 5f 61 66 74  g_before|tag_aft
07b0: 65 72 29 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29 22  er)[(][\\](\d+)"
07c0: 2c 20 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b  , 'g_\\1(lToken[
07d0: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 32  nTokenOffset+\\2
07e0: 5d 2c 20 64 54 61 67 73 27 2c 20 73 43 6f 64 65  ], dTags', sCode
07f0: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65  ).    sCode = re
0800: 2e 73 75 62 28 72 22 5c 62 28 74 61 67 5f 62 65  .sub(r"\b(tag_be
0810: 66 6f 72 65 7c 74 61 67 5f 61 66 74 65 72 29 5b  fore|tag_after)[
0820: 28 5d 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27  (][\\]-(\d+)", '
0830: 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c 61  g_\\1(lToken[nLa
0840: 73 74 54 6f 6b 65 6e 2d 5c 5c 32 2b 31 5d 2c 20  stToken-\\2+1], 
0850: 64 54 61 67 73 27 2c 20 73 43 6f 64 65 29 0a 20  dTags', sCode). 
0860: 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75     sCode = re.su
0870: 62 28 72 22 5c 62 73 70 61 63 65 5f 61 66 74 65  b(r"\bspace_afte
0880: 72 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29 22 2c 20  r[(][\\](\d+)", 
0890: 27 67 5f 73 70 61 63 65 5f 62 65 74 77 65 65 6e  'g_space_between
08a0: 5f 74 6f 6b 65 6e 73 28 6c 54 6f 6b 65 6e 5b 6e  _tokens(lToken[n
08b0: 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 5d  TokenOffset+\\1]
08c0: 2c 20 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f  , lToken[nTokenO
08d0: 66 66 73 65 74 2b 5c 5c 31 2b 31 5d 27 2c 20 73  ffset+\\1+1]', s
08e0: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
08f0: 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 73 70 61  = re.sub(r"\bspa
0900: 63 65 5f 61 66 74 65 72 5b 28 5d 5b 5c 5c 5d 2d  ce_after[(][\\]-
0910: 28 5c 64 2b 29 22 2c 20 27 67 5f 73 70 61 63 65  (\d+)", 'g_space
0920: 5f 62 65 74 77 65 65 6e 5f 74 6f 6b 65 6e 73 28  _between_tokens(
0930: 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65  lToken[nLastToke
0940: 6e 2d 5c 5c 31 2b 31 5d 2c 20 6c 54 6f 6b 65 6e  n-\\1+1], lToken
0950: 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c 5c 31 2b  [nLastToken-\\1+
0960: 32 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20  2]', sCode).    
0970: 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72  sCode = re.sub(r
0980: 22 5c 62 61 6e 61 6c 79 73 65 5f 77 69 74 68 5f  "\banalyse_with_
0990: 6e 65 78 74 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29  next[(][\\](\d+)
09a0: 22 2c 20 27 67 5f 6d 65 72 67 65 64 5f 61 6e 61  ", 'g_merged_ana
09b0: 6c 79 73 65 28 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b  lyse(lToken[nTok
09c0: 65 6e 4f 66 66 73 65 74 2b 5c 5c 31 5d 2c 20 6c  enOffset+\\1], l
09d0: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73  Token[nTokenOffs
09e0: 65 74 2b 5c 5c 31 2b 31 5d 27 2c 20 73 43 6f 64  et+\\1+1]', sCod
09f0: 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72  e).    sCode = r
0a00: 65 2e 73 75 62 28 72 22 5c 62 61 6e 61 6c 79 73  e.sub(r"\banalys
0a10: 65 5f 77 69 74 68 5f 6e 65 78 74 5b 28 5d 5b 5c  e_with_next[(][\
0a20: 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 67 5f 6d 65  \]-(\d+)", 'g_me
0a30: 72 67 65 64 5f 61 6e 61 6c 79 73 65 28 6c 54 6f  rged_analyse(lTo
0a40: 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2d 5c  ken[nLastToken-\
0a50: 5c 31 2b 31 5d 2c 20 6c 54 6f 6b 65 6e 5b 6e 4c  \1+1], lToken[nL
0a60: 61 73 74 54 6f 6b 65 6e 2d 5c 5c 31 2b 32 5d 27  astToken-\\1+2]'
0a70: 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f  , sCode).    sCo
0a80: 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c 62  de = re.sub(r"\b
0a90: 28 6d 6f 72 70 68 7c 61 6e 61 6c 79 73 65 7c 74  (morph|analyse|t
0aa0: 61 67 7c 76 61 6c 75 65 29 5c 28 3e 31 22 2c 20  ag|value)\(>1", 
0ab0: 27 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 4c  'g_\\1(lToken[nL
0ac0: 61 73 74 54 6f 6b 65 6e 2b 31 5d 27 2c 20 73 43  astToken+1]', sC
0ad0: 6f 64 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ode)            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 65 78             # nex
0af0: 74 20 74 6f 6b 65 6e 0a 20 20 20 20 73 43 6f 64  t token.    sCod
0b00: 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 28  e = re.sub(r"\b(
0b10: 6d 6f 72 70 68 7c 61 6e 61 6c 79 73 65 7c 74 61  morph|analyse|ta
0b20: 67 7c 76 61 6c 75 65 29 5c 28 3c 31 22 2c 20 27  g|value)\(<1", '
0b30: 67 5f 5c 5c 31 28 6c 54 6f 6b 65 6e 5b 6e 54 6f  g_\\1(lToken[nTo
0b40: 6b 65 6e 4f 66 66 73 65 74 5d 27 2c 20 73 43 6f  kenOffset]', sCo
0b50: 64 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  de)             
0b60: 20 20 20 20 20 20 20 20 20 20 23 20 70 72 65 76            # prev
0b70: 69 6f 75 73 20 74 6f 6b 65 6e 0a 20 20 20 20 73  ious token.    s
0b80: 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22  Code = re.sub(r"
0b90: 5c 62 28 6d 6f 72 70 68 7c 61 6e 61 6c 79 73 65  \b(morph|analyse
0ba0: 7c 74 61 67 7c 76 61 6c 75 65 29 5c 28 3e 28 5c  |tag|value)\(>(\
0bb0: 64 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 67 5f 74  d+)", 'g_\\1(g_t
0bc0: 6f 6b 65 6e 28 6c 54 6f 6b 65 6e 2c 20 6e 4c 61  oken(lToken, nLa
0bd0: 73 74 54 6f 6b 65 6e 2b 5c 5c 32 29 27 2c 20 73  stToken+\\2)', s
0be0: 43 6f 64 65 29 20 20 20 20 20 20 20 20 23 20 6e  Code)        # n
0bf0: 65 78 74 20 74 6f 6b 65 6e 0a 20 20 20 20 73 43  ext token.    sC
0c00: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c  ode = re.sub(r"\
0c10: 62 28 6d 6f 72 70 68 7c 61 6e 61 6c 79 73 65 7c  b(morph|analyse|
0c20: 74 61 67 7c 76 61 6c 75 65 29 5c 28 3c 28 5c 64  tag|value)\(<(\d
0c30: 2b 29 22 2c 20 27 67 5f 5c 5c 31 28 67 5f 74 6f  +)", 'g_\\1(g_to
0c40: 6b 65 6e 28 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ken(lToken, nTok
0c50: 65 6e 4f 66 66 73 65 74 2b 31 2d 5c 5c 32 29 27  enOffset+1-\\2)'
0c60: 2c 20 73 43 6f 64 65 29 20 20 20 20 23 20 70 72  , sCode)    # pr
0c70: 65 76 69 6f 75 73 20 74 6f 6b 65 6e 0a 20 20 20  evious token.   
0c80: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
0c90: 72 22 5c 62 73 70 65 6c 6c 20 2a 5b 28 5d 22 2c  r"\bspell *[(]",
0ca0: 20 27 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72   '_oSpellChecker
0cb0: 2e 69 73 56 61 6c 69 64 28 27 2c 20 73 43 6f 64  .isValid(', sCod
0cc0: 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72  e).    sCode = r
0cd0: 65 2e 73 75 62 28 72 22 5c 62 62 65 66 6f 72 65  e.sub(r"\bbefore
0ce0: 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73 53  \(\s*", 'look(sS
0cf0: 65 6e 74 65 6e 63 65 5b 3a 6c 54 6f 6b 65 6e 5b  entence[:lToken[
0d00: 31 2b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 5d 5b  1+nTokenOffset][
0d10: 22 6e 53 74 61 72 74 22 5d 5d 2c 20 27 2c 20 73  "nStart"]], ', s
0d20: 43 6f 64 65 29 20 20 20 20 20 20 20 20 20 20 23  Code)          #
0d30: 20 62 65 66 6f 72 65 28 73 43 6f 64 65 29 0a 20   before(sCode). 
0d40: 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75     sCode = re.su
0d50: 62 28 72 22 5c 62 61 66 74 65 72 5c 28 5c 73 2a  b(r"\bafter\(\s*
0d60: 22 2c 20 27 6c 6f 6f 6b 28 73 53 65 6e 74 65 6e  ", 'look(sSenten
0d70: 63 65 5b 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54  ce[lToken[nLastT
0d80: 6f 6b 65 6e 5d 5b 22 6e 45 6e 64 22 5d 3a 5d 2c  oken]["nEnd"]:],
0d90: 20 27 2c 20 73 43 6f 64 65 29 20 20 20 20 20 20   ', sCode)      
0da0: 20 20 20 20 20 20 20 20 20 20 20 23 20 61 66 74             # aft
0db0: 65 72 28 73 43 6f 64 65 29 0a 20 20 20 20 73 43  er(sCode).    sC
0dc0: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22 5c  ode = re.sub(r"\
0dd0: 62 62 65 66 6f 72 65 30 5c 28 5c 73 2a 22 2c 20  bbefore0\(\s*", 
0de0: 27 6c 6f 6f 6b 28 73 53 65 6e 74 65 6e 63 65 30  'look(sSentence0
0df0: 5b 3a 6c 54 6f 6b 65 6e 5b 31 2b 6e 54 6f 6b 65  [:lToken[1+nToke
0e00: 6e 4f 66 66 73 65 74 5d 5b 22 6e 53 74 61 72 74  nOffset]["nStart
0e10: 22 5d 5d 2c 20 27 2c 20 73 43 6f 64 65 29 20 20  "]], ', sCode)  
0e20: 20 20 20 20 20 20 23 20 62 65 66 6f 72 65 30 28        # before0(
0e30: 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65  sCode).    sCode
0e40: 20 3d 20 72 65 2e 73 75 62 28 72 22 5c 62 61 66   = re.sub(r"\baf
0e50: 74 65 72 30 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f  ter0\(\s*", 'loo
0e60: 6b 28 73 53 65 6e 74 65 6e 63 65 5b 6c 54 6f 6b  k(sSentence[lTok
0e70: 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 5d 5b 22  en[nLastToken]["
0e80: 6e 45 6e 64 22 5d 3a 5d 2c 20 27 2c 20 73 43 6f  nEnd"]:], ', sCo
0e90: 64 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  de)             
0ea0: 20 20 20 23 20 61 66 74 65 72 30 28 73 43 6f 64     # after0(sCod
0eb0: 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72  e).    sCode = r
0ec0: 65 2e 73 75 62 28 72 22 5c 62 61 6e 61 6c 79 73  e.sub(r"\banalys
0ed0: 65 57 6f 72 64 5b 28 5d 22 2c 20 27 61 6e 61 6c  eWord[(]", 'anal
0ee0: 79 73 65 28 27 2c 20 73 43 6f 64 65 29 0a 20 20  yse(', sCode).  
0ef0: 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62    sCode = re.sub
0f00: 28 72 22 5b 5c 5c 5d 28 5c 64 2b 29 22 2c 20 27  (r"[\\](\d+)", '
0f10: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66  lToken[nTokenOff
0f20: 73 65 74 2b 5c 5c 31 5d 5b 22 73 56 61 6c 75 65  set+\\1]["sValue
0f30: 22 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20  "]', sCode).    
0f40: 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72  sCode = re.sub(r
0f50: 22 5b 5c 5c 5d 2d 28 5c 64 2b 29 22 2c 20 27 6c  "[\\]-(\d+)", 'l
0f60: 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e  Token[nLastToken
0f70: 2d 5c 5c 31 2b 31 5d 5b 22 73 56 61 6c 75 65 22  -\\1+1]["sValue"
0f80: 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73  ]', sCode).    s
0f90: 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 72 22  Code = re.sub(r"
0fa0: 3e 31 22 2c 20 27 6c 54 6f 6b 65 6e 5b 6e 4c 61  >1", 'lToken[nLa
0fb0: 73 74 54 6f 6b 65 6e 2b 31 5d 5b 22 73 56 61 6c  stToken+1]["sVal
0fc0: 75 65 22 5d 27 2c 20 73 43 6f 64 65 29 0a 20 20  ue"]', sCode).  
0fd0: 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62    sCode = re.sub
0fe0: 28 72 22 3c 31 22 2c 20 27 6c 54 6f 6b 65 6e 5b  (r"<1", 'lToken[
0ff0: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 5d 5b 22 73  nTokenOffset]["s
1000: 56 61 6c 75 65 22 5d 27 2c 20 73 43 6f 64 65 29  Value"]', sCode)
1010: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 43 6f 64  .    return sCod
1020: 65 0a 0a 0a 64 65 66 20 67 65 6e 54 6f 6b 65 6e  e...def genToken
1030: 4c 69 6e 65 73 20 28 73 54 6f 6b 65 6e 4c 69 6e  Lines (sTokenLin
1040: 65 2c 20 64 44 65 66 2c 20 64 44 65 63 6c 29 3a  e, dDef, dDecl):
1050: 0a 20 20 20 20 22 74 6f 6b 65 6e 69 7a 65 20 61  .    "tokenize a
1060: 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75   string and retu
1070: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6c 69 6e  rn a list of lin
1080: 65 73 20 6f 66 20 74 6f 6b 65 6e 73 22 0a 20 20  es of tokens".  
1090: 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 20 3d 20    lTokenLines = 
10a0: 5b 5d 0a 20 20 20 20 66 6f 72 20 73 54 6f 6b 42  [].    for sTokB
10b0: 6c 6f 63 6b 20 69 6e 20 73 54 6f 6b 65 6e 4c 69  lock in sTokenLi
10c0: 6e 65 2e 73 70 6c 69 74 28 29 3a 0a 20 20 20 20  ne.split():.    
10d0: 20 20 20 20 23 20 72 65 70 6c 61 63 65 20 6d 65      # replace me
10e0: 72 67 65 72 20 63 68 61 72 61 63 74 65 72 73 20  rger characters 
10f0: 62 79 20 73 70 61 63 65 73 0a 20 20 20 20 20 20  by spaces.      
1100: 20 20 69 66 20 22 e2 90 a3 22 20 69 6e 20 73 54    if "..." in sT
1110: 6f 6b 42 6c 6f 63 6b 3a 0a 20 20 20 20 20 20 20  okBlock:.       
1120: 20 20 20 20 20 73 54 6f 6b 42 6c 6f 63 6b 20 3d       sTokBlock =
1130: 20 73 54 6f 6b 42 6c 6f 63 6b 2e 72 65 70 6c 61   sTokBlock.repla
1140: 63 65 28 22 e2 90 a3 22 2c 20 22 20 22 29 0a 20  ce("...", " "). 
1150: 20 20 20 20 20 20 20 23 20 6f 70 74 69 6f 6e 61         # optiona
1160: 6c 20 74 6f 6b 65 6e 3f 0a 20 20 20 20 20 20 20  l token?.       
1170: 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65 20 3d   bNullPossible =
1180: 20 73 54 6f 6b 42 6c 6f 63 6b 2e 73 74 61 72 74   sTokBlock.start
1190: 73 77 69 74 68 28 22 3f 22 29 20 61 6e 64 20 73  swith("?") and s
11a0: 54 6f 6b 42 6c 6f 63 6b 2e 65 6e 64 73 77 69 74  TokBlock.endswit
11b0: 68 28 22 c2 bf 22 29 0a 20 20 20 20 20 20 20 20  h("..").        
11c0: 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65  if bNullPossible
11d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 54  :.            sT
11e0: 6f 6b 42 6c 6f 63 6b 20 3d 20 73 54 6f 6b 42 6c  okBlock = sTokBl
11f0: 6f 63 6b 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20  ock[1:-1].      
1200: 20 20 23 20 74 6f 6b 65 6e 20 77 69 74 68 20 64    # token with d
1210: 65 66 69 6e 69 74 69 6f 6e 3f 0a 20 20 20 20 20  efinition?.     
1220: 20 20 20 69 66 20 73 54 6f 6b 42 6c 6f 63 6b 2e     if sTokBlock.
1230: 73 74 61 72 74 73 77 69 74 68 28 22 28 7b 22 29  startswith("({")
1240: 20 61 6e 64 20 73 54 6f 6b 42 6c 6f 63 6b 2e 65   and sTokBlock.e
1250: 6e 64 73 77 69 74 68 28 22 7d 29 22 29 20 61 6e  ndswith("})") an
1260: 64 20 73 54 6f 6b 42 6c 6f 63 6b 5b 31 3a 2d 31  d sTokBlock[1:-1
1270: 5d 20 69 6e 20 64 44 65 66 3a 0a 20 20 20 20 20  ] in dDef:.     
1280: 20 20 20 20 20 20 20 73 54 6f 6b 42 6c 6f 63 6b         sTokBlock
1290: 20 3d 20 22 28 22 20 2b 20 64 44 65 66 5b 73 54   = "(" + dDef[sT
12a0: 6f 6b 42 6c 6f 63 6b 5b 31 3a 2d 31 5d 5d 20 2b  okBlock[1:-1]] +
12b0: 20 22 29 22 0a 20 20 20 20 20 20 20 20 65 6c 69   ")".        eli
12c0: 66 20 73 54 6f 6b 42 6c 6f 63 6b 2e 73 74 61 72  f sTokBlock.star
12d0: 74 73 77 69 74 68 28 22 7b 22 29 20 61 6e 64 20  tswith("{") and 
12e0: 73 54 6f 6b 42 6c 6f 63 6b 2e 65 6e 64 73 77 69  sTokBlock.endswi
12f0: 74 68 28 22 7d 22 29 20 61 6e 64 20 73 54 6f 6b  th("}") and sTok
1300: 42 6c 6f 63 6b 20 69 6e 20 64 44 65 66 3a 0a 20  Block in dDef:. 
1310: 20 20 20 20 20 20 20 20 20 20 20 73 54 6f 6b 42             sTokB
1320: 6c 6f 63 6b 20 3d 20 64 44 65 66 5b 73 54 6f 6b  lock = dDef[sTok
1330: 42 6c 6f 63 6b 5d 0a 20 20 20 20 20 20 20 20 69  Block].        i
1340: 66 20 28 20 28 73 54 6f 6b 42 6c 6f 63 6b 2e 73  f ( (sTokBlock.s
1350: 74 61 72 74 73 77 69 74 68 28 22 5b 22 29 20 61  tartswith("[") a
1360: 6e 64 20 73 54 6f 6b 42 6c 6f 63 6b 2e 65 6e 64  nd sTokBlock.end
1370: 73 77 69 74 68 28 22 5d 22 29 29 20 6f 72 20 28  swith("]")) or (
1380: 73 54 6f 6b 42 6c 6f 63 6b 2e 73 74 61 72 74 73  sTokBlock.starts
1390: 77 69 74 68 28 22 28 5b 22 29 20 61 6e 64 20 73  with("([") and s
13a0: 54 6f 6b 42 6c 6f 63 6b 2e 65 6e 64 73 77 69 74  TokBlock.endswit
13b0: 68 28 22 5d 29 22 29 29 20 29 3a 0a 20 20 20 20  h("])")) ):.    
13c0: 20 20 20 20 20 20 20 20 23 20 6d 75 6c 74 69 70          # multip
13d0: 6c 65 20 74 6f 6b 65 6e 0a 20 20 20 20 20 20 20  le token.       
13e0: 20 20 20 20 20 62 53 65 6c 65 63 74 65 64 47 72       bSelectedGr
13f0: 6f 75 70 20 3d 20 73 54 6f 6b 42 6c 6f 63 6b 2e  oup = sTokBlock.
1400: 73 74 61 72 74 73 77 69 74 68 28 22 28 22 29 20  startswith("(") 
1410: 61 6e 64 20 73 54 6f 6b 42 6c 6f 63 6b 2e 65 6e  and sTokBlock.en
1420: 64 73 77 69 74 68 28 22 29 22 29 0a 20 20 20 20  dswith(")").    
1430: 20 20 20 20 20 20 20 20 69 66 20 62 53 65 6c 65          if bSele
1440: 63 74 65 64 47 72 6f 75 70 3a 0a 20 20 20 20 20  ctedGroup:.     
1450: 20 20 20 20 20 20 20 20 20 20 20 73 54 6f 6b 42             sTokB
1460: 6c 6f 63 6b 20 3d 20 73 54 6f 6b 42 6c 6f 63 6b  lock = sTokBlock
1470: 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20 20  [1:-1].         
1480: 20 20 20 6c 54 6f 6b 65 6e 20 3d 20 63 72 65 61     lToken = crea
1490: 74 65 54 6f 6b 65 6e 4c 69 73 74 28 73 54 6f 6b  teTokenList(sTok
14a0: 42 6c 6f 63 6b 2c 20 64 44 65 63 6c 29 0a 20 20  Block, dDecl).  
14b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74            if not
14c0: 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20   lTokenLines:.  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54                lT
14e0: 6f 6b 65 6e 4c 69 6e 65 73 20 3d 20 5b 20 5b 22  okenLines = [ ["
14f0: 28 22 2b 73 2b 22 29 22 5d 20 20 66 6f 72 20 73  ("+s+")"]  for s
1500: 20 20 69 6e 20 6c 54 6f 6b 65 6e 20 5d 20 20 69    in lToken ]  i
1510: 66 20 62 53 65 6c 65 63 74 65 64 47 72 6f 75 70  f bSelectedGroup
1520: 20 20 65 6c 73 65 20 5b 20 5b 73 5d 20 20 66 6f    else [ [s]  fo
1530: 72 20 73 20 20 69 6e 20 6c 54 6f 6b 65 6e 20 5d  r s  in lToken ]
1540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1550: 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c   if bNullPossibl
1560: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1570: 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e         lTokenLin
1580: 65 73 2e 65 78 74 65 6e 64 28 5b 20 5b 5d 20 20  es.extend([ []  
1590: 66 6f 72 20 69 20 20 69 6e 20 72 61 6e 67 65 28  for i  in range(
15a0: 6c 65 6e 28 6c 54 6f 6b 65 6e 29 2b 31 29 20 5d  len(lToken)+1) ]
15b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
15c0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
15d0: 20 20 20 20 6c 4e 65 77 54 65 6d 70 20 3d 20 5b      lNewTemp = [
15e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
15f0: 20 20 69 66 20 62 4e 75 6c 6c 50 6f 73 73 69 62    if bNullPossib
1600: 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  le:.            
1610: 20 20 20 20 20 20 20 20 66 6f 72 20 61 52 75 6c          for aRul
1620: 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73  e in lTokenLines
1630: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1640: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 73 45            for sE
1650: 6c 65 6d 20 69 6e 20 6c 54 6f 6b 65 6e 3a 0a 20  lem in lToken:. 
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 52             aNewR
1680: 75 6c 65 20 3d 20 6c 69 73 74 28 61 52 75 6c 65  ule = list(aRule
1690: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 4e                aN
16b0: 65 77 52 75 6c 65 2e 61 70 70 65 6e 64 28 73 45  ewRule.append(sE
16c0: 6c 65 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20  lem).           
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 6c 4e 65 77 54 65 6d 70 2e 61 70 70 65 6e 64   lNewTemp.append
16f0: 28 61 4e 65 77 52 75 6c 65 29 0a 20 20 20 20 20  (aNewRule).     
1700: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a             else:
1710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1720: 20 20 20 20 20 73 45 6c 65 6d 31 20 3d 20 6c 54       sElem1 = lT
1730: 6f 6b 65 6e 2e 70 6f 70 28 30 29 0a 20 20 20 20  oken.pop(0).    
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 66 6f 72 20 61 52 75 6c 65 20 69 6e 20 6c 54 6f  for aRule in lTo
1760: 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20  kenLines:.      
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 66 6f 72 20 73 45 6c 65 6d 20 69 6e 20 6c    for sElem in l
1790: 54 6f 6b 65 6e 3a 0a 20 20 20 20 20 20 20 20 20  Token:.         
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 61 4e 65 77 52 75 6c 65 20 3d 20 6c 69     aNewRule = li
17c0: 73 74 28 61 52 75 6c 65 29 0a 20 20 20 20 20 20  st(aRule).      
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 61 4e 65 77 52 75 6c 65 2e 61        aNewRule.a
17f0: 70 70 65 6e 64 28 22 28 22 20 2b 20 73 45 6c 65  ppend("(" + sEle
1800: 6d 20 2b 20 22 29 22 20 20 69 66 20 62 53 65 6c  m + ")"  if bSel
1810: 65 63 74 65 64 47 72 6f 75 70 20 20 65 6c 73 65  ectedGroup  else
1820: 20 73 45 6c 65 6d 29 0a 20 20 20 20 20 20 20 20   sElem).        
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 6c 4e 65 77 54 65 6d 70 2e 61 70 70      lNewTemp.app
1850: 65 6e 64 28 61 4e 65 77 52 75 6c 65 29 0a 20 20  end(aNewRule).  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 61 52 75 6c 65 2e 61 70 70 65        aRule.appe
1880: 6e 64 28 22 28 22 20 2b 20 73 45 6c 65 6d 31 20  nd("(" + sElem1 
1890: 2b 20 22 29 22 20 20 69 66 20 62 53 65 6c 65 63  + ")"  if bSelec
18a0: 74 65 64 47 72 6f 75 70 20 20 65 6c 73 65 20 73  tedGroup  else s
18b0: 45 6c 65 6d 31 29 0a 20 20 20 20 20 20 20 20 20  Elem1).         
18c0: 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e         lTokenLin
18d0: 65 73 2e 65 78 74 65 6e 64 28 6c 4e 65 77 54 65  es.extend(lNewTe
18e0: 6d 70 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65  mp).        else
18f0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  :.            # 
1900: 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 0a 20 20 20  simple token.   
1910: 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20           if not 
1920: 6c 54 6f 6b 65 6e 4c 69 6e 65 73 3a 0a 20 20 20  lTokenLines:.   
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f               lTo
1940: 6b 65 6e 4c 69 6e 65 73 20 3d 20 5b 5b 73 54 6f  kenLines = [[sTo
1950: 6b 42 6c 6f 63 6b 5d 2c 20 5b 5d 5d 20 20 69 66  kBlock], []]  if
1960: 20 62 4e 75 6c 6c 50 6f 73 73 69 62 6c 65 20 20   bNullPossible  
1970: 65 6c 73 65 20 5b 5b 73 54 6f 6b 42 6c 6f 63 6b  else [[sTokBlock
1980: 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  ]].            e
1990: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
19a0: 20 20 20 20 20 69 66 20 62 4e 75 6c 6c 50 6f 73       if bNullPos
19b0: 73 69 62 6c 65 3a 0a 20 20 20 20 20 20 20 20 20  sible:.         
19c0: 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77 54             lNewT
19d0: 65 6d 70 20 3d 20 5b 5d 0a 20 20 20 20 20 20 20  emp = [].       
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
19f0: 20 61 52 75 6c 65 20 69 6e 20 6c 54 6f 6b 65 6e   aRule in lToken
1a00: 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20 20 20 20  Lines:.         
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1a20: 4e 65 77 20 3d 20 6c 69 73 74 28 61 52 75 6c 65  New = list(aRule
1a30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1a40: 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77 2e 61            lNew.a
1a50: 70 70 65 6e 64 28 73 54 6f 6b 42 6c 6f 63 6b 29  ppend(sTokBlock)
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a70: 20 20 20 20 20 20 20 20 20 6c 4e 65 77 54 65 6d           lNewTem
1a80: 70 2e 61 70 70 65 6e 64 28 6c 4e 65 77 29 0a 20  p.append(lNew). 
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73 2e 65     lTokenLines.e
1ab0: 78 74 65 6e 64 28 6c 4e 65 77 54 65 6d 70 29 0a  xtend(lNewTemp).
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
1ae0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 61 52            for aR
1af0: 75 6c 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e  ule in lTokenLin
1b00: 65 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  es:.            
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 61 52 75 6c              aRul
1b20: 65 2e 61 70 70 65 6e 64 28 73 54 6f 6b 42 6c 6f  e.append(sTokBlo
1b30: 63 6b 29 0a 20 20 20 20 66 6f 72 20 61 52 75 6c  ck).    for aRul
1b40: 65 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65 73  e in lTokenLines
1b50: 3a 0a 20 20 20 20 20 20 20 20 79 69 65 6c 64 20  :.        yield 
1b60: 61 52 75 6c 65 0a 0a 0a 64 65 66 20 63 72 65 61  aRule...def crea
1b70: 74 65 54 6f 6b 65 6e 4c 69 73 74 20 28 73 54 6f  teTokenList (sTo
1b80: 6b 42 6c 6f 63 6b 2c 20 64 44 65 63 6c 65 6e 73  kBlock, dDeclens
1b90: 69 6f 6e 73 29 3a 0a 20 20 20 20 22 72 65 74 75  ions):.    "retu
1ba0: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 6f 6b  rn a list of tok
1bb0: 65 6e 73 20 66 72 6f 6d 20 61 20 62 6c 6f 63 6b  ens from a block
1bc0: 20 6f 66 20 74 6f 6b 65 6e 73 22 0a 20 20 20 20   of tokens".    
1bd0: 6c 54 6f 6b 65 6e 20 3d 20 5b 5d 0a 20 20 20 20  lToken = [].    
1be0: 66 6f 72 20 73 54 6f 6b 65 6e 20 69 6e 20 73 54  for sToken in sT
1bf0: 6f 6b 42 6c 6f 63 6b 5b 31 3a 2d 31 5d 2e 73 70  okBlock[1:-1].sp
1c00: 6c 69 74 28 22 7c 22 29 3a 0a 20 20 20 20 20 20  lit("|"):.      
1c10: 20 20 69 66 20 22 2b 22 20 69 6e 20 73 54 6f 6b    if "+" in sTok
1c20: 65 6e 20 61 6e 64 20 6e 6f 74 20 73 54 6f 6b 65  en and not sToke
1c30: 6e 2e 73 74 61 72 74 73 77 69 74 68 28 22 2b 22  n.startswith("+"
1c40: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ):.            f
1c50: 6f 72 20 73 43 6f 64 65 20 69 6e 20 64 44 65 63  or sCode in dDec
1c60: 6c 65 6e 73 69 6f 6e 73 3a 0a 20 20 20 20 20 20  lensions:.      
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 54 6f            if sTo
1c80: 6b 65 6e 2e 65 6e 64 73 77 69 74 68 28 73 43 6f  ken.endswith(sCo
1c90: 64 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  de):.           
1ca0: 20 20 20 20 20 20 20 20 20 73 54 6f 6b 65 6e 20           sToken 
1cb0: 3d 20 73 54 6f 6b 65 6e 5b 3a 2d 6c 65 6e 28 73  = sToken[:-len(s
1cc0: 43 6f 64 65 29 5d 0a 20 20 20 20 20 20 20 20 20  Code)].         
1cd0: 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f 6b 65             lToke
1ce0: 6e 2e 61 70 70 65 6e 64 28 73 54 6f 6b 65 6e 29  n.append(sToken)
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d00: 20 20 20 20 20 66 6f 72 20 73 53 75 66 66 69 78       for sSuffix
1d10: 20 69 6e 20 64 44 65 63 6c 65 6e 73 69 6f 6e 73   in dDeclensions
1d20: 5b 73 43 6f 64 65 5d 3a 0a 20 20 20 20 20 20 20  [sCode]:.       
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 6c 54 6f 6b 65 6e 2e 61 70 70 65 6e 64 28 73   lToken.append(s
1d50: 54 6f 6b 65 6e 2b 73 53 75 66 66 69 78 29 0a 20  Token+sSuffix). 
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20     break.       
1d80: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
1d90: 20 20 20 6c 54 6f 6b 65 6e 2e 61 70 70 65 6e 64     lToken.append
1da0: 28 73 54 6f 6b 65 6e 29 0a 20 20 20 20 72 65 74  (sToken).    ret
1db0: 75 72 6e 20 6c 54 6f 6b 65 6e 0a 0a 0a 64 65 66  urn lToken...def
1dc0: 20 63 72 65 61 74 65 52 75 6c 65 20 28 69 4c 69   createRule (iLi
1dd0: 6e 65 2c 20 73 52 75 6c 65 4e 61 6d 65 2c 20 73  ne, sRuleName, s
1de0: 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74 69  TokenLine, iActi
1df0: 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f 6e  onBlock, sAction
1e00: 73 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 64 4f  s, nPriority, dO
1e10: 70 74 50 72 69 6f 72 69 74 79 2c 20 64 44 65 66  ptPriority, dDef
1e20: 2c 20 64 44 65 63 6c 29 3a 0a 20 20 20 20 22 67  , dDecl):.    "g
1e30: 65 6e 65 72 61 74 6f 72 3a 20 63 72 65 61 74 65  enerator: create
1e40: 20 72 75 6c 65 20 61 73 20 6c 69 73 74 22 0a 20   rule as list". 
1e50: 20 20 20 23 20 70 72 69 6e 74 28 69 4c 69 6e 65     # print(iLine
1e60: 2c 20 22 2f 2f 22 2c 20 73 52 75 6c 65 4e 61 6d  , "//", sRuleNam
1e70: 65 2c 20 22 2f 2f 22 2c 20 73 54 6f 6b 65 6e 4c  e, "//", sTokenL
1e80: 69 6e 65 2c 20 22 2f 2f 22 2c 20 73 41 63 74 69  ine, "//", sActi
1e90: 6f 6e 73 2c 20 22 2f 2f 22 2c 20 6e 50 72 69 6f  ons, "//", nPrio
1ea0: 72 69 74 79 29 0a 20 20 20 20 69 66 20 73 54 6f  rity).    if sTo
1eb0: 6b 65 6e 4c 69 6e 65 2e 73 74 61 72 74 73 77 69  kenLine.startswi
1ec0: 74 68 28 22 21 21 22 29 20 61 6e 64 20 73 54 6f  th("!!") and sTo
1ed0: 6b 65 6e 4c 69 6e 65 2e 65 6e 64 73 77 69 74 68  kenLine.endswith
1ee0: 28 22 c2 a1 c2 a1 22 29 3a 0a 20 20 20 20 20 20  ("...."):.      
1ef0: 20 20 23 20 61 6e 74 69 70 61 74 74 65 72 6e 0a    # antipattern.
1f00: 20 20 20 20 20 20 20 20 73 54 6f 6b 65 6e 4c 69          sTokenLi
1f10: 6e 65 20 3d 20 73 54 6f 6b 65 6e 4c 69 6e 65 5b  ne = sTokenLine[
1f20: 32 3a 2d 32 5d 2e 73 74 72 69 70 28 29 0a 20 20  2:-2].strip().  
1f30: 20 20 20 20 20 20 69 66 20 73 52 75 6c 65 4e 61        if sRuleNa
1f40: 6d 65 20 6e 6f 74 20 69 6e 20 64 41 4e 54 49 50  me not in dANTIP
1f50: 41 54 54 45 52 4e 53 3a 0a 20 20 20 20 20 20 20  ATTERNS:.       
1f60: 20 20 20 20 20 64 41 4e 54 49 50 41 54 54 45 52       dANTIPATTER
1f70: 4e 53 5b 73 52 75 6c 65 4e 61 6d 65 5d 3d 20 5b  NS[sRuleName]= [
1f80: 5d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 6c 54  ].        for lT
1f90: 6f 6b 65 6e 20 69 6e 20 67 65 6e 54 6f 6b 65 6e  oken in genToken
1fa0: 4c 69 6e 65 73 28 73 54 6f 6b 65 6e 4c 69 6e 65  Lines(sTokenLine
1fb0: 2c 20 64 44 65 66 2c 20 64 44 65 63 6c 29 3a 0a  , dDef, dDecl):.
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 64 41 4e 54              dANT
1fd0: 49 50 41 54 54 45 52 4e 53 5b 73 52 75 6c 65 4e  IPATTERNS[sRuleN
1fe0: 61 6d 65 5d 2e 61 70 70 65 6e 64 28 6c 54 6f 6b  ame].append(lTok
1ff0: 65 6e 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20  en).    else:.  
2000: 20 20 20 20 20 20 23 20 70 61 74 74 65 72 6e 0a        # pattern.
2010: 20 20 20 20 20 20 20 20 66 6f 72 20 6c 54 6f 6b          for lTok
2020: 65 6e 20 69 6e 20 67 65 6e 54 6f 6b 65 6e 4c 69  en in genTokenLi
2030: 6e 65 73 28 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20  nes(sTokenLine, 
2040: 64 44 65 66 2c 20 64 44 65 63 6c 29 3a 0a 20 20  dDef, dDecl):.  
2050: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 52 75            if sRu
2060: 6c 65 4e 61 6d 65 20 69 6e 20 64 41 4e 54 49 50  leName in dANTIP
2070: 41 54 54 45 52 4e 53 20 61 6e 64 20 6c 54 6f 6b  ATTERNS and lTok
2080: 65 6e 20 69 6e 20 64 41 4e 54 49 50 41 54 54 45  en in dANTIPATTE
2090: 52 4e 53 5b 73 52 75 6c 65 4e 61 6d 65 5d 3a 0a  RNS[sRuleName]:.
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 23 20 3c 6c 54 6f 6b 65 6e 3e 20 6d 61 74 63 68  # <lToken> match
20c0: 65 73 20 61 6e 20 61 6e 74 69 70 61 74 74 65 72  es an antipatter
20d0: 6e 20 2d 3e 20 64 69 73 63 61 72 64 0a 20 20 20  n -> discard.   
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
20f0: 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 20 20  tinue.          
2100: 20 20 23 20 43 61 6c 63 75 6c 61 74 65 20 70 6f    # Calculate po
2110: 73 69 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  sitions.        
2120: 20 20 20 20 64 50 6f 73 20 3d 20 7b 7d 20 20 20      dPos = {}   
2130: 23 20 6b 65 79 3a 20 69 47 72 6f 75 70 2c 20 76  # key: iGroup, v
2140: 61 6c 75 65 3a 20 69 54 6f 6b 65 6e 0a 20 20 20  alue: iToken.   
2150: 20 20 20 20 20 20 20 20 20 69 47 72 6f 75 70 20           iGroup 
2160: 3d 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  = 0.            
2170: 23 69 66 20 69 4c 69 6e 65 20 3d 3d 20 31 35 38  #if iLine == 158
2180: 31 38 3a 20 23 20 64 65 62 75 67 0a 20 20 20 20  18: # debug.    
2190: 20 20 20 20 20 20 20 20 23 20 20 20 20 70 72 69          #    pri
21a0: 6e 74 28 22 20 22 2e 6a 6f 69 6e 28 6c 54 6f 6b  nt(" ".join(lTok
21b0: 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  en)).           
21c0: 20 66 6f 72 20 69 2c 20 73 54 6f 6b 65 6e 20 69   for i, sToken i
21d0: 6e 20 65 6e 75 6d 65 72 61 74 65 28 6c 54 6f 6b  n enumerate(lTok
21e0: 65 6e 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  en):.           
21f0: 20 20 20 20 20 69 66 20 73 54 6f 6b 65 6e 2e 73       if sToken.s
2200: 74 61 72 74 73 77 69 74 68 28 22 28 22 29 20 61  tartswith("(") a
2210: 6e 64 20 73 54 6f 6b 65 6e 2e 65 6e 64 73 77 69  nd sToken.endswi
2220: 74 68 28 22 29 22 29 3a 0a 20 20 20 20 20 20 20  th(")"):.       
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 6f               lTo
2240: 6b 65 6e 5b 69 5d 20 3d 20 73 54 6f 6b 65 6e 5b  ken[i] = sToken[
2250: 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20 20 20  1:-1].          
2260: 20 20 20 20 20 20 20 20 20 20 69 47 72 6f 75 70            iGroup
2270: 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20   += 1.          
2280: 20 20 20 20 20 20 20 20 20 20 64 50 6f 73 5b 69            dPos[i
2290: 47 72 6f 75 70 5d 20 3d 20 69 20 2b 20 31 20 20  Group] = i + 1  
22a0: 20 20 23 20 77 65 20 61 64 64 20 31 2c 20 66 6f    # we add 1, fo
22b0: 72 20 77 65 20 63 6f 75 6e 74 20 74 6f 6b 65 6e  r we count token
22c0: 73 20 66 72 6f 6d 20 31 20 74 6f 20 6e 20 28 6e  s from 1 to n (n
22d0: 6f 74 20 66 72 6f 6d 20 30 29 0a 0a 20 20 20 20  ot from 0)..    
22e0: 20 20 20 20 20 20 20 20 23 20 50 61 72 73 65 20          # Parse 
22f0: 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  actions.        
2300: 20 20 20 20 66 6f 72 20 69 41 63 74 69 6f 6e 2c      for iAction,
2310: 20 73 41 63 74 69 6f 6e 20 69 6e 20 65 6e 75 6d   sAction in enum
2320: 65 72 61 74 65 28 73 41 63 74 69 6f 6e 73 2e 73  erate(sActions.s
2330: 70 6c 69 74 28 22 20 3c 3c 2d 20 22 29 29 3a 0a  plit(" <<- ")):.
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f  sAction = sActio
2360: 6e 2e 73 74 72 69 70 28 29 0a 20 20 20 20 20 20  n.strip().      
2370: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 41 63            if sAc
2380: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
2390: 20 20 20 20 20 20 20 20 20 20 73 41 63 74 69 6f            sActio
23a0: 6e 49 64 20 3d 20 73 52 75 6c 65 4e 61 6d 65 20  nId = sRuleName 
23b0: 2b 20 22 5f 5f 62 22 20 2b 20 73 74 72 28 69 41  + "__b" + str(iA
23c0: 63 74 69 6f 6e 42 6c 6f 63 6b 29 20 2b 20 22 5f  ctionBlock) + "_
23d0: 61 22 20 2b 20 73 74 72 28 69 41 63 74 69 6f 6e  a" + str(iAction
23e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
23f0: 20 20 20 20 20 20 61 41 63 74 69 6f 6e 20 3d 20        aAction = 
2400: 63 72 65 61 74 65 41 63 74 69 6f 6e 28 73 41 63  createAction(sAc
2410: 74 69 6f 6e 49 64 2c 20 73 41 63 74 69 6f 6e 2c  tionId, sAction,
2420: 20 6e 50 72 69 6f 72 69 74 79 2c 20 64 4f 70 74   nPriority, dOpt
2430: 50 72 69 6f 72 69 74 79 2c 20 6c 65 6e 28 6c 54  Priority, len(lT
2440: 6f 6b 65 6e 29 2c 20 64 50 6f 73 29 0a 20 20 20  oken), dPos).   
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 69 66 20 61 41 63 74 69 6f 6e 3a 0a 20 20 20   if aAction:.   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 73 41 63 74 69 6f 6e 4e 61 6d 65       sActionName
2490: 20 3d 20 73 74 6f 72 65 41 63 74 69 6f 6e 28 73   = storeAction(s
24a0: 41 63 74 69 6f 6e 49 64 2c 20 61 41 63 74 69 6f  ActionId, aActio
24b0: 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
24c0: 20 20 20 20 20 20 20 20 20 20 20 6c 52 65 73 75             lResu
24d0: 6c 74 20 3d 20 6c 69 73 74 28 6c 54 6f 6b 65 6e  lt = list(lToken
24e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
24f0: 20 20 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c            lResul
2500: 74 2e 65 78 74 65 6e 64 28 5b 22 23 23 22 2b 73  t.extend(["##"+s
2510: 74 72 28 69 4c 69 6e 65 29 2c 20 73 41 63 74 69  tr(iLine), sActi
2520: 6f 6e 4e 61 6d 65 5d 29 0a 20 20 20 20 20 20 20  onName]).       
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 23 69 66 20 69 4c 69 6e 65 20 3d 3d 20 31 33   #if iLine == 13
2550: 33 34 31 3a 0a 20 20 20 20 20 20 20 20 20 20 20  341:.           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
2570: 20 20 70 72 69 6e 74 28 22 20 20 22 2e 6a 6f 69    print("  ".joi
2580: 6e 28 6c 54 6f 6b 65 6e 29 29 0a 20 20 20 20 20  n(lToken)).     
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 23 20 20 20 20 70 72 69 6e 74 28 73 41     #    print(sA
25b0: 63 74 69 6f 6e 49 64 2c 20 61 41 63 74 69 6f 6e  ctionId, aAction
25c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
25d0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
25e0: 6c 52 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20  lResult.        
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2600: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2610: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
2620: 22 20 23 20 45 72 72 6f 72 20 6f 6e 20 61 63 74  " # Error on act
2630: 69 6f 6e 20 61 74 20 6c 69 6e 65 3a 22 2c 20 69  ion at line:", i
2640: 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20  Line).          
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
2660: 69 6e 74 28 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20  int(sTokenLine, 
2670: 22 5c 6e 22 2c 20 73 41 63 74 69 6f 6e 73 29 0a  "\n", sActions).
2680: 0a 0a 64 65 66 20 63 68 61 6e 67 65 52 65 66 65  ..def changeRefe
2690: 72 65 6e 63 65 54 6f 6b 65 6e 20 28 73 54 65 78  renceToken (sTex
26a0: 74 2c 20 64 50 6f 73 29 3a 0a 20 20 20 20 22 63  t, dPos):.    "c
26b0: 68 61 6e 67 65 20 67 72 6f 75 70 20 72 65 66 65  hange group refe
26c0: 72 65 6e 63 65 20 69 6e 20 3c 73 54 65 78 74 3e  rence in <sText>
26d0: 20 77 69 74 68 20 76 61 6c 75 65 73 20 69 6e 20   with values in 
26e0: 3c 64 50 6f 73 3e 22 0a 20 20 20 20 69 66 20 22  <dPos>".    if "
26f0: 5c 5c 22 20 6e 6f 74 20 69 6e 20 73 54 65 78 74  \\" not in sText
2700: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
2710: 20 73 54 65 78 74 0a 20 20 20 20 66 6f 72 20 69   sText.    for i
2720: 20 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28 64 50   in range(len(dP
2730: 6f 73 29 2c 20 30 2c 20 2d 31 29 3a 0a 20 20 20  os), 0, -1):.   
2740: 20 20 20 20 20 73 54 65 78 74 20 3d 20 72 65 2e       sText = re.
2750: 73 75 62 28 22 5c 5c 5c 5c 22 2b 73 74 72 28 69  sub("\\\\"+str(i
2760: 29 2b 22 28 3f 21 5b 30 2d 39 5d 29 22 2c 20 22  )+"(?![0-9])", "
2770: 5c 5c 5c 5c 22 2b 73 74 72 28 64 50 6f 73 5b 69  \\\\"+str(dPos[i
2780: 5d 29 2c 20 73 54 65 78 74 29 0a 20 20 20 20 72  ]), sText).    r
2790: 65 74 75 72 6e 20 73 54 65 78 74 0a 0a 0a 64 65  eturn sText...de
27a0: 66 20 63 68 65 63 6b 54 6f 6b 65 6e 4e 75 6d 62  f checkTokenNumb
27b0: 65 72 73 20 28 73 54 65 78 74 2c 20 73 41 63 74  ers (sText, sAct
27c0: 69 6f 6e 49 64 2c 20 6e 54 6f 6b 65 6e 29 3a 0a  ionId, nToken):.
27d0: 20 20 20 20 22 63 68 65 63 6b 20 69 66 20 74 6f      "check if to
27e0: 6b 65 6e 20 72 65 66 65 72 65 6e 63 65 73 20 69  ken references i
27f0: 6e 20 3c 73 54 65 78 74 3e 20 67 72 65 61 74 65  n <sText> greate
2800: 72 20 74 68 61 6e 20 3c 6e 54 6f 6b 65 6e 3e 20  r than <nToken> 
2810: 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20 20  (debugging)".   
2820: 20 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69 6e   for x in re.fin
2830: 64 69 74 65 72 28 72 22 5c 5c 28 5c 64 2b 29 22  diter(r"\\(\d+)"
2840: 2c 20 73 54 65 78 74 29 3a 0a 20 20 20 20 20 20  , sText):.      
2850: 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f 75 70    if int(x.group
2860: 28 31 29 29 20 3e 20 6e 54 6f 6b 65 6e 3a 0a 20  (1)) > nToken:. 
2870: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
2880: 28 22 23 20 45 72 72 6f 72 20 69 6e 20 74 6f 6b  ("# Error in tok
2890: 65 6e 20 69 6e 64 65 78 20 61 74 20 6c 69 6e 65  en index at line
28a0: 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b   " + sActionId +
28b0: 20 22 20 28 22 2b 73 74 72 28 6e 54 6f 6b 65 6e   " ("+str(nToken
28c0: 29 2b 22 20 74 6f 6b 65 6e 73 20 6f 6e 6c 79 29  )+" tokens only)
28d0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ").            p
28e0: 72 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a 64 65  rint(sText)...de
28f0: 66 20 63 68 65 63 6b 49 66 54 68 65 72 65 49 73  f checkIfThereIs
2900: 43 6f 64 65 20 28 73 54 65 78 74 2c 20 73 41 63  Code (sText, sAc
2910: 74 69 6f 6e 49 64 29 3a 0a 20 20 20 20 22 63 68  tionId):.    "ch
2920: 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
2930: 63 6f 64 65 20 69 6e 20 3c 73 54 65 78 74 3e 20  code in <sText> 
2940: 28 64 65 62 75 67 67 69 6e 67 29 22 0a 20 20 20  (debugging)".   
2950: 20 69 66 20 72 65 2e 73 65 61 72 63 68 28 72 22   if re.search(r"
2960: 5b 2e 5d 5c 77 2b 5b 28 5d 7c 73 75 67 67 5c 77  [.]\w+[(]|sugg\w
2970: 2b 5b 28 5d 7c 5c 28 5c 5c 5b 30 2d 39 5d 7c 5c  +[(]|\(\\[0-9]|\
2980: 5b 5b 30 2d 39 5d 22 2c 20 73 54 65 78 74 29 3a  [[0-9]", sText):
2990: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
29a0: 23 20 57 61 72 6e 69 6e 67 20 61 74 20 6c 69 6e  # Warning at lin
29b0: 65 20 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20  e " + sActionId 
29c0: 2b 20 22 3a 20 20 54 68 69 73 20 6d 65 73 73 61  + ":  This messa
29d0: 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 63 6f  ge looks like co
29e0: 64 65 2e 20 4c 69 6e 65 20 73 68 6f 75 6c 64 20  de. Line should 
29f0: 70 72 6f 62 61 62 6c 79 20 62 65 67 69 6e 20 77  probably begin w
2a00: 69 74 68 20 3d 22 29 0a 20 20 20 20 20 20 20 20  ith =").        
2a10: 70 72 69 6e 74 28 73 54 65 78 74 29 0a 0a 0a 64  print(sText)...d
2a20: 65 66 20 63 72 65 61 74 65 41 63 74 69 6f 6e 20  ef createAction 
2a30: 28 73 41 63 74 69 6f 6e 49 64 2c 20 73 41 63 74  (sActionId, sAct
2a40: 69 6f 6e 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20  ion, nPriority, 
2a50: 64 4f 70 74 50 72 69 6f 72 69 74 79 2c 20 6e 54  dOptPriority, nT
2a60: 6f 6b 65 6e 2c 20 64 50 6f 73 29 3a 0a 20 20 20  oken, dPos):.   
2a70: 20 22 63 72 65 61 74 65 20 61 63 74 69 6f 6e 20   "create action 
2a80: 72 75 6c 65 20 61 73 20 61 20 6c 69 73 74 22 0a  rule as a list".
2a90: 20 20 20 20 23 20 4f 70 74 69 6f 6e 0a 20 20 20      # Option.   
2aa0: 20 73 4f 70 74 69 6f 6e 20 3d 20 46 61 6c 73 65   sOption = False
2ab0: 0a 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63  .    m = re.matc
2ac0: 68 28 22 2f 28 5c 5c 77 2b 29 2f 22 2c 20 73 41  h("/(\\w+)/", sA
2ad0: 63 74 69 6f 6e 29 0a 20 20 20 20 69 66 20 6d 3a  ction).    if m:
2ae0: 0a 20 20 20 20 20 20 20 20 73 4f 70 74 69 6f 6e  .        sOption
2af0: 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29 0a 20 20   = m.group(1).  
2b00: 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20        sAction = 
2b10: 73 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64 28 29 3a  sAction[m.end():
2b20: 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20 69 66  ].strip().    if
2b30: 20 6e 50 72 69 6f 72 69 74 79 20 3d 3d 20 2d 31   nPriority == -1
2b40: 3a 0a 20 20 20 20 20 20 20 20 6e 50 72 69 6f 72  :.        nPrior
2b50: 69 74 79 20 3d 20 64 4f 70 74 50 72 69 6f 72 69  ity = dOptPriori
2b60: 74 79 2e 67 65 74 28 73 4f 70 74 69 6f 6e 2c 20  ty.get(sOption, 
2b70: 34 29 0a 0a 20 20 20 20 23 20 76 61 6c 69 64 20  4)..    # valid 
2b80: 61 63 74 69 6f 6e 3f 0a 20 20 20 20 6d 20 3d 20  action?.    m = 
2b90: 72 65 2e 73 65 61 72 63 68 28 72 22 28 3f 50 3c  re.search(r"(?P<
2ba0: 61 63 74 69 6f 6e 3e 5b 2d 3d 7e 2f 21 3e 5d 29  action>[-=~/!>])
2bb0: 28 3f 50 3c 73 74 61 72 74 3e 2d 3f 5c 64 2b 5c  (?P<start>-?\d+\
2bc0: 2e 3f 7c 29 28 3f 50 3c 65 6e 64 3e 3a 5c 2e 3f  .?|)(?P<end>:\.?
2bd0: 2d 3f 5c 64 2b 7c 29 28 3f 50 3c 63 61 73 69 6e  -?\d+|)(?P<casin
2be0: 67 3e 3a 7c 29 3e 3e 22 2c 20 73 41 63 74 69 6f  g>:|)>>", sActio
2bf0: 6e 29 0a 20 20 20 20 69 66 20 6e 6f 74 20 6d 3a  n).    if not m:
2c00: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
2c10: 5c 6e 23 20 45 72 72 6f 72 2e 20 4e 6f 20 61 63  \n# Error. No ac
2c20: 74 69 6f 6e 20 66 6f 75 6e 64 20 61 74 3a 20 22  tion found at: "
2c30: 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a 20 20 20  , sActionId).   
2c40: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65       return None
2c50: 0a 0a 20 20 20 20 23 20 43 6f 6e 64 69 74 69 6f  ..    # Conditio
2c60: 6e 0a 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e  n.    sCondition
2c70: 20 3d 20 73 41 63 74 69 6f 6e 5b 3a 6d 2e 73 74   = sAction[:m.st
2c80: 61 72 74 28 29 5d 2e 73 74 72 69 70 28 29 0a 20  art()].strip(). 
2c90: 20 20 20 69 66 20 73 43 6f 6e 64 69 74 69 6f 6e     if sCondition
2ca0: 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e 64 69  :.        sCondi
2cb0: 74 69 6f 6e 20 3d 20 63 68 61 6e 67 65 52 65 66  tion = changeRef
2cc0: 65 72 65 6e 63 65 54 6f 6b 65 6e 28 73 43 6f 6e  erenceToken(sCon
2cd0: 64 69 74 69 6f 6e 2c 20 64 50 6f 73 29 0a 20 20  dition, dPos).  
2ce0: 20 20 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e        sCondition
2cf0: 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f   = createFunctio
2d00: 6e 28 22 63 6f 6e 64 22 2c 20 73 43 6f 6e 64 69  n("cond", sCondi
2d10: 74 69 6f 6e 29 0a 20 20 20 20 65 6c 73 65 3a 0a  tion).    else:.
2d20: 20 20 20 20 20 20 20 20 73 43 6f 6e 64 69 74 69          sConditi
2d30: 6f 6e 20 3d 20 22 22 0a 0a 20 20 20 20 23 20 43  on = ""..    # C
2d40: 61 73 65 20 73 65 6e 73 69 74 69 76 69 74 79 0a  ase sensitivity.
2d50: 20 20 20 20 62 43 61 73 65 53 65 6e 73 69 74 69      bCaseSensiti
2d60: 76 69 74 79 20 3d 20 6e 6f 74 20 62 6f 6f 6c 28  vity = not bool(
2d70: 6d 2e 67 72 6f 75 70 28 22 63 61 73 69 6e 67 22  m.group("casing"
2d80: 29 29 0a 0a 20 20 20 20 23 20 41 63 74 69 6f 6e  ))..    # Action
2d90: 0a 20 20 20 20 63 41 63 74 69 6f 6e 20 3d 20 6d  .    cAction = m
2da0: 2e 67 72 6f 75 70 28 22 61 63 74 69 6f 6e 22 29  .group("action")
2db0: 0a 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73  .    sAction = s
2dc0: 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64 28 29 3a 5d  Action[m.end():]
2dd0: 2e 73 74 72 69 70 28 29 0a 20 20 20 20 73 41 63  .strip().    sAc
2de0: 74 69 6f 6e 20 3d 20 63 68 61 6e 67 65 52 65 66  tion = changeRef
2df0: 65 72 65 6e 63 65 54 6f 6b 65 6e 28 73 41 63 74  erenceToken(sAct
2e00: 69 6f 6e 2c 20 64 50 6f 73 29 0a 20 20 20 20 23  ion, dPos).    #
2e10: 20 74 61 72 67 65 74 0a 20 20 20 20 63 53 74 61   target.    cSta
2e20: 72 74 4c 69 6d 69 74 20 3d 20 22 3c 22 0a 20 20  rtLimit = "<".  
2e30: 20 20 63 45 6e 64 4c 69 6d 69 74 20 3d 20 22 3e    cEndLimit = ">
2e40: 22 0a 20 20 20 20 69 66 20 6e 6f 74 20 6d 2e 67  ".    if not m.g
2e50: 72 6f 75 70 28 22 73 74 61 72 74 22 29 3a 0a 20  roup("start"):. 
2e60: 20 20 20 20 20 20 20 69 53 74 61 72 74 41 63 74         iStartAct
2e70: 69 6f 6e 20 3d 20 31 0a 20 20 20 20 20 20 20 20  ion = 1.        
2e80: 69 45 6e 64 41 63 74 69 6f 6e 20 3d 20 30 0a 20  iEndAction = 0. 
2e90: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
2ea0: 20 69 66 20 63 41 63 74 69 6f 6e 20 21 3d 20 22   if cAction != "
2eb0: 2d 22 20 61 6e 64 20 28 6d 2e 67 72 6f 75 70 28  -" and (m.group(
2ec0: 22 73 74 61 72 74 22 29 2e 65 6e 64 73 77 69 74  "start").endswit
2ed0: 68 28 22 2e 22 29 20 6f 72 20 6d 2e 67 72 6f 75  h(".") or m.grou
2ee0: 70 28 22 65 6e 64 22 29 2e 73 74 61 72 74 73 77  p("end").startsw
2ef0: 69 74 68 28 22 3a 2e 22 29 29 3a 0a 20 20 20 20  ith(":.")):.    
2f00: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c          print("\
2f10: 6e 23 20 45 72 72 6f 72 2e 20 57 72 6f 6e 67 20  n# Error. Wrong 
2f20: 73 65 6c 65 63 74 69 6f 6e 20 6f 6e 20 74 6f 6b  selection on tok
2f30: 65 6e 73 2e 22 2c 20 73 41 63 74 69 6f 6e 49 64  ens.", sActionId
2f40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ).            re
2f50: 74 75 72 6e 20 4e 6f 6e 65 0a 20 20 20 20 20 20  turn None.      
2f60: 20 20 69 66 20 6d 2e 67 72 6f 75 70 28 22 73 74    if m.group("st
2f70: 61 72 74 22 29 2e 65 6e 64 73 77 69 74 68 28 22  art").endswith("
2f80: 2e 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ."):.           
2f90: 20 63 53 74 61 72 74 4c 69 6d 69 74 20 3d 20 22   cStartLimit = "
2fa0: 3e 22 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  >".        iStar
2fb0: 74 41 63 74 69 6f 6e 20 3d 20 69 6e 74 28 6d 2e  tAction = int(m.
2fc0: 67 72 6f 75 70 28 22 73 74 61 72 74 22 29 2e 72  group("start").r
2fd0: 73 74 72 69 70 28 22 2e 22 29 29 0a 20 20 20 20  strip(".")).    
2fe0: 20 20 20 20 69 66 20 6e 6f 74 20 6d 2e 67 72 6f      if not m.gro
2ff0: 75 70 28 22 65 6e 64 22 29 3a 0a 20 20 20 20 20  up("end"):.     
3000: 20 20 20 20 20 20 20 69 45 6e 64 41 63 74 69 6f         iEndActio
3010: 6e 20 3d 20 69 53 74 61 72 74 41 63 74 69 6f 6e  n = iStartAction
3020: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
3030: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6d 2e             if m.
3040: 67 72 6f 75 70 28 22 65 6e 64 22 29 2e 73 74 61  group("end").sta
3050: 72 74 73 77 69 74 68 28 22 3a 2e 22 29 3a 0a 20  rtswith(":."):. 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
3070: 45 6e 64 4c 69 6d 69 74 20 3d 20 22 3c 22 0a 20  EndLimit = "<". 
3080: 20 20 20 20 20 20 20 20 20 20 20 69 45 6e 64 41             iEndA
3090: 63 74 69 6f 6e 20 3d 20 69 6e 74 28 6d 2e 67 72  ction = int(m.gr
30a0: 6f 75 70 28 22 65 6e 64 22 29 2e 6c 73 74 72 69  oup("end").lstri
30b0: 70 28 22 3a 2e 22 29 29 0a 20 20 20 20 69 66 20  p(":.")).    if 
30c0: 64 50 6f 73 20 61 6e 64 20 6d 2e 67 72 6f 75 70  dPos and m.group
30d0: 28 22 73 74 61 72 74 22 29 3a 0a 20 20 20 20 20  ("start"):.     
30e0: 20 20 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20     iStartAction 
30f0: 3d 20 64 50 6f 73 2e 67 65 74 28 69 53 74 61 72  = dPos.get(iStar
3100: 74 41 63 74 69 6f 6e 2c 20 69 53 74 61 72 74 41  tAction, iStartA
3110: 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 69  ction).        i
3120: 66 20 69 45 6e 64 41 63 74 69 6f 6e 3a 0a 20 20  f iEndAction:.  
3130: 20 20 20 20 20 20 20 20 20 20 69 45 6e 64 41 63            iEndAc
3140: 74 69 6f 6e 20 3d 20 64 50 6f 73 2e 67 65 74 28  tion = dPos.get(
3150: 69 45 6e 64 41 63 74 69 6f 6e 2c 20 69 45 6e 64  iEndAction, iEnd
3160: 41 63 74 69 6f 6e 29 0a 20 20 20 20 69 66 20 69  Action).    if i
3170: 53 74 61 72 74 41 63 74 69 6f 6e 20 3c 20 30 3a  StartAction < 0:
3180: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 41  .        iStartA
3190: 63 74 69 6f 6e 20 2b 3d 20 31 0a 20 20 20 20 69  ction += 1.    i
31a0: 66 20 69 45 6e 64 41 63 74 69 6f 6e 20 3c 20 30  f iEndAction < 0
31b0: 3a 0a 20 20 20 20 20 20 20 20 69 45 6e 64 41 63  :.        iEndAc
31c0: 74 69 6f 6e 20 2b 3d 20 31 0a 0a 20 20 20 20 69  tion += 1..    i
31d0: 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22 2d 22  f cAction == "-"
31e0: 3a 0a 20 20 20 20 20 20 20 20 23 23 20 65 72 72  :.        ## err
31f0: 6f 72 0a 20 20 20 20 20 20 20 20 69 4d 73 67 20  or.        iMsg 
3200: 3d 20 73 41 63 74 69 6f 6e 2e 66 69 6e 64 28 22  = sAction.find("
3210: 20 23 20 22 29 0a 20 20 20 20 20 20 20 20 69 66   # ").        if
3220: 20 69 4d 73 67 20 3d 3d 20 2d 31 3a 0a 20 20 20   iMsg == -1:.   
3230: 20 20 20 20 20 20 20 20 20 73 4d 73 67 20 3d 20           sMsg = 
3240: 22 23 20 45 72 72 6f 72 2e 20 45 72 72 6f 72 20  "# Error. Error 
3250: 6d 65 73 73 61 67 65 20 6e 6f 74 20 66 6f 75 6e  message not foun
3260: 64 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  d.".            
3270: 73 55 52 4c 20 3d 20 22 22 0a 20 20 20 20 20 20  sURL = "".      
3280: 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e 22        print("\n"
3290: 20 2b 20 73 4d 73 67 20 2b 20 22 20 41 63 74 69   + sMsg + " Acti
32a0: 6f 6e 20 69 64 3a 20 22 20 2b 20 73 41 63 74 69  on id: " + sActi
32b0: 6f 6e 49 64 29 0a 20 20 20 20 20 20 20 20 65 6c  onId).        el
32c0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
32d0: 73 4d 73 67 20 3d 20 73 41 63 74 69 6f 6e 5b 69  sMsg = sAction[i
32e0: 4d 73 67 2b 33 3a 5d 2e 73 74 72 69 70 28 29 0a  Msg+3:].strip().
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63 74              sAct
3300: 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 3a 69  ion = sAction[:i
3310: 4d 73 67 5d 2e 73 74 72 69 70 28 29 0a 20 20 20  Msg].strip().   
3320: 20 20 20 20 20 20 20 20 20 73 55 52 4c 20 3d 20           sURL = 
3330: 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  "".            m
3340: 55 52 4c 20 3d 20 72 65 2e 73 65 61 72 63 68 28  URL = re.search(
3350: 22 5b 7c 5d 20 2a 28 68 74 74 70 73 3f 3a 2f 2f  "[|] *(https?://
3360: 2e 2a 29 22 2c 20 73 4d 73 67 29 0a 20 20 20 20  .*)", sMsg).    
3370: 20 20 20 20 20 20 20 20 69 66 20 6d 55 52 4c 3a          if mURL:
3380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3390: 20 73 55 52 4c 20 3d 20 6d 55 52 4c 2e 67 72 6f   sURL = mURL.gro
33a0: 75 70 28 31 29 2e 73 74 72 69 70 28 29 0a 20 20  up(1).strip().  
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 4d                sM
33c0: 73 67 20 3d 20 73 4d 73 67 5b 3a 6d 55 52 4c 2e  sg = sMsg[:mURL.
33d0: 73 74 61 72 74 28 30 29 5d 2e 73 74 72 69 70 28  start(0)].strip(
33e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ).            ch
33f0: 65 63 6b 54 6f 6b 65 6e 4e 75 6d 62 65 72 73 28  eckTokenNumbers(
3400: 73 4d 73 67 2c 20 73 41 63 74 69 6f 6e 49 64 2c  sMsg, sActionId,
3410: 20 6e 54 6f 6b 65 6e 29 0a 20 20 20 20 20 20 20   nToken).       
3420: 20 20 20 20 20 69 66 20 73 4d 73 67 5b 30 3a 31       if sMsg[0:1
3430: 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20  ] == "=":.      
3440: 20 20 20 20 20 20 20 20 20 20 73 4d 73 67 20 3d            sMsg =
3450: 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28   createFunction(
3460: 22 6d 73 67 22 2c 20 73 4d 73 67 2c 20 54 72 75  "msg", sMsg, Tru
3470: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  e).            e
3480: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
3490: 20 20 20 20 20 63 68 65 63 6b 49 66 54 68 65 72       checkIfTher
34a0: 65 49 73 43 6f 64 65 28 73 4d 73 67 2c 20 73 41  eIsCode(sMsg, sA
34b0: 63 74 69 6f 6e 49 64 29 0a 0a 20 20 20 20 23 20  ctionId)..    # 
34c0: 63 68 65 63 6b 69 6e 67 20 63 6f 6e 73 69 73 74  checking consist
34d0: 61 6e 63 79 0a 20 20 20 20 63 68 65 63 6b 54 6f  ancy.    checkTo
34e0: 6b 65 6e 4e 75 6d 62 65 72 73 28 73 41 63 74 69  kenNumbers(sActi
34f0: 6f 6e 2c 20 73 41 63 74 69 6f 6e 49 64 2c 20 6e  on, sActionId, n
3500: 54 6f 6b 65 6e 29 0a 0a 20 20 20 20 69 66 20 63  Token)..    if c
3510: 41 63 74 69 6f 6e 20 3d 3d 20 22 3e 22 3a 0a 20  Action == ">":. 
3520: 20 20 20 20 20 20 20 23 23 20 6e 6f 20 61 63 74         ## no act
3530: 69 6f 6e 2c 20 62 72 65 61 6b 20 6c 6f 6f 70 20  ion, break loop 
3540: 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  if condition is 
3550: 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 72 65  False.        re
3560: 74 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73  turn [sOption, s
3570: 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74 69  Condition, cActi
3580: 6f 6e 2c 20 22 22 5d 0a 0a 20 20 20 20 69 66 20  on, ""]..    if 
3590: 6e 6f 74 20 73 41 63 74 69 6f 6e 20 61 6e 64 20  not sAction and 
35a0: 63 41 63 74 69 6f 6e 20 21 3d 20 22 21 22 3a 0a  cAction != "!":.
35b0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c          print("\
35c0: 6e 23 20 45 72 72 6f 72 20 69 6e 20 61 63 74 69  n# Error in acti
35d0: 6f 6e 20 61 74 20 6c 69 6e 65 20 3c 22 20 2b 20  on at line <" + 
35e0: 73 41 63 74 69 6f 6e 49 64 20 2b 20 22 3e 3a 20  sActionId + ">: 
35f0: 20 54 68 69 73 20 61 63 74 69 6f 6e 20 69 73 20   This action is 
3600: 65 6d 70 74 79 2e 22 29 0a 0a 20 20 20 20 69 66  empty.")..    if
3610: 20 73 41 63 74 69 6f 6e 5b 30 3a 31 5d 20 21 3d   sAction[0:1] !=
3620: 20 22 3d 22 20 61 6e 64 20 63 41 63 74 69 6f 6e   "=" and cAction
3630: 20 21 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20   != "=":.       
3640: 20 63 68 65 63 6b 49 66 54 68 65 72 65 49 73 43   checkIfThereIsC
3650: 6f 64 65 28 73 41 63 74 69 6f 6e 2c 20 73 41 63  ode(sAction, sAc
3660: 74 69 6f 6e 49 64 29 0a 0a 20 20 20 20 69 66 20  tionId)..    if 
3670: 63 41 63 74 69 6f 6e 20 3d 3d 20 22 2d 22 3a 0a  cAction == "-":.
3680: 20 20 20 20 20 20 20 20 23 23 20 65 72 72 6f 72          ## error
3690: 20 64 65 74 65 63 74 65 64 20 2d 2d 3e 20 73 75   detected --> su
36a0: 67 67 65 73 74 69 6f 6e 0a 20 20 20 20 20 20 20  ggestion.       
36b0: 20 69 66 20 73 41 63 74 69 6f 6e 5b 30 3a 31 5d   if sAction[0:1]
36c0: 20 3d 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20   == "=":.       
36d0: 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 63       sAction = c
36e0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 22 73  reateFunction("s
36f0: 75 67 67 22 2c 20 73 41 63 74 69 6f 6e 2c 20 54  ugg", sAction, T
3700: 72 75 65 29 0a 20 20 20 20 20 20 20 20 65 6c 69  rue).        eli
3710: 66 20 73 41 63 74 69 6f 6e 2e 73 74 61 72 74 73  f sAction.starts
3720: 77 69 74 68 28 27 22 27 29 20 61 6e 64 20 73 41  with('"') and sA
3730: 63 74 69 6f 6e 2e 65 6e 64 73 77 69 74 68 28 27  ction.endswith('
3740: 22 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "'):.           
3750: 20 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69   sAction = sActi
3760: 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20  on[1:-1].       
3770: 20 69 66 20 6e 6f 74 20 73 4d 73 67 3a 0a 20 20   if not sMsg:.  
3780: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
3790: 22 5c 6e 23 20 45 72 72 6f 72 20 69 6e 20 61 63  "\n# Error in ac
37a0: 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 3c 22 20  tion at line <" 
37b0: 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b 20 22 3e  + sActionId + ">
37c0: 3a 20 20 54 68 65 20 6d 65 73 73 61 67 65 20 69  :  The message i
37d0: 73 20 65 6d 70 74 79 2e 22 29 0a 20 20 20 20 20  s empty.").     
37e0: 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70 74 69     return [sOpti
37f0: 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e 2c 20  on, sCondition, 
3800: 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e  cAction, sAction
3810: 2c 20 69 53 74 61 72 74 41 63 74 69 6f 6e 2c 20  , iStartAction, 
3820: 69 45 6e 64 41 63 74 69 6f 6e 2c 20 63 53 74 61  iEndAction, cSta
3830: 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c 69 6d  rtLimit, cEndLim
3840: 69 74 2c 20 62 43 61 73 65 53 65 6e 73 69 74 69  it, bCaseSensiti
3850: 76 69 74 79 2c 20 6e 50 72 69 6f 72 69 74 79 2c  vity, nPriority,
3860: 20 73 4d 73 67 2c 20 73 55 52 4c 5d 0a 20 20 20   sMsg, sURL].   
3870: 20 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22   if cAction == "
3880: 7e 22 3a 0a 20 20 20 20 20 20 20 20 23 23 20 74  ~":.        ## t
3890: 65 78 74 20 70 72 6f 63 65 73 73 6f 72 0a 20 20  ext processor.  
38a0: 20 20 20 20 20 20 69 66 20 73 41 63 74 69 6f 6e        if sAction
38b0: 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20  [0:1] == "=":.  
38c0: 20 20 20 20 20 20 20 20 20 20 73 41 63 74 69 6f            sActio
38d0: 6e 20 3d 20 63 72 65 61 74 65 46 75 6e 63 74 69  n = createFuncti
38e0: 6f 6e 28 22 74 70 22 2c 20 73 41 63 74 69 6f 6e  on("tp", sAction
38f0: 2c 20 54 72 75 65 29 0a 20 20 20 20 20 20 20 20  , True).        
3900: 65 6c 69 66 20 73 41 63 74 69 6f 6e 2e 73 74 61  elif sAction.sta
3910: 72 74 73 77 69 74 68 28 27 22 27 29 20 61 6e 64  rtswith('"') and
3920: 20 73 41 63 74 69 6f 6e 2e 65 6e 64 73 77 69 74   sAction.endswit
3930: 68 28 27 22 27 29 3a 0a 20 20 20 20 20 20 20 20  h('"'):.        
3940: 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73 41      sAction = sA
3950: 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20  ction[1:-1].    
3960: 20 20 20 20 65 6c 69 66 20 73 41 63 74 69 6f 6e      elif sAction
3970: 20 6e 6f 74 20 69 6e 20 22 e2 90 a3 2a 5f 22 3a   not in "...*_":
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 6f  .            nTo
3990: 6b 65 6e 20 3d 20 73 41 63 74 69 6f 6e 2e 63 6f  ken = sAction.co
39a0: 75 6e 74 28 22 7c 22 29 20 2b 20 31 0a 20 20 20  unt("|") + 1.   
39b0: 20 20 20 20 20 20 20 20 20 69 66 20 69 53 74 61           if iSta
39c0: 72 74 41 63 74 69 6f 6e 20 3e 20 30 20 61 6e 64  rtAction > 0 and
39d0: 20 69 45 6e 64 41 63 74 69 6f 6e 20 3e 20 30 3a   iEndAction > 0:
39e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39f0: 20 69 66 20 28 69 45 6e 64 41 63 74 69 6f 6e 20   if (iEndAction 
3a00: 2d 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20 2b  - iStartAction +
3a10: 20 31 29 20 21 3d 20 6e 54 6f 6b 65 6e 3a 0a 20   1) != nToken:. 
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 70 72 69 6e 74 28 22 5c 6e 23 20 45 72     print("\n# Er
3a40: 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61 74  ror in action at
3a50: 20 6c 69 6e 65 20 3c 22 20 2b 20 73 41 63 74 69   line <" + sActi
3a60: 6f 6e 49 64 20 2b 20 22 3e 3a 20 6e 75 6d 62 65  onId + ">: numbe
3a70: 72 73 20 6f 66 20 6d 6f 64 69 66 69 65 64 20 74  rs of modified t
3a80: 6f 6b 65 6e 73 20 6d 6f 64 69 66 69 65 64 2e 22  okens modified."
3a90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
3aa0: 69 66 20 69 53 74 61 72 74 41 63 74 69 6f 6e 20  if iStartAction 
3ab0: 3c 20 30 20 6f 72 20 69 45 6e 64 41 63 74 69 6f  < 0 or iEndActio
3ac0: 6e 20 3c 20 30 20 61 6e 64 20 69 53 74 61 72 74  n < 0 and iStart
3ad0: 41 63 74 69 6f 6e 20 21 3d 20 69 45 6e 64 41 63  Action != iEndAc
3ae0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  tion:.          
3af0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e 23        print("\n#
3b00: 20 57 61 72 6e 69 6e 67 20 69 6e 20 61 63 74 69   Warning in acti
3b10: 6f 6e 20 61 74 20 6c 69 6e 65 20 3c 22 20 2b 20  on at line <" + 
3b20: 73 41 63 74 69 6f 6e 4e 61 6d 65 20 2b 20 22 3e  sActionName + ">
3b30: 3a 20 72 65 77 72 69 74 69 6e 67 20 77 69 74 68  : rewriting with
3b40: 20 70 6f 73 73 69 62 6c 65 20 74 6f 6b 65 6e 20   possible token 
3b50: 70 6f 73 69 74 69 6f 6e 20 6d 6f 64 69 66 69 65  position modifie
3b60: 64 2e 22 29 0a 20 20 20 20 20 20 20 20 72 65 74  d.").        ret
3b70: 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 43  urn [sOption, sC
3b80: 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74 69 6f  ondition, cActio
3b90: 6e 2c 20 73 41 63 74 69 6f 6e 2c 20 69 53 74 61  n, sAction, iSta
3ba0: 72 74 41 63 74 69 6f 6e 2c 20 69 45 6e 64 41 63  rtAction, iEndAc
3bb0: 74 69 6f 6e 2c 20 62 43 61 73 65 53 65 6e 73 69  tion, bCaseSensi
3bc0: 74 69 76 69 74 79 5d 0a 20 20 20 20 69 66 20 63  tivity].    if c
3bd0: 41 63 74 69 6f 6e 20 69 6e 20 22 21 2f 22 3a 0a  Action in "!/":.
3be0: 20 20 20 20 20 20 20 20 23 23 20 74 61 67 73 0a          ## tags.
3bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3c00: 73 4f 70 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74  sOption, sCondit
3c10: 69 6f 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41  ion, cAction, sA
3c20: 63 74 69 6f 6e 2c 20 69 53 74 61 72 74 41 63 74  ction, iStartAct
3c30: 69 6f 6e 2c 20 69 45 6e 64 41 63 74 69 6f 6e 5d  ion, iEndAction]
3c40: 0a 20 20 20 20 69 66 20 63 41 63 74 69 6f 6e 20  .    if cAction 
3c50: 3d 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20  == "=":.        
3c60: 23 23 20 64 69 73 61 6d 62 69 67 75 61 74 6f 72  ## disambiguator
3c70: 0a 20 20 20 20 20 20 20 20 69 66 20 22 64 65 66  .        if "def
3c80: 69 6e 65 28 22 20 69 6e 20 73 41 63 74 69 6f 6e  ine(" in sAction
3c90: 20 61 6e 64 20 6e 6f 74 20 72 65 2e 73 65 61 72   and not re.sear
3ca0: 63 68 28 72 22 64 65 66 69 6e 65 5c 28 5c 5c 2d  ch(r"define\(\\-
3cb0: 3f 5c 64 2b 20 2a 2c 20 2a 5c 5b 2e 2a 5c 5d 20  ?\d+ *, *\[.*\] 
3cc0: 2a 5c 29 22 2c 20 73 41 63 74 69 6f 6e 29 3a 0a  *\)", sAction):.
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
3ce0: 74 28 22 5c 6e 23 20 45 72 72 6f 72 20 69 6e 20  t("\n# Error in 
3cf0: 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 3c  action at line <
3d00: 22 20 2b 20 73 41 63 74 69 6f 6e 49 64 20 2b 20  " + sActionId + 
3d10: 22 3e 3a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  ">: second argum
3d20: 65 6e 74 20 66 6f 72 20 3c 64 65 66 69 6e 65 3e  ent for <define>
3d30: 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20   must be a list 
3d40: 6f 66 20 73 74 72 69 6e 67 73 22 29 0a 20 20 20  of strings").   
3d50: 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 63       sAction = c
3d60: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 22 64  reateFunction("d
3d70: 61 22 2c 20 73 41 63 74 69 6f 6e 29 0a 20 20 20  a", sAction).   
3d80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70       return [sOp
3d90: 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f 6e  tion, sCondition
3da0: 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63 74 69  , cAction, sActi
3db0: 6f 6e 5d 0a 20 20 20 20 70 72 69 6e 74 28 22 5c  on].    print("\
3dc0: 6e 23 20 55 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f  n# Unknown actio
3dd0: 6e 2e 22 2c 20 73 41 63 74 69 6f 6e 49 64 29 0a  n.", sActionId).
3de0: 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a      return None.
3df0: 0a 0a 64 65 66 20 6d 61 6b 65 20 28 6c 52 75 6c  ..def make (lRul
3e00: 65 2c 20 73 4c 61 6e 67 2c 20 64 44 65 66 2c 20  e, sLang, dDef, 
3e10: 64 44 65 63 6c 2c 20 64 4f 70 74 50 72 69 6f 72  dDecl, dOptPrior
3e20: 69 74 79 29 3a 0a 20 20 20 20 22 63 6f 6d 70 69  ity):.    "compi
3e30: 6c 65 20 72 75 6c 65 73 2c 20 72 65 74 75 72 6e  le rules, return
3e40: 73 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 6f  s a dictionary o
3e50: 66 20 76 61 6c 75 65 73 22 0a 20 20 20 20 23 20  f values".    # 
3e60: 66 6f 72 20 63 6c 61 72 69 74 79 20 70 75 72 70  for clarity purp
3e70: 6f 73 65 2c 20 64 6f 6e e2 80 99 74 20 63 72 65  ose, don...t cre
3e80: 61 74 65 20 61 6e 79 20 66 69 6c 65 20 68 65 72  ate any file her
3e90: 65 0a 0a 20 20 20 20 23 20 72 65 6d 6f 76 69 6e  e..    # removin
3ea0: 67 20 63 6f 6d 6d 65 6e 74 73 2c 20 7a 65 72 6f  g comments, zero
3eb0: 69 6e 67 20 65 6d 70 74 79 20 6c 69 6e 65 73 2c  ing empty lines,
3ec0: 20 63 72 65 61 74 69 6e 67 20 64 65 66 69 6e 69   creating defini
3ed0: 74 69 6f 6e 73 2c 20 73 74 6f 72 69 6e 67 20 74  tions, storing t
3ee0: 65 73 74 73 2c 20 6d 65 72 67 69 6e 67 20 72 75  ests, merging ru
3ef0: 6c 65 20 6c 69 6e 65 73 0a 20 20 20 20 70 72 69  le lines.    pri
3f00: 6e 74 28 22 20 20 70 61 72 73 69 6e 67 20 72 75  nt("  parsing ru
3f10: 6c 65 73 2e 2e 2e 22 29 0a 20 20 20 20 6c 54 6f  les...").    lTo
3f20: 6b 65 6e 4c 69 6e 65 20 3d 20 5b 5d 0a 20 20 20  kenLine = [].   
3f30: 20 73 41 63 74 69 6f 6e 73 20 3d 20 22 22 0a 20   sActions = "". 
3f40: 20 20 20 6e 50 72 69 6f 72 69 74 79 20 3d 20 2d     nPriority = -
3f50: 31 0a 20 20 20 20 64 41 6c 6c 47 72 61 70 68 20  1.    dAllGraph 
3f60: 3d 20 7b 7d 0a 20 20 20 20 73 47 72 61 70 68 4e  = {}.    sGraphN
3f70: 61 6d 65 20 3d 20 22 22 0a 20 20 20 20 69 41 63  ame = "".    iAc
3f80: 74 69 6f 6e 42 6c 6f 63 6b 20 3d 20 30 0a 20 20  tionBlock = 0.  
3f90: 20 20 61 52 75 6c 65 4e 61 6d 65 20 3d 20 73 65    aRuleName = se
3fa0: 74 28 29 0a 0a 20 20 20 20 66 6f 72 20 69 2c 20  t()..    for i, 
3fb0: 73 4c 69 6e 65 20 69 6e 20 6c 52 75 6c 65 3a 0a  sLine in lRule:.
3fc0: 20 20 20 20 20 20 20 20 73 4c 69 6e 65 20 3d 20          sLine = 
3fd0: 73 4c 69 6e 65 2e 72 73 74 72 69 70 28 29 0a 20  sLine.rstrip(). 
3fe0: 20 20 20 20 20 20 20 69 66 20 22 5c 74 22 20 69         if "\t" i
3ff0: 6e 20 73 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20  n sLine:.       
4000: 20 20 20 20 20 23 20 74 61 62 75 6c 61 74 69 6f       # tabulatio
4010: 6e 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 20 20  n not allowed.  
4020: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
4030: 22 45 72 72 6f 72 2e 20 54 61 62 75 6c 61 74 69  "Error. Tabulati
4040: 6f 6e 20 61 74 20 6c 69 6e 65 3a 20 22 2c 20 69  on at line: ", i
4050: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ).            ex
4060: 69 74 28 29 0a 20 20 20 20 20 20 20 20 65 6c 69  it().        eli
4070: 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69  f sLine.startswi
4080: 74 68 28 22 40 40 40 40 47 52 41 50 48 3a 20 22  th("@@@@GRAPH: "
4090: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ):.            #
40a0: 20 72 75 6c 65 73 20 67 72 61 70 68 20 63 61 6c   rules graph cal
40b0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 20  l.            m 
40c0: 3d 20 72 65 2e 6d 61 74 63 68 28 72 22 40 40 40  = re.match(r"@@@
40d0: 40 47 52 41 50 48 3a 20 2a 28 5c 77 2b 29 22 2c  @GRAPH: *(\w+)",
40e0: 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 29 0a   sLine.strip()).
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6d              if m
4100: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4110: 20 20 73 47 72 61 70 68 4e 61 6d 65 20 3d 20 6d    sGraphName = m
4120: 2e 67 72 6f 75 70 28 31 29 0a 20 20 20 20 20 20  .group(1).      
4130: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 47 72            if sGr
4140: 61 70 68 4e 61 6d 65 20 69 6e 20 64 41 6c 6c 47  aphName in dAllG
4150: 72 61 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20  raph:.          
4160: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
4170: 22 45 72 72 6f 72 20 61 74 20 6c 69 6e 65 20 22  "Error at line "
4180: 20 2b 20 69 20 2b 20 22 2e 20 47 72 61 70 68 20   + i + ". Graph 
4190: 6e 61 6d 65 20 3c 22 20 2b 20 73 47 72 61 70 68  name <" + sGraph
41a0: 4e 61 6d 65 20 2b 20 22 3e 20 61 6c 72 65 61 64  Name + "> alread
41b0: 79 20 65 78 69 73 74 73 2e 22 29 0a 20 20 20 20  y exists.").    
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 65 78 69 74 28 29 0a 20 20 20 20 20 20 20 20 20  exit().         
41e0: 20 20 20 20 20 20 20 64 41 6c 6c 47 72 61 70 68         dAllGraph
41f0: 5b 73 47 72 61 70 68 4e 61 6d 65 5d 20 3d 20 5b  [sGraphName] = [
4200: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ].            el
4210: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
4220: 20 20 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72      print("Error
4230: 2e 20 47 72 61 70 68 20 6e 61 6d 65 20 6e 6f 74  . Graph name not
4240: 20 66 6f 75 6e 64 20 61 74 20 6c 69 6e 65 22 2c   found at line",
4250: 20 69 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   i).            
4260: 20 20 20 20 65 78 69 74 28 29 0a 20 20 20 20 20      exit().     
4270: 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74     elif sLine.st
4280: 61 72 74 73 77 69 74 68 28 22 5f 5f 22 29 20 61  artswith("__") a
4290: 6e 64 20 73 4c 69 6e 65 2e 65 6e 64 73 77 69 74  nd sLine.endswit
42a0: 68 28 22 5f 5f 22 29 3a 0a 20 20 20 20 20 20 20  h("__"):.       
42b0: 20 20 20 20 20 23 20 6e 65 77 20 72 75 6c 65 20       # new rule 
42c0: 67 72 6f 75 70 0a 20 20 20 20 20 20 20 20 20 20  group.          
42d0: 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28 22    m = re.match("
42e0: 5f 5f 28 5c 5c 77 2b 29 28 21 5c 5c 64 7c 29 5f  __(\\w+)(!\\d|)_
42f0: 5f 22 2c 20 73 4c 69 6e 65 29 0a 20 20 20 20 20  _", sLine).     
4300: 20 20 20 20 20 20 20 69 66 20 6d 3a 0a 20 20 20         if m:.   
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 52 75               sRu
4320: 6c 65 4e 61 6d 65 20 3d 20 6d 2e 67 72 6f 75 70  leName = m.group
4330: 28 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (1).            
4340: 20 20 20 20 69 66 20 73 52 75 6c 65 4e 61 6d 65      if sRuleName
4350: 20 69 6e 20 61 52 75 6c 65 4e 61 6d 65 3a 0a 20   in aRuleName:. 
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72 20     print("Error 
4380: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 74 72 28  at line " + str(
4390: 69 29 20 2b 20 22 2e 20 52 75 6c 65 20 6e 61 6d  i) + ". Rule nam
43a0: 65 20 3c 22 20 2b 20 73 52 75 6c 65 4e 61 6d 65  e <" + sRuleName
43b0: 20 2b 20 22 3e 20 61 6c 72 65 61 64 79 20 65 78   + "> already ex
43c0: 69 73 74 73 2e 22 29 0a 20 20 20 20 20 20 20 20  ists.").        
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74              exit
43e0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
43f0: 20 20 20 61 52 75 6c 65 4e 61 6d 65 2e 61 64 64     aRuleName.add
4400: 28 73 52 75 6c 65 4e 61 6d 65 29 0a 20 20 20 20  (sRuleName).    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 69 41 63 74              iAct
4420: 69 6f 6e 42 6c 6f 63 6b 20 3d 20 31 0a 20 20 20  ionBlock = 1.   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 72               nPr
4440: 69 6f 72 69 74 79 20 3d 20 69 6e 74 28 6d 2e 67  iority = int(m.g
4450: 72 6f 75 70 28 32 29 5b 31 3a 5d 29 20 69 66 20  roup(2)[1:]) if 
4460: 6d 2e 67 72 6f 75 70 28 32 29 20 20 65 6c 73 65  m.group(2)  else
4470: 20 2d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20   -1.            
4480: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
4490: 20 20 20 20 20 20 70 72 69 6e 74 28 22 53 79 6e        print("Syn
44a0: 74 61 78 20 65 72 72 6f 72 20 69 6e 20 72 75 6c  tax error in rul
44b0: 65 20 67 72 6f 75 70 3a 20 22 2c 20 73 4c 69 6e  e group: ", sLin
44c0: 65 2c 20 22 20 2d 2d 20 6c 69 6e 65 3a 22 2c 20  e, " -- line:", 
44d0: 69 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i).             
44e0: 20 20 20 65 78 69 74 28 29 0a 20 20 20 20 20 20     exit().      
44f0: 20 20 65 6c 69 66 20 72 65 2e 73 65 61 72 63 68    elif re.search
4500: 28 22 5e 20 20 20 20 2b 3c 3c 2d 20 22 2c 20 73  ("^    +<<- ", s
4510: 4c 69 6e 65 29 20 6f 72 20 28 73 4c 69 6e 65 2e  Line) or (sLine.
4520: 73 74 61 72 74 73 77 69 74 68 28 22 20 20 20 20  startswith("    
4530: 20 20 20 20 22 29 20 61 6e 64 20 6e 6f 74 20 73      ") and not s
4540: 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28  Line.startswith(
4550: 22 20 20 20 20 20 20 20 20 7c 7c 22 29 29 20 5c  "        ||")) \
4560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4570: 20 6f 72 20 72 65 2e 73 65 61 72 63 68 28 22 5e   or re.search("^
4580: 20 20 20 20 2b 23 22 2c 20 73 4c 69 6e 65 29 20      +#", sLine) 
4590: 6f 72 20 72 65 2e 73 65 61 72 63 68 28 72 22 5b  or re.search(r"[
45a0: 2d 3d 7e 2f 21 3e 5d 28 3f 3a 2d 3f 5c 64 5c 2e  -=~/!>](?:-?\d\.
45b0: 3f 28 3f 3a 3a 5c 2e 3f 2d 3f 5c 64 2b 7c 29 7c  ?(?::\.?-?\d+|)|
45c0: 29 3e 3e 20 22 2c 20 73 4c 69 6e 65 29 20 3a 0a  )>> ", sLine) :.
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 61 63              # ac
45e0: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  tions.          
45f0: 20 20 73 41 63 74 69 6f 6e 73 20 2b 3d 20 22 20    sActions += " 
4600: 22 20 2b 20 73 4c 69 6e 65 2e 73 74 72 69 70 28  " + sLine.strip(
4610: 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 72  ).        elif r
4620: 65 2e 6d 61 74 63 68 28 22 5b 20 c2 a0 5d 2a 24  e.match("[ ..]*$
4630: 22 2c 20 73 4c 69 6e 65 29 3a 0a 20 20 20 20 20  ", sLine):.     
4640: 20 20 20 20 20 20 20 23 20 65 6d 70 74 79 20 6c         # empty l
4650: 69 6e 65 20 74 6f 20 65 6e 64 20 6d 65 72 67 69  ine to end mergi
4660: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ng.            i
4670: 66 20 6e 6f 74 20 6c 54 6f 6b 65 6e 4c 69 6e 65  f not lTokenLine
4680: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4690: 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20    continue.     
46a0: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73 41         if not sA
46b0: 63 74 69 6f 6e 73 3a 0a 20 20 20 20 20 20 20 20  ctions:.        
46c0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 45          print("E
46d0: 72 72 6f 72 2e 20 4e 6f 20 61 63 74 69 6f 6e 20  rror. No action 
46e0: 66 6f 75 6e 64 20 61 74 20 6c 69 6e 65 3a 22 2c  found at line:",
46f0: 20 69 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   i).            
4700: 20 20 20 20 65 78 69 74 28 29 0a 20 20 20 20 20      exit().     
4710: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73 47         if not sG
4720: 72 61 70 68 4e 61 6d 65 3a 0a 20 20 20 20 20 20  raphName:.      
4730: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
4740: 22 45 72 72 6f 72 2e 20 41 6c 6c 20 72 75 6c 65  "Error. All rule
4750: 73 20 6d 75 73 74 20 62 65 6c 6f 6e 67 20 74 6f  s must belong to
4760: 20 61 20 6e 61 6d 65 64 20 67 72 61 70 68 2e 20   a named graph. 
4770: 4c 69 6e 65 3a 20 22 2c 20 69 29 0a 20 20 20 20  Line: ", i).    
4780: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74              exit
4790: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ().            f
47a0: 6f 72 20 6a 2c 20 73 54 6f 6b 65 6e 4c 69 6e 65  or j, sTokenLine
47b0: 20 69 6e 20 6c 54 6f 6b 65 6e 4c 69 6e 65 3a 0a   in lTokenLine:.
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 64 41 6c 6c 47 72 61 70 68 5b 73 47 72 61 70 68  dAllGraph[sGraph
47e0: 4e 61 6d 65 5d 2e 61 70 70 65 6e 64 28 28 6a 2c  Name].append((j,
47f0: 20 73 52 75 6c 65 4e 61 6d 65 2c 20 73 54 6f 6b   sRuleName, sTok
4800: 65 6e 4c 69 6e 65 2c 20 69 41 63 74 69 6f 6e 42  enLine, iActionB
4810: 6c 6f 63 6b 2c 20 73 41 63 74 69 6f 6e 73 2c 20  lock, sActions, 
4820: 6e 50 72 69 6f 72 69 74 79 29 29 0a 20 20 20 20  nPriority)).    
4830: 20 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e 4c 69          lTokenLi
4840: 6e 65 2e 63 6c 65 61 72 28 29 0a 20 20 20 20 20  ne.clear().     
4850: 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 73 20         sActions 
4860: 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  = "".           
4870: 20 69 41 63 74 69 6f 6e 42 6c 6f 63 6b 20 2b 3d   iActionBlock +=
4880: 20 31 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20   1.        elif 
4890: 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68  sLine.startswith
48a0: 28 22 20 20 20 20 22 29 3a 0a 20 20 20 20 20 20  ("    "):.      
48b0: 20 20 20 20 20 20 23 20 74 6f 6b 65 6e 73 0a 20        # tokens. 
48c0: 20 20 20 20 20 20 20 20 20 20 20 73 4c 69 6e 65             sLine
48d0: 20 3d 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29   = sLine.strip()
48e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
48f0: 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68  sLine.startswith
4900: 28 22 7c 7c 22 29 3a 0a 20 20 20 20 20 20 20 20  ("||"):.        
4910: 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 69 6e          iPrevLin
4920: 65 2c 20 73 50 72 65 76 4c 69 6e 65 20 3d 20 6c  e, sPrevLine = l
4930: 54 6f 6b 65 6e 4c 69 6e 65 5b 2d 31 5d 0a 20 20  TokenLine[-1].  
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 54                lT
4950: 6f 6b 65 6e 4c 69 6e 65 5b 2d 31 5d 20 3d 20 5b  okenLine[-1] = [
4960: 69 50 72 65 76 4c 69 6e 65 2c 20 73 50 72 65 76  iPrevLine, sPrev
4970: 4c 69 6e 65 20 2b 20 22 20 22 20 2b 20 73 4c 69  Line + " " + sLi
4980: 6e 65 5b 32 3a 5d 5d 0a 20 20 20 20 20 20 20 20  ne[2:]].        
4990: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
49a0: 20 20 20 20 20 20 20 20 20 20 6c 54 6f 6b 65 6e            lToken
49b0: 4c 69 6e 65 2e 61 70 70 65 6e 64 28 5b 69 2c 20  Line.append([i, 
49c0: 73 4c 69 6e 65 5d 29 0a 20 20 20 20 20 20 20 20  sLine]).        
49d0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
49e0: 20 20 70 72 69 6e 74 28 22 55 6e 6b 6e 6f 77 6e    print("Unknown
49f0: 20 6c 69 6e 65 3a 22 29 0a 20 20 20 20 20 20 20   line:").       
4a00: 20 20 20 20 20 70 72 69 6e 74 28 73 4c 69 6e 65       print(sLine
4a10: 29 0a 0a 20 20 20 20 23 20 70 72 6f 63 65 73 73  )..    # process
4a20: 69 6e 67 20 72 75 6c 65 73 0a 20 20 20 20 70 72  ing rules.    pr
4a30: 69 6e 74 28 22 20 20 70 72 65 70 61 72 69 6e 67  int("  preparing
4a40: 20 72 75 6c 65 73 2e 2e 2e 22 29 0a 20 20 20 20   rules...").    
4a50: 6e 52 75 6c 65 20 3d 20 30 0a 20 20 20 20 66 6f  nRule = 0.    fo
4a60: 72 20 73 47 72 61 70 68 4e 61 6d 65 2c 20 6c 52  r sGraphName, lR
4a70: 75 6c 65 4c 69 6e 65 20 69 6e 20 64 41 6c 6c 47  uleLine in dAllG
4a80: 72 61 70 68 2e 69 74 65 6d 73 28 29 3a 0a 20 20  raph.items():.  
4a90: 20 20 20 20 20 20 70 72 69 6e 74 28 22 7b 3a 3e        print("{:>
4aa0: 38 2c 7d 20 72 75 6c 65 73 20 69 6e 20 7b 3a 3c  8,} rules in {:<
4ab0: 32 34 7d 20 22 2e 66 6f 72 6d 61 74 28 6c 65 6e  24} ".format(len
4ac0: 28 6c 52 75 6c 65 4c 69 6e 65 29 2c 20 22 3c 22  (lRuleLine), "<"
4ad0: 2b 73 47 72 61 70 68 4e 61 6d 65 2b 22 3e 22 29  +sGraphName+">")
4ae0: 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 20 20  , end="").      
4af0: 20 20 6c 50 72 65 70 61 72 65 64 52 75 6c 65 20    lPreparedRule 
4b00: 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20 66 6f 72  = [].        for
4b10: 20 69 2c 20 73 52 75 6c 65 47 72 6f 75 70 2c 20   i, sRuleGroup, 
4b20: 73 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74  sTokenLine, iAct
4b30: 69 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f  ionBlock, sActio
4b40: 6e 73 2c 20 6e 50 72 69 6f 72 69 74 79 20 69 6e  ns, nPriority in
4b50: 20 6c 52 75 6c 65 4c 69 6e 65 3a 0a 20 20 20 20   lRuleLine:.    
4b60: 20 20 20 20 20 20 20 20 66 6f 72 20 61 52 75 6c          for aRul
4b70: 65 20 69 6e 20 63 72 65 61 74 65 52 75 6c 65 28  e in createRule(
4b80: 69 2c 20 73 52 75 6c 65 47 72 6f 75 70 2c 20 73  i, sRuleGroup, s
4b90: 54 6f 6b 65 6e 4c 69 6e 65 2c 20 69 41 63 74 69  TokenLine, iActi
4ba0: 6f 6e 42 6c 6f 63 6b 2c 20 73 41 63 74 69 6f 6e  onBlock, sAction
4bb0: 73 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 64 4f  s, nPriority, dO
4bc0: 70 74 50 72 69 6f 72 69 74 79 2c 20 64 44 65 66  ptPriority, dDef
4bd0: 2c 20 64 44 65 63 6c 29 3a 0a 20 20 20 20 20 20  , dDecl):.      
4be0: 20 20 20 20 20 20 20 20 20 20 6c 50 72 65 70 61            lPrepa
4bf0: 72 65 64 52 75 6c 65 2e 61 70 70 65 6e 64 28 61  redRule.append(a
4c00: 52 75 6c 65 29 0a 20 20 20 20 20 20 20 20 6e 52  Rule).        nR
4c10: 75 6c 65 20 2b 3d 20 6c 65 6e 28 6c 52 75 6c 65  ule += len(lRule
4c20: 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20 23 20  Line).        # 
4c30: 47 72 61 70 68 20 63 72 65 61 74 69 6f 6e 0a 20  Graph creation. 
4c40: 20 20 20 20 20 20 20 6f 44 41 52 47 20 3d 20 64         oDARG = d
4c50: 61 72 67 2e 44 41 52 47 28 6c 50 72 65 70 61 72  arg.DARG(lPrepar
4c60: 65 64 52 75 6c 65 2c 20 73 4c 61 6e 67 29 0a 20  edRule, sLang). 
4c70: 20 20 20 20 20 20 20 64 41 6c 6c 47 72 61 70 68         dAllGraph
4c80: 5b 73 47 72 61 70 68 4e 61 6d 65 5d 20 3d 20 6f  [sGraphName] = o
4c90: 44 41 52 47 2e 63 72 65 61 74 65 47 72 61 70 68  DARG.createGraph
4ca0: 28 29 0a 20 20 20 20 20 20 20 20 23 20 44 65 62  ().        # Deb
4cb0: 75 67 67 69 6e 67 0a 20 20 20 20 20 20 20 20 69  ugging.        i
4cc0: 66 20 46 61 6c 73 65 3a 0a 20 20 20 20 20 20 20  f False:.       
4cd0: 20 20 20 20 20 70 72 69 6e 74 28 22 5c 6e 52 55       print("\nRU
4ce0: 4c 45 53 3a 22 29 0a 20 20 20 20 20 20 20 20 20  LES:").         
4cf0: 20 20 20 66 6f 72 20 65 20 69 6e 20 6c 50 72 65     for e in lPre
4d00: 70 61 72 65 64 52 75 6c 65 3a 0a 20 20 20 20 20  paredRule:.     
4d10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 5b             if e[
4d20: 2d 32 5d 20 3d 3d 20 22 23 23 32 32 31 31 22 3a  -2] == "##2211":
4d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d40: 20 20 20 20 20 70 72 69 6e 74 28 65 29 0a 20 20       print(e).  
4d50: 20 20 20 20 20 20 69 66 20 46 61 6c 73 65 3a 0a        if False:.
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4d70: 74 28 22 5c 6e 47 52 41 50 48 3a 22 2c 20 73 47  t("\nGRAPH:", sG
4d80: 72 61 70 68 4e 61 6d 65 29 0a 20 20 20 20 20 20  raphName).      
4d90: 20 20 20 20 20 20 66 6f 72 20 6b 2c 20 76 20 69        for k, v i
4da0: 6e 20 64 41 6c 6c 47 72 61 70 68 5b 73 47 72 61  n dAllGraph[sGra
4db0: 70 68 4e 61 6d 65 5d 2e 69 74 65 6d 73 28 29 3a  phName].items():
4dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4dd0: 20 70 72 69 6e 74 28 6b 2c 20 22 5c 74 22 2c 20   print(k, "\t", 
4de0: 76 29 0a 20 20 20 20 70 72 69 6e 74 28 22 20 20  v).    print("  
4df0: 54 6f 74 61 6c 3a 20 22 2c 20 6e 52 75 6c 65 2c  Total: ", nRule,
4e00: 20 22 72 75 6c 65 73 22 29 0a 0a 20 20 20 20 23   "rules")..    #
4e10: 20 63 72 65 61 74 69 6e 67 20 66 69 6c 65 20 77   creating file w
4e20: 69 74 68 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ith all function
4e30: 73 20 63 61 6c 6c 61 62 6c 65 20 62 79 20 72 75  s callable by ru
4e40: 6c 65 73 0a 20 20 20 20 70 72 69 6e 74 28 22 20  les.    print(" 
4e50: 20 63 72 65 61 74 69 6e 67 20 63 61 6c 6c 61 62   creating callab
4e60: 6c 65 73 20 66 6f 72 20 67 72 61 70 68 20 72 75  les for graph ru
4e70: 6c 65 73 2e 2e 2e 22 29 0a 20 20 20 20 73 50 79  les...").    sPy
4e80: 43 61 6c 6c 61 62 6c 65 73 20 3d 20 22 22 0a 20  Callables = "". 
4e90: 20 20 20 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20     sJSCallables 
4ea0: 3d 20 22 22 0a 20 20 20 20 66 6f 72 20 73 46 75  = "".    for sFu
4eb0: 6e 63 4e 61 6d 65 2c 20 73 52 65 74 75 72 6e 20  ncName, sReturn 
4ec0: 69 6e 20 64 46 55 4e 43 54 49 4f 4e 53 2e 69 74  in dFUNCTIONS.it
4ed0: 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20 20 69  ems():.        i
4ee0: 66 20 73 46 75 6e 63 4e 61 6d 65 2e 73 74 61 72  f sFuncName.star
4ef0: 74 73 77 69 74 68 28 22 5f 67 5f 63 6f 6e 64 5f  tswith("_g_cond_
4f00: 22 29 3a 20 23 20 63 6f 6e 64 69 74 69 6f 6e 0a  "): # condition.
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72              sPar
4f20: 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c 20 6e  ams = "lToken, n
4f30: 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61  TokenOffset, nLa
4f40: 73 74 54 6f 6b 65 6e 2c 20 73 43 6f 75 6e 74 72  stToken, sCountr
4f50: 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 2c 20 64 54  y, bCondMemo, dT
4f60: 61 67 73 2c 20 73 53 65 6e 74 65 6e 63 65 2c 20  ags, sSentence, 
4f70: 73 53 65 6e 74 65 6e 63 65 30 22 0a 20 20 20 20  sSentence0".    
4f80: 20 20 20 20 65 6c 69 66 20 73 46 75 6e 63 4e 61      elif sFuncNa
4f90: 6d 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 67  me.startswith("g
4fa0: 5f 6d 73 67 5f 22 29 3a 20 23 20 6d 65 73 73 61  _msg_"): # messa
4fb0: 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ge.            s
4fc0: 50 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e  Params = "lToken
4fd0: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
4fe0: 6e 4c 61 73 74 54 6f 6b 65 6e 22 0a 20 20 20 20  nLastToken".    
4ff0: 20 20 20 20 65 6c 69 66 20 73 46 75 6e 63 4e 61      elif sFuncNa
5000: 6d 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 5f  me.startswith("_
5010: 67 5f 73 75 67 67 5f 22 29 3a 20 23 20 73 75 67  g_sugg_"): # sug
5020: 67 65 73 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  gestion.        
5030: 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 6c      sParams = "l
5040: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
5050: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 22  set, nLastToken"
5060: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 46  .        elif sF
5070: 75 6e 63 4e 61 6d 65 2e 73 74 61 72 74 73 77 69  uncName.startswi
5080: 74 68 28 22 5f 67 5f 74 70 5f 22 29 3a 20 23 20  th("_g_tp_"): # 
5090: 74 65 78 74 20 70 72 65 70 72 6f 63 65 73 73 6f  text preprocesso
50a0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 50  r.            sP
50b0: 61 72 61 6d 73 20 3d 20 22 6c 54 6f 6b 65 6e 2c  arams = "lToken,
50c0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e   nTokenOffset, n
50d0: 4c 61 73 74 54 6f 6b 65 6e 22 0a 20 20 20 20 20  LastToken".     
50e0: 20 20 20 65 6c 69 66 20 73 46 75 6e 63 4e 61 6d     elif sFuncNam
50f0: 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 5f 67  e.startswith("_g
5100: 5f 64 61 5f 22 29 3a 20 23 20 64 69 73 61 6d 62  _da_"): # disamb
5110: 69 67 75 61 74 6f 72 0a 20 20 20 20 20 20 20 20  iguator.        
5120: 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 6c      sParams = "l
5130: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
5140: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 22  set, nLastToken"
5150: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
5160: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
5170: 28 22 23 20 55 6e 6b 6e 6f 77 6e 20 66 75 6e 63  ("# Unknown func
5180: 74 69 6f 6e 20 74 79 70 65 20 69 6e 20 5b 22 20  tion type in [" 
5190: 2b 20 73 46 75 6e 63 4e 61 6d 65 20 2b 20 22 5d  + sFuncName + "]
51a0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ").            c
51b0: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20  ontinue.        
51c0: 23 20 50 79 74 68 6f 6e 0a 20 20 20 20 20 20 20  # Python.       
51d0: 20 73 50 79 43 61 6c 6c 61 62 6c 65 73 20 2b 3d   sPyCallables +=
51e0: 20 22 64 65 66 20 7b 7d 20 28 7b 7d 29 3a 5c 6e   "def {} ({}):\n
51f0: 22 2e 66 6f 72 6d 61 74 28 73 46 75 6e 63 4e 61  ".format(sFuncNa
5200: 6d 65 2c 20 73 50 61 72 61 6d 73 29 0a 20 20 20  me, sParams).   
5210: 20 20 20 20 20 73 50 79 43 61 6c 6c 61 62 6c 65       sPyCallable
5220: 73 20 2b 3d 20 22 20 20 20 20 72 65 74 75 72 6e  s += "    return
5230: 20 22 20 2b 20 73 52 65 74 75 72 6e 20 2b 20 22   " + sReturn + "
5240: 5c 6e 22 0a 20 20 20 20 20 20 20 20 23 20 4a 61  \n".        # Ja
5250: 76 61 53 63 72 69 70 74 0a 20 20 20 20 20 20 20  vaScript.       
5260: 20 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d   sJSCallables +=
5270: 20 22 20 20 20 20 7b 7d 3a 20 66 75 6e 63 74 69   "    {}: functi
5280: 6f 6e 20 28 7b 7d 29 22 2e 66 6f 72 6d 61 74 28  on ({})".format(
5290: 73 46 75 6e 63 4e 61 6d 65 2c 20 73 50 61 72 61  sFuncName, sPara
52a0: 6d 73 29 20 2b 20 22 20 7b 5c 6e 22 0a 20 20 20  ms) + " {\n".   
52b0: 20 20 20 20 20 73 4a 53 43 61 6c 6c 61 62 6c 65       sJSCallable
52c0: 73 20 2b 3d 20 22 20 20 20 20 20 20 20 20 72 65  s += "        re
52d0: 74 75 72 6e 20 22 20 2b 20 6a 73 63 6f 6e 76 2e  turn " + jsconv.
52e0: 70 79 32 6a 73 28 73 52 65 74 75 72 6e 29 20 2b  py2js(sReturn) +
52f0: 20 22 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 73   ";\n".        s
5300: 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22  JSCallables += "
5310: 20 20 20 20 7d 2c 5c 6e 22 0a 0a 20 20 20 20 23      },\n"..    #
5320: 20 44 65 62 75 67 67 69 6e 67 0a 20 20 20 20 69   Debugging.    i
5330: 66 20 46 61 6c 73 65 3a 0a 20 20 20 20 20 20 20  f False:.       
5340: 20 70 72 69 6e 74 28 22 5c 6e 41 63 74 69 6f 6e   print("\nAction
5350: 73 3a 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72  s:").        for
5360: 20 73 41 63 74 69 6f 6e 4e 61 6d 65 2c 20 61 41   sActionName, aA
5370: 63 74 69 6f 6e 20 69 6e 20 64 41 43 54 49 4f 4e  ction in dACTION
5380: 53 2e 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20  S.items():.     
5390: 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 41 63         print(sAc
53a0: 74 69 6f 6e 4e 61 6d 65 2c 20 61 41 63 74 69 6f  tionName, aActio
53b0: 6e 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  n).        print
53c0: 28 22 5c 6e 46 75 6e 63 74 69 6f 6e 73 3a 22 29  ("\nFunctions:")
53d0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 73  .        print(s
53e0: 50 79 43 61 6c 6c 61 62 6c 65 73 29 0a 0a 20 20  PyCallables)..  
53f0: 20 20 23 20 52 65 73 75 6c 74 0a 20 20 20 20 72    # Result.    r
5400: 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 20 20 20  eturn {.        
5410: 22 67 72 61 70 68 5f 63 61 6c 6c 61 62 6c 65 73  "graph_callables
5420: 22 3a 20 73 50 79 43 61 6c 6c 61 62 6c 65 73 2c  ": sPyCallables,
5430: 0a 20 20 20 20 20 20 20 20 22 67 72 61 70 68 5f  .        "graph_
5440: 63 61 6c 6c 61 62 6c 65 73 4a 53 22 3a 20 73 4a  callablesJS": sJ
5450: 53 43 61 6c 6c 61 62 6c 65 73 2c 0a 20 20 20 20  SCallables,.    
5460: 20 20 20 20 22 72 75 6c 65 73 5f 67 72 61 70 68      "rules_graph
5470: 73 22 3a 20 73 74 72 28 64 41 6c 6c 47 72 61 70  s": str(dAllGrap
5480: 68 29 2c 0a 20 20 20 20 20 20 20 20 22 72 75 6c  h),.        "rul
5490: 65 73 5f 67 72 61 70 68 73 4a 53 22 3a 20 73 74  es_graphsJS": st
54a0: 72 28 64 41 6c 6c 47 72 61 70 68 29 2c 0a 20 20  r(dAllGraph),.  
54b0: 20 20 20 20 20 20 22 72 75 6c 65 73 5f 61 63 74        "rules_act
54c0: 69 6f 6e 73 22 3a 20 73 74 72 28 64 41 43 54 49  ions": str(dACTI
54d0: 4f 4e 53 29 2c 0a 20 20 20 20 20 20 20 20 22 72  ONS),.        "r
54e0: 75 6c 65 73 5f 61 63 74 69 6f 6e 73 4a 53 22 3a  ules_actionsJS":
54f0: 20 6a 73 63 6f 6e 76 2e 70 79 41 63 74 69 6f 6e   jsconv.pyAction
5500: 73 54 6f 53 74 72 69 6e 67 28 64 41 43 54 49 4f  sToString(dACTIO
5510: 4e 53 29 0a 20 20 20 20 7d 0a                    NS).    }.