distinct.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Qi Distinct Parser Directive</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="../directives.html" title="Qi Parser Directives">
  9. <link rel="prev" href="confix.html" title="Qi Confix Parser Directive">
  10. <link rel="next" href="kwd.html" title="Qi Keyword Parser Directive">
  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="confix.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../directives.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="kwd.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.directives.distinct"></a><a class="link" href="distinct.html" title="Qi Distinct Parser Directive">Qi
  28. Distinct Parser Directive</a>
  29. </h4></div></div></div>
  30. <h6>
  31. <a name="spirit_repository.qi_components.directives.distinct.h0"></a>
  32. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.description"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.description">Description</a>
  33. </h6>
  34. <p>
  35. The <span class="emphasis"><em>Spirit.Qi</em></span> <code class="computeroutput"><span class="identifier">distinct</span></code>
  36. parser is a directive component allowing to avoid partial matches while
  37. parsing using a skipper. A simple example is the common task of matching
  38. a C keyword. Consider:
  39. </p>
  40. <pre class="programlisting"><span class="string">"description"</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">":"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="identifier">eol</span><span class="special">)</span>
  41. </pre>
  42. <p>
  43. intended to match a line in a configuration file. Let's assume further,
  44. that this rule is used with a <code class="computeroutput"><span class="identifier">space</span></code>
  45. skipper and that we have the following strings in the input:
  46. </p>
  47. <pre class="programlisting"><span class="string">"description: ident\n"</span>
  48. <span class="string">"description ident\n"</span>
  49. <span class="string">"descriptionident\n"</span>
  50. </pre>
  51. <p>
  52. It might seem unexpected, but the parser above matches all three inputs
  53. just fine, even if the third input should not match at all! In order to
  54. avoid the unwanted match we are forced to make our rule more complicated:
  55. </p>
  56. <pre class="programlisting"><span class="identifier">lexeme</span><span class="special">[</span><span class="string">"description"</span> <span class="special">&gt;&gt;</span> <span class="special">!</span><span class="identifier">char_</span><span class="special">(</span><span class="string">"a-zA-Z_0-9"</span><span class="special">)]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">":"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="identifier">eol</span><span class="special">)</span>
  57. </pre>
  58. <p>
  59. (the rule reads as: match <code class="computeroutput"><span class="string">"description"</span></code>
  60. as long as it's not <span class="emphasis"><em>directly</em></span> followed by a valid identifier).
  61. </p>
  62. <p>
  63. The <code class="computeroutput"><span class="identifier">distinct</span><span class="special">[]</span></code>
  64. directive is meant to simplify the rule above:
  65. </p>
  66. <pre class="programlisting"><span class="identifier">distinct</span><span class="special">(</span><span class="identifier">char_</span><span class="special">(</span><span class="string">"a-zA-Z_0-9"</span><span class="special">))[</span><span class="string">"description"</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">":"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="identifier">eol</span><span class="special">)</span>
  67. </pre>
  68. <p>
  69. Using the <code class="computeroutput"><span class="identifier">distinct</span><span class="special">[]</span></code>
  70. component instead of the explicit sequence has the advantage of being able
  71. to encapsulate the tail (i.e the <code class="computeroutput"><span class="identifier">char_</span><span class="special">(</span><span class="string">"a-zA-Z_0-9"</span><span class="special">)</span></code>) as a separate parser construct. The following
  72. code snippet illustrates the idea (for the full code of this example please
  73. see <a href="../../../../../test/qi/distinct.cpp" target="_top">distinct.cpp</a>):
  74. </p>
  75. <p>
  76. </p>
  77. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">spirit</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">;</span>
  78. <span class="keyword">namespace</span> <span class="identifier">ascii</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">ascii</span><span class="special">;</span>
  79. <span class="keyword">namespace</span> <span class="identifier">repo</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">repository</span><span class="special">;</span>
  80. <span class="comment">// Define metafunctions allowing to compute the type of the distinct()</span>
  81. <span class="comment">// and ascii::char_() constructs</span>
  82. <span class="keyword">namespace</span> <span class="identifier">traits</span>
  83. <span class="special">{</span>
  84. <span class="comment">// Metafunction allowing to get the type of any repository::distinct(...) </span>
  85. <span class="comment">// construct</span>
  86. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Tail</span><span class="special">&gt;</span>
  87. <span class="keyword">struct</span> <span class="identifier">distinct_spec</span>
  88. <span class="special">:</span> <span class="identifier">spirit</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">terminal</span><span class="special">&lt;</span><span class="identifier">repo</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">distinct</span><span class="special">(</span><span class="identifier">Tail</span><span class="special">)&gt;</span>
  89. <span class="special">{};</span>
  90. <span class="comment">// Metafunction allowing to get the type of any ascii::char_(...) construct</span>
  91. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">String</span><span class="special">&gt;</span>
  92. <span class="keyword">struct</span> <span class="identifier">char_spec</span>
  93. <span class="special">:</span> <span class="identifier">spirit</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">terminal</span><span class="special">&lt;</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">ascii</span><span class="special">::</span><span class="identifier">char_</span><span class="special">(</span><span class="identifier">String</span><span class="special">)&gt;</span>
  94. <span class="special">{};</span>
  95. <span class="special">}</span>
  96. <span class="comment">// Define a helper function allowing to create a distinct() construct from </span>
  97. <span class="comment">// an arbitrary tail parser</span>
  98. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Tail</span><span class="special">&gt;</span>
  99. <span class="keyword">inline</span> <span class="keyword">typename</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">distinct_spec</span><span class="special">&lt;</span><span class="identifier">Tail</span><span class="special">&gt;::</span><span class="identifier">type</span>
  100. <span class="identifier">distinct_spec</span><span class="special">(</span><span class="identifier">Tail</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">tail</span><span class="special">)</span>
  101. <span class="special">{</span>
  102. <span class="keyword">return</span> <span class="identifier">repo</span><span class="special">::</span><span class="identifier">distinct</span><span class="special">(</span><span class="identifier">tail</span><span class="special">);</span>
  103. <span class="special">}</span>
  104. <span class="comment">// Define a helper function allowing to create a ascii::char_() construct </span>
  105. <span class="comment">// from an arbitrary string representation</span>
  106. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">String</span><span class="special">&gt;</span>
  107. <span class="keyword">inline</span> <span class="keyword">typename</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">char_spec</span><span class="special">&lt;</span><span class="identifier">String</span><span class="special">&gt;::</span><span class="identifier">type</span>
  108. <span class="identifier">char_spec</span><span class="special">(</span><span class="identifier">String</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">str</span><span class="special">)</span>
  109. <span class="special">{</span>
  110. <span class="keyword">return</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">char_</span><span class="special">(</span><span class="identifier">str</span><span class="special">);</span>
  111. <span class="special">}</span>
  112. <span class="comment">// the following constructs the type of a distinct_spec holding a</span>
  113. <span class="comment">// charset("0-9a-zA-Z_") as its tail parser</span>
  114. <span class="keyword">typedef</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">char_spec</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">charset_tag_type</span><span class="special">;</span>
  115. <span class="keyword">typedef</span> <span class="identifier">traits</span><span class="special">::</span><span class="identifier">distinct_spec</span><span class="special">&lt;</span><span class="identifier">charset_tag_type</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">keyword_tag_type</span><span class="special">;</span>
  116. <span class="comment">// Define a new Qi 'keyword' directive usable as a shortcut for a</span>
  117. <span class="comment">// repository::distinct(char_(std::string("0-9a-zA-Z_")))</span>
  118. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">keyword_spec</span><span class="special">(</span><span class="string">"0-9a-zA-Z_"</span><span class="special">);</span>
  119. <span class="identifier">keyword_tag_type</span> <span class="keyword">const</span> <span class="identifier">keyword</span> <span class="special">=</span> <span class="identifier">distinct_spec</span><span class="special">(</span><span class="identifier">char_spec</span><span class="special">(</span><span class="identifier">keyword_spec</span><span class="special">));</span>
  120. </pre>
  121. <p>
  122. </p>
  123. <p>
  124. These definitions define a new Qi parser recognizing keywords! This allows
  125. to rewrite our declaration parser expression as:
  126. </p>
  127. <pre class="programlisting"><span class="identifier">keyword</span><span class="special">[</span><span class="string">"description"</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">":"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="identifier">eol</span><span class="special">)</span>
  128. </pre>
  129. <p>
  130. which is much more readable and concise if compared to the original parser
  131. expression. In addition the new <code class="computeroutput"><span class="identifier">keyword</span><span class="special">[]</span></code> directive has the advantage to be usable
  132. for wrapping any parser expression, not only strings as in the example
  133. above.
  134. </p>
  135. <h6>
  136. <a name="spirit_repository.qi_components.directives.distinct.h1"></a>
  137. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.header"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.header">Header</a>
  138. </h6>
  139. <pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/repository/home/qi/directive/distinct.hpp&gt;</span>
  140. <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_distinct</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  141. </pre>
  142. <h6>
  143. <a name="spirit_repository.qi_components.directives.distinct.h2"></a>
  144. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.synopsis"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.synopsis">Synopsis</a>
  145. </h6>
  146. <pre class="programlisting"><span class="identifier">distinct</span><span class="special">(</span><span class="identifier">tail</span><span class="special">)[</span><span class="identifier">subject</span><span class="special">]</span>
  147. </pre>
  148. <h6>
  149. <a name="spirit_repository.qi_components.directives.distinct.h3"></a>
  150. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.parameters"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.parameters">Parameters</a>
  151. </h6>
  152. <div class="informaltable"><table class="table">
  153. <colgroup>
  154. <col>
  155. <col>
  156. </colgroup>
  157. <thead><tr>
  158. <th>
  159. <p>
  160. Parameter
  161. </p>
  162. </th>
  163. <th>
  164. <p>
  165. Description
  166. </p>
  167. </th>
  168. </tr></thead>
  169. <tbody>
  170. <tr>
  171. <td>
  172. <p>
  173. <code class="computeroutput"><span class="identifier">tail</span></code>
  174. </p>
  175. </td>
  176. <td>
  177. <p>
  178. The parser construct specifying what whould not follow the subject
  179. in order to match the overall expression.
  180. </p>
  181. </td>
  182. </tr>
  183. <tr>
  184. <td>
  185. <p>
  186. <code class="computeroutput"><span class="identifier">subject</span></code>
  187. </p>
  188. </td>
  189. <td>
  190. <p>
  191. The parser construct to use to match the current input. The distinct
  192. directive makes sure that no unexpected partial matches occur.
  193. </p>
  194. </td>
  195. </tr>
  196. </tbody>
  197. </table></div>
  198. <p>
  199. All two parameters can be arbitrary complex parsers themselves.
  200. </p>
  201. <h6>
  202. <a name="spirit_repository.qi_components.directives.distinct.h4"></a>
  203. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.attribute"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.attribute">Attribute</a>
  204. </h6>
  205. <p>
  206. The <code class="computeroutput"><span class="identifier">distinct</span></code> component
  207. exposes the attribute type of its subject as its own attribute type. If
  208. the <code class="computeroutput"><span class="identifier">subject</span></code> does not expose
  209. any attribute (the type is <code class="computeroutput"><span class="identifier">unused_type</span></code>),
  210. then the <code class="computeroutput"><span class="identifier">distinct</span></code> does
  211. not expose any attribute either.
  212. </p>
  213. <pre class="programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span><span class="special">,</span> <span class="identifier">b</span><span class="special">:</span> <span class="identifier">B</span> <span class="special">--&gt;</span> <span class="identifier">distinct</span><span class="special">(</span><span class="identifier">b</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">A</span>
  214. </pre>
  215. <h6>
  216. <a name="spirit_repository.qi_components.directives.distinct.h5"></a>
  217. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.example"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.example">Example</a>
  218. </h6>
  219. <p>
  220. The following example shows simple use cases of the <code class="computeroutput"><span class="identifier">distinct</span></code>
  221. parser. <a href="../../../../../example/qi/distinct.cpp" target="_top">distinct.cpp</a>)
  222. </p>
  223. <h6>
  224. <a name="spirit_repository.qi_components.directives.distinct.h6"></a>
  225. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.prerequisites"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.prerequisites">Prerequisites</a>
  226. </h6>
  227. <p>
  228. In addition to the main header file needed to include the core components
  229. implemented in <span class="emphasis"><em>Spirit.Qi</em></span> we add the header file needed
  230. for the new <code class="computeroutput"><span class="identifier">distinct</span></code> generator.
  231. </p>
  232. <p>
  233. </p>
  234. <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>
  235. <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_distinct</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  236. </pre>
  237. <p>
  238. </p>
  239. <p>
  240. To make all the code below more readable we introduce the following namespaces.
  241. </p>
  242. <p>
  243. </p>
  244. <pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">;</span>
  245. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">ascii</span><span class="special">;</span>
  246. <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">distinct</span><span class="special">;</span>
  247. </pre>
  248. <p>
  249. </p>
  250. <h6>
  251. <a name="spirit_repository.qi_components.directives.distinct.h7"></a>
  252. <span class="phrase"><a name="spirit_repository.qi_components.directives.distinct.using_the_distinct_directive_to_match_keywords"></a></span><a class="link" href="distinct.html#spirit_repository.qi_components.directives.distinct.using_the_distinct_directive_to_match_keywords">Using
  253. The Distinct Directive to Match keywords</a>
  254. </h6>
  255. <p>
  256. We show several examples of how the <code class="computeroutput"><span class="identifier">distinct</span><span class="special">[]</span></code> directive can be used to force correct
  257. behavior while matching keywords. The first two code snippets show the
  258. correct matching of the <code class="computeroutput"><span class="identifier">description</span></code>
  259. keyword (in this hypothetical example we allow keywords to be directly
  260. followed by an optional <code class="computeroutput"><span class="string">"--"</span></code>):
  261. </p>
  262. <p>
  263. </p>
  264. <pre class="programlisting"><span class="special">{</span>
  265. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"description ident"</span><span class="special">);</span>
  266. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
  267. <span class="keyword">bool</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">phrase_parse</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  268. <span class="special">,</span> <span class="identifier">distinct</span><span class="special">(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)[</span><span class="string">"description"</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"--"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">+(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)</span>
  269. <span class="special">,</span> <span class="identifier">space</span><span class="special">);</span>
  270. <span class="identifier">BOOST_ASSERT</span><span class="special">(</span><span class="identifier">r</span> <span class="special">&amp;&amp;</span> <span class="identifier">first</span> <span class="special">==</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
  271. <span class="special">}</span>
  272. </pre>
  273. <p>
  274. </p>
  275. <p>
  276. </p>
  277. <pre class="programlisting"><span class="special">{</span>
  278. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"description--ident"</span><span class="special">);</span>
  279. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
  280. <span class="keyword">bool</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">phrase_parse</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  281. <span class="special">,</span> <span class="identifier">distinct</span><span class="special">(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)[</span><span class="string">"description"</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"--"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">+(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)</span>
  282. <span class="special">,</span> <span class="identifier">space</span><span class="special">);</span>
  283. <span class="identifier">BOOST_ASSERT</span><span class="special">(</span><span class="identifier">r</span> <span class="special">&amp;&amp;</span> <span class="identifier">first</span> <span class="special">==</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
  284. <span class="special">}</span>
  285. </pre>
  286. <p>
  287. </p>
  288. <p>
  289. The last example shows that the <code class="computeroutput"><span class="identifier">distinct</span><span class="special">[]</span></code> parser component correctly refuses to
  290. match "description-ident":
  291. </p>
  292. <p>
  293. </p>
  294. <pre class="programlisting"><span class="special">{</span>
  295. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"description-ident"</span><span class="special">);</span>
  296. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
  297. <span class="keyword">bool</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">phrase_parse</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span>
  298. <span class="special">,</span> <span class="identifier">distinct</span><span class="special">(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)[</span><span class="string">"description"</span><span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"--"</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">+(</span><span class="identifier">alnum</span> <span class="special">|</span> <span class="char">'_'</span><span class="special">)</span>
  299. <span class="special">,</span> <span class="identifier">space</span><span class="special">);</span>
  300. <span class="identifier">BOOST_ASSERT</span><span class="special">(!</span><span class="identifier">r</span> <span class="special">&amp;&amp;</span> <span class="identifier">first</span> <span class="special">==</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
  301. <span class="special">}</span>
  302. </pre>
  303. <p>
  304. </p>
  305. </div>
  306. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  307. <td align="left"></td>
  308. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
  309. Distributed under the Boost Software License, Version 1.0. (See accompanying
  310. 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>)
  311. </p>
  312. </div></td>
  313. </tr></table>
  314. <hr>
  315. <div class="spirit-nav">
  316. <a accesskey="p" href="confix.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../directives.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="kwd.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
  317. </div>
  318. </body>
  319. </html>