parsepp  Hex Artifact Content

Artifact d5dc0ea6038c26d968aceaf7f0097c19e2326b6e:

Wiki page [parsepp] by anonymous 2016-01-02 08:59:03.
0000: 44 20 32 30 31 36 2d 30 31 2d 30 32 54 30 38 3a  D 2016-01-02T08:
0010: 35 39 3a 30 33 2e 31 35 37 0a 4c 20 70 61 72 73  59:03.157.L pars
0020: 65 70 70 0a 50 20 36 62 36 66 65 39 66 61 38 65  epp.P 6b6fe9fa8e
0030: 32 36 38 33 63 34 66 35 31 62 34 30 39 34 30 63  2683c4f51b40940c
0040: 32 39 38 34 31 35 64 34 30 61 38 65 62 65 0a 55  298415d40a8ebe.U
0050: 20 61 6e 6f 6e 79 6d 6f 75 73 0a 57 20 32 39 39   anonymous.W 299
0060: 38 0a 70 61 72 73 65 70 70 20 69 73 20 61 6e 20  8.parsepp is an 
0070: 65 78 70 65 72 69 6d 65 6e 74 61 6c 20 43 2b 2b  experimental C++
0080: 20 6c 69 62 72 61 72 79 20 66 6f 72 20 63 72 65   library for cre
0090: 61 74 69 6e 67 20 63 75 73 74 6f 6d 20 70 61 72  ating custom par
00a0: 73 65 72 73 2c 0d 0a 73 69 6d 69 6c 61 72 20 74  sers,..similar t
00b0: 6f 20 5b 68 74 74 70 3a 2f 2f 73 70 69 72 69 74  o [http://spirit
00c0: 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
00d0: 2f 7c 42 6f 6f 73 74 2e 53 70 69 72 69 74 5d 20  /|Boost.Spirit] 
00e0: 61 6e 64 0d 0a 5b 68 74 74 70 3a 2f 2f 63 6f 64  and..[http://cod
00f0: 65 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 2f 70 2f 79  e.google.com/p/y
0100: 61 72 64 70 61 72 73 65 72 2f 7c 59 41 52 44 5d  ardparser/|YARD]
0110: 2e 20 55 6e 6c 69 6b 65 20 53 70 69 72 69 74 2c  . Unlike Spirit,
0120: 20 74 68 69 73 20 66 72 61 6d 65 77 6f 72 6b 0d   this framework.
0130: 0a 69 73 20 71 75 69 74 65 20 73 6d 61 6c 6c 2e  .is quite small.
0140: 0d 0a 0d 0a 70 61 72 73 65 70 70 20 69 73 20 62  ....parsepp is b
0150: 61 73 65 64 20 6f 6e 20 6d 61 6e 79 20 69 6e 73  ased on many ins
0160: 69 67 68 74 66 75 6c 20 64 69 73 63 75 73 73 69  ightful discussi
0170: 6f 6e 73 20 77 69 74 68 20 43 6f 6c 69 6e 20 48  ons with Colin H
0180: 69 72 73 63 68 0d 0a 72 65 67 61 72 64 69 6e 67  irsch..regarding
0190: 20 68 69 73 20 5b 68 74 74 70 3a 2f 2f 63 6f 64   his [http://cod
01a0: 65 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 2f 70 2f 70  e.google.com/p/p
01b0: 65 67 74 6c 7c 50 45 47 54 4c 5d 20 6c 69 62 72  egtl|PEGTL] libr
01c0: 61 72 79 20 28 61 6e 64 20 6d 79 0d 0a 73 75 62  ary (and my..sub
01d0: 73 65 71 75 65 6e 74 20 76 61 72 69 61 6e 74 20  sequent variant 
01e0: 6f 66 20 74 68 61 74 20 63 6f 64 65 2c 0d 0a 5b  of that code,..[
01f0: 68 74 74 70 3a 2f 2f 77 61 6e 64 65 72 69 6e 67  http://wandering
0200: 68 6f 72 73 65 2e 6e 65 74 2f 63 67 69 2d 62 69  horse.net/cgi-bi
0210: 6e 2f 70 61 72 73 65 30 78 2e 63 67 69 7c 70 61  n/parse0x.cgi|pa
0220: 72 73 65 30 78 5d 29 2e 0d 0a 0d 0a 49 6e 20 73  rse0x]).....In s
0230: 68 6f 72 74 2c 20 70 61 72 73 65 70 70 20 69 73  hort, parsepp is
0240: 20 61 20 74 6f 6f 6c 20 66 6f 72 20 77 72 69 74   a tool for writ
0250: 69 6e 67 20 63 75 73 74 6f 6d 20 70 61 72 73 65  ing custom parse
0260: 72 73 20 75 73 69 6e 67 0d 0a 74 65 6d 70 6c 61  rs using..templa
0270: 74 65 20 70 72 6f 67 72 61 6d 6d 69 6e 67 20 74  te programming t
0280: 65 63 68 6e 69 71 75 65 73 2e 20 49 6e 20 73 6f  echniques. In so
0290: 6d 65 20 77 61 79 73 20 69 74 20 69 73 20 73 69  me ways it is si
02a0: 6d 69 6c 61 72 0d 0a 74 6f 20 74 68 65 20 76 65  milar..to the ve
02b0: 6e 65 72 61 62 6c 65 20 3c 74 74 3e 6c 65 78 3c  nerable <tt>lex<
02c0: 2f 74 74 3e 20 61 6e 64 20 3c 74 74 3e 79 61 63  /tt> and <tt>yac
02d0: 63 3c 2f 74 74 3e 20 74 6f 6f 6c 73 2c 20 62 75  c</tt> tools, bu
02e0: 74 0d 0a 74 68 69 73 20 73 74 79 6c 65 20 6f 66  t..this style of
02f0: 20 70 61 72 73 65 72 20 69 73 20 3c 65 6d 3e 6d   parser is <em>m
0300: 75 63 68 3c 2f 65 6d 3e 20 65 61 73 69 65 72 20  uch</em> easier 
0310: 61 6e 64 20 73 61 66 65 72 20 74 6f 0d 0a 77 6f  and safer to..wo
0320: 72 6b 20 77 69 74 68 20 61 6e 64 20 61 6c 73 6f  rk with and also
0330: 20 68 61 73 20 6e 6f 20 73 65 70 61 72 61 74 65   has no separate
0340: 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 2f 70 61   tokenization/pa
0350: 72 73 69 6e 67 0d 0a 73 74 65 70 73 20 28 74 68  rsing..steps (th
0360: 65 79 20 61 72 65 20 64 6f 6e 65 20 61 74 20 74  ey are done at t
0370: 68 65 20 73 61 6d 65 20 74 69 6d 65 29 2e 0d 0a  he same time)...
0380: 0d 0a 3c 68 32 3e 4c 69 63 65 6e 73 65 3c 2f 68  ..<h2>License</h
0390: 32 3e 0d 0a 50 75 62 6c 69 63 20 44 6f 6d 61 69  2>..Public Domai
03a0: 6e 2e 20 44 6f 20 61 73 20 79 6f 75 20 77 69 6c  n. Do as you wil
03b0: 6c 2e 0d 0a 0d 0a 3c 68 32 3e 44 6f 77 6e 6c 6f  l.....<h2>Downlo
03c0: 61 64 69 6e 67 3c 2f 68 32 3e 0d 0a 0d 0a 53 65  ading</h2>....Se
03d0: 65 20 74 68 65 20 5b 64 6f 77 6e 6c 6f 61 64 7c  e the [download|
03e0: 64 6f 77 6e 6c 6f 61 64 73 20 70 61 67 65 5d 2e  downloads page].
03f0: 0d 0a 0d 0a 3c 68 32 3e 46 65 61 74 75 72 65 73  ....<h2>Features
0400: 3c 2f 68 32 3e 0d 0a 0d 0a 3c 75 6c 3e 0d 0a 3c  </h2>....<ul>..<
0410: 6c 69 3e 41 20 66 61 69 72 6c 79 20 73 6d 61 6c  li>A fairly smal
0420: 6c 20 68 65 61 64 65 72 2d 6f 6e 6c 79 20 69 6d  l header-only im
0430: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 28 74 65  plementation (te
0440: 6d 70 6c 61 74 65 73 2d 69 6e 74 65 6e 73 69 76  mplates-intensiv
0450: 65 29 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 55 73  e).</li>..<li>Us
0460: 65 73 20 6f 6e 6c 79 20 49 53 4f 20 43 2b 2b 20  es only ISO C++ 
0470: 53 74 61 6e 64 61 72 64 73 2d 73 70 65 63 69 66  Standards-specif
0480: 69 65 64 20 74 65 63 68 6e 69 71 75 65 73 2e 3c  ied techniques.<
0490: 2f 6c 69 3e 0d 0a 3c 6c 69 3e 4e 6f 20 33 72 64  /li>..<li>No 3rd
04a0: 2d 70 61 72 74 79 20 63 6f 64 65 20 64 65 70 65  -party code depe
04b0: 6e 64 65 6e 63 69 65 73 20 28 6f 6e 6c 79 20 74  ndencies (only t
04c0: 68 65 20 53 54 4c 29 2e 3c 2f 6c 69 3e 0d 0a 3c  he STL).</li>..<
04d0: 6c 69 3e 46 61 69 72 6c 79 20 77 65 6c 6c 20 64  li>Fairly well d
04e0: 6f 63 75 6d 65 6e 74 65 64 2c 20 69 6e 20 74 68  ocumented, in th
04f0: 65 20 66 6f 72 6d 20 6f 66 20 5b 68 74 74 70 3a  e form of [http:
0500: 2f 2f 77 77 77 2e 66 69 78 69 74 68 65 72 65 2e  //www.fixithere.
0510: 6e 65 74 2f 73 6b 79 2d 63 75 73 74 6f 6d 65 72  net/sky-customer
0520: 2d 73 65 72 76 69 63 65 2f 7c 74 68 69 73 20 77  -service/|this w
0530: 65 62 20 73 69 74 65 5d 20 61 6e 64 20 74 68 65  eb site] and the
0540: 0d 0a 41 50 49 20 64 6f 63 73 20 28 69 6e 20 74  ..API docs (in t
0550: 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 73 29  he header files)
0560: 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 52 65 61 6c  .</li>..<li>Real
0570: 6c 79 20 65 61 73 79 20 74 6f 20 75 73 65 2e 20  ly easy to use. 
0580: 54 68 65 20 63 6f 72 65 20 69 6e 74 65 72 66 61  The core interfa
0590: 63 65 20 72 65 76 6f 6c 76 65 73 20 61 72 6f 75  ce revolves arou
05a0: 6e 64 0d 0a 6f 6e 6c 79 20 61 20 73 6d 61 6c 6c  nd..only a small
05b0: 20 68 61 6e 64 66 75 6c 20 6f 66 20 66 75 6e 63   handful of func
05c0: 74 69 6f 6e 73 20 61 6e 64 20 61 20 75 73 65 66  tions and a usef
05d0: 75 6c 20 73 65 74 20 6f 66 0d 0a 70 61 72 73 69  ul set of..parsi
05e0: 6e 67 20 72 75 6c 65 73 2e 3c 2f 6c 69 3e 0d 0a  ng rules.</li>..
05f0: 3c 6c 69 3e 43 61 6e 20 62 65 20 75 73 65 64 20  <li>Can be used 
0600: 74 6f 20 67 65 6e 65 72 61 74 65 20 70 61 72 73  to generate pars
0610: 65 72 73 20 6f 66 20 61 72 62 69 74 72 61 72 79  ers of arbitrary
0620: 20 63 6f 6d 70 6c 65 78 69 74 79 2c 0d 0a 6c 69   complexity,..li
0630: 6d 69 74 65 64 20 6f 6e 6c 79 20 62 79 20 73 79  mited only by sy
0640: 73 74 65 6d 20 72 65 73 6f 75 72 63 65 73 20 28  stem resources (
0650: 6f 72 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63  or potentially c
0660: 6f 6d 70 69 6c 65 72 0d 0a 6c 69 6d 69 74 61 74  ompiler..limitat
0670: 69 6f 6e 73 29 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69  ions).</li>..<li
0680: 3e 48 61 73 20 73 75 70 70 6f 72 74 20 66 6f 72  >Has support for
0690: 20 65 61 73 69 6c 79 20 69 6e 73 65 72 74 69 6e   easily insertin
06a0: 67 20 6d 61 74 63 68 65 64 20 74 6f 6b 65 6e 73  g matched tokens
06b0: 20 69 6e 74 6f 20 73 74 61 6e 64 61 72 64 0d 0a   into standard..
06c0: 63 6f 6e 74 61 69 6e 65 72 73 2e 3c 2f 6c 69 3e  containers.</li>
06d0: 0d 0a 3c 2f 75 6c 3e 0d 0a 0d 0a 3c 68 32 3e 4d  ..</ul>....<h2>M
06e0: 69 73 66 65 61 74 75 72 65 73 3c 2f 68 32 3e 0d  isfeatures</h2>.
06f0: 0a 0d 0a 3c 75 6c 3e 0d 0a 3c 6c 69 3e 54 68 65  ...<ul>..<li>The
0700: 72 65 20 69 73 20 73 6f 6d 65 20 76 65 72 79 20  re is some very 
0710: 6d 69 6e 69 6d 61 6c 0d 0a 28 61 6e 64 20 66 61  minimal..(and fa
0720: 69 72 6c 79 20 6c 6f 77 2d 6c 65 76 65 6c 29 20  irly low-level) 
0730: 73 75 70 70 6f 72 74 20 66 6f 72 20 67 65 74 74  support for gett
0740: 69 6e 67 20 61 74 20 65 78 61 63 74 20 70 61 72  ing at exact par
0750: 73 65 20 65 72 72 6f 72 0d 0a 70 6f 73 69 74 69  se error..positi
0760: 6f 6e 73 2c 20 62 75 74 20 74 68 69 73 20 73 68  ons, but this sh
0770: 6f 75 6c 64 20 62 65 20 65 78 74 65 6e 64 65 64  ould be extended
0780: 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 4f 6e 6c 79  .</li>..<li>Only
0790: 20 77 6f 72 6b 73 20 77 69 74 68 20 73 74 64 3a   works with std:
07a0: 3a 73 74 72 69 6e 67 20 69 6e 70 75 74 2c 20 74  :string input, t
07b0: 68 65 20 6d 61 69 6e 20 69 6d 70 6c 69 63 61 74  he main implicat
07c0: 69 6f 6e 20 62 65 69 6e 67 0d 0a 74 68 61 74 20  ion being..that 
07d0: 61 6c 6c 20 69 6e 70 75 74 20 68 61 73 20 74 6f  all input has to
07e0: 20 62 65 20 62 75 66 66 65 72 65 64 20 62 65 66   be buffered bef
07f0: 6f 72 65 20 70 61 72 73 69 6e 67 20 62 65 67 69  ore parsing begi
0800: 6e 73 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 43 75  ns.</li>..<li>Cu
0810: 72 72 65 6e 74 6c 79 20 72 65 6c 69 65 73 20 6f  rrently relies o
0820: 6e 20 74 68 65 20 6e 75 6c 6c 20 63 68 61 72 61  n the null chara
0830: 63 74 65 72 20 74 6f 20 72 65 70 6f 72 74 20 45  cter to report E
0840: 4f 46 2c 20 73 6f 0d 0a 69 74 20 63 61 6e 6e 6f  OF, so..it canno
0850: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 62  t be used with b
0860: 69 6e 61 72 79 20 64 61 74 61 2e 20 49 6e 20 74  inary data. In t
0870: 68 65 6f 72 79 20 69 74 27 6c 6c 20 62 65 20 65  heory it'll be e
0880: 61 73 79 20 74 6f 0d 0a 73 77 69 74 63 68 20 69  asy to..switch i
0890: 74 20 74 6f 20 70 61 72 73 65 20 61 72 62 69 74  t to parse arbit
08a0: 72 61 72 79 20 69 6e 74 65 67 65 72 20 61 72 72  rary integer arr
08b0: 61 79 73 2c 20 77 68 69 63 68 20 77 6f 75 6c 64  ays, which would
08c0: 20 61 6c 6c 6f 77 0d 0a 69 74 20 74 6f 20 62 65   allow..it to be
08d0: 20 70 61 72 73 65 20 55 54 46 31 36 20 6f 72 20   parse UTF16 or 
08e0: 62 69 6e 61 72 79 20 64 61 74 61 20 61 73 20 77  binary data as w
08f0: 65 6c 6c 20 61 73 20 61 73 63 69 69 2c 20 70 72  ell as ascii, pr
0900: 6f 76 69 64 65 64 0d 0a 77 65 20 63 61 6e 20 72  ovided..we can r
0910: 65 73 65 72 76 65 20 6f 6e 65 20 69 6e 74 20 76  eserve one int v
0920: 61 6c 75 65 20 74 6f 20 6d 61 72 6b 20 45 4f 46  alue to mark EOF
0930: 2e 3c 2f 6c 69 3e 0d 0a 3c 2f 75 6c 3e 0d 0a 0d  .</li>..</ul>...
0940: 0a 3c 68 32 3e 54 4f 44 4f 73 3c 2f 68 32 3e 0d  .<h2>TODOs</h2>.
0950: 0a 3c 75 6c 3e 0d 0a 3c 6c 69 3e 46 69 67 75 72  .<ul>..<li>Figur
0960: 65 20 6f 75 74 20 73 6f 6d 65 20 72 65 61 73 6f  e out some reaso
0970: 6e 61 62 6c 65 20 65 72 72 6f 72 20 72 65 70 6f  nable error repo
0980: 72 74 69 6e 67 20 74 65 63 68 6e 69 71 75 65 73  rting techniques
0990: 2e 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 4d 61 79 62  .</li>..<li>Mayb
09a0: 65 20 74 65 6d 70 6c 61 74 69 7a 65 20 74 68 65  e templatize the
09b0: 20 69 74 65 72 61 74 6f 72 20 74 79 70 65 20 73   iterator type s
09c0: 6f 20 77 65 20 63 61 6e 20 77 6f 72 6b 20 6f 6e  o we can work on
09d0: 0d 0a 61 72 62 69 74 72 61 72 79 20 69 6e 70 75  ..arbitrary inpu
09e0: 74 20 69 74 65 72 61 74 6f 72 73 2e 20 54 68 69  t iterators. Thi
09f0: 73 20 72 65 71 75 69 72 65 73 20 61 20 70 61 72  s requires a par
0a00: 74 69 61 6c 2d 62 75 66 66 65 72 69 6e 67 0d 0a  tial-buffering..
0a10: 73 74 72 61 74 65 67 79 20 73 69 6d 69 6c 61 72  strategy similar
0a20: 20 74 6f 20 74 68 65 20 6f 6e 65 20 66 72 6f 6d   to the one from
0a30: 20 50 45 47 54 4c 2c 20 77 68 69 63 68 20 63 61   PEGTL, which ca
0a40: 6e 0d 0a 66 69 67 75 72 65 20 6f 75 74 20 22 66  n..figure out "f
0a50: 72 6f 6d 20 77 68 69 63 68 20 70 6f 69 6e 74 20  rom which point 
0a60: 61 72 65 20 77 65 20 67 75 61 72 61 6e 74 65 65  are we guarantee
0a70: 64 20 74 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  d to not have to
0a80: 0d 0a 62 61 63 6b 74 72 61 63 6b 3f 22 20 61 6e  ..backtrack?" an
0a90: 64 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  d discard all in
0aa0: 70 75 74 20 62 65 66 6f 72 65 20 74 68 61 74 20  put before that 
0ab0: 70 6f 69 6e 74 2e 3c 2f 6c 69 3e 0d 0a 3c 2f 75  point.</li>..</u
0ac0: 6c 3e 0d 0a 0d 0a 3c 68 32 3e 53 74 61 72 74 69  l>....<h2>Starti
0ad0: 6e 67 20 70 6f 69 6e 74 73 2e 2e 2e 3c 2f 68 32  ng points...</h2
0ae0: 3e 0d 0a 0d 0a 46 69 72 73 74 2c 20 73 65 65 20  >....First, see 
0af0: 3c 74 74 3e 74 65 73 74 2e 63 70 70 3c 2f 74 74  <tt>test.cpp</tt
0b00: 3e 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  > in the source 
0b10: 74 72 65 65 2e 20 4f 6e 63 65 20 74 68 61 74 0d  tree. Once that.
0b20: 0a 63 6f 64 65 20 6d 61 6b 65 73 20 73 65 6e 73  .code makes sens
0b30: 65 2c 20 73 65 65 20 3c 74 74 3e 70 61 72 73 65  e, see <tt>parse
0b40: 70 70 5f 6e 75 6d 65 72 69 63 2e 68 70 70 3c 2f  pp_numeric.hpp</
0b50: 74 74 3e 2c 0d 0a 74 68 65 6e 20 3c 74 74 3e 70  tt>,..then <tt>p
0b60: 61 72 73 65 70 70 5f 63 61 6c 63 2e 68 70 70 3c  arsepp_calc.hpp<
0b70: 2f 74 74 3e 2e 0d 0a 0d 0a 4f 6e 63 65 20 79 6f  /tt>.....Once yo
0b80: 75 27 72 65 20 73 75 72 65 20 74 68 61 74 20 79  u're sure that y
0b90: 6f 75 27 64 20 6c 69 6b 65 20 74 6f 20 74 72 79  ou'd like to try
0ba0: 20 69 74 20 6f 75 74 2c 20 73 65 65 0d 0a 74 68   it out, see..th
0bb0: 65 20 5b 52 75 6c 65 73 4f 76 65 72 76 69 65 77  e [RulesOverview
0bc0: 5d 20 77 69 6b 69 20 70 61 67 65 2e 20 49 66 20  ] wiki page. If 
0bd0: 74 68 61 74 20 64 6f 65 73 6e 27 74 20 73 63 61  that doesn't sca
0be0: 72 65 0d 0a 79 6f 75 20 61 77 61 79 2c 20 74 68  re..you away, th
0bf0: 65 6e 20 67 6f 20 76 69 73 69 74 20 74 68 65 20  en go visit the 
0c00: 5b 74 79 70 65 6c 69 73 74 73 5d 20 77 69 6b 69  [typelists] wiki
0c10: 20 70 61 67 65 2e 0d 0a 0a 5a 20 66 31 37 37 62   page....Z f177b
0c20: 34 34 66 35 30 31 63 34 36 38 65 61 30 66 30 32  44f501c468ea0f02
0c30: 35 64 36 63 65 65 35 32 65 38 62 0a              5d6cee52e8b.