9
3

kwd.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Qi Keyword 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="distinct.html" title="Qi Distinct Parser Directive">
  10. <link rel="next" href="seek.html" title="Qi Seek 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="distinct.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="seek.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.kwd"></a><a class="link" href="kwd.html" title="Qi Keyword Parser Directive">Qi
  28. Keyword Parser Directive </a>
  29. </h4></div></div></div>
  30. <h6>
  31. <a name="spirit_repository.qi_components.directives.kwd.h0"></a>
  32. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.description"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.description">Description</a>
  33. </h6>
  34. <p>
  35. The <code class="computeroutput"><span class="identifier">kwd</span><span class="special">[]</span></code>,
  36. <code class="computeroutput"><span class="identifier">dkwd</span><span class="special">[]</span></code>
  37. and <code class="computeroutput"><span class="identifier">ikwd</span><span class="special">[]</span></code>,
  38. <code class="computeroutput"><span class="identifier">idkwd</span><span class="special">[]</span></code>
  39. provide a powerful and flexible mechanism for parsing keyword based input.
  40. It works in conjuction with the / operator to create an effective keyword
  41. parsing loop. The keyword parsing loop doesn't require the keywords to
  42. appear in a defined order in the input but also provides the possibility
  43. to check how many times a keyword appears in the input.
  44. </p>
  45. <p>
  46. The kwd directive will parse the keywords respecting case sensitivity whereas
  47. the ikwd direcive is case insensitive. You can mix the kwd and ikwd directives
  48. inside a set of keywords, but be aware that this has a small overhead.
  49. It should be prefered not to mix the kwd and ikwd directives.
  50. </p>
  51. <p>
  52. The dkwd and idkwd provide a mechanism to pase distinct keywords. These
  53. directives require that the skipper successeds parsing input right after
  54. the keyword part.
  55. </p>
  56. <p>
  57. dkwd("keyword1")<span class="emphasis"><em>='&gt;&gt;int_</em></span>
  58. </p>
  59. <p>
  60. is equivalent to:
  61. </p>
  62. <p>
  63. lit("keyword1") &gt;&gt; skipper+ &gt;&gt; '=' &gt;&gt; int_
  64. </p>
  65. <p>
  66. All the keyword directives can be mixed inside a keyword list.
  67. </p>
  68. <p>
  69. The kwd directive is very similar to the repeat directive in that it enables
  70. to enforce keyword occurrence constraints but also provides very interesting
  71. speed improvement over the pure EBNF syntax or the Nabialek-Trick.
  72. </p>
  73. <h6>
  74. <a name="spirit_repository.qi_components.directives.kwd.h1"></a>
  75. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.header"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.header">Header</a>
  76. </h6>
  77. <pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/repository/home/qi/directive/kwd.hpp&gt;</span>
  78. <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_kwd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  79. </pre>
  80. <h6>
  81. <a name="spirit_repository.qi_components.directives.kwd.h2"></a>
  82. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.synopsis"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.synopsis">Synopsis</a>
  83. </h6>
  84. <div class="informaltable"><table class="table">
  85. <colgroup>
  86. <col>
  87. <col>
  88. </colgroup>
  89. <thead><tr>
  90. <th>
  91. <p>
  92. Expression
  93. </p>
  94. </th>
  95. <th>
  96. <p>
  97. Semantics
  98. </p>
  99. </th>
  100. </tr></thead>
  101. <tbody>
  102. <tr>
  103. <td>
  104. <p>
  105. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">keyword</span><span class="special">)[</span><span class="identifier">subject</span><span class="special">]</span></code>
  106. </p>
  107. </td>
  108. <td>
  109. <p>
  110. Parse ( <code class="computeroutput"><span class="string">"keyword"</span></code>
  111. &gt; <code class="computeroutput"><span class="identifier">subject</span></code>)
  112. zero or more times.
  113. </p>
  114. </td>
  115. </tr>
  116. <tr>
  117. <td>
  118. <p>
  119. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">keyword</span><span class="special">,</span><span class="identifier">n</span><span class="special">)[</span><span class="identifier">subject</span><span class="special">]</span></code>
  120. </p>
  121. </td>
  122. <td>
  123. <p>
  124. Parse ( <code class="computeroutput"><span class="string">"keyword"</span></code>
  125. &gt; <code class="computeroutput"><span class="identifier">subject</span></code>)
  126. exactly <code class="computeroutput"><span class="identifier">n</span></code> times.
  127. </p>
  128. </td>
  129. </tr>
  130. <tr>
  131. <td>
  132. <p>
  133. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">keyword</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span>
  134. <span class="identifier">max</span><span class="special">)[</span><span class="identifier">subject</span><span class="special">]</span></code>
  135. </p>
  136. </td>
  137. <td>
  138. <p>
  139. Parse ( <code class="computeroutput"><span class="string">"keyword"</span></code>
  140. &gt; <code class="computeroutput"><span class="identifier">subject</span></code>)
  141. at least <code class="computeroutput"><span class="identifier">min</span></code>
  142. times and at most <code class="computeroutput"><span class="identifier">max</span></code>
  143. times.
  144. </p>
  145. </td>
  146. </tr>
  147. <tr>
  148. <td>
  149. <p>
  150. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">keyword</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span>
  151. <span class="identifier">inf</span><span class="special">)[</span><span class="identifier">subject</span><span class="special">]</span></code>
  152. </p>
  153. </td>
  154. <td>
  155. <p>
  156. Parse ( <code class="computeroutput"><span class="string">"keyword"</span></code>
  157. &gt; <code class="computeroutput"><span class="identifier">subject</span></code>)
  158. at least <code class="computeroutput"><span class="identifier">min</span></code>
  159. or more.
  160. </p>
  161. </td>
  162. </tr>
  163. </tbody>
  164. </table></div>
  165. <p>
  166. For non case sensitive keywords use the ikwd directive. If distinct keyword
  167. parsing is required, use the dkwd and idkwd directive instead.
  168. </p>
  169. <h6>
  170. <a name="spirit_repository.qi_components.directives.kwd.h3"></a>
  171. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.parameters"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.parameters">Parameters</a>
  172. </h6>
  173. <div class="informaltable"><table class="table">
  174. <colgroup>
  175. <col>
  176. <col>
  177. </colgroup>
  178. <thead><tr>
  179. <th>
  180. <p>
  181. Parameter
  182. </p>
  183. </th>
  184. <th>
  185. <p>
  186. Description
  187. </p>
  188. </th>
  189. </tr></thead>
  190. <tbody>
  191. <tr>
  192. <td>
  193. <p>
  194. <code class="computeroutput"><span class="identifier">keyword</span></code>
  195. </p>
  196. </td>
  197. <td>
  198. <p>
  199. The parser for the opening (the prefix).
  200. </p>
  201. </td>
  202. </tr>
  203. <tr>
  204. <td>
  205. <p>
  206. <code class="computeroutput"><span class="identifier">subject</span></code>
  207. </p>
  208. </td>
  209. <td>
  210. <p>
  211. The parser for the input sequence following the keyword part.
  212. </p>
  213. </td>
  214. </tr>
  215. <tr>
  216. <td>
  217. <p>
  218. <code class="computeroutput"><span class="identifier">n</span></code>
  219. </p>
  220. </td>
  221. <td>
  222. <p>
  223. Int representing the exact number of times the keyword must be
  224. repeated.
  225. </p>
  226. </td>
  227. </tr>
  228. <tr>
  229. <td>
  230. <p>
  231. <code class="computeroutput"><span class="identifier">min</span></code>
  232. </p>
  233. </td>
  234. <td>
  235. <p>
  236. Int representing the minimum number of times the keyword must
  237. be repeated.
  238. </p>
  239. </td>
  240. </tr>
  241. <tr>
  242. <td>
  243. <p>
  244. <code class="computeroutput"><span class="identifier">max</span></code>
  245. </p>
  246. </td>
  247. <td>
  248. <p>
  249. Int representing the maximum number of times the keyword must
  250. be repeated.
  251. </p>
  252. </td>
  253. </tr>
  254. </tbody>
  255. </table></div>
  256. <p>
  257. The keyword as well as the subject parameters can be any valid spirit parser.
  258. The parameter n, min and max are integer constants.
  259. </p>
  260. <h6>
  261. <a name="spirit_repository.qi_components.directives.kwd.h4"></a>
  262. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.attributes"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.attributes">Attributes</a>
  263. </h6>
  264. <div class="informaltable"><table class="table">
  265. <colgroup>
  266. <col>
  267. <col>
  268. </colgroup>
  269. <thead><tr>
  270. <th>
  271. <p>
  272. Expression
  273. </p>
  274. </th>
  275. <th>
  276. <p>
  277. Attribute
  278. </p>
  279. </th>
  280. </tr></thead>
  281. <tbody>
  282. <tr>
  283. <td>
  284. <p>
  285. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]</span></code>
  286. </p>
  287. </td>
  288. <td>
  289. <p>
  290. </p>
  291. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span> <span class="keyword">or</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span>
  292. <span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">Unused</span></pre>
  293. <p>
  294. </p>
  295. </td>
  296. </tr>
  297. <tr>
  298. <td>
  299. <p>
  300. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">n</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]</span></code>
  301. </p>
  302. </td>
  303. <td>
  304. <p>
  305. </p>
  306. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">n</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span> <span class="keyword">or</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span>
  307. <span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">n</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">Unused</span></pre>
  308. <p>
  309. </p>
  310. </td>
  311. </tr>
  312. <tr>
  313. <td>
  314. <p>
  315. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span>
  316. <span class="identifier">max</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]</span></code>
  317. </p>
  318. </td>
  319. <td>
  320. <p>
  321. </p>
  322. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span> <span class="identifier">max</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span> <span class="keyword">or</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span>
  323. <span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span> <span class="identifier">max</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">Unused</span></pre>
  324. <p>
  325. </p>
  326. </td>
  327. </tr>
  328. <tr>
  329. <td>
  330. <p>
  331. <code class="computeroutput"><span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span>
  332. <span class="identifier">inf</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]</span></code>
  333. </p>
  334. </td>
  335. <td>
  336. <p>
  337. </p>
  338. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span> <span class="identifier">inf</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span> <span class="keyword">or</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span>
  339. <span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="identifier">kwd</span><span class="special">(</span><span class="identifier">k1</span><span class="special">,</span><span class="identifier">min</span><span class="special">,</span> <span class="identifier">inf</span><span class="special">)[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">Unused</span></pre>
  340. <p>
  341. </p>
  342. </td>
  343. </tr>
  344. </tbody>
  345. </table></div>
  346. <h6>
  347. <a name="spirit_repository.qi_components.directives.kwd.h5"></a>
  348. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.complexity"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.complexity">Complexity</a>
  349. </h6>
  350. <div class="blockquote"><blockquote class="blockquote">
  351. <p>
  352. The overall complexity is defined by the complexity of its subject parser.
  353. The complexity of the keyword list construct <code class="computeroutput"><span class="identifier">kwd</span></code>
  354. itself is O(N), where N is the number of repetitions executed.
  355. </p>
  356. <p>
  357. In the case where all the keywords are strings, the complexity of the
  358. keyword list itself determined by the complexity of the internal TST
  359. contents :
  360. </p>
  361. <p>
  362. O(log n+k)
  363. </p>
  364. <p>
  365. Where k is the length of the string to be searched in a TST with n strings.
  366. </p>
  367. <p>
  368. When the keywords used are complex parsers, then the complexity is the
  369. sum of the sub parser complexities.
  370. </p>
  371. </blockquote></div>
  372. <h6>
  373. <a name="spirit_repository.qi_components.directives.kwd.h6"></a>
  374. <span class="phrase"><a name="spirit_repository.qi_components.directives.kwd.example"></a></span><a class="link" href="kwd.html#spirit_repository.qi_components.directives.kwd.example">Example</a>
  375. </h6>
  376. <p>
  377. Please refer to keyword_list.
  378. </p>
  379. </div>
  380. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  381. <td align="left"></td>
  382. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
  383. Distributed under the Boost Software License, Version 1.0. (See accompanying
  384. 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>)
  385. </p>
  386. </div></td>
  387. </tr></table>
  388. <hr>
  389. <div class="spirit-nav">
  390. <a accesskey="p" href="distinct.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="seek.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
  391. </div>
  392. </body>
  393. </html>