Grammalecte  Hex Artifact Content

Artifact c2a94b6c6f9d6d25a75a7c6c67aedc1b38e3a541021735e97130b7baf439e12b:


0000: 23 20 57 72 69 74 69 6e 67 20 72 75 6c 65 73 20  # Writing rules 
0010: 66 6f 72 20 47 72 61 6d 6d 61 6c 65 63 74 65 0a  for Grammalecte.
0020: 0a 4e 6f 74 65 3a 20 54 68 69 73 20 64 6f 63 75  .Note: This docu
0030: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 5f  mentation is a _
0040: 5f 64 72 61 66 74 5f 5f 2e 20 49 6e 66 6f 72 6d  _draft__. Inform
0050: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6f 62 73  ation may be obs
0060: 6f 6c 65 74 65 20 6f 72 20 69 6e 63 6f 6d 70 6c  olete or incompl
0070: 65 74 65 2e 0a 0a 0a 23 23 20 46 69 6c 65 73 20  ete....## Files 
0080: 72 65 71 75 69 72 65 64 0a 0a 54 68 65 20 72 75  required..The ru
0090: 6c 65 73 20 66 69 6c 65 20 66 6f 72 20 79 6f 75  les file for you
00a0: 72 20 6c 61 6e 67 75 61 67 65 20 6d 75 73 74 20  r language must 
00b0: 62 65 20 6e 61 6d 65 64 20 60 72 75 6c 65 73 2e  be named `rules.
00c0: 67 72 78 60 20 69 6e 20 74 68 65 20 66 6f 6c 64  grx` in the fold
00d0: 65 72 20 60 67 63 5f 6c 61 6e 67 2f 3c 6c 61 6e  er `gc_lang/<lan
00e0: 67 3e 2f 60 2e 0a 54 68 65 20 73 65 74 74 69 6e  g>/`..The settin
00f0: 67 73 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  gs file must be 
0100: 6e 61 6d 65 64 20 60 63 6f 6e 66 69 67 2e 69 6e  named `config.in
0110: 69 60 2e 0a 0a 54 68 65 73 65 20 66 69 6c 65 73  i`...These files
0120: 20 61 72 65 20 73 69 6d 70 6c 65 20 55 54 46 2d   are simple UTF-
0130: 38 20 74 65 78 74 20 66 69 6c 65 73 2e 0a 0a 0a  8 text files....
0140: 23 23 20 50 72 69 6e 63 69 70 6c 65 73 0a 0a 47  ## Principles..G
0150: 72 61 6d 6d 61 6c 65 63 74 65 20 69 73 20 61 20  rammalecte is a 
0160: 62 69 2d 70 61 73 73 65 73 20 67 72 61 6d 6d 61  bi-passes gramma
0170: 72 20 63 68 65 63 6b 65 72 20 65 6e 67 69 6e 65  r checker engine
0180: 2e 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70  . On the first p
0190: 61 73 73 2c 20 74 68 65 0a 65 6e 67 69 6e 65 20  ass, the.engine 
01a0: 63 68 65 63 6b 73 20 74 68 65 20 74 65 78 74 20  checks the text 
01b0: 70 61 72 61 67 72 61 70 68 20 62 79 20 70 61 72  paragraph by par
01c0: 61 67 72 61 70 68 2e 20 4f 6e 20 74 68 65 20 73  agraph. On the s
01d0: 65 63 6f 6e 64 20 70 61 73 73 2c 20 74 68 65 20  econd pass, the 
01e0: 65 6e 67 69 6e 65 0a 63 68 65 63 6b 20 74 68 65  engine.check the
01f0: 20 74 65 78 74 20 73 65 6e 74 65 6e 63 65 20 62   text sentence b
0200: 79 20 73 65 6e 74 65 6e 63 65 2e 0a 0a 59 6f 75  y sentence...You
0210: 20 6d 61 79 20 61 6c 74 65 72 20 68 6f 77 20 73   may alter how s
0220: 65 6e 74 65 6e 63 65 73 20 61 72 65 20 73 70 6c  entences are spl
0230: 69 74 20 62 79 20 72 65 6d 6f 76 69 6e 67 20 70  it by removing p
0240: 75 6e 63 74 75 61 74 69 6f 6e 20 6d 61 72 6b 73  unctuation marks
0250: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
0260: 74 20 70 61 73 73 2e 0a 0a 54 68 65 20 63 6f 6d  t pass...The com
0270: 6d 61 6e 64 20 74 6f 20 73 77 69 74 63 68 20 74  mand to switch t
0280: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73  o the second pas
0290: 73 20 69 73 20 60 5b 2b 2b 5d 60 2e 0a 0a 49 6e  s is `[++]`...In
02a0: 20 65 61 63 68 20 70 61 73 73 2c 20 79 6f 75 20   each pass, you 
02b0: 63 61 6e 20 77 72 69 74 65 20 61 73 20 6d 61 6e  can write as man
02c0: 79 20 72 75 6c 65 73 20 61 73 20 79 6f 75 20 6e  y rules as you n
02d0: 65 65 64 2e 0a 0a 54 68 65 72 65 20 61 72 65 20  eed...There are 
02e0: 74 77 6f 20 6b 69 6e 64 73 20 6f 66 20 72 75 6c  two kinds of rul
02f0: 65 73 3a 0a 0a 2a 20 72 65 67 65 78 20 72 75 6c  es:..* regex rul
0300: 65 73 20 28 74 72 69 67 67 65 72 65 64 20 62 79  es (triggered by
0310: 20 61 20 72 65 67 75 6c 61 72 20 65 78 70 72 65   a regular expre
0320: 73 73 69 6f 6e 29 0a 2a 20 74 6f 6b 65 6e 20 72  ssion).* token r
0330: 75 6c 65 73 20 28 74 72 69 67 67 65 72 65 64 20  ules (triggered 
0340: 62 79 20 61 20 73 75 63 63 65 73 73 69 6f 6e 20  by a succession 
0350: 6f 66 20 74 6f 6b 65 6e 73 29 0a 0a 41 20 72 65  of tokens)..A re
0360: 67 65 78 20 72 75 6c 65 20 69 73 20 64 65 66 69  gex rule is defi
0370: 6e 65 64 20 62 79 3a 0a 0a 2a 20 66 6c 61 67 73  ned by:..* flags
0380: 20 e2 80 9c 4c 43 52 e2 80 9d 20 66 6f 72 20 74   ...LCR... for t
0390: 68 65 20 72 65 67 65 78 20 77 6f 72 64 20 62 6f  he regex word bo
03a0: 75 6e 64 61 72 69 65 73 20 61 6e 64 20 63 61 73  undaries and cas
03b0: 65 20 73 65 6e 73 69 74 69 76 65 6e 65 73 73 0a  e sensitiveness.
03c0: 2a 20 5b 6f 70 74 69 6f 6e 61 6c 5d 20 6f 70 74  * [optional] opt
03d0: 69 6f 6e 20 6e 61 6d 65 20 28 74 68 65 20 72 75  ion name (the ru
03e0: 6c 65 20 69 73 20 61 63 74 69 76 65 20 6f 6e 6c  le is active onl
03f0: 79 20 69 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  y if the option 
0400: 64 65 66 69 6e 65 64 20 62 79 20 75 73 65 72 20  defined by user 
0410: 6f 72 20 63 6f 6e 66 69 67 20 69 73 20 61 63 74  or config is act
0420: 69 76 65 29 0a 2a 20 5b 6f 70 74 69 6f 6e 61 6c  ive).* [optional
0430: 5d 20 72 75 6c 65 20 6e 61 6d 65 20 28 6e 61 6d  ] rule name (nam
0440: 65 64 20 72 75 6c 65 73 20 63 61 6e 20 62 65 20  ed rules can be 
0450: 64 69 73 61 62 6c 65 64 20 62 79 20 75 73 65 72  disabled by user
0460: 20 6f 72 20 62 79 20 63 6f 6e 66 69 67 29 0a 2a   or by config).*
0470: 20 5b 6f 70 74 69 6f 6e 61 6c 5d 20 70 72 69 6f   [optional] prio
0480: 72 69 74 79 20 6e 75 6d 62 65 72 0a 2a 20 61 20  rity number.* a 
0490: 72 65 67 65 78 20 70 61 74 74 65 72 6e 20 74 72  regex pattern tr
04a0: 69 67 67 65 72 0a 2a 20 61 20 6c 69 73 74 20 6f  igger.* a list o
04b0: 66 20 61 63 74 69 6f 6e 73 0a 0a 41 20 74 6f 6b  f actions..A tok
04c0: 65 6e 20 72 75 6c 65 73 20 69 73 20 64 65 66 69  en rules is defi
04d0: 6e 65 64 20 62 79 3a 0a 0a 2a 20 72 75 6c 65 20  ned by:..* rule 
04e0: 6e 61 6d 65 0a 2a 20 5b 6f 70 74 69 6f 6e 61 6c  name.* [optional
04f0: 5d 20 70 72 69 6f 72 69 74 79 20 6e 75 6d 62 65  ] priority numbe
0500: 72 0a 2a 20 6f 6e 65 20 6f 72 20 73 65 76 65 72  r.* one or sever
0510: 61 6c 20 6c 69 73 74 73 20 6f 66 20 74 6f 6b 65  al lists of toke
0520: 6e 73 0a 2a 20 61 20 6c 69 73 74 20 6f 66 20 61  ns.* a list of a
0530: 63 74 69 6f 6e 73 20 28 74 68 65 20 61 63 74 69  ctions (the acti
0540: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 6f 6e 6c  on is active onl
0550: 79 20 69 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  y if the option 
0560: 64 65 66 69 6e 65 64 20 62 79 20 75 73 65 72 20  defined by user 
0570: 6f 72 20 63 6f 6e 66 69 67 20 69 73 20 61 63 74  or config is act
0580: 69 76 65 29 0a 0a 54 6f 6b 65 6e 20 72 75 6c 65  ive)..Token rule
0590: 73 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  s must be define
05a0: 64 20 77 69 74 68 69 6e 20 61 20 67 72 61 70 68  d within a graph
05b0: 2e 0a 0a 45 61 63 68 20 67 72 61 70 68 20 69 73  ...Each graph is
05c0: 20 64 65 66 69 6e 65 64 20 77 69 74 68 69 6e 20   defined within 
05d0: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20  the second pass 
05e0: 77 69 74 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64  with the command
05f0: 3a 0a 0a 20 20 20 20 20 20 20 20 40 40 40 40 47  :..        @@@@G
0600: 52 41 50 48 3a 20 67 72 61 70 68 5f 6e 61 6d 65  RAPH: graph_name
0610: 7c 67 72 61 70 68 5f 63 6f 64 65 0a 0a 41 20 67  |graph_code..A g
0620: 72 61 70 68 20 65 6e 64 73 20 77 68 65 6e 20 61  raph ends when a
0630: 6e 6f 74 68 65 72 20 67 72 61 70 68 20 69 73 20  nother graph is 
0640: 64 65 66 69 6e 65 64 20 6f 72 20 77 68 65 6e 20  defined or when 
0650: 69 73 20 66 6f 75 6e 64 20 74 68 65 20 63 6f 6d  is found the com
0660: 6d 61 6e 64 3a 0a 0a 20 20 20 20 20 20 20 20 40  mand:..        @
0670: 40 40 40 45 4e 44 5f 47 52 41 50 48 0a 0a 54 68  @@@END_GRAPH..Th
0680: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
0690: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
06a0: 20 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65   actions and the
06b0: 20 74 79 70 65 20 6f 66 20 61 63 74 69 6f 6e 73   type of actions
06c0: 20 61 20 72 75 6c 65 20 63 61 6e 0a 6c 61 75 6e   a rule can.laun
06d0: 63 68 2e 20 45 61 63 68 20 61 63 74 69 6f 6e 20  ch. Each action 
06e0: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 6f 6e 64  has its own cond
06f0: 69 74 69 6f 6e 20 74 6f 20 62 65 20 74 72 69 67  ition to be trig
0700: 67 65 72 65 64 2e 0a 0a 54 68 65 72 65 20 61 72  gered...There ar
0710: 65 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  e several kinds 
0720: 6f 66 20 61 63 74 69 6f 6e 73 3a 0a 0a 2a 20 45  of actions:..* E
0730: 72 72 6f 72 20 77 61 72 6e 69 6e 67 2c 20 77 69  rror warning, wi
0740: 74 68 20 61 20 6d 65 73 73 61 67 65 2c 20 61 6e  th a message, an
0750: 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 73 75 67  d optionally sug
0760: 67 65 73 74 69 6f 6e 73 2c 20 61 6e 64 20 6f 70  gestions, and op
0770: 74 69 6f 6e 61 6c 6c 79 20 61 20 55 52 4c 0a 2a  tionally a URL.*
0780: 20 54 65 78 74 20 74 72 61 6e 73 66 6f 72 6d 61   Text transforma
0790: 74 69 6f 6e 2c 20 6d 6f 64 69 66 79 69 6e 67 20  tion, modifying 
07a0: 69 6e 74 65 72 6e 61 6c 6c 79 20 74 68 65 20 63  internally the c
07b0: 68 65 63 6b 65 64 20 74 65 78 74 0a 2a 20 5b 73  hecked text.* [s
07c0: 65 63 6f 6e 64 20 70 61 73 73 20 6f 6e 6c 79 5d  econd pass only]
07d0: 20 44 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 20   Disambiguation 
07e0: 61 63 74 69 6f 6e 0a 2a 20 5b 73 65 63 6f 6e 64  action.* [second
07f0: 20 70 61 73 73 20 6f 6e 6c 79 5d 20 54 61 67 67   pass only] Tagg
0800: 69 6e 67 20 74 6f 6b 65 6e 0a 2a 20 5b 73 65 63  ing token.* [sec
0810: 6f 6e 64 20 70 61 73 73 20 6f 6e 6c 79 5d 20 49  ond pass only] I
0820: 6d 6d 75 6e 69 74 79 20 72 75 6c 65 73 0a 0a 0a  mmunity rules...
0830: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
0840: 73 2c 20 79 6f 75 20 63 61 6e 20 6f 6e 6c 79 20  s, you can only 
0850: 77 72 69 74 65 20 72 65 67 65 78 20 72 75 6c 65  write regex rule
0860: 73 2e 0a 4f 6e 20 74 68 65 20 73 65 63 6f 6e 64  s..On the second
0870: 20 70 61 73 73 2c 20 79 6f 75 20 63 61 6e 20 77   pass, you can w
0880: 72 69 74 65 20 72 65 67 65 78 20 72 75 6c 65 73  rite regex rules
0890: 20 61 6e 64 20 74 6f 6b 65 6e 20 72 75 6c 65 73   and token rules
08a0: 2e 20 41 6c 6c 20 74 6f 6b 65 6e 73 20 72 75 6c  . All tokens rul
08b0: 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  es must be writt
08c0: 65 6e 20 77 69 74 68 69 6e 20 61 20 67 72 61 70  en within a grap
08d0: 68 2e 0a 0a 23 23 20 53 79 6e 74 61 78 20 64 65  h...## Syntax de
08e0: 74 61 69 6c 73 0a 0a 0a 0a 23 23 23 20 43 6f 6d  tails....### Com
08f0: 6d 65 6e 74 73 0a 0a 4c 69 6e 65 73 20 62 65 67  ments..Lines beg
0900: 69 6e 6e 69 6e 67 20 77 69 74 68 20 60 23 60 20  inning with `#` 
0910: 61 72 65 20 63 6f 6d 6d 65 6e 74 73 2e 0a 0a 0a  are comments....
0920: 23 23 23 20 45 6e 64 20 6f 66 20 70 61 72 73 69  ### End of parsi
0930: 6e 67 0a 0a 57 69 74 68 20 74 68 65 20 63 6f 6d  ng..With the com
0940: 6d 61 6e 64 20 60 23 45 4e 44 60 20 61 74 20 74  mand `#END` at t
0950: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0960: 61 20 6c 69 6e 65 2c 20 74 68 65 20 70 61 72 73  a line, the pars
0970: 65 72 20 77 6f 6e e2 80 99 74 20 67 6f 20 66 75  er won...t go fu
0980: 72 74 68 65 72 2e 0a 57 68 61 74 65 76 65 72 20  rther..Whatever 
0990: 69 73 20 77 72 69 74 74 65 6e 20 61 66 74 65 72  is written after
09a0: 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65   will be conside
09b0: 72 65 64 20 61 73 20 63 6f 6d 6d 65 6e 74 73 2e  red as comments.
09c0: 0a 0a 0a 23 23 20 52 65 67 65 78 20 72 75 6c 65  ...## Regex rule
09d0: 20 73 79 6e 74 61 78 0a 0a 20 20 20 20 5f 5f 4c   syntax..    __L
09e0: 43 52 2f 6f 70 74 69 6f 6e 28 72 75 6c 65 6e 61  CR/option(rulena
09f0: 6d 65 29 21 70 72 69 6f 72 69 74 79 5f 5f 0a 20  me)!priority__. 
0a00: 20 20 20 20 20 20 20 70 61 74 74 65 72 6e 0a 20         pattern. 
0a10: 20 20 20 20 20 20 20 20 20 20 20 3c 3c 2d 20 63             <<- c
0a20: 6f 6e 64 69 74 69 6f 6e 20 2d 3e 3e 20 65 72 72  ondition ->> err
0a30: 6f 72 5f 73 75 67 67 65 73 74 69 6f 6e 73 20 20  or_suggestions  
0a40: 20 20 20 20 20 20 20 20 20 20 20 23 20 6d 65 73             # mes
0a50: 73 61 67 65 5f 65 72 72 6f 72 7c 55 52 4c 0a 20  sage_error|URL. 
0a60: 20 20 20 20 20 20 20 20 20 20 20 3c 3c 2d 20 63             <<- c
0a70: 6f 6e 64 69 74 69 6f 6e 20 7e 3e 3e 20 74 65 78  ondition ~>> tex
0a80: 74 5f 72 65 77 72 69 74 69 6e 67 0a 20 20 20 20  t_rewriting.    
0a90: 20 20 20 20 20 20 20 20 3c 3c 2d 20 63 6f 6e 64          <<- cond
0aa0: 69 74 69 6f 6e 20 3d 3e 3e 20 63 6f 6d 6d 61 6e  ition =>> comman
0ab0: 64 73 5f 66 6f 72 5f 64 69 73 61 6d 62 69 67 75  ds_for_disambigu
0ac0: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
0ad0: 20 20 2e 2e 2e 0a 0a 50 61 74 74 65 72 6e 73 20    .....Patterns 
0ae0: 61 72 65 20 77 72 69 74 74 65 6e 20 77 69 74 68  are written with
0af0: 20 74 68 65 20 50 79 74 68 6f 6e 20 73 79 6e 74   the Python synt
0b00: 61 78 20 66 6f 72 20 72 65 67 75 6c 61 72 20 65  ax for regular e
0b10: 78 70 72 65 73 73 69 6f 6e 73 3a 0a 68 74 74 70  xpressions:.http
0b20: 3a 2f 2f 64 6f 63 73 2e 70 79 74 68 6f 6e 2e 6f  ://docs.python.o
0b30: 72 67 2f 6c 69 62 72 61 72 79 2f 72 65 2e 68 74  rg/library/re.ht
0b40: 6d 6c 0a 0a 54 68 65 72 65 20 63 61 6e 20 62 65  ml..There can be
0b50: 20 6f 6e 65 20 6f 72 20 73 65 76 65 72 61 6c 20   one or several 
0b60: 61 63 74 69 6f 6e 73 20 66 6f 72 20 65 61 63 68  actions for each
0b70: 20 72 75 6c 65 2c 20 65 78 65 63 75 74 65 64 20   rule, executed 
0b80: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6f 72  following the or
0b90: 64 65 72 20 74 68 65 79 20 61 72 65 0a 77 72 69  der they are.wri
0ba0: 74 74 65 6e 2e 0a 0a 4f 70 74 69 6f 6e 61 6c 3a  tten...Optional:
0bb0: 0a 0a 2a 20 6f 70 74 69 6f 6e 0a 2a 20 72 75 6c  ..* option.* rul
0bc0: 65 6e 61 6d 65 0a 2a 20 70 72 69 6f 72 69 74 79  ename.* priority
0bd0: 0a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 0a 2a 20  .* conditions.* 
0be0: 55 52 4c 0a 0a 0a 4c 43 52 20 66 6c 61 67 73 20  URL...LCR flags 
0bf0: 6d 65 61 6e 73 3a 0a 0a 2a 20 4c 3a 20 4c 65 66  means:..* L: Lef
0c00: 74 20 62 6f 75 6e 64 61 72 79 20 66 6f 72 20 74  t boundary for t
0c10: 68 65 20 72 65 67 65 78 0a 2a 20 43 3a 20 43 61  he regex.* C: Ca
0c20: 73 65 20 73 65 6e 73 69 74 69 76 65 6e 65 73 73  se sensitiveness
0c30: 0a 2a 20 52 3a 20 52 69 67 68 74 20 62 6f 75 6e  .* R: Right boun
0c40: 64 61 72 79 20 66 6f 72 20 74 68 65 20 72 65 67  dary for the reg
0c50: 65 78 0a 0a 4c 65 66 74 20 62 6f 75 6e 64 61 72  ex..Left boundar
0c60: 79 20 28 4c 29 3a 0a 0a 3e 20 20 20 60 5b 60 20  y (L):..>   `[` 
0c70: 20 20 20 20 77 6f 72 64 20 62 6f 75 6e 64 61 72      word boundar
0c80: 79 0a 0a 3e 20 20 20 60 3c 60 20 20 20 20 20 6e  y..>   `<`     n
0c90: 6f 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 79 0a  o word boundary.
0ca0: 0a 72 69 67 68 74 20 62 6f 75 6e 64 61 72 79 20  .right boundary 
0cb0: 28 52 29 3a 0a 0a 3e 20 20 20 60 5d 60 20 20 20  (R):..>   `]`   
0cc0: 20 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 79 0a    word boundary.
0cd0: 0a 3e 20 20 20 60 3e 60 20 20 20 20 20 6e 6f 20  .>   `>`     no 
0ce0: 77 6f 72 64 20 62 6f 75 6e 64 61 72 79 0a 0a 43  word boundary..C
0cf0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 6e 65 73  ase sensitivenes
0d00: 73 20 28 43 29 3a 0a 0a 3e 20 20 20 60 69 60 20  s (C):..>   `i` 
0d10: 20 20 20 20 63 61 73 65 20 69 6e 73 65 6e 73 69      case insensi
0d20: 74 69 76 65 0a 0a 3e 20 20 20 60 73 60 20 20 20  tive..>   `s`   
0d30: 20 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65    case sensitive
0d40: 0a 0a 3e 20 20 20 60 75 60 20 20 20 20 20 75 70  ..>   `u`     up
0d50: 70 65 72 63 61 73 65 20 61 6c 6c 6f 77 65 64 20  percase allowed 
0d60: 66 6f 72 20 6c 6f 77 65 72 63 61 73 65 20 63 68  for lowercase ch
0d70: 61 72 61 63 74 65 72 73 0a 0a 3e 3e 20 20 20 20  aracters..>>    
0d80: 20 20 20 20 20 20 69 2e 65 2e 3a 20 20 22 57 6f        i.e.:  "Wo
0d90: 72 64 22 20 20 62 65 63 6f 6d 65 73 20 20 22 57  rd"  becomes  "W
0da0: 5b 6f 4f 5d 5b 72 52 5d 5b 64 44 5d 22 0a 0a 45  [oO][rR][dD]"..E
0db0: 78 61 6d 70 6c 65 73 3a 0a 0a 20 20 20 20 5f 5f  xamples:..    __
0dc0: 5b 69 5d 5f 5f 0a 20 20 20 20 5f 5f 3c 73 5d 5f  [i]__.    __<s]_
0dd0: 5f 0a 20 20 20 20 5f 5f 5b 75 3e 5f 5f 0a 20 20  _.    __[u>__.  
0de0: 20 20 5f 5f 3c 73 3e 5f 5f 0a 0a 0a 55 73 65 72    __<s>__...User
0df0: 20 6f 70 74 69 6f 6e 20 61 63 74 69 76 61 74 69   option activati
0e00: 6e 67 2f 64 65 61 63 74 69 76 61 74 69 6e 67 20  ng/deactivating 
0e10: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
0e20: 20 61 6e 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20   an option name 
0e30: 70 6c 61 63 65 64 0a 6a 75 73 74 20 61 66 74 65  placed.just afte
0e40: 72 20 74 68 65 20 4c 43 52 20 66 6c 61 67 73 2c  r the LCR flags,
0e50: 20 69 2e 65 2e 3a 0a 0a 20 20 20 20 5f 5f 5b 69   i.e.:..    __[i
0e60: 5d 2f 6f 70 74 69 6f 6e 31 5f 5f 0a 20 20 20 20  ]/option1__.    
0e70: 5f 5f 5b 75 5d 2f 6f 70 74 69 6f 6e 32 5f 5f 0a  __[u]/option2__.
0e80: 20 20 20 20 5f 5f 5b 73 3e 2f 6f 70 74 69 6f 6e      __[s>/option
0e90: 31 5f 5f 0a 20 20 20 20 5f 5f 3c 75 3e 2f 6f 70  1__.    __<u>/op
0ea0: 74 69 6f 6e 33 5f 5f 0a 20 20 20 20 5f 5f 3c 69  tion3__.    __<i
0eb0: 3e 2f 6f 70 74 69 6f 6e 33 5f 5f 0a 0a 52 75 6c  >/option3__..Rul
0ec0: 65 73 20 63 61 6e 20 62 65 20 6e 61 6d 65 64 3a  es can be named:
0ed0: 0a 0a 20 20 20 20 5f 5f 5b 69 5d 2f 6f 70 74 69  ..    __[i]/opti
0ee0: 6f 6e 31 28 6e 61 6d 65 31 29 5f 5f 0a 20 20 20  on1(name1)__.   
0ef0: 20 5f 5f 5b 75 5d 2f 6f 70 74 69 6f 6e 32 28 6e   __[u]/option2(n
0f00: 61 6d 65 32 29 5f 5f 0a 20 20 20 20 5f 5f 5b 73  ame2)__.    __[s
0f10: 3e 2f 6f 70 74 69 6f 6e 31 28 6e 61 6d 65 33 29  >/option1(name3)
0f20: 5f 5f 0a 20 20 20 20 5f 5f 3c 75 3e 28 6e 61 6d  __.    __<u>(nam
0f30: 65 34 29 5f 5f 0a 20 20 20 20 5f 5f 3c 69 3e 28  e4)__.    __<i>(
0f40: 6e 61 6d 65 35 29 5f 5f 0a 0a 45 61 63 68 20 72  name5)__..Each r
0f50: 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ule name must be
0f60: 20 75 6e 69 71 75 65 2e 0a 0a 0a 54 68 65 20 4c   unique....The L
0f70: 43 52 20 66 6c 61 67 73 20 61 72 65 20 61 6c 73  CR flags are als
0f80: 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 49 66 20 79  o optional. If y
0f90: 6f 75 20 64 6f 6e e2 80 99 74 20 73 65 74 20 74  ou don...t set t
0fa0: 68 65 73 65 20 66 6c 61 67 73 2c 20 74 68 65 20  hese flags, the 
0fb0: 64 65 66 61 75 6c 74 20 4c 43 52 0a 66 6c 61 67  default LCR.flag
0fc0: 73 20 77 69 6c 6c 20 62 65 3a 0a 0a 20 20 20 20  s will be:..    
0fd0: 5f 5f 5b 69 5d 5f 5f 0a 0a 45 78 61 6d 70 6c 65  __[i]__..Example
0fe0: 2e 20 52 65 70 6f 72 74 20 e2 80 9c 66 6f 6f e2  . Report ...foo.
0ff0: 80 9d 20 69 6e 20 74 68 65 20 74 65 78 74 20 61  .. in the text a
1000: 6e 64 20 73 75 67 67 65 73 74 20 e2 80 9c 62 61  nd suggest ...ba
1010: 72 e2 80 9d 3a 0a 0a 20 20 20 20 66 6f 6f 20 3c  r...:..    foo <
1020: 3c 2d 20 2d 3e 3e 20 62 61 72 20 20 20 20 20 20  <- ->> bar      
1030: 20 20 20 23 20 55 73 65 20 62 61 72 20 69 6e 73     # Use bar ins
1040: 74 65 61 64 20 6f 66 20 66 6f 6f 2e 0a 0a 45 78  tead of foo...Ex
1050: 61 6d 70 6c 65 2e 20 52 65 63 6f 67 6e 69 7a 65  ample. Recognize
1060: 20 61 6e 64 20 73 75 67 67 65 73 74 20 6d 69 73   and suggest mis
1070: 73 69 6e 67 20 68 79 70 68 65 6e 20 61 6e 64 20  sing hyphen and 
1080: 72 65 77 72 69 74 65 20 69 6e 74 65 72 6e 61 6c  rewrite internal
1090: 6c 79 20 74 68 65 20 74 65 78 74 0a 77 69 74 68  ly the text.with
10a0: 20 74 68 65 20 68 79 70 68 65 6e 3a 0a 0a 20 20   the hyphen:..  
10b0: 20 20 5f 5f 5b 73 5d 5f 5f 0a 20 20 20 20 20 20    __[s]__.      
10c0: 20 20 66 6f 6f 20 62 61 72 0a 20 20 20 20 20 20    foo bar.      
10d0: 20 20 20 20 20 20 3c 3c 2d 20 2d 3e 3e 20 66 6f        <<- ->> fo
10e0: 6f 2d 62 61 72 20 20 20 20 20 23 20 4d 69 73 73  o-bar     # Miss
10f0: 69 6e 67 20 68 79 70 68 65 6e 2e 0a 20 20 20 20  ing hyphen..    
1100: 20 20 20 20 20 20 20 20 3c 3c 2d 20 7e 3e 3e 20          <<- ~>> 
1110: 66 6f 6f 2d 62 61 72 0a 0a 0a 23 23 23 20 53 69  foo-bar...### Si
1120: 6d 70 6c 65 2d 6c 69 6e 65 20 6f 72 20 6d 75 6c  mple-line or mul
1130: 74 69 2d 6c 69 6e 65 20 72 75 6c 65 73 0a 0a 52  ti-line rules..R
1140: 75 6c 65 73 20 63 61 6e 20 62 65 20 62 72 65 61  ules can be brea
1150: 6b 20 74 6f 20 6d 75 6c 74 69 70 6c 65 20 6c 69  k to multiple li
1160: 6e 65 73 20 62 79 20 6c 65 61 64 69 6e 67 20 73  nes by leading s
1170: 70 61 63 65 73 2e 0a 59 6f 75 20 73 68 6f 75 6c  paces..You shoul
1180: 64 20 75 73 65 20 34 20 73 70 61 63 65 73 2e 0a  d use 4 spaces..
1190: 0a 45 78 61 6d 70 6c 65 73 3a 0a 0a 20 20 20 20  .Examples:..    
11a0: 5f 5f 3c 73 3e 5f 5f 20 70 61 74 74 65 72 6e 20  __<s>__ pattern 
11b0: 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e 20 2d 3e  <<- condition ->
11c0: 3e 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 23 20  > replacement # 
11d0: 6d 65 73 73 61 67 65 0a 0a 20 20 20 20 5f 5f 3c  message..    __<
11e0: 73 3e 5f 5f 0a 20 20 20 20 20 20 20 20 70 61 74  s>__.        pat
11f0: 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tern.           
1200: 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e 20 2d   <<- condition -
1210: 3e 3e 20 72 65 70 6c 61 63 65 6d 65 6e 74 0a 20  >> replacement. 
1220: 20 20 20 20 20 20 20 20 20 20 20 23 20 6d 65 73             # mes
1230: 73 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20  sage.           
1240: 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f 6e 20 2d   <<- condition -
1250: 3e 3e 20 73 75 67 67 65 73 74 69 6f 6e 20 23 20  >> suggestion # 
1260: 6d 65 73 73 61 67 65 0a 20 20 20 20 20 20 20 20  message.        
1270: 20 20 20 20 3c 3c 2d 20 63 6f 6e 64 69 74 69 6f      <<- conditio
1280: 6e 20 7e 3e 3e 20 74 65 78 74 5f 72 65 77 72 69  n ~>> text_rewri
1290: 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  ting.           
12a0: 20 3c 3c 2d 20 3d 3e 3e 20 64 69 73 61 6d 62 69   <<- =>> disambi
12b0: 67 75 61 74 69 6f 6e 0a 0a 0a 23 23 23 20 57 68  guation...### Wh
12c0: 69 74 65 73 70 61 63 65 73 20 61 74 20 74 68 65  itespaces at the
12d0: 20 62 6f 72 64 65 72 20 6f 66 20 70 61 74 74 65   border of patte
12e0: 72 6e 73 20 6f 72 20 73 75 67 67 65 73 74 69 6f  rns or suggestio
12f0: 6e 73 0a 0a 45 78 61 6d 70 6c 65 3a 20 52 65 63  ns..Example: Rec
1300: 6f 67 6e 69 7a 65 20 64 6f 75 62 6c 65 20 6f 72  ognize double or
1310: 20 6d 6f 72 65 20 73 70 61 63 65 73 20 61 6e 64   more spaces and
1320: 20 73 75 67 67 65 73 74 73 20 61 20 73 69 6e 67   suggests a sing
1330: 6c 65 20 73 70 61 63 65 3a 0a 0a 20 20 20 20 5f  le space:..    _
1340: 5f 3c 73 3e 5f 5f 20 20 22 20 20 2b 22 20 3c 3c  _<s>__  "  +" <<
1350: 2d 20 2d 3e 3e 20 22 20 22 20 20 20 20 20 20 23  - ->> " "      #
1360: 20 52 65 6d 6f 76 65 20 65 78 74 72 61 20 73 70   Remove extra sp
1370: 61 63 65 28 73 29 2e 0a 0a 43 68 61 72 61 63 74  ace(s)...Charact
1380: 65 72 73 20 60 22 60 20 70 72 6f 74 65 63 74 20  ers `"` protect 
1390: 73 70 61 63 65 73 20 69 6e 20 74 68 65 20 70 61  spaces in the pa
13a0: 74 74 65 72 6e 20 61 6e 64 20 69 6e 20 74 68 65  ttern and in the
13b0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 74 65 78   replacement tex
13c0: 74 2e 0a 0a 0a 23 23 23 20 50 61 74 74 65 72 6e  t....### Pattern
13d0: 20 67 72 6f 75 70 73 20 61 6e 64 20 62 61 63 6b   groups and back
13e0: 20 72 65 66 65 72 65 6e 63 65 73 0a 0a 49 74 20   references..It 
13f0: 69 73 20 75 73 75 61 6c 6c 79 20 75 73 65 66 75  is usually usefu
1400: 6c 20 74 6f 20 72 65 74 72 69 65 76 65 20 70 61  l to retrieve pa
1410: 72 74 73 20 6f 66 20 74 68 65 20 6d 61 74 63 68  rts of the match
1420: 65 64 20 70 61 74 74 65 72 6e 2e 20 57 65 20 73  ed pattern. We s
1430: 69 6d 70 6c 79 20 75 73 65 0a 70 61 72 65 6e 74  imply use.parent
1440: 68 65 73 69 73 20 69 6e 20 70 61 74 74 65 72 6e  hesis in pattern
1450: 20 74 6f 20 67 65 74 20 67 72 6f 75 70 73 20 77   to get groups w
1460: 69 74 68 20 62 61 63 6b 20 72 65 66 65 72 65 6e  ith back referen
1470: 63 65 73 2e 0a 0a 45 78 61 6d 70 6c 65 2e 20 53  ces...Example. S
1480: 75 67 67 65 73 74 20 61 20 77 6f 72 64 20 77 69  uggest a word wi
1490: 74 68 20 63 6f 72 72 65 63 74 20 71 75 6f 74 61  th correct quota
14a0: 74 69 6f 6e 20 6d 61 72 6b 73 3a 0a 0a 20 20 20  tion marks:..   
14b0: 20 5c 22 28 5c 77 2b 29 5c 22 20 3c 3c 2d 20 2d   \"(\w+)\" <<- -
14c0: 3e 3e 20 e2 80 9c 5c 31 e2 80 9d 20 20 20 20 20  >> ...\1...     
14d0: 20 23 20 43 6f 72 72 65 63 74 20 71 75 6f 74 61   # Correct quota
14e0: 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 0a 45 78 61  tion marks...Exa
14f0: 6d 70 6c 65 2e 20 53 75 67 67 65 73 74 20 74 68  mple. Suggest th
1500: 65 20 6d 69 73 73 69 6e 67 20 73 70 61 63 65 20  e missing space 
1510: 61 66 74 65 72 20 74 68 65 20 73 69 67 6e 73 20  after the signs 
1520: 60 21 60 2c 20 60 3f 60 20 6f 72 20 60 2e 60 3a  `!`, `?` or `.`:
1530: 0a 0a 20 20 20 20 5f 5f 3c 69 5d 5f 5f 20 20 5c  ..    __<i]__  \
1540: 62 28 5b 3f 21 2e 5d 29 28 5b 41 2d 5a 5d 2b 29  b([?!.])([A-Z]+)
1550: 20 3c 3c 2d 20 2d 3e 3e 20 5c 31 20 5c 32 20 20   <<- ->> \1 \2  
1560: 20 20 20 23 20 4d 69 73 73 69 6e 67 20 73 70 61     # Missing spa
1570: 63 65 3f 0a 0a 45 78 61 6d 70 6c 65 2e 20 42 61  ce?..Example. Ba
1580: 63 6b 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ck reference in 
1590: 6d 65 73 73 61 67 65 73 2e 0a 0a 20 20 20 20 28  messages...    (
15a0: 66 6f 6f 6f 29 20 62 61 72 20 3c 3c 2d 20 2d 3e  fooo) bar <<- ->
15b0: 3e 20 66 6f 6f 20 20 20 20 20 20 23 20 e2 80 9c  > foo      # ...
15c0: 5c 31 e2 80 9d 20 73 68 6f 75 6c 64 20 62 65 3a  \1... should be:
15d0: 0a 0a 0a 23 23 23 20 50 61 74 74 65 72 6e 20 6d  ...### Pattern m
15e0: 61 74 63 68 69 6e 67 0a 0a 52 65 70 65 61 74 69  atching..Repeati
15f0: 6e 67 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68  ng pattern match
1600: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1610: 72 75 6c 65 20 63 6f 6e 74 69 6e 75 65 73 20 61  rule continues a
1620: 66 74 65 72 20 74 68 65 20 70 72 65 76 69 6f 75  fter the previou
1630: 73 20 6d 61 74 63 68 69 6e 67 2c 20 73 6f 0a 69  s matching, so.i
1640: 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72 61  nstead of genera
1650: 6c 20 6d 75 6c 74 69 77 6f 72 64 20 70 61 74 74  l multiword patt
1660: 65 72 6e 73 2c 20 6c 69 6b 65 0a 0a 20 20 20 20  erns, like..    
1670: 20 20 20 20 28 5c 77 2b 29 20 28 5c 77 2b 29 20      (\w+) (\w+) 
1680: 3c 3c 2d 20 73 6f 6d 65 5f 63 68 65 63 6b 28 5c  <<- some_check(\
1690: 31 2c 20 5c 32 29 20 2d 3e 3e 20 5c 31 2c 20 5c  1, \2) ->> \1, \
16a0: 32 20 23 20 66 6f 6f 0a 0a 75 73 65 0a 0a 20 20  2 # foo..use..  
16b0: 20 20 20 20 20 20 28 5c 77 2b 29 20 3c 3c 2d 20        (\w+) <<- 
16c0: 73 6f 6d 65 5f 63 68 65 63 6b 28 5c 31 2c 20 77  some_check(\1, w
16d0: 6f 72 64 28 31 29 29 20 2d 3e 3e 20 5c 31 2c 20  ord(1)) ->> \1, 
16e0: 23 20 66 6f 6f 0a 0a 0a 23 23 23 20 44 65 66 69  # foo...### Defi
16f0: 6e 69 74 69 6f 6e 73 0a 0a 47 72 61 6d 6d 61 6c  nitions..Grammal
1700: 65 63 74 65 20 73 75 70 70 6f 72 74 73 20 64 65  ecte supports de
1710: 66 69 6e 69 74 69 6f 6e 73 20 74 6f 20 73 69 6d  finitions to sim
1720: 70 6c 69 66 79 20 74 68 65 20 64 65 73 63 72 69  plify the descri
1730: 70 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78  ption of complex
1740: 20 72 75 6c 65 73 2e 0a 0a 45 78 61 6d 70 6c 65   rules...Example
1750: 3a 0a 0a 20 20 20 20 44 45 46 3a 20 6e 61 6d 65  :..    DEF: name
1760: 20 70 61 74 74 65 72 6e 0a 0a 55 73 61 67 65 20   pattern..Usage 
1770: 69 6e 20 74 68 65 20 72 75 6c 65 73 3a 0a 0a 20  in the rules:.. 
1780: 20 20 20 28 7b 6e 61 6d 65 7d 29 20 28 5c 77 2b     ({name}) (\w+
1790: 29 20 2d 3e 3e 20 22 5c 31 2d 5c 32 22 20 20 20  ) ->> "\1-\2"   
17a0: 20 20 20 20 20 20 20 23 20 4d 69 73 73 69 6e 67         # Missing
17b0: 20 68 79 70 68 65 6e 3f 0a 0a 0a 23 23 23 20 4d   hyphen?...### M
17c0: 75 6c 74 69 70 6c 65 20 73 75 67 67 65 73 74 69  ultiple suggesti
17d0: 6f 6e 73 0a 0a 55 73 65 20 60 7c 60 20 69 6e 20  ons..Use `|` in 
17e0: 74 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  the replacement 
17f0: 74 65 78 74 20 74 6f 20 61 64 64 20 6d 75 6c 74  text to add mult
1800: 69 70 6c 65 20 73 75 67 67 65 73 74 69 6f 6e 73  iple suggestions
1810: 3a 0a 0a 45 78 61 6d 70 6c 65 2e 20 46 6f 6f 2c  :..Example. Foo,
1820: 20 46 4f 4f 2c 20 42 61 72 20 61 6e 64 20 42 41   FOO, Bar and BA
1830: 52 20 73 75 67 67 65 73 74 69 6f 6e 73 20 66 6f  R suggestions fo
1840: 72 20 74 68 65 20 69 6e 70 75 74 20 77 6f 72 64  r the input word
1850: 20 22 66 6f 6f 22 2e 0a 0a 20 20 20 20 66 6f 6f   "foo"...    foo
1860: 20 3c 3c 2d 20 2d 3e 3e 20 46 6f 6f 7c 46 4f 4f   <<- ->> Foo|FOO
1870: 7c 42 61 72 7c 42 41 52 20 20 20 20 20 20 20 20  |Bar|BAR        
1880: 20 23 20 44 69 64 20 79 6f 75 20 6d 65 61 6e 3a   # Did you mean:
1890: 0a 0a 0a 23 23 23 20 4e 6f 20 73 75 67 67 65 73  ...### No sugges
18a0: 74 69 6f 6e 0a 0a 59 6f 75 20 63 61 6e 20 64 69  tion..You can di
18b0: 73 70 6c 61 79 20 6d 65 73 73 61 67 65 20 77 69  splay message wi
18c0: 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 73 75 67  thout making sug
18d0: 67 65 73 74 69 6f 6e 73 2e 20 46 6f 72 20 74 68  gestions. For th
18e0: 69 73 20 70 75 72 70 6f 73 65 2c 0a 75 73 65 20  is purpose,.use 
18f0: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
1900: 65 72 20 5f 20 69 6e 20 74 68 65 20 73 75 67 67  er _ in the sugg
1910: 65 73 74 69 6f 6e 20 66 69 65 6c 64 2e 0a 0a 45  estion field...E
1920: 78 61 6d 70 6c 65 2e 20 4e 6f 20 73 75 67 67 65  xample. No sugge
1930: 73 74 69 6f 6e 2e 0a 0a 20 20 20 20 66 6f 6f 62  stion...    foob
1940: 61 72 20 3c 3c 2d 20 2d 3e 3e 20 5f 20 20 20 20  ar <<- ->> _    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 23 20 4d 65 73 73 61 67 65 0a 0a 0a 23 23 23 20  # Message...### 
1970: 50 6f 73 69 74 69 6f 6e 69 6e 67 0a 0a 50 6f 73  Positioning..Pos
1980: 69 74 69 6f 6e 69 6e 67 20 69 73 20 76 61 6c 69  itioning is vali
1990: 64 20 6f 6e 6c 79 20 66 6f 72 20 65 72 72 6f 72  d only for error
19a0: 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 74 65   creation and te
19b0: 78 74 20 72 65 77 72 69 74 69 6e 67 2e 0a 0a 42  xt rewriting...B
19c0: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 20 66  y default, the f
19d0: 75 6c 6c 20 70 61 74 74 65 72 6e 20 77 69 6c 6c  ull pattern will
19e0: 20 62 65 20 75 6e 64 65 72 6c 69 6e 65 64 20 77   be underlined w
19f0: 69 74 68 20 62 6c 75 65 2e 20 59 6f 75 20 63 61  ith blue. You ca
1a00: 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 0a 75 6e  n shorten the.un
1a10: 64 65 72 6c 69 6e 65 64 20 74 65 78 74 20 61 72  derlined text ar
1a20: 65 61 20 62 79 20 73 70 65 63 69 66 79 69 6e 67  ea by specifying
1a30: 20 61 20 62 61 63 6b 20 72 65 66 65 72 65 6e 63   a back referenc
1a40: 65 20 67 72 6f 75 70 20 6f 66 20 74 68 65 20 70  e group of the p
1a50: 61 74 74 65 72 6e 2e 0a 49 6e 73 74 65 61 64 20  attern..Instead 
1a60: 6f 66 20 77 72 69 74 69 6e 67 20 2d 3e 3e 2c 20  of writing ->>, 
1a70: 77 72 69 74 65 20 2d 6e 3e 3e 20 20 6e 20 62 65  write -n>>  n be
1a80: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
1a90: 66 20 61 20 62 61 63 6b 20 72 65 66 65 72 65 6e  f a back referen
1aa0: 63 65 0a 67 72 6f 75 70 2e 20 41 63 74 75 61 6c  ce.group. Actual
1ab0: 6c 79 2c 20 20 2d 3e 3e 20 20 69 73 20 73 69 6d  ly,  ->>  is sim
1ac0: 69 6c 61 72 20 74 6f 20 20 2d 30 3e 3e 0a 0a 45  ilar to  -0>>..E
1ad0: 78 61 6d 70 6c 65 3a 0a 0a 20 20 20 20 28 79 69  xample:..    (yi
1ae0: 6e 67 29 20 61 6e 64 20 79 61 6e 67 20 3c 3c 2d  ng) and yang <<-
1af0: 20 2d 31 3e 3e 20 79 69 6e 20 23 20 44 69 64 20   -1>> yin # Did 
1b00: 79 6f 75 20 6d 65 61 6e 3a 0a 0a 20 20 20 20 5f  you mean:..    _
1b10: 5f 5b 73 5d 5f 5f 20 28 4d 72 2e 29 20 5b 41 2d  _[s]__ (Mr.) [A-
1b20: 5a 5d 5c 77 2b 20 3c 3c 2d 20 7e 31 3e 3e 20 4d  Z]\w+ <<- ~1>> M
1b30: 72 0a 0a 0a 2a 2a 43 6f 6d 70 61 72 69 73 6f 6e  r...**Comparison
1b40: 2a 2a 0a 0a 52 75 6c 65 20 41 3a 0a 0a 20 20 20  **..Rule A:..   
1b50: 20 79 69 6e 67 20 61 6e 64 20 79 61 6e 67 20 20   ying and yang  
1b60: 20 20 20 20 20 3c 3c 2d 20 2d 3e 3e 20 20 20 20       <<- ->>    
1b70: 20 79 69 6e 20 61 6e 64 20 79 61 6e 67 20 20 20   yin and yang   
1b80: 20 20 20 20 20 23 20 44 69 64 20 79 6f 75 20 6d       # Did you m
1b90: 65 61 6e 3a 0a 0a 52 75 6c 65 20 42 3a 0a 0a 20  ean:..Rule B:.. 
1ba0: 20 20 20 28 79 69 6e 67 29 20 61 6e 64 20 79 61     (ying) and ya
1bb0: 6e 67 20 20 20 20 20 3c 3c 2d 20 2d 31 3e 3e 20  ng     <<- -1>> 
1bc0: 20 20 20 79 69 6e 20 20 20 20 20 20 20 20 20 20     yin          
1bd0: 20 20 20 20 20 20 20 23 20 44 69 64 20 79 6f 75         # Did you
1be0: 20 6d 65 61 6e 3a 0a 0a 57 69 74 68 20 74 68 65   mean:..With the
1bf0: 20 72 75 6c 65 20 41 2c 20 74 68 65 20 66 75 6c   rule A, the ful
1c00: 6c 20 70 61 74 74 65 72 6e 20 69 73 20 75 6e 64  l pattern is und
1c10: 65 72 6c 69 6e 65 64 3a 0a 0a 20 20 20 20 79 69  erlined:..    yi
1c20: 6e 67 20 61 6e 64 20 79 61 6e 67 0a 20 20 20 20  ng and yang.    
1c30: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 0a 57  ^^^^^^^^^^^^^..W
1c40: 69 74 68 20 74 68 65 20 72 75 6c 65 20 42 2c 20  ith the rule B, 
1c50: 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 67  only the first g
1c60: 72 6f 75 70 20 69 73 20 75 6e 64 65 72 6c 69 6e  roup is underlin
1c70: 65 64 3a 0a 0a 20 20 20 20 79 69 6e 67 20 61 6e  ed:..    ying an
1c80: 64 20 79 61 6e 67 0a 20 20 20 20 5e 5e 5e 5e 0a  d yang.    ^^^^.
1c90: 0a 0a 23 23 23 20 4c 6f 6e 67 65 72 20 65 78 70  ..### Longer exp
1ca0: 6c 61 6e 61 74 69 6f 6e 73 20 77 69 74 68 20 55  lanations with U
1cb0: 52 4c 73 0a 0a 57 61 72 6e 69 6e 67 20 6d 65 73  RLs..Warning mes
1cc0: 73 61 67 65 73 20 63 61 6e 20 63 6f 6e 74 61 69  sages can contai
1cd0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 55 52 4c 20 66  n optional URL f
1ce0: 6f 72 20 6c 6f 6e 67 65 72 20 65 78 70 6c 61 6e  or longer explan
1cf0: 61 74 69 6f 6e 73 2e 0a 0a 20 20 20 20 79 6f 75  ations...    you
1d00: 72 e2 80 99 73 0a 20 20 20 20 20 20 20 20 3c 3c  r...s.        <<
1d10: 2d 20 2d 3e 3e 20 79 6f 75 72 73 0a 20 20 20 20  - ->> yours.    
1d20: 20 20 20 20 20 20 20 20 23 20 50 6f 73 73 65 73          # Posses
1d30: 73 69 76 65 20 70 72 6f 6e 6f 75 6e 3a 7c 68 74  sive pronoun:|ht
1d40: 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69  tp://en.wikipedi
1d50: 61 2e 6f 72 67 2f 77 69 6b 69 2f 50 6f 73 73 65  a.org/wiki/Posse
1d60: 73 73 69 76 65 5f 70 72 6f 6e 6f 75 6e 0a 0a 0a  ssive_pronoun...
1d70: 23 23 23 20 54 65 78 74 20 72 65 77 72 69 74 69  ### Text rewriti
1d80: 6e 67 0a 0a 45 78 61 6d 70 6c 65 2e 20 52 65 70  ng..Example. Rep
1d90: 6c 61 63 69 6e 67 20 61 20 73 74 72 69 6e 67 20  lacing a string 
1da0: 62 79 20 61 6e 6f 74 68 65 72 2e 0a 0a 20 20 20  by another...   
1db0: 20 4d 72 2e 20 5b 41 2d 5a 5d 5c 77 2b 20 3c 3c   Mr. [A-Z]\w+ <<
1dc0: 2d 20 7e 3e 3e 20 4d 69 73 74 65 72 0a 0a 2a 2a  - ~>> Mister..**
1dd0: 57 41 52 4e 49 4e 47 2a 2a 3a 20 54 68 65 20 72  WARNING**: The r
1de0: 65 70 6c 61 63 69 6e 67 20 74 65 78 74 20 6d 75  eplacing text mu
1df0: 73 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  st be shorter th
1e00: 61 6e 20 74 68 65 20 72 65 70 6c 61 63 65 64 20  an the replaced 
1e10: 74 65 78 74 20 6f 72 20 68 61 76 65 20 74 68 65  text or have the
1e20: 0a 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 42 72  .same length. Br
1e30: 65 61 6b 69 6e 67 20 74 68 69 73 20 72 75 6c 65  eaking this rule
1e40: 20 77 69 6c 6c 20 6d 69 73 70 6c 61 63 65 20 66   will misplace f
1e50: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 20 72  ollowing error r
1e60: 65 70 6f 72 74 73 2e 20 59 6f 75 0a 68 61 76 65  eports. You.have
1e70: 20 74 6f 20 65 6e 73 75 72 65 20 79 6f 75 72 73   to ensure yours
1e80: 65 6c 66 20 74 68 65 20 72 75 6c 65 73 20 63 6f  elf the rules co
1e90: 6d 70 6c 79 20 77 69 74 68 20 74 68 69 73 20 63  mply with this c
1ea0: 6f 6e 73 74 72 61 69 6e 74 2c 20 47 72 61 6d 6d  onstraint, Gramm
1eb0: 61 6c 65 63 74 65 0a 77 6f 6e e2 80 99 74 20 64  alecte.won...t d
1ec0: 6f 20 69 74 20 66 6f 72 20 79 6f 75 2e 0a 0a 53  o it for you...S
1ed0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
1ee0: 20 66 6f 72 20 74 65 78 74 20 72 65 77 72 69 74   for text rewrit
1ef0: 69 6e 67 3a 0a 0a 60 7e 3e 3e 20 2a 60 0a 0a 3e  ing:..`~>> *`..>
1f00: 20 20 20 52 65 70 6c 61 63 65 20 62 79 20 77 68     Replace by wh
1f10: 69 74 65 73 70 61 63 65 73 0a 0a 60 7e 3e 3e 20  itespaces..`~>> 
1f20: 40 60 0a 0a 3e 20 20 20 52 65 70 6c 61 63 65 20  @`..>   Replace 
1f30: 77 69 74 68 20 74 68 65 20 61 74 20 73 69 67 6e  with the at sign
1f40: 2c 20 75 73 65 66 75 6c 20 6d 6f 73 74 6c 79 20  , useful mostly 
1f50: 61 74 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  at first pass, w
1f60: 68 65 72 65 20 69 74 20 69 73 20 61 64 76 69 73  here it is advis
1f70: 65 64 20 74 6f 0a 3e 20 20 20 63 68 65 63 6b 20  ed to.>   check 
1f80: 75 73 61 67 65 20 6f 66 20 70 75 6e 63 74 75 61  usage of punctua
1f90: 74 69 6f 6e 73 20 61 6e 64 20 77 68 69 74 65 73  tions and whites
1fa0: 70 61 63 65 73 2e 0a 3e 20 20 20 53 75 63 63 65  paces..>   Succe
1fb0: 73 73 69 6f 6e 73 20 6f 66 20 40 20 61 72 65 20  ssions of @ are 
1fc0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 72 65  automatically re
1fd0: 6d 6f 76 65 64 20 61 74 20 74 68 65 20 62 65 67  moved at the beg
1fe0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65  inning of the se
1ff0: 63 6f 6e 64 20 70 61 73 73 2e 0a 0a 60 7e 3e 3e  cond pass...`~>>
2000: 20 5f 60 0a 0a 3e 20 20 20 52 65 70 6c 61 63 65   _`..>   Replace
2010: 20 77 69 74 68 20 75 6e 64 65 72 73 63 6f 72 65   with underscore
2020: 73 2e 20 4a 75 73 74 20 61 20 66 69 6c 6c 65 72  s. Just a filler
2030: 2e 0a 3e 20 20 20 54 68 65 73 65 20 63 68 61 72  ..>   These char
2040: 61 63 74 65 72 73 20 77 6f 6e e2 80 99 74 20 62  acters won...t b
2050: 65 20 72 65 6d 6f 76 65 64 20 61 74 20 74 68 65  e removed at the
2060: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2070: 65 20 73 65 63 6f 6e 64 20 70 61 73 73 2e 0a 0a  e second pass...
2080: 59 6f 75 20 63 61 6e 20 75 73 65 20 70 6f 73 69  You can use posi
2090: 74 69 6f 6e 69 6e 67 20 77 69 74 68 20 74 65 78  tioning with tex
20a0: 74 20 72 65 77 72 69 74 69 6e 67 20 61 63 74 69  t rewriting acti
20b0: 6f 6e 73 2e 0a 0a 20 20 20 20 4d 72 28 2e 20 5b  ons...    Mr(. [
20c0: 41 2d 5a 5d 5c 77 2b 29 20 3c 3c 2d 20 7e 31 3e  A-Z]\w+) <<- ~1>
20d0: 3e 20 2a 0a 0a 59 6f 75 20 63 61 6e 20 61 6c 73  > *..You can als
20e0: 6f 20 63 61 6c 6c 20 50 79 74 68 6f 6e 20 65 78  o call Python ex
20f0: 70 72 65 73 73 69 6f 6e 73 2e 0a 0a 20 20 20 20  pressions...    
2100: 5f 5f 5b 73 5d 5f 5f 20 4d 72 2e 20 28 5b 61 2d  __[s]__ Mr. ([a-
2110: 7a 5d 5c 77 2b 29 20 3c 3c 2d 20 7e 31 3e 3e 20  z]\w+) <<- ~1>> 
2120: 3d 5c 31 2e 75 70 70 65 72 28 29 0a 0a 0a 23 23  =\1.upper()...##
2130: 23 20 54 65 78 74 20 70 72 6f 63 65 73 73 69 6e  # Text processin
2140: 67 0a 0a 54 68 65 20 74 65 78 74 20 70 72 6f 63  g..The text proc
2150: 65 73 73 6f 72 20 69 73 20 75 73 65 66 75 6c 20  essor is useful 
2160: 74 6f 20 73 69 6d 70 6c 69 66 79 20 74 65 78 74  to simplify text
2170: 73 20 61 6e 64 20 77 72 69 74 65 20 73 69 6d 70  s and write simp
2180: 6c 65 72 20 63 68 65 63 6b 69 6e 67 0a 72 75 6c  ler checking.rul
2190: 65 73 2e 0a 0a 46 6f 72 20 65 78 61 6d 70 6c 65  es...For example
21a0: 2c 20 73 65 6e 74 65 6e 63 65 73 20 77 69 74 68  , sentences with
21b0: 20 74 68 65 20 73 61 6d 65 20 67 72 61 6d 6d 61   the same gramma
21c0: 72 20 6d 69 73 74 61 6b 65 3a 0a 0a 20 20 20 20  r mistake:..    
21d0: 54 68 65 73 65 20 e2 80 9c 63 61 74 73 e2 80 9d  These ...cats...
21e0: 20 61 72 65 20 62 6c 61 63 6b 73 2e 0a 20 20 20   are blacks..   
21f0: 20 54 68 65 73 65 20 63 61 74 73 20 61 72 65 20   These cats are 
2200: e2 80 9c 62 6c 61 63 6b 73 e2 80 9d 2e 0a 20 20  ...blacks.....  
2210: 20 20 54 68 65 73 65 20 63 61 74 73 20 61 72 65    These cats are
2220: 20 61 62 73 6f 6c 75 74 65 6c 79 20 62 6c 61 63   absolutely blac
2230: 6b 73 2e 0a 20 20 20 20 54 68 65 73 65 20 73 74  ks..    These st
2240: 75 70 69 64 20 e2 80 9c 63 61 74 73 e2 80 9d 20  upid ...cats... 
2250: 61 72 65 20 61 6c 6c 20 62 6c 61 63 6b 73 2e 0a  are all blacks..
2260: 20 20 20 20 54 68 65 73 65 20 75 6e 6b 6e 6f 77      These unknow
2270: 6e 20 63 61 74 73 20 61 72 65 20 61 73 20 70 65  n cats are as pe
2280: 72 20 75 73 75 61 6c 20 62 6c 61 63 6b 73 2e 0a  r usual blacks..
2290: 0a 49 6e 73 74 65 61 64 20 6f 66 20 77 72 69 74  .Instead of writ
22a0: 69 6e 67 20 63 6f 6d 70 6c 65 78 20 72 75 6c 65  ing complex rule
22b0: 73 20 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6c  s or several rul
22c0: 65 73 20 74 6f 20 66 69 6e 64 20 6d 69 73 74 61  es to find mista
22d0: 6b 65 73 20 66 6f 72 20 61 6c 6c 20 70 6f 73 73  kes for all poss
22e0: 69 62 6c 65 20 0a 63 61 73 65 73 2c 20 79 6f 75  ible .cases, you
22f0: 20 63 61 6e 20 75 73 65 20 74 68 65 20 74 65 78   can use the tex
2300: 74 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 74  t preprocessor t
2310: 6f 20 73 69 6d 70 6c 69 66 79 20 74 68 65 20 74  o simplify the t
2320: 65 78 74 2e 0a 0a 54 6f 20 72 65 6d 6f 76 65 20  ext...To remove 
2330: 74 68 65 20 63 68 61 72 73 20 e2 80 9c e2 80 9d  the chars ......
2340: 2c 20 77 72 69 74 65 3a 0a 0a 20 20 20 20 5b e2  , write:..    [.
2350: 80 9c e2 80 9d 5d 20 7e 3e 3e 20 2a 0a 0a 54 68  .....] ~>> *..Th
2360: 65 20 2a 20 6d 65 61 6e 73 3a 20 72 65 70 6c 61  e * means: repla
2370: 63 65 20 74 65 78 74 20 62 79 20 77 68 69 74 65  ce text by white
2380: 73 70 61 63 65 73 2e 0a 0a 53 69 6d 69 6c 61 72  spaces...Similar
2390: 6c 79 20 74 6f 20 67 72 61 6d 6d 61 72 20 72 75  ly to grammar ru
23a0: 6c 65 73 2c 20 79 6f 75 20 63 61 6e 20 61 64 64  les, you can add
23b0: 20 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 0a 20 20   conditions:..  
23c0: 20 20 5c 77 2b 6c 79 20 3c 3c 2d 20 6d 6f 72 70    \w+ly <<- morp
23d0: 68 28 5c 30 2c 20 22 61 64 76 65 72 62 22 29 20  h(\0, "adverb") 
23e0: 7e 3e 3e 20 2a 0a 0a 59 6f 75 20 63 61 6e 20 61  ~>> *..You can a
23f0: 6c 73 6f 20 72 65 6d 6f 76 65 20 61 20 67 72 6f  lso remove a gro
2400: 75 70 20 72 65 66 65 72 65 6e 63 65 3a 0a 0a 20  up reference:.. 
2410: 20 20 20 74 68 65 73 65 20 28 5c 77 2b 29 20 28     these (\w+) (
2420: 5c 77 2b 29 20 3c 3c 2d 20 6d 6f 72 70 68 28 5c  \w+) <<- morph(\
2430: 31 2c 20 22 61 64 6a 65 63 74 69 76 65 22 29 20  1, "adjective") 
2440: 61 6e 64 20 6d 6f 72 70 68 28 5c 32 2c 20 22 6e  and morph(\2, "n
2450: 6f 75 6e 22 29 20 7e 31 3e 3e 20 2a 0a 20 20 20  oun") ~1>> *.   
2460: 20 28 61 6d 7c 61 72 65 7c 69 73 7c 77 65 72 65   (am|are|is|were
2470: 7c 77 61 73 29 20 28 61 6c 6c 29 20 3c 3c 2d 20  |was) (all) <<- 
2480: 7e 32 3e 3e 20 2a 0a 20 20 20 20 61 73 20 70 65  ~2>> *.    as pe
2490: 72 20 75 73 75 61 6c 20 3c 3c 2d 20 7e 3e 3e 20  r usual <<- ~>> 
24a0: 2a 0a 0a 57 69 74 68 20 74 68 65 73 65 20 72 75  *..With these ru
24b0: 6c 65 73 2c 20 79 6f 75 20 67 65 74 20 74 68 65  les, you get the
24c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 6e 74 65   following sente
24d0: 6e 63 65 73 3a 0a 0a 20 20 20 20 54 68 65 73 65  nces:..    These
24e0: 20 20 63 61 74 73 20 20 61 72 65 20 62 6c 61 63    cats  are blac
24f0: 6b 73 2e 0a 20 20 20 20 54 68 65 73 65 20 63 61  ks..    These ca
2500: 74 73 20 61 72 65 20 20 62 6c 61 63 6b 73 20 2e  ts are  blacks .
2510: 0a 20 20 20 20 54 68 65 73 65 20 63 61 74 73 20  .    These cats 
2520: 61 72 65 20 20 20 20 20 20 20 20 20 20 20 20 62  are            b
2530: 6c 61 63 6b 73 2e 0a 20 20 20 20 54 68 65 73 65  lacks..    These
2540: 20 20 20 20 20 20 20 20 20 63 61 74 73 20 20 61           cats  a
2550: 72 65 20 20 20 20 20 62 6c 61 63 6b 73 2e 0a 20  re     blacks.. 
2560: 20 20 20 54 68 65 73 65 20 20 20 20 20 20 20 20     These        
2570: 20 63 61 74 73 20 61 72 65 20 20 20 20 20 20 20   cats are       
2580: 20 20 20 20 20 20 20 62 6c 61 63 6b 73 2e 0a 0a         blacks...
2590: 54 68 65 73 65 20 67 72 61 6d 6d 61 72 20 6d 69  These grammar mi
25a0: 73 74 61 6b 65 73 20 63 61 6e 20 62 65 20 64 65  stakes can be de
25b0: 74 65 63 74 65 64 20 77 69 74 68 20 6f 6e 65 20  tected with one 
25c0: 73 69 6d 70 6c 65 20 72 75 6c 65 3a 0a 0a 20 20  simple rule:..  
25d0: 20 20 74 68 65 73 65 20 2b 28 5c 77 2b 29 20 2b    these +(\w+) +
25e0: 61 72 65 20 2b 28 5c 77 2b 73 29 0a 20 20 20 20  are +(\w+s).    
25f0: 20 20 20 20 3c 3c 2d 20 6d 6f 72 70 68 28 5c 31      <<- morph(\1
2600: 2c 20 22 6e 6f 75 6e 22 29 20 61 6e 64 20 6d 6f  , "noun") and mo
2610: 72 70 68 28 5c 32 2c 20 22 70 6c 75 72 61 6c 22  rph(\2, "plural"
2620: 29 0a 20 20 20 20 20 20 20 20 2d 32 3e 3e 20 5f  ).        -2>> _
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2640: 41 64 6a 65 63 74 69 76 65 73 20 61 72 65 20 69  Adjectives are i
2650: 6e 76 61 72 69 61 62 6c 65 2e 0a 0a 49 6e 73 74  nvariable...Inst
2660: 65 61 64 20 6f 66 20 72 65 70 6c 61 63 69 6e 67  ead of replacing
2670: 20 74 65 78 74 20 77 69 74 68 20 77 68 69 74 65   text with white
2680: 73 70 61 63 65 73 2c 20 79 6f 75 20 63 61 6e 20  spaces, you can 
2690: 72 65 70 6c 61 63 65 20 74 65 78 74 20 77 69 74  replace text wit
26a0: 68 20 40 2e 0a 0a 20 20 20 20 68 74 74 70 73 3f  h @...    https?
26b0: 3a 2f 2f 5c 53 2b 20 3c 3c 2d 20 7e 3e 3e 20 40  ://\S+ <<- ~>> @
26c0: 0a 0a 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  ..This is useful
26d0: 20 69 66 20 61 74 20 66 69 72 73 74 20 70 61 73   if at first pas
26e0: 73 20 79 6f 75 20 77 72 69 74 65 20 72 75 6c 65  s you write rule
26f0: 73 20 74 6f 20 63 68 65 63 6b 20 73 75 63 63 65  s to check succe
2700: 73 73 69 76 65 20 77 68 69 74 65 73 70 61 63 65  ssive whitespace
2710: 73 2e 0a 40 20 61 72 65 20 61 75 74 6f 6d 61 74  s..@ are automat
2720: 69 63 61 6c 6c 79 20 72 65 6d 6f 76 65 64 20 61  ically removed a
2730: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73  t the second pas
2740: 73 2e 0a 0a 59 6f 75 20 63 61 6e 20 61 6c 73 6f  s...You can also
2750: 20 72 65 70 6c 61 63 65 20 61 6e 79 20 74 65 78   replace any tex
2760: 74 20 61 73 20 79 6f 75 20 77 69 73 68 2e 0a 0a  t as you wish...
2770: 20 20 20 20 4d 69 73 74 65 72 20 3c 3c 2d 20 7e      Mister <<- ~
2780: 3e 3e 20 4d 72 0a 20 20 20 20 28 4d 72 73 3f 29  >> Mr.    (Mrs?)
2790: 5b 2e 5d 20 3c 3c 2d 20 7e 3e 3e 20 5c 31 0a 0a  [.] <<- ~>> \1..
27a0: 0a 23 23 23 20 44 69 73 61 6d 62 69 67 75 61 74  .### Disambiguat
27b0: 69 6f 6e 0a 0a 57 68 65 6e 20 47 72 61 6d 6d 61  ion..When Gramma
27c0: 6c 65 63 74 65 20 61 6e 61 6c 79 73 65 73 20 61  lecte analyses a
27d0: 20 77 6f 72 64 20 77 69 74 68 20 6d 6f 72 70 68   word with morph
27e0: 2c 20 62 65 66 6f 72 65 20 72 65 71 75 65 73 74  , before request
27f0: 69 6e 67 20 74 68 65 0a 50 4f 53 20 74 61 67 73  ing the.POS tags
2800: 20 74 6f 20 74 68 65 20 64 69 63 74 69 6f 6e 61   to the dictiona
2810: 72 79 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  ry, it checks if
2820: 20 74 68 65 72 65 20 69 73 20 61 20 73 74 6f 72   there is a stor
2830: 65 64 20 6d 61 72 6b 65 72 20 66 6f 72 20 74 68  ed marker for th
2840: 65 0a 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65  e.position where
2850: 20 74 68 65 20 77 6f 72 64 20 69 73 2e 20 49 66   the word is. If
2860: 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 72 6b   there is a mark
2870: 65 72 2c 20 47 72 61 6d 6d 61 6c 65 63 74 65 20  er, Grammalecte 
2880: 75 73 65 73 20 74 68 65 20 73 74 6f 72 65 64 0a  uses the stored.
2890: 64 61 74 61 20 61 6e 64 20 64 6f 6e e2 80 99 74  data and don...t
28a0: 20 6d 61 6b 65 20 72 65 71 75 65 73 74 20 74 6f   make request to
28b0: 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 2e   the dictionary.
28c0: 0a 0a 54 68 65 20 64 69 73 61 6d 62 69 67 75 61  ..The disambigua
28d0: 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20 73 74  tion commands st
28e0: 6f 72 65 20 50 4f 53 20 74 61 67 73 20 61 74 20  ore POS tags at 
28f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  the position of 
2900: 61 20 77 6f 72 64 2e 0a 0a 54 68 65 72 65 20 61  a word...There a
2910: 72 65 20 33 20 63 6f 6d 6d 61 6e 64 73 20 66 6f  re 3 commands fo
2920: 72 20 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e  r disambiguation
2930: 2e 0a 0a 60 73 65 6c 65 63 74 28 6e 2c 20 70 61  ...`select(n, pa
2940: 74 74 65 72 6e 29 60 0a 0a 3e 20 20 20 73 74 6f  ttern)`..>   sto
2950: 72 65 73 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  res at position 
2960: 6e 20 6f 6e 6c 79 20 74 68 65 20 50 4f 53 20 74  n only the POS t
2970: 61 67 73 20 6f 66 20 74 68 65 20 77 6f 72 64 20  ags of the word 
2980: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 70 61 74  matching the pat
2990: 74 65 72 6e 2e 0a 0a 60 65 78 63 6c 75 64 65 28  tern...`exclude(
29a0: 6e 2c 20 70 61 74 74 65 72 6e 29 60 0a 0a 3e 20  n, pattern)`..> 
29b0: 20 20 73 74 6f 72 65 73 20 61 74 20 70 6f 73 69    stores at posi
29c0: 74 69 6f 6e 20 6e 20 74 68 65 20 50 4f 53 20 74  tion n the POS t
29d0: 61 67 73 20 6f 66 20 74 68 65 20 77 6f 72 64 2c  ags of the word,
29e0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 6d 61   except those ma
29f0: 74 63 68 69 6e 67 20 74 68 65 0a 20 20 20 20 70  tching the.    p
2a00: 61 74 74 65 72 6e 2e 0a 0a 60 64 65 66 69 6e 65  attern...`define
2a10: 28 6e 2c 20 5b 64 65 66 69 6e 69 74 69 6f 6e 73  (n, [definitions
2a20: 5d 29 60 0a 0a 3e 20 20 20 73 74 6f 72 65 73 20  ])`..>   stores 
2a30: 61 74 20 70 6f 73 69 74 69 6f 6e 20 6e 20 74 68  at position n th
2a40: 65 20 50 4f 53 20 74 61 67 73 20 69 6e 20 64 65  e POS tags in de
2a50: 66 69 6e 69 74 69 6f 6e 73 20 28 61 20 6c 69 73  finitions (a lis
2a60: 74 20 6f 66 20 73 74 72 69 6e 67 73 29 2e 0a 0a  t of strings)...
2a70: 45 78 61 6d 70 6c 65 73 3a 0a 0a 20 20 20 20 3d  Examples:..    =
2a80: 3e 3e 20 73 65 6c 65 63 74 28 5c 31 2c 20 22 70  >> select(\1, "p
2a90: 6f 3a 6e 6f 75 6e 20 69 73 3a 70 6c 22 29 0a 20  o:noun is:pl"). 
2aa0: 20 20 20 3d 3e 3e 20 65 78 63 6c 75 64 65 28 5c     =>> exclude(\
2ab0: 31 2c 20 22 70 6f 3a 76 65 72 62 22 29 0a 20 20  1, "po:verb").  
2ac0: 20 20 3d 3e 3e 20 64 65 66 69 6e 65 28 5c 31 2c    =>> define(\1,
2ad0: 20 5b 22 70 6f 3a 61 64 76 22 5d 29 0a 20 20 20   ["po:adv"]).   
2ae0: 20 3d 3e 3e 20 65 78 63 6c 75 64 65 28 5c 31 2c   =>> exclude(\1,
2af0: 20 22 70 6f 3a 76 65 72 62 22 29 20 61 6e 64 20   "po:verb") and 
2b00: 64 65 66 69 6e 65 28 5c 32 2c 20 5b 22 70 6f 3a  define(\2, ["po:
2b10: 61 64 76 22 5d 29 20 61 6e 64 20 73 65 6c 65 63  adv"]) and selec
2b20: 74 28 5c 33 2c 20 22 70 6f 3a 61 64 76 22 29 0a  t(\3, "po:adv").
2b30: 0a 4e 6f 74 65 3a 20 73 65 6c 65 63 74 28 29 2c  .Note: select(),
2b40: 20 65 78 63 6c 75 64 65 28 29 20 61 6e 64 20 64   exclude() and d
2b50: 65 66 69 6e 65 28 29 20 41 4c 57 41 59 53 20 72  efine() ALWAYS r
2b60: 65 74 75 72 6e 20 54 72 75 65 2e 0a 0a 49 66 20  eturn True...If 
2b70: 73 65 6c 65 63 74 28 29 20 61 6e 64 20 65 78 63  select() and exc
2b80: 6c 75 64 65 28 29 20 67 65 6e 65 72 61 74 65 20  lude() generate 
2b90: 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2c 20 6e  an empty list, n
2ba0: 6f 20 6d 61 72 6b 65 72 20 69 73 20 73 65 74 2e  o marker is set.
2bb0: 0a 0a 57 69 74 68 20 64 65 66 69 6e 65 2c 20 79  ..With define, y
2bc0: 6f 75 20 6d 75 73 74 20 73 65 74 20 61 20 6c 69  ou must set a li
2bd0: 73 74 20 6f 66 20 50 4f 53 20 74 61 67 73 2e 20  st of POS tags. 
2be0: 45 78 61 6d 70 6c 65 3a 0a 0a 20 20 20 20 64 65  Example:..    de
2bf0: 66 69 6e 65 28 5c 31 2c 20 5b 22 70 6f 3a 6e 6f  fine(\1, ["po:no
2c00: 6d 20 69 73 3a 70 6c 75 72 22 2c 20 22 70 6f 3a  m is:plur", "po:
2c10: 61 64 6a 20 69 73 3a 73 69 6e 67 22 2c 20 22 70  adj is:sing", "p
2c20: 6f 3a 61 64 76 22 5d 29 0a 0a 0a 23 23 23 20 43  o:adv"])...### C
2c30: 6f 6e 64 69 74 69 6f 6e 73 0a 0a 43 6f 6e 64 69  onditions..Condi
2c40: 74 69 6f 6e 73 20 61 72 65 20 50 79 74 68 6f 6e  tions are Python
2c50: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
2c60: 65 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 61  ey must return a
2c70: 20 76 61 6c 75 65 2c 20 77 68 69 63 68 20 77 69   value, which wi
2c80: 6c 6c 20 62 65 0a 65 76 61 6c 75 61 74 65 64 20  ll be.evaluated 
2c90: 61 73 20 62 6f 6f 6c 65 61 6e 2e 20 59 6f 75 20  as boolean. You 
2ca0: 63 61 6e 20 75 73 65 20 74 68 65 20 75 73 75 61  can use the usua
2cb0: 6c 20 50 79 74 68 6f 6e 20 73 79 6e 74 61 78 20  l Python syntax 
2cc0: 61 6e 64 20 6c 69 62 72 61 72 69 65 73 2e 0a 0a  and libraries...
2cd0: 59 6f 75 20 63 61 6e 20 63 61 6c 6c 20 70 61 74  You can call pat
2ce0: 74 65 72 6e 20 73 75 62 67 72 6f 75 70 73 20 76  tern subgroups v
2cf0: 69 61 20 5c 30 2c 20 5c 31 2c 20 5c 32 e2 80 a6  ia \0, \1, \2...
2d00: 0a 0a 45 78 61 6d 70 6c 65 3a 0a 0a 20 20 20 20  ..Example:..    
2d10: 74 68 65 73 65 20 28 5c 77 2b 29 0a 20 20 20 20  these (\w+).    
2d20: 20 20 20 20 3c 3c 2d 20 5c 31 20 3d 3d 20 22 6d      <<- \1 == "m
2d30: 61 6e 22 20 2d 31 3e 3e 20 6d 65 6e 20 20 20 20  an" -1>> men    
2d40: 20 20 20 20 23 20 4d 61 6e 20 69 73 20 61 20 73      # Man is a s
2d50: 69 6e 67 75 6c 61 72 20 6e 6f 75 6e 2e 20 55 73  ingular noun. Us
2d60: 65 20 74 68 65 20 70 6c 75 72 61 6c 20 66 6f 72  e the plural for
2d70: 6d 3a 0a 0a 59 6f 75 20 63 61 6e 20 61 6c 73 6f  m:..You can also
2d80: 20 61 70 70 6c 79 20 66 75 6e 63 74 69 6f 6e 73   apply functions
2d90: 20 74 6f 20 73 75 62 67 72 6f 75 70 73 20 6c 69   to subgroups li
2da0: 6b 65 3a 0a 0a 20 20 20 20 5c 31 2e 73 74 61 72  ke:..    \1.star
2db0: 74 73 77 69 74 68 28 22 61 22 29 0a 20 20 20 20  tswith("a").    
2dc0: 5c 33 2e 69 73 6c 6f 77 65 72 28 29 0a 20 20 20  \3.islower().   
2dd0: 20 72 65 2e 73 65 61 72 63 68 28 22 70 61 74 74   re.search("patt
2de0: 65 72 6e 22 2c 20 5c 32 29 0a 0a 0a 23 23 23 20  ern", \2)...### 
2df0: 53 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f  Standard functio
2e00: 6e 73 0a 0a 60 77 6f 72 64 28 6e 29 60 0a 0a 3e  ns..`word(n)`..>
2e10: 20 20 20 63 61 74 63 68 65 73 20 74 68 65 20 6e     catches the n
2e20: 74 68 20 6e 65 78 74 20 77 6f 72 64 20 61 66 74  th next word aft
2e30: 65 72 20 74 68 65 20 70 61 74 74 65 72 6e 20 28  er the pattern (
2e40: 73 65 70 61 72 61 74 65 64 20 6f 6e 6c 79 20 62  separated only b
2e50: 79 20 77 68 69 74 65 20 73 70 61 63 65 73 29 2e  y white spaces).
2e60: 0a 3e 20 20 20 72 65 74 75 72 6e 73 20 4e 6f 6e  .>   returns Non
2e70: 65 20 69 66 20 6e 6f 20 77 6f 72 64 20 63 61 75  e if no word cau
2e80: 67 68 74 0a 0a 60 77 6f 72 64 28 2d 6e 29 60 0a  ght..`word(-n)`.
2e90: 0a 3e 20 20 20 63 61 74 63 68 65 73 20 74 68 65  .>   catches the
2ea0: 20 6e 74 68 20 6e 65 78 74 20 77 6f 72 64 20 62   nth next word b
2eb0: 65 66 6f 72 65 20 74 68 65 20 70 61 74 74 65 72  efore the patter
2ec0: 6e 20 28 73 65 70 61 72 61 74 65 64 20 6f 6e 6c  n (separated onl
2ed0: 79 20 62 79 20 77 68 69 74 65 20 73 70 61 63 65  y by white space
2ee0: 73 29 2e 0a 3e 20 20 20 72 65 74 75 72 6e 73 20  s)..>   returns 
2ef0: 4e 6f 6e 65 20 69 66 20 6e 6f 20 77 6f 72 64 20  None if no word 
2f00: 63 61 75 67 68 74 0a 0a 60 61 66 74 65 72 28 72  caught..`after(r
2f10: 65 67 65 78 5b 2c 20 6e 65 67 5f 72 65 67 65 78  egex[, neg_regex
2f20: 5d 29 60 0a 0a 3e 20 20 20 63 68 65 63 6b 73 20  ])`..>   checks 
2f30: 69 66 20 74 68 65 20 74 65 78 74 20 61 66 74 65  if the text afte
2f40: 72 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d 61  r the pattern ma
2f50: 74 63 68 65 73 20 74 68 65 20 72 65 67 65 78 2e  tches the regex.
2f60: 0a 0a 60 62 65 66 6f 72 65 28 72 65 67 65 78 5b  ..`before(regex[
2f70: 2c 20 6e 65 67 5f 72 65 67 65 78 5d 29 60 0a 0a  , neg_regex])`..
2f80: 3e 20 20 20 63 68 65 63 6b 73 20 69 66 20 74 68  >   checks if th
2f90: 65 20 74 65 78 74 20 62 65 66 6f 72 65 20 74 68  e text before th
2fa0: 65 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65  e pattern matche
2fb0: 73 20 74 68 65 20 72 65 67 65 78 2e 0a 0a 60 74  s the regex...`t
2fc0: 65 78 74 61 72 65 61 28 72 65 67 65 78 5b 2c 20  extarea(regex[, 
2fd0: 6e 65 67 5f 72 65 67 65 78 5d 29 60 0a 0a 3e 20  neg_regex])`..> 
2fe0: 20 20 20 63 68 65 63 6b 73 20 69 66 20 74 68 65     checks if the
2ff0: 20 66 75 6c 6c 20 74 65 78 74 20 6f 66 20 74 68   full text of th
3000: 65 20 63 68 65 63 6b 65 64 20 61 72 65 61 20 28  e checked area (
3010: 70 61 72 61 67 72 61 70 68 20 6f 72 20 73 65 6e  paragraph or sen
3020: 74 65 6e 63 65 29 20 6d 61 74 63 68 65 73 20 74  tence) matches t
3030: 68 65 20 72 65 67 65 78 2e 0a 0a 60 6d 6f 72 70  he regex...`morp
3040: 68 28 6e 2c 20 72 65 67 65 78 5b 2c 20 6e 65 67  h(n, regex[, neg
3050: 5f 72 65 67 65 78 5d 5b 2c 20 6e 6f 5f 77 6f 72  _regex][, no_wor
3060: 64 3d 46 61 6c 73 65 5d 29 60 0a 0a 3e 20 20 20  d=False])`..>   
3070: 63 68 65 63 6b 73 20 69 66 20 61 6c 6c 20 74 61  checks if all ta
3080: 67 73 20 6f 66 20 74 68 65 20 77 6f 72 64 20 69  gs of the word i
3090: 6e 20 67 72 6f 75 70 20 6e 20 6d 61 74 63 68 20  n group n match 
30a0: 74 68 65 20 72 65 67 65 78 2e 0a 3e 20 20 20 69  the regex..>   i
30b0: 66 20 6e 65 67 5f 72 65 67 65 78 20 3d 20 22 2a  f neg_regex = "*
30c0: 22 2c 20 72 65 74 75 72 6e 73 20 54 72 75 65 20  ", returns True 
30d0: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6d 6f 72 70  only if all morp
30e0: 68 6f 6c 6f 67 69 65 73 20 6d 61 74 63 68 20 74  hologies match t
30f0: 68 65 20 72 65 67 65 78 2e 0a 3e 20 20 20 69 66  he regex..>   if
3100: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
3110: 64 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 6e 2c  d at position n,
3120: 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
3130: 75 65 20 6f 66 20 6e 6f 5f 77 6f 72 64 2e 0a 0a  ue of no_word...
3140: 60 6d 6f 72 70 68 30 28 6e 2c 20 72 65 67 65 78  `morph0(n, regex
3150: 5b 2c 20 6e 65 67 5f 72 65 67 65 78 5d 5b 2c 20  [, neg_regex][, 
3160: 6e 6f 5f 77 6f 72 64 3d 46 61 6c 73 65 5d 29 60  no_word=False])`
3170: 0a 0a 3e 20 20 20 63 68 65 63 6b 73 20 69 66 20  ..>   checks if 
3180: 61 6c 6c 20 74 61 67 73 20 6f 66 20 74 68 65 20  all tags of the 
3190: 77 6f 72 64 20 69 6e 20 67 72 6f 75 70 20 6e 20  word in group n 
31a0: 6d 61 74 63 68 20 74 68 65 20 72 65 67 65 78 2e  match the regex.
31b0: 0a 3e 20 20 20 69 66 20 6e 65 67 5f 72 65 67 65  .>   if neg_rege
31c0: 78 20 3d 20 22 2a 22 2c 20 72 65 74 75 72 6e 73  x = "*", returns
31d0: 20 54 72 75 65 20 6f 6e 6c 79 20 69 66 20 61 6c   True only if al
31e0: 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6d  l morphologies m
31f0: 61 74 63 68 20 74 68 65 20 72 65 67 65 78 2e 0a  atch the regex..
3200: 3e 20 20 20 69 66 20 74 68 65 72 65 20 69 73 20  >   if there is 
3210: 6e 6f 20 77 6f 72 64 20 61 74 20 70 6f 73 69 74  no word at posit
3220: 69 6f 6e 20 6e 2c 20 72 65 74 75 72 6e 73 20 74  ion n, returns t
3230: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 6f 5f 77  he value of no_w
3240: 6f 72 64 2e 0a 0a 0a 60 6f 70 74 69 6f 6e 28 6f  ord....`option(o
3250: 70 74 69 6f 6e 5f 6e 61 6d 65 29 60 0a 0a 3e 20  ption_name)`..> 
3260: 20 20 72 65 74 75 72 6e 73 20 54 72 75 65 20 69    returns True i
3270: 66 20 6f 70 74 69 6f 6e 5f 6e 61 6d 65 20 69 73  f option_name is
3280: 20 61 63 74 69 76 61 74 65 64 20 65 6c 73 65 20   activated else 
3290: 46 61 6c 73 65 0a 0a 4e 6f 74 65 3a 20 74 68 65  False..Note: the
32a0: 20 61 6e 61 6c 79 73 69 73 20 69 73 20 64 6f 6e   analysis is don
32b0: 65 20 6f 6e 20 74 68 65 20 70 72 65 70 72 6f 63  e on the preproc
32c0: 65 73 73 65 64 20 74 65 78 74 2e 0a 0a 0a 23 23  essed text....##
32d0: 23 20 44 65 66 61 75 6c 74 20 76 61 72 69 61 62  # Default variab
32e0: 6c 65 73 0a 0a 60 73 43 6f 75 6e 74 72 79 60 0a  les..`sCountry`.
32f0: 0a 3e 20 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  .>   It contains
3300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 75   the current cou
3310: 6e 74 72 79 20 6c 6f 63 61 6c 65 20 6f 66 20 74  ntry locale of t
3320: 68 65 20 63 68 65 63 6b 65 64 20 70 61 72 61 67  he checked parag
3330: 72 61 70 68 2e 0a 0a 20 20 20 20 63 6f 6c 6f 75  raph...    colou
3340: 72 20 3c 3c 2d 20 73 43 6f 75 6e 74 72 79 20 3d  r <<- sCountry =
3350: 3d 20 22 55 53 22 20 2d 3e 3e 20 63 6f 6c 6f 72  = "US" ->> color
3360: 20 20 20 20 20 20 20 23 20 55 73 65 20 41 6d 65         # Use Ame
3370: 72 69 63 61 6e 20 45 6e 67 6c 69 73 68 20 73 70  rican English sp
3380: 65 6c 6c 69 6e 67 2e 0a 0a 0a 0a 23 23 23 20 45  elling.....### E
3390: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 73 75  xpressions in su
33a0: 67 67 65 73 74 69 6f 6e 20 6f 72 20 72 65 70 6c  ggestion or repl
33b0: 61 63 65 6d 65 6e 74 0a 0a 53 75 67 67 65 73 74  acement..Suggest
33c0: 69 6f 6e 73 20 73 74 61 72 74 65 64 20 62 79 20  ions started by 
33d0: 61 6e 20 65 71 75 61 6c 20 73 69 67 6e 20 61 72  an equal sign ar
33e0: 65 20 50 79 74 68 6f 6e 20 73 74 72 69 6e 67 20  e Python string 
33f0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 65 78 74 65  expressions.exte
3400: 6e 64 65 64 20 77 69 74 68 20 70 6f 73 73 69 62  nded with possib
3410: 6c 65 20 62 61 63 6b 20 72 65 66 65 72 65 6e 63  le back referenc
3420: 65 73 20 61 6e 64 20 6e 61 6d 65 64 20 64 65 66  es and named def
3430: 69 6e 69 74 69 6f 6e 73 3a 0a 0a 45 78 61 6d 70  initions:..Examp
3440: 6c 65 3a 0a 0a 20 20 20 20 3c 3c 2d 20 2d 3e 3e  le:..    <<- ->>
3450: 20 3d 27 22 27 20 2b 20 5c 31 2e 75 70 70 65 72   ='"' + \1.upper
3460: 28 29 20 2b 20 27 22 27 20 20 20 20 20 20 20 20  () + '"'        
3470: 20 23 20 57 69 74 68 20 75 70 70 65 72 63 61 73   # With uppercas
3480: 65 20 6c 65 74 74 65 72 73 20 61 6e 64 20 71 75  e letters and qu
3490: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 0a 20 20  otation marks.  
34a0: 20 20 3c 3c 2d 20 7e 3e 3e 20 3d 5c 31 2e 75 70    <<- ~>> =\1.up
34b0: 70 65 72 28 29 0a 0a 0a 23 23 20 54 6f 6b 65 6e  per()...## Token
34c0: 20 72 75 6c 65 73 0a 0a 54 6f 6b 65 6e 20 72 75   rules..Token ru
34d0: 6c 65 73 20 6d 75 73 74 20 62 65 20 64 65 66 69  les must be defi
34e0: 6e 65 64 20 77 69 74 68 69 6e 20 61 20 67 72 61  ned within a gra
34f0: 70 68 2e 0a 0a 0a 23 23 23 20 54 6f 6b 65 6e 73  ph....### Tokens
3500: 0a 0a 54 6f 6b 65 6e 73 20 63 61 6e 20 62 65 20  ..Tokens can be 
3510: 64 65 66 69 6e 65 64 20 69 6e 20 73 65 76 65 72  defined in sever
3520: 61 6c 20 77 61 79 73 3a 0a 0a 2a 20 56 61 6c 75  al ways:..* Valu
3530: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 65 20 74  e (meaning the t
3540: 65 78 74 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ext of the token
3550: 29 2e 20 45 78 61 6d 70 6c 65 73 3a 20 60 77 6f  ). Examples: `wo
3560: 72 64 60 2c 20 60 3c 73 74 61 72 74 3e 60 2c 20  rd`, `<start>`, 
3570: 60 3c 65 6e 64 3e 60 2c 20 60 2c 60 2e 0a 2a 20  `<end>`, `,`..* 
3580: 4c 65 6d 6d 61 3a 20 60 3e 6c 65 6d 6d 61 60 2e  Lemma: `>lemma`.
3590: 0a 2a 20 52 65 67 65 78 3a 20 60 7e 70 61 74 74  .* Regex: `~patt
35a0: 65 72 6e 60 2c 20 60 7e 70 61 74 74 65 72 6e c2  ern`, `~pattern.
35b0: ac 61 6e 74 69 70 61 74 74 65 72 6e 60 2e 0a 2a  .antipattern`..*
35c0: 20 52 65 67 65 78 20 6f 6e 20 6d 6f 72 70 68 6f   Regex on morpho
35d0: 6c 6f 67 69 65 73 3a 20 60 40 70 61 74 74 65 72  logies: `@patter
35e0: 6e 60 2c 20 60 40 70 61 74 74 65 72 6e c2 ac 61  n`, `@pattern..a
35f0: 6e 74 69 70 61 74 74 65 72 6e 60 2e 0a 2a 20 54  ntipattern`..* T
3600: 61 67 73 3a 20 60 2f 74 61 67 60 2e 0a 2a 20 4d  ags: `/tag`..* M
3610: 65 74 61 74 61 67 73 3a 20 2a 4e 41 4d 45 2e 20  etatags: *NAME. 
3620: 45 78 61 6d 70 6c 65 73 3a 20 60 2a 57 4f 52 44  Examples: `*WORD
3630: 60 2c 20 60 2a 4e 55 4d 60 2c 20 60 2a 53 49 47  `, `*NUM`, `*SIG
3640: 4e 60 2c 20 65 74 63 2e 0a 0a 53 65 6c 65 63 74  N`, etc...Select
3650: 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 3a 20 60  ion of tokens: `
3660: 5b 74 6f 6b 65 6e 31 7c 74 6f 6b 65 6e 32 7c 3e  [token1|token2|>
3670: 6c 65 6d 6d 61 31 7c 3e 6c 65 6d 6d 61 32 7c 7e  lemma1|>lemma2|~
3680: 70 61 74 74 65 72 6e 31 7c 40 70 61 74 74 65 72  pattern1|@patter
3690: 6e 31 7c e2 80 a6 5d 60 0a 0a 43 6f 6e 64 69 74  n1|...]`..Condit
36a0: 69 6f 6e 61 6c 20 74 6f 6b 65 6e 3a 20 60 3f 74  ional token: `?t
36b0: 6f 6b 65 6e c2 bf 60 0a 0a 43 6f 6e 64 69 74 69  oken..`..Conditi
36c0: 6f 6e 61 6c 20 73 65 6c 65 63 74 69 6f 6e 20 6f  onal selection o
36d0: 66 20 74 6f 6b 65 6e 3a 20 60 3f 5b 74 6f 6b 65  f token: `?[toke
36e0: 6e 31 7c 74 6f 6b 65 6e 32 7c e2 80 a6 5d c2 bf  n1|token2|...]..
36f0: 60 0a 0a 0a 23 23 23 20 54 6f 6b 65 6e 20 72 65  `...### Token re
3700: 66 65 72 65 6e 63 65 73 0a 0a 50 6f 73 69 74 69  ferences..Positi
3710: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ve references ar
3720: 65 20 64 65 66 69 6e 65 64 20 62 79 20 61 20 70  e defined by a p
3730: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
3740: 60 3e 3d 20 31 60 2e 20 45 78 61 6d 70 6c 65 73  `>= 1`. Examples
3750: 3a 20 5c 31 2c 20 5c 32 2c 20 5c 33 2c 20 65 74  : \1, \2, \3, et
3760: 63 2e 0a 49 66 20 74 68 65 72 65 20 69 73 20 61  c..If there is a
3770: 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 6f 6b 65  t least one toke
3780: 6e 20 73 65 74 20 62 65 74 77 65 65 6e 20 70 61  n set between pa
3790: 72 65 6e 74 68 65 73 69 73 2c 20 74 68 65 73 65  renthesis, these
37a0: 20 6e 75 6d 62 65 72 73 20 72 65 66 65 72 20 74   numbers refer t
37b0: 6f 20 74 6f 6b 65 6e 73 20 62 65 74 77 65 65 6e  o tokens between
37c0: 20 70 61 72 65 6e 74 68 65 73 69 73 2c 20 69 67   parenthesis, ig
37d0: 6e 6f 72 69 6e 67 20 61 6c 6c 20 6f 74 68 65 72  noring all other
37e0: 73 2e 0a 49 66 20 74 68 65 72 65 20 69 73 20 6e  s..If there is n
37f0: 6f 20 74 6f 6b 65 6e 20 62 65 74 77 65 65 6e 20  o token between 
3800: 70 61 72 65 6e 74 68 65 73 69 73 2c 20 74 68 65  parenthesis, the
3810: 73 65 20 6e 75 6d 62 65 72 73 20 72 65 66 65 72  se numbers refer
3820: 20 74 6f 20 74 6f 6b 65 6e 73 20 66 6f 75 6e 64   to tokens found
3830: 20 69 6e 20 6f 72 64 65 72 20 64 65 66 69 6e 65   in order define
3840: 64 20 62 79 20 74 68 65 20 72 75 6c 65 20 74 72  d by the rule tr
3850: 69 67 67 65 72 65 64 2e 0a 0a 4e 65 67 61 74 69  iggered...Negati
3860: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ve references ar
3870: 65 20 64 65 66 69 6e 65 64 20 62 79 20 61 20 6e  e defined by a n
3880: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
3890: 60 3c 3d 20 2d 31 60 2e 20 45 78 61 6d 70 6c 65  `<= -1`. Example
38a0: 73 3a 20 5c 2d 31 2c 20 5c 2d 32 2c 20 5c 2d 33  s: \-1, \-2, \-3
38b0: 2c 20 65 74 63 2e 0a 54 68 65 73 65 20 6e 75 6d  , etc..These num
38c0: 62 65 72 73 20 72 65 66 65 72 20 74 6f 20 74 68  bers refer to th
38d0: 65 20 74 6f 6b 65 6e 73 20 62 65 67 69 6e 6e 69  e tokens beginni
38e0: 6e 67 20 62 79 20 74 68 65 20 6c 61 73 74 20 6f  ng by the last o
38f0: 6e 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20  ne found by the 
3900: 72 75 6c 65 20 74 72 69 67 67 65 72 65 64 2e 0a  rule triggered..
3910: 0a 45 78 61 6d 70 6c 65 73 3a 0a 0a 20 20 20 20  .Examples:..    
3920: 74 6f 6b 65 6e 73 3a 20 20 20 20 20 20 20 20 20  tokens:         
3930: 20 20 20 20 61 6c 70 68 61 20 20 20 20 20 20 20      alpha       
3940: 62 65 74 61 20 20 20 20 20 20 20 20 67 61 6d 6d  beta        gamm
3950: 61 20 20 20 20 20 20 20 64 65 6c 74 61 20 20 20  a       delta   
3960: 20 20 20 20 65 70 73 69 6c 6f 6e 0a 20 20 20 20      epsilon.    
3970: 70 6f 73 69 74 69 76 65 20 72 65 66 73 3a 20 20  positive refs:  
3980: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
3990: 32 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20  2           3   
39a0: 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
39b0: 20 20 20 20 35 0a 20 20 20 20 6e 65 67 61 74 69      5.    negati
39c0: 76 65 20 72 65 66 73 3a 20 20 20 20 20 20 2d 35  ve refs:      -5
39d0: 20 20 20 20 20 20 20 20 20 20 2d 34 20 20 20 20            -4    
39e0: 20 20 20 20 20 20 2d 33 20 20 20 20 20 20 20 20        -3        
39f0: 20 20 2d 32 20 20 20 20 20 20 20 20 20 20 2d 31    -2          -1
3a00: 0a 0a 20 20 20 20 74 6f 6b 65 6e 73 3a 20 20 20  ..    tokens:   
3a10: 20 20 20 20 20 20 20 20 20 20 61 6c 70 68 61 20            alpha 
3a20: 20 20 20 20 20 20 28 62 65 74 61 29 20 20 20 20        (beta)    
3a30: 20 20 67 61 6d 6d 61 20 20 20 20 20 20 20 28 64    gamma       (d
3a40: 65 6c 74 61 29 20 20 20 20 20 65 70 73 69 6c 6f  elta)     epsilo
3a50: 6e 0a 20 20 20 20 70 6f 73 69 74 69 76 65 20 72  n.    positive r
3a60: 65 66 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  efs:            
3a70: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 0a                2.
3a90: 20 20 20 20 6e 65 67 61 74 69 76 65 20 72 65 66      negative ref
3aa0: 73 3a 20 20 20 20 20 20 2d 35 20 20 20 20 20 20  s:      -5      
3ab0: 20 20 20 20 2d 34 20 20 20 20 20 20 20 20 20 20      -4          
3ac0: 2d 33 20 20 20 20 20 20 20 20 20 20 2d 32 20 20  -3          -2  
3ad0: 20 20 20 20 20 20 20 20 2d 31 0a 0a 20 20 20 20          -1..    
3ae0: 74 6f 6b 65 6e 73 3a 20 20 20 20 20 20 20 20 20  tokens:         
3af0: 20 20 20 20 61 6c 70 68 61 20 20 20 20 20 20 20      alpha       
3b00: 28 62 65 74 61 29 20 20 20 20 20 20 3f 67 61 6d  (beta)      ?gam
3b10: 6d 61 c2 bf 20 20 20 20 20 28 64 65 6c 74 61 29  ma..     (delta)
3b20: 20 20 20 20 20 65 70 73 69 6c 6f 6e 0a 20 20 20       epsilon.   
3b30: 20 70 6f 73 69 74 69 76 65 20 72 65 66 73 3a 20   positive refs: 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
3b60: 20 20 20 20 20 20 20 20 20 32 0a 20 20 20 20 6e           2.    n
3b70: 65 67 61 74 69 76 65 20 72 65 66 73 3a 20 20 20  egative refs:   
3b80: 20 20 20 28 2d 34 2f 2d 35 29 20 20 20 20 20 28     (-4/-5)     (
3b90: 2d 33 2f 2d 34 29 20 20 20 20 20 28 2d 33 2f 6e  -3/-4)     (-3/n
3ba0: 6f 6e 65 29 20 20 20 2d 32 20 20 20 20 20 20 20  one)   -2       
3bb0: 20 20 20 2d 31 0a 0a                                -1..