• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">--&gt;</span>
66                    <span class="special">(</span><span class="identifier">a</span>
67                    <span class="special">&gt;&gt;</span> <span class="identifier">b</span><span class="special">):</span> <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">--&gt;</span>
83                    <span class="special">(</span><span class="identifier">a</span>
84                    <span class="special">&lt;&lt;</span> <span class="identifier">b</span><span class="special">):</span> <span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">&gt;&gt;</span> <span class="identifier">b</span></code>
98            (<code class="computeroutput"><span class="identifier">a</span> <span class="special">&lt;&lt;</span>
99            <span class="identifier">b</span></code>) will be <code class="computeroutput"><span class="identifier">tuple</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</span></code> or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">&gt;&gt;</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">&lt;&lt;</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">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</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">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">&gt;</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">&gt;&gt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</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">&lt;&lt;</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">&gt;&gt;</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">&lt;&lt;</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">--&gt;</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">&lt;</span><span class="identifier">A</span><span class="special">,</span> <span class="identifier">B</span><span class="special">&gt;</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">--&gt;</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