1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Attributes of Compound Components</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 2.5.8"> 8<link rel="up" href="../attributes.html" title="Attributes"> 9<link rel="prev" href="primitive_attributes.html" title="Attributes of Primitive Components"> 10<link rel="next" href="more_compound_attributes.html" title="More About Attributes of Compound Components"> 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_attributes.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../attributes.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="more_compound_attributes.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.abstracts.attributes.compound_attributes"></a><a class="link" href="compound_attributes.html" title="Attributes of Compound Components">Attributes 28 of Compound Components</a> 29</h4></div></div></div> 30<p> 31 <span class="emphasis"><em>Spirit.Qi</em></span> and <span class="emphasis"><em>Spirit.Karma</em></span> implement 32 well defined attribute type propagation rules for all compound parsers 33 and generators, such as sequences, alternatives, Kleene star, etc. The 34 main attribute propagation rule for a sequences is for instance: 35 </p> 36<div class="informaltable"><table class="table"> 37<colgroup> 38<col> 39<col> 40</colgroup> 41<thead><tr> 42<th> 43 <p> 44 Library 45 </p> 46 </th> 47<th> 48 <p> 49 Sequence attribute propagation rule 50 </p> 51 </th> 52</tr></thead> 53<tbody> 54<tr> 55<td> 56 <p> 57 Qi 58 </p> 59 </td> 60<td> 61 <p> 62 <code class="computeroutput"><span class="identifier">a</span><span class="special">:</span> 63 <span class="identifier">A</span><span class="special">,</span> 64 <span class="identifier">b</span><span class="special">:</span> 65 <span class="identifier">B</span> <span class="special">--></span> 66 <span class="special">(</span><span class="identifier">a</span> 67 <span class="special">>></span> <span class="identifier">b</span><span class="special">):</span> <span class="identifier">tuple</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code> 68 </p> 69 </td> 70</tr> 71<tr> 72<td> 73 <p> 74 Karma 75 </p> 76 </td> 77<td> 78 <p> 79 <code class="computeroutput"><span class="identifier">a</span><span class="special">:</span> 80 <span class="identifier">A</span><span class="special">,</span> 81 <span class="identifier">b</span><span class="special">:</span> 82 <span class="identifier">B</span> <span class="special">--></span> 83 <span class="special">(</span><span class="identifier">a</span> 84 <span class="special"><<</span> <span class="identifier">b</span><span class="special">):</span> <span class="identifier">tuple</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code> 85 </p> 86 </td> 87</tr> 88</tbody> 89</table></div> 90<p> 91 which reads as: 92 </p> 93<div class="blockquote"><blockquote class="blockquote"><p> 94 Given <code class="computeroutput"><span class="identifier">a</span></code> and <code class="computeroutput"><span class="identifier">b</span></code> are parsers (generators), and <code class="computeroutput"><span class="identifier">A</span></code> is the attribute type of <code class="computeroutput"><span class="identifier">a</span></code>, and <code class="computeroutput"><span class="identifier">B</span></code> 95 is the attribute type of <code class="computeroutput"><span class="identifier">b</span></code>, 96 then the attribute type of <code class="computeroutput"><span class="identifier">a</span> 97 <span class="special">>></span> <span class="identifier">b</span></code> 98 (<code class="computeroutput"><span class="identifier">a</span> <span class="special"><<</span> 99 <span class="identifier">b</span></code>) will be <code class="computeroutput"><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code>. 100 </p></blockquote></div> 101<div class="note"><table border="0" summary="Note"> 102<tr> 103<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td> 104<th align="left">Note</th> 105</tr> 106<tr><td align="left" valign="top"><p> 107 The notation <code class="computeroutput"><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code> 108 is used as a placeholder expression for any fusion sequence holding the 109 types A and B, such as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fusion</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code> or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span></code> (for more information see <a href="../../../../../../../libs/fusion/doc/html/index.html" target="_top">Boost.Fusion</a>). 110 </p></td></tr> 111</table></div> 112<p> 113 As you can see, in order for a type to be compatible with the attribute 114 type of a compound expression it has to 115 </p> 116<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 117<li class="listitem"> 118 either be convertible to the attribute type, 119 </li> 120<li class="listitem"> 121 or it has to expose certain functionalities, i.e. it needs to conform 122 to a concept compatible with the component. 123 </li> 124</ul></div> 125<p> 126 Each compound component implements its own set of attribute propagation 127 rules. For a full list of how the different compound generators consume 128 attributes see the sections <a class="link" href="../../qi/quick_reference/compound_attribute_rules.html" title="Compound Attribute Rules">Parser 129 Compound Attribute Rules</a> and <a class="link" href="../../karma/quick_reference/compound_attribute_rules.html" title="Compound Attribute Rules">Generator 130 Compound Attribute Rules</a>. 131 </p> 132<h6> 133<a name="spirit.abstracts.attributes.compound_attributes.h0"></a> 134 <span class="phrase"><a name="spirit.abstracts.attributes.compound_attributes.the_attribute_of_sequence_parsers_and_generators"></a></span><a class="link" href="compound_attributes.html#spirit.abstracts.attributes.compound_attributes.the_attribute_of_sequence_parsers_and_generators">The 135 Attribute of Sequence Parsers and Generators</a> 136 </h6> 137<p> 138 Sequences require an attribute type to expose the concept of a fusion sequence, 139 where all elements of that fusion sequence have to be compatible with the 140 corresponding element of the component sequence. For example, the expression: 141 </p> 142<div class="informaltable"><table class="table"> 143<colgroup> 144<col> 145<col> 146</colgroup> 147<thead><tr> 148<th> 149 <p> 150 Library 151 </p> 152 </th> 153<th> 154 <p> 155 Sequence expression 156 </p> 157 </th> 158</tr></thead> 159<tbody> 160<tr> 161<td> 162 <p> 163 Qi 164 </p> 165 </td> 166<td> 167 <p> 168 <code class="computeroutput"><span class="identifier">double_</span> <span class="special">>></span> 169 <span class="identifier">double_</span></code> 170 </p> 171 </td> 172</tr> 173<tr> 174<td> 175 <p> 176 Karma 177 </p> 178 </td> 179<td> 180 <p> 181 <code class="computeroutput"><span class="identifier">double_</span> <span class="special"><<</span> 182 <span class="identifier">double_</span></code> 183 </p> 184 </td> 185</tr> 186</tbody> 187</table></div> 188<p> 189 is compatible with any fusion sequence holding two types, where both types 190 have to be compatible with <code class="computeroutput"><span class="keyword">double</span></code>. 191 The first element of the fusion sequence has to be compatible with the 192 attribute of the first <code class="computeroutput"><span class="identifier">double_</span></code>, 193 and the second element of the fusion sequence has to be compatible with 194 the attribute of the second <code class="computeroutput"><span class="identifier">double_</span></code>. 195 If we assume to have an instance of a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span></code>, we can directly use the expressions 196 above to do both, parse input to fill the attribute: 197 </p> 198<pre class="programlisting"><span class="comment">// the following parses "1.0 2.0" into a pair of double</span> 199<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"1.0 2.0"</span><span class="special">);</span> 200<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">strbegin</span> <span class="special">=</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> 201<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span> <span class="identifier">p</span><span class="special">;</span> 202<span class="identifier">qi</span><span class="special">::</span><span class="identifier">phrase_parse</span><span class="special">(</span><span class="identifier">strbegin</span><span class="special">,</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> 203 <span class="identifier">qi</span><span class="special">::</span><span class="identifier">double_</span> <span class="special">>></span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">double_</span><span class="special">,</span> <span class="comment">// parser grammar </span> 204 <span class="identifier">qi</span><span class="special">::</span><span class="identifier">space</span><span class="special">,</span> <span class="comment">// delimiter grammar</span> 205 <span class="identifier">p</span><span class="special">);</span> <span class="comment">// attribute to fill while parsing</span> 206</pre> 207<p> 208 and generate output for it: 209 </p> 210<pre class="programlisting"><span class="comment">// the following generates: "1.0 2.0" from the pair filled above</span> 211<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">;</span> 212<span class="identifier">std</span><span class="special">::</span><span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">out</span><span class="special">(</span><span class="identifier">str</span><span class="special">);</span> 213<span class="identifier">karma</span><span class="special">::</span><span class="identifier">generate_delimited</span><span class="special">(</span><span class="identifier">out</span><span class="special">,</span> 214 <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span><span class="special">,</span> <span class="comment">// generator grammar (format description)</span> 215 <span class="identifier">karma</span><span class="special">::</span><span class="identifier">space</span><span class="special">,</span> <span class="comment">// delimiter grammar</span> 216 <span class="identifier">p</span><span class="special">);</span> <span class="comment">// data to use as the attribute </span> 217</pre> 218<p> 219 (where the <code class="computeroutput"><span class="identifier">karma</span><span class="special">::</span><span class="identifier">space</span></code> generator is used as the delimiter, 220 allowing to automatically skip/insert delimiting spaces in between all 221 primitives). 222 </p> 223<div class="tip"><table border="0" summary="Tip"> 224<tr> 225<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../images/tip.png"></td> 226<th align="left">Tip</th> 227</tr> 228<tr><td align="left" valign="top"> 229<p> 230 <span class="bold"><strong>For sequences only:</strong></span> <span class="emphasis"><em>Spirit.Qi</em></span> 231 and <span class="emphasis"><em>Spirit.Karma</em></span> expose a set of API functions usable 232 mainly with sequences. Very much like the functions of the <code class="computeroutput"><span class="identifier">scanf</span></code> and <code class="computeroutput"><span class="identifier">printf</span></code> 233 families these functions allow to pass the attributes for each of the 234 elements of the sequence separately. Using the corresponding overload 235 of <span class="emphasis"><em>Qi's</em></span> parse or <span class="emphasis"><em>Karma's</em></span> <code class="computeroutput"><span class="identifier">generate</span><span class="special">()</span></code> 236 the expression above could be rewritten as: 237</p> 238<pre class="programlisting"><span class="keyword">double</span> <span class="identifier">d1</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">,</span> <span class="identifier">d2</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">;</span> 239<span class="identifier">qi</span><span class="special">::</span><span class="identifier">phrase_parse</span><span class="special">(</span><span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">double_</span> <span class="special">>></span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">double_</span><span class="special">,</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">space</span><span class="special">,</span> <span class="identifier">d1</span><span class="special">,</span> <span class="identifier">d2</span><span class="special">);</span> 240<span class="identifier">karma</span><span class="special">::</span><span class="identifier">generate_delimited</span><span class="special">(</span><span class="identifier">out</span><span class="special">,</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span><span class="special">,</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">space</span><span class="special">,</span> <span class="identifier">d1</span><span class="special">,</span> <span class="identifier">d2</span><span class="special">);</span> 241</pre> 242<p> 243 where the first attribute is used for the first <code class="computeroutput"><span class="identifier">double_</span></code>, 244 and the second attribute is used for the second <code class="computeroutput"><span class="identifier">double_</span></code>. 245 </p> 246</td></tr> 247</table></div> 248<h6> 249<a name="spirit.abstracts.attributes.compound_attributes.h1"></a> 250 <span class="phrase"><a name="spirit.abstracts.attributes.compound_attributes.the_attribute_of_alternative_parsers_and_generators"></a></span><a class="link" href="compound_attributes.html#spirit.abstracts.attributes.compound_attributes.the_attribute_of_alternative_parsers_and_generators">The 251 Attribute of Alternative Parsers and Generators</a> 252 </h6> 253<p> 254 Alternative parsers and generators are all about - well - alternatives. 255 In order to store possibly different result (attribute) types from the 256 different alternatives we use the data type <a href="http://www.boost.org/doc/html/variant.html" target="_top">Boost.Variant</a>. 257 The main attribute propagation rule of these components is: 258 </p> 259<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">--></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">variant</span><span class="special"><</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">></span> 260</pre> 261<p> 262 Alternatives have a second very important attribute propagation rule: 263 </p> 264<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">A</span> <span class="special">--></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">A</span> 265</pre> 266<p> 267 often allowing to simplify things significantly. If all sub expressions 268 of an alternative expose the same attribute type, the overall alternative 269 will expose exactly the same attribute type as well. 270 </p> 271</div> 272<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 273<td align="left"></td> 274<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p> 275 Distributed under the Boost Software License, Version 1.0. (See accompanying 276 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>) 277 </p> 278</div></td> 279</tr></table> 280<hr> 281<div class="spirit-nav"> 282<a accesskey="p" href="primitive_attributes.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../attributes.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="more_compound_attributes.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 283</div> 284</body> 285</html> 286