Grammalecte  Hex Artifact Content

Artifact 2900658ffe1902c187dfd8f54d6e03a3cbcd057df73fae20ebc5fabb863a7cfe:


0000: 0a 57 52 49 54 49 4e 47 20 52 55 4c 45 53 20 46  .WRITING RULES F
0010: 4f 52 20 47 52 41 4d 4d 41 4c 45 43 54 45 0a 0a  OR GRAMMALECTE..
0020: 4e 6f 74 65 3a 20 54 68 69 73 20 64 6f 63 75 6d  Note: This docum
0030: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6f 62 73 6f  entation is obso
0040: 6c 65 74 65 20 72 69 67 68 74 20 6e 6f 77 2e 0a  lete right now..
0050: 0a 23 20 50 72 69 6e 63 69 70 6c 65 73 20 23 0a  .# Principles #.
0060: 0a 47 72 61 6d 6d 61 6c 65 63 74 65 20 69 73 20  .Grammalecte is 
0070: 61 20 62 69 2d 70 61 73 73 65 73 20 67 72 61 6d  a bi-passes gram
0080: 6d 61 72 20 63 68 65 63 6b 65 72 20 65 6e 67 69  mar checker engi
0090: 6e 65 2e 20 4f 6e 20 74 68 65 20 66 69 72 73 74  ne. On the first
00a0: 20 70 61 73 73 2c 20 74 68 65 0a 65 6e 67 69 6e   pass, the.engin
00b0: 65 20 63 68 65 63 6b 73 20 74 68 65 20 74 65 78  e checks the tex
00c0: 74 20 70 61 72 61 67 72 61 70 68 20 62 79 20 70  t paragraph by p
00d0: 61 72 61 67 72 61 70 68 2e 20 4f 6e 20 74 68 65  aragraph. On the
00e0: 20 73 65 63 6f 6e 64 20 70 61 73 73 65 2c 20 74   second passe, t
00f0: 68 65 20 65 6e 67 69 6e 65 0a 63 68 65 63 6b 20  he engine.check 
0100: 74 68 65 20 74 65 78 74 20 73 65 6e 74 65 6e 63  the text sentenc
0110: 65 20 62 79 20 73 65 6e 74 65 6e 63 65 2e 0a 0a  e by sentence...
0120: 54 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  The command to s
0130: 77 69 74 63 68 20 74 6f 20 74 68 65 20 73 65 63  witch to the sec
0140: 6f 6e 64 20 70 61 73 73 20 69 73 3a 0a 5b 2b 2b  ond pass is:.[++
0150: 5d 0a 0a 49 6e 20 65 61 63 68 20 70 61 73 73 2c  ]..In each pass,
0160: 20 79 6f 75 20 63 61 6e 20 77 72 69 74 65 20 61   you can write a
0170: 73 20 6d 61 6e 79 20 72 75 6c 65 73 20 61 73 20  s many rules as 
0180: 79 6f 75 20 6e 65 65 64 2e 0a 0a 41 20 72 75 6c  you need...A rul
0190: 65 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 3a  e is defined by:
01a0: 0a 2a 20 5b 6f 70 74 69 6f 6e 61 6c 5d 20 66 6c  .* [optional] fl
01b0: 61 67 73 20 e2 80 9c 4c 43 52 e2 80 9d 20 66 6f  ags ...LCR... fo
01c0: 72 20 74 68 65 20 72 65 67 65 78 20 77 6f 72 64  r the regex word
01d0: 20 62 6f 75 6e 64 61 72 69 65 73 20 61 6e 64 20   boundaries and 
01e0: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 6e 65  case sensitivene
01f0: 73 73 0a 2a 20 61 20 72 65 67 65 78 20 70 61 74  ss.* a regex pat
0200: 74 65 72 6e 20 74 72 69 67 67 65 72 0a 2a 20 61  tern trigger.* a
0210: 20 6c 69 73 74 20 6f 66 20 61 63 74 69 6f 6e 73   list of actions
0220: 20 28 63 61 6e e2 80 99 74 20 62 65 20 65 6d 70   (can...t be emp
0230: 74 79 29 0a 2a 20 5b 6f 70 74 69 6f 6e 61 6c 5d  ty).* [optional]
0240: 20 75 73 65 72 20 6f 70 74 69 6f 6e 20 6e 61 6d   user option nam
0250: 65 20 66 6f 72 20 61 63 74 69 76 61 74 69 6e 67  e for activating
0260: 2f 64 69 73 61 63 74 69 76 61 74 69 6e 67 20 74  /disactivating t
0270: 68 65 20 72 75 6c 65 0a 2a 20 5b 6f 70 74 69 6f  he rule.* [optio
0280: 6e 61 6c 5d 20 72 75 6c 65 20 6e 61 6d 65 0a 0a  nal] rule name..
0290: 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  There is no limi
02a0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
02b0: 6f 66 20 61 63 74 69 6f 6e 73 20 61 6e 64 20 74  of actions and t
02c0: 68 65 20 74 79 70 65 20 6f 66 20 61 63 74 69 6f  he type of actio
02d0: 6e 73 20 61 20 72 75 6c 65 20 63 61 6e 0a 6c 61  ns a rule can.la
02e0: 75 6e 63 68 2e 20 45 61 63 68 20 61 63 74 69 6f  unch. Each actio
02f0: 6e 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 6f  n has its own co
0300: 6e 64 69 74 69 6f 6e 20 74 6f 20 62 65 20 74 72  ndition to be tr
0310: 69 67 67 65 72 65 64 2e 0a 0a 54 68 65 72 65 20  iggered...There 
0320: 61 72 65 20 74 68 72 65 65 20 6b 69 6e 64 20 6f  are three kind o
0330: 66 20 61 63 74 69 6f 6e 73 3a 0a 2d 20 45 72 72  f actions:.- Err
0340: 6f 72 20 77 61 72 6e 69 6e 67 2c 20 77 69 74 68  or warning, with
0350: 20 61 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20   a message, and 
0360: 6f 70 74 69 6f 6e 61 6c 6c 79 20 73 75 67 67 65  optionally sugge
0370: 73 74 69 6f 6e 73 2c 20 61 6e 64 20 6f 70 74 69  stions, and opti
0380: 6f 6e 61 6c 6c 79 20 61 6e 20 55 52 4c 0a 2d 20  onally an URL.- 
0390: 54 65 78 74 20 74 72 61 6e 73 66 6f 72 6d 61 74  Text transformat
03a0: 69 6f 6e 2c 20 6d 6f 64 69 66 79 69 6e 67 20 69  ion, modifying i
03b0: 6e 74 65 72 6e 61 6c 6c 79 20 74 68 65 20 63 68  nternally the ch
03c0: 65 63 6b 65 64 20 74 65 78 74 0a 2d 20 44 69 73  ecked text.- Dis
03d0: 61 6d 62 69 67 61 74 69 6f 6e 20 61 63 74 69 6f  ambigation actio
03e0: 6e 2c 20 73 65 74 74 69 6e 67 20 74 61 67 73 20  n, setting tags 
03f0: 6f 6e 20 61 20 70 6f 73 69 74 69 6f 6e 0a 0a 0a  on a position...
0400: 54 68 65 20 72 75 6c 65 73 20 66 69 6c 65 20 66  The rules file f
0410: 6f 72 20 79 6f 75 72 20 6c 61 6e 67 75 61 67 65  or your language
0420: 20 6d 75 73 74 20 62 65 20 6e 61 6d 65 64 20 e2   must be named .
0430: 80 9c 72 75 6c 65 73 2e 67 72 78 e2 80 9d 2e 0a  ..rules.grx.....
0440: 54 68 65 20 73 65 74 74 69 6e 67 73 20 66 69 6c  The settings fil
0450: 65 20 6d 75 73 74 20 62 65 20 6e 61 6d 65 64 20  e must be named 
0460: e2 80 9c 63 6f 6e 66 69 67 2e 69 6e 69 e2 80 9d  ...config.ini...
0470: 2e 0a 0a 41 6c 6c 20 74 68 65 73 65 20 66 69 6c  ...All these fil
0480: 65 73 20 61 72 65 20 73 69 6d 70 6c 65 20 75 74  es are simple ut
0490: 66 2d 38 20 74 65 78 74 20 66 69 6c 65 2e 0a 55  f-8 text file..U
04a0: 54 46 2d 38 20 69 73 20 6d 61 6e 64 61 74 6f 72  TF-8 is mandator
04b0: 79 2e 0a 0a 0a 0a 23 20 52 75 6c 65 20 73 79 6e  y.....# Rule syn
04c0: 74 61 78 20 23 0a 0a 5f 5f 4c 43 52 2f 6f 70 74  tax #..__LCR/opt
04d0: 69 6f 6e 28 72 75 6c 65 6e 61 6d 65 29 5f 5f 20  ion(rulename)__ 
04e0: 20 70 61 74 74 65 72 6e 0a 20 20 20 20 3c 3c 2d   pattern.    <<-
04f0: 20 63 6f 6e 64 69 74 69 6f 6e 20 2d 3e 3e 20 65   condition ->> e
0500: 72 72 6f 72 5f 73 75 67 67 65 73 74 69 6f 6e 73  rror_suggestions
0510: 20 20 23 20 6d 65 73 73 61 67 65 5f 65 72 72 6f    # message_erro
0520: 72 7c 68 74 74 70 3a 2f 2f 61 77 65 62 73 69 74  r|http://awebsit
0530: 65 2e 6e 65 74 2e 2e 2e 0a 20 20 20 20 3c 3c 2d  e.net....    <<-
0540: 20 63 6f 6e 64 69 74 69 6f 6e 20 7e 3e 3e 20 74   condition ~>> t
0550: 65 78 74 5f 72 65 77 72 69 74 69 6e 67 0a 20 20  ext_rewriting.  
0560: 20 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e 20    <<- condition 
0570: 3d 3e 3e 20 63 6f 6d 6d 61 6e 64 73 5f 66 6f 72  =>> commands_for
0580: 5f 64 69 73 61 6d 62 69 67 61 74 69 6f 6e 0a 20  _disambigation. 
0590: 20 20 20 2e 2e 2e 0a 0a 50 61 74 74 65 72 6e 73     .....Patterns
05a0: 20 61 72 65 20 77 72 69 74 74 65 6e 20 77 69 74   are written wit
05b0: 68 20 74 68 65 20 50 79 74 68 6f 6e 20 73 79 6e  h the Python syn
05c0: 74 61 78 20 66 6f 72 20 72 65 67 75 6c 61 72 20  tax for regular 
05d0: 65 78 70 72 65 73 73 69 6f 6e 73 3a 0a 68 74 74  expressions:.htt
05e0: 70 3a 2f 2f 64 6f 63 73 2e 70 79 74 68 6f 6e 2e  p://docs.python.
05f0: 6f 72 67 2f 6c 69 62 72 61 72 79 2f 72 65 2e 68  org/library/re.h
0600: 74 6d 6c 0a 0a 54 68 65 72 65 20 63 61 6e 20 62  tml..There can b
0610: 65 20 6f 6e 65 20 6f 72 20 73 65 76 65 72 61 6c  e one or several
0620: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 65 61 63   actions for eac
0630: 68 20 72 75 6c 65 2c 20 65 78 65 63 75 74 65 64  h rule, executed
0640: 20 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20   the order they 
0650: 61 72 65 0a 77 72 69 74 74 65 6e 2e 0a 0a 43 6f  are.written...Co
0660: 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6f 70 74  nditions are opt
0670: 69 6f 6e 61 6c 2c 20 69 2e 65 2e 3a 0a 20 20 20  ional, i.e.:.   
0680: 20 3c 3c 2d 20 7e 3e 3e 20 72 65 70 6c 61 63 65   <<- ~>> replace
0690: 6d 65 6e 74 0a 0a 0a 4c 43 52 20 66 6c 61 67 73  ment...LCR flags
06a0: 20 6d 65 61 6e 73 3a 0a 2a 20 4c 3a 20 4c 65 66   means:.* L: Lef
06b0: 74 20 62 6f 75 6e 64 61 72 79 20 66 6f 72 20 74  t boundary for t
06c0: 68 65 20 72 65 67 65 78 0a 2a 20 43 3a 20 43 61  he regex.* C: Ca
06d0: 73 65 20 73 65 6e 73 69 74 69 76 65 6e 65 73 73  se sensitiveness
06e0: 0a 2a 20 52 3a 20 52 69 67 68 74 20 62 6f 75 6e  .* R: Right boun
06f0: 64 61 72 79 20 66 6f 72 20 74 68 65 20 72 65 67  dary for the reg
0700: 65 78 0a 0a 4c 65 66 74 20 62 6f 75 6e 64 61 72  ex..Left boundar
0710: 79 20 28 4c 29 3a 0a 20 20 20 20 60 5b 60 20 20  y (L):.    `[`  
0720: 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 79 0a 20   word boundary. 
0730: 20 20 20 60 3c 60 20 20 20 6e 6f 20 77 6f 72 64     `<`   no word
0740: 20 62 6f 75 6e 64 61 72 79 0a 0a 72 69 67 68 74   boundary..right
0750: 20 62 6f 75 6e 64 61 72 79 20 28 52 29 3a 0a 20   boundary (R):. 
0760: 20 20 20 60 5d 60 20 20 20 77 6f 72 64 20 62 6f     `]`   word bo
0770: 75 6e 64 61 72 79 0a 20 20 20 20 60 3e 60 20 20  undary.    `>`  
0780: 20 6e 6f 20 77 6f 72 64 20 62 6f 75 6e 64 61 72   no word boundar
0790: 79 0a 0a 43 61 73 65 20 73 65 6e 73 69 74 69 76  y..Case sensitiv
07a0: 65 6e 65 73 73 20 28 43 29 3a 0a 20 20 20 20 60  eness (C):.    `
07b0: 69 60 20 20 20 20 20 63 61 73 65 20 69 6e 73 65  i`     case inse
07c0: 6e 73 69 74 69 76 65 0a 20 20 20 20 60 73 60 20  nsitive.    `s` 
07d0: 20 20 20 20 63 61 73 65 20 73 65 6e 73 69 74 69      case sensiti
07e0: 76 65 0a 20 20 20 20 60 75 60 20 20 20 20 20 75  ve.    `u`     u
07f0: 70 70 65 72 63 61 73 65 20 61 6c 6c 6f 77 65 64  ppercase allowed
0800: 20 66 6f 72 20 6c 6f 77 65 72 63 61 73 65 64 20   for lowercased 
0810: 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
0820: 20 20 20 20 20 20 20 69 2e 65 2e 3a 20 20 22 57         i.e.:  "W
0830: 6f 72 64 22 20 20 62 65 63 6f 6d 65 73 20 20 22  ord"  becomes  "
0840: 57 5b 6f 4f 5d 5b 72 52 5d 5b 64 44 5d 22 0a 0a  W[oO][rR][dD]"..
0850: 45 78 61 6d 70 6c 65 73 3a 0a 20 20 20 20 5f 5f  Examples:.    __
0860: 5b 69 5d 5f 5f 20 20 70 61 74 74 65 72 6e 0a 20  [i]__  pattern. 
0870: 20 20 20 5f 5f 3c 73 5d 5f 5f 20 20 70 61 74 74     __<s]__  patt
0880: 65 72 6e 0a 20 20 20 20 5f 5f 5b 75 3e 5f 5f 20  ern.    __[u>__ 
0890: 20 70 61 74 74 65 72 6e 0a 20 20 20 20 5f 5f 3c   pattern.    __<
08a0: 73 3e 5f 5f 20 20 70 61 74 74 65 72 6e 0a 20 20  s>__  pattern.  
08b0: 20 20 2e 2e 2e 0a 0a 0a 55 73 65 72 20 6f 70 74    ......User opt
08c0: 69 6f 6e 20 61 63 74 69 76 61 74 69 6e 67 2f 64  ion activating/d
08d0: 69 73 61 63 74 69 76 61 74 69 6e 67 20 69 73 20  isactivating is 
08e0: 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 6e  possible with an
08f0: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 70 6c 61   option name pla
0900: 63 65 64 0a 6a 75 73 74 20 61 66 74 65 72 20 74  ced.just after t
0910: 68 65 20 4c 43 52 20 66 6c 61 67 73 2c 20 69 2e  he LCR flags, i.
0920: 65 2e 3a 0a 20 20 20 20 5f 5f 5b 69 5d 2f 6f 70  e.:.    __[i]/op
0930: 74 69 6f 6e 31 5f 5f 20 20 70 61 74 74 65 72 6e  tion1__  pattern
0940: 0a 20 20 20 20 5f 5f 5b 75 5d 2f 6f 70 74 69 6f  .    __[u]/optio
0950: 6e 32 5f 5f 20 20 70 61 74 74 65 72 6e 0a 20 20  n2__  pattern.  
0960: 20 20 5f 5f 5b 73 3e 2f 6f 70 74 69 6f 6e 31 5f    __[s>/option1_
0970: 5f 20 20 70 61 74 74 65 72 6e 0a 20 20 20 20 5f  _  pattern.    _
0980: 5f 3c 75 3e 2f 6f 70 74 69 6f 6e 33 5f 5f 20 20  _<u>/option3__  
0990: 70 61 74 74 65 72 6e 0a 20 20 20 20 5f 5f 3c 69  pattern.    __<i
09a0: 3e 2f 6f 70 74 69 6f 6e 33 5f 5f 20 20 70 61 74  >/option3__  pat
09b0: 74 65 72 6e 0a 20 20 20 20 2e 2e 2e 0a 0a 52 75  tern.    .....Ru
09c0: 6c 65 73 20 63 61 6e 20 62 65 20 6e 61 6d 65 64  les can be named
09d0: 3a 0a 20 20 20 20 5f 5f 5b 69 5d 2f 6f 70 74 69  :.    __[i]/opti
09e0: 6f 6e 31 28 6e 61 6d 65 31 29 5f 5f 20 20 70 61  on1(name1)__  pa
09f0: 74 74 65 72 6e 0a 20 20 20 20 5f 5f 5b 75 5d 2f  ttern.    __[u]/
0a00: 6f 70 74 69 6f 6e 32 28 6e 61 6d 65 32 29 5f 5f  option2(name2)__
0a10: 20 20 70 61 74 74 65 72 6e 0a 20 20 20 20 5f 5f    pattern.    __
0a20: 5b 73 3e 2f 6f 70 74 69 6f 6e 31 28 6e 61 6d 65  [s>/option1(name
0a30: 33 29 5f 5f 20 20 70 61 74 74 65 72 6e 0a 20 20  3)__  pattern.  
0a40: 20 20 5f 5f 3c 75 3e 2f 6f 70 74 69 6f 6e 33 28    __<u>/option3(
0a50: 6e 61 6d 65 34 29 5f 5f 20 20 70 61 74 74 65 72  name4)__  patter
0a60: 6e 0a 20 20 20 20 5f 5f 3c 69 3e 2f 6f 70 74 69  n.    __<i>/opti
0a70: 6f 6e 33 28 6e 61 6d 65 35 29 5f 5f 20 20 70 61  on3(name5)__  pa
0a80: 74 74 65 72 6e 0a 20 20 20 20 2e 2e 2e 0a 0a 45  ttern.    .....E
0a90: 61 63 68 20 72 75 6c 65 20 6e 61 6d 65 20 6d 75  ach rule name mu
0aa0: 73 74 20 62 65 20 75 6e 69 71 75 65 2e 0a 0a 0a  st be unique....
0ab0: 54 68 65 20 4c 43 52 20 66 6c 61 67 73 20 61 72  The LCR flags ar
0ac0: 65 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  e also optional.
0ad0: 20 49 66 20 79 6f 75 20 64 6f 6e e2 80 99 74 20   If you don...t 
0ae0: 73 65 74 20 74 68 65 73 65 20 66 6c 61 67 73 2c  set these flags,
0af0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 4c 43 52   the default LCR
0b00: 0a 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 3a 0a  .flags will be:.
0b10: 20 20 20 20 5f 5f 5b 69 5d 5f 5f 0a 0a 45 78 61      __[i]__..Exa
0b20: 6d 70 6c 65 2e 20 52 65 70 6f 72 74 20 e2 80 9c  mple. Report ...
0b30: 66 6f 6f e2 80 9d 20 69 6e 20 74 68 65 20 74 65  foo... in the te
0b40: 78 74 20 61 6e 64 20 73 75 67 67 65 73 74 20 22  xt and suggest "
0b50: 62 61 72 22 3a 0a 0a 20 20 20 20 66 6f 6f 20 3c  bar":..    foo <
0b60: 3c 2d 20 2d 3e 3e 20 62 61 72 20 23 20 55 73 65  <- ->> bar # Use
0b70: 20 62 61 72 20 69 6e 73 74 65 61 64 20 6f 66 20   bar instead of 
0b80: 66 6f 6f 2e 0a 0a 45 78 61 6d 70 6c 65 2e 20 52  foo...Example. R
0b90: 65 63 6f 67 6e 69 7a 65 20 61 6e 64 20 73 75 67  ecognize and sug
0ba0: 67 65 73 74 20 6d 69 73 73 69 6e 67 20 68 79 70  gest missing hyp
0bb0: 68 65 6e 20 61 6e 64 20 72 65 77 72 69 74 65 20  hen and rewrite 
0bc0: 69 6e 74 65 72 6e 61 6c 6c 79 20 74 68 65 20 74  internally the t
0bd0: 65 78 74 0a 77 69 74 68 20 74 68 65 20 68 79 70  ext.with the hyp
0be0: 68 65 6e 3a 0a 0a 20 20 20 20 5f 5f 5b 73 5d 5f  hen:..    __[s]_
0bf0: 5f 20 66 6f 6f 20 62 61 72 0a 20 20 20 20 20 20  _ foo bar.      
0c00: 20 20 3c 3c 2d 20 2d 3e 3e 20 66 6f 6f 2d 62 61    <<- ->> foo-ba
0c10: 72 20 23 20 4d 69 73 73 69 6e 67 20 68 79 70 68  r # Missing hyph
0c20: 65 6e 2e 0a 20 20 20 20 20 20 20 20 3c 3c 2d 20  en..        <<- 
0c30: 7e 3e 3e 20 66 6f 6f 2d 62 61 72 0a 0a 0a 3d 3d  ~>> foo-bar...==
0c40: 20 53 69 6d 70 6c 65 2d 6c 69 6e 65 20 6f 72 20   Simple-line or 
0c50: 6d 75 6c 74 69 2d 6c 69 6e 65 20 72 75 6c 65 73  multi-line rules
0c60: 20 3d 3d 0a 0a 52 75 6c 65 73 20 63 61 6e 20 62   ==..Rules can b
0c70: 65 20 62 72 65 61 6b 20 74 6f 20 6d 75 6c 74 69  e break to multi
0c80: 70 6c 65 20 6c 69 6e 65 73 20 62 79 20 6c 65 61  ple lines by lea
0c90: 64 69 6e 67 20 74 61 62 75 6c 61 74 6f 72 73 20  ding tabulators 
0ca0: 6f 72 20 73 70 61 63 65 73 2e 0a 59 6f 75 20 73  or spaces..You s
0cb0: 68 6f 75 6c 64 20 75 73 65 20 34 20 73 70 61 63  hould use 4 spac
0cc0: 65 73 2e 0a 0a 45 78 61 6d 70 6c 65 73 3a 0a 0a  es...Examples:..
0cd0: 20 20 20 20 5f 5f 3c 73 3e 5f 5f 20 70 61 74 74      __<s>__ patt
0ce0: 65 72 6e 0a 20 20 20 20 20 20 20 20 3c 3c 2d 20  ern.        <<- 
0cf0: 63 6f 6e 64 69 74 69 6f 6e 20 2d 3e 3e 20 72 65  condition ->> re
0d00: 70 6c 61 63 65 6d 65 6e 74 0a 20 20 20 20 20 20  placement.      
0d10: 20 20 23 20 6d 65 73 73 61 67 65 0a 20 20 20 20    # message.    
0d20: 20 20 20 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f      <<- conditio
0d30: 6e 20 2d 3e 3e 20 73 75 67 67 65 73 74 69 6f 6e  n ->> suggestion
0d40: 20 23 20 6d 65 73 73 61 67 65 0a 20 20 20 20 20   # message.     
0d50: 20 20 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e     <<- condition
0d60: 0a 20 20 20 20 20 20 20 20 7e 3e 3e 20 74 65 78  .        ~>> tex
0d70: 74 5f 72 65 77 72 69 74 69 6e 67 0a 20 20 20 20  t_rewriting.    
0d80: 20 20 20 20 3c 3c 2d 20 3d 3e 3e 20 64 69 73 61      <<- =>> disa
0d90: 6d 62 69 67 75 61 74 69 6f 6e 0a 0a 20 20 20 20  mbiguation..    
0da0: 5f 5f 3c 73 3e 5f 5f 20 70 61 74 74 65 72 6e 20  __<s>__ pattern 
0db0: 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e 20 2d 3e  <<- condition ->
0dc0: 3e 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 23 20  > replacement # 
0dd0: 6d 65 73 73 61 67 65 0a 0a 0a 23 23 20 43 6f 6d  message...## Com
0de0: 6d 65 6e 74 73 20 23 23 0a 0a 4c 69 6e 65 73 20  ments ##..Lines 
0df0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 23  beginning with #
0e00: 20 61 72 65 20 63 6f 6d 6d 65 6e 74 73 2e 0a 0a   are comments...
0e10: 0a 23 23 20 45 6e 64 20 6f 66 20 66 69 6c 65 20  .## End of file 
0e20: 23 23 0a 0a 57 69 74 68 20 74 68 65 20 63 6f 6d  ##..With the com
0e30: 6d 61 6e 64 3a 0a 0a 60 23 45 4e 44 60 0a 0a 61  mand:..`#END`..a
0e40: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e50: 6f 66 20 61 20 6c 69 6e 65 2c 20 74 68 65 20 63  of a line, the c
0e60: 6f 6d 70 69 6c 65 72 20 77 6f 6e e2 80 99 74 20  ompiler won...t 
0e70: 67 6f 20 66 75 72 74 68 65 72 2e 0a 57 68 61 74  go further..What
0e80: 65 76 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ever is written 
0e90: 61 66 74 65 72 20 77 69 6c 6c 20 62 65 20 63 6f  after will be co
0ea0: 6e 73 69 64 65 72 65 64 20 61 73 20 63 6f 6d 6d  nsidered as comm
0eb0: 65 6e 74 73 2e 0a 0a 0a 23 23 20 57 68 69 74 65  ents....## White
0ec0: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 62 6f  spaces at the bo
0ed0: 72 64 65 72 20 6f 66 20 70 61 74 74 65 72 6e 73  rder of patterns
0ee0: 20 6f 72 20 73 75 67 67 65 73 74 69 6f 6e 73 20   or suggestions 
0ef0: 23 23 0a 0a 45 78 61 6d 70 6c 65 2e 20 52 65 63  ##..Example. Rec
0f00: 6f 67 6e 69 7a 65 20 64 6f 75 62 6c 65 20 6f 72  ognize double or
0f10: 20 6d 6f 72 65 20 73 70 61 63 65 73 20 61 6e 64   more spaces and
0f20: 20 73 75 67 67 65 73 74 73 20 61 20 73 69 6e 67   suggests a sing
0f30: 6c 65 20 73 70 61 63 65 3a 0a 0a 20 20 20 20 5f  le space:..    _
0f40: 5f 3c 73 3e 5f 5f 20 20 22 20 20 2b 22 20 3c 3c  _<s>__  "  +" <<
0f50: 2d 20 2d 3e 3e 20 22 20 22 20 23 20 45 78 74 72  - ->> " " # Extr
0f60: 61 20 73 70 61 63 65 28 73 29 2e 0a 0a 41 53 43  a space(s)...ASC
0f70: 49 49 20 22 20 63 68 61 72 61 63 74 65 72 73 20  II " characters 
0f80: 70 72 6f 74 65 63 74 20 73 70 61 63 65 73 20 69  protect spaces i
0f90: 6e 20 74 68 65 20 70 61 74 74 65 72 6e 20 61 6e  n the pattern an
0fa0: 64 20 69 6e 20 74 68 65 20 72 65 70 6c 61 63 65  d in the replace
0fb0: 6d 65 6e 74 20 74 65 78 74 2e 0a 0a 0a 23 23 20  ment text....## 
0fc0: 50 61 74 74 65 72 6e 20 67 72 6f 75 70 73 20 61  Pattern groups a
0fd0: 6e 64 20 62 61 63 6b 20 72 65 66 65 72 65 6e 63  nd back referenc
0fe0: 65 73 20 23 23 0a 0a 49 74 20 69 73 20 75 73 75  es ##..It is usu
0ff0: 61 6c 6c 79 20 75 73 65 66 75 6c 20 74 6f 20 72  ally useful to r
1000: 65 74 72 69 65 76 65 20 70 61 72 74 73 20 6f 66  etrieve parts of
1010: 20 74 68 65 20 6d 61 74 63 68 65 64 20 70 61 74   the matched pat
1020: 74 65 72 6e 2e 20 57 65 20 73 69 6d 70 6c 79 20  tern. We simply 
1030: 75 73 65 0a 70 61 72 65 6e 74 68 65 73 69 73 20  use.parenthesis 
1040: 69 6e 20 70 61 74 74 65 72 6e 20 74 6f 20 67 65  in pattern to ge
1050: 74 20 67 72 6f 75 70 73 20 77 69 74 68 20 62 61  t groups with ba
1060: 63 6b 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 0a  ck references...
1070: 45 78 61 6d 70 6c 65 2e 20 53 75 67 67 65 73 74  Example. Suggest
1080: 20 61 20 77 6f 72 64 20 77 69 74 68 20 63 6f 72   a word with cor
1090: 72 65 63 74 20 71 75 6f 74 61 74 69 6f 6e 20 6d  rect quotation m
10a0: 61 72 6b 73 3a 0a 0a 5c 22 28 5c 77 2b 29 5c 22  arks:..\"(\w+)\"
10b0: 20 3c 3c 2d 20 2d 3e 3e 20 e2 80 9c 5c 31 e2 80   <<- ->> ...\1..
10c0: 9d 20 23 20 43 6f 72 72 65 63 74 20 71 75 6f 74  . # Correct quot
10d0: 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 0a 45 78  ation marks...Ex
10e0: 61 6d 70 6c 65 2e 20 53 75 67 67 65 73 74 20 74  ample. Suggest t
10f0: 68 65 20 6d 69 73 73 69 6e 67 20 73 70 61 63 65  he missing space
1100: 20 61 66 74 65 72 20 74 68 65 20 21 2c 20 3f 20   after the !, ? 
1110: 6f 72 20 2e 20 73 69 67 6e 73 3a 0a 0a 5f 5f 3c  or . signs:..__<
1120: 69 5d 5f 5f 20 5c 62 28 5b 3f 21 2e 5d 29 28 5b  i]__ \b([?!.])([
1130: 41 2d 5a 5d 2b 29 20 3c 3c 2d 20 2d 3e 3e 20 5c  A-Z]+) <<- ->> \
1140: 31 20 5c 32 20 23 20 4d 69 73 73 69 6e 67 20 73  1 \2 # Missing s
1150: 70 61 63 65 3f 0a 0a 45 78 61 6d 70 6c 65 2e 20  pace?..Example. 
1160: 42 61 63 6b 20 72 65 66 65 72 65 6e 63 65 20 69  Back reference i
1170: 6e 20 6d 65 73 73 61 67 65 73 2e 0a 0a 28 66 6f  n messages...(fo
1180: 6f 6f 29 20 62 61 72 20 3c 3c 2d 20 2d 3e 3e 20  oo) bar <<- ->> 
1190: 66 6f 6f 20 62 61 72 20 23 20 e2 80 9c 5c 31 e2  foo bar # ...\1.
11a0: 80 9d 20 73 68 6f 75 6c 64 20 62 65 3a 0a 0a 0a  .. should be:...
11b0: 23 23 20 4e 61 6d 65 20 64 65 66 69 6e 69 74 69  ## Name definiti
11c0: 6f 6e 73 20 23 23 0a 0a 47 72 61 6d 6d 61 6c 65  ons ##..Grammale
11d0: 63 74 65 20 73 75 70 70 6f 72 74 73 20 6e 61 6d  cte supports nam
11e0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 74 6f  e definitions to
11f0: 20 73 69 6d 70 6c 69 66 79 20 74 68 65 20 64 65   simplify the de
1200: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1210: 0a 63 6f 6d 70 6c 65 78 20 72 75 6c 65 73 2e 0a  .complex rules..
1220: 0a 45 78 61 6d 70 6c 65 2e 0a 0a 44 45 46 3a 20  .Example...DEF: 
1230: 6e 61 6d 65 20 70 61 74 74 65 72 6e 0a 0a 55 73  name pattern..Us
1240: 61 67 65 20 69 6e 20 74 68 65 20 72 75 6c 65 73  age in the rules
1250: 3a 0a 0a 28 7b 6e 61 6d 65 7d 29 20 28 5c 77 2b  :..({name}) (\w+
1260: 29 20 2d 3e 3e 20 22 5c 31 2d 5c 32 22 20 23 20  ) ->> "\1-\2" # 
1270: 4d 69 73 73 69 6e 67 20 68 79 70 68 65 6e 3f 0a  Missing hyphen?.
1280: 0a 0a 23 23 20 4d 75 6c 74 69 70 6c 65 20 73 75  ..## Multiple su
1290: 67 67 65 73 74 69 6f 6e 73 20 23 23 0a 0a 55 73  ggestions ##..Us
12a0: 65 20 7c 20 69 6e 20 74 68 65 20 72 65 70 6c 61  e | in the repla
12b0: 63 65 6d 65 6e 74 20 74 65 78 74 20 74 6f 20 61  cement text to a
12c0: 64 64 20 6d 75 6c 74 69 70 6c 65 20 73 75 67 67  dd multiple sugg
12d0: 65 73 74 69 6f 6e 73 3a 0a 0a 45 78 61 6d 70 6c  estions:..Exampl
12e0: 65 20 37 2e 20 46 6f 6f 2c 20 46 4f 4f 2c 20 42  e 7. Foo, FOO, B
12f0: 61 72 20 61 6e 64 20 42 41 52 20 73 75 67 67 65  ar and BAR sugge
1300: 73 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 69  stions for the i
1310: 6e 70 75 74 20 77 6f 72 64 20 22 66 6f 6f 22 2e  nput word "foo".
1320: 0a 0a 66 6f 6f 20 3c 3c 2d 20 2d 3e 3e 20 46 6f  ..foo <<- ->> Fo
1330: 6f 7c 46 4f 4f 7c 42 61 72 7c 42 41 52 20 23 20  o|FOO|Bar|BAR # 
1340: 44 69 64 20 79 6f 75 20 6d 65 61 6e 3a 0a 0a 0a  Did you mean:...
1350: 23 23 20 4e 6f 20 73 75 67 67 65 73 74 69 6f 6e  ## No suggestion
1360: 20 23 23 0a 0a 59 6f 75 20 63 61 6e 20 64 69 73   ##..You can dis
1370: 70 6c 61 79 20 6d 65 73 73 61 67 65 20 77 69 74  play message wit
1380: 68 6f 75 74 20 6d 61 6b 69 6e 67 20 73 75 67 67  hout making sugg
1390: 65 73 74 69 6f 6e 73 2e 20 46 6f 72 20 74 68 69  estions. For thi
13a0: 73 20 70 75 72 70 6f 73 65 2c 0a 75 73 65 20 61  s purpose,.use a
13b0: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
13c0: 72 20 5f 20 69 6e 20 74 68 65 20 73 75 67 67 65  r _ in the sugge
13d0: 73 74 69 6f 6e 20 66 69 65 6c 64 2e 0a 0a 45 78  stion field...Ex
13e0: 61 6d 70 6c 65 2e 20 4e 6f 20 73 75 67 67 65 73  ample. No sugges
13f0: 74 69 6f 6e 2e 0a 0a 66 6f 6f 62 61 72 20 3c 3c  tion...foobar <<
1400: 2d 20 2d 3e 3e 20 5f 20 23 20 4d 65 73 73 61 67  - ->> _ # Messag
1410: 65 0a 0a 0a 23 23 20 50 6f 73 69 74 69 6f 6e 69  e...## Positioni
1420: 6e 67 20 23 23 0a 0a 50 6f 73 69 74 69 6f 6e 69  ng ##..Positioni
1430: 6e 67 20 69 73 20 76 61 6c 69 64 20 6f 6e 6c 79  ng is valid only
1440: 20 66 6f 72 20 65 72 72 6f 72 20 63 72 65 61 74   for error creat
1450: 69 6f 6e 20 61 6e 64 20 74 65 78 74 20 72 65 77  ion and text rew
1460: 72 69 74 69 6e 67 2e 0a 0a 42 79 20 64 65 66 61  riting...By defa
1470: 75 6c 74 2c 20 74 68 65 20 66 75 6c 6c 20 70 61  ult, the full pa
1480: 74 74 65 72 6e 20 77 69 6c 6c 20 62 65 20 75 6e  ttern will be un
1490: 64 65 72 6c 69 6e 65 64 20 77 69 74 68 20 62 6c  derlined with bl
14a0: 75 65 2e 20 59 6f 75 20 63 61 6e 20 73 68 6f 72  ue. You can shor
14b0: 74 65 6e 20 74 68 65 0a 75 6e 64 65 72 6c 69 6e  ten the.underlin
14c0: 65 64 20 74 65 78 74 20 61 72 65 61 20 62 79 20  ed text area by 
14d0: 73 70 65 63 69 66 79 69 6e 67 20 61 20 62 61 63  specifying a bac
14e0: 6b 20 72 65 66 65 72 65 6e 63 65 20 67 72 6f 75  k reference grou
14f0: 70 20 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e  p of the pattern
1500: 2e 0a 49 6e 73 74 65 61 64 20 6f 66 20 77 72 69  ..Instead of wri
1510: 74 69 6e 67 20 2d 3e 3e 2c 20 77 72 69 74 65 20  ting ->>, write 
1520: 2d 6e 3e 3e 20 20 6e 20 62 65 69 6e 67 20 74 68  -n>>  n being th
1530: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 62 61  e number of a ba
1540: 63 6b 20 72 65 66 65 72 65 6e 63 65 0a 67 72 6f  ck reference.gro
1550: 75 70 2e 20 41 63 74 75 61 6c 6c 79 2c 20 20 2d  up. Actually,  -
1560: 3e 3e 20 20 69 73 20 73 69 6d 69 6c 61 72 20 74  >>  is similar t
1570: 6f 20 20 2d 30 3e 3e 0a 0a 45 78 61 6d 70 6c 65  o  -0>>..Example
1580: 2e 0a 0a 28 79 69 6e 67 29 20 61 6e 64 20 79 61  ...(ying) and ya
1590: 6e 67 20 3c 3c 2d 20 2d 31 3e 3e 20 79 69 6e 20  ng <<- -1>> yin 
15a0: 23 20 44 69 64 20 79 6f 75 20 6d 65 61 6e 3a 0a  # Did you mean:.
15b0: 5f 5f 5b 73 5d 5f 5f 20 28 4d 72 2e 29 20 5b 41  __[s]__ (Mr.) [A
15c0: 2d 5a 5d 5c 77 2b 20 3c 3c 2d 20 7e 31 3e 3e 20  -Z]\w+ <<- ~1>> 
15d0: 4d 72 0a 0a 23 23 23 20 43 6f 6d 70 61 72 69 73  Mr..### Comparis
15e0: 6f 6e 20 23 23 23 0a 0a 52 75 6c 65 20 41 3a 0a  on ###..Rule A:.
15f0: 79 69 6e 67 20 61 6e 64 20 79 61 6e 67 20 20 20  ying and yang   
1600: 20 20 20 20 3c 3c 2d 20 2d 3e 3e 20 20 20 20 20      <<- ->>     
1610: 79 69 6e 20 61 6e 64 20 79 61 6e 67 20 20 20 20  yin and yang    
1620: 20 20 20 20 23 20 44 69 64 20 79 6f 75 20 6d 65      # Did you me
1630: 61 6e 3a 0a 0a 52 75 6c 65 20 42 3a 0a 28 79 69  an:..Rule B:.(yi
1640: 6e 67 29 20 61 6e 64 20 79 61 6e 67 20 20 20 20  ng) and yang    
1650: 20 3c 3c 2d 20 2d 31 3e 3e 20 20 20 20 79 69 6e   <<- -1>>    yin
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 23 20 44 69 64 20 79 6f 75 20 6d 65 61 6e 3a   # Did you mean:
1680: 0a 0a 57 69 74 68 20 74 68 65 20 72 75 6c 65 20  ..With the rule 
1690: 41 2c 20 74 68 65 20 66 75 6c 6c 20 70 61 74 74  A, the full patt
16a0: 65 72 6e 20 69 73 20 75 6e 64 65 72 6c 69 6e 65  ern is underline
16b0: 64 3a 0a 20 20 20 20 79 69 6e 67 20 61 6e 64 20  d:.    ying and 
16c0: 79 61 6e 67 0a 20 20 20 20 5e 5e 5e 5e 5e 5e 5e  yang.    ^^^^^^^
16d0: 5e 5e 5e 5e 5e 5e 0a 0a 57 69 74 68 20 74 68 65  ^^^^^^..With the
16e0: 20 72 75 6c 65 20 42 2c 20 6f 6e 6c 79 20 74 68   rule B, only th
16f0: 65 20 66 69 72 73 74 20 67 72 6f 75 70 20 69 73  e first group is
1700: 20 75 6e 64 65 72 6c 69 6e 65 64 3a 0a 20 20 20   underlined:.   
1710: 20 79 69 6e 67 20 61 6e 64 20 79 61 6e 67 0a 20   ying and yang. 
1720: 20 20 20 5e 5e 5e 5e 0a 0a 0a 23 23 20 4c 6f 6e     ^^^^...## Lon
1730: 67 65 72 20 65 78 70 6c 61 6e 61 74 69 6f 6e 73  ger explanations
1740: 20 77 69 74 68 20 55 52 4c 73 20 23 23 0a 0a 57   with URLs ##..W
1750: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 73 20  arning messages 
1760: 63 61 6e 20 63 6f 6e 74 61 69 6e 20 6f 70 74 69  can contain opti
1770: 6f 6e 61 6c 20 55 52 4c 20 66 6f 72 20 6c 6f 6e  onal URL for lon
1780: 67 65 72 20 65 78 70 6c 61 6e 61 74 69 6f 6e 73  ger explanations
1790: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 22 7c   separated by "|
17a0: 22 3a 0a 0a 28 79 6f 75 72 7c 68 65 72 7c 6f 75  ":..(your|her|ou
17b0: 72 7c 74 68 65 69 72 29 5b 27 e2 80 99 5d 73 0a  r|their)['...]s.
17c0: 20 20 20 20 3c 3c 2d 20 2d 3e 3e 20 5c 31 73 0a      <<- ->> \1s.
17d0: 20 20 20 20 23 20 50 6f 73 73 65 73 73 69 76 65      # Possessive
17e0: 20 70 72 6f 6e 6f 75 6e 3a 7c 68 74 74 70 3a 2f   pronoun:|http:/
17f0: 2f 65 6e 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72  /en.wikipedia.or
1800: 67 2f 77 69 6b 69 2f 50 6f 73 73 65 73 73 69 76  g/wiki/Possessiv
1810: 65 5f 70 72 6f 6e 6f 75 6e 0a 0a 0a 0a 23 20 54  e_pronoun....# T
1820: 65 78 74 20 72 65 77 72 69 74 69 6e 67 20 23 0a  ext rewriting #.
1830: 0a 45 78 61 6d 70 6c 65 2e 20 52 65 70 6c 61 63  .Example. Replac
1840: 69 6e 67 20 61 20 73 74 72 69 6e 67 20 62 79 20  ing a string by 
1850: 61 6e 6f 74 68 65 72 0a 0a 4d 72 2e 20 5b 41 2d  another..Mr. [A-
1860: 5a 5d 5c 77 2b 20 3c 3c 2d 20 7e 3e 3e 20 4d 69  Z]\w+ <<- ~>> Mi
1870: 73 74 65 72 0a 0a 57 41 52 4e 49 4e 47 3a 20 54  ster..WARNING: T
1880: 68 65 20 72 65 70 6c 61 63 69 6e 67 20 74 65 78  he replacing tex
1890: 74 20 6d 75 73 74 20 62 65 20 73 68 6f 72 74 65  t must be shorte
18a0: 72 20 74 68 61 6e 20 74 68 65 20 72 65 70 6c 61  r than the repla
18b0: 63 65 64 20 74 65 78 74 20 6f 72 20 68 61 76 65  ced text or have
18c0: 20 74 68 65 0a 73 61 6d 65 20 6c 65 6e 67 74 68   the.same length
18d0: 2e 20 42 72 65 61 6b 69 6e 67 20 74 68 69 73 20  . Breaking this 
18e0: 72 75 6c 65 20 77 69 6c 6c 20 6d 69 73 70 6c 61  rule will mispla
18f0: 63 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  ce following err
1900: 6f 72 20 72 65 70 6f 72 74 73 2e 20 59 6f 75 0a  or reports. You.
1910: 68 61 76 65 20 74 6f 20 65 6e 73 75 72 65 20 79  have to ensure y
1920: 6f 75 72 73 65 6c 66 20 74 68 65 20 72 75 6c 65  ourself the rule
1930: 73 20 63 6f 6d 70 6c 79 20 77 69 74 68 20 74 68  s comply with th
1940: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 47  is constraint, G
1950: 72 61 6d 6d 61 6c 65 63 74 65 0a 77 6f 6e e2 80  rammalecte.won..
1960: 99 74 20 64 6f 20 69 74 20 66 6f 72 20 79 6f 75  .t do it for you
1970: 2e 0a 0a 53 70 65 63 69 66 69 63 20 63 6f 6d 6d  ...Specific comm
1980: 61 6e 64 73 20 66 6f 72 20 74 65 78 74 20 72 65  ands for text re
1990: 77 72 69 74 69 6e 67 0a 0a 7e 3e 3e 20 2a 0a 20  writing..~>> *. 
19a0: 20 20 20 72 65 70 6c 61 63 65 20 62 79 20 77 68     replace by wh
19b0: 69 74 65 73 70 61 63 65 73 0a 0a 7e 3e 3e 20 40  itespaces..~>> @
19c0: 0a 20 20 20 20 72 65 70 6c 61 63 65 20 62 79 20  .    replace by 
19d0: 61 72 6f 62 61 73 65 73 2c 20 75 73 65 66 75 6c  arobases, useful
19e0: 20 6d 6f 73 74 6c 79 20 61 74 20 66 69 72 74 20   mostly at firt 
19f0: 70 61 73 73 2c 20 77 68 65 72 65 20 69 74 20 69  pass, where it i
1a00: 73 20 61 64 76 69 73 65 64 20 74 6f 0a 20 20 20  s advised to.   
1a10: 20 63 68 65 63 6b 20 75 73 61 67 65 20 6f 66 20   check usage of 
1a20: 70 75 6e 63 74 75 61 74 69 6f 6e 73 20 61 6e 64  punctuations and
1a30: 20 77 68 69 74 65 73 70 61 63 65 73 2e 0a 20 20   whitespaces..  
1a40: 20 20 40 20 61 72 65 20 61 75 74 6f 6d 61 74 69    @ are automati
1a50: 63 61 6c 6c 79 20 72 65 6d 6f 76 65 64 20 61 74  cally removed at
1a60: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a70: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73  f the second pas
1a80: 73 2e 0a 0a 59 6f 75 20 63 61 6e 20 75 73 65 20  s...You can use 
1a90: 70 6f 73 69 74 69 6f 6e 69 6e 67 20 77 69 74 68  positioning with
1aa0: 20 74 65 78 74 20 72 65 77 72 69 74 69 6e 67 20   text rewriting 
1ab0: 61 63 74 69 6f 6e 73 2e 0a 0a 4d 72 28 2e 20 5b  actions...Mr(. [
1ac0: 41 2d 5a 5d 5c 77 2b 29 20 3c 3c 2d 20 7e 31 3e  A-Z]\w+) <<- ~1>
1ad0: 3e 20 2a 0a 0a 59 6f 75 20 63 61 6e 20 61 6c 73  > *..You can als
1ae0: 6f 20 63 61 6c 6c 20 50 79 74 68 6f 6e 20 65 78  o call Python ex
1af0: 70 72 65 73 73 69 6f 6e 73 2e 0a 0a 5f 5f 5b 73  pressions...__[s
1b00: 5d 5f 5f 20 4d 72 2e 20 28 5b 61 2d 7a 5d 5c 77  ]__ Mr. ([a-z]\w
1b10: 2b 29 20 3c 3c 2d 20 7e 31 3e 3e 20 3d 5c 31 2e  +) <<- ~1>> =\1.
1b20: 75 70 70 65 72 28 29 0a 0a 0a 0a 23 20 44 69 73  upper()....# Dis
1b30: 61 6d 62 69 67 75 61 74 69 6f 6e 20 23 0a 0a 57  ambiguation #..W
1b40: 68 65 6e 20 47 72 61 6d 6d 61 6c 65 63 74 65 20  hen Grammalecte 
1b50: 61 6e 61 6c 79 73 65 73 20 61 20 77 6f 72 64 20  analyses a word 
1b60: 77 69 74 68 20 6d 6f 72 70 68 20 6f 72 20 6d 6f  with morph or mo
1b70: 72 70 68 65 78 2c 20 62 65 66 6f 72 65 20 72 65  rphex, before re
1b80: 71 75 65 73 74 69 6e 67 20 74 68 65 0a 50 4f 53  questing the.POS
1b90: 20 74 61 67 73 20 74 6f 20 74 68 65 20 64 69 63   tags to the dic
1ba0: 74 69 6f 6e 61 72 79 2c 20 69 74 20 63 68 65 63  tionary, it chec
1bb0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
1bc0: 20 73 74 6f 72 65 64 20 6d 61 72 6b 65 72 20 66   stored marker f
1bd0: 6f 72 20 74 68 65 0a 70 6f 73 69 74 69 6f 6e 20  or the.position 
1be0: 77 68 65 72 65 20 74 68 65 20 77 6f 72 64 20 69  where the word i
1bf0: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
1c00: 20 6d 61 72 6b 65 72 2c 20 47 72 61 6d 6d 61 6c   marker, Grammal
1c10: 65 63 74 65 20 75 73 65 73 20 74 68 65 20 73 74  ecte uses the st
1c20: 6f 72 65 64 0a 64 61 74 61 20 61 6e 64 20 64 6f  ored.data and do
1c30: 6e e2 80 99 74 20 6d 61 6b 65 20 72 65 71 75 65  n...t make reque
1c40: 73 74 20 74 6f 20 74 68 65 20 64 69 63 74 69 6f  st to the dictio
1c50: 6e 61 72 79 2e 0a 0a 54 68 65 20 64 69 73 61 6d  nary...The disam
1c60: 62 69 67 61 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64  bigation command
1c70: 73 20 73 74 6f 72 65 20 50 4f 53 20 74 61 67 73  s store POS tags
1c80: 20 61 74 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   at the position
1c90: 20 6f 66 20 61 20 77 6f 72 64 2e 0a 0a 54 68 65   of a word...The
1ca0: 72 65 20 69 73 20 33 20 63 6f 6d 6d 61 6e 64 73  re is 3 commands
1cb0: 20 66 6f 72 20 64 69 73 61 6d 62 69 67 61 74 69   for disambigati
1cc0: 6f 6e 2e 0a 2d 20 73 65 6c 65 63 74 28 6e 2c 20  on..- select(n, 
1cd0: 70 61 74 74 65 72 6e 29 0a 20 20 20 20 73 74 6f  pattern).    sto
1ce0: 72 65 73 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  res at position 
1cf0: 6e 20 6f 6e 6c 79 20 74 68 65 20 50 4f 53 20 74  n only the POS t
1d00: 61 67 73 20 6f 66 20 74 68 65 20 77 6f 72 64 20  ags of the word 
1d10: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 70 61 74  matching the pat
1d20: 74 65 72 6e 2e 0a 2d 20 65 78 63 6c 75 64 65 28  tern..- exclude(
1d30: 6e 2c 20 70 61 74 74 65 72 6e 29 0a 20 20 20 20  n, pattern).    
1d40: 73 74 6f 72 65 73 20 61 74 20 70 6f 73 69 74 69  stores at positi
1d50: 6f 6e 20 6e 20 74 68 65 20 50 4f 53 20 74 61 67  on n the POS tag
1d60: 73 20 6f 66 20 74 68 65 20 77 6f 72 64 2c 20 65  s of the word, e
1d70: 78 63 65 70 74 20 74 68 6f 73 65 20 6d 61 74 63  xcept those matc
1d80: 68 69 6e 67 20 74 68 65 0a 20 20 20 20 70 61 74  hing the.    pat
1d90: 74 65 72 6e 2e 0a 2d 20 64 65 66 69 6e 65 28 6e  tern..- define(n
1da0: 2c 20 64 65 66 69 6e 69 74 69 6f 6e 29 0a 20 20  , definition).  
1db0: 20 20 73 74 6f 72 65 73 20 61 74 20 70 6f 73 69    stores at posi
1dc0: 74 69 6f 6e 20 6e 20 74 68 65 20 50 4f 53 20 74  tion n the POS t
1dd0: 61 67 73 20 69 6e 20 64 65 66 69 6e 69 74 69 6f  ags in definitio
1de0: 6e 2e 0a 0a 45 78 61 6d 70 6c 65 73 2e 0a 20 20  n...Examples..  
1df0: 20 20 3d 3e 3e 20 73 65 6c 65 63 74 28 5c 31 2c    =>> select(\1,
1e00: 20 22 70 6f 3a 6e 6f 75 6e 20 69 73 3a 70 6c 22   "po:noun is:pl"
1e10: 29 0a 20 20 20 20 3d 3e 3e 20 65 78 63 6c 75 64  ).    =>> exclud
1e20: 65 28 5c 31 2c 20 22 70 6f 3a 76 65 72 62 22 29  e(\1, "po:verb")
1e30: 0a 20 20 20 20 3d 3e 3e 20 64 65 66 69 6e 65 28  .    =>> define(
1e40: 5c 31 2c 20 22 70 6f 3a 61 64 76 22 29 0a 20 20  \1, "po:adv").  
1e50: 20 20 3d 3e 3e 20 65 78 63 6c 75 64 65 28 5c 31    =>> exclude(\1
1e60: 2c 20 22 70 6f 3a 76 65 72 62 22 29 20 61 6e 64  , "po:verb") and
1e70: 20 64 65 66 69 6e 65 28 5c 32 2c 20 22 70 6f 3a   define(\2, "po:
1e80: 61 64 76 22 29 20 61 6e 64 20 73 65 6c 65 63 74  adv") and select
1e90: 28 5c 33 2c 20 22 70 6f 3a 61 64 76 22 29 0a 0a  (\3, "po:adv")..
1ea0: 4e 6f 74 65 3a 20 73 65 6c 65 63 74 2c 20 65 78  Note: select, ex
1eb0: 63 6c 75 64 65 20 61 6e 64 20 64 65 66 69 6e 65  clude and define
1ec0: 20 41 4c 57 41 59 53 20 72 65 74 75 72 6e 20 54   ALWAYS return T
1ed0: 72 75 65 2e 0a 0a 49 66 20 73 65 6c 65 63 74 20  rue...If select 
1ee0: 61 6e 64 20 65 78 63 6c 75 64 65 20 67 65 6e 65  and exclude gene
1ef0: 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 6c 69  rate an empty li
1f00: 73 74 2c 20 6e 6f 20 6d 61 72 6b 65 72 20 69 73  st, no marker is
1f10: 20 73 65 74 2e 0a 0a 57 69 74 68 20 64 65 66 69   set...With defi
1f20: 6e 65 2c 20 79 6f 75 20 63 61 6e 20 73 65 74 20  ne, you can set 
1f30: 61 20 6c 69 73 74 20 6f 66 20 50 4f 53 20 74 61  a list of POS ta
1f40: 67 73 2e 20 45 78 61 6d 70 6c 65 3a 0a 0a 64 65  gs. Example:..de
1f50: 66 69 6e 65 28 5c 31 2c 20 22 70 6f 3a 6e 6f 6d  fine(\1, "po:nom
1f60: 20 69 73 3a 70 6c 75 72 7c 70 6f 3a 61 64 6a 20   is:plur|po:adj 
1f70: 69 73 3a 73 69 6e 67 7c 70 6f 3a 61 64 76 22 29  is:sing|po:adv")
1f80: 0a 0a 54 68 69 73 20 77 69 6c 6c 20 73 74 6f 72  ..This will stor
1f90: 65 20 61 20 6c 69 73 74 20 6f 66 20 74 61 67 73  e a list of tags
1fa0: 20 61 74 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   at the position
1fb0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 67 72   of the first gr
1fc0: 6f 75 70 3a 0a 5b 22 70 6f 3a 6e 6f 6d 20 69 73  oup:.["po:nom is
1fd0: 3a 70 6c 75 72 22 2c 20 22 70 6f 3a 61 64 6a 20  :plur", "po:adj 
1fe0: 69 73 3a 73 69 6e 67 22 2c 20 22 70 6f 3a 61 64  is:sing", "po:ad
1ff0: 76 22 5d 0a 0a 0a 0a 23 20 43 6f 6e 64 69 74 69  v"]....# Conditi
2000: 6f 6e 73 20 23 0a 0a 43 6f 6e 64 69 74 69 6f 6e  ons #..Condition
2010: 73 20 61 72 65 20 50 79 74 68 6f 6e 20 65 78 70  s are Python exp
2020: 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 79 20 6d  ressions, they m
2030: 75 73 74 20 72 65 74 75 72 6e 20 61 20 76 61 6c  ust return a val
2040: 75 65 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62  ue, which will b
2050: 65 0a 65 76 61 6c 75 61 74 65 64 20 61 73 20 62  e.evaluated as b
2060: 6f 6f 6c 65 61 6e 2e 20 59 6f 75 20 63 61 6e 20  oolean. You can 
2070: 75 73 65 20 74 68 65 20 75 73 75 61 6c 20 50 79  use the usual Py
2080: 74 68 6f 6e 20 73 79 6e 74 61 78 20 61 6e 64 20  thon syntax and 
2090: 6c 69 62 72 61 72 69 65 73 2e 0a 0a 59 6f 75 20  libraries...You 
20a0: 63 61 6e 20 63 61 6c 6c 20 70 61 74 74 65 72 6e  can call pattern
20b0: 20 73 75 62 67 72 6f 75 70 73 20 76 69 61 20 5c   subgroups via \
20c0: 30 2c 20 5c 31 2c 20 5c 32 e2 80 a6 0a 0a 45 78  0, \1, \2.....Ex
20d0: 61 6d 70 6c 65 3a 0a 20 20 20 20 0a 20 20 20 20  ample:.    .    
20e0: 74 68 65 73 65 20 28 5c 77 2b 29 0a 20 20 20 20  these (\w+).    
20f0: 20 20 20 20 3c 3c 2d 20 5c 31 20 3d 3d 20 22 6d      <<- \1 == "m
2100: 61 6e 22 20 2d 31 3e 3e 20 6d 65 6e 20 20 20 20  an" -1>> men    
2110: 20 20 20 20 23 20 4d 61 6e 20 69 73 20 61 20 73      # Man is a s
2120: 69 6e 67 75 6c 61 72 20 6e 6f 75 6e 2e 20 55 73  ingular noun. Us
2130: 65 20 74 68 65 20 70 6c 75 72 61 6c 20 66 6f 72  e the plural for
2140: 6d 3a 0a 0a 59 6f 75 20 63 61 6e 20 61 6c 73 6f  m:..You can also
2150: 20 61 70 70 6c 79 20 66 75 6e 63 74 69 6f 6e 73   apply functions
2160: 20 74 6f 20 73 75 62 67 72 6f 75 70 73 20 6c 69   to subgroups li
2170: 6b 65 3a 0a 20 20 20 20 5c 31 2e 73 74 61 72 74  ke:.    \1.start
2180: 73 77 69 74 68 28 22 61 22 29 0a 20 20 20 20 5c  swith("a").    \
2190: 33 2e 69 73 6c 6f 77 65 72 28 29 0a 20 20 20 20  3.islower().    
21a0: 72 65 2e 6d 61 74 63 68 28 22 70 61 74 74 65 72  re.match("patter
21b0: 6e 22 2c 20 5c 32 29 0a 20 20 20 20 e2 80 a6 0a  n", \2).    ....
21c0: 0a 0a 23 23 20 53 74 61 6e 64 61 72 64 20 66 75  ..## Standard fu
21d0: 6e 63 74 69 6f 6e 73 20 23 23 0a 0a 77 6f 72 64  nctions ##..word
21e0: 28 6e 29 0a 20 20 20 20 63 61 74 63 68 65 73 20  (n).    catches 
21f0: 74 68 65 20 6e 74 68 20 6e 65 78 74 20 77 6f 72  the nth next wor
2200: 64 20 61 66 74 65 72 20 74 68 65 20 70 61 74 74  d after the patt
2210: 65 72 6e 20 28 73 65 70 61 72 61 74 65 64 20 6f  ern (separated o
2220: 6e 6c 79 20 62 79 20 77 68 69 74 65 20 73 70 61  nly by white spa
2230: 63 65 73 29 2e 0a 20 20 20 20 72 65 74 75 72 6e  ces)..    return
2240: 73 20 4e 6f 6e 65 20 69 66 20 6e 6f 20 77 6f 72  s None if no wor
2250: 64 20 63 61 74 63 68 65 64 0a 0a 77 6f 72 64 28  d catched..word(
2260: 2d 6e 29 0a 20 20 20 20 63 61 74 63 68 65 73 20  -n).    catches 
2270: 74 68 65 20 6e 74 68 20 6e 65 78 74 20 77 6f 72  the nth next wor
2280: 64 20 62 65 66 6f 72 65 20 74 68 65 20 70 61 74  d before the pat
2290: 74 65 72 6e 20 28 73 65 70 61 72 61 74 65 64 20  tern (separated 
22a0: 6f 6e 6c 79 20 62 79 20 77 68 69 74 65 20 73 70  only by white sp
22b0: 61 63 65 73 29 2e 0a 20 20 20 20 72 65 74 75 72  aces)..    retur
22c0: 6e 73 20 4e 6f 6e 65 20 69 66 20 6e 6f 20 77 6f  ns None if no wo
22d0: 72 64 20 63 61 74 63 68 65 64 0a 0a 61 66 74 65  rd catched..afte
22e0: 72 28 72 65 67 65 78 5b 2c 20 6e 65 67 5f 72 65  r(regex[, neg_re
22f0: 67 65 78 5d 29 0a 20 20 20 20 63 68 65 63 6b 73  gex]).    checks
2300: 20 69 66 20 74 68 65 20 74 65 78 74 20 61 66 74   if the text aft
2310: 65 72 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d  er the pattern m
2320: 61 74 63 68 65 73 20 74 68 65 20 72 65 67 65 78  atches the regex
2330: 2e 0a 0a 62 65 66 6f 72 65 28 72 65 67 65 78 5b  ...before(regex[
2340: 2c 20 6e 65 67 5f 72 65 67 65 78 5d 29 0a 20 20  , neg_regex]).  
2350: 20 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20    checks if the 
2360: 74 65 78 74 20 62 65 66 6f 72 65 20 74 68 65 20  text before the 
2370: 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65 73 20  pattern matches 
2380: 74 68 65 20 72 65 67 65 78 2e 0a 0a 74 65 78 74  the regex...text
2390: 61 72 65 61 28 72 65 67 65 78 5b 2c 20 6e 65 67  area(regex[, neg
23a0: 5f 72 65 67 65 78 5d 29 0a 20 20 20 20 63 68 65  _regex]).    che
23b0: 63 6b 73 20 69 66 20 74 68 65 20 66 75 6c 6c 20  cks if the full 
23c0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 68 65 63  text of the chec
23d0: 6b 65 64 20 61 72 65 61 20 28 70 61 72 61 67 72  ked area (paragr
23e0: 61 70 68 20 6f 72 20 73 65 6e 74 65 6e 63 65 29  aph or sentence)
23f0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 65 67   matches the reg
2400: 65 78 2e 0a 0a 6d 6f 72 70 68 28 6e 2c 20 72 65  ex...morph(n, re
2410: 67 65 78 5b 2c 20 73 74 72 69 63 74 3d 54 72 75  gex[, strict=Tru
2420: 65 5d 5b 2c 20 6e 6f 77 6f 72 64 3d 46 61 6c 73  e][, noword=Fals
2430: 65 5d 29 0a 20 20 20 20 63 68 65 63 6b 73 20 69  e]).    checks i
2440: 66 20 61 6c 6c 20 74 61 67 73 20 6f 66 20 74 68  f all tags of th
2450: 65 20 77 6f 72 64 20 69 6e 20 67 72 6f 75 70 20  e word in group 
2460: 6e 20 6d 61 74 63 68 20 74 68 65 20 72 65 67 65  n match the rege
2470: 78 2e 0a 20 20 20 20 69 66 20 73 74 72 69 63 74  x..    if strict
2480: 20 3d 20 46 61 6c 73 65 2c 20 72 65 74 75 72 6e   = False, return
2490: 73 20 54 72 75 65 20 6f 6e 6c 79 20 69 66 20 6f  s True only if o
24a0: 6e 65 20 6f 66 20 74 61 67 73 20 6d 61 74 63 68  ne of tags match
24b0: 65 73 20 74 68 65 20 72 65 67 65 78 2e 0a 20 20  es the regex..  
24c0: 20 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f    if there is no
24d0: 20 77 6f 72 64 20 61 74 20 70 6f 73 69 74 69 6f   word at positio
24e0: 6e 20 6e 2c 20 72 65 74 75 72 6e 73 20 74 68 65  n n, returns the
24f0: 20 76 61 6c 75 65 20 6f 66 20 6e 6f 77 6f 72 64   value of noword
2500: 2e 0a 0a 6d 6f 72 70 68 65 78 28 6e 2c 20 72 65  ...morphex(n, re
2510: 67 65 78 2c 20 6e 65 67 5f 72 65 67 65 78 5b 2c  gex, neg_regex[,
2520: 20 6e 6f 77 6f 72 64 3d 46 61 6c 73 65 5d 29 0a   noword=False]).
2530: 20 20 20 20 63 68 65 63 6b 73 20 69 66 20 6f 6e      checks if on
2540: 65 20 6f 66 20 74 68 65 20 74 61 67 73 20 6f 66  e of the tags of
2550: 20 74 68 65 20 77 6f 72 64 20 69 6e 20 67 72 6f   the word in gro
2560: 75 70 20 6e 20 6d 61 74 63 68 20 74 68 65 20 72  up n match the r
2570: 65 67 65 78 20 61 6e 64 0a 20 20 20 20 20 20 20  egex and.       
2580: 20 20 20 20 69 66 20 6e 6f 20 74 61 67 73 20 6d      if no tags m
2590: 61 74 63 68 65 73 20 74 68 65 20 6e 65 67 5f 72  atches the neg_r
25a0: 65 67 65 78 2e 0a 20 20 20 20 69 66 20 74 68 65  egex..    if the
25b0: 72 65 20 69 73 20 6e 6f 20 77 6f 72 64 20 61 74  re is no word at
25c0: 20 70 6f 73 69 74 69 6f 6e 20 6e 2c 20 72 65 74   position n, ret
25d0: 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
25e0: 66 20 6e 6f 77 6f 72 64 2e 0a 0a 6f 70 74 69 6f  f noword...optio
25f0: 6e 28 6f 70 74 69 6f 6e 5f 6e 61 6d 65 29 0a 20  n(option_name). 
2600: 20 20 20 72 65 74 75 72 6e 73 20 54 72 75 65 20     returns True 
2610: 69 66 20 6f 70 74 69 6f 6e 5f 6e 61 6d 65 20 69  if option_name i
2620: 73 20 61 63 74 69 76 61 74 65 64 20 65 6c 73 65  s activated else
2630: 20 46 61 6c 73 65 0a 0a 4e 6f 74 65 3a 20 74 68   False..Note: th
2640: 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 64 6f  e analysis is do
2650: 6e 65 20 6f 6e 20 74 68 65 20 70 72 65 70 72 6f  ne on the prepro
2660: 63 65 73 73 65 64 20 74 65 78 74 2e 0a 0a 0a 23  cessed text....#
2670: 23 20 44 65 66 61 75 6c 74 20 76 61 72 69 61 62  # Default variab
2680: 6c 65 73 20 23 23 0a 0a 73 43 6f 75 6e 74 72 79  les ##..sCountry
2690: 0a 0a 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  ..It contains th
26a0: 65 20 63 75 72 72 65 6e 74 20 63 6f 75 6e 74 72  e current countr
26b0: 79 20 6c 6f 63 61 6c 65 20 6f 66 20 74 68 65 20  y locale of the 
26c0: 63 68 65 63 6b 65 64 20 70 61 72 61 67 72 61 70  checked paragrap
26d0: 68 2e 0a 0a 63 6f 6c 6f 75 72 20 3c 3c 2d 20 73  h...colour <<- s
26e0: 43 6f 75 6e 74 72 79 20 3d 3d 20 22 55 53 22 20  Country == "US" 
26f0: 2d 3e 3e 20 63 6f 6c 6f 72 20 23 20 55 73 65 20  ->> color # Use 
2700: 41 6d 65 72 69 63 61 6e 20 45 6e 67 6c 69 73 68  American English
2710: 20 73 70 65 6c 6c 69 6e 67 2e 0a 0a 0a 0a 23 20   spelling.....# 
2720: 45 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  Expressions in t
2730: 68 65 20 73 75 67 67 65 73 74 69 6f 6e 73 20 23  he suggestions #
2740: 0a 0a 53 75 67 67 65 73 74 69 6f 6e 73 20 28 61  ..Suggestions (a
2750: 6e 64 20 77 61 72 6e 69 6e 67 20 6d 65 73 73 61  nd warning messa
2760: 67 65 73 29 20 73 74 61 72 74 65 64 20 62 79 20  ges) started by 
2770: 61 6e 20 65 71 75 61 6c 20 73 69 67 6e 20 61 72  an equal sign ar
2780: 65 20 50 79 74 68 6f 6e 20 73 74 72 69 6e 67 20  e Python string 
2790: 65 78 70 72 65 73 73 69 6f 6e 73 0a 65 78 74 65  expressions.exte
27a0: 6e 64 65 64 20 77 69 74 68 20 70 6f 73 73 69 62  nded with possib
27b0: 6c 65 20 62 61 63 6b 20 72 65 66 65 72 65 6e 63  le back referenc
27c0: 65 73 20 61 6e 64 20 6e 61 6d 65 64 20 64 65 66  es and named def
27d0: 69 6e 69 74 69 6f 6e 73 3a 0a 0a 45 78 61 6d 70  initions:..Examp
27e0: 6c 65 3a 0a 0a 66 6f 6f 5c 77 2b 20 2d 3e 3e 20  le:..foo\w+ ->> 
27f0: 3d 20 27 22 27 20 2b 20 5c 30 2e 75 70 70 65 72  = '"' + \0.upper
2800: 28 29 20 2b 20 27 22 27 20 23 20 57 69 74 68 20  () + '"' # With 
2810: 75 70 70 65 72 63 61 73 65 20 6c 65 74 74 65 72  uppercase letter
2820: 73 20 61 6e 64 20 71 75 6f 61 74 69 6f 6e 20 6d  s and quoation m
2830: 61 72 6b 73 0a 0a 41 6c 6c 20 77 6f 72 64 73 20  arks..All words 
2840: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 22  beginning with "
2850: 66 6f 6f 22 20 77 69 6c 6c 20 62 65 20 72 65 63  foo" will be rec
2860: 6f 67 6e 69 7a 65 64 2c 20 61 6e 64 20 74 68 65  ognized, and the
2870: 20 73 75 67 67 65 73 74 69 6f 6e 20 69 73 0a 74   suggestion is.t
2880: 68 65 20 75 70 70 65 72 63 61 73 65 20 66 6f 72  he uppercase for
2890: 6d 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  m of the string 
28a0: 77 69 74 68 20 41 53 43 49 49 20 71 75 6f 61 74  with ASCII quoat
28b0: 69 6f 6e 20 6d 61 72 6b 73 3a 20 65 67 2e 20 66  ion marks: eg. f
28c0: 6f 6f 6d 20 2d 3e 3e 20 22 46 4f 4f 4d 22 2e 0a  oom ->> "FOOM"..
28d0: 0a 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ....////////////
28e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28f0: 2f 2f 2f 2f 20 4f 4c 44 20 2f 2f 2f 2f 2f 2f 2f  //// OLD ///////
2900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2920: 0a 0a 3d 20 54 65 78 74 20 70 72 65 70 72 6f 63  ..= Text preproc
2930: 65 73 73 69 6e 67 20 61 6e 64 20 6d 75 6c 74 69  essing and multi
2940: 2d 70 61 73 73 65 73 20 63 68 65 63 6b 69 6e 67  -passes checking
2950: 20 3d 0a 0a 4f 6e 20 65 61 63 68 20 70 61 73 73   =..On each pass
2960: 2c 20 4c 69 67 68 74 70 72 6f 6f 66 20 75 73 65  , Lightproof use
2970: 73 20 72 75 6c 65 73 20 77 72 69 74 74 65 6e 20  s rules written 
2980: 69 6e 20 74 68 65 20 74 65 78 74 20 70 72 65 70  in the text prep
2990: 72 6f 63 65 73 73 6f 72 20 74 6f 20 6d 6f 64 69  rocessor to modi
29a0: 66 79 0a 69 6e 74 65 72 6e 61 6c 6c 79 20 74 68  fy.internally th
29b0: 65 20 74 65 78 74 20 62 65 66 6f 72 65 20 63 68  e text before ch
29c0: 65 63 6b 69 6e 67 20 74 68 65 20 74 65 78 74 2e  ecking the text.
29d0: 0a 0a 54 68 65 20 74 65 78 74 20 70 72 65 70 72  ..The text prepr
29e0: 6f 63 65 73 73 6f 72 20 69 73 20 75 73 65 66 75  ocessor is usefu
29f0: 6c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 74 65  l to simplify te
2a00: 78 74 73 20 61 6e 64 20 77 72 69 74 65 20 73 69  xts and write si
2a10: 6d 70 6c 69 65 72 20 63 68 65 63 6b 69 6e 67 0a  mplier checking.
2a20: 72 75 6c 65 73 2e 0a 0a 46 6f 72 20 65 78 61 6d  rules...For exam
2a30: 70 6c 65 2c 20 73 65 6e 74 65 6e 63 65 73 20 77  ple, sentences w
2a40: 69 74 68 20 74 68 65 20 73 61 6d 65 20 67 72 61  ith the same gra
2a50: 6d 6d 61 72 20 6d 69 73 74 61 6b 65 3a 0a 54 68  mmar mistake:.Th
2a60: 65 73 65 20 e2 80 9c 63 61 74 73 e2 80 9d 20 61  ese ...cats... a
2a70: 72 65 20 62 6c 61 63 6b 73 2e 0a 54 68 65 73 65  re blacks..These
2a80: 20 63 61 74 73 20 61 72 65 20 e2 80 9c 62 6c 61   cats are ...bla
2a90: 63 6b 73 e2 80 9d 2e 0a 54 68 65 73 65 20 63 61  cks.....These ca
2aa0: 74 73 20 61 72 65 20 61 62 73 6f 6c 75 74 65 6c  ts are absolutel
2ab0: 79 20 62 6c 61 63 6b 73 2e 0a 54 68 65 73 65 20  y blacks..These 
2ac0: 73 74 75 70 69 64 20 e2 80 9c 63 61 74 73 e2 80  stupid ...cats..
2ad0: 9d 20 61 72 65 20 61 6c 6c 20 62 6c 61 63 6b 73  . are all blacks
2ae0: 2e 0a 54 68 65 73 65 20 75 6e 6b 6e 6f 77 6e 20  ..These unknown 
2af0: 63 61 74 73 20 61 72 65 20 61 73 20 70 65 72 20  cats are as per 
2b00: 75 73 75 61 6c 20 62 6c 61 63 6b 73 2e 0a 0a 49  usual blacks...I
2b10: 6e 73 74 65 61 64 20 6f 66 20 77 72 69 74 74 69  nstead of writti
2b20: 6e 67 20 63 6f 6d 70 6c 65 78 20 72 75 6c 65 73  ng complex rules
2b30: 20 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6c 65   or several rule
2b40: 73 20 74 6f 20 66 69 6e 64 20 6d 69 73 74 61 6b  s to find mistak
2b50: 65 73 20 66 6f 72 20 61 6c 6c 20 70 6f 73 73 69  es for all possi
2b60: 62 6c 65 0a 63 61 73 65 73 2c 20 79 6f 75 20 63  ble.cases, you c
2b70: 61 6e 20 75 73 65 20 74 68 65 20 74 65 78 74 20  an use the text 
2b80: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 74 6f 20  preprocessor to 
2b90: 73 69 6d 70 6c 69 66 79 20 74 68 65 20 74 65 78  simplify the tex
2ba0: 74 2e 0a 0a 54 6f 20 72 65 6d 6f 76 65 20 74 68  t...To remove th
2bb0: 65 20 63 68 61 72 73 20 e2 80 9c e2 80 9d 2c 20  e chars ......, 
2bc0: 77 72 69 74 65 3a 0a 5b e2 80 9c e2 80 9d 5d 20  write:.[......] 
2bd0: 2d 3e 3e 20 2a 0a 0a 54 68 65 20 2a 20 6d 65 61  ->> *..The * mea
2be0: 6e 73 3a 20 72 65 70 6c 61 63 65 20 74 65 78 74  ns: replace text
2bf0: 20 62 79 20 77 68 69 74 65 73 70 61 63 65 73 2e   by whitespaces.
2c00: 0a 61 73 20 70 65 72 20 75 73 75 61 6c 20 2d 3e  .as per usual ->
2c10: 3e 20 2a 0a 0a 53 69 6d 69 6c 61 72 6c 79 20 74  > *..Similarly t
2c20: 6f 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 2c  o grammar rules,
2c30: 20 79 6f 75 20 63 61 6e 20 61 64 64 20 63 6f 6e   you can add con
2c40: 64 69 74 69 6f 6e 73 3a 0a 5c 77 2b 6c 79 20 3c  ditions:.\w+ly <
2c50: 3c 2d 20 6d 6f 72 70 68 28 5c 30 2c 20 22 61 64  <- morph(\0, "ad
2c60: 76 65 72 62 22 29 20 2d 3e 3e 20 2a 0a 0a 59 6f  verb") ->> *..Yo
2c70: 75 20 63 61 6e 20 61 6c 73 6f 20 72 65 6d 6f 76  u can also remov
2c80: 65 20 61 20 67 72 6f 75 70 20 72 65 66 65 72 65  e a group refere
2c90: 6e 63 65 3a 0a 74 68 65 73 65 20 28 5c 77 2b 29  nce:.these (\w+)
2ca0: 20 28 5c 77 2b 29 20 3c 3c 2d 20 6d 6f 72 70 68   (\w+) <<- morph
2cb0: 28 5c 31 2c 20 22 61 64 6a 65 63 74 69 76 65 22  (\1, "adjective"
2cc0: 29 20 61 6e 64 20 6d 6f 72 70 68 28 5c 32 2c 20  ) and morph(\2, 
2cd0: 22 6e 6f 75 6e 22 29 20 2d 31 3e 3e 20 2a 0a 28  "noun") -1>> *.(
2ce0: 61 6d 7c 61 72 65 7c 69 73 7c 77 65 72 65 7c 77  am|are|is|were|w
2cf0: 61 73 29 20 28 61 6c 6c 29 20 2d 32 3e 3e 20 2a  as) (all) -2>> *
2d00: 0a 0a 57 69 74 68 20 74 68 65 73 65 20 72 75 6c  ..With these rul
2d10: 65 73 2c 20 79 6f 75 20 67 65 74 20 74 68 65 20  es, you get the 
2d20: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 6e 74 65 6e  following senten
2d30: 63 65 73 3a 0a 54 68 65 73 65 20 20 63 61 74 73  ces:.These  cats
2d40: 20 20 61 72 65 20 62 6c 61 63 6b 73 2e 0a 54 68    are blacks..Th
2d50: 65 73 65 20 63 61 74 73 20 61 72 65 20 20 62 6c  ese cats are  bl
2d60: 61 63 6b 73 20 2e 0a 54 68 65 73 65 20 63 61 74  acks ..These cat
2d70: 73 20 61 72 65 20 20 20 20 20 20 20 20 20 20 20  s are           
2d80: 20 62 6c 61 63 6b 73 2e 0a 54 68 65 73 65 20 20   blacks..These  
2d90: 20 20 20 20 20 20 20 63 61 74 73 20 20 61 72 65         cats  are
2da0: 20 20 20 20 20 62 6c 61 63 6b 73 2e 0a 54 68 65       blacks..The
2db0: 73 65 20 20 20 20 20 20 20 20 20 63 61 74 73 20  se         cats 
2dc0: 61 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  are             
2dd0: 20 62 6c 61 63 6b 73 2e 0a 0a 54 68 65 73 65 20   blacks...These 
2de0: 67 72 61 6d 6d 61 72 20 6d 69 73 74 61 6b 65 73  grammar mistakes
2df0: 20 63 61 6e 20 62 65 20 64 65 74 65 63 74 65 64   can be detected
2e00: 20 77 69 74 68 20 6f 6e 65 20 73 69 6d 70 6c 65   with one simple
2e10: 20 72 75 6c 65 3a 0a 0a 74 68 65 73 65 20 2b 28   rule:..these +(
2e20: 5c 77 2b 29 20 2b 61 72 65 20 2b 28 5c 77 2b 73  \w+) +are +(\w+s
2e30: 29 0a 09 3c 3c 2d 20 6d 6f 72 70 68 28 5c 31 2c  )..<<- morph(\1,
2e40: 20 22 6e 6f 75 6e 22 29 20 61 6e 64 20 6d 6f 72   "noun") and mor
2e50: 70 68 28 5c 32 2c 20 22 70 6c 75 72 61 6c 22 29  ph(\2, "plural")
2e60: 0a 09 2d 32 3e 3e 20 5f 20 23 20 41 64 6a 65 63  ..-2>> _ # Adjec
2e70: 74 69 76 65 73 20 61 72 65 20 69 6e 76 61 72 69  tives are invari
2e80: 61 62 6c 65 2e 0a 0a 49 6e 73 74 65 61 64 20 6f  able...Instead o
2e90: 66 20 72 65 70 6c 61 63 69 6e 67 20 74 65 78 74  f replacing text
2ea0: 20 77 69 74 68 20 77 68 69 74 65 73 70 61 63 65   with whitespace
2eb0: 73 2c 20 79 6f 75 20 63 61 6e 20 72 65 70 6c 61  s, you can repla
2ec0: 63 65 20 74 65 78 74 20 77 69 74 68 20 40 2e 0a  ce text with @..
2ed0: 0a 68 74 74 70 73 3f 3a 2f 2f 5c 53 2b 20 2d 3e  .https?://\S+ ->
2ee0: 3e 20 40 0a 0a 54 68 69 73 20 69 73 20 75 73 65  > @..This is use
2ef0: 66 75 6c 20 69 66 20 61 74 20 66 69 72 73 74 20  ful if at first 
2f00: 70 61 73 73 20 79 6f 75 20 77 72 69 74 65 20 72  pass you write r
2f10: 75 6c 65 73 20 74 6f 20 63 68 65 63 6b 20 73 75  ules to check su
2f20: 63 63 65 73 73 69 76 65 20 77 68 69 74 65 73 70  ccessive whitesp
2f30: 61 63 65 73 2e 0a 40 20 61 72 65 20 61 75 74 6f  aces..@ are auto
2f40: 6d 61 74 69 63 61 6c 6c 79 20 72 65 6d 6f 76 65  matically remove
2f50: 64 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  d at the second 
2f60: 70 61 73 73 2e 0a 0a 59 6f 75 20 63 61 6e 20 61  pass...You can a
2f70: 6c 73 6f 20 72 65 70 6c 61 63 65 20 61 6e 79 20  lso replace any 
2f80: 74 65 78 74 20 61 73 20 79 6f 75 20 77 69 73 68  text as you wish
2f90: 2e 0a 0a 4d 69 73 74 65 72 20 2d 3e 3e 20 4d 72  ...Mister ->> Mr
2fa0: 0a 28 4d 72 73 3f 29 5b 2e 5d 20 2d 3e 3e 20 5c  .(Mrs?)[.] ->> \
2fb0: 31 0a 0a 0a 0a 57 69 74 68 20 74 68 65 20 6d 75  1....With the mu
2fc0: 6c 74 69 2d 70 61 73 73 65 73 20 63 68 65 63 6b  lti-passes check
2fd0: 69 6e 67 20 61 6e 64 20 74 68 65 20 74 65 78 74  ing and the text
2fe0: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 2c 20 69   preprocessor, i
2ff0: 74 20 69 73 20 61 64 76 69 73 65 64 20 74 6f 0a  t is advised to.
3000: 72 65 6d 6f 76 65 20 6f 72 20 73 69 6d 70 6c 69  remove or simpli
3010: 66 79 20 74 68 65 20 74 65 78 74 20 77 68 69 63  fy the text whic
3020: 68 20 68 61 73 20 62 65 65 6e 20 63 68 65 63 6b  h has been check
3030: 65 64 20 6f 6e 20 74 68 65 20 70 72 65 76 69 6f  ed on the previo
3040: 75 73 20 70 61 73 73 2e 0a 0a 0a 0a 3d 20 54 79  us pass.....= Ty
3050: 70 69 63 61 6c 20 70 72 6f 62 6c 65 6d 73 20 3d  pical problems =
3060: 0a 0a 0a 0a 3d 3d 20 50 61 74 74 65 72 6e 20 6d  ....== Pattern m
3070: 61 74 63 68 69 6e 67 20 3d 3d 0a 0a 52 65 70 65  atching ==..Repe
3080: 61 74 69 6e 67 20 70 61 74 74 65 72 6e 20 6d 61  ating pattern ma
3090: 74 63 68 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  tching of a sing
30a0: 6c 65 20 72 75 6c 65 20 63 6f 6e 74 69 6e 75 65  le rule continue
30b0: 73 20 61 66 74 65 72 20 74 68 65 20 70 72 65 76  s after the prev
30c0: 69 6f 75 73 20 6d 61 74 63 68 69 6e 67 2c 20 73  ious matching, s
30d0: 6f 0a 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e  o.instead of gen
30e0: 65 72 61 6c 20 6d 75 6c 74 69 77 6f 72 64 20 70  eral multiword p
30f0: 61 74 74 65 72 6e 73 2c 20 6c 69 6b 65 0a 0a 28  atterns, like..(
3100: 5c 77 2b 29 20 28 5c 77 2b 29 20 3c 3c 2d 20 73  \w+) (\w+) <<- s
3110: 6f 6d 65 5f 63 68 65 63 6b 28 5c 31 2c 20 5c 32  ome_check(\1, \2
3120: 29 20 2d 3e 3e 20 5c 31 2c 20 5c 32 20 23 20 66  ) ->> \1, \2 # f
3130: 6f 6f 0a 0a 75 73 65 0a 0a 28 5c 77 2b 29 20 3c  oo..use..(\w+) <
3140: 3c 2d 20 73 6f 6d 65 5f 63 68 65 63 6b 28 5c 31  <- some_check(\1
3150: 2c 20 77 6f 72 64 28 31 29 29 20 2d 3e 3e 20 5c  , word(1)) ->> \
3160: 31 2c 20 23 20 66 6f 6f 0a 0a                    1, # foo..