advance.html 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Qi advance Parser</title>
  5. <link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../../index.html" title="Spirit Repository 0.2">
  8. <link rel="up" href="../primitive.html" title="Qi Parser Primitives">
  9. <link rel="prev" href="../primitive.html" title="Qi Parser Primitives">
  10. <link rel="next" href="flush_multi_pass.html" title="Qi flush_multi_pass parser">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="../primitive.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../primitive.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="flush_multi_pass.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h4 class="title">
  27. <a name="spirit_repository.qi_components.primitive.advance"></a><a class="link" href="advance.html" title="Qi advance Parser">Qi
  28. advance Parser</a>
  29. </h4></div></div></div>
  30. <h6>
  31. <a name="spirit_repository.qi_components.primitive.advance.h0"></a>
  32. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.description"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.description">Description</a>
  33. </h6>
  34. <p>
  35. The <span class="emphasis"><em>Spirit.Qi</em></span> <code class="computeroutput"><span class="identifier">advance</span></code>
  36. is a primitive parser component allowing the parser to skip (advance) through
  37. a specified number of iterations without performing unnecessary work:
  38. </p>
  39. <pre class="programlisting"><span class="identifier">advance</span><span class="special">(</span><span class="identifier">distance</span><span class="special">)</span>
  40. </pre>
  41. <p>
  42. The most obvious existing alternative to this, the <code class="computeroutput"><span class="identifier">repeat</span></code>
  43. directive, will cause the parser to advance one iterator at a time while
  44. usually performing operations at each step. In some cases that work is
  45. unnecessary, as in the case where large binary objects are being parsed.
  46. Take, for example, the following binary data:
  47. </p>
  48. <pre class="programlisting">00 00 00 01 77 fc b4 51 0a b3 b7 ... 1e 60 70 b6 00 00 01 00
  49. </pre>
  50. <p>
  51. If the first 4 bytes are a little-endian 32-bit integer describing the
  52. length of the subsequent data, but the data itself is not relevant to parsing,
  53. then the repeat directive would cause all of the subsequent 16 MB of data
  54. to be consumed one byte at a time while generating page faults or other
  55. superfluous I/O. If the value is large, as it is in this case, the parser
  56. becomes very slow.
  57. </p>
  58. <pre class="programlisting"><span class="identifier">little_dword</span><span class="special">[</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">_1</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="identifier">repeat</span><span class="special">(</span><span class="identifier">_a</span><span class="special">)[</span><span class="identifier">byte_</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="identifier">little_dword</span><span class="special">...</span>
  59. </pre>
  60. <p>
  61. The <code class="computeroutput"><span class="identifier">advance</span></code> parser component
  62. solves this problem by performing as little work as possible to advance
  63. the parser's iterator, and will optimize for the case of random-access
  64. iterators by advancing directly to the desired relative iterator position.
  65. </p>
  66. <pre class="programlisting"><span class="identifier">little_dword</span><span class="special">[</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">_1</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="identifier">advance</span><span class="special">(</span><span class="identifier">_a</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">little_dword</span><span class="special">...</span>
  67. </pre>
  68. <h6>
  69. <a name="spirit_repository.qi_components.primitive.advance.h1"></a>
  70. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.header"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.header">Header</a>
  71. </h6>
  72. <pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/repository/home/qi/primitive/advance.hpp&gt;</span>
  73. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">repository</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi_advance</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  74. </pre>
  75. <h6>
  76. <a name="spirit_repository.qi_components.primitive.advance.h2"></a>
  77. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.synopsis"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.synopsis">Synopsis</a>
  78. </h6>
  79. <pre class="programlisting"><span class="identifier">advance</span><span class="special">(</span><span class="identifier">distance</span><span class="special">)</span>
  80. </pre>
  81. <h6>
  82. <a name="spirit_repository.qi_components.primitive.advance.h3"></a>
  83. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.parameters"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.parameters">Parameters</a>
  84. </h6>
  85. <div class="informaltable"><table class="table">
  86. <colgroup>
  87. <col>
  88. <col>
  89. </colgroup>
  90. <thead><tr>
  91. <th>
  92. <p>
  93. Parameter
  94. </p>
  95. </th>
  96. <th>
  97. <p>
  98. Description
  99. </p>
  100. </th>
  101. </tr></thead>
  102. <tbody><tr>
  103. <td>
  104. <p>
  105. 'distance'
  106. </p>
  107. </td>
  108. <td>
  109. <p>
  110. The distance that the iterator shall be advanced
  111. </p>
  112. </td>
  113. </tr></tbody>
  114. </table></div>
  115. <h6>
  116. <a name="spirit_repository.qi_components.primitive.advance.h4"></a>
  117. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.attribute"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.attribute">Attribute</a>
  118. </h6>
  119. <p>
  120. The <code class="computeroutput"><span class="identifier">advance</span></code> component exposes
  121. no attribute (the exposed attribute type is <code class="computeroutput"><span class="identifier">unused_type</span></code>):
  122. </p>
  123. <pre class="programlisting"><span class="identifier">advance</span> <span class="special">--&gt;</span> <span class="identifier">unused</span>
  124. </pre>
  125. <h6>
  126. <a name="spirit_repository.qi_components.primitive.advance.h5"></a>
  127. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.example"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.example">Example</a>
  128. </h6>
  129. <p>
  130. The following example shows simple use cases of the <code class="computeroutput"><span class="identifier">advance</span></code>
  131. component. We will illustrate its usage by generating parsers for some
  132. binary data (for the full example code see <a href="../../../../../example/qi/advance.cpp" target="_top">advance.cpp</a>)
  133. </p>
  134. <h6>
  135. <a name="spirit_repository.qi_components.primitive.advance.h6"></a>
  136. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.prerequisites"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.prerequisites">Prerequisites</a>
  137. </h6>
  138. <p>
  139. In addition to the main header file needed to include the core components
  140. implemented in <span class="emphasis"><em>Spirit.Qi</em></span> we add the header file needed
  141. for the new <code class="computeroutput"><span class="identifier">advance</span></code> component.
  142. </p>
  143. <p>
  144. </p>
  145. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  146. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">phoenix_operator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  147. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">repository</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi_advance</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  148. </pre>
  149. <p>
  150. </p>
  151. <p>
  152. In order to make the examples below more readable we introduce or use the
  153. following namespaces.
  154. </p>
  155. <p>
  156. </p>
  157. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">qi</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">;</span>
  158. <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">repository</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">advance</span><span class="special">;</span>
  159. </pre>
  160. <p>
  161. </p>
  162. <h6>
  163. <a name="spirit_repository.qi_components.primitive.advance.h7"></a>
  164. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.setting_up_the_grammar"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.setting_up_the_grammar">Setting
  165. up the Grammar</a>
  166. </h6>
  167. <p>
  168. This is a very simple grammar that recognizes several fields of a binary
  169. stream of data. There are two fields explicitly delimited by a field indicating
  170. the number of bytes that are spanned. They are separated by a literal string.
  171. </p>
  172. <p>
  173. </p>
  174. <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
  175. <span class="keyword">struct</span> <span class="identifier">advance_grammar</span> <span class="special">:</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">grammar</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">locals</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  176. <span class="special">{</span>
  177. <span class="identifier">advance_grammar</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">advance_grammar</span><span class="special">::</span><span class="identifier">base_type</span><span class="special">(</span><span class="identifier">start</span><span class="special">)</span>
  178. <span class="special">{</span>
  179. <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">byte_</span><span class="special">;</span>
  180. <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">eoi</span><span class="special">;</span>
  181. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">labels</span><span class="special">;</span>
  182. <span class="identifier">start</span>
  183. <span class="special">=</span> <span class="identifier">byte_</span> <span class="special">[</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">_1</span><span class="special">]</span>
  184. <span class="special">&gt;&gt;</span> <span class="identifier">advance</span><span class="special">(</span><span class="identifier">_a</span><span class="special">)</span>
  185. <span class="special">&gt;&gt;</span> <span class="string">"boost"</span>
  186. <span class="special">&gt;&gt;</span> <span class="identifier">byte_</span> <span class="special">[</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">_1</span><span class="special">]</span>
  187. <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">advance</span><span class="special">(</span><span class="identifier">_a</span><span class="special">)</span> <span class="special">|</span> <span class="string">"qi"</span><span class="special">)</span> <span class="comment">// note alternative when advance fails</span>
  188. <span class="special">&gt;&gt;</span> <span class="identifier">eoi</span>
  189. <span class="special">;</span>
  190. <span class="special">}</span>
  191. <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">locals</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">start</span><span class="special">;</span>
  192. <span class="special">};</span>
  193. </pre>
  194. <p>
  195. </p>
  196. <p>
  197. Note that the second binary field may either contain the number of specified
  198. bytes, or the word "qi". If the <code class="computeroutput"><span class="identifier">advance</span></code>
  199. parser component fails to advance the specified number of bytes before
  200. reaching the end of input, it will fail and the parser will attempt to
  201. descend into alternatives.
  202. </p>
  203. <h6>
  204. <a name="spirit_repository.qi_components.primitive.advance.h8"></a>
  205. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.parsing_a_correctly_delimited_string_of_data"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.parsing_a_correctly_delimited_string_of_data">Parsing
  206. a Correctly-delimited String of Data</a>
  207. </h6>
  208. <p>
  209. The data below is correctly delimited and will thus result in a valid parse.
  210. Note that both random-access and bidirectional iterators are used here.
  211. </p>
  212. <p>
  213. </p>
  214. <pre class="programlisting"><span class="keyword">unsigned</span> <span class="keyword">char</span> <span class="keyword">const</span> <span class="identifier">alt1</span><span class="special">[]</span> <span class="special">=</span>
  215. <span class="special">{</span>
  216. <span class="number">5</span><span class="special">,</span> <span class="comment">// number of bytes to advance</span>
  217. <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="comment">// data to advance through</span>
  218. <span class="char">'b'</span><span class="special">,</span> <span class="char">'o'</span><span class="special">,</span> <span class="char">'o'</span><span class="special">,</span> <span class="char">'s'</span><span class="special">,</span> <span class="char">'t'</span><span class="special">,</span> <span class="comment">// word to parse</span>
  219. <span class="number">2</span><span class="special">,</span> <span class="comment">// number of bytes to advance</span>
  220. <span class="number">11</span><span class="special">,</span> <span class="number">12</span> <span class="comment">// more data to advance through</span>
  221. <span class="comment">// eoi</span>
  222. <span class="special">};</span>
  223. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">alt1_string</span><span class="special">(</span><span class="identifier">alt1</span><span class="special">,</span> <span class="identifier">alt1</span> <span class="special">+</span> <span class="keyword">sizeof</span> <span class="identifier">alt1</span><span class="special">);</span>
  224. <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">alt1_list</span><span class="special">(</span><span class="identifier">alt1</span><span class="special">,</span> <span class="identifier">alt1</span> <span class="special">+</span> <span class="keyword">sizeof</span> <span class="identifier">alt1</span><span class="special">);</span>
  225. <span class="identifier">result</span> <span class="special">=</span>
  226. <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">alt1_string</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">alt1_string</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  227. <span class="special">,</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">advance_grammar</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">const_iterator</span><span class="special">&gt;())</span>
  228. <span class="special">?</span> <span class="string">"succeeded"</span> <span class="special">:</span> <span class="string">"failed"</span><span class="special">;</span>
  229. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Parsing alt1 using random access iterator "</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  230. <span class="identifier">result</span> <span class="special">=</span>
  231. <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">alt1_list</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">alt1_list</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  232. <span class="special">,</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">advance_grammar</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span><span class="special">&gt;())</span>
  233. <span class="special">?</span> <span class="string">"succeeded"</span> <span class="special">:</span> <span class="string">"failed"</span><span class="special">;</span>
  234. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Parsing alt1 using bidirectional iterator "</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  235. </pre>
  236. <p>
  237. </p>
  238. <h6>
  239. <a name="spirit_repository.qi_components.primitive.advance.h9"></a>
  240. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.parsing_the_alternative_representation"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.parsing_the_alternative_representation">Parsing
  241. the Alternative Representation</a>
  242. </h6>
  243. <p>
  244. The data below is not correctly delimited, but will correctly parse because
  245. the alternative word "qi" is available.
  246. </p>
  247. <p>
  248. </p>
  249. <pre class="programlisting"><span class="keyword">unsigned</span> <span class="keyword">char</span> <span class="keyword">const</span> <span class="identifier">alt2</span><span class="special">[]</span> <span class="special">=</span>
  250. <span class="special">{</span>
  251. <span class="number">2</span><span class="special">,</span> <span class="comment">// number of bytes to advance</span>
  252. <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="comment">// data to advance through</span>
  253. <span class="char">'b'</span><span class="special">,</span> <span class="char">'o'</span><span class="special">,</span> <span class="char">'o'</span><span class="special">,</span> <span class="char">'s'</span><span class="special">,</span> <span class="char">'t'</span><span class="special">,</span> <span class="comment">// word to parse</span>
  254. <span class="number">4</span><span class="special">,</span> <span class="comment">// number of bytes to advance</span>
  255. <span class="char">'q'</span><span class="special">,</span> <span class="char">'i'</span> <span class="comment">// alternative (advance won't work)</span>
  256. <span class="comment">// eoi</span>
  257. <span class="special">};</span>
  258. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">alt2_string</span><span class="special">(</span><span class="identifier">alt2</span><span class="special">,</span> <span class="identifier">alt2</span> <span class="special">+</span> <span class="keyword">sizeof</span> <span class="identifier">alt2</span><span class="special">);</span>
  259. <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;</span> <span class="keyword">const</span> <span class="identifier">alt2_list</span><span class="special">(</span><span class="identifier">alt2</span><span class="special">,</span> <span class="identifier">alt2</span> <span class="special">+</span> <span class="keyword">sizeof</span> <span class="identifier">alt2</span><span class="special">);</span>
  260. <span class="identifier">result</span> <span class="special">=</span>
  261. <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">alt2_string</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">alt2_string</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  262. <span class="special">,</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">advance_grammar</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">const_iterator</span><span class="special">&gt;())</span>
  263. <span class="special">?</span> <span class="string">"succeeded"</span> <span class="special">:</span> <span class="string">"failed"</span><span class="special">;</span>
  264. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Parsing alt2 using random access iterator "</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  265. <span class="identifier">result</span> <span class="special">=</span>
  266. <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">alt2_list</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">alt2_list</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  267. <span class="special">,</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">advance_grammar</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span><span class="special">&gt;())</span>
  268. <span class="special">?</span> <span class="string">"succeeded"</span> <span class="special">:</span> <span class="string">"failed"</span><span class="special">;</span>
  269. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Parsing alt2 using bidirectional iterator "</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  270. </pre>
  271. <p>
  272. </p>
  273. <h6>
  274. <a name="spirit_repository.qi_components.primitive.advance.h10"></a>
  275. <span class="phrase"><a name="spirit_repository.qi_components.primitive.advance.notes"></a></span><a class="link" href="advance.html#spirit_repository.qi_components.primitive.advance.notes">Notes</a>
  276. </h6>
  277. <p>
  278. The <code class="computeroutput"><span class="identifier">advance</span></code> parser component
  279. will fail unconditionally on negative values. It will never attempt to
  280. advance the iterator in the reverse direction.
  281. </p>
  282. </div>
  283. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  284. <td align="left"></td>
  285. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
  286. Distributed under the Boost Software License, Version 1.0. (See accompanying
  287. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  288. </p>
  289. </div></td>
  290. </tr></table>
  291. <hr>
  292. <div class="spirit-nav">
  293. <a accesskey="p" href="../primitive.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../primitive.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="flush_multi_pass.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
  294. </div>
  295. </body>
  296. </html>